xmail-1.27/0000755000175000017500000000000011341640451012026 5ustar davidedavidexmail-1.27/CTRLClient.cpp0000644000175000017500000003406611341640430014443 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "BuffSock.h" #include "SSLBind.h" #include "SSLConfig.h" #include "MiscUtils.h" #include "StrUtils.h" #include "MD5.h" #include "Errors.h" #define CCLN_TLS_INIT_STR "#!TLS" #define STD_CTRL_PORT 6017 #define STD_CTRL_TIMEOUT 90000 #define CTRL_LISTFOLLOW_RESULT 100 #define CTRL_WAITDATA_RESULT 101 #define CCLN_ERROR_BASE (-10000) #define CCLN_ERR_BAD_USAGE (-10000) #define CCLN_ERR_SSL_KEYCERT (-10001) #define CCLN_CHF_USEMD5 (1 << 0) #define CCLN_CHF_SSLSWITCH (1 << 1) #define CCLN_CHF_USESSL (1 << 2) struct CClnChannelCfg { SslServerBind SSLB; unsigned long ulFlags; }; /* Needed by library functions ( START ) */ bool bServerDebug = false; int iLogRotateHours = 24; int iAddrFamily = AF_INET; static char const * const pszCClnErrors[] = { "Wrong command line usage", "Either none or both private key and certificate file must be supplied" }; char *SvrGetLogsDir(char *pszLogsDir, int iMaxPath) { SysSNPrintf(pszLogsDir, iMaxPath - 1, "."); return pszLogsDir; } /* Needed by library functions ( END ) */ int CClnGetResponse(BSOCK_HANDLE hBSock, char *pszError, int iMaxError, int *piErrorCode, int iTimeout) { char szRespBuffer[2048] = ""; if (BSckGetString(hBSock, szRespBuffer, sizeof(szRespBuffer) - 1, iTimeout) == NULL) return ErrGetErrorCode(); if ((szRespBuffer[0] != '+') && (szRespBuffer[0] != '-')) { ErrSetErrorCode(ERR_CCLN_INVALID_RESPONSE, szRespBuffer); return ERR_CCLN_INVALID_RESPONSE; } char *pszToken = szRespBuffer + 1; if (piErrorCode != NULL) *piErrorCode = atoi(pszToken) * ((szRespBuffer[0] == '-') ? -1: +1); for (; isdigit(*pszToken); pszToken++); if (*pszToken != ' ') { ErrSetErrorCode(ERR_CCLN_INVALID_RESPONSE, szRespBuffer); return ERR_CCLN_INVALID_RESPONSE; } for (; *pszToken == ' '; pszToken++); if (pszError != NULL) { strncpy(pszError, pszToken, iMaxError); pszError[iMaxError - 1] = '\0'; } return 0; } int CClnRecvTextFile(const char *pszFileName, BSOCK_HANDLE hBSock, int iTimeout) { bool bCloseFile = false; FILE *pFile = stdout; char szBuffer[2048] = ""; if (pszFileName != NULL) { if ((pFile = fopen(pszFileName, "wt")) == NULL) { ErrSetErrorCode(ERR_FILE_CREATE, pszFileName); return ERR_FILE_CREATE; } bCloseFile = true; } while (BSckGetString(hBSock, szBuffer, sizeof(szBuffer) - 1, iTimeout) != NULL) { if (strcmp(szBuffer, ".") == 0) break; if (szBuffer[0] == '.') fprintf(pFile, "%s\n", szBuffer + 1); else fprintf(pFile, "%s\n", szBuffer); } if (bCloseFile) fclose(pFile); return 0; } int CClnSendTextFile(const char *pszFileName, BSOCK_HANDLE hBSock, int iTimeout) { bool bCloseFile = false; FILE *pFile = stdin; char szBuffer[2048] = ""; if (pszFileName != NULL) { if ((pFile = fopen(pszFileName, "rt")) == NULL) { ErrSetErrorCode(ERR_FILE_OPEN, pszFileName); return ERR_FILE_OPEN; } bCloseFile = true; } while (MscFGets(szBuffer, sizeof(szBuffer) - 1, pFile) != NULL) { if (szBuffer[0] == '.') for (int i = strlen(szBuffer); i >= 0; i--) szBuffer[i + 1] = szBuffer[i]; if (BSckSendString(hBSock, szBuffer, iTimeout) <= 0) { fclose(pFile); return ErrGetErrorCode(); } } if (bCloseFile) fclose(pFile); return BSckSendString(hBSock, ".", iTimeout); } int CClnSubmitCommand(BSOCK_HANDLE hBSock, char const *pszCommand, char *pszError, int iMaxError, char const *pszIOFile, int iTimeout) { if (BSckSendString(hBSock, pszCommand, iTimeout) < 0) return ErrGetErrorCode(); int iErrorCode = 0; if (CClnGetResponse(hBSock, pszError, iMaxError, &iErrorCode, iTimeout) < 0) return ErrGetErrorCode(); if (iErrorCode < 0) { ErrSetErrorCode(ERR_CCLN_ERROR_RESPONSE, pszError); return ERR_CCLN_ERROR_RESPONSE; } if (iErrorCode == CTRL_LISTFOLLOW_RESULT) { if (CClnRecvTextFile(pszIOFile, hBSock, iTimeout) < 0) return ErrGetErrorCode(); } else if (iErrorCode == CTRL_WAITDATA_RESULT) { if (CClnSendTextFile(pszIOFile, hBSock, iTimeout) < 0) return ErrGetErrorCode(); if (CClnGetResponse(hBSock, pszError, iMaxError, &iErrorCode, iTimeout) < 0) return ErrGetErrorCode(); } return 0; } static int CClnSslEnvCB(void *pPrivate, int iID, void const *pData) { SslBindEnv *pSslE = (SslBindEnv *) pPrivate; return 0; } static int CClnSslBind(CClnChannelCfg const *pChCfg, BSOCK_HANDLE hBSock) { SslBindEnv SslE; ZeroData(SslE); if (BSslBindClient(hBSock, &pChCfg->SSLB, CClnSslEnvCB, &SslE) < 0) return ErrGetErrorCode(); /* * We may want to add verify code here ... */ SysFree(SslE.pszIssuer); SysFree(SslE.pszSubject); return 0; } BSOCK_HANDLE CClnConnectServer(char const *pszServer, int iPortNo, char const *pszUsername, char const *pszPassword, CClnChannelCfg const *pChCfg, int iTimeout) { /* Get server address */ SYS_INET_ADDR SvrAddr; if (MscGetServerAddress(pszServer, SvrAddr, iPortNo) < 0) return INVALID_BSOCK_HANDLE; /* Try connect to server */ SYS_SOCKET SockFD = SysCreateSocket(SysGetAddrFamily(SvrAddr), SOCK_STREAM, 0); if (SockFD == SYS_INVALID_SOCKET) return INVALID_BSOCK_HANDLE; if (SysConnect(SockFD, &SvrAddr, iTimeout) < 0) { SysCloseSocket(SockFD); return INVALID_BSOCK_HANDLE; } BSOCK_HANDLE hBSock = BSckAttach(SockFD); if (hBSock == INVALID_BSOCK_HANDLE) { SysCloseSocket(SockFD); return INVALID_BSOCK_HANDLE; } int iErrorCode = 0; char szRTXBuffer[2048] = ""; if ((pChCfg->ulFlags & CCLN_CHF_USESSL) && CClnSslBind(pChCfg, hBSock) < 0) { BSckDetach(hBSock, 1); return INVALID_BSOCK_HANDLE; } /* Read welcome message */ if (CClnGetResponse(hBSock, szRTXBuffer, sizeof(szRTXBuffer), &iErrorCode, iTimeout) < 0) { BSckDetach(hBSock, 1); return INVALID_BSOCK_HANDLE; } if (iErrorCode < 0) { BSckDetach(hBSock, 1); ErrSetErrorCode(ERR_CCLN_ERROR_RESPONSE, szRTXBuffer); return INVALID_BSOCK_HANDLE; } /* * Do we need to switch to SSL? */ if (pChCfg->ulFlags & CCLN_CHF_SSLSWITCH) { if (BSckSendString(hBSock, CCLN_TLS_INIT_STR, iTimeout) < 0 || CClnGetResponse(hBSock, szRTXBuffer, sizeof(szRTXBuffer), &iErrorCode, iTimeout) < 0) { BSckDetach(hBSock, 1); return INVALID_BSOCK_HANDLE; } if (iErrorCode < 0) { BSckDetach(hBSock, 1); ErrSetErrorCode(ERR_CCLN_ERROR_RESPONSE, szRTXBuffer); return INVALID_BSOCK_HANDLE; } if (CClnSslBind(pChCfg, hBSock) < 0) { BSckDetach(hBSock, 1); return INVALID_BSOCK_HANDLE; } } /* Prepare login */ char szTimeStamp[256] = ""; if ((pChCfg->ulFlags & CCLN_CHF_USEMD5) == 0 || MscExtractServerTimeStamp(szRTXBuffer, szTimeStamp, sizeof(szTimeStamp)) == NULL) SysSNPrintf(szRTXBuffer, sizeof(szRTXBuffer), "\"%s\"\t\"%s\"", pszUsername, pszPassword); else { /* Perform MD5 authentication */ char *pszHash = StrSprint("%s%s", szTimeStamp, pszPassword); char szMD5[128] = ""; if (pszHash == NULL) { BSckDetach(hBSock, 1); return INVALID_BSOCK_HANDLE; } do_md5_string(pszHash, strlen(pszHash), szMD5); SysFree(pszHash); /* Add a # char in head of password field */ SysSNPrintf(szRTXBuffer, sizeof(szRTXBuffer), "\"%s\"\t\"#%s\"", pszUsername, szMD5); } /* Send login */ if (BSckSendString(hBSock, szRTXBuffer, iTimeout) < 0) { BSckDetach(hBSock, 1); return INVALID_BSOCK_HANDLE; } if (CClnGetResponse(hBSock, szRTXBuffer, sizeof(szRTXBuffer), &iErrorCode, iTimeout) < 0) { BSckDetach(hBSock, 1); return INVALID_BSOCK_HANDLE; } if (iErrorCode < 0) { BSckDetach(hBSock, 1); ErrSetErrorCode(ERR_CCLN_ERROR_RESPONSE, szRTXBuffer); return INVALID_BSOCK_HANDLE; } return hBSock; } int CClnQuitConnection(BSOCK_HANDLE hBSock, int iTimeout) { CClnSubmitCommand(hBSock, "\"quit\"", NULL, 0, NULL, iTimeout); BSckDetach(hBSock, 1); return 0; } int CClnLogError(int iError) { char *pszError; if (iError <= CCLN_ERROR_BASE) { if (CCLN_ERROR_BASE - iError >= CountOf(pszCClnErrors)) return iError; pszError = SysStrDup(pszCClnErrors[CCLN_ERROR_BASE - iError]); } else pszError = ErrGetErrorStringInfo(iError); if (pszError == NULL) return iError; fprintf(stderr, "%s\n", pszError); SysFree(pszError); return 0; } void CClnShowUsage(char const *pszProgName) { fprintf(stderr, "use : %s [-snuptfSLcKCXHD] ...\n" "options :\n" " -s server = set server address\n" " -n port = set server port [%d]\n" " -u user = set username\n" " -p pass = set password\n" " -t timeout = set timeout [%d]\n" " -f filename = set I/O filename [stdin/stdout]\n" " -S = enable SSL link negotiation\n" " -L = use native SSL link\n" " -K filename = set the SSL private key file\n" " -C filename = set the SSL certificate file\n" " -X filename = set the SSL certificate-list file\n" " -H dir = set the SSL certificate-store directory\n" " -c = disable MD5 authentication\n" " -D = enable debug\n", pszProgName, STD_CTRL_PORT, STD_CTRL_TIMEOUT); } int CClnExec(int iArgCount, char *pszArgs[]) { int i; int iPortNo = STD_CTRL_PORT; int iTimeout = STD_CTRL_TIMEOUT; CClnChannelCfg ChCfg; char szServer[MAX_HOST_NAME] = ""; char szUsername[256] = ""; char szPassword[256] = ""; char szIOFile[SYS_MAX_PATH] = ""; ZeroData(ChCfg); ChCfg.ulFlags = CCLN_CHF_USEMD5; ChCfg.SSLB.pszKeyFile = SysGetEnv("CTRL_KEY_FILE"); ChCfg.SSLB.pszCertFile = SysGetEnv("CTRL_CERT_FILE"); ChCfg.SSLB.pszCAFile = SysGetEnv("CTRL_CA_FILE"); ChCfg.SSLB.pszCAPath = SysGetEnv("CTRL_CA_PATH"); for (i = 1; i < iArgCount; i++) { if (pszArgs[i][0] != '-') break; switch (pszArgs[i][1]) { case ('s'): if (++i < iArgCount) StrSNCpy(szServer, pszArgs[i]); break; case ('n'): if (++i < iArgCount) iPortNo = atoi(pszArgs[i]); break; case ('u'): if (++i < iArgCount) StrSNCpy(szUsername, pszArgs[i]); break; case ('p'): if (++i < iArgCount) StrSNCpy(szPassword, pszArgs[i]); break; case ('t'): if (++i < iArgCount) iTimeout = atoi(pszArgs[i]) * 1000; break; case ('f'): if (++i < iArgCount) StrSNCpy(szIOFile, pszArgs[i]); break; case ('c'): ChCfg.ulFlags &= ~CCLN_CHF_USEMD5; break; case ('S'): ChCfg.ulFlags &= ~CCLN_CHF_USESSL; ChCfg.ulFlags |= CCLN_CHF_SSLSWITCH; break; case ('L'): ChCfg.ulFlags &= ~CCLN_CHF_SSLSWITCH; ChCfg.ulFlags |= CCLN_CHF_USESSL; break; case ('K'): if (++i < iArgCount) { SysFree(ChCfg.SSLB.pszKeyFile); ChCfg.SSLB.pszKeyFile = SysStrDup(pszArgs[i]); } break; case ('C'): if (++i < iArgCount) { SysFree(ChCfg.SSLB.pszCertFile); ChCfg.SSLB.pszCertFile = SysStrDup(pszArgs[i]); } break; case ('X'): if (++i < iArgCount) { SysFree(ChCfg.SSLB.pszCAFile); ChCfg.SSLB.pszCAFile = SysStrDup(pszArgs[i]); } break; case ('H'): if (++i < iArgCount) { SysFree(ChCfg.SSLB.pszCAPath); ChCfg.SSLB.pszCAPath = SysStrDup(pszArgs[i]); } break; case ('D'): bServerDebug = true; break; default: return CCLN_ERR_BAD_USAGE; } } if (strlen(szServer) == 0 || strlen(szUsername) == 0 || strlen(szPassword) == 0 || i == iArgCount) { SysFree(ChCfg.SSLB.pszKeyFile); SysFree(ChCfg.SSLB.pszCertFile); return CCLN_ERR_BAD_USAGE; } if ((ChCfg.SSLB.pszKeyFile != NULL) != (ChCfg.SSLB.pszCertFile != NULL)) { SysFree(ChCfg.SSLB.pszKeyFile); SysFree(ChCfg.SSLB.pszCertFile); return CCLN_ERR_SSL_KEYCERT; } int iFirstParam = i, iCmdLength = 0; for (; i < iArgCount; i++) iCmdLength += strlen(pszArgs[i]) + 4; char *pszCommand = (char *) SysAlloc(iCmdLength + 1); if (pszCommand == NULL) return ErrGetErrorCode(); for (i = iFirstParam; i < iArgCount; i++) { if (i == iFirstParam) sprintf(pszCommand, "\"%s\"", pszArgs[i]); else sprintf(pszCommand + strlen(pszCommand), "\t\"%s\"", pszArgs[i]); } BSOCK_HANDLE hBSock = CClnConnectServer(szServer, iPortNo, szUsername, szPassword, &ChCfg, iTimeout); SysFree(ChCfg.SSLB.pszKeyFile); SysFree(ChCfg.SSLB.pszCertFile); SysFree(ChCfg.SSLB.pszCAFile); SysFree(ChCfg.SSLB.pszCAPath); if (hBSock == INVALID_BSOCK_HANDLE) { ErrorPush(); SysFree(pszCommand); return ErrorPop(); } char szRTXBuffer[2048] = ""; if (CClnSubmitCommand(hBSock, pszCommand, szRTXBuffer, sizeof(szRTXBuffer), (strlen(szIOFile) != 0) ? szIOFile: NULL, iTimeout) < 0) { ErrorPush(); CClnQuitConnection(hBSock, iTimeout); SysFree(pszCommand); return ErrorPop(); } SysFree(pszCommand); CClnQuitConnection(hBSock, iTimeout); return 0; } #ifndef __CTRLCLNT_LIBRARY__ int main(int iArgCount, char *pszArgs[]) { if (SysInitLibrary() < 0) { CClnLogError(ErrGetErrorCode()); return 1; } if (BSslInit() < 0) { CClnLogError(ErrGetErrorCode()); SysCleanupLibrary(); return 2; } int iExecResult = CClnExec(iArgCount, pszArgs); if (iExecResult == CCLN_ERR_BAD_USAGE) { CClnShowUsage(pszArgs[0]); BSslCleanup(); SysCleanupLibrary(); return 3; } else if (iExecResult < 0) { CClnLogError(iExecResult); BSslCleanup(); SysCleanupLibrary(); return 4; } BSslCleanup(); SysCleanupLibrary(); return 0; } #endif // #ifndef __CTRLCLNT_LIBRARY__ xmail-1.27/Makefile.win0000644000175000017500000001147311341640430014265 0ustar davidedavide !IF "$(CFG)" == "" CFG=debug !ENDIF !IF "$(CFG)" != "release" && "$(CFG)" != "debug" !MESSAGE Invalid configuration "$(CFG)" specified. !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE nmake /f makefile CFG=debug !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "release" ( Win32 x86 release build ) !MESSAGE "debug" ( Win32 x86 debug build) !MESSAGE !ERROR An invalid configuration is specified. !ENDIF !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF SRC_DIR=. INCL_DIRS=/I"$(SRC_DIR)" /I"$(SRC_DIR)\win32ssl\include" LIBPATH=/libpath:"$(SRC_DIR)\win32ssl\lib" LIBS=libeay32.lib ssleay32.lib CPP_DEFS=/nologo /D "XMAIL_OS=Win32" /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE !IF "$(DEBUG_OSSL)" == "1" CPP_FLAGS=$(CPP_FLAGS) /D DEBUG_OSSL !ENDIF !IF "$(CFG)" == "release" OUTDIR=.\release CPP_FLAGS=$(CPP_DEFS) $(INCL_DIRS) /Zp1 /W3 /O2 /MT /D "WIN32" /D "NDEBUG" \ /D "_CONSOLE" /D "_MBCS" /Fo"$(OUTDIR)\\" /c LINK_DEBUG= !ELSEIF "$(CFG)" == "debug" OUTDIR=.\debug CPP_FLAGS=$(CPP_DEFS) $(INCL_DIRS) /Zp1 /Zi /W3 /Od /MTd /D "WIN32" /D "_DEBUG" \ /D "_CONSOLE" /D "_MBCS" /Fo"$(OUTDIR)\\" /c LINK_DEBUG=/debug !ENDIF CPP=cl.exe LINK32=link.exe LINK32_FLAGS=$(LIBPATH) $(LIBS) kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib \ advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib \ /subsystem:console /incremental:no /machine:I386 $(LINK_DEBUG) /nologo XMAIL_TARGET=XMail XMAIL_OBJS= \ "$(OUTDIR)\AliasDomain.obj" \ "$(OUTDIR)\Base64Enc.obj" \ "$(OUTDIR)\BuffSock.obj" \ "$(OUTDIR)\CTRLSvr.obj" \ "$(OUTDIR)\DNSCache.obj" \ "$(OUTDIR)\DNS.obj" \ "$(OUTDIR)\Errors.obj" \ "$(OUTDIR)\ExtAliases.obj" \ "$(OUTDIR)\Filter.obj" \ "$(OUTDIR)\FINGSvr.obj" \ "$(OUTDIR)\LMAILSvr.obj" \ "$(OUTDIR)\MailConfig.obj" \ "$(OUTDIR)\Maildir.obj" \ "$(OUTDIR)\MailDomains.obj" \ "$(OUTDIR)\MailSvr.obj" \ "$(OUTDIR)\MainWin.obj" \ "$(OUTDIR)\MD5.obj" \ "$(OUTDIR)\MessQueue.obj" \ "$(OUTDIR)\MiscUtils.obj" \ "$(OUTDIR)\POP3GwLink.obj" \ "$(OUTDIR)\POP3Svr.obj" \ "$(OUTDIR)\POP3Utils.obj" \ "$(OUTDIR)\PSYNCSvr.obj" \ "$(OUTDIR)\QueueUtils.obj" \ "$(OUTDIR)\ResLocks.obj" \ "$(OUTDIR)\ShBlocks.obj" \ "$(OUTDIR)\SList.obj" \ "$(OUTDIR)\SMAILSvr.obj" \ "$(OUTDIR)\SMAILUtils.obj" \ "$(OUTDIR)\SMTPSvr.obj" \ "$(OUTDIR)\SMTPUtils.obj" \ "$(OUTDIR)\StrUtils.obj" \ "$(OUTDIR)\SvrUtils.obj" \ "$(OUTDIR)\SysDepWin.obj" \ "$(OUTDIR)\SysDepCommon.obj" \ "$(OUTDIR)\TabIndex.obj" \ "$(OUTDIR)\UsrAuth.obj" \ "$(OUTDIR)\UsrMailList.obj" \ "$(OUTDIR)\UsrUtils.obj" \ "$(OUTDIR)\SSLBind.obj" \ "$(OUTDIR)\SSLConfig.obj" \ "$(OUTDIR)\Hash.obj" \ "$(OUTDIR)\Array.obj" \ "$(OUTDIR)\SSLMisc.obj" \ XMCRYPT_TARGET=XMCrypt XMCRYPT_OBJS= \ "$(OUTDIR)\XMCrypt.obj" \ MKUSERS_TARGET=MkUsers MKUSERS_OBJS= \ "$(OUTDIR)\MkUsers.obj" \ CTRLCLNT_TARGET=CtrlClnt CTRLCLNT_OBJS= \ "$(OUTDIR)\Base64Enc.obj" \ "$(OUTDIR)\MD5.obj" \ "$(OUTDIR)\BuffSock.obj" \ "$(OUTDIR)\CTRLClient.obj" \ "$(OUTDIR)\Errors.obj" \ "$(OUTDIR)\StrUtils.obj" \ "$(OUTDIR)\MiscUtils.obj" \ "$(OUTDIR)\SysDepWin.obj" \ "$(OUTDIR)\SysDepCommon.obj" \ "$(OUTDIR)\SSLBind.obj" \ "$(OUTDIR)\SSLMisc.obj" \ SENDMAIL_TARGET=SendMail SENDMAIL_OBJS= \ "$(OUTDIR)\SendMail.obj" \ ALL : "$(OUTDIR)\$(XMAIL_TARGET).exe" "$(OUTDIR)\$(XMCRYPT_TARGET).exe" \ "$(OUTDIR)\$(MKUSERS_TARGET).exe" "$(OUTDIR)\$(CTRLCLNT_TARGET).exe" \ "$(OUTDIR)\$(SENDMAIL_TARGET).exe" CLEAN : -@erase "$(OUTDIR)\$(XMAIL_TARGET).exe" $(XMAIL_OBJS) -@erase "$(OUTDIR)\$(XMCRYPT_TARGET).exe" $(XMCRYPT_OBJS) -@erase "$(OUTDIR)\$(MKUSERS_TARGET).exe" $(MKUSERS_OBJS) -@erase "$(OUTDIR)\$(CTRLCLNT_TARGET).exe" $(CTRLCLNT_OBJS) -@erase "$(OUTDIR)\$(SENDMAIL_TARGET).exe" $(SENDMAIL_OBJS) -@erase *.pdb *.idb *.pch "$(OUTDIR)\*.pdb" "$(OUTDIR)" : if not exist "$(OUTDIR)\$(NULL)" mkdir "$(OUTDIR)" "$(OUTDIR)\$(XMAIL_TARGET).exe" : "$(OUTDIR)" $(XMAIL_OBJS) $(LINK32) @<< $(LINK32_FLAGS) /out:"$(OUTDIR)\$(XMAIL_TARGET).exe" $(XMAIL_OBJS) << "$(OUTDIR)\$(XMCRYPT_TARGET).exe" : "$(OUTDIR)" $(XMCRYPT_OBJS) $(LINK32) @<< $(LINK32_FLAGS) /out:"$(OUTDIR)\$(XMCRYPT_TARGET).exe" $(XMCRYPT_OBJS) << "$(OUTDIR)\$(MKUSERS_TARGET).exe" : "$(OUTDIR)" $(MKUSERS_OBJS) $(LINK32) @<< $(LINK32_FLAGS) /out:"$(OUTDIR)\$(MKUSERS_TARGET).exe" $(MKUSERS_OBJS) << "$(OUTDIR)\$(CTRLCLNT_TARGET).exe" : "$(OUTDIR)" $(CTRLCLNT_OBJS) $(LINK32) @<< $(LINK32_FLAGS) /out:"$(OUTDIR)\$(CTRLCLNT_TARGET).exe" $(CTRLCLNT_OBJS) << "$(OUTDIR)\$(SENDMAIL_TARGET).exe" : "$(OUTDIR)" $(SENDMAIL_OBJS) $(LINK32) @<< $(LINK32_FLAGS) /out:"$(OUTDIR)\$(SENDMAIL_TARGET).exe" $(SENDMAIL_OBJS) << {$(SRC_DIR)}.c{$(OUTDIR)}.obj:: $(CPP) @<< $(CPP_FLAGS) $< << {$(SRC_DIR)}.cpp{$(OUTDIR)}.obj:: $(CPP) @<< $(CPP_FLAGS) $< << xmail-1.27/Array.h0000644000175000017500000000260511341640430013255 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _ARRAY_H #define _ARRAY_H #define INVALID_ARRAY_HANDLE ((ARRAY_HANDLE) 0) typedef struct ARRAY_HANDLE_struct { } *ARRAY_HANDLE; ARRAY_HANDLE ArrayCreate(unsigned long ulSize); void ArrayFree(ARRAY_HANDLE hArray, void (*pFree)(void *, void *), void *pPrivate); int ArraySet(ARRAY_HANDLE hArray, unsigned long ulIdx, void *pData); unsigned long ArrayCount(ARRAY_HANDLE hArray); void *ArrayGet(ARRAY_HANDLE hArray, unsigned long ulIdx); int ArrayAppend(ARRAY_HANDLE hArray, void *pData); #endif xmail-1.27/TabIndex.h0000644000175000017500000000425711341640430013702 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _TABINDEX_H #define _TABINDEX_H #define INDEX_SEQUENCE_TERMINATOR (-1) #define INVALID_INDEX_HANDLE ((INDEX_HANDLE) 0) /* * Support only files up to 4GB for now. Should be plenty! */ typedef SYS_UINT32 TabIdxUINT; typedef struct INDEX_HANDLE_struct { } *INDEX_HANDLE; char *TbixGetIndexFile(char const *pszTabFilePath, int const *piFieldsIdx, char *pszIdxFile); int TbixCreateIndex(char const *pszTabFilePath, int const *piFieldsIdx, bool bCaseSens, int (*pHashFunc) (char const *const *, int const *, unsigned long *, bool) = NULL); int TbixCalculateHash(char const *const *ppszToks, int const *piFieldsIdx, unsigned long *pulHashVal, bool bCaseSens); char **TbixLookup(char const *pszTabFilePath, int const *piFieldsIdx, bool bCaseSens, ...); int TbixCheckIndex(char const *pszTabFilePath, int const *piFieldsIdx, bool bCaseSens, int (*pHashFunc) (char const *const *, int const *, unsigned long *, bool) = NULL); INDEX_HANDLE TbixOpenHandle(char const *pszTabFilePath, int const *piFieldsIdx, unsigned long const *pulHashVal, int iNumVals); int TbixCloseHandle(INDEX_HANDLE hIndexLookup); long TbixLookedUpRecords(INDEX_HANDLE hIndexLookup); char **TbixFirstRecord(INDEX_HANDLE hIndexLookup); char **TbixNextRecord(INDEX_HANDLE hIndexLookup); #endif xmail-1.27/Hash.cpp0000644000175000017500000001407711341640430013423 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "Hash.h" #define HMASK_TOP_BIT (1UL << (sizeof(long) * 8 - 1)) struct Hash { HashOps Ops; unsigned long ulCount; unsigned long ulHMask; SysListHead *pBkts; }; HASH_HANDLE HashCreate(HashOps const *pOps, unsigned long ulSize) { unsigned long i, ulHMask; Hash *pHash; if ((pHash = (Hash *) SysAlloc(sizeof(Hash))) == NULL) return INVALID_HASH_HANDLE; pHash->Ops = *pOps; for (ulHMask = 2; !(ulHMask & HMASK_TOP_BIT) && ulHMask <= ulSize; ulHMask <<= 1); ulHMask--; pHash->ulHMask = ulHMask; if ((pHash->pBkts = (SysListHead *) SysAlloc((ulHMask + 1) * sizeof(SysListHead))) == NULL) { SysFree(pHash); return INVALID_HASH_HANDLE; } for (i = 0; i <= ulHMask; i++) SYS_INIT_LIST_HEAD(&pHash->pBkts[i]); return (HASH_HANDLE) pHash; } void HashFree(HASH_HANDLE hHash, void (*pFree)(void *, HashNode *), void *pPrivate) { Hash *pHash = (Hash *) hHash; unsigned long i; SysListHead *pHead, *pPos; HashNode *pHNode; if (pHash != NULL) { if (pFree != NULL) { for (i = 0; i <= pHash->ulHMask; i++) { pHead = &pHash->pBkts[i]; while ((pPos = SYS_LIST_FIRST(pHead)) != NULL) { pHNode = SYS_LIST_ENTRY(pPos, HashNode, Lnk); SYS_LIST_DEL(&pHNode->Lnk); (*pFree)(pPrivate, pHNode); } } } SysFree(pHash->pBkts); SysFree(pHash); } } unsigned long HashGetCount(HASH_HANDLE hHash) { Hash *pHash = (Hash *) hHash; return pHash->ulCount; } void HashInitNode(HashNode *pHNode) { ZeroData(*pHNode); SYS_INIT_LIST_HEAD(&pHNode->Lnk); } static int HashGrow(Hash *pHash) { unsigned long i, ulHIdx, ulHMask; SysListHead *pBkts, *pHead, *pPos; HashNode *pHNode; ulHMask = pHash->ulHMask + 1; if (ulHMask & HMASK_TOP_BIT) return 0; ulHMask = (ulHMask << 1) - 1; if ((pBkts = (SysListHead *) SysAlloc((ulHMask + 1) * sizeof(SysListHead))) == NULL) return ErrGetErrorCode(); for (i = 0; i <= ulHMask; i++) SYS_INIT_LIST_HEAD(&pBkts[i]); for (i = 0; i <= pHash->ulHMask; i++) { pHead = &pHash->pBkts[i]; while ((pPos = SYS_LIST_FIRST(pHead)) != NULL) { pHNode = SYS_LIST_ENTRY(pPos, HashNode, Lnk); SYS_LIST_DEL(&pHNode->Lnk); ulHIdx = (*pHash->Ops.pGetHashVal)(pHash->Ops.pPrivate, &pHNode->Key) & ulHMask; SYS_LIST_ADDT(&pHNode->Lnk, &pBkts[ulHIdx]); } } SysFree(pHash->pBkts); pHash->pBkts = pBkts; pHash->ulHMask = ulHMask; return 0; } int HashAdd(HASH_HANDLE hHash, HashNode *pHNode) { Hash *pHash = (Hash *) hHash; unsigned long ulHIdx; SysListHead *pHead; if (pHash->ulCount >= pHash->ulHMask && HashGrow(pHash) < 0) return ErrGetErrorCode(); ulHIdx = (*pHash->Ops.pGetHashVal)(pHash->Ops.pPrivate, &pHNode->Key) & pHash->ulHMask; pHead = &pHash->pBkts[ulHIdx]; SYS_LIST_ADDT(&pHNode->Lnk, pHead); pHash->ulCount++; return 0; } void HashDel(HASH_HANDLE hHash, HashNode *pHNode) { Hash *pHash = (Hash *) hHash; SYS_LIST_DEL(&pHNode->Lnk); pHash->ulCount--; } int HashGetFirst(HASH_HANDLE hHash, HashDatum const *pKey, HashEnum *pHEnum, HashNode **ppHNode) { Hash *pHash = (Hash *) hHash; unsigned long ulHIdx; SysListHead *pHead, *pPos; HashNode *pHNode; ulHIdx = (*pHash->Ops.pGetHashVal)(pHash->Ops.pPrivate, pKey) & pHash->ulHMask; pHead = &pHash->pBkts[ulHIdx]; for (pPos = SYS_LIST_FIRST(pHead); pPos != NULL; pPos = SYS_LIST_NEXT(pPos, pHead)) { pHNode = SYS_LIST_ENTRY(pPos, HashNode, Lnk); if ((*pHash->Ops.pCompare)(pHash->Ops.pPrivate, pKey, &pHNode->Key) == 0) { *ppHNode = pHNode; pHEnum->ulHIdx = ulHIdx; pHEnum->pNext = SYS_LIST_NEXT(pPos, pHead); return 0; } } ErrSetErrorCode(ERR_NOT_FOUND); return ERR_NOT_FOUND; } int HashGetNext(HASH_HANDLE hHash, HashDatum const *pKey, HashEnum *pHEnum, HashNode **ppHNode) { Hash *pHash = (Hash *) hHash; SysListHead *pPos, *pHead; HashNode *pHNode; pHead = &pHash->pBkts[pHEnum->ulHIdx]; for (pPos = pHEnum->pNext; pPos != NULL; pPos = SYS_LIST_NEXT(pPos, pHead)) { pHNode = SYS_LIST_ENTRY(pPos, HashNode, Lnk); if ((*pHash->Ops.pCompare)(pHash->Ops.pPrivate, pKey, &pHNode->Key) == 0) { *ppHNode = pHNode; pHEnum->pNext = SYS_LIST_NEXT(pPos, pHead); return 0; } } ErrSetErrorCode(ERR_NOT_FOUND); return ERR_NOT_FOUND; } static int HashFetchNext(Hash *pHash, unsigned long ulFrom, HashEnum *pHEnum, HashNode **ppHNode) { unsigned long i; SysListHead *pHead, *pPos; for (i = ulFrom; i <= pHash->ulHMask; i++) { pHead = &pHash->pBkts[i]; if ((pPos = SYS_LIST_FIRST(pHead)) != NULL) { pHEnum->ulHIdx = i; pHEnum->pNext = SYS_LIST_NEXT(pPos, pHead); *ppHNode = SYS_LIST_ENTRY(pPos, HashNode, Lnk); return 0; } } ErrSetErrorCode(ERR_NOT_FOUND); return ERR_NOT_FOUND; } int HashFirst(HASH_HANDLE hHash, HashEnum *pHEnum, HashNode **ppHNode) { Hash *pHash = (Hash *) hHash; return HashFetchNext(pHash, 0, pHEnum, ppHNode); } int HashNext(HASH_HANDLE hHash, HashEnum *pHEnum, HashNode **ppHNode) { Hash *pHash = (Hash *) hHash; SysListHead *pPos; if ((pPos = pHEnum->pNext) != NULL) { pHEnum->pNext = SYS_LIST_NEXT(pPos, &pHash->pBkts[pHEnum->ulHIdx]); *ppHNode = SYS_LIST_ENTRY(pPos, HashNode, Lnk); return 0; } return HashFetchNext(pHash, pHEnum->ulHIdx + 1, pHEnum, ppHNode); } xmail-1.27/MailSvr.h0000644000175000017500000000304411341640430013552 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _MAILSVR_H #define _MAILSVR_H #define XMAIL_MAILDIR 1 #define XMAIL_MAILBOX 2 /* Defined in MailSvr.cpp */ extern SHB_HANDLE hShbFING, hShbCTRL, hShbPOP3, hShbSMTP, hShbSMAIL, hShbPSYNC, hShbLMAIL; extern char szMailPath[SYS_MAX_PATH]; extern bool bServerDebug; extern int iFilterTimeout; extern bool bFilterLogEnabled; extern QUEUE_HANDLE hSpoolQueue; extern SYS_SEMAPHORE hSyncSem; extern int iLogRotateHours; extern int iQueueSplitLevel; extern int iAddrFamily; extern int iPOP3ClientTimeout; extern int iMailboxType; int SvrMain(int iArgCount, char *pszArgs[]); int SvrStopServer(bool bWait = true); bool SvrInShutdown(bool bForceCheck = false); #endif xmail-1.27/Filter.h0000644000175000017500000000421511341640430013423 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _FILTER_H #define _FILTER_H #define FILTER_MODE_INBOUND "in" #define FILTER_MODE_OUTBOUND "out" #define FILTER_PRIORITY SYS_PRIORITY_NORMAL #define FILTER_OUT_NNF_EXITCODE 4 #define FILTER_OUT_NN_EXITCODE 5 #define FILTER_OUT_EXITCODE 6 #define FILTER_MODIFY_EXITCODE 7 #define FILTER_FLAGS_BREAK (1 << 4) #define FILTER_FLAGS_MASK FILTER_FLAGS_BREAK #define FILTER_XFL_WHITELISTED (1 << 0) struct FilterLogInfo { char const *pszSender; char const *pszRecipient; SYS_INET_ADDR LocalAddr; SYS_INET_ADDR RemoteAddr; char const * const *ppszExec; int iExecResult; int iExitCode; char const *pszType; char const *pszInfo; }; struct FilterTokens { char **ppszCmdTokens; int iTokenCount; }; struct FilterExecCtx { FilterTokens *pToks; char const *pszAuthName; unsigned long ulFlags; int iTimeout; }; enum FilterFields { filSender = 0, filRecipient, filRemoteAddr, filLocalAddr, filFileName, filMax }; int FilLogFilter(FilterLogInfo const *pFLI); char *FilGetFilterRejMessage(char const *pszSpoolFile); int FilExecPreParse(FilterExecCtx *pCtx, char **ppszPEError); int FilFilterMessage(SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char const *pszMode); #endif xmail-1.27/Makefile.common0000644000175000017500000000706211341640430014757 0ustar davidedavide# # XMail by Davide Libenzi (Intranet and Internet mail server) # Copyright (C) 1999,..,2010 Davide Libenzi # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Davide Libenzi # ifeq ($(DEBUG_OSSL), 1) CFLAGS := $(CFLAGS) -DDEBUG_OSSL endif ifeq ($(XMAIL_DEBUG), 1) CFLAGS := $(CFLAGS) -O0 -g STRIP = touch else CFLAGS := $(CFLAGS) -O2 endif OUTDIR = bin MKMACHDEPINC = SysMachine.h MKMACHDEP = ${OUTDIR}/MkMachDep MAILSVR = ${OUTDIR}/XMail CRTLCLNT = ${OUTDIR}/CtrlClnt XMCRYPT = ${OUTDIR}/XMCrypt MKUSERS = ${OUTDIR}/MkUsers SENDMAIL = ${OUTDIR}/sendmail MKMACHDEPSRCS = MkMachDep.cpp MKMACHDEPOBJS = $(addprefix $(OUTDIR)/, $(notdir $(patsubst %.cpp, %.o, $(MKMACHDEPSRCS)))) SVRSRCS = $(MAINSRC) $(SYSSRCS) SysDepCommon.cpp BuffSock.cpp CTRLSvr.cpp DNS.cpp DNSCache.cpp Errors.cpp \ ExtAliases.cpp FINGSvr.cpp MailConfig.cpp MailSvr.cpp Maildir.cpp MailDomains.cpp MD5.cpp \ MiscUtils.cpp LMAILSvr.cpp AliasDomain.cpp POP3GwLink.cpp POP3Svr.cpp POP3Utils.cpp PSYNCSvr.cpp \ ResLocks.cpp SList.cpp SMAILSvr.cpp TabIndex.cpp SMAILUtils.cpp SMTPSvr.cpp SMTPUtils.cpp \ ShBlocks.cpp StrUtils.cpp MessQueue.cpp QueueUtils.cpp SvrUtils.cpp UsrMailList.cpp UsrAuth.cpp \ UsrUtils.cpp Base64Enc.cpp Filter.cpp SSLBind.cpp SSLConfig.cpp Hash.cpp Array.cpp SSLMisc.cpp SVROBJS = $(addprefix $(OUTDIR)/, $(notdir $(patsubst %.cpp, %.o, $(SVRSRCS)))) CCLNSRCS = $(SYSSRCS) SysDepCommon.cpp Base64Enc.cpp BuffSock.cpp StrUtils.cpp MD5.cpp MiscUtils.cpp \ CTRLClient.cpp Errors.cpp SSLBind.cpp SSLMisc.cpp CCLNOBJS = $(addprefix $(OUTDIR)/, $(notdir $(patsubst %.cpp, %.o, $(CCLNSRCS)))) XMCSRCS = XMCrypt.cpp XMCOBJS = $(addprefix $(OUTDIR)/, $(notdir $(patsubst %.cpp, %.o, $(XMCSRCS)))) MKUSRCS = MkUsers.cpp MKUOBJS = $(addprefix $(OUTDIR)/, $(notdir $(patsubst %.cpp, %.o, $(MKUSRCS)))) SENDMAILSRC = SendMail.cpp SENDMAILOBJS = $(addprefix $(OUTDIR)/, $(notdir $(patsubst %.cpp, %.o, $(SENDMAILSRC)))) $(OUTDIR)/%.o: %.cpp ${CC} ${CPPFLAGS} ${CFLAGS} -o $(OUTDIR)/$*.o -c $*.cpp all: ${OUTDIR} ${MKMACHDEPINC} ${MAILSVR} ${CRTLCLNT} ${XMCRYPT} ${MKUSERS} ${SENDMAIL} ${OUTDIR}: @mkdir ${OUTDIR} ${MKMACHDEPINC}: ${MKMACHDEP} ./${MKMACHDEP} > ${MKMACHDEPINC} ${MKMACHDEP}: ${MKMACHDEPOBJS} ${LD} -o ${MKMACHDEP} ${MKMACHDEPOBJS} ${LDFLAGS} ${STRIP} ${MKMACHDEP} ${MAILSVR}: ${SVROBJS} ${LD} -o ${MAILSVR} ${SVROBJS} ${LDFLAGS} ${STRIP} ${MAILSVR} ${CRTLCLNT}: ${CCLNOBJS} ${LD} -o ${CRTLCLNT} ${CCLNOBJS} ${LDFLAGS} ${STRIP} ${CRTLCLNT} ${XMCRYPT}: ${XMCOBJS} ${LD} -o ${XMCRYPT} ${XMCOBJS} ${LDFLAGS} ${STRIP} ${XMCRYPT} ${MKUSERS}: ${MKUOBJS} ${LD} -o ${MKUSERS} ${MKUOBJS} ${LDFLAGS} ${STRIP} ${MKUSERS} ${SENDMAIL}: ${SENDMAILOBJS} ${LD} -o ${SENDMAIL} ${SENDMAILOBJS} ${LDFLAGS} ${STRIP} ${SENDMAIL} distclean: clean clean: rm -f .depend a.out core ${MAILSVR} ${CRTLCLNT} ${XMCRYPT} ${MKUSERS} ${SENDMAIL} rm -f *.o *~ ${MKMACHDEPINC} ${MKMACHDEP} rm -rf ${OUTDIR} xmail-1.27/POP3Svr.h0000644000175000017500000000274011341640430013413 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _POP3SVR_H #define _POP3SVR_H #define POP3_SERVER_NAME "[" APP_NAME_VERSION_STR " POP3 Server]" #define STD_POP3_PORT 110 #define POP3S_SERVER_NAME "[" APP_NAME_VERSION_STR " POP3S Server]" #define STD_POP3S_PORT 995 #define POP3_LISTEN_SIZE 64 #define POP3F_LOG_ENABLED (1 << 0) #define POP3F_HANG_ON_BADLOGIN (1 << 1) struct POP3Config { unsigned long ulFlags; long lThreadCount; long lMaxThreads; int iSessionTimeout; int iTimeout; int iBadLoginWait; }; unsigned int POP3ClientThread(void *pThreadData); #endif xmail-1.27/SvrUtils.h0000644000175000017500000000424011341640430013767 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SVRUTILS_H #define _SVRUTILS_H #define SVR_LOGS_DIR "logs" #define INVALID_SVRCFG_HANDLE ((SVRCFG_HANDLE) 0) typedef struct SVRCFG_HANDLE_struct { } *SVRCFG_HANDLE; SVRCFG_HANDLE SvrGetConfigHandle(int iWriteLock = 0); void SvrReleaseConfigHandle(SVRCFG_HANDLE hSvrConfig); char *SvrGetConfigVar(SVRCFG_HANDLE hSvrConfig, const char *pszName, const char *pszDefault = NULL); bool SvrTestConfigFlag(const char *pszName, bool bDefault, SVRCFG_HANDLE hSvrConfig = INVALID_SVRCFG_HANDLE); int SvrGetConfigInt(const char *pszName, int iDefault, SVRCFG_HANDLE hSvrConfig = INVALID_SVRCFG_HANDLE); int SysFlushConfig(SVRCFG_HANDLE hSvrConfig); int SvrGetMessageID(SYS_UINT64 * pullMessageID); char *SvrGetLogsDir(char *pszLogsPath, int iMaxPath); char *SvrGetSpoolDir(char *pszSpoolPath, int iMaxPath); int SvrConfigVar(const char *pszVarName, char *pszVarValue, int iMaxVarValue, SVRCFG_HANDLE hSvrConfig = INVALID_SVRCFG_HANDLE, const char *pszDefault = NULL); int SvrCheckDiskSpace(unsigned long ulMinSpace); int SvrCheckVirtMemSpace(unsigned long ulMinSpace); int SvrEnumProtoProps(const char *pszProto, const SYS_INET_ADDR *pPeerInfo, const char *pszHostName, int (*pfEnum)(void *, const char *, const char *), void *pPrivate); #endif xmail-1.27/MailDomains.h0000644000175000017500000000326211341640430014374 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _MAILDOMAINS_H #define _MAILDOMAINS_H #define INVALID_DOMLS_HANDLE ((DOMLS_HANDLE) 0) typedef struct DOMLS_HANDLE_struct { } *DOMLS_HANDLE; int MDomCheckDomainsIndexes(void); char *MDomGetDomainPath(char const *pszDomain, char *pszDomainPath, int iMaxPath, int iFinalSlash); int MDomLookupDomain(char const *pszDomain); int MDomAddDomain(char const *pszDomain); int MDomRemoveDomain(char const *pszDomain); int MDomGetDomainsFileSnapShot(const char *pszFileName); DOMLS_HANDLE MDomOpenDB(void); void MDomCloseDB(DOMLS_HANDLE hDomainsDB); char const *MDomGetFirstDomain(DOMLS_HANDLE hDomainsDB); char const *MDomGetNextDomain(DOMLS_HANDLE hDomainsDB); int MDomGetClientDomain(char const *pszFQDN, char *pszClientDomain, int iMaxDomain); int MDomIsHandledDomain(char const *pszDomain); #endif xmail-1.27/SMTPUtils.h0000644000175000017500000001242511341640430014004 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SMTPUTILS_H #define _SMTPUTILS_H #define INVALID_MXS_HANDLE ((MXS_HANDLE) 0) #define INVALID_SMTPCH_HANDLE ((SMTPCH_HANDLE) 0) #define SMTP_FATAL_ERROR 999 #define RECEIVED_TYPE_STD 0 #define RECEIVED_TYPE_VERBOSE 1 #define RECEIVED_TYPE_STRICT 2 #define RECEIVED_TYPE_AUTHSTD 3 #define RECEIVED_TYPE_AUTHVERBOSE 4 #define SMTP_ERROR_VARNAME "SMTP-Error" #define DEFAULT_SMTP_ERR "417 Temporary delivery error" #define SMTP_SERVER_VARNAME "SMTP-Server" #define SMTP_GWF_USE_TLS (1 << 0) #define SMTP_GWF_FORCE_TLS (1 << 1) typedef struct MXS_HANDLE_struct { } *MXS_HANDLE; typedef struct SMTPCH_HANDLE_struct { } *SMTPCH_HANDLE; struct SMTPError { char *pszServer; int iSTMPResponse; char *pszSTMPResponse; }; struct SMTPGateway { char *pszHost; char *pszIFace; unsigned long ulFlags; }; enum SmtpMsgInfo { smsgiClientDomain = 0, smsgiClientAddr, smsgiServerDomain, smsgiServerAddr, smsgiTime, smsgiSeverName, smsgiMax }; enum SpoolMsgInfo { smiClientAddr, smiServerAddr, smiTime, smiMax }; SMTPGateway **USmtpMakeGateways(char const * const *ppszGwHosts, char const **ppszOptions); void USmtpFreeGateways(SMTPGateway **ppGws); SMTPGateway **USmtpGetCfgGateways(SVRCFG_HANDLE hSvrConfig, char const * const *ppszGwHosts, char const *pszOptions); SMTPGateway **USmtpGetFwdGateways(SVRCFG_HANDLE hSvrConfig, char const *pszDomain); int USmtpGetGateway(SVRCFG_HANDLE hSvrConfig, char const *pszDomain, char *pszGateway, int iSize); int USmtpAddGateway(char const *pszDomain, char const *pszGateway); int USmtpRemoveGateway(char const *pszDomain); int USmtpIsAllowedRelay(const SYS_INET_ADDR & PeerInfo, SVRCFG_HANDLE hSvrConfig); char **USmtpGetPathStrings(char const *pszMailCmd); int USmtpSplitEmailAddr(char const *pszAddr, char *pszUser, char *pszDomain); int USmtpCheckAddressPart(char const *pszName); int USmtpCheckDomainPart(char const *pszName); int USmtpCheckAddress(char const *pszAddress); int USmtpInitError(SMTPError *pSMTPE); int USmtpSetError(SMTPError *pSMTPE, int iSTMPResponse, char const *pszSTMPResponse, char const *pszServer); bool USmtpIsFatalError(SMTPError const *pSMTPE); char const *USmtpGetErrorMessage(SMTPError const *pSMTPE); int USmtpCleanupError(SMTPError *pSMTPE); char *USmtpGetSMTPError(SMTPError *pSMTPE, char *pszError, int iMaxError); char *USmtpGetSMTPRmtMsgID(char const *pszAckDATA, char *pszRmtMsgID, int iMaxMsg); char const *USmtpGetErrorServer(SMTPError const *pSMTPE); SMTPCH_HANDLE USmtpCreateChannel(SMTPGateway const *pGw, char const *pszDomain, SMTPError *pSMTPE = NULL); int USmtpCloseChannel(SMTPCH_HANDLE hSmtpCh, int iHardClose = 0, SMTPError *pSMTPE = NULL); int USmtpChannelReset(SMTPCH_HANDLE hSmtpCh, SMTPError *pSMTPE = NULL); int USmtpSendMail(SMTPCH_HANDLE hSmtpCh, char const *pszFrom, char const *pszRcpt, FileSection const *pFS, SMTPError *pSMTPE = NULL); int USmtpSendMail(SMTPGateway const *pGw, char const *pszDomain, char const *pszFrom, char const *pszRcpt, FileSection const *pFS, SMTPError *pSMTPE = NULL); int USmtpMailRmtDeliver(SVRCFG_HANDLE hSvrConfig, char const *pszServer, char const *pszDomain, char const *pszFrom, char const *pszRcpt, FileSection const *pFS, SMTPError *pSMTPE = NULL); char *USmtpBuildRcptPath(char const *const *ppszRcptTo, SVRCFG_HANDLE hSvrConfig); SMTPGateway **USmtpGetMailExchangers(SVRCFG_HANDLE hSvrConfig, char const *pszDomain); int USmtpCheckMailDomain(SVRCFG_HANDLE hSvrConfig, char const *pszDomain); MXS_HANDLE USmtpGetMXFirst(SVRCFG_HANDLE hSvrConfig, char const *pszDomain, char *pszMXHost); int USmtpGetMXNext(MXS_HANDLE hMXSHandle, char *pszMXHost); void USmtpMXSClose(MXS_HANDLE hMXSHandle); int USmtpDnsMapsContained(SYS_INET_ADDR const &PeerInfo, char const *pszMapsServer); int USmtpSpammerCheck(const SYS_INET_ADDR & PeerInfo, char *&pszInfo); int USmtpSpamAddressCheck(char const *pszAddress); int USmtpAddMessageInfo(FILE *pMsgFile, char const *pszClientDomain, SYS_INET_ADDR const &PeerInfo, char const *pszServerDomain, SYS_INET_ADDR const &SockInfo, char const *pszSmtpServerLogo); int USmtpWriteInfoLine(FILE *pSpoolFile, char const *pszClientAddr, char const *pszServerAddr, char const *pszTime); char *USmtpGetReceived(int iType, char const *pszAuth, char const *const *ppszMsgInfo, char const *pszMailFrom, char const *pszRcptTo, char const *pszMessageID); #endif xmail-1.27/xmail.bsd0000644000175000017500000000337111341640430013633 0ustar davidedavide#!/bin/sh # # $NetBSD: xmail,2006/02/06 12:39:28 smartnet Exp $ # # PROVIDE: mail # REQUIRE: DAEMON LOGIN # KEYWORD: shutdown # # NetBSD 3.0 # XMail 1.23pre01.smartnet.1 # xmail rc.d script # (c) 2006 smartnet-ro.com # ################ ## NetBSD : ## Disable any existing SMTP/POP3 server ## set in /etc/rc.conf :: xmail=YES ################ ####################### load subr . /etc/rc.subr ####################### init name=xmail rcvar=$name start_cmd="xmail_start" stop_cmd="xmail_stop" pidfile=$PIDFILE ####################### local XMAIL_ROOT="/var/MailRoot" XMAIL_CMD_LINE="-Lt 2 -Ph -Pt 30 -St 30 -Ct 30 -Qn 20 -SX 20 -PX 20 -CX 2 -Yt 20" XPID="/usr/pkg/libexec/xmail/XMail" XNAME=XMail DESC="XMail Server" PIDDIR="/var/run" PIDFILE="$PIDDIR/XMail.pid" ### # set exit on error set -e # limit maximum core size ulimit -c 20000 ####################### START xmail_start() { MAIL_ROOT=$XMAIL_ROOT export MAIL_ROOT # MAIL_CMD_LINE=$XMAIL_CMD_LINE export MAIL_CMD_LINE # XMAIL_PID_DIR=$PIDDIR export XMAIL_PID_DIR # echo -n "Starting xmail" $XPID $XMAIL_CMD_LINE while [ ! -f $PIDFILE ] do sleep 1 done echo "." } ####################### STOP xmail_stop() { echo -n "Stopping xmail" if [ -f $PIDFILE ] then kill -s INT `cat $PIDFILE` while [ -f $PIDFILE ] do sleep 1 done echo "." else echo "XMail NOT running ?" fi } ####################### management if [ -f /etc/rc.subr -a -d /etc/rc.d -a -f /etc/rc.d/DAEMON ]; then if [ -d /var/MailRoot -a -d /usr/pkg/etc/xmail ]; then load_rc_config $name run_rc_command "$1" else echo -n "WARNING: /var/MailRoot or /usr/pkg/etc/xmail DOES NOT Exist. Please run 'xmail-setup' first." fi fi ####################### # END xmail-1.27/MailRoot/0000755000175000017500000000000011341640430013551 5ustar davidedavidexmail-1.27/MailRoot/message.id0000644000175000017500000000000311341640430015504 0ustar davidedavide1 xmail-1.27/MailRoot/dnsroots0000644000175000017500000000040411341640430015345 0ustar davidedavidea.root-servers.net. h.root-servers.net. c.root-servers.net. g.root-servers.net. f.root-servers.net. b.root-servers.net. j.root-servers.net. k.root-servers.net. l.root-servers.net. m.root-servers.net. i.root-servers.net. e.root-servers.net. d.root-servers.net. xmail-1.27/MailRoot/ctrl.ipmap.tab0000644000175000017500000000003611341640430016311 0ustar davidedavide"0.0.0.0" "0.0.0.0" "ALLOW" 1 xmail-1.27/MailRoot/spam-address.tab0000644000175000017500000000000011341640430016612 0ustar davidedavidexmail-1.27/MailRoot/filters.pre-data.tab0000644000175000017500000000000011341640430017373 0ustar davidedavidexmail-1.27/MailRoot/spool/0000755000175000017500000000000011341640430014705 5ustar davidedavidexmail-1.27/MailRoot/spool/local/0000755000175000017500000000000011341640430015777 5ustar davidedavidexmail-1.27/MailRoot/spool/temp/0000755000175000017500000000000011341640430015652 5ustar davidedavidexmail-1.27/MailRoot/domains.tab0000644000175000017500000000002311341640430015666 0ustar davidedavide"xmailserver.test" xmail-1.27/MailRoot/finger.ipmap.tab0000644000175000017500000000003611341640430016617 0ustar davidedavide"0.0.0.0" "0.0.0.0" "ALLOW" 1 xmail-1.27/MailRoot/spammers.tab0000644000175000017500000000000011341640430016056 0ustar davidedavidexmail-1.27/MailRoot/pop3.ipmap.tab0000644000175000017500000000003611341640430016226 0ustar davidedavide"0.0.0.0" "0.0.0.0" "ALLOW" 1 xmail-1.27/MailRoot/pop3linklocks/0000755000175000017500000000000011341640430016344 5ustar davidedavidexmail-1.27/MailRoot/userauth/0000755000175000017500000000000011341640430015411 5ustar davidedavidexmail-1.27/MailRoot/userauth/pop3/0000755000175000017500000000000011341640430016272 5ustar davidedavidexmail-1.27/MailRoot/userauth/smtp/0000755000175000017500000000000011341640430016374 5ustar davidedavidexmail-1.27/MailRoot/extaliases.tab0000644000175000017500000000000011341640430016371 0ustar davidedavidexmail-1.27/MailRoot/bin/0000755000175000017500000000000011341640430014321 5ustar davidedavidexmail-1.27/MailRoot/domains/0000755000175000017500000000000011341640430015203 5ustar davidedavidexmail-1.27/MailRoot/domains/xmailserver.test/0000755000175000017500000000000011341640430020522 5ustar davidedavidexmail-1.27/MailRoot/domains/xmailserver.test/xmailuser/0000755000175000017500000000000011341640430022533 5ustar davidedavidexmail-1.27/MailRoot/domains/xmailserver.test/xmailuser/mailproc.sample.tab0000644000175000017500000000045511341640430026315 0ustar davidedavide"mailbox" "redirect" "foo-user@supermx.net" "root@maindomain.org" "lredirect" "foo-user@supermx2.org" "root@foodomain.net" "external" "0" "0" "mailprocess.sh" "-s" "@@FROM" "-r" "@@RCPT" "-f" "@@FILE" "wait" "8" "external" "0" "0" "mailprocess-delfile.sh" "-s" "@@FROM" "-r" "@@RCPT" "-f" "@@TMPFILE" xmail-1.27/MailRoot/domains/xmailserver.test/xmailuser/Maildir/0000755000175000017500000000000011341640430024114 5ustar davidedavidexmail-1.27/MailRoot/domains/xmailserver.test/xmailuser/Maildir/cur/0000755000175000017500000000000011341640430024705 5ustar davidedavidexmail-1.27/MailRoot/domains/xmailserver.test/xmailuser/Maildir/new/0000755000175000017500000000000011341640430024705 5ustar davidedavidexmail-1.27/MailRoot/domains/xmailserver.test/xmailuser/Maildir/tmp/0000755000175000017500000000000011341640430024714 5ustar davidedavidexmail-1.27/MailRoot/domains/xmailserver.test/xmailuser/mailbox/0000755000175000017500000000000011341640430024166 5ustar davidedavidexmail-1.27/MailRoot/domains/xmailserver.test/xmailuser/user.tab0000644000175000017500000000022311341640430024176 0ustar davidedavide"RealName" "XMail sample user" "HomePage" "http://www.xmailserver.org/davide.html" "MaxMBSize" "30000" "MaxMessageSize" "10000" "SmtpPerms" "MRV" xmail-1.27/MailRoot/domains/xmailserver.test/xmailuser/pop3.ipmap.sample.tab0000644000175000017500000000010311341640430026463 0ustar davidedavide"0.0.0.0" "0.0.0.0" "DENY" 1 "192.4.1.0" "255.255.255.0" "ALLOW" 2 xmail-1.27/MailRoot/dnscache/0000755000175000017500000000000011341640430015321 5ustar davidedavidexmail-1.27/MailRoot/dnscache/mx/0000755000175000017500000000000011341640430015745 5ustar davidedavidexmail-1.27/MailRoot/dnscache/ns/0000755000175000017500000000000011341640430015741 5ustar davidedavidexmail-1.27/MailRoot/custdomains/0000755000175000017500000000000011341640430016102 5ustar davidedavidexmail-1.27/MailRoot/smtpauth.tab0000644000175000017500000000000011341640430016074 0ustar davidedavidexmail-1.27/MailRoot/smtpfwd.tab0000644000175000017500000000000011341640430015713 0ustar davidedavidexmail-1.27/MailRoot/cmdaliases/0000755000175000017500000000000011341640430015656 5ustar davidedavidexmail-1.27/MailRoot/mailusers.tab0000644000175000017500000000007611341640430016250 0ustar davidedavide"xmailserver.test" "xmailuser" "1d08040c09" 1 "xmailuser" "U" xmail-1.27/MailRoot/filters.post-data.tab0000644000175000017500000000000011341640430017572 0ustar davidedavidexmail-1.27/MailRoot/server.tab0000644000175000017500000000327711341640430015560 0ustar davidedavide# # Example configuration file. # Note : remember to use _REAL_ TABs and " to format this file # "RootDomain" "xmailserver.test" "SmtpServerDomain" "xmailserver.test" "POP3Domain" "xmailserver.test" "HeloDomain" "xmailserver.test" "PostMaster" "root@xmailserver.test" "ErrorsAdmin" "root@xmailserver.test" #"TempErrorsAdmin" "send-failures@xmailserver.test" #"DefaultSMTPGateways" "192.168.1.2,192.168.1.15" "RemoveSpoolErrors" "0" "Pop3LogPasswd" "0" #"NoSenderBounce" "1" #"DisableEmitAuthUser" "1" #"NotifyMsgLinesExtra" "8" #"NotifySendLogToSender" "0" #"NotifyTryPattern" "1" "MaxMTAOps" "16" "ReceivedHdrType" "0" "FetchHdrTags" "+X-Deliver-To,+Received,To,Cc" #"SmtpGwConfig" "NeedTLS=1,OutBind=192.168.1.1" #"EnableCTRL-TLS" "1" #"EnableSMTP-TLS" "1" #"EnablePOP3-TLS" "1" #"SmtpMsgIPBanSpammers" "550 Denied due inclusion of your IP in our spam lists" #"SmtpMsgIPBanSpamAddress" "550 Denied due inclusion of your email address in our spam lists" #"SmtpMsgIPBanMaps" "550 Denied due inclusion of your IP in the following map" #"CustomSMTPMessage" "Please open http://www.xmailserver.test/smtp_errors.html to get more information about this error" #"MaxMessageSize" "20000" #"EnableAuthSMTP-POP3" "0" #"Pop3SyncErrorAccount" "psync-errors@xmailserver.test" #"AllowNullSender" "1" #"AllowSmtpVRFY" "1" #"AllowSmtpETRN" "1" #"SMTP-MaxErrors" "4" #"SmtpMinDiskSpace" "100000" #"SmtpMinVirtMemSpace" "64000" #"Pop3MinVirtMemSpace" "64000" #"CustMapsList" "list.dsbl.org.:1,blackholes.mail-abuse.org.:1,dialups.mail-abuse.org.:0" #"SMTP-RDNSCheck" "1" #"CheckMailerDomain" "1" #"SmartDNSHost" "dns.home.bogus.net:tcp,192.168.1.1:udp" #"SmtpConfig" "mail-auth" #"SmtpConfig-192.168.0.1" "mail-auth" "DefaultSmtpPerms" "MRVZ" xmail-1.27/MailRoot/smtp.ipmap.tab0000644000175000017500000000003611341640430016330 0ustar davidedavide"0.0.0.0" "0.0.0.0" "ALLOW" 1 xmail-1.27/MailRoot/userdef.tab0000644000175000017500000000021111341640430015670 0ustar davidedavide"RealName" "??" "HomePage" "??" "Address" "??" "Telephone" "??" "MaxMBSize" "10000" "SmtpPerms" "MR" "ReceiveEnable" "1" "PopEnable" "1" xmail-1.27/MailRoot/ctrlaccounts.tab0000644000175000017500000000000011341640430016733 0ustar davidedavidexmail-1.27/MailRoot/smtpgw.tab0000644000175000017500000000000011341640430015550 0ustar davidedavidexmail-1.27/MailRoot/aliasdomain.tab0000644000175000017500000000000011341640430016510 0ustar davidedavidexmail-1.27/MailRoot/pop3locks/0000755000175000017500000000000011341640430015466 5ustar davidedavidexmail-1.27/MailRoot/tabindex/0000755000175000017500000000000011341640430015347 5ustar davidedavidexmail-1.27/MailRoot/smtp.ipprop.tab0000644000175000017500000000000011341640430016522 0ustar davidedavidexmail-1.27/MailRoot/pop3links/0000755000175000017500000000000011341640430015473 5ustar davidedavidexmail-1.27/MailRoot/smtpextauth.tab0000644000175000017500000000000011341640430016615 0ustar davidedavidexmail-1.27/MailRoot/filters.out.tab0000644000175000017500000000000011341640430016505 0ustar davidedavidexmail-1.27/MailRoot/msgsync/0000755000175000017500000000000011341640430015234 5ustar davidedavidexmail-1.27/MailRoot/logs/0000755000175000017500000000000011341640430014515 5ustar davidedavidexmail-1.27/MailRoot/pop3links.tab0000644000175000017500000000000011341640430016151 0ustar davidedavidexmail-1.27/MailRoot/filters.post-rcpt.tab0000644000175000017500000000000011341640430017631 0ustar davidedavidexmail-1.27/MailRoot/filters.in.tab0000644000175000017500000000000011341640430016304 0ustar davidedavidexmail-1.27/MailRoot/aliases.tab0000644000175000017500000000012211341640430015655 0ustar davidedavide"xmailserver.test" "root" "xmailuser" "xmailserver.test" "postmaster" "xmailuser" xmail-1.27/MailRoot/smtprelay.tab0000644000175000017500000000011611341640430016257 0ustar davidedavide"10.0.0.0" "255.0.0.0" "172.16.0.0" "255.255.0.0" "192.168.0.0" "255.255.0.0" xmail-1.27/MailRoot/filters/0000755000175000017500000000000011341640430015221 5ustar davidedavidexmail-1.27/PSYNCSvr.h0000644000175000017500000000227511341640430013571 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _PSYNCSVR_H #define _PSYNCSVR_H #define PSYNCF_STOP_SERVER (1 << 0) #define PSYNCF_LOG_ENABLED (1 << 1) struct PSYNCConfig { unsigned long ulFlags; long lThreadCount; int iTimeout; int iSyncInterval; int iNumSyncThreads; }; unsigned int PSYNCThreadProc(void *pThreadData); #endif xmail-1.27/COPYING0000644000175000017500000004313111341640430013060 0ustar davidedavide GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. xmail-1.27/MailSvr.cpp0000644000175000017500000011125511341640430014111 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "SList.h" #include "ShBlocks.h" #include "StrUtils.h" #include "BuffSock.h" #include "MailConfig.h" #include "MiscUtils.h" #include "SSLBind.h" #include "ResLocks.h" #include "POP3Svr.h" #include "SMTPSvr.h" #include "SMAILSvr.h" #include "PSYNCSvr.h" #include "DNS.h" #include "DNSCache.h" #include "UsrUtils.h" #include "SvrUtils.h" #include "MessQueue.h" #include "SMAILUtils.h" #include "QueueUtils.h" #include "ExtAliases.h" #include "AliasDomain.h" #include "MailDomains.h" #include "POP3GwLink.h" #include "CTRLSvr.h" #include "FINGSvr.h" #include "LMAILSvr.h" #include "AppDefines.h" #include "MailSvr.h" #define ENV_MAIN_PATH "MAIL_ROOT" #define ENV_CMD_LINE "MAIL_CMD_LINE" #define SVR_SHUTDOWN_FILE ".shutdown" #define STD_SMAIL_THREADS 16 #define MAX_SMAIL_THREADS 256 #define STD_SMAIL_RETRY_TIMEOUT 480 #define STD_SMAIL_RETRY_INCR_RATIO 16 #define STD_SMAIL_MAX_RETRY 32 #define STD_PSYNC_INTERVAL 120 #define STD_PSYNC_NUM_THREADS 8 #define MAX_PSYNC_NUM_THREADS 32 #define STD_POP3_BADLOGIN_WAIT 5 #define MAX_POP3_THREADS 1024 #define MAX_SMTP_THREADS 1024 #define STD_SMTP_MAX_RCPTS 100 #define MAX_CTRL_THREADS 512 #define STD_LMAIL_THREADS 3 #define MAX_LMAIL_THREADS 17 #define STD_LMAILTHREAD_SLEEP_TIME 2 #define SVR_EXIT_WAIT 480 #define STD_SERVER_SESSION_TIMEOUT 90000 #define MAX_CLIENTS_WAIT 300 #define CTRL_SERVER_SESSION_TIMEOUT 120000 #define SERVER_SLEEP_TIMESLICE 2 #define SHUTDOWN_CHECK_TIME 2 #define STD_POP3AUTH_EXPIRE_TIME (15 * 60) #define FILTER_TIMEOUT 90000 #define SVR_MAX_SERVICES 32 enum SvrServices { SVC_SMAIL = 0, SVC_CTRL, SVC_CRTLS, SVC_POP3, SVC_SMTP, SVC_FING, SVC_LMAIL, SVC_PSYNC, SVC_SMTPS, SVC_POP3S, SVC_CTRLS, SVC_MAX }; struct SvrShutdownCtx { void (*pfShutdown)(void *); void *pPrivate; }; /* External visible variabiles */ SHB_HANDLE hShbFING; SHB_HANDLE hShbCTRL; SHB_HANDLE hShbPOP3; SHB_HANDLE hShbSMTP; SHB_HANDLE hShbSMAIL; SHB_HANDLE hShbPSYNC; SHB_HANDLE hShbLMAIL; char szMailPath[SYS_MAX_PATH]; QUEUE_HANDLE hSpoolQueue; SYS_SEMAPHORE hSyncSem; bool bServerDebug; int iFilterTimeout = FILTER_TIMEOUT; bool bFilterLogEnabled = false; int iLogRotateHours = LOG_ROTATE_HOURS; int iQueueSplitLevel = STD_QUEUEFS_DIRS_X_LEVEL; int iAddrFamily = AF_INET; int iPOP3ClientTimeout = STD_SERVER_TIMEOUT; #ifdef __UNIX__ int iMailboxType = XMAIL_MAILDIR; #else int iMailboxType = XMAIL_MAILBOX; #endif /* Local visible variabiles */ static int iNumShCtxs; static SvrShutdownCtx ShCtxs[SVR_MAX_SERVICES]; static char szShutdownFile[SYS_MAX_PATH]; static bool bServerShutdown = false; static int iNumSMAILThreads; static int iNumLMAILThreads; static SYS_THREAD hCTRLThread; static ThreadConfig ThCfgCTRL; static SYS_THREAD hCTRLSThread; static ThreadConfig ThCfgCTRLS; static SYS_THREAD hFINGThread; static ThreadConfig ThCfgFING; static SYS_THREAD hPOP3Thread; static ThreadConfig ThCfgPOP3; static SYS_THREAD hPOP3SThread; static ThreadConfig ThCfgPOP3S; static SYS_THREAD hSMTPThread; static ThreadConfig ThCfgSMTP; static SYS_THREAD hSMTPSThread; static ThreadConfig ThCfgSMTPS; static SYS_THREAD hSMAILThreads[MAX_SMAIL_THREADS]; static SYS_THREAD hLMAILThreads[MAX_LMAIL_THREADS]; static SYS_THREAD hPSYNCThread; static void SvrShutdownCleanup(void) { CheckRemoveFile(szShutdownFile); bServerShutdown = false; } static int SvrSetShutdown(void) { /* Set the shutdown flag and shutdown the library */ bServerShutdown = true; SysShutdownLibrary(); FILE *pFile = fopen(szShutdownFile, "wt"); if (pFile == NULL) { ErrSetErrorCode(ERR_FILE_CREATE, szShutdownFile); return ERR_FILE_CREATE; } char szShutdownTimeStr[256]; MscGetTimeStr(szShutdownTimeStr, sizeof(szShutdownTimeStr)); fprintf(pFile, "%s\n", szShutdownTimeStr); fclose(pFile); return 0; } static int SvrAddShutdown(void (*pfShutdown)(void *), void *pPrivate) { if (iNumShCtxs >= SVR_MAX_SERVICES) return -1; ShCtxs[iNumShCtxs].pfShutdown = pfShutdown; ShCtxs[iNumShCtxs].pPrivate = pPrivate; return iNumShCtxs++; } static void SvrDoShutdown(void) { int i; for (i = iNumShCtxs - 1; i >= 0; i--) (*ShCtxs[i].pfShutdown)(ShCtxs[i].pPrivate); } static void SvrShutdown__ThreadConfig(void *pPrivate) { ThreadConfig *pThCfg = (ThreadConfig *) pPrivate; pThCfg->ulFlags |= THCF_SHUTDOWN; } static int SvrAddServerAddress(char const *pszServer, SYS_INET_ADDR *pSvrAddr, int *piPos, int iSize) { int iError; if (*piPos >= iSize) { ErrSetErrorCode(ERR_TOO_MANY_ELEMENTS); return ERR_TOO_MANY_ELEMENTS; } if ((iError = MscGetServerAddress(pszServer, pSvrAddr[*piPos])) < 0) return iError; (*piPos)++; return 0; } static long SvrThreadCntCTRL(ThreadConfig const *pThCfg) { long lThreadCnt = 0; CTRLConfig *pCTRLCfg = (CTRLConfig *) ShbLock(pThCfg->hThShb); if (pCTRLCfg != NULL) { lThreadCnt = pCTRLCfg->lThreadCount; ShbUnlock(pThCfg->hThShb); } return lThreadCnt; } static void SvrCleanupCTRL(void) { if (hCTRLThread != SYS_INVALID_THREAD) { SysWaitThread(hCTRLThread, SVR_EXIT_WAIT); SysCloseThread(hCTRLThread, 1); } ShbCloseBlock(hShbCTRL); for (; ThCfgCTRL.iNumSockFDs > 0; ThCfgCTRL.iNumSockFDs--) SysCloseSocket(ThCfgCTRL.SockFDs[ThCfgCTRL.iNumSockFDs - 1]); } static int SvrSetupCTRL(int iArgCount, char *pszArgs[]) { int iPort = STD_CTRL_PORT, iDisable = 0, iFamily = AF_INET; int iSessionTimeout = CTRL_SERVER_SESSION_TIMEOUT; long lMaxThreads = MAX_CTRL_THREADS; unsigned long ulFlags = 0; /* * Initialize the service thread handle to SYS_INVALID_THREAD so that * we can detect the service being disabled in the cleanup function. */ hCTRLThread = SYS_INVALID_THREAD; ZeroData(ThCfgCTRL); ThCfgCTRL.pszName = CTRL_SERVER_NAME; ThCfgCTRL.pfThreadProc = CTRLClientThread; ThCfgCTRL.pfThreadCnt = SvrThreadCntCTRL; for (int i = 0; i < iArgCount; i++) { if (pszArgs[i][0] != '-' || pszArgs[i][1] != 'C') continue; switch (pszArgs[i][2]) { case 'p': if (++i < iArgCount) iPort = atoi(pszArgs[i]); break; case 't': if (++i < iArgCount) iSessionTimeout = atoi(pszArgs[i]) * 1000; break; case 'l': ulFlags |= CTRLF_LOG_ENABLED; break; case 'I': if (++i < iArgCount && SvrAddServerAddress(pszArgs[i], ThCfgCTRL.SvrAddr, &ThCfgCTRL.iNumAddr, CountOf(ThCfgCTRL.SvrAddr)) < 0) return ErrGetErrorCode(); break; case 'X': if (++i < iArgCount) lMaxThreads = atol(pszArgs[i]); break; case '-': iDisable++; break; case '6': iFamily = AF_INET6; break; } } if ((hShbCTRL = ShbCreateBlock(sizeof(CTRLConfig))) == SHB_INVALID_HANDLE) return ErrGetErrorCode(); CTRLConfig *pCTRLCfg = (CTRLConfig *) ShbLock(hShbCTRL); if (pCTRLCfg == NULL) { ErrorPush(); ShbCloseBlock(hShbCTRL); return ErrorPop(); } pCTRLCfg->ulFlags = ulFlags; pCTRLCfg->lThreadCount = 0; pCTRLCfg->lMaxThreads = lMaxThreads; pCTRLCfg->iSessionTimeout = iSessionTimeout; pCTRLCfg->iTimeout = STD_SERVER_TIMEOUT; ShbUnlock(hShbCTRL); if (iDisable) return 0; if (MscCreateServerSockets(ThCfgCTRL.iNumAddr, ThCfgCTRL.SvrAddr, iFamily, iPort, CTRL_LISTEN_SIZE, ThCfgCTRL.SockFDs, ThCfgCTRL.iNumSockFDs) < 0) { ShbCloseBlock(hShbCTRL); return ErrGetErrorCode(); } ThCfgCTRL.hThShb = hShbCTRL; if ((hCTRLThread = SysCreateThread(MscServiceThread, &ThCfgCTRL)) == SYS_INVALID_THREAD) { ErrorPush(); ShbCloseBlock(hShbCTRL); for (; ThCfgCTRL.iNumSockFDs > 0; ThCfgCTRL.iNumSockFDs--) SysCloseSocket(ThCfgCTRL.SockFDs[ThCfgCTRL.iNumSockFDs - 1]); return ErrorPop(); } /* * Register the shutdown function. */ SvrAddShutdown(SvrShutdown__ThreadConfig, &ThCfgCTRL); return 0; } static int SvrSetupCTRLS(int iArgCount, char *pszArgs[]) { int iPort = STD_CTRLS_PORT, iFamily = AF_INET; /* * Initialize the service thread handle to SYS_INVALID_THREAD so that * we can detect the service being disabled in the cleanup function. */ hCTRLSThread = SYS_INVALID_THREAD; ZeroData(ThCfgCTRLS); ThCfgCTRLS.pszName = CTRLS_SERVER_NAME; ThCfgCTRLS.pfThreadProc = CTRLClientThread; ThCfgCTRLS.pfThreadCnt = SvrThreadCntCTRL; ThCfgCTRLS.ulFlags = THCF_USE_SSL; ThCfgCTRLS.hThShb = hShbCTRL; for (int i = 0; i < iArgCount; i++) { if (pszArgs[i][0] != '-' || pszArgs[i][1] != 'W') continue; switch (pszArgs[i][2]) { case 'p': if (++i < iArgCount) iPort = atoi(pszArgs[i]); break; case 'I': if (++i < iArgCount && SvrAddServerAddress(pszArgs[i], ThCfgCTRLS.SvrAddr, &ThCfgCTRLS.iNumAddr, CountOf(ThCfgCTRLS.SvrAddr)) < 0) return ErrGetErrorCode(); break; case '-': return 0; case '6': iFamily = AF_INET6; break; } } if (MscCreateServerSockets(ThCfgCTRLS.iNumAddr, ThCfgCTRLS.SvrAddr, iFamily, iPort, CTRL_LISTEN_SIZE, ThCfgCTRLS.SockFDs, ThCfgCTRLS.iNumSockFDs) < 0) return ErrGetErrorCode(); if ((hCTRLSThread = SysCreateThread(MscServiceThread, &ThCfgCTRLS)) == SYS_INVALID_THREAD) { ErrorPush(); for (; ThCfgCTRLS.iNumSockFDs > 0; ThCfgCTRLS.iNumSockFDs--) SysCloseSocket(ThCfgCTRLS.SockFDs[ThCfgCTRLS.iNumSockFDs - 1]); return ErrorPop(); } /* * Register the shutdown function. */ SvrAddShutdown(SvrShutdown__ThreadConfig, &ThCfgCTRLS); return 0; } static void SvrCleanupCTRLS(void) { if (hCTRLSThread != SYS_INVALID_THREAD) { SysWaitThread(hCTRLSThread, SVR_EXIT_WAIT); SysCloseThread(hCTRLSThread, 1); } for (; ThCfgCTRLS.iNumSockFDs > 0; ThCfgCTRLS.iNumSockFDs--) SysCloseSocket(ThCfgCTRLS.SockFDs[ThCfgCTRLS.iNumSockFDs - 1]); } static long SvrThreadCntFING(ThreadConfig const *pThCfg) { long lThreadCnt = 0; FINGConfig *pFINGCfg = (FINGConfig *) ShbLock(pThCfg->hThShb); if (pFINGCfg != NULL) { lThreadCnt = pFINGCfg->lThreadCount; ShbUnlock(pThCfg->hThShb); } return lThreadCnt; } static void SvrCleanupFING(void) { if (hFINGThread != SYS_INVALID_THREAD) { SysWaitThread(hFINGThread, SVR_EXIT_WAIT); SysCloseThread(hFINGThread, 1); } ShbCloseBlock(hShbFING); for (; ThCfgFING.iNumSockFDs > 0; ThCfgFING.iNumSockFDs--) SysCloseSocket(ThCfgFING.SockFDs[ThCfgFING.iNumSockFDs - 1]); } static int SvrSetupFING(int iArgCount, char *pszArgs[]) { int iPort = STD_FINGER_PORT, iDisable = 0, iFamily = AF_INET; unsigned long ulFlags = 0; /* * Initialize the service thread handle to SYS_INVALID_THREAD so that * we can detect the service being disabled in the cleanup function. */ hFINGThread = SYS_INVALID_THREAD; ZeroData(ThCfgFING); ThCfgFING.pszName = FING_SERVER_NAME; ThCfgFING.pfThreadProc = FINGClientThread; ThCfgFING.pfThreadCnt = SvrThreadCntFING; for (int i = 0; i < iArgCount; i++) { if (pszArgs[i][0] != '-' || pszArgs[i][1] != 'F') continue; switch (pszArgs[i][2]) { case 'p': if (++i < iArgCount) iPort = atoi(pszArgs[i]); break; case 'l': ulFlags |= FINGF_LOG_ENABLED; break; case 'I': if (++i < iArgCount && SvrAddServerAddress(pszArgs[i], ThCfgFING.SvrAddr, &ThCfgFING.iNumAddr, CountOf(ThCfgFING.SvrAddr)) < 0) return ErrGetErrorCode(); break; case '-': iDisable++; break; case '6': iFamily = AF_INET6; break; } } if ((hShbFING = ShbCreateBlock(sizeof(FINGConfig))) == SHB_INVALID_HANDLE) return ErrGetErrorCode(); FINGConfig *pFINGCfg = (FINGConfig *) ShbLock(hShbFING); if (pFINGCfg == NULL) { ShbCloseBlock(hShbFING); return ErrGetErrorCode(); } pFINGCfg->ulFlags = ulFlags; pFINGCfg->lThreadCount = 0; pFINGCfg->iTimeout = STD_SERVER_TIMEOUT; ShbUnlock(hShbFING); if (iDisable) return 0; if (MscCreateServerSockets(ThCfgFING.iNumAddr, ThCfgFING.SvrAddr, iFamily, iPort, FING_LISTEN_SIZE, ThCfgFING.SockFDs, ThCfgFING.iNumSockFDs) < 0) { ShbCloseBlock(hShbFING); return ErrGetErrorCode(); } ThCfgFING.hThShb = hShbFING; if ((hFINGThread = SysCreateThread(MscServiceThread, &ThCfgFING)) == SYS_INVALID_THREAD) { ErrorPush(); ShbCloseBlock(hShbFING); for (; ThCfgFING.iNumSockFDs > 0; ThCfgFING.iNumSockFDs--) SysCloseSocket(ThCfgFING.SockFDs[ThCfgFING.iNumSockFDs - 1]); return ErrorPop(); } /* * Register the shutdown function. */ SvrAddShutdown(SvrShutdown__ThreadConfig, &ThCfgFING); return 0; } static long SvrThreadCntPOP3(ThreadConfig const *pThCfg) { long lThreadCnt = 0; POP3Config *pPOP3Cfg = (POP3Config *) ShbLock(pThCfg->hThShb); if (pPOP3Cfg != NULL) { lThreadCnt = pPOP3Cfg->lThreadCount; ShbUnlock(pThCfg->hThShb); } return lThreadCnt; } static void SvrCleanupPOP3(void) { if (hPOP3Thread != SYS_INVALID_THREAD) { SysWaitThread(hPOP3Thread, SVR_EXIT_WAIT); SysCloseThread(hPOP3Thread, 1); } ShbCloseBlock(hShbPOP3); for (; ThCfgPOP3.iNumSockFDs > 0; ThCfgPOP3.iNumSockFDs--) SysCloseSocket(ThCfgPOP3.SockFDs[ThCfgPOP3.iNumSockFDs - 1]); } static int SvrSetupPOP3(int iArgCount, char *pszArgs[]) { int iPort = STD_POP3_PORT, iDisable = 0, iFamily = AF_INET; int iSessionTimeout = STD_SERVER_SESSION_TIMEOUT; int iBadLoginWait = STD_POP3_BADLOGIN_WAIT; long lMaxThreads = MAX_POP3_THREADS; unsigned long ulFlags = 0; /* * Initialize the service thread handle to SYS_INVALID_THREAD so that * we can detect the service being disabled in the cleanup function. */ hPOP3Thread = SYS_INVALID_THREAD; ZeroData(ThCfgPOP3); ThCfgPOP3.pszName = POP3_SERVER_NAME; ThCfgPOP3.pfThreadProc = POP3ClientThread; ThCfgPOP3.pfThreadCnt = SvrThreadCntPOP3; for (int i = 0; i < iArgCount; i++) { if (pszArgs[i][0] != '-' || pszArgs[i][1] != 'P') continue; switch (pszArgs[i][2]) { case 'p': if (++i < iArgCount) iPort = atoi(pszArgs[i]); break; case 't': if (++i < iArgCount) iSessionTimeout = atoi(pszArgs[i]) * 1000; break; case 'w': if (++i < iArgCount) iBadLoginWait = atoi(pszArgs[i]); break; case 'l': ulFlags |= POP3F_LOG_ENABLED; break; case 'h': ulFlags |= POP3F_HANG_ON_BADLOGIN; break; case 'I': if (++i < iArgCount && SvrAddServerAddress(pszArgs[i], ThCfgPOP3.SvrAddr, &ThCfgPOP3.iNumAddr, CountOf(ThCfgPOP3.SvrAddr)) < 0) return ErrGetErrorCode(); break; case 'X': if (++i < iArgCount) lMaxThreads = atol(pszArgs[i]); break; case '-': iDisable++; break; case '6': iFamily = AF_INET6; break; } } if ((hShbPOP3 = ShbCreateBlock(sizeof(POP3Config))) == SHB_INVALID_HANDLE) return ErrGetErrorCode(); POP3Config *pPOP3Cfg = (POP3Config *) ShbLock(hShbPOP3); if (pPOP3Cfg == NULL) { ShbCloseBlock(hShbPOP3); return ErrGetErrorCode(); } pPOP3Cfg->ulFlags = ulFlags; pPOP3Cfg->lThreadCount = 0; pPOP3Cfg->lMaxThreads = lMaxThreads; pPOP3Cfg->iSessionTimeout = iSessionTimeout; pPOP3Cfg->iTimeout = STD_SERVER_TIMEOUT; pPOP3Cfg->iBadLoginWait = iBadLoginWait; ShbUnlock(hShbPOP3); if (iDisable) return 0; /* Remove POP3 lock files */ UsrClearPop3LocksDir(); if (MscCreateServerSockets(ThCfgPOP3.iNumAddr, ThCfgPOP3.SvrAddr, iFamily, iPort, POP3_LISTEN_SIZE, ThCfgPOP3.SockFDs, ThCfgPOP3.iNumSockFDs) < 0) { ShbCloseBlock(hShbPOP3); return ErrGetErrorCode(); } ThCfgPOP3.hThShb = hShbPOP3; if ((hPOP3Thread = SysCreateThread(MscServiceThread, &ThCfgPOP3)) == SYS_INVALID_THREAD) { ErrorPush(); ShbCloseBlock(hShbPOP3); for (; ThCfgPOP3.iNumSockFDs > 0; ThCfgPOP3.iNumSockFDs--) SysCloseSocket(ThCfgPOP3.SockFDs[ThCfgPOP3.iNumSockFDs - 1]); return ErrorPop(); } /* * Register the shutdown function. */ SvrAddShutdown(SvrShutdown__ThreadConfig, &ThCfgPOP3); return 0; } static int SvrSetupPOP3S(int iArgCount, char *pszArgs[]) { int iPort = STD_POP3S_PORT, iFamily = AF_INET; /* * Initialize the service thread handle to SYS_INVALID_THREAD so that * we can detect the service being disabled in the cleanup function. */ hPOP3SThread = SYS_INVALID_THREAD; ZeroData(ThCfgPOP3S); ThCfgPOP3S.pszName = POP3S_SERVER_NAME; ThCfgPOP3S.pfThreadProc = POP3ClientThread; ThCfgPOP3S.pfThreadCnt = SvrThreadCntPOP3; ThCfgPOP3S.ulFlags = THCF_USE_SSL; ThCfgPOP3S.hThShb = hShbPOP3; for (int i = 0; i < iArgCount; i++) { if (pszArgs[i][0] != '-' || pszArgs[i][1] != 'B') continue; switch (pszArgs[i][2]) { case 'p': if (++i < iArgCount) iPort = atoi(pszArgs[i]); break; case 'I': if (++i < iArgCount && SvrAddServerAddress(pszArgs[i], ThCfgPOP3S.SvrAddr, &ThCfgPOP3S.iNumAddr, CountOf(ThCfgPOP3S.SvrAddr)) < 0) return ErrGetErrorCode(); break; case '-': return 0; case '6': iFamily = AF_INET6; break; } } if (MscCreateServerSockets(ThCfgPOP3S.iNumAddr, ThCfgPOP3S.SvrAddr, iFamily, iPort, POP3_LISTEN_SIZE, ThCfgPOP3S.SockFDs, ThCfgPOP3S.iNumSockFDs) < 0) return ErrGetErrorCode(); if ((hPOP3SThread = SysCreateThread(MscServiceThread, &ThCfgPOP3S)) == SYS_INVALID_THREAD) { ErrorPush(); for (; ThCfgPOP3S.iNumSockFDs > 0; ThCfgPOP3S.iNumSockFDs--) SysCloseSocket(ThCfgPOP3S.SockFDs[ThCfgPOP3S.iNumSockFDs - 1]); return ErrorPop(); } /* * Register the shutdown function. */ SvrAddShutdown(SvrShutdown__ThreadConfig, &ThCfgPOP3S); return 0; } static void SvrCleanupPOP3S(void) { if (hPOP3SThread != SYS_INVALID_THREAD) { SysWaitThread(hPOP3SThread, SVR_EXIT_WAIT); SysCloseThread(hPOP3SThread, 1); } for (; ThCfgPOP3S.iNumSockFDs > 0; ThCfgPOP3S.iNumSockFDs--) SysCloseSocket(ThCfgPOP3S.SockFDs[ThCfgPOP3S.iNumSockFDs - 1]); } static long SvrThreadCntSMTP(ThreadConfig const *pThCfg) { long lThreadCnt = 0; SMTPConfig *pSMTPCfg = (SMTPConfig *) ShbLock(pThCfg->hThShb); if (pSMTPCfg != NULL) { lThreadCnt = pSMTPCfg->lThreadCount; ShbUnlock(pThCfg->hThShb); } return lThreadCnt; } static void SvrCleanupSMTP(void) { if (hSMTPThread != SYS_INVALID_THREAD) { SysWaitThread(hSMTPThread, SVR_EXIT_WAIT); SysCloseThread(hSMTPThread, 1); } ShbCloseBlock(hShbSMTP); for (; ThCfgSMTP.iNumSockFDs > 0; ThCfgSMTP.iNumSockFDs--) SysCloseSocket(ThCfgSMTP.SockFDs[ThCfgSMTP.iNumSockFDs - 1]); } static int SvrSetupSMTP(int iArgCount, char *pszArgs[]) { int iPort = STD_SMTP_PORT, iDisable = 0, iFamily = AF_INET; int iSessionTimeout = STD_SERVER_SESSION_TIMEOUT; int iMaxRcpts = STD_SMTP_MAX_RCPTS; unsigned int uPopAuthExpireTime = STD_POP3AUTH_EXPIRE_TIME; long lMaxThreads = MAX_SMTP_THREADS; unsigned long ulFlags = 0; /* * Initialize the service thread handle to SYS_INVALID_THREAD so that * we can detect the service being disabled in the cleanup function. */ hSMTPThread = SYS_INVALID_THREAD; ZeroData(ThCfgSMTP); ThCfgSMTP.pszName = SMTP_SERVER_NAME; ThCfgSMTP.pfThreadProc = SMTPClientThread; ThCfgSMTP.pfThreadCnt = SvrThreadCntSMTP; for (int i = 0; i < iArgCount; i++) { if (pszArgs[i][0] != '-' || pszArgs[i][1] != 'S') continue; switch (pszArgs[i][2]) { case 'p': if (++i < iArgCount) iPort = atoi(pszArgs[i]); break; case 't': if (++i < iArgCount) iSessionTimeout = atoi(pszArgs[i]) * 1000; break; case 'l': ulFlags |= SMTPF_LOG_ENABLED; break; case 'I': if (++i < iArgCount && SvrAddServerAddress(pszArgs[i], ThCfgSMTP.SvrAddr, &ThCfgSMTP.iNumAddr, CountOf(ThCfgSMTP.SvrAddr)) < 0) return ErrGetErrorCode(); break; case 'X': if (++i < iArgCount) lMaxThreads = atol(pszArgs[i]); break; case 'r': if (++i < iArgCount) iMaxRcpts = atoi(pszArgs[i]); break; case 'e': if (++i < iArgCount) uPopAuthExpireTime = (unsigned int) atol(pszArgs[i]); break; case '-': iDisable++; break; case '6': iFamily = AF_INET6; break; } } if ((hShbSMTP = ShbCreateBlock(sizeof(SMTPConfig))) == SHB_INVALID_HANDLE) return ErrGetErrorCode(); SMTPConfig *pSMTPCfg = (SMTPConfig *) ShbLock(hShbSMTP); if (pSMTPCfg == NULL) { ShbCloseBlock(hShbSMTP); return ErrGetErrorCode(); } pSMTPCfg->ulFlags = ulFlags; pSMTPCfg->lThreadCount = 0; pSMTPCfg->lMaxThreads = lMaxThreads; pSMTPCfg->iSessionTimeout = iSessionTimeout; pSMTPCfg->iTimeout = STD_SERVER_TIMEOUT; pSMTPCfg->iMaxRcpts = iMaxRcpts; pSMTPCfg->uPopAuthExpireTime = uPopAuthExpireTime; ShbUnlock(hShbSMTP); if (iDisable) return 0; if (MscCreateServerSockets(ThCfgSMTP.iNumAddr, ThCfgSMTP.SvrAddr, iFamily, iPort, SMTP_LISTEN_SIZE, ThCfgSMTP.SockFDs, ThCfgSMTP.iNumSockFDs) < 0) { ShbCloseBlock(hShbSMTP); return ErrGetErrorCode(); } ThCfgSMTP.hThShb = hShbSMTP; if ((hSMTPThread = SysCreateThread(MscServiceThread, &ThCfgSMTP)) == SYS_INVALID_THREAD) { ErrorPush(); ShbCloseBlock(hShbSMTP); for (; ThCfgSMTP.iNumSockFDs > 0; ThCfgSMTP.iNumSockFDs--) SysCloseSocket(ThCfgSMTP.SockFDs[ThCfgSMTP.iNumSockFDs - 1]); return ErrorPop(); } /* * Register the shutdown function. */ SvrAddShutdown(SvrShutdown__ThreadConfig, &ThCfgSMTP); return 0; } static int SvrSetupSMTPS(int iArgCount, char *pszArgs[]) { int iPort = STD_SMTPS_PORT, iFamily = AF_INET; /* * Initialize the service thread handle to SYS_INVALID_THREAD so that * we can detect the service being disabled in the cleanup function. */ hSMTPSThread = SYS_INVALID_THREAD; ZeroData(ThCfgSMTPS); ThCfgSMTPS.pszName = SMTPS_SERVER_NAME; ThCfgSMTPS.pfThreadProc = SMTPClientThread; ThCfgSMTPS.pfThreadCnt = SvrThreadCntSMTP; ThCfgSMTPS.ulFlags = THCF_USE_SSL; ThCfgSMTPS.hThShb = hShbSMTP; for (int i = 0; i < iArgCount; i++) { if (pszArgs[i][0] != '-' || pszArgs[i][1] != 'X') continue; switch (pszArgs[i][2]) { case 'p': if (++i < iArgCount) iPort = atoi(pszArgs[i]); break; case 'I': if (++i < iArgCount && SvrAddServerAddress(pszArgs[i], ThCfgSMTPS.SvrAddr, &ThCfgSMTPS.iNumAddr, CountOf(ThCfgSMTPS.SvrAddr)) < 0) return ErrGetErrorCode(); break; case '-': return 0; case '6': iFamily = AF_INET6; break; } } if (MscCreateServerSockets(ThCfgSMTPS.iNumAddr, ThCfgSMTPS.SvrAddr, iFamily, iPort, SMTP_LISTEN_SIZE, ThCfgSMTPS.SockFDs, ThCfgSMTPS.iNumSockFDs) < 0) return ErrGetErrorCode(); if ((hSMTPSThread = SysCreateThread(MscServiceThread, &ThCfgSMTPS)) == SYS_INVALID_THREAD) { ErrorPush(); for (; ThCfgSMTPS.iNumSockFDs > 0; ThCfgSMTPS.iNumSockFDs--) SysCloseSocket(ThCfgSMTPS.SockFDs[ThCfgSMTPS.iNumSockFDs - 1]); return ErrorPop(); } /* * Register the shutdown function. */ SvrAddShutdown(SvrShutdown__ThreadConfig, &ThCfgSMTPS); return 0; } static void SvrCleanupSMTPS(void) { if (hSMTPSThread != SYS_INVALID_THREAD) { SysWaitThread(hSMTPSThread, SVR_EXIT_WAIT); SysCloseThread(hSMTPSThread, 1); } for (; ThCfgSMTPS.iNumSockFDs > 0; ThCfgSMTPS.iNumSockFDs--) SysCloseSocket(ThCfgSMTPS.SockFDs[ThCfgSMTPS.iNumSockFDs - 1]); } static void SvrShutdown__SMAIL(void *pPrivate) { SHB_HANDLE hShb = (SHB_HANDLE) pPrivate; SMAILConfig *pSMAILCfg = (SMAILConfig *) ShbLock(hShb); pSMAILCfg->ulFlags |= SMAILF_STOP_SERVER; ShbUnlock(hShb); } static int SvrSetupSMAIL(int iArgCount, char *pszArgs[]) { int i; int iRetryTimeout = STD_SMAIL_RETRY_TIMEOUT; int iRetryIncrRatio = STD_SMAIL_RETRY_INCR_RATIO; int iMaxRetry = STD_SMAIL_MAX_RETRY; unsigned long ulFlags = 0; iNumSMAILThreads = STD_SMAIL_THREADS; for (i = 0; i < iArgCount; i++) { if (pszArgs[i][0] != '-' || pszArgs[i][1] != 'Q') continue; switch (pszArgs[i][2]) { case 'n': if (++i < iArgCount) iNumSMAILThreads = atoi(pszArgs[i]); iNumSMAILThreads = Min(MAX_SMAIL_THREADS, Max(1, iNumSMAILThreads)); break; case 't': if (++i < iArgCount) iRetryTimeout = atoi(pszArgs[i]); break; case 'i': if (++i < iArgCount) iRetryIncrRatio = atoi(pszArgs[i]); break; case 'r': if (++i < iArgCount) iMaxRetry = atoi(pszArgs[i]); break; case 'l': ulFlags |= SMAILF_LOG_ENABLED; break; case 'T': if (++i < iArgCount) iFilterTimeout = atoi(pszArgs[i]) * 1000; break; case 'g': bFilterLogEnabled = true; break; } } if ((hShbSMAIL = ShbCreateBlock(sizeof(SMAILConfig))) == SHB_INVALID_HANDLE) return ErrGetErrorCode(); SMAILConfig *pSMAILCfg = (SMAILConfig *) ShbLock(hShbSMAIL); if (pSMAILCfg == NULL) { ErrorPush(); ShbCloseBlock(hShbSMAIL); return ErrorPop(); } pSMAILCfg->ulFlags = ulFlags; pSMAILCfg->lThreadCount = 0; ShbUnlock(hShbSMAIL); /* Initialize queue fs */ char szSpoolDir[SYS_MAX_PATH]; SvrGetSpoolDir(szSpoolDir, sizeof(szSpoolDir)); if ((hSpoolQueue = QueOpen(szSpoolDir, iMaxRetry, iRetryTimeout, iRetryIncrRatio, iQueueSplitLevel)) == INVALID_QUEUE_HANDLE) { ErrorPush(); ShbCloseBlock(hShbSMAIL); return ErrorPop(); } /* Create mailer threads */ for (i = 0; i < iNumSMAILThreads; i++) hSMAILThreads[i] = SysCreateThread(SMAILThreadProc, NULL); /* * Register the shutdown function. */ SvrAddShutdown(SvrShutdown__SMAIL, (void *) hShbSMAIL); return 0; } static void SvrCleanupSMAIL(void) { int i; for (i = 0; i < iNumSMAILThreads; i++) SysWaitThread(hSMAILThreads[i], SVR_EXIT_WAIT); for (i = 0; i < iNumSMAILThreads; i++) SysCloseThread(hSMAILThreads[i], 1); ShbCloseBlock(hShbSMAIL); QueClose(hSpoolQueue); } static void SvrShutdown__PSYNC(void *pPrivate) { SHB_HANDLE hShb = (SHB_HANDLE) pPrivate; PSYNCConfig *pPSYNCCfg = (PSYNCConfig *) ShbLock(hShb); pPSYNCCfg->ulFlags |= PSYNCF_STOP_SERVER; ShbUnlock(hShb); } static int SvrSetupPSYNC(int iArgCount, char *pszArgs[]) { int iSyncInterval = STD_PSYNC_INTERVAL, iDisable = 0; int iNumSyncThreads = STD_PSYNC_NUM_THREADS; unsigned long ulFlags = 0; /* * Initialize the service thread handle to SYS_INVALID_THREAD so that * we can detect the service being disabled in the cleanup function. */ hPSYNCThread = SYS_INVALID_THREAD; for (int i = 0; i < iArgCount; i++) { if (pszArgs[i][0] != '-' || pszArgs[i][1] != 'Y') continue; switch (pszArgs[i][2]) { case 'i': if (++i < iArgCount) iSyncInterval = atoi(pszArgs[i]); break; case 't': if (++i < iArgCount) iNumSyncThreads = atoi(pszArgs[i]); iNumSyncThreads = Min(MAX_PSYNC_NUM_THREADS, Max(1, iNumSyncThreads)); break; case 'l': ulFlags |= PSYNCF_LOG_ENABLED; break; case 'T': if (++i < iArgCount) iPOP3ClientTimeout = atoi(pszArgs[i]) * 1000; break; case '-': iDisable++; break; } } if ((hSyncSem = SysCreateSemaphore(iNumSyncThreads, SYS_DEFAULT_MAXCOUNT)) == SYS_INVALID_SEMAPHORE) return ErrGetErrorCode(); if ((hShbPSYNC = ShbCreateBlock(sizeof(PSYNCConfig))) == SHB_INVALID_HANDLE) { ErrorPush(); SysCloseSemaphore(hSyncSem); return ErrorPop(); } PSYNCConfig *pPSYNCCfg = (PSYNCConfig *) ShbLock(hShbPSYNC); if (pPSYNCCfg == NULL) { ErrorPush(); ShbCloseBlock(hShbPSYNC); SysCloseSemaphore(hSyncSem); return ErrorPop(); } pPSYNCCfg->ulFlags = ulFlags; pPSYNCCfg->lThreadCount = 0; pPSYNCCfg->iTimeout = STD_SERVER_TIMEOUT; pPSYNCCfg->iSyncInterval = iSyncInterval; pPSYNCCfg->iNumSyncThreads = iNumSyncThreads; ShbUnlock(hShbPSYNC); if (iDisable) return 0; /* Remove POP3 links lock files */ GwLkClearLinkLocksDir(); if ((hPSYNCThread = SysCreateThread(PSYNCThreadProc, NULL)) == SYS_INVALID_THREAD) { ShbCloseBlock(hShbPSYNC); SysCloseSemaphore(hSyncSem); return ErrGetErrorCode(); } /* * Register the shutdown function. */ SvrAddShutdown(SvrShutdown__PSYNC, (void *) hShbPSYNC); return 0; } static void SvrCleanupPSYNC(void) { if (hPSYNCThread != SYS_INVALID_THREAD) { SysWaitThread(hPSYNCThread, SVR_EXIT_WAIT); SysCloseThread(hPSYNCThread, 1); } ShbCloseBlock(hShbPSYNC); SysCloseSemaphore(hSyncSem); } static void SvrShutdown__LMAIL(void *pPrivate) { SHB_HANDLE hShb = (SHB_HANDLE) pPrivate; LMAILConfig *pLMAILCfg = (LMAILConfig *) ShbLock(hShb); pLMAILCfg->ulFlags |= LMAILF_STOP_SERVER; ShbUnlock(hShb); } static int SvrSetupLMAIL(int iArgCount, char *pszArgs[]) { int i; int iSleepTimeout = STD_LMAILTHREAD_SLEEP_TIME; unsigned long ulFlags = 0; iNumLMAILThreads = STD_LMAIL_THREADS; for (i = 0; i < iArgCount; i++) { if (pszArgs[i][0] != '-' || pszArgs[i][1] != 'L') continue; switch (pszArgs[i][2]) { case 'n': if (++i < iArgCount) iNumLMAILThreads = atoi(pszArgs[i]); iNumLMAILThreads = Min(MAX_LMAIL_THREADS, Max(1, iNumLMAILThreads)); break; case 'l': ulFlags |= LMAILF_LOG_ENABLED; break; case 't': if (++i < iArgCount) iSleepTimeout = atoi(pszArgs[i]); break; } } if ((hShbLMAIL = ShbCreateBlock(sizeof(LMAILConfig))) == SHB_INVALID_HANDLE) return ErrGetErrorCode(); LMAILConfig *pLMAILCfg = (LMAILConfig *) ShbLock(hShbLMAIL); if (pLMAILCfg == NULL) { ErrorPush(); ShbCloseBlock(hShbLMAIL); return ErrorPop(); } pLMAILCfg->ulFlags = ulFlags; pLMAILCfg->iSleepTimeout = iSleepTimeout; pLMAILCfg->lNumThreads = iNumLMAILThreads; pLMAILCfg->lThreadCount = 0; ShbUnlock(hShbLMAIL); /* Create mailer threads */ for (i = 0; i < iNumLMAILThreads; i++) hLMAILThreads[i] = SysCreateThread(LMAILThreadProc, NULL); /* * Register the shutdown function. */ SvrAddShutdown(SvrShutdown__LMAIL, (void *) hShbLMAIL); return 0; } static void SvrCleanupLMAIL(void) { int i; for (i = 0; i < iNumLMAILThreads; i++) SysWaitThread(hLMAILThreads[i], SVR_EXIT_WAIT); for (i = 0; i < iNumLMAILThreads; i++) SysCloseThread(hLMAILThreads[i], 1); ShbCloseBlock(hShbLMAIL); } static int SvrSetup(int iArgCount, char *pszArgs[]) { char *pszValue; StrSNCpy(szMailPath, SYS_BASE_FS_STR); if ((pszValue = SysGetEnv(ENV_MAIN_PATH)) != NULL) { if (strncmp(szMailPath, pszValue, strlen(szMailPath)) == 0) StrSNCpy(szMailPath, pszValue); else StrSNCat(szMailPath, pszValue); DelFinalSlash(szMailPath); SysFree(pszValue); } iNumShCtxs = 0; bServerDebug = false; int iSndBufSize = -1, iRcvBufSize = -1; int iDnsCacheDirs = DNS_HASH_NUM_DIRS; for (int i = 0; i < iArgCount; i++) { if (pszArgs[i][0] != '-' || pszArgs[i][1] != 'M') continue; switch (pszArgs[i][2]) { case 's': if (++i < iArgCount) { StrSNCpy(szMailPath, pszArgs[i]); DelFinalSlash(szMailPath); } break; case 'd': bServerDebug = true; break; case 'r': if (++i < iArgCount) iLogRotateHours = atoi(pszArgs[i]); break; case 'x': if (++i < iArgCount) { iQueueSplitLevel = atoi(pszArgs[i]); while (!IsPrimeNumber(iQueueSplitLevel)) ++iQueueSplitLevel; } break; case 'R': if (++i < iArgCount) { iRcvBufSize = atoi(pszArgs[i]); iRcvBufSize = NbrCeil(iRcvBufSize, 1024); } break; case 'S': if (++i < iArgCount) { iSndBufSize = atoi(pszArgs[i]); iSndBufSize = NbrCeil(iSndBufSize, 1024); } break; case 'M': iMailboxType = XMAIL_MAILDIR; break; case 'm': iMailboxType = XMAIL_MAILBOX; break; case 'D': if (++i < iArgCount) iDnsCacheDirs = atoi(pszArgs[i]); break; case '4': iAddrFamily = AF_INET; break; case '6': iAddrFamily = AF_INET6; break; case '5': iAddrFamily = SYS_INET46; break; case '7': iAddrFamily = SYS_INET64; break; } } if (strlen(szMailPath) == 0 || !SysExistDir(szMailPath)) { ErrSetErrorCode(ERR_CONF_PATH); return ERR_CONF_PATH; } AppendSlash(szMailPath); /* Setup library socket buffers */ SysSetupSocketBuffers((iSndBufSize > 0) ? &iSndBufSize: NULL, (iRcvBufSize > 0) ? &iRcvBufSize: NULL); /* Setup shutdown file name ( must be called before any shutdown function ) */ sprintf(szShutdownFile, "%s%s", szMailPath, SVR_SHUTDOWN_FILE); /* Setup resource lockers */ if (RLckInitLockers() < 0) return ErrGetErrorCode(); /* Clear shutdown condition */ SvrShutdownCleanup(); /* Align table indexes */ if (UsrCheckUsersIndexes() < 0 || UsrCheckAliasesIndexes() < 0 || ExAlCheckAliasIndexes() < 0 || MDomCheckDomainsIndexes() < 0 || ADomCheckDomainsIndexes() < 0) { ErrorPush(); RLckCleanupLockers(); return ErrorPop(); } /* Initialize DNS cache */ if (CDNS_Initialize(iDnsCacheDirs) < 0 || BSslInit() < 0) { ErrorPush(); RLckCleanupLockers(); return ErrorPop(); } return 0; } static void SvrCleanup(void) { BSslCleanup(); RLckCleanupLockers(); SvrShutdownCleanup(); } static void SvrBreakHandler(void) { SvrSetShutdown(); } static char **SvrMergeArgs(int iArgs, char *pszArgs[], int &iArgsCount) { int i, j, iCmdArgs = 0; char **ppszCmdArgs = NULL, **ppszMergeArgs; char *pszCmdLine = SysGetEnv(ENV_CMD_LINE); if (pszCmdLine != NULL) { ppszCmdArgs = StrGetArgs(pszCmdLine, iCmdArgs); SysFree(pszCmdLine); } if ((ppszMergeArgs = (char **) SysAlloc((iCmdArgs + iArgs + 1) * sizeof(char *))) == NULL) { StrFreeStrings(ppszCmdArgs); return NULL; } for (i = iArgsCount = 0; i < iArgs; i++, iArgsCount++) ppszMergeArgs[iArgsCount] = SysStrDup(pszArgs[i]); for (j = 0; j < iCmdArgs; j++, iArgsCount++) ppszMergeArgs[iArgsCount] = SysStrDup(ppszCmdArgs[j]); ppszMergeArgs[iArgsCount] = NULL; StrFreeStrings(ppszCmdArgs); return ppszMergeArgs; } int SvrMain(int iArgCount, char *pszArgs[]) { int iError = -1; int iSvcI[SVC_MAX]; if (SysInitLibrary() < 0) { ErrorPush(); SysEventLog(LOG_LEV_ERROR, "%s\n", ErrGetErrorString()); return ErrorPop(); } int iMergeArgsCount = 0; char **ppszMergeArgs = SvrMergeArgs(iArgCount, pszArgs, iMergeArgsCount); if (ppszMergeArgs == NULL) { ErrorPush(); SysLogMessage(LOG_LEV_ERROR, "%s\n", ErrGetErrorString()); SysCleanupLibrary(); return ErrorPop(); } if (SvrSetup(iMergeArgsCount, ppszMergeArgs) < 0) { ErrorPush(); SysLogMessage(LOG_LEV_ERROR, "%s\n", ErrGetErrorString()); StrFreeStrings(ppszMergeArgs); SysCleanupLibrary(); return ErrorPop(); } ArrayInit(iSvcI, -1); if ((iSvcI[SVC_SMAIL] = SvrSetupSMAIL(iMergeArgsCount, ppszMergeArgs)) < 0 || (iSvcI[SVC_CTRL] = SvrSetupCTRL(iMergeArgsCount, ppszMergeArgs)) < 0 || (iSvcI[SVC_CTRLS] = SvrSetupCTRLS(iMergeArgsCount, ppszMergeArgs)) < 0 || (iSvcI[SVC_POP3] = SvrSetupPOP3(iMergeArgsCount, ppszMergeArgs)) < 0 || (iSvcI[SVC_POP3S] = SvrSetupPOP3S(iMergeArgsCount, ppszMergeArgs)) < 0 || (iSvcI[SVC_SMTP] = SvrSetupSMTP(iMergeArgsCount, ppszMergeArgs)) < 0 || (iSvcI[SVC_SMTPS] = SvrSetupSMTPS(iMergeArgsCount, ppszMergeArgs)) < 0 || (iSvcI[SVC_PSYNC] = SvrSetupPSYNC(iMergeArgsCount, ppszMergeArgs)) < 0 || (iSvcI[SVC_FING] = SvrSetupFING(iMergeArgsCount, ppszMergeArgs)) < 0 || (iSvcI[SVC_LMAIL] = SvrSetupLMAIL(iMergeArgsCount, ppszMergeArgs)) < 0) { StrFreeStrings(ppszMergeArgs); goto ErrorExit; } StrFreeStrings(ppszMergeArgs); /* Set stop handler */ SysSetBreakHandler(SvrBreakHandler); SysLogMessage(LOG_LEV_MESSAGE, APP_NAME_VERSION_STR " server started\n"); /* Server main loop */ for (; !SvrInShutdown(true);) { SysSleep(SERVER_SLEEP_TIMESLICE); } iError = 0; ErrorExit: if (iError < 0) { iError = ErrGetErrorCode(); SysLogMessage(LOG_LEV_ERROR, "%s\n", ErrGetErrorString()); } /* Runs shutdown functions */ SvrDoShutdown(); /* Goodbye cleanups */ if (iSvcI[SVC_LMAIL] == 0) SvrCleanupLMAIL(); if (iSvcI[SVC_FING] == 0) SvrCleanupFING(); if (iSvcI[SVC_PSYNC] == 0) SvrCleanupPSYNC(); if (iSvcI[SVC_SMTPS] == 0) SvrCleanupSMTPS(); if (iSvcI[SVC_SMTP] == 0) SvrCleanupSMTP(); if (iSvcI[SVC_POP3S] == 0) SvrCleanupPOP3S(); if (iSvcI[SVC_POP3] == 0) SvrCleanupPOP3(); if (iSvcI[SVC_CTRLS] == 0) SvrCleanupCTRLS(); if (iSvcI[SVC_CTRL] == 0) SvrCleanupCTRL(); if (iSvcI[SVC_SMAIL] == 0) SvrCleanupSMAIL(); SvrCleanup(); SysLogMessage(LOG_LEV_MESSAGE, APP_NAME_VERSION_STR " server stopped\n"); SysCleanupLibrary(); return iError; } int SvrStopServer(bool bWait) { /* Set shutdown condition */ SvrSetShutdown(); if (bWait) { int iWaitTime = 0; for (; SvrInShutdown(true); iWaitTime += SERVER_SLEEP_TIMESLICE) SysSleep(SERVER_SLEEP_TIMESLICE); } return 0; } bool SvrInShutdown(bool bForceCheck) { time_t tNow = time(NULL); static time_t tLastCheck = 0; static bool bShutdown = false; if (bForceCheck || tNow > (tLastCheck + SHUTDOWN_CHECK_TIME)) { tLastCheck = tNow; if (bServerShutdown) bShutdown = true; else if (SysExistFile(szShutdownFile)) { bServerShutdown = true; SysShutdownLibrary(); bShutdown = true; } else bShutdown = false; } return bShutdown; } xmail-1.27/StrUtils.cpp0000644000175000017500000004144411341640430014327 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "StrUtils.h" #define INVCHAR '^' #define LoChar(c) ((((c) >= 'A') && ((c) <= 'Z')) ? ((c) - 'A' + 'a'): (c)) #define MIN_DYNSTR_INCR 256 void *StrMemDup(void const *pData, long lSize, long lExtra) { void *pDData; if (lSize < 0) lSize = strlen((char const *) pData) + 1; if ((pDData = SysAllocNZ(lSize + lExtra)) == NULL) return NULL; memcpy(pDData, pData, lSize); memset((char *) pDData + lSize, 0, lExtra); return pDData; } int StrCmdLineToken(char const *&pszCmdLine, char *pszToken) { char const *pszCurr = pszCmdLine; for (; (*pszCurr == ' ') || (*pszCurr == '\t'); pszCurr++); if (*pszCurr == '\0') return ERR_NO_MORE_TOKENS; if (*pszCurr == '"') { ++pszCurr; for (; *pszCurr != '\0';) { if (*pszCurr == '"') { ++pszCurr; if (*pszCurr != '"') break; *pszToken++ = *pszCurr++; } else *pszToken++ = *pszCurr++; } *pszToken = '\0'; } else { for (; (*pszCurr != ' ') && (*pszCurr != '\t') && (*pszCurr != '\0');) *pszToken++ = *pszCurr++; *pszToken = '\0'; } pszCmdLine = pszCurr; return 0; } char **StrGetArgs(char const *pszCmdLine, int &iArgsCount) { char const *pszCLine = pszCmdLine; char szToken[1024] = ""; for (iArgsCount = 0; StrCmdLineToken(pszCLine, szToken) == 0; iArgsCount++); char **ppszArgs = (char **) SysAlloc((iArgsCount + 1) * sizeof(char *)); if (ppszArgs == NULL) return NULL; int i = 0; for (pszCLine = pszCmdLine; (i < iArgsCount) && (StrCmdLineToken(pszCLine, szToken) == 0); i++) ppszArgs[i] = SysStrDup(szToken); ppszArgs[i] = NULL; return ppszArgs; } char *StrLower(char *pszString) { char *pszCurr = pszString; for (; *pszCurr != '\0'; pszCurr++) if ((*pszCurr >= 'A') && (*pszCurr <= 'Z')) *pszCurr = 'a' + (*pszCurr - 'A'); return pszString; } char *StrUpper(char *pszString) { char *pszCurr = pszString; for (; *pszCurr != '\0'; pszCurr++) if ((*pszCurr >= 'a') && (*pszCurr <= 'z')) *pszCurr = 'A' + (*pszCurr - 'a'); return pszString; } char *StrCrypt(char const *pszString, char *pszCrypt) { SetEmptyString(pszCrypt); for (int i = 0; pszString[i] != '\0'; i++) { unsigned int uChar = (unsigned int) pszString[i]; char szByte[32] = ""; sprintf(szByte, "%02x", (uChar ^ 101) & 0xff); strcat(pszCrypt, szByte); } return pszCrypt; } char *StrDeCrypt(char const *pszString, char *pszDeCrypt) { int iStrLength = strlen(pszString); SetEmptyString(pszDeCrypt); if ((iStrLength % 2) != 0) return NULL; int i; for (i = 0; i < iStrLength; i += 2) { char szByte[8] = ""; szByte[0] = pszString[i]; szByte[1] = pszString[i + 1]; szByte[2] = '\0'; unsigned int uChar = 0; if (sscanf(szByte, "%x", &uChar) != 1) return NULL; pszDeCrypt[i >> 1] = (char) ((uChar ^ 101) & 0xff); } pszDeCrypt[i >> 1] = '\0'; return pszDeCrypt; } char **StrBuildList(char const *pszString, ...) { int iNumString = 1; char const *pszArg = NULL; va_list Args; va_start(Args, pszString); while ((pszArg = va_arg(Args, char *)) != NULL) ++iNumString; va_end(Args); int iStrCurr = 0; char **ppszStrings = (char **) SysAlloc((iNumString + 1) * sizeof(char *)); if (ppszStrings == NULL) return NULL; ppszStrings[iStrCurr++] = SysStrDup(pszString); va_start(Args, pszString); while ((pszArg = va_arg(Args, char *)) != NULL) ppszStrings[iStrCurr++] = SysStrDup(pszArg); va_end(Args); ppszStrings[iStrCurr] = NULL; return ppszStrings; } char **StrTokenize(const char *pszString, const char *pszTokenizer) { char *pszBuffer = SysStrDup(pszString); if (pszBuffer == NULL) return NULL; int iTokenCount = 0; char *pszToken = NULL; char *pszSavePtr = NULL; pszToken = SysStrTok(pszBuffer, pszTokenizer, &pszSavePtr); while (pszToken != NULL) { ++iTokenCount; pszToken = SysStrTok(NULL, pszTokenizer, &pszSavePtr); } char **ppszTokens = (char **) SysAlloc((iTokenCount + 1) * sizeof(char *)); if (ppszTokens == NULL) { SysFree(pszBuffer); return NULL; } strcpy(pszBuffer, pszString); iTokenCount = 0; pszToken = SysStrTok(pszBuffer, pszTokenizer, &pszSavePtr); while (pszToken != NULL) { ppszTokens[iTokenCount++] = SysStrDup(pszToken); pszToken = SysStrTok(NULL, pszTokenizer, &pszSavePtr); } ppszTokens[iTokenCount] = NULL; SysFree(pszBuffer); return ppszTokens; } void StrFreeStrings(char **ppszStrings) { if (ppszStrings != NULL) for (int i = 0; ppszStrings[i] != NULL; i++) SysFree(ppszStrings[i]); SysFree(ppszStrings); } int StrStringsCount(char const *const *ppszStrings) { int i; for (i = 0; ppszStrings[i] != NULL; i++); return i; } bool StrStringsMatch(char const *const *ppszStrings, char const *pszMatch) { int i; for (i = 0; ppszStrings[i] != NULL; i++) if (strcmp(ppszStrings[i], pszMatch) == 0) return true; return false; } bool StrStringsIMatch(char const *const *ppszStrings, char const *pszMatch) { int i; for (i = 0; ppszStrings[i] != NULL; i++) if (stricmp(ppszStrings[i], pszMatch) == 0) return true; return false; } bool StrStringsRIWMatch(char const *const *pszMatches, char const *pszString) { int i; for (i = 0; pszMatches[i] != NULL; i++) if (StrIWildMatch(pszString, pszMatches[i])) return true; return false; } char *StrConcat(char const *const *ppszStrings, char const *pszCStr) { int i; int iStrCount = StrStringsCount(ppszStrings); int iCStrLength = strlen(pszCStr); int iSumLength = 0; for (i = 0; i < iStrCount; i++) iSumLength += strlen(ppszStrings[i]) + iCStrLength; char *pszConcat = (char *) SysAlloc(iSumLength + 1); if (pszConcat == NULL) return NULL; SetEmptyString(pszConcat); for (i = 0; i < iStrCount; i++) { if (i > 0) strcat(pszConcat, pszCStr); strcat(pszConcat, ppszStrings[i]); } return pszConcat; } char *StrDeQuote(char *pszString, int iChar) { if (*pszString == iChar) { int i, j; for (i = 1, j = 0; pszString[i] != '\0' && pszString[i] != iChar; i++) { if (pszString[i] == '\\' && pszString[i + 1] == iChar) i++; pszString[j++] = pszString[i]; } pszString[j] = '\0'; } return pszString; } char *StrQuote(const char *pszString, int iChar) { int i, j, iQSize; for (i = iQSize = 0; pszString[i] != '\0'; i++, iQSize++) if (pszString[i] == iChar) iQSize++; char *pszBuffer = (char *) SysAlloc(3 + iQSize); if (pszBuffer == NULL) return NULL; pszBuffer[0] = (char) iChar; for (i = 0, j = 1; pszString[i] != '\0'; i++) { if (pszString[i] == iChar) pszBuffer[j++] = '\\'; pszBuffer[j++] = pszString[i]; } pszBuffer[j++] = (char) iChar; pszBuffer[j] = '\0'; return pszBuffer; } char **StrGetTabLineStrings(const char *pszUsrLine) { char **ppszStrings = StrTokenize(pszUsrLine, "\t"); if (ppszStrings == NULL) return NULL; for (int i = 0; ppszStrings[i] != NULL; i++) StrDeQuote(ppszStrings[i], '"'); return ppszStrings; } int StrWriteCRLFString(FILE *pFile, const char *pszString) { unsigned int uStrLength = strlen(pszString); if (uStrLength != 0 && fwrite(pszString, uStrLength, 1, pFile) == 0) { ErrSetErrorCode(ERR_FILE_WRITE); return ERR_FILE_WRITE; } fputs("\r\n", pFile); return 0; } int StrWildMatch(char const *pszString, char const *pszMatch) { int iPrev; int iMatched; int iReverse; int iEscape; for (; *pszMatch; pszString++, pszMatch++) { switch (*pszMatch) { case ('\\'): if (!*++pszMatch) return 0; default: if (*pszString != *pszMatch) return 0; continue; case ('?'): if (*pszString == '\0') return 0; continue; case ('*'): while (*(++pszMatch) == '*'); if (!*pszMatch) return 1; while (*pszString) if (StrWildMatch(pszString++, pszMatch)) return 1; return 0; case ('['): iEscape = 0; iReverse = (pszMatch[1] == INVCHAR) ? 1 : 0; if (iReverse) pszMatch++; for (iPrev = 256, iMatched = 0; *++pszMatch && (iEscape || (*pszMatch != ']')); iPrev = iEscape ? iPrev : *pszMatch) { if (!iEscape && (iEscape = *pszMatch == '\\')) continue; if (!iEscape && (*pszMatch == '-')) { if (!*++pszMatch) return 0; if (*pszMatch == '\\') if (!*++pszMatch) return 0; iMatched = iMatched || ((*pszString <= *pszMatch) && (*pszString >= iPrev)); } else iMatched = iMatched || (*pszString == *pszMatch); iEscape = 0; } if (iPrev == 256 || iEscape || *pszMatch != ']' || iMatched == iReverse) return 0; continue; } } return (*pszString == '\0') ? 1 : 0; } int StrIWildMatch(char const *pszString, char const *pszMatch) { char *pszLowString = SysStrDup(pszString); if (pszLowString == NULL) return 0; char *pszLowMatch = SysStrDup(pszMatch); if (pszLowMatch == NULL) { SysFree(pszLowString); return 0; } StrLower(pszLowString); StrLower(pszLowMatch); int iMatchResult = StrWildMatch(pszLowString, pszLowMatch); SysFree(pszLowMatch); SysFree(pszLowString); return iMatchResult; } char *StrLoadFile(FILE *pFile) { fseek(pFile, 0, SEEK_END); unsigned int uFileSize = (unsigned int) ftell(pFile); char *pszData = (char *) SysAlloc(uFileSize + 1); if (pszData == NULL) return NULL; fseek(pFile, 0, SEEK_SET); fread(pszData, uFileSize, 1, pFile); pszData[uFileSize] = '\0'; return pszData; } char *StrSprint(char const *pszFormat, ...) { char *pszMessage = NULL; StrVSprint(pszMessage, pszFormat, pszFormat); return pszMessage; } int StrSplitString(char const *pszString, char const *pszSplitters, char *pszStrLeft, int iSizeLeft, char *pszStrRight, int iSizeRight) { char const *pszSplitChar = NULL; for (; (*pszSplitters != '\0') && ((pszSplitChar = strchr(pszString, *pszSplitters)) == NULL); ++pszSplitters); if (pszSplitChar == NULL) { if (pszStrLeft != NULL) StrNCpy(pszStrLeft, pszString, iSizeLeft); if (pszStrRight != NULL) SetEmptyString(pszStrRight); } else { if (pszStrLeft != NULL) { int iUserLength = (int) (pszSplitChar - pszString); StrNCpy(pszStrLeft, pszString, Min(iUserLength + 1, iSizeLeft)); } if (pszStrRight != NULL) StrNCpy(pszStrRight, pszSplitChar + 1, iSizeRight); } return 0; } char *StrLTrim(char *pszString, char const *pszTrimChars) { int i; for (i = 0; (pszString[i] != '\0') && (strchr(pszTrimChars, pszString[i]) != NULL); i++); if (i > 0 && pszString[i] != '\0') { int j; for (j = i; pszString[j] != '\0'; j++) pszString[j - i] = pszString[j]; pszString[j - i] = pszString[j]; } return pszString; } char *StrRTrim(char *pszString, char const *pszTrimChars) { int i = strlen(pszString) - 1; for (; i >= 0 && strchr(pszTrimChars, pszString[i]) != NULL; i--) pszString[i] = '\0'; return pszString; } char *StrTrim(char *pszString, char const *pszTrimChars) { return StrRTrim(StrLTrim(pszString, pszTrimChars), pszTrimChars); } char *StrIStr(char const *pszBuffer, char const *pszMatch) { int iMatchLen = strlen(pszMatch); int iMatchPos = 0; int iLoMatch = LoChar(*pszMatch); if (iMatchLen == 0) return (char *) pszBuffer; /* * The dumb algorithm is fine enough. */ for (; *pszBuffer != '\0'; pszBuffer++) { if (LoChar(*pszBuffer) == iLoMatch) { if (++iMatchPos == iMatchLen) return (char *) pszBuffer - iMatchLen + 1; iLoMatch = LoChar(pszMatch[iMatchPos]); } else if (iMatchPos != 0) { iMatchPos = 0; iLoMatch = LoChar(*pszMatch); } } return NULL; } char *StrLimStr(char const *pszBuffer, char const *pszMatch, char const *pszLimits) { int iMatchLen = strlen(pszMatch); char const *pszPos; for (pszPos = strstr(pszBuffer, pszMatch); pszPos != NULL; pszPos = strstr(pszBuffer, pszMatch)) { if ((pszBuffer == (char const *) pszPos || strchr(pszLimits, *pszPos) != NULL) && (pszPos[iMatchLen] == '\0' || strchr(pszLimits, pszPos[iMatchLen]) != NULL)) return (char *) pszPos; pszBuffer = pszPos + iMatchLen; } return NULL; } char *StrLimIStr(char const *pszBuffer, char const *pszMatch, char const *pszLimits) { int iMatchLen = strlen(pszMatch); char *pszPos; for (pszPos = StrIStr(pszBuffer, pszMatch); pszPos != NULL; pszPos = StrIStr(pszBuffer, pszMatch)) { if ((pszBuffer == (char const *) pszPos || strchr(pszLimits, *pszPos) != NULL) && (pszPos[iMatchLen] == '\0' || strchr(pszLimits, pszPos[iMatchLen]) != NULL)) return pszPos; pszBuffer = pszPos + iMatchLen; } return NULL; } int StrDynInit(DynString *pDS, char const *pszInit) { if (pszInit == NULL) pszInit = ""; int iInitLength = strlen(pszInit); ZeroData(*pDS); pDS->iStringSize = iInitLength; pDS->iBufferSize = Max(2 * iInitLength, MIN_DYNSTR_INCR); if ((pDS->pszBuffer = (char *) SysAlloc(pDS->iBufferSize)) == NULL) return ErrGetErrorCode(); memcpy(pDS->pszBuffer, pszInit, iInitLength); return 0; } int StrDynFree(DynString *pDS) { SysFree(pDS->pszBuffer); return 0; } int StrDynTruncate(DynString *pDS) { pDS->iStringSize = 0; return 0; } char const *StrDynGet(DynString *pDS) { pDS->pszBuffer[pDS->iStringSize] = '\0'; return pDS->pszBuffer; } char *StrDynDrop(DynString *pDS, int *piSize) { char *pszBuffer = pDS->pszBuffer; if (piSize != NULL) *piSize = pDS->iStringSize; pszBuffer[pDS->iStringSize] = '\0'; pDS->pszBuffer = NULL; return pszBuffer; } int StrDynSize(DynString *pDS) { return pDS->iStringSize; } int StrDynAdd(DynString *pDS, char const *pszBuffer, int iStringSize) { if (iStringSize < 0) iStringSize = strlen(pszBuffer); if ((pDS->iStringSize + iStringSize) >= pDS->iBufferSize) { int iNewSize = pDS->iBufferSize + Max(2 * iStringSize, MIN_DYNSTR_INCR); char *pszNewBuffer = (char *) SysAlloc(iNewSize); if (pszNewBuffer == NULL) return ErrGetErrorCode(); memcpy(pszNewBuffer, pDS->pszBuffer, pDS->iStringSize); SysFree(pDS->pszBuffer); pDS->pszBuffer = pszNewBuffer; pDS->iBufferSize = iNewSize; } memcpy(pDS->pszBuffer + pDS->iStringSize, pszBuffer, iStringSize); pDS->iStringSize += iStringSize; return 0; } int StrDynPrint(DynString *pDS, char const *pszFormat, ...) { char *pszMessage = NULL; StrVSprint(pszMessage, pszFormat, pszFormat); if (pszMessage == NULL) return ErrGetErrorCode(); int iAddResult = StrDynAdd(pDS, pszMessage); SysFree(pszMessage); return iAddResult; } char *StrNDup(char const *pszStr, int iSize) { char *pszDupStr = (char *) SysAlloc(iSize + 1); if (pszDupStr != NULL) Cpy2Sz(pszDupStr, pszStr, iSize); return pszDupStr; } int StrParamGet(char const *pszBuffer, char const *pszName, char *pszVal, int iMaxVal) { int iNameLen = strlen(pszName), iParamSize; char const *pszTmp, *pszEnd; for (pszTmp = pszBuffer; (pszTmp = strstr(pszTmp, pszName)) != NULL; pszTmp++) { if ((pszTmp > pszBuffer) && (pszTmp[-1] != ',')) continue; if (pszTmp[iNameLen] != '=') continue; pszTmp += iNameLen + 1; if ((pszEnd = strchr(pszTmp, ',')) == NULL) pszEnd = pszTmp + strlen(pszTmp); iParamSize = (int) (pszEnd - pszTmp); iParamSize = Min(iMaxVal - 1, iParamSize); Cpy2Sz(pszVal, pszTmp, iParamSize); return 1; } return 0; } char *StrMacSubst(char const *pszIn, int *piSize, char *(*pLkupProc)(void *, char const *, int), void *pPriv) { int i, j; char *pszLkup = NULL; char const *pszVarS, *pszVarE; DynString DynS; char szBuf[128]; if (StrDynInit(&DynS, NULL) < 0) return NULL; for (i = j = 0; pszIn[i]; i++) { if (pszIn[i] == '\\' && pszIn[i + 1] == '$') szBuf[j++] = pszIn[++i]; else if (pszIn[i] == '$') { if (pszIn[++i] != '(') goto ErrorExit; pszVarS = pszIn + i + 1; if ((pszVarE = strchr(pszVarS, ')')) == NULL) goto ErrorExit; if (j && StrDynAdd(&DynS, szBuf, j) < 0) goto ErrorExit; j = 0; if ((pszLkup = (*pLkupProc)(pPriv, pszVarS, pszVarE - pszVarS)) == NULL || StrDynAdd(&DynS, pszLkup, -1) < 0) goto ErrorExit; SysFree(pszLkup); pszLkup = NULL; i = pszVarE - pszIn; } else szBuf[j++] = pszIn[i]; if (j == CountOf(szBuf)) { if (StrDynAdd(&DynS, szBuf, j) < 0) goto ErrorExit; j = 0; } } if (j && StrDynAdd(&DynS, szBuf, j) < 0) goto ErrorExit; return StrDynDrop(&DynS, piSize); ErrorExit: SysFree(pszLkup); StrDynFree(&DynS); return NULL; } xmail-1.27/SysInclude.h0000644000175000017500000000303611341640430014260 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SYSINCLUDE_H #define _SYSINCLUDE_H #ifdef HAS_SYSMACHINE #include "SysMachine.h" #endif #ifdef WIN32 #include "SysIncludeWin.h" #else // #ifdef WIN32 #ifdef __LINUX__ #include "SysIncludeLinux.h" #else // #ifdef __LINUX__ #ifdef __SOLARIS__ #include "SysIncludeSolaris.h" #else // #ifdef __SOLARIS__ #ifdef __BSD__ #include "SysIncludeBSD.h" #else // #ifdef __BSD__ #error System type not defined #endif // #ifdef __BSD__ #endif // #ifdef __SOLARIS__ #endif // #ifdef __LINUX__ #endif // #ifdef WIN32 #include "SysTypes.h" #include "SysMacros.h" #include "SysLists.h" #include "Errors.h" #include "CommTypes.h" #endif xmail-1.27/SysTypesBSD.h0000644000175000017500000000173311341640430014334 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SYSTYPESFREEBSD_H #define _SYSTYPESFREEBSD_H #include "SysTypesUnix.h" #endif xmail-1.27/LMAILSvr.cpp0000644000175000017500000003307411341640430014067 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "SList.h" #include "ShBlocks.h" #include "StrUtils.h" #include "BuffSock.h" #include "MiscUtils.h" #include "ResLocks.h" #include "BuffSock.h" #include "MessQueue.h" #include "SvrUtils.h" #include "UsrUtils.h" #include "SMTPUtils.h" #include "SMAILUtils.h" #include "ExtAliases.h" #include "UsrMailList.h" #include "MailConfig.h" #include "LMAILSvr.h" #include "AppDefines.h" #include "MailSvr.h" #define LMAIL_SERVER_NAME "[" APP_NAME_VERSION_STR " LMAIL Server]" #define LOCAL_SPOOL_DIR "local" #define LMAIL_LOG_FILE "lmail" static int LMAILThreadCountAdd(long lCount, SHB_HANDLE hShbLMAIL, LMAILConfig *pLMAILCfg = NULL); static int LMAILLogEnabled(SHB_HANDLE hShbLMAIL, LMAILConfig *pLMAILCfg = NULL); char *LMAILGetSpoolDir(char *pszSpoolPath, int iMaxPath) { SvrGetSpoolDir(pszSpoolPath, iMaxPath); AppendSlash(pszSpoolPath); StrNCat(pszSpoolPath, LOCAL_SPOOL_DIR, iMaxPath); return pszSpoolPath; } static LMAILConfig *LMAILGetConfigCopy(SHB_HANDLE hShbLMAIL) { LMAILConfig *pLMAILCfg = (LMAILConfig *) ShbLock(hShbLMAIL); if (pLMAILCfg == NULL) return NULL; LMAILConfig *pNewLMAILCfg = (LMAILConfig *) SysAlloc(sizeof(LMAILConfig)); if (pNewLMAILCfg != NULL) memcpy(pNewLMAILCfg, pLMAILCfg, sizeof(LMAILConfig)); ShbUnlock(hShbLMAIL); return pNewLMAILCfg; } static int LMAILThreadCountAdd(long lCount, SHB_HANDLE hShbLMAIL, LMAILConfig *pLMAILCfg) { int iDoUnlock = 0; if (pLMAILCfg == NULL) { if ((pLMAILCfg = (LMAILConfig *) ShbLock(hShbLMAIL)) == NULL) return ErrGetErrorCode(); ++iDoUnlock; } pLMAILCfg->lThreadCount += lCount; if (iDoUnlock) ShbUnlock(hShbLMAIL); return 0; } static int LMAILLogEnabled(SHB_HANDLE hShbLMAIL, LMAILConfig *pLMAILCfg) { int iDoUnlock = 0; if (pLMAILCfg == NULL) { if ((pLMAILCfg = (LMAILConfig *) ShbLock(hShbLMAIL)) == NULL) return ErrGetErrorCode(); ++iDoUnlock; } unsigned long ulFlags = pLMAILCfg->ulFlags; if (iDoUnlock) ShbUnlock(hShbLMAIL); return (ulFlags & LMAILF_LOG_ENABLED) ? 1 : 0; } static int LMAILGetFilesSnapShot(LMAILConfig *pLMAILCfg, long lThreadId, char *pszSSFileName, int iMaxSSFileName) { char szSpoolDir[SYS_MAX_PATH]; LMAILGetSpoolDir(szSpoolDir, sizeof(szSpoolDir)); /* Share lock local spool directory */ char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szSpoolDir, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); UsrGetTmpFile(NULL, pszSSFileName, iMaxSSFileName); FILE *pSSFile = fopen(pszSSFileName, "wb"); if (pSSFile == NULL) { ErrorPush(); RLckUnlockSH(hResLock); return ErrorPop(); } int iFileCount = 0; char szSpoolFileName[SYS_MAX_PATH]; FSCAN_HANDLE hFileScan = MscFirstFile(szSpoolDir, 0, szSpoolFileName, sizeof(szSpoolFileName)); if (hFileScan != INVALID_FSCAN_HANDLE) { do { unsigned long ulHashValue = MscHashString(szSpoolFileName, strlen(szSpoolFileName)); if ((ulHashValue % (unsigned long) pLMAILCfg->lNumThreads) == (unsigned long) lThreadId) { fprintf(pSSFile, "%s\r\n", szSpoolFileName); ++iFileCount; } } while (MscNextFile(hFileScan, szSpoolFileName, sizeof(szSpoolFileName))); MscCloseFindFile(hFileScan); } fclose(pSSFile); RLckUnlockSH(hResLock); if (iFileCount == 0) { SysRemove(pszSSFileName); SetEmptyString(pszSSFileName); ErrSetErrorCode(ERR_NO_LOCAL_SPOOL_FILES); return ERR_NO_LOCAL_SPOOL_FILES; } return 0; } static int LMAILRemoveProcessed(LMAILConfig *pLMAILCfg, char const *pszListFileName) { char szSpoolDir[SYS_MAX_PATH]; LMAILGetSpoolDir(szSpoolDir, sizeof(szSpoolDir)); /* Share lock local spool directory */ char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szSpoolDir, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pSSFile = fopen(pszListFileName, "rb"); if (pSSFile == NULL) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } char szSpoolFileName[SYS_MAX_PATH]; while (MscGetString(pSSFile, szSpoolFileName, sizeof(szSpoolFileName) - 1) != NULL) { char szSpoolFilePath[SYS_MAX_PATH]; sprintf(szSpoolFilePath, "%s%s%s", szSpoolDir, SYS_SLASH_STR, szSpoolFileName); CheckRemoveFile(szSpoolFilePath); } fclose(pSSFile); RLckUnlockEX(hResLock); return 0; } static int LMAILLogMessage(char const *pszMailFile, char const *pszSMTPDomain, char const *pszMessageID) { char szTime[256]; MscGetTimeNbrString(szTime, sizeof(szTime) - 1); char szLocalFile[SYS_MAX_PATH]; MscGetFileName(pszMailFile, szLocalFile); RLCK_HANDLE hResLock = RLckLockEX(SVR_LOGS_DIR SYS_SLASH_STR LMAIL_LOG_FILE); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); MscFileLog(LMAIL_LOG_FILE, "\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\n", pszSMTPDomain, szLocalFile, pszMessageID, szTime); RLckUnlockEX(hResLock); return 0; } static int LMAILAddReceived(FILE *pSpoolFile, char const *pszSMTPDomain, char const *pszMailFrom, char const *pszRcptTo, char const *pszTime) { int iError; char szFrom[MAX_SMTP_ADDRESS]; char szRcpt[MAX_SMTP_ADDRESS]; if ((iError = USmlParseAddress(pszMailFrom, NULL, 0, szFrom, sizeof(szFrom) - 1)) < 0 && iError != ERR_EMPTY_ADDRESS) return iError; if (USmlParseAddress(pszRcptTo, NULL, 0, szRcpt, sizeof(szRcpt) - 1) < 0) return ErrGetErrorCode(); /* Add "Received:" tag */ fprintf(pSpoolFile, "Received: from /spool/local\r\n" "\tby %s with %s\r\n" "\tfor <%s> from <%s>;\r\n" "\t%s\r\n", pszSMTPDomain, LMAIL_SERVER_NAME, szRcpt, szFrom, pszTime); return 0; } static int LMAILSubmitLocalFile(LMAILConfig *pLMAILCfg, const char *pszMailFile, long lThreadId, char const *pszSMTPDomain) { FILE *pMailFile = fopen(pszMailFile, "rb"); if (pMailFile == NULL) { ErrSetErrorCode(ERR_FILE_OPEN); return ERR_FILE_OPEN; } /* Get a message ID */ SYS_UINT64 uMessageID; char szMessageID[128]; if (SvrGetMessageID(&uMessageID) < 0) { ErrorPush(); fclose(pMailFile); return ErrorPop(); } sprintf(szMessageID, "L" SYS_LLX_FMT, uMessageID); /* Get current time */ char szTime[256]; MscGetTimeStr(szTime, sizeof(szTime) - 1); /* Log current opeartion */ if (LMAILLogEnabled(SHB_INVALID_HANDLE, pLMAILCfg)) LMAILLogMessage(pszMailFile, pszSMTPDomain, szMessageID); /* Search mail data start */ char szSpoolLine[MAX_SPOOL_LINE]; while (MscGetString(pMailFile, szSpoolLine, sizeof(szSpoolLine) - 1) != NULL) if (IsEmptyString(szSpoolLine)) break; if (feof(pMailFile)) { fclose(pMailFile); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE, pszMailFile); return ERR_INVALID_SPOOL_FILE; } /* Get the offset at which the message data begin and rewind the file */ SYS_OFF_T llMsgOffset = Sys_ftell(pMailFile); rewind(pMailFile); /* Read "MAIL FROM:" (1th row of the smtp-mail file) */ char szMailFrom[MAX_SPOOL_LINE]; if (MscGetString(pMailFile, szMailFrom, sizeof(szMailFrom) - 1) == NULL || StrINComp(szMailFrom, MAIL_FROM_STR) != 0) { fclose(pMailFile); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE, pszMailFile); return ERR_INVALID_SPOOL_FILE; } /* Read "RCPT TO:" (2nd[,...] row(s) of the local-mail file) */ while (MscGetString(pMailFile, szSpoolLine, sizeof(szSpoolLine) - 1) != NULL && !IsEmptyString(szSpoolLine)) { /* Get message handle */ QMSG_HANDLE hMessage = QueCreateMessage(hSpoolQueue); if (hMessage == INVALID_QMSG_HANDLE) { ErrorPush(); fclose(pMailFile); return ErrorPop(); } char szQueueFilePath[SYS_MAX_PATH]; QueGetFilePath(hSpoolQueue, hMessage, szQueueFilePath); FILE *pSpoolFile = fopen(szQueueFilePath, "wb"); if (pSpoolFile == NULL) { QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); fclose(pMailFile); ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } /* Write info line */ USmtpWriteInfoLine(pSpoolFile, LOCAL_ADDRESS_SQB ":0", LOCAL_ADDRESS_SQB ":0", szTime); /* Write SMTP domain */ fprintf(pSpoolFile, "%s\r\n", pszSMTPDomain); /* Write message ID */ fprintf(pSpoolFile, "%s\r\n", szMessageID); /* Write "MAIL FROM:" */ fprintf(pSpoolFile, "%s\r\n", szMailFrom); /* Write "RCPT TO:" */ fprintf(pSpoolFile, "%s\r\n", szSpoolLine); /* Write SPOOL_FILE_DATA_START */ fprintf(pSpoolFile, "%s\r\n", SPOOL_FILE_DATA_START); /* Write "Received:" tag */ LMAILAddReceived(pSpoolFile, pszSMTPDomain, szMailFrom, szSpoolLine, szTime); /* Write mail data, saving and restoring the current file pointer */ SYS_OFF_T llCurrOffset = Sys_ftell(pMailFile); if (MscCopyFile(pSpoolFile, pMailFile, llMsgOffset, (SYS_OFF_T) -1) < 0) { ErrorPush(); fclose(pSpoolFile); QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); fclose(pMailFile); return ErrorPop(); } if (SysFileSync(pSpoolFile) < 0) { ErrorPush(); fclose(pSpoolFile); QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); fclose(pMailFile); return ErrorPop(); } if (fclose(pSpoolFile)) { QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); fclose(pMailFile); ErrSetErrorCode(ERR_FILE_WRITE, szQueueFilePath); return ERR_FILE_WRITE; } Sys_fseek(pMailFile, llCurrOffset, SEEK_SET); /* Transfer file to the spool */ if (QueCommitMessage(hSpoolQueue, hMessage) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); fclose(pMailFile); return ErrorPop(); } } fclose(pMailFile); return 0; } static int LMAILProcessList(LMAILConfig *pLMAILCfg, long lThreadId, char const *pszSSFileName) { char szSpoolDir[SYS_MAX_PATH]; LMAILGetSpoolDir(szSpoolDir, sizeof(szSpoolDir)); /* Retrieve SMTP domain */ SVRCFG_HANDLE hSvrConfig = SvrGetConfigHandle(); if (hSvrConfig == INVALID_SVRCFG_HANDLE) return ErrGetErrorCode(); char szSMTPDomain[MAX_HOST_NAME] = "localdomain"; char *pszDefDomain = SvrGetConfigVar(hSvrConfig, "RootDomain"); if (pszDefDomain != NULL) { StrSNCpy(szSMTPDomain, pszDefDomain); SysFree(pszDefDomain); } SvrReleaseConfigHandle(hSvrConfig); FILE *pSSFile; char szSpoolFileName[SYS_MAX_PATH]; if ((pSSFile = fopen(pszSSFileName, "rb")) == NULL) return ErrGetErrorCode(); while (MscGetString(pSSFile, szSpoolFileName, sizeof(szSpoolFileName) - 1) != NULL) { char szSpoolFilePath[SYS_MAX_PATH]; sprintf(szSpoolFilePath, "%s%s%s", szSpoolDir, SYS_SLASH_STR, szSpoolFileName); if (LMAILSubmitLocalFile(pLMAILCfg, szSpoolFilePath, lThreadId, szSMTPDomain) < 0) { SysLogMessage(LOG_LEV_ERROR, "LMAIL [%02ld] error (\"%s\"): %s\n", lThreadId, ErrGetErrorString(), szSpoolFilePath); } else { SysLogMessage(LOG_LEV_MESSAGE, "LMAIL [%02ld] file processed: %s\n", lThreadId, szSpoolFilePath); } } fclose(pSSFile); return 0; } static int LMAILProcessLocalSpool(SHB_HANDLE hShbLMAIL, long lThreadId) { LMAILConfig *pLMAILCfg; char szSSFileName[SYS_MAX_PATH]; if ((pLMAILCfg = LMAILGetConfigCopy(hShbLMAIL)) == NULL) return ErrGetErrorCode(); if (LMAILGetFilesSnapShot(pLMAILCfg, lThreadId, szSSFileName, sizeof(szSSFileName)) < 0) { ErrorPush(); SysFree(pLMAILCfg); return ErrorPop(); } if (LMAILProcessList(pLMAILCfg, lThreadId, szSSFileName) < 0) { ErrorPush(); SysRemove(szSSFileName); SysFree(pLMAILCfg); return ErrorPop(); } LMAILRemoveProcessed(pLMAILCfg, szSSFileName); SysRemove(szSSFileName); SysFree(pLMAILCfg); return 0; } unsigned int LMAILThreadProc(void *pThreadData) { LMAILConfig *pLMAILCfg = (LMAILConfig *) ShbLock(hShbLMAIL); if (pLMAILCfg == NULL) { ErrorPush(); SysLogMessage(LOG_LEV_ERROR, "%s\n", ErrGetErrorString()); return ErrorPop(); } /* Get thread id and sleep timeout */ int iSleepTimeout = pLMAILCfg->iSleepTimeout; long lThreadId = pLMAILCfg->lThreadCount; /* Increase thread count */ LMAILThreadCountAdd(+1, hShbLMAIL, pLMAILCfg); ShbUnlock(hShbLMAIL); SysLogMessage(LOG_LEV_MESSAGE, "LMAIL thread [%02ld] started\n", lThreadId); for (;;) { /* Check shutdown condition */ pLMAILCfg = (LMAILConfig *) ShbLock(hShbLMAIL); if (pLMAILCfg == NULL || pLMAILCfg->ulFlags & LMAILF_STOP_SERVER) { SysLogMessage(LOG_LEV_MESSAGE, "LMAIL thread [%02ld] exiting\n", lThreadId); if (pLMAILCfg != NULL) ShbUnlock(hShbLMAIL); break; } ShbUnlock(hShbLMAIL); /* Process local spool files */ int iProcessResult = LMAILProcessLocalSpool(hShbLMAIL, lThreadId); if (iProcessResult == ERR_NO_LOCAL_SPOOL_FILES) SysSleep(iSleepTimeout); } /* Decrease thread count */ LMAILThreadCountAdd(-1, hShbLMAIL); SysLogMessage(LOG_LEV_MESSAGE, "LMAIL thread [%02ld] stopped\n", lThreadId); return 0; } xmail-1.27/SvrConfig.h0000644000175000017500000000166311341640430014102 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SVRCONFIG_H #define _SVRCONFIG_H #endif xmail-1.27/ResLocks.cpp0000644000175000017500000002262111341640430014257 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "ResLocks.h" #include "BuffSock.h" #include "MiscUtils.h" #include "MessQueue.h" #include "MailConfig.h" #include "MailSvr.h" #define STD_WAIT_GATES 37 #define STD_RES_HASH_SIZE 251 #define STD_RLCK_HASH_INIT 9677 struct ResWaitGate { SYS_SEMAPHORE hSemaphore; int iWaitingProcesses; int iHashSize; SysListHead *pResList; }; struct ResLockEntry { SysListHead LLink; int iShLocks; int iExLocks; char szName[1]; }; struct ResLocator { int iWaitGate; int iResIdx; }; static unsigned long RLckHashString(char const *pData, unsigned long ulHashInit = STD_RLCK_HASH_INIT); static SYS_MUTEX hRLMutex = SYS_INVALID_MUTEX; static ResWaitGate RLGates[STD_WAIT_GATES]; int RLckInitLockers(void) { /* Create resource locking mutex */ if ((hRLMutex = SysCreateMutex()) == SYS_INVALID_MUTEX) return ErrGetErrorCode(); /* Initialize wait gates */ for (int i = 0; i < STD_WAIT_GATES; i++) { if ((RLGates[i].hSemaphore = SysCreateSemaphore(0, SYS_DEFAULT_MAXCOUNT)) == SYS_INVALID_SEMAPHORE) { ErrorPush(); for (--i; i >= 0; i--) { SysFree(RLGates[i].pResList); SysCloseSemaphore(RLGates[i].hSemaphore); } SysCloseMutex(hRLMutex); return ErrorPop(); } RLGates[i].iWaitingProcesses = 0; RLGates[i].iHashSize = STD_RES_HASH_SIZE; if ((RLGates[i].pResList = (SysListHead *) SysAlloc(RLGates[i].iHashSize * sizeof(SysListHead))) == NULL) { ErrorPush(); SysCloseSemaphore(RLGates[i].hSemaphore); for (--i; i >= 0; i--) { SysFree(RLGates[i].pResList); SysCloseSemaphore(RLGates[i].hSemaphore); } SysCloseMutex(hRLMutex); return ErrorPop(); } for (int j = 0; j < RLGates[i].iHashSize; j++) SYS_INIT_LIST_HEAD(&RLGates[i].pResList[j]); } return 0; } static int RLckFreeEntry(ResLockEntry * pRLE) { SysFree(pRLE); return 0; } int RLckCleanupLockers(void) { if (SysLockMutex(hRLMutex, SYS_INFINITE_TIMEOUT) < 0) return ErrGetErrorCode(); for (int i = 0; i < STD_WAIT_GATES; i++) { for (int j = 0; j < RLGates[i].iHashSize; j++) { SysListHead *pHead = &RLGates[i].pResList[j]; SysListHead *pLLink; while ((pLLink = SYS_LIST_FIRST(pHead)) != NULL) { ResLockEntry *pRLE = SYS_LIST_ENTRY(pLLink, ResLockEntry, LLink); SYS_LIST_DEL(&pRLE->LLink); RLckFreeEntry(pRLE); } } SysFree(RLGates[i].pResList); SysCloseSemaphore(RLGates[i].hSemaphore); } SysUnlockMutex(hRLMutex); SysCloseMutex(hRLMutex); return 0; } static unsigned long RLckHashString(char const *pData, unsigned long ulHashInit) { unsigned long ulHashVal = ulHashInit; while (*pData != 0) { ulHashVal += ToLower(*(unsigned char const *) pData); pData++; ulHashVal += (ulHashVal << 10); ulHashVal ^= (ulHashVal >> 6); } ulHashVal += (ulHashVal << 3); ulHashVal ^= (ulHashVal >> 11); ulHashVal += (ulHashVal << 15); return ulHashVal; } static void RLckGetResLocator(char const *pszResourceName, ResLocator * pRL) { unsigned long ulResHash = RLckHashString(pszResourceName); pRL->iWaitGate = (int) (ulResHash % STD_WAIT_GATES); pRL->iResIdx = (int) (ulResHash % RLGates[pRL->iWaitGate].iHashSize); } static ResLockEntry *RLckGetEntry(ResLocator const *pRL, char const *pszResourceName) { SysListHead *pHead = &RLGates[pRL->iWaitGate].pResList[pRL->iResIdx]; SysListHead *pLLink; SYS_LIST_FOR_EACH(pLLink, pHead) { ResLockEntry *pRLE = SYS_LIST_ENTRY(pLLink, ResLockEntry, LLink); if (stricmp(pszResourceName, pRLE->szName) == 0) return pRLE; } ErrSetErrorCode(ERR_LOCK_ENTRY_NOT_FOUND); return NULL; } static int RLckRemoveEntry(ResLocator const *pRL, ResLockEntry * pRLE) { SysListHead *pHead = &RLGates[pRL->iWaitGate].pResList[pRL->iResIdx]; SysListHead *pLLink; SYS_LIST_FOR_EACH(pLLink, pHead) { ResLockEntry *pCurrRLE = SYS_LIST_ENTRY(pLLink, ResLockEntry, LLink); if (pCurrRLE == pRLE) { SYS_LIST_DEL(&pRLE->LLink); RLckFreeEntry(pRLE); return 0; } } ErrSetErrorCode(ERR_LOCK_ENTRY_NOT_FOUND); return ERR_LOCK_ENTRY_NOT_FOUND; } static ResLockEntry *RLckAllocEntry(char const *pszResourceName) { ResLockEntry *pRLE = (ResLockEntry *) SysAlloc(sizeof(ResLockEntry) + strlen(pszResourceName)); if (pRLE == NULL) return NULL; SYS_INIT_LIST_LINK(&pRLE->LLink); strcpy(pRLE->szName, pszResourceName); return pRLE; } static int RLckTryLockEX(ResLocator const *pRL, char const *pszResourceName) { ResLockEntry *pRLE = RLckGetEntry(pRL, pszResourceName); if (pRLE == NULL) { SysListHead *pHead = &RLGates[pRL->iWaitGate].pResList[pRL->iResIdx]; if ((pRLE = RLckAllocEntry(pszResourceName)) == NULL) return ErrGetErrorCode(); pRLE->iExLocks = 1; SYS_LIST_ADDH(&pRLE->LLink, pHead); } else { if (pRLE->iExLocks > 0 || pRLE->iShLocks > 0) { ErrSetErrorCode(ERR_LOCKED_RESOURCE); return ERR_LOCKED_RESOURCE; } pRLE->iExLocks = 1; } return 0; } static int RLckDoUnlockEX(ResLocator const *pRL, char const *pszResourceName) { ResLockEntry *pRLE = RLckGetEntry(pRL, pszResourceName); if (pRLE == NULL || pRLE->iExLocks == 0) { ErrSetErrorCode(ERR_RESOURCE_NOT_LOCKED); return ERR_RESOURCE_NOT_LOCKED; } pRLE->iExLocks = 0; /* Remove entry from list and delete entry memory */ if (RLckRemoveEntry(pRL, pRLE) < 0) return ErrGetErrorCode(); /* Release waiting processes */ if (RLGates[pRL->iWaitGate].iWaitingProcesses > 0) { SysReleaseSemaphore(RLGates[pRL->iWaitGate].hSemaphore, RLGates[pRL->iWaitGate].iWaitingProcesses); RLGates[pRL->iWaitGate].iWaitingProcesses = 0; } return 0; } static int RLckTryLockSH(ResLocator const *pRL, char const *pszResourceName) { ResLockEntry *pRLE = RLckGetEntry(pRL, pszResourceName); if (pRLE == NULL) { SysListHead *pHead = &RLGates[pRL->iWaitGate].pResList[pRL->iResIdx]; if ((pRLE = RLckAllocEntry(pszResourceName)) == NULL) return ErrGetErrorCode(); pRLE->iShLocks = 1; SYS_LIST_ADDH(&pRLE->LLink, pHead); } else { if (pRLE->iExLocks > 0) { ErrSetErrorCode(ERR_LOCKED_RESOURCE); return ERR_LOCKED_RESOURCE; } ++pRLE->iShLocks; } return 0; } static int RLckDoUnlockSH(ResLocator const *pRL, char const *pszResourceName) { ResLockEntry *pRLE = RLckGetEntry(pRL, pszResourceName); if (pRLE == NULL || pRLE->iShLocks == 0) { ErrSetErrorCode(ERR_RESOURCE_NOT_LOCKED); return ERR_RESOURCE_NOT_LOCKED; } if (--pRLE->iShLocks == 0) { /* Remove entry from list and delete entry heap memory */ if (RLckRemoveEntry(pRL, pRLE) < 0) return ErrGetErrorCode(); /* Release waiting processes */ if (RLGates[pRL->iWaitGate].iWaitingProcesses > 0) { SysReleaseSemaphore(RLGates[pRL->iWaitGate].hSemaphore, RLGates[pRL->iWaitGate].iWaitingProcesses); RLGates[pRL->iWaitGate].iWaitingProcesses = 0; } } return 0; } static RLCK_HANDLE RLckLock(char const *pszResourceName, int (*pLockProc) (ResLocator const *, char const *)) { ResLocator RL; RLckGetResLocator(pszResourceName, &RL); for (;;) { /* Lock resources list access */ if (SysLockMutex(hRLMutex, SYS_INFINITE_TIMEOUT) < 0) return INVALID_RLCK_HANDLE; int iLockResult = (*pLockProc)(&RL, pszResourceName); if (iLockResult == ERR_LOCKED_RESOURCE) { SYS_SEMAPHORE SemID = RLGates[RL.iWaitGate].hSemaphore; ++RLGates[RL.iWaitGate].iWaitingProcesses; SysUnlockMutex(hRLMutex); if (SysWaitSemaphore(SemID, SYS_INFINITE_TIMEOUT) < 0) return INVALID_RLCK_HANDLE; } else if (iLockResult == 0) { SysUnlockMutex(hRLMutex); break; } else { SysUnlockMutex(hRLMutex); return INVALID_RLCK_HANDLE; } } return (RLCK_HANDLE) SysStrDup(pszResourceName); } static int RLckUnlock(RLCK_HANDLE hLock, int (*pUnlockProc) (ResLocator const *, char const *)) { char *pszResourceName = (char *) hLock; ResLocator RL; RLckGetResLocator(pszResourceName, &RL); /* Lock resources list access */ if (SysLockMutex(hRLMutex, SYS_INFINITE_TIMEOUT) < 0) return ErrGetErrorCode(); if ((*pUnlockProc)(&RL, pszResourceName) < 0) { ErrorPush(); SysUnlockMutex(hRLMutex); SysFree(pszResourceName); return ErrorPop(); } SysUnlockMutex(hRLMutex); SysFree(pszResourceName); return 0; } RLCK_HANDLE RLckLockEX(char const *pszResourceName) { return RLckLock(pszResourceName, RLckTryLockEX); } int RLckUnlockEX(RLCK_HANDLE hLock) { return hLock != INVALID_RLCK_HANDLE ? RLckUnlock(hLock, RLckDoUnlockEX): 0; } RLCK_HANDLE RLckLockSH(char const *pszResourceName) { return RLckLock(pszResourceName, RLckTryLockSH); } int RLckUnlockSH(RLCK_HANDLE hLock) { return hLock != INVALID_RLCK_HANDLE ? RLckUnlock(hLock, RLckDoUnlockSH): 0; } xmail-1.27/QueueUtils.cpp0000644000175000017500000005770611341640430014653 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "ResLocks.h" #include "StrUtils.h" #include "SList.h" #include "MD5.h" #include "Base64Enc.h" #include "BuffSock.h" #include "MessQueue.h" #include "MailConfig.h" #include "UsrUtils.h" #include "SvrUtils.h" #include "AppDefines.h" #include "MailSvr.h" #include "MiscUtils.h" #include "SMTPUtils.h" #include "SMAILUtils.h" #include "QueueUtils.h" #define QUE_SMTP_MAILER_ERROR_HDR "X-MailerError" #define QUE_MAILER_HDR "X-MailerServer" static int QueUtDumpFrozen(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, FILE *pListFile) { /* Get message file path */ char szQueueFilePath[SYS_MAX_PATH] = ""; QueGetFilePath(hQueue, hMessage, szQueueFilePath); /* Load spool file info and make a type check */ SYS_FILE_INFO FI; if (SysGetFileInfo(szQueueFilePath, FI) < 0) return ErrGetErrorCode(); /* Load the spool file header */ SpoolFileHeader SFH; if (USmlLoadSpoolFileHeader(szQueueFilePath, SFH) < 0) return ErrGetErrorCode(); char *pszFrom = USmlAddrConcat(SFH.ppszFrom); if (pszFrom == NULL) { ErrorPush(); USmlCleanupSpoolFileHeader(SFH); return ErrorPop(); } char *pszRcpt = USmlAddrConcat(SFH.ppszRcpt); if (pszRcpt == NULL) { ErrorPush(); SysFree(pszFrom); USmlCleanupSpoolFileHeader(SFH); return ErrorPop(); } char szTime[128] = ""; MscGetTimeNbrString(szTime, sizeof(szTime) - 1, QueGetLastTryTime(hMessage)); fprintf(pListFile, "\"%s\"\t" "\"%d\"\t" "\"%d\"\t" "\"<%s>\"\t" "\"<%s>\"\t" "\"%s\"\t" "\"" SYS_OFFT_FMT "\"\t" "\"%d\"\t" "\"%s\"\n", QueGetFileName(hMessage), QueGetLevel1(hMessage), QueGetLevel2(hMessage), pszFrom, pszRcpt, szTime, FI.llSize, QueGetTryCount(hMessage), QueGetQueueDir(hMessage)); SysFree(pszRcpt); SysFree(pszFrom); USmlCleanupSpoolFileHeader(SFH); return 0; } int QueUtGetFrozenList(QUEUE_HANDLE hQueue, char const *pszListFile) { int iNumDirsLevel = QueGetDirsLevel(hQueue); char const *pszRootPath = QueGetRootPath(hQueue); /* Creates the list file and start scanning the frozen queue */ FILE *pListFile = fopen(pszListFile, "wt"); if (pListFile == NULL) { ErrSetErrorCode(ERR_FILE_CREATE, pszListFile); return ERR_FILE_CREATE; } for (int i = 0; i < iNumDirsLevel; i++) { for (int j = 0; j < iNumDirsLevel; j++) { char szCurrPath[SYS_MAX_PATH] = ""; SysSNPrintf(szCurrPath, sizeof(szCurrPath) - 1, "%s%d%s%d%s%s", pszRootPath, i, SYS_SLASH_STR, j, SYS_SLASH_STR, QUEUE_FROZ_DIR); char szFrozFileName[SYS_MAX_PATH] = ""; FSCAN_HANDLE hFileScan = MscFirstFile(szCurrPath, 0, szFrozFileName, sizeof(szFrozFileName)); if (hFileScan != INVALID_FSCAN_HANDLE) { do { if (!SYS_IS_VALID_FILENAME(szFrozFileName)) continue; /* Create queue file handle */ QMSG_HANDLE hMessage = QueGetHandle(hQueue, i, j, QUEUE_FROZ_DIR, szFrozFileName); if (hMessage != INVALID_QMSG_HANDLE) { QueUtDumpFrozen(hQueue, hMessage, pListFile); QueCloseMessage(hQueue, hMessage); } } while (MscNextFile(hFileScan, szFrozFileName, sizeof(szFrozFileName))); MscCloseFindFile(hFileScan); } } } fclose(pListFile); return 0; } int QueUtUnFreezeMessage(QUEUE_HANDLE hQueue, int iLevel1, int iLevel2, char const *pszMessageFile) { /* Create queue file handle */ QMSG_HANDLE hMessage = QueGetHandle(hQueue, iLevel1, iLevel2, QUEUE_FROZ_DIR, pszMessageFile); if (hMessage == INVALID_QMSG_HANDLE) return ErrGetErrorCode(); /* Init message statistics */ QueInitMessageStats(hQueue, hMessage); /* Try to re-commit the frozen message */ if (QueCommitMessage(hQueue, hMessage) < 0) { ErrorPush(); QueCloseMessage(hQueue, hMessage); return ErrorPop(); } return 0; } int QueUtDeleteFrozenMessage(QUEUE_HANDLE hQueue, int iLevel1, int iLevel2, char const *pszMessageFile) { /* Create queue file handle */ QMSG_HANDLE hMessage = QueGetHandle(hQueue, iLevel1, iLevel2, QUEUE_FROZ_DIR, pszMessageFile); if (hMessage == INVALID_QMSG_HANDLE) return ErrGetErrorCode(); QueCleanupMessage(hQueue, hMessage); QueCloseMessage(hQueue, hMessage); return 0; } int QueUtGetFrozenMsgFile(QUEUE_HANDLE hQueue, int iLevel1, int iLevel2, char const *pszMessageFile, char const *pszOutFile) { /* Create queue file handle */ QMSG_HANDLE hMessage = QueGetHandle(hQueue, iLevel1, iLevel2, QUEUE_FROZ_DIR, pszMessageFile); if (hMessage == INVALID_QMSG_HANDLE) return ErrGetErrorCode(); /* Get slog file path */ char szQueueFilePath[SYS_MAX_PATH] = ""; QueGetFilePath(hQueue, hMessage, szQueueFilePath); /* Copy the requested file */ if (MscCopyFile(pszOutFile, szQueueFilePath) < 0) { ErrorPush(); QueCloseMessage(hQueue, hMessage); return ErrorPop(); } QueCloseMessage(hQueue, hMessage); return 0; } int QueUtGetFrozenLogFile(QUEUE_HANDLE hQueue, int iLevel1, int iLevel2, char const *pszMessageFile, char const *pszOutFile) { /* Create queue file handle */ QMSG_HANDLE hMessage = QueGetHandle(hQueue, iLevel1, iLevel2, QUEUE_FROZ_DIR, pszMessageFile); if (hMessage == INVALID_QMSG_HANDLE) return ErrGetErrorCode(); /* Get slog file path */ char szQueueFilePath[SYS_MAX_PATH] = ""; QueGetFilePath(hQueue, hMessage, szQueueFilePath, QUEUE_SLOG_DIR); /* Copy the requested file */ if (MscCopyFile(pszOutFile, szQueueFilePath) < 0) { ErrorPush(); QueCloseMessage(hQueue, hMessage); return ErrorPop(); } QueCloseMessage(hQueue, hMessage); return 0; } int QueUtErrLogMessage(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char const *pszFormat, ...) { /* Get slog file path */ char szSlogFilePath[SYS_MAX_PATH] = ""; QueGetFilePath(hQueue, hMessage, szSlogFilePath, QUEUE_SLOG_DIR); char *pszMessage = NULL; StrVSprint(pszMessage, pszFormat, pszFormat); if (pszMessage == NULL) return ErrGetErrorCode(); if (ErrFileLogString(szSlogFilePath, pszMessage) < 0) { SysFree(pszMessage); return ErrGetErrorCode(); } SysFree(pszMessage); return 0; } static char *QueUtGetLogEntryVar(char const *pszLog, char const *pszVarName) { int iVarLength, iLenght = strlen(pszVarName); char const *pszEPos, *pszTmp, *pszEnd; for (pszEPos = pszLog;;) { if ((pszTmp = strstr(pszEPos, pszVarName)) == NULL) return NULL; pszEPos = pszTmp + 1; if (pszTmp > pszLog && pszTmp[-1] != '\n') continue; pszTmp += iLenght; StrSkipSpaces(pszTmp); if (*pszTmp == '=') { pszEPos = pszTmp + 1; break; } } StrSkipSpaces(pszEPos); if ((pszEnd = strchr(pszEPos, '\r')) == NULL && (pszEnd = strchr(pszEPos, '\n')) == NULL) pszEnd = pszEPos + strlen(pszEPos); if (*pszEPos == '"') { ++pszEPos; if (pszEnd[-1] == '"') pszEnd--; } if ((iVarLength = (int) (pszEnd - pszEPos)) <= 0) return NULL; char *pszVarValue = (char *) SysAlloc(iVarLength + 1); if (pszVarValue != NULL) { memcpy(pszVarValue, pszEPos, iVarLength); pszVarValue[iVarLength] = '\0'; } return pszVarValue; } int QueUtGetLastLogInfo(char const *pszLogFilePath, QueLogInfo *pQLI) { char *pszEntry = QueLoadLastLogEntry(pszLogFilePath); pQLI->pszReason = pQLI->pszServer = NULL; if (pszEntry == NULL) return ErrGetErrorCode(); pQLI->pszReason = QueUtGetLogEntryVar(pszEntry, SMTP_ERROR_VARNAME); pQLI->pszServer = QueUtGetLogEntryVar(pszEntry, SMTP_SERVER_VARNAME); SysFree(pszEntry); return 0; } void QueUtFreeLastLogInfo(QueLogInfo *pQLI) { SysFree(pQLI->pszServer); SysFree(pQLI->pszReason); } bool QueUtRemoveSpoolErrors(void) { return SvrTestConfigFlag("RemoveSpoolErrors", false); } static char *QueUtGetReplyAddress(SPLF_HANDLE hFSpool) { /* Extract the sender */ char const *const *ppszFrom = USmlGetMailFrom(hFSpool); int iFromDomains = StrStringsCount(ppszFrom); if (iFromDomains == 0) { ErrSetErrorCode(ERR_NULL_SENDER); return NULL; } char const *pszSender = ppszFrom[iFromDomains - 1]; char szSenderDomain[MAX_ADDR_NAME] = ""; char szSenderName[MAX_ADDR_NAME] = ""; if (USmtpSplitEmailAddr(pszSender, szSenderName, szSenderDomain) < 0) return SysStrDup(pszSender); /* Lookup special reply-to header tags */ return SysStrDup(pszSender); } static int QueUtBuildErrorResponse(char const *pszSMTPDomain, SPLF_HANDLE hFSpool, char const *pszFrom, char const *pszSmtpFrom, char const *pszTo, char const *pszResponseFile, char const *pszReason, char const *pszText, char const *pszServer, int iLinesExtra, char const *pszLogFile) { char const *pszSpoolFileName = USmlGetSpoolFile(hFSpool); char const *pszSmtpMsgID = USmlGetSmtpMessageID(hFSpool); /* Retrieve a new message ID */ SYS_UINT64 ullMessageID = 0; if (SvrGetMessageID(&ullMessageID) < 0) return ErrGetErrorCode(); FILE *pRespFile = fopen(pszResponseFile, "wb"); if (pRespFile == NULL) { ErrSetErrorCode(ERR_FILE_CREATE, pszResponseFile); return ERR_FILE_CREATE; } /* Try to remap target user address */ char szDomain[MAX_ADDR_NAME] = ""; char szName[MAX_ADDR_NAME] = ""; char szTo[MAX_ADDR_NAME] = ""; if (USmlMapAddress(pszTo, szDomain, szName) < 0) StrSNCpy(szTo, pszTo); else SysSNPrintf(szTo, sizeof(szTo) - 1, "%s@%s", szName, szDomain); /* Get the current time string */ char szTime[128] = ""; MscGetTimeStr(szTime, sizeof(szTime) - 1); /* Write info line */ USmtpWriteInfoLine(pRespFile, LOCAL_ADDRESS_SQB ":0", LOCAL_ADDRESS_SQB ":0", szTime); /* Write domain */ fprintf(pRespFile, "%s\r\n", pszSMTPDomain); /* Write message ID */ fprintf(pRespFile, "X" SYS_LLX_FMT "\r\n", ullMessageID); /* Write MAIL FROM */ fprintf(pRespFile, "MAIL FROM:<%s>\r\n", pszSmtpFrom); /* Write RCPT TO */ fprintf(pRespFile, "RCPT TO:<%s>\r\n", szTo); /* Write SPOOL_FILE_DATA_START */ fprintf(pRespFile, "%s\r\n", SPOOL_FILE_DATA_START); /* Write Date ( mail data ) */ fprintf(pRespFile, "Date: %s\r\n", szTime); /* Write X-MessageId ( mail data ) */ fprintf(pRespFile, "X-MessageId: <%s>\r\n", pszSpoolFileName); /* Write X-SmtpMessageId ( mail data ) */ fprintf(pRespFile, "X-SmtpMessageId: <%s>\r\n", pszSmtpMsgID); /* Write From ( mail data ) */ fprintf(pRespFile, "From: %s PostMaster <%s>\r\n", pszSMTPDomain, pszFrom); /* Write To ( mail data ) */ fprintf(pRespFile, "To: %s\r\n", pszTo); /* Write Subject ( mail data ) */ fprintf(pRespFile, "Subject: Error sending message [%s] from [%s]\r\n", pszSpoolFileName, pszSMTPDomain); /* Write X-MailerServer ( mail data ) */ fprintf(pRespFile, "%s: %s\r\n", QUE_MAILER_HDR, APP_NAME_VERSION_STR); /* Write X-SMTP-Mailer-Error ( mail data ) */ fprintf(pRespFile, "%s: Message = [%s] Server = [%s]\r\n", QUE_SMTP_MAILER_ERROR_HDR, pszSpoolFileName, pszSMTPDomain); /* Write blank line ( mail data ) */ fprintf(pRespFile, "\r\n"); /* Write XMail bounce identifier */ char const *pszMailFrom = USmlMailFrom(hFSpool); char const *pszRcptTo = USmlRcptTo(hFSpool); fprintf(pRespFile, "[<00>] XMail bounce: Rcpt=[%s];Error=[%s]\r\n\r\n\r\n", pszRcptTo, (pszReason != NULL) ? pszReason: ""); /* Write error message ( mail data ) */ fprintf(pRespFile, "[<01>] Error sending message [%s] from [%s].\r\n\r\n" "ID: <%s>\r\n" "Mail From: <%s>\r\n" "Rcpt To: <%s>\r\n", pszSpoolFileName, pszSMTPDomain, pszSmtpMsgID, pszMailFrom, pszRcptTo); if (pszServer != NULL) { SYS_INET_ADDR SvrAddr; char szIP[128] = "???.???.???.???"; char szServer[MAX_HOST_NAME] = ""; if (MscGetServerAddress(pszServer, SvrAddr) == 0 && SysGetHostByAddr(SvrAddr, szServer, sizeof(szServer)) == 0) { pszServer = szServer; SysInetNToA(SvrAddr, szIP, sizeof(szIP)); } else StrSNCpy(szIP, pszServer); fprintf(pRespFile, "Server: <%s> [%s]\r\n", pszServer, szIP); } fprintf(pRespFile, "\r\n\r\n"); /* Emit the delivery failure reason */ if (pszReason != NULL) fprintf(pRespFile, "[<02>] The reason of the delivery failure was:\r\n\r\n" "%s\r\n\r\n\r\n", pszReason); /* Emit extra text */ if (pszText != NULL) fprintf(pRespFile, "[<03>] Note:\r\n\r\n" "%s\r\n\r\n\r\n", pszText); /* Dump the log file associated with the message */ char szBuffer[1536] = ""; if (pszLogFile != NULL) { FILE *pLogFile = fopen(pszLogFile, "rb"); if (pLogFile != NULL) { fprintf(pRespFile, "[<04>] Here is listed the message log file:\r\n\r\n"); while (MscGetString(pLogFile, szBuffer, sizeof(szBuffer) - 1) != NULL) fprintf(pRespFile, "%s\r\n", szBuffer); fprintf(pRespFile, "\r\n\r\n"); fclose(pLogFile); } } /* This function retrieve the spool file message section and sync the content. */ /* This is necessary before reading the file */ FileSection FSect; if (USmlGetMsgFileSection(hFSpool, FSect) < 0) { ErrorPush(); fclose(pRespFile); SysRemove(pszResponseFile); return ErrorPop(); } /* Open spool file */ FILE *pMsgFile = fopen(FSect.szFilePath, "rb"); if (pMsgFile == NULL) { fclose(pRespFile); SysRemove(pszResponseFile); ErrSetErrorCode(ERR_FILE_OPEN, FSect.szFilePath); return ERR_FILE_OPEN; } /* Seek at the beginning of the message ( headers section ) */ Sys_fseek(pMsgFile, FSect.llStartOffset, SEEK_SET); fprintf(pRespFile, "[<05>] Here is listed the initial part of the message:\r\n\r\n"); int iGotNL; bool bInHeaders = true; while (MscGetString(pMsgFile, szBuffer, sizeof(szBuffer) - 1, &iGotNL) != NULL) { char *pszXDomain, *pszTmp; /* Mail error loop deteced */ if (StrNComp(szBuffer, QUE_SMTP_MAILER_ERROR_HDR) == 0 && (pszXDomain = strrchr(szBuffer, '[')) != NULL && (pszTmp = strrchr(++pszXDomain, ']')) != NULL && strnicmp(pszXDomain, pszSMTPDomain, pszTmp - pszXDomain) == 0){ fclose(pMsgFile); fclose(pRespFile); SysRemove(pszResponseFile); ErrSetErrorCode(ERR_MAIL_ERROR_LOOP); return ERR_MAIL_ERROR_LOOP; } if (bInHeaders && IsEmptyString(szBuffer)) bInHeaders = false; if (!bInHeaders && iGotNL && (iLinesExtra-- < 0)) break; fprintf(pRespFile, "%s%s", szBuffer, iGotNL ? "\r\n": ""); } fclose(pMsgFile); fclose(pRespFile); return 0; } static int QueUtTXErrorNotifySender(SPLF_HANDLE hFSpool, char const *pszAdminAddrVar, char const *pszReason, char const *pszText, char const *pszServer, char const *pszLogFile) { /* Extract the sender */ char *pszReplyTo = QueUtGetReplyAddress(hFSpool); if (pszReplyTo == NULL) return ErrGetErrorCode(); /* Load configuration handle */ SVRCFG_HANDLE hSvrConfig = SvrGetConfigHandle(); if (hSvrConfig == INVALID_SVRCFG_HANDLE) { ErrorPush(); SysFree(pszReplyTo); return ErrorPop(); } char szPMAddress[MAX_ADDR_NAME] = ""; char szMailDomain[MAX_HOST_NAME] = ""; if (SvrConfigVar("PostMaster", szPMAddress, sizeof(szPMAddress) - 1, hSvrConfig) < 0 || SvrConfigVar("RootDomain", szMailDomain, sizeof(szMailDomain) - 1, hSvrConfig) < 0) { SvrReleaseConfigHandle(hSvrConfig); SysFree(pszReplyTo); ErrSetErrorCode(ERR_INCOMPLETE_CONFIG); return ERR_INCOMPLETE_CONFIG; } /* Get message handle */ int iMsgLinesExtra = SvrGetConfigInt("NotifyMsgLinesExtra", 0, hSvrConfig); bool bSenderLog = SvrTestConfigFlag("NotifySendLogToSender", false, hSvrConfig); bool bNoSenderBounce = SvrTestConfigFlag("NoSenderBounce", false, hSvrConfig); QMSG_HANDLE hMessage = QueCreateMessage(hSpoolQueue); if (hMessage == INVALID_QMSG_HANDLE) { ErrorPush(); SvrReleaseConfigHandle(hSvrConfig); SysFree(pszReplyTo); return ErrorPop(); } char szQueueFilePath[SYS_MAX_PATH] = ""; QueGetFilePath(hSpoolQueue, hMessage, szQueueFilePath); /* Build error response mail file */ if (QueUtBuildErrorResponse(szMailDomain, hFSpool, szPMAddress, bNoSenderBounce ? "": szPMAddress, pszReplyTo, szQueueFilePath, pszReason, pszText, pszServer, iMsgLinesExtra, bSenderLog ? pszLogFile : NULL) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); SvrReleaseConfigHandle(hSvrConfig); SysFree(pszReplyTo); return ErrorPop(); } SysFree(pszReplyTo); /* Send error response mail file */ if (QueCommitMessage(hSpoolQueue, hMessage) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); SvrReleaseConfigHandle(hSvrConfig); return ErrorPop(); } /* Notify "error-handler" admin */ char szEHAdmin[MAX_ADDR_NAME] = ""; if (SvrConfigVar(pszAdminAddrVar, szEHAdmin, sizeof(szEHAdmin) - 1, hSvrConfig) == 0 && !IsEmptyString(szEHAdmin)) { /* Get message handle */ if ((hMessage = QueCreateMessage(hSpoolQueue)) == INVALID_QMSG_HANDLE) { ErrorPush(); SvrReleaseConfigHandle(hSvrConfig); return ErrorPop(); } QueGetFilePath(hSpoolQueue, hMessage, szQueueFilePath); /* Build error response mail file */ if (QueUtBuildErrorResponse(szMailDomain, hFSpool, szPMAddress, bNoSenderBounce ? "": szPMAddress, szEHAdmin, szQueueFilePath, pszReason, pszText, pszServer, iMsgLinesExtra, pszLogFile) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); SvrReleaseConfigHandle(hSvrConfig); return ErrorPop(); } /* Send error response mail file */ if (QueCommitMessage(hSpoolQueue, hMessage) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); SvrReleaseConfigHandle(hSvrConfig); return ErrorPop(); } } SvrReleaseConfigHandle(hSvrConfig); return 0; } static int QueUtTXErrorNotifyRoot(SPLF_HANDLE hFSpool, char const *pszReason, char const *pszLogFile) { /* Load configuration handle */ SVRCFG_HANDLE hSvrConfig = SvrGetConfigHandle(); if (hSvrConfig == INVALID_SVRCFG_HANDLE) return ErrGetErrorCode(); char szPMAddress[MAX_ADDR_NAME] = ""; char szMailDomain[MAX_HOST_NAME] = ""; if (SvrConfigVar("PostMaster", szPMAddress, sizeof(szPMAddress) - 1, hSvrConfig) < 0 || SvrConfigVar("RootDomain", szMailDomain, sizeof(szMailDomain) - 1, hSvrConfig) < 0) { SvrReleaseConfigHandle(hSvrConfig); ErrSetErrorCode(ERR_INCOMPLETE_CONFIG); return ERR_INCOMPLETE_CONFIG; } /* Get message handle */ int iMsgLinesExtra = SvrGetConfigInt("NotifyMsgLinesExtra", 0, hSvrConfig); QMSG_HANDLE hMessage = QueCreateMessage(hSpoolQueue); if (hMessage == INVALID_QMSG_HANDLE) { ErrorPush(); SvrReleaseConfigHandle(hSvrConfig); return ErrorPop(); } char szQueueFilePath[SYS_MAX_PATH] = ""; QueGetFilePath(hSpoolQueue, hMessage, szQueueFilePath); /* Build error response mail file */ if (QueUtBuildErrorResponse(szMailDomain, hFSpool, szPMAddress, szPMAddress, szPMAddress, szQueueFilePath, pszReason, NULL, NULL, iMsgLinesExtra, pszLogFile) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); SvrReleaseConfigHandle(hSvrConfig); return ErrorPop(); } SvrReleaseConfigHandle(hSvrConfig); /* Send error response mail file */ if (QueCommitMessage(hSpoolQueue, hMessage) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); return ErrorPop(); } return 0; } static int QueUtTXErrorExNotifyRoot(SPLF_HANDLE hFSpool, char const *pszMessFilePath, char const *pszReason, char const *pszLogFile) { bool bCloseHSpool = false; if (hFSpool == INVALID_SPLF_HANDLE) { if ((hFSpool = USmlCreateHandle(pszMessFilePath)) == INVALID_SPLF_HANDLE) return ErrGetErrorCode(); bCloseHSpool = true; } int iResult = QueUtTXErrorNotifyRoot(hFSpool, pszReason, pszLogFile); if (bCloseHSpool) USmlCloseHandle(hFSpool); return iResult; } static int QueUtTXErrorExNotifySender(SPLF_HANDLE hFSpool, char const *pszMessFilePath, char const *pszAdminAddrVar, char const *pszReason, char const *pszText, char const *pszServer, char const *pszLogFile) { bool bCloseHSpool = false; if (hFSpool == INVALID_SPLF_HANDLE) { if ((hFSpool = USmlCreateHandle(pszMessFilePath)) == INVALID_SPLF_HANDLE) return ErrGetErrorCode(); bCloseHSpool = true; } int iResult = QueUtTXErrorNotifySender(hFSpool, pszAdminAddrVar, pszReason, pszText, pszServer, pszLogFile); if (bCloseHSpool) USmlCloseHandle(hFSpool); return iResult; } int QueUtNotifyPermErrDelivery(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, SPLF_HANDLE hFSpool, char const *pszReason, char const *pszServer, bool bCleanup) { /* Get message file path */ char szQueueFilePath[SYS_MAX_PATH] = ""; char szQueueLogFilePath[SYS_MAX_PATH] = ""; QueGetFilePath(hQueue, hMessage, szQueueFilePath); QueGetFilePath(hQueue, hMessage, szQueueLogFilePath, QUEUE_SLOG_DIR); /* Load log information from the slog file */ bool bFreeLogInfo = false; QueLogInfo QLI; if (pszReason == NULL || pszServer == NULL) { QueUtGetLastLogInfo(szQueueLogFilePath, &QLI); if (pszReason == NULL) pszReason = QLI.pszReason; if (pszServer == NULL) pszServer = QLI.pszServer; bFreeLogInfo = true; } int iResult = QueUtTXErrorExNotifySender(hFSpool, szQueueFilePath, "ErrorsAdmin", pszReason, NULL, pszServer, szQueueLogFilePath); if (bCleanup) QueCleanupMessage(hQueue, hMessage, !QueUtRemoveSpoolErrors()); if (bFreeLogInfo) QueUtFreeLastLogInfo(&QLI); return iResult; } int QueUtNotifyTempErrDelivery(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, SPLF_HANDLE hFSpool, char const *pszReason, char const *pszText, char const *pszServer) { /* Get message file path */ char szQueueLogFilePath[SYS_MAX_PATH] = ""; QueGetFilePath(hQueue, hMessage, szQueueLogFilePath, QUEUE_SLOG_DIR); /* Load log information from the slog file */ bool bFreeLogInfo = false; QueLogInfo QLI; if (pszReason == NULL || pszServer == NULL) { QueUtGetLastLogInfo(szQueueLogFilePath, &QLI); if (pszReason == NULL) pszReason = QLI.pszReason; if (pszServer == NULL) pszServer = QLI.pszServer; bFreeLogInfo = true; } int iResult = QueUtTXErrorNotifySender(hFSpool, "TempErrorsAdmin", pszReason, pszText, pszServer, szQueueLogFilePath); if (bFreeLogInfo) QueUtFreeLastLogInfo(&QLI); return iResult; } int QueUtCleanupNotifyRoot(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, SPLF_HANDLE hFSpool, char const *pszReason) { /* Get message file path */ char szQueueFilePath[SYS_MAX_PATH] = ""; char szQueueLogFilePath[SYS_MAX_PATH] = ""; QueGetFilePath(hQueue, hMessage, szQueueFilePath); QueGetFilePath(hQueue, hMessage, szQueueLogFilePath, QUEUE_SLOG_DIR); /* Load log information from the slog file */ bool bFreeLogInfo = false; QueLogInfo QLI; if (pszReason == NULL) { QueUtGetLastLogInfo(szQueueLogFilePath, &QLI); pszReason = QLI.pszReason; bFreeLogInfo = true; } int iResult = QueUtTXErrorExNotifyRoot(hFSpool, szQueueFilePath, pszReason, szQueueLogFilePath); if (bFreeLogInfo) QueUtFreeLastLogInfo(&QLI); QueCleanupMessage(hQueue, hMessage, !QueUtRemoveSpoolErrors()); return iResult; } int QueUtResendMessage(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, SPLF_HANDLE hFSpool) { /* Try to resend the message */ int iResult = QueResendMessage(hQueue, hMessage); /* If the message is expired ... */ if (iResult == ERR_SPOOL_FILE_EXPIRED) { /* Handle notifications and cleanup the message */ iResult = QueUtNotifyPermErrDelivery(hQueue, hMessage, hFSpool, "The maximum number of delivery attempts has been reached", NULL, true); QueCloseMessage(hQueue, hMessage); } return iResult; } xmail-1.27/Hash.h0000644000175000017500000000402611341640430013061 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _HASH_H #define _HASH_H #define INVALID_HASH_HANDLE ((HASH_HANDLE) 0) typedef struct HASH_HANDLE_struct { } *HASH_HANDLE; union HashDatum { void *pData; unsigned long ulData; }; struct HashOps { void *pPrivate; unsigned long (*pGetHashVal)(void *, HashDatum const *); int (*pCompare)(void *, HashDatum const *, HashDatum const *); }; struct HashNode { SysListHead Lnk; HashDatum Key; }; struct HashEnum { unsigned long ulHIdx; SysListHead *pNext; }; HASH_HANDLE HashCreate(HashOps const *pOps, unsigned long ulSize); void HashFree(HASH_HANDLE hHash, void (*pFree)(void *, HashNode *), void *pPrivate); unsigned long HashGetCount(HASH_HANDLE hHash); void HashInitNode(HashNode *pHNode); int HashAdd(HASH_HANDLE hHash, HashNode *pHNode); void HashDel(HASH_HANDLE hHash, HashNode *pHNode); int HashGetFirst(HASH_HANDLE hHash, HashDatum const *pKey, HashEnum *pHEnum, HashNode **ppHNode); int HashGetNext(HASH_HANDLE hHash, HashDatum const *pKey, HashEnum *pHEnum, HashNode **ppHNode); int HashFirst(HASH_HANDLE hHash, HashEnum *pHEnum, HashNode **ppHNode); int HashNext(HASH_HANDLE hHash, HashEnum *pHEnum, HashNode **ppHNode); #endif xmail-1.27/MailConfig.h0000644000175000017500000000221611341640430014205 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _MAILCONFIG_H #define _MAILCONFIG_H char *CfgGetRootPath(char *pszPath, int iMaxPath); char *CfgGetBasedPath(const char *pszFullPath, char *pszBasePath, int iMaxPath); char *CfgGetFullPath(const char *pszRelativePath, char *pszFullPath, int iMaxPath); #endif xmail-1.27/SendMail.cpp0000644000175000017500000004543411341640430014235 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #if defined(WIN32) #include #include #include #include #include #include #include #include #include "AppDefines.h" #define SYS_SLASH_CHAR '\\' #define SYS_SLASH_STR "\\" #define SYS_MAX_PATH 256 #define SysSNPrintf _snprintf #define Sign(v) (((v) < 0) ? -1: +1) #define Min(a, b) (((a) < (b)) ? (a): (b)) #define Max(a, b) (((a) > (b)) ? (a): (b)) #define Abs(v) (((v) > 0) ? (v): -(v)) int SysFileSync(FILE * pFile) { if (fflush(pFile) || _commit(_fileno(pFile))) return -1; return 0; } int SysPathExist(char const *pszPathName) { return _access(pszPathName, 0) == 0 ? 1: 0; } int SysMakeDir(char const *pszPathName) { return _mkdir(pszPathName) == 0 ? 1: 0; } int SysErrNo(void) { return errno; } char const *SysErrStr(void) { return strerror(errno); } unsigned long SysGetProcessId(void) { return (unsigned long) GetCurrentThreadId(); } int SysMoveFile(char const *pszOldName, char const *pszNewName) { if (!MoveFileEx (pszOldName, pszNewName, MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED)) return -1; return 0; } int SysGetHostName(char *pszHostName, int iNameSize) { DWORD dwSize = (DWORD) iNameSize; GetComputerName(pszHostName, &dwSize); return 0; } void SysMsSleep(int iMsTimeout) { Sleep(iMsTimeout); } char *SysGetEnv(char const *pszVarName) { HKEY hKey; char const *pszValue; char szRKeyPath[256]; sprintf(szRKeyPath, "SOFTWARE\\%s\\%s", APP_PRODUCER, APP_NAME_STR); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szRKeyPath, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { char szKeyValue[2048] = ""; DWORD dwSize = sizeof(szKeyValue), dwKeyType; if (RegQueryValueEx(hKey, pszVarName, NULL, &dwKeyType, (u_char *) szKeyValue, &dwSize) == ERROR_SUCCESS) { RegCloseKey(hKey); return strdup(szKeyValue); } RegCloseKey(hKey); } return (pszValue = getenv(pszVarName)) != NULL ? strdup(pszValue) : NULL; } char *SysGetUserAddress(char *pszUser, int iSize, char const *pszEnvDomain) { DWORD dwSize; char const *pszDomain; char szUser[256] = ""; char szDomain[256] = ""; dwSize = sizeof(szUser); GetUserName(szUser, &dwSize); if ((pszDomain = SysGetEnv(pszEnvDomain)) == NULL) { dwSize = sizeof(szDomain); GetComputerName(szDomain, &dwSize); pszDomain = szDomain; } SysSNPrintf(pszUser, iSize, "%s@%s", szUser, pszDomain); return pszUser; } #else // #if defined(WIN32) #if defined(__LINUX__) || defined(__SOLARIS__) || defined(__BSD__) #include #include #include #include #include #include #include #include #include #include #define SYS_SLASH_CHAR '/' #define SYS_SLASH_STR "/" #define SYS_MAX_PATH 256 #define SysSNPrintf snprintf #define stricmp strcasecmp #define strnicmp strncasecmp #define Sign(v) (((v) < 0) ? -1: +1) #define Min(a, b) (((a) < (b)) ? (a): (b)) #define Max(a, b) (((a) > (b)) ? (a): (b)) #define Abs(v) (((v) > 0) ? (v): -(v)) int SysFileSync(FILE * pFile) { if (fflush(pFile) || fsync(fileno(pFile))) return -1; return 0; } int SysPathExist(char const *pszPathName) { return access(pszPathName, 0) == 0 ? 1 : 0; } int SysMakeDir(char const *pszPathName) { return mkdir(pszPathName, 0700) == 0 ? 1 : 0; } int SysErrNo(void) { return errno; } char const *SysErrStr(void) { return strerror(errno); } unsigned long SysGetProcessId(void) { return (unsigned long) getpid(); } int SysMoveFile(char const *pszOldName, char const *pszNewName) { if (rename(pszOldName, pszNewName) != 0) return -1; return 0; } int SysGetHostName(char *pszHostName, int iNameSize) { gethostname(pszHostName, iNameSize); return 0; } void SysMsSleep(int iMsTimeout) { usleep(iMsTimeout * 1000); } char *SysGetEnv(char const *pszVarName) { char const *pszValue = getenv(pszVarName); return pszValue != NULL ? strdup(pszValue) : NULL; } char *SysGetUserAddress(char *pszUser, int iSize, char const *pszEnvDomain) { char const *pszEnv; char szUser[256] = "mail"; char szDomain[256] = "localhost"; if ((pszEnv = SysGetEnv("USER")) != NULL) { strncpy(szUser, pszEnv, sizeof(szUser) - 1); szUser[sizeof(szUser) - 1] = '\0'; } if ((pszEnv = SysGetEnv(pszEnvDomain)) != NULL || (pszEnv = SysGetEnv("HOSTNAME")) != NULL) { strncpy(szDomain, pszEnv, sizeof(szDomain) - 1); szDomain[sizeof(szDomain) - 1] = '\0'; } SysSNPrintf(pszUser, iSize, "%s@%s", szUser, szDomain); return pszUser; } #else // #if defined(__LINUX__) || defined(__SOLARIS__) #error system type not defined ! #endif // #if defined(__LINUX__) || defined(__SOLARIS__) #endif // #if defined(WIN32) #define ENV_MAIL_ROOT "MAIL_ROOT" #define LOCAL_TEMP_SUBPATH "spool" SYS_SLASH_STR "temp" SYS_SLASH_STR #define LOCAL_SUBPATH "spool" SYS_SLASH_STR "local" SYS_SLASH_STR #define MAIL_DATA_TAG "<>" #define MAX_ADDR_NAME 256 #define SAPE_OPEN_TENTATIVES 5 #define SAPE_OPEN_DELAY 500 #define ENV_DEFAULT_DOMAIN "DEFAULT_DOMAIN" #define ENV_USER "USER" #define SetEmptyString(s) (s)[0] = '\0' #define IsEmptyString(s) (*(s) == '\0') #define StrNCpy(t, s, n) do { strncpy(t, s, n); (t)[(n) - 1] = '\0'; } while (0) #define StrSNCpy(t, s) StrNCpy(t, s, sizeof(t)) static FILE *SafeOpenFile(char const *pszFilePath, char const *pszMode) { FILE *pFile; for (int i = 0; i < SAPE_OPEN_TENTATIVES; i++) { if ((pFile = fopen(pszFilePath, pszMode)) != NULL) return pFile; SysMsSleep(SAPE_OPEN_DELAY); } return NULL; } static char const *AddressFromAtPtr(char const *pszAt, char const *pszBase, char *pszAddress, int iSize) { int iAddrLength; char const *pszStart = pszAt, *pszEnd; for (; pszStart >= pszBase && strchr("<> \t,\":;'\r\n", *pszStart) == NULL; pszStart--); ++pszStart; for (pszEnd = pszAt + 1; *pszEnd != '\0' && strchr("<> \t,\":;'\r\n", *pszEnd) == NULL; pszEnd++); iAddrLength = Min((int) (pszEnd - pszStart), iSize - 1); strncpy(pszAddress, pszStart, iAddrLength); pszAddress[iAddrLength] = '\0'; return pszEnd; } static int EmitRecipients(FILE * pMailFile, char const *pszAddrList) { int iRcptCount = 0; char const *pszCurr = pszAddrList; for (; pszCurr != NULL && *pszCurr != '\0';) { char const *pszAt = strchr(pszCurr, '@'); char szAddress[256] = ""; if (pszAt == NULL) break; if ((pszCurr = AddressFromAtPtr(pszAt, pszAddrList, szAddress, sizeof(szAddress))) != NULL) { fprintf(pMailFile, "rcpt to:<%s>\r\n", szAddress); ++iRcptCount; } } return iRcptCount; } static int GetTime(struct tm &tmLocal, int &iDiffHours, int &iDiffMins, time_t tCurr) { if (tCurr == 0) time(&tCurr); tmLocal = *localtime(&tCurr); struct tm tmTimeLOC = tmLocal; struct tm tmTimeGM; tmTimeGM = *gmtime(&tCurr); tmTimeLOC.tm_isdst = 0; tmTimeGM.tm_isdst = 0; time_t tLocal = mktime(&tmTimeLOC); time_t tGM = mktime(&tmTimeGM); int iSecsDiff = (int) difftime(tLocal, tGM); int iSignDiff = Sign(iSecsDiff); int iMinutes = Abs(iSecsDiff) / 60; iDiffMins = iMinutes % 60; iDiffHours = iSignDiff * (iMinutes / 60); return 0; } char *MscStrftime(struct tm const *ptmTime, char *pszDateStr, int iSize) { static char const * const pszWDays[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; static char const * const pszMonths[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; SysSNPrintf(pszDateStr, iSize, "%s, %d %s %d %02d:%02d:%02d", pszWDays[ptmTime->tm_wday], ptmTime->tm_mday, pszMonths[ptmTime->tm_mon], ptmTime->tm_year + 1900, ptmTime->tm_hour, ptmTime->tm_min, ptmTime->tm_sec); return pszDateStr; } static int GetTimeStr(char *pszTimeStr, int iStringSize, time_t tCurr) { int iDiffHours = 0, iDiffMins = 0; struct tm tmTime; char szDiffTime[128]; GetTime(tmTime, iDiffHours, iDiffMins, tCurr); if (iDiffHours > 0) sprintf(szDiffTime, " +%02d%02d", iDiffHours, iDiffMins); else sprintf(szDiffTime, " -%02d%02d", -iDiffHours, iDiffMins); MscStrftime(&tmTime, pszTimeStr, iStringSize - strlen(szDiffTime) - 1); strcat(pszTimeStr, szDiffTime); return 0; } static char *CopyAddress(char *pszDest, char const *pszAddr, int iSize) { char *pszDomain; if (strchr(pszAddr, '@') != NULL || (pszDomain = SysGetEnv(ENV_DEFAULT_DOMAIN)) == NULL) StrNCpy(pszDest, pszAddr, iSize); else SysSNPrintf(pszDest, iSize, "%s@%s", pszAddr, pszDomain); return pszDest; } static bool IsRFC822HeaderLine(char const *pszLn) { char const *pszColon; if (!isalpha(*pszLn) || (pszColon = strchr(pszLn, ':')) == NULL) return false; for (pszLn++; pszLn < pszColon; pszLn++) if (!(isalpha(*pszLn) || isdigit(*pszLn) || strchr("_-", *pszLn) != NULL)) return false; return true; } int main(int iArgCount, char *pszArgs[]) { int iVarLength = 0; FILE *pInFile = stdin; char *pszMailRoot; char szMailRoot[SYS_MAX_PATH] = ""; /* Initialize time */ tzset(); if ((pszMailRoot = SysGetEnv(ENV_MAIL_ROOT)) == NULL || (iVarLength = strlen(pszMailRoot)) == 0) { free(pszMailRoot); fprintf(stderr, "cannot find environment variable: %s\n", ENV_MAIL_ROOT); return 1; } StrSNCpy(szMailRoot, pszMailRoot); if (szMailRoot[iVarLength - 1] != SYS_SLASH_CHAR) strcat(szMailRoot, SYS_SLASH_STR); free(pszMailRoot); /* Parse command line */ int i; bool bExtractRcpts = false, bXMailFormat = false, bDotMode = true; char szMailFrom[256] = "", szExtMailFrom[256] = ""; char szInputFile[SYS_MAX_PATH] = "", szRcptFile[SYS_MAX_PATH] = ""; SysGetUserAddress(szMailFrom, sizeof(szMailFrom) - 1, ENV_DEFAULT_DOMAIN); for (i = 1; i < iArgCount; i++) { if (strcmp(pszArgs[i], "--") == 0) { ++i; break; } if (strcmp(pszArgs[i], "--rcpt-file") == 0) { if (++i < iArgCount) StrSNCpy(szRcptFile, pszArgs[i]); } else if (strcmp(pszArgs[i], "--xinput-file") == 0) { if (++i < iArgCount) { StrSNCpy(szInputFile, pszArgs[i]); bXMailFormat = true; } } else if (strcmp(pszArgs[i], "--input-file") == 0) { if (++i < iArgCount) StrSNCpy(szInputFile, pszArgs[i]); } else if (strcmp(pszArgs[i], "-i") == 0 || strcmp(pszArgs[i], "-oi") == 0) { bDotMode = false; } else if (strcmp(pszArgs[i], "-t") == 0) { bExtractRcpts = true; } else if (strncmp(pszArgs[i], "-f", 2) == 0) { if (pszArgs[i][2] != '\0') CopyAddress(szMailFrom, pszArgs[i] + 2, sizeof(szMailFrom) - 1); else if ((i + 1) < iArgCount) { CopyAddress(szMailFrom, pszArgs[i + 1], sizeof(szMailFrom) - 1); i++; } } else if (strncmp(pszArgs[i], "-F", 2) == 0) { if (pszArgs[i][2] != '\0') StrSNCpy(szExtMailFrom, pszArgs[i] + 2); else if (i + 1 < iArgCount) { StrSNCpy(szExtMailFrom, pszArgs[i + 1]); i++; } char const *pszOpen = strchr(szExtMailFrom, '<'); if (pszOpen == NULL) CopyAddress(szMailFrom, szExtMailFrom, sizeof(szMailFrom) - 1); else { char szTmpMailFrom[256]; StrSNCpy(szTmpMailFrom, pszOpen + 1); char *pszClose = (char *) strchr(szTmpMailFrom, '>'); if (pszClose != NULL) *pszClose = '\0'; CopyAddress(szMailFrom, szTmpMailFrom, sizeof(szMailFrom) - 1); } } else if (strncmp(pszArgs[i], "-o", 2) == 0) { } else if (strcmp(pszArgs[i], "-L") == 0 || strcmp(pszArgs[i], "-O") == 0 || strcmp(pszArgs[i], "-R") == 0 || strcmp(pszArgs[i], "-X") == 0 || strcmp(pszArgs[i], "-V") == 0 || strcmp(pszArgs[i], "-N") == 0 || strncmp(pszArgs[i], "-qG", 3) == 0 || strncmp(pszArgs[i], "-q!", 3) == 0) { if (i + 1 < iArgCount) i++; } else break; } /* Save recipients index and counter */ int iRcptIndex, iRcptCount; iRcptIndex = Min(i, iArgCount); iRcptCount = iArgCount - iRcptIndex; /* Check if recipients are supplied */ if (!bExtractRcpts && iRcptCount == 0 && IsEmptyString(szRcptFile)) { fprintf(stderr, "empty recipient list\n"); return 2; } if (!IsEmptyString(szInputFile)) { if ((pInFile = fopen(szInputFile, "rb")) == NULL) { perror(szInputFile); return 3; } } /* Check if the sender is specified */ if (IsEmptyString(szMailFrom)) { char const *pszUser = SysGetEnv(ENV_USER); if (pszUser == NULL) pszUser = "postmaster"; CopyAddress(szMailFrom, pszUser, sizeof(szMailFrom) - 1); } /* Create file name */ char szHostName[256] = ""; char szDataFile[SYS_MAX_PATH], szMailFile[SYS_MAX_PATH]; SysGetHostName(szHostName, sizeof(szHostName) - 1); SysSNPrintf(szDataFile, sizeof(szDataFile), "%s%s%lu000.%lu.%s", szMailRoot, LOCAL_TEMP_SUBPATH, (unsigned long) time(NULL), SysGetProcessId(), szHostName); SysSNPrintf(szMailFile, sizeof(szMailFile), "%s.mail", szDataFile); /* Open raw data file */ FILE *pDataFile = fopen(szDataFile, "w+b"); if (pDataFile == NULL) { perror(szDataFile); if (pInFile != stdin) fclose(pInFile); return 4; } /* Open maildrop file */ FILE *pMailFile = fopen(szMailFile, "wb"); if (pMailFile == NULL) { perror(szMailFile); fclose(pDataFile), remove(szDataFile); if (pInFile != stdin) fclose(pInFile); return 5; } fprintf(pMailFile, "mail from:<%s>\r\n", szMailFrom); for (i = iRcptIndex; i < iArgCount; i++) { char szAddr[256]; CopyAddress(szAddr, pszArgs[i], sizeof(szAddr) - 1); fprintf(pMailFile, "rcpt to:<%s>\r\n", szAddr); } int iLine; bool bInHeaders = true, bHasFrom = false, bHasDate = false; bool bRcptSource = false, bNoEmit = false; char szBuffer[1536]; for (iLine = 0; fgets(szBuffer, sizeof(szBuffer) - 1, pInFile) != NULL; iLine++) { int iLineLength = strlen(szBuffer); for (; iLineLength > 0 && (szBuffer[iLineLength - 1] == '\r' || szBuffer[iLineLength - 1] == '\n'); iLineLength--); szBuffer[iLineLength] = '\0'; /* Is it time to stop reading ? */ if (bDotMode && strcmp(szBuffer, ".") == 0) break; /* Decode XMail spool file format */ if (bXMailFormat) { if (strcmp(szBuffer, MAIL_DATA_TAG) == 0) bXMailFormat = false; continue; } /* Extract mail from */ if (bInHeaders) { bool bStraightFile = false; if ((iLine == 0) && !IsRFC822HeaderLine(szBuffer)) bStraightFile = true; if (bStraightFile || iLineLength == 0) { bInHeaders = false; bNoEmit = false; /* Add mail from (if not present) */ if (!bHasFrom) { if (strlen(szExtMailFrom) != 0) fprintf(pDataFile, "From: %s\r\n", szExtMailFrom); else fprintf(pDataFile, "From: <%s>\r\n", szMailFrom); } /* Add date (if not present) */ if (!bHasDate) { char szDate[128] = ""; GetTimeStr(szDate, sizeof(szDate) - 1, time(NULL)); fprintf(pDataFile, "Date: %s\r\n", szDate); } if (bStraightFile) fprintf(pDataFile, "\r\n"); } if (szBuffer[0] == ' ' || szBuffer[0] == '\t') { if (bExtractRcpts && bRcptSource) { int iRcptCurr = EmitRecipients(pMailFile, szBuffer); if (iRcptCurr > 0) iRcptCount += iRcptCurr; } } else if (iLineLength > 0) { bNoEmit = (strnicmp(szBuffer, "Bcc:", 4) == 0); bRcptSource = strnicmp(szBuffer, "To:", 3) == 0 || strnicmp(szBuffer, "Cc:", 3) == 0 || strnicmp(szBuffer, "Bcc:", 4) == 0; if (bExtractRcpts && bRcptSource) { int iRcptCurr = EmitRecipients(pMailFile, szBuffer); if (iRcptCurr > 0) iRcptCount += iRcptCurr; } if (!bHasFrom && strnicmp(szBuffer, "From:", 5) == 0) bHasFrom = true; if (!bHasDate && strnicmp(szBuffer, "Date:", 5) == 0) bHasDate = true; } } if (!bNoEmit) fprintf(pDataFile, "%s\r\n", szBuffer); } if (pInFile != stdin) fclose(pInFile); /* Dump recipient file */ if (!IsEmptyString(szRcptFile)) { FILE *pRcptFile = SafeOpenFile(szRcptFile, "rb"); if (pRcptFile == NULL) { perror(szRcptFile); fclose(pDataFile), remove(szDataFile); fclose(pMailFile), remove(szMailFile); return 6; } while (fgets(szBuffer, sizeof(szBuffer) - 1, pRcptFile) != NULL) { int iLineLength = strlen(szBuffer); for (; iLineLength > 0 && (szBuffer[iLineLength - 1] == '\r' || szBuffer[iLineLength - 1] == '\n'); iLineLength--); szBuffer[iLineLength] = '\0'; if (iLineLength >= MAX_ADDR_NAME) continue; char *pszAt = strchr(szBuffer, '@'); if (pszAt == NULL) continue; char szRecipient[MAX_ADDR_NAME] = ""; if (AddressFromAtPtr(pszAt, szBuffer, szRecipient, sizeof(szRecipient)) != NULL) { fprintf(pMailFile, "rcpt to:<%s>\r\n", szRecipient); ++iRcptCount; } } fclose(pRcptFile); } if (iRcptCount == 0) { fprintf(stderr, "empty recipient list\n"); fclose(pDataFile), remove(szDataFile); fclose(pMailFile), remove(szMailFile); return 7; } /* Empty line separator between maildrop header and data */ fprintf(pMailFile, "\r\n"); /* Append data file */ rewind(pDataFile); unsigned int uReaded; do { if ((uReaded = fread(szBuffer, 1, sizeof(szBuffer), pDataFile)) != 0 && fwrite(szBuffer, 1, uReaded, pMailFile) != uReaded) { perror(szMailFile); fclose(pDataFile), remove(szDataFile); fclose(pMailFile), remove(szMailFile); return 8; } } while (uReaded == sizeof(szBuffer)); fclose(pDataFile), remove(szDataFile); /* Sync and close the mail file */ if (SysFileSync(pMailFile) < 0 || fclose(pMailFile)) { remove(szMailFile); fprintf(stderr, "cannot write file: %s\n", szMailFile); return 9; } /* Move the mail file */ char szDropFile[SYS_MAX_PATH]; SysSNPrintf(szDropFile, sizeof(szDropFile), "%s%s%lu000.%lu.%s", szMailRoot, LOCAL_SUBPATH, (unsigned long) time(NULL), SysGetProcessId(), szHostName); if (SysMoveFile(szMailFile, szDropFile) < 0) { remove(szMailFile); fprintf(stderr, "cannot move file: %s\n", szMailFile); return 10; } return 0; } xmail-1.27/POP3GwLink.cpp0000644000175000017500000005025411341640430014372 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "ResLocks.h" #include "StrUtils.h" #include "SList.h" #include "BuffSock.h" #include "MailConfig.h" #include "MessQueue.h" #include "MailSvr.h" #include "MiscUtils.h" #include "SvrUtils.h" #include "UsrUtils.h" #include "POP3GwLink.h" #define SVR_LINKS_FILE "pop3links.tab" #define SVR_LINKS_ENABLE_DIR "pop3links" #define SVR_POP3LOCKS_DIR "pop3linklocks" #define SVR_MSGSYNCDB_DIR "msgsync" #define LINKS_TABLE_LINE_MAX 2048 enum LinksFileds { lnkDomain = 0, lnkName, lnkRmtDomain, lnkRmtName, lnkRmtPassword, lnkAuthType, lnkMax }; struct GwLkDBScanData { char szTmpDBFile[SYS_MAX_PATH]; FILE *pDBFile; }; static char *GwLkGetTableFilePath(char *pszLnkFilePath, int iMaxPath) { CfgGetRootPath(pszLnkFilePath, iMaxPath); StrNCat(pszLnkFilePath, SVR_LINKS_FILE, iMaxPath); return pszLnkFilePath; } static char *GwLkEnableDir(char *pszEnableDir, int iMaxPath) { CfgGetRootPath(pszEnableDir, iMaxPath); StrNCat(pszEnableDir, SVR_LINKS_ENABLE_DIR, iMaxPath); return pszEnableDir; } static char *GwLkGetLocksDir(char *pszLocksDir, int iMaxPath) { CfgGetRootPath(pszLocksDir, iMaxPath); StrNCat(pszLocksDir, SVR_POP3LOCKS_DIR, iMaxPath); return pszLocksDir; } static char *GwLkGetMsgSyncDbDir(char *pszMsgSyncDir, int iMaxPath) { CfgGetRootPath(pszMsgSyncDir, iMaxPath); StrNCat(pszMsgSyncDir, SVR_MSGSYNCDB_DIR, iMaxPath); return pszMsgSyncDir; } static POP3Link *GwLkGetLinkFromStrings(char **ppszStrings) { int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount < lnkMax) return NULL; char szPassword[512] = ""; if (StrDeCrypt(ppszStrings[lnkRmtPassword], szPassword) == NULL) return NULL; POP3Link *pPopLnk = (POP3Link *) SysAlloc(sizeof(POP3Link)); if (pPopLnk == NULL) return NULL; pPopLnk->pszDomain = SysStrDup(ppszStrings[lnkDomain]); pPopLnk->pszName = SysStrDup(ppszStrings[lnkName]); pPopLnk->pszRmtDomain = SysStrDup(ppszStrings[lnkRmtDomain]); pPopLnk->pszRmtName = SysStrDup(ppszStrings[lnkRmtName]); pPopLnk->pszRmtPassword = SysStrDup(szPassword); pPopLnk->pszAuthType = SysStrDup(ppszStrings[lnkAuthType]); return pPopLnk; } POP3Link *GwLkAllocLink(char const *pszDomain, char const *pszName, char const *pszRmtDomain, char const *pszRmtName, char const *pszRmtPassword, char const *pszAuthType) { POP3Link *pPopLnk = (POP3Link *) SysAlloc(sizeof(POP3Link)); if (pPopLnk == NULL) return NULL; pPopLnk->pszDomain = (pszDomain != NULL) ? SysStrDup(pszDomain) : NULL; pPopLnk->pszName = (pszName != NULL) ? SysStrDup(pszName) : NULL; pPopLnk->pszRmtDomain = (pszRmtDomain != NULL) ? SysStrDup(pszRmtDomain) : NULL; pPopLnk->pszRmtName = (pszRmtName != NULL) ? SysStrDup(pszRmtName) : NULL; pPopLnk->pszRmtPassword = (pszRmtPassword != NULL) ? SysStrDup(pszRmtPassword) : NULL; pPopLnk->pszAuthType = (pszAuthType != NULL) ? SysStrDup(pszAuthType) : NULL; return pPopLnk; } void GwLkFreePOP3Link(POP3Link *pPopLnk) { SysFree(pPopLnk->pszDomain); SysFree(pPopLnk->pszName); SysFree(pPopLnk->pszRmtDomain); SysFree(pPopLnk->pszRmtName); SysFree(pPopLnk->pszRmtPassword); SysFree(pPopLnk->pszAuthType); SysFree(pPopLnk); } static int GwLkWriteLink(FILE *pLnkFile, POP3Link *pPopLnk) { /* Domain */ char *pszQuoted = StrQuote(pPopLnk->pszDomain, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pLnkFile, "%s\t", pszQuoted); SysFree(pszQuoted); /* Local user */ pszQuoted = StrQuote(pPopLnk->pszName, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pLnkFile, "%s\t", pszQuoted); SysFree(pszQuoted); /* Remote domain */ pszQuoted = StrQuote(pPopLnk->pszRmtDomain, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pLnkFile, "%s\t", pszQuoted); SysFree(pszQuoted); /* Remote user */ pszQuoted = StrQuote(pPopLnk->pszRmtName, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pLnkFile, "%s\t", pszQuoted); SysFree(pszQuoted); /* Remote password */ char szPassword[512] = ""; StrCrypt(pPopLnk->pszRmtPassword, szPassword); pszQuoted = StrQuote(szPassword, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pLnkFile, "%s\t", pszQuoted); SysFree(pszQuoted); /* Authentication type */ pszQuoted = StrQuote(pPopLnk->pszAuthType, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pLnkFile, "%s\n", pszQuoted); SysFree(pszQuoted); return 0; } int GwLkAddLink(POP3Link *pPopLnk) { char szLnkFilePath[SYS_MAX_PATH] = ""; GwLkGetTableFilePath(szLnkFilePath, sizeof(szLnkFilePath)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szLnkFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pLnkFile = fopen(szLnkFilePath, "r+t"); if (pLnkFile == NULL) { RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_LINKS_FILE_NOT_FOUND); return ERR_LINKS_FILE_NOT_FOUND; } char szLnkLine[LINKS_TABLE_LINE_MAX] = ""; while (MscGetConfigLine(szLnkLine, sizeof(szLnkLine) - 1, pLnkFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szLnkLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= lnkMax && stricmp(pPopLnk->pszDomain, ppszStrings[lnkDomain]) == 0 && stricmp(pPopLnk->pszName, ppszStrings[lnkName]) == 0 && stricmp(pPopLnk->pszRmtDomain, ppszStrings[lnkRmtDomain]) == 0 && stricmp(pPopLnk->pszRmtName, ppszStrings[lnkRmtName]) == 0) { StrFreeStrings(ppszStrings); fclose(pLnkFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_LINK_EXIST); return ERR_LINK_EXIST; } StrFreeStrings(ppszStrings); } fseek(pLnkFile, 0, SEEK_END); if (GwLkWriteLink(pLnkFile, pPopLnk) < 0) { fclose(pLnkFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_WRITE_LINKS_FILE); return ERR_WRITE_LINKS_FILE; } fclose(pLnkFile); RLckUnlockEX(hResLock); return 0; } static int GwLkGetDisableFilePath(POP3Link const *pPopLnk, char *pszEnableFile) { if (GwLkLocalDomain(pPopLnk)) { UserInfo *pUI = UsrGetUserByName(pPopLnk->pszDomain, pPopLnk->pszName); if (pUI == NULL) return ErrGetErrorCode(); char szUserPath[SYS_MAX_PATH] = ""; if (UsrGetUserPath(pUI, szUserPath, sizeof(szUserPath), 1) == NULL) { ErrorPush(); UsrFreeUserInfo(pUI); return ErrorPop(); } UsrFreeUserInfo(pUI); SysSNPrintf(pszEnableFile, SYS_MAX_PATH - 1, "%s%s@%s.disabled", szUserPath, pPopLnk->pszRmtName, pPopLnk->pszRmtDomain); } else { char szEnableDir[SYS_MAX_PATH] = ""; GwLkEnableDir(szEnableDir, sizeof(szEnableDir)); SysSNPrintf(pszEnableFile, SYS_MAX_PATH - 1, "%s%s%s@%s.disabled", szEnableDir, SYS_SLASH_STR, pPopLnk->pszRmtName, pPopLnk->pszRmtDomain); } return 0; } int GwLkRemoveLink(POP3Link *pPopLnk) { char szLnkFilePath[SYS_MAX_PATH] = ""; GwLkGetTableFilePath(szLnkFilePath, sizeof(szLnkFilePath)); char szTmpFile[SYS_MAX_PATH] = ""; UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szLnkFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pLnkFile = fopen(szLnkFilePath, "rt"); if (pLnkFile == NULL) { RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_LINKS_FILE_NOT_FOUND); return ERR_LINKS_FILE_NOT_FOUND; } FILE *pTmpFile = fopen(szTmpFile, "wt"); if (pTmpFile == NULL) { fclose(pLnkFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } int iLinksFound = 0; char szLnkLine[LINKS_TABLE_LINE_MAX] = ""; while (MscGetConfigLine(szLnkLine, sizeof(szLnkLine) - 1, pLnkFile, false) != NULL) { if (szLnkLine[0] == TAB_COMMENT_CHAR) { fprintf(pTmpFile, "%s\n", szLnkLine); continue; } char **ppszStrings = StrGetTabLineStrings(szLnkLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= lnkMax && stricmp(pPopLnk->pszDomain, ppszStrings[lnkDomain]) == 0 && stricmp(pPopLnk->pszName, ppszStrings[lnkName]) == 0 && stricmp(pPopLnk->pszRmtDomain, ppszStrings[lnkRmtDomain]) == 0 && stricmp(pPopLnk->pszRmtName, ppszStrings[lnkRmtName]) == 0) { ++iLinksFound; } else fprintf(pTmpFile, "%s\n", szLnkLine); StrFreeStrings(ppszStrings); } fclose(pLnkFile); fclose(pTmpFile); if (iLinksFound == 0) { SysRemove(szTmpFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_LINK_NOT_FOUND); return ERR_LINK_NOT_FOUND; } if (MscMoveFile(szTmpFile, szLnkFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } /* Remove the disable file if exist */ char szRmFilePath[SYS_MAX_PATH] = ""; if (GwLkGetDisableFilePath(pPopLnk, szRmFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } CheckRemoveFile(szRmFilePath); /* Remove the UIDL DB file for the account */ if (GwLkGetMsgSyncDbFile(pPopLnk->pszRmtDomain, pPopLnk->pszRmtName, szRmFilePath, sizeof(szRmFilePath) - 1) == 0) CheckRemoveFile(szRmFilePath); RLckUnlockEX(hResLock); return 0; } int GwLkRemoveUserLinks(const char *pszDomain, const char *pszName) { char szLnkFilePath[SYS_MAX_PATH] = ""; GwLkGetTableFilePath(szLnkFilePath, sizeof(szLnkFilePath)); char szTmpFile[SYS_MAX_PATH] = ""; UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szLnkFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) { ErrorPush(); CheckRemoveFile(szTmpFile); return ErrorPop(); } FILE *pLnkFile = fopen(szLnkFilePath, "rt"); if (pLnkFile == NULL) { RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_LINKS_FILE_NOT_FOUND); return ERR_LINKS_FILE_NOT_FOUND; } FILE *pTmpFile = fopen(szTmpFile, "wt"); if (pTmpFile == NULL) { fclose(pLnkFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } int iLinksFound = 0; char szLnkLine[LINKS_TABLE_LINE_MAX] = ""; while (MscGetConfigLine(szLnkLine, sizeof(szLnkLine) - 1, pLnkFile, false) != NULL) { if (szLnkLine[0] == TAB_COMMENT_CHAR) { fprintf(pTmpFile, "%s\n", szLnkLine); continue; } char **ppszStrings = StrGetTabLineStrings(szLnkLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= lnkMax && stricmp(pszDomain, ppszStrings[lnkDomain]) == 0 && stricmp(pszName, ppszStrings[lnkName]) == 0) { ++iLinksFound; } else fprintf(pTmpFile, "%s\n", szLnkLine); StrFreeStrings(ppszStrings); } fclose(pLnkFile); fclose(pTmpFile); if (iLinksFound == 0) { SysRemove(szTmpFile); RLckUnlockEX(hResLock); return 0; } if (MscMoveFile(szTmpFile, szLnkFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); return 0; } int GwLkRemoveDomainLinks(const char *pszDomain) { char szLnkFilePath[SYS_MAX_PATH] = ""; GwLkGetTableFilePath(szLnkFilePath, sizeof(szLnkFilePath)); char szTmpFile[SYS_MAX_PATH] = ""; UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szLnkFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) { ErrorPush(); CheckRemoveFile(szTmpFile); return ErrorPop(); } FILE *pLnkFile = fopen(szLnkFilePath, "rt"); if (pLnkFile == NULL) { RLckUnlockEX(hResLock); CheckRemoveFile(szTmpFile); ErrSetErrorCode(ERR_LINKS_FILE_NOT_FOUND); return ERR_LINKS_FILE_NOT_FOUND; } FILE *pTmpFile = fopen(szTmpFile, "wt"); if (pTmpFile == NULL) { fclose(pLnkFile); RLckUnlockEX(hResLock); CheckRemoveFile(szTmpFile); ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } int iLinksFound = 0; char szLnkLine[LINKS_TABLE_LINE_MAX] = ""; while (MscGetConfigLine(szLnkLine, sizeof(szLnkLine) - 1, pLnkFile, false) != NULL) { if (szLnkLine[0] == TAB_COMMENT_CHAR) { fprintf(pTmpFile, "%s\n", szLnkLine); continue; } char **ppszStrings = StrGetTabLineStrings(szLnkLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= lnkMax && stricmp(pszDomain, ppszStrings[lnkDomain]) == 0) { ++iLinksFound; } else fprintf(pTmpFile, "%s\n", szLnkLine); StrFreeStrings(ppszStrings); } fclose(pLnkFile); fclose(pTmpFile); if (iLinksFound == 0) { SysRemove(szTmpFile); RLckUnlockEX(hResLock); return 0; } if (MscMoveFile(szTmpFile, szLnkFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); return 0; } int GwLkGetDBFileSnapShot(const char *pszFileName) { char szGwLkFilePath[SYS_MAX_PATH] = ""; GwLkGetTableFilePath(szGwLkFilePath, sizeof(szGwLkFilePath)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szGwLkFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); if (MscCopyFile(pszFileName, szGwLkFilePath) < 0) { ErrorPush(); RLckUnlockSH(hResLock); return ErrorPop(); } RLckUnlockSH(hResLock); return 0; } GWLKF_HANDLE GwLkOpenDB(void) { GwLkDBScanData *pGLSD = (GwLkDBScanData *) SysAlloc(sizeof(GwLkDBScanData)); if (pGLSD == NULL) return INVALID_GWLKF_HANDLE; UsrGetTmpFile(NULL, pGLSD->szTmpDBFile, sizeof(pGLSD->szTmpDBFile)); if (GwLkGetDBFileSnapShot(pGLSD->szTmpDBFile) < 0) { SysFree(pGLSD); return INVALID_GWLKF_HANDLE; } if ((pGLSD->pDBFile = fopen(pGLSD->szTmpDBFile, "rt")) == NULL) { SysRemove(pGLSD->szTmpDBFile); SysFree(pGLSD); ErrSetErrorCode(ERR_FILE_OPEN); return INVALID_GWLKF_HANDLE; } return (GWLKF_HANDLE) pGLSD; } void GwLkCloseDB(GWLKF_HANDLE hLinksDB) { GwLkDBScanData *pGLSD = (GwLkDBScanData *) hLinksDB; fclose(pGLSD->pDBFile); SysRemove(pGLSD->szTmpDBFile); SysFree(pGLSD); } POP3Link *GwLkGetFirstUser(GWLKF_HANDLE hLinksDB) { GwLkDBScanData *pGLSD = (GwLkDBScanData *) hLinksDB; rewind(pGLSD->pDBFile); POP3Link *pPopLnk = NULL; char szLnkLine[LINKS_TABLE_LINE_MAX] = ""; while ((pPopLnk == NULL) && (MscGetConfigLine(szLnkLine, sizeof(szLnkLine) - 1, pGLSD->pDBFile) != NULL)) { char **ppszStrings = StrGetTabLineStrings(szLnkLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= lnkMax) pPopLnk = GwLkGetLinkFromStrings(ppszStrings); StrFreeStrings(ppszStrings); } return pPopLnk; } POP3Link *GwLkGetNextUser(GWLKF_HANDLE hLinksDB) { GwLkDBScanData *pGLSD = (GwLkDBScanData *) hLinksDB; POP3Link *pPopLnk = NULL; char szLnkLine[LINKS_TABLE_LINE_MAX] = ""; while (pPopLnk == NULL && MscGetConfigLine(szLnkLine, sizeof(szLnkLine) - 1, pGLSD->pDBFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szLnkLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= lnkMax) pPopLnk = GwLkGetLinkFromStrings(ppszStrings); StrFreeStrings(ppszStrings); } return pPopLnk; } static char *GwLkSanitizeFileName(char const *pszInName, char *pszOutName, int iOutSize) { int i; for (i = 0, iOutSize--; i < iOutSize && *pszInName != '\0'; i++, pszInName++) { switch (*pszInName) { case ':': case '/': case '\\': pszOutName[i] = '_'; break; default: pszOutName[i] = *pszInName; } } pszOutName[i] = '\0'; return pszOutName; } static char *GwLkGetLockFileName(POP3Link const *pPopLnk, char *pszLockFile) { char szLocksDir[SYS_MAX_PATH] = ""; char szRmtDomain[MAX_HOST_NAME] = ""; char szRmtName[MAX_HOST_NAME] = ""; GwLkGetLocksDir(szLocksDir, sizeof(szLocksDir)); GwLkSanitizeFileName(pPopLnk->pszRmtDomain, szRmtDomain, sizeof(szRmtDomain) - 1); GwLkSanitizeFileName(pPopLnk->pszRmtName, szRmtName, sizeof(szRmtName) - 1); SysSNPrintf(pszLockFile, SYS_MAX_PATH - 1, "%s%s%s@%s", szLocksDir, SYS_SLASH_STR, szRmtName, szRmtDomain); return pszLockFile; } int GwLkGetMsgSyncDbFile(char const *pszRmtDomain, char const *pszRmtName, char *pszMsgSyncFile, int iMaxPath) { char szMsgSyncDir[SYS_MAX_PATH] = ""; char szRmtDomain[MAX_HOST_NAME] = ""; char szRmtName[MAX_HOST_NAME] = ""; GwLkGetMsgSyncDbDir(szMsgSyncDir, sizeof(szMsgSyncDir)); GwLkSanitizeFileName(pszRmtDomain, szRmtDomain, sizeof(szRmtDomain) - 1); GwLkSanitizeFileName(pszRmtName, szRmtName, sizeof(szRmtName) - 1); SysSNPrintf(pszMsgSyncFile, iMaxPath, "%s%s%s", szMsgSyncDir, SYS_SLASH_STR, szRmtDomain); if (!SysExistDir(pszMsgSyncFile) && SysMakeDir(pszMsgSyncFile) < 0) return ErrGetErrorCode(); int iLength = strlen(pszMsgSyncFile); SysSNPrintf(pszMsgSyncFile + iLength, iMaxPath - iLength, SYS_SLASH_STR "%s.uidb", szRmtName); return 0; } int GwLkLinkLock(POP3Link const *pPopLnk) { char szLockFile[SYS_MAX_PATH] = ""; GwLkGetLockFileName(pPopLnk, szLockFile); return SysLockFile(szLockFile); } void GwLkLinkUnlock(POP3Link const *pPopLnk) { char szLockFile[SYS_MAX_PATH] = ""; GwLkGetLockFileName(pPopLnk, szLockFile); SysUnlockFile(szLockFile); } int GwLkClearLinkLocksDir(void) { char szLocksDir[SYS_MAX_PATH] = ""; GwLkGetLocksDir(szLocksDir, sizeof(szLocksDir)); return MscClearDirectory(szLocksDir); } int GwLkLocalDomain(POP3Link const *pPopLnk) { return ((pPopLnk != NULL && pPopLnk->pszDomain[0] != '@' && pPopLnk->pszDomain[0] != '?' && pPopLnk->pszDomain[0] != '&') ? 1: 0); } int GwLkMasqueradeDomain(POP3Link const *pPopLnk) { return ((pPopLnk != NULL && (pPopLnk->pszDomain[0] == '?' || pPopLnk->pszDomain[0] == '&')) ? 1: 0); } int GwLkCheckEnabled(POP3Link const *pPopLnk) { char szEnableFile[SYS_MAX_PATH] = ""; if (GwLkGetDisableFilePath(pPopLnk, szEnableFile) < 0) return ErrGetErrorCode(); if (SysExistFile(szEnableFile)) { ErrSetErrorCode(ERR_POP3_EXTERNAL_LINK_DISABLED); return ERR_POP3_EXTERNAL_LINK_DISABLED; } return 0; } int GwLkEnable(POP3Link const *pPopLnk, bool bEnable) { char szEnableFile[SYS_MAX_PATH] = ""; if (GwLkGetDisableFilePath(pPopLnk, szEnableFile) < 0) return ErrGetErrorCode(); if (bEnable) CheckRemoveFile(szEnableFile); else { FILE *pFile = fopen(szEnableFile, "wt"); if (pFile == NULL) { ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } time_t tCurr; time(&tCurr); struct tm tmTime; char szTime[256] = ""; SysLocalTime(&tCurr, &tmTime); strftime(szTime, sizeof(szTime), "%d %b %Y %H:%M:%S %Z", &tmTime); fprintf(pFile, "%s\n", szTime); fclose(pFile); } return 0; } int GwLkEnable(char const *pszDomain, char const *pszName, char const *pszRmtDomain, char const *pszRmtName, bool bEnable) { GWLKF_HANDLE hLinksDB = GwLkOpenDB(); if (hLinksDB == INVALID_GWLKF_HANDLE) return ErrGetErrorCode(); int iMatchingUsers = 0; POP3Link *pPopLnk = GwLkGetFirstUser(hLinksDB); for (; pPopLnk != NULL; pPopLnk = GwLkGetNextUser(hLinksDB)) { if (stricmp(pPopLnk->pszDomain, pszDomain) == 0 && stricmp(pPopLnk->pszName, pszName) == 0 && (pszRmtDomain == NULL || stricmp(pPopLnk->pszRmtDomain, pszRmtDomain) == 0) && (pszRmtName == NULL || stricmp(pPopLnk->pszRmtName, pszRmtName) == 0)) { GwLkEnable(pPopLnk, bEnable); ++iMatchingUsers; } GwLkFreePOP3Link(pPopLnk); } GwLkCloseDB(hLinksDB); if (iMatchingUsers == 0) { ErrSetErrorCode(ERR_LINK_NOT_FOUND); return ERR_LINK_NOT_FOUND; } return 0; } xmail-1.27/win32ssl/0000755000175000017500000000000011341640430013507 5ustar davidedavidexmail-1.27/win32ssl/lib/0000755000175000017500000000000011341640430014255 5ustar davidedavidexmail-1.27/win32ssl/lib/ssleay32.lib0000755000175000017500000014730211341640430016424 0ustar davidedavide! / 1261339789 0 12964 ` ½eÖhi<jjjøjøkrkrkÜkÜlNlNlÄlÄm4m4m¨m¨nnnˆnˆnünüororoäoäpVpVpÌpÌqJqJqÊqÊr:r:r®r®s s s”s”t t txtxtîtîuZuZuÐuÐvJvJvÄvÄw6w6w®w®x&x&x x yyyŒyŒzzzzzzzözö{`{`{Ö{Ö|L|L|Â|Â}<}<}²}²~(~(~¢~¢ˆˆ€€€~€~€ø€ørrðð‚n‚n‚ê‚êƒfƒfƒìƒì„l„l„Þ„Þ…\…\…Ô…Ô†L†L†¾†¾‡8‡8‡¶‡¶ˆ,ˆ,ˆžˆž‰‰‰”‰”ŠŠЀЀŠòŠò‹j‹j‹à‹àŒZŒZŒÔŒÔLLÊÊŽHŽH޾޾::¼¼88¦¦‘‘‘Œ‘Œ’’’z’z’î’î“d“d“Ô“Ô”B”B”²”²•&•&•œ•œ–––†–†–ð–ð—`—`—â—â˜d˜d˜Ø˜Ø™R™R™Æ™Æš@š@š°š°›$›$›Œ›Œ›ö›öœhœhœÐœÐ@@¦¦žžž|ž|žìžìŸZŸZŸÌŸÌ > > ¬ ¬¡"¡"¡˜¡˜¢¢¢Š¢Š£££l£l£Ú£Ú¤\¤\¤Ð¤Ð¥:¥:¥ª¥ª¦¦¦”¦”§ § §€§€§ò§ò¨h¨h¨Ô¨Ô©F©F©°©°ª"ª"ª˜ª˜«««|«|«ì«ì¬^¬^¬Ô¬Ô­H­H­º­º®.®.®œ®œ¯¯¯r¯r¯ì¯ì°\°\°Ò°Ò±H±H±®±®²²²€²€²è²è³V³V³Ì³Ì´<´<´²´²µ µ µ”µ”µþµþ¶p¶p¶æ¶æ·Z·Z·È·È¸2¸2¸¬¸¬¹ ¹ ¹”¹”ºººxºxºêºê»T»T»Â»Â¼<¼<¼¬¼¬½½½”½”¾ ¾ ¾„¾„¾ð¾ð¿^¿^¿Ò¿ÒÀFÀFÀ°À°ÁÁÁ„Á„ÁôÁôÂhÂhÂÚÂÚÃPÃPÃÆÃÆÄ:Ä:Ä´Ä´Å.Å.Å Å ÆÆÆÆÆúÆúÇbÇbÇÊÇÊÈ>È>ȪȪÉÉÉÉÉüÉüÊnÊnÊàÊàËLËL˾˾Ì0Ì0̜̜ÍÍÍ|Í|ÍêÎV__IMPORT_DESCRIPTOR_SSLEAY32__NULL_IMPORT_DESCRIPTORSSLEAY32_NULL_THUNK_DATA_BIO_f_ssl__imp__BIO_f_ssl_BIO_new_buffer_ssl_connect__imp__BIO_new_buffer_ssl_connect_BIO_new_ssl__imp__BIO_new_ssl_BIO_new_ssl_connect__imp__BIO_new_ssl_connect_BIO_ssl_copy_session_id__imp__BIO_ssl_copy_session_id_BIO_ssl_shutdown__imp__BIO_ssl_shutdown_DTLSv1_client_method__imp__DTLSv1_client_method_DTLSv1_method__imp__DTLSv1_method_DTLSv1_server_method__imp__DTLSv1_server_method_ERR_load_SSL_strings__imp__ERR_load_SSL_strings_SSL_CIPHER_description__imp__SSL_CIPHER_description_SSL_CIPHER_get_bits__imp__SSL_CIPHER_get_bits_SSL_CIPHER_get_name__imp__SSL_CIPHER_get_name_SSL_CIPHER_get_version__imp__SSL_CIPHER_get_version_SSL_COMP_add_compression_method__imp__SSL_COMP_add_compression_method_SSL_COMP_get_compression_methods__imp__SSL_COMP_get_compression_methods_SSL_COMP_get_name__imp__SSL_COMP_get_name_SSL_CTX_add_client_CA__imp__SSL_CTX_add_client_CA_SSL_CTX_add_session__imp__SSL_CTX_add_session_SSL_CTX_callback_ctrl__imp__SSL_CTX_callback_ctrl_SSL_CTX_check_private_key__imp__SSL_CTX_check_private_key_SSL_CTX_ctrl__imp__SSL_CTX_ctrl_SSL_CTX_flush_sessions__imp__SSL_CTX_flush_sessions_SSL_CTX_free__imp__SSL_CTX_free_SSL_CTX_get_cert_store__imp__SSL_CTX_get_cert_store_SSL_CTX_get_client_CA_list__imp__SSL_CTX_get_client_CA_list_SSL_CTX_get_client_cert_cb__imp__SSL_CTX_get_client_cert_cb_SSL_CTX_get_ex_data__imp__SSL_CTX_get_ex_data_SSL_CTX_get_ex_new_index__imp__SSL_CTX_get_ex_new_index_SSL_CTX_get_info_callback__imp__SSL_CTX_get_info_callback_SSL_CTX_get_quiet_shutdown__imp__SSL_CTX_get_quiet_shutdown_SSL_CTX_get_timeout__imp__SSL_CTX_get_timeout_SSL_CTX_get_verify_callback__imp__SSL_CTX_get_verify_callback_SSL_CTX_get_verify_depth__imp__SSL_CTX_get_verify_depth_SSL_CTX_get_verify_mode__imp__SSL_CTX_get_verify_mode_SSL_CTX_load_verify_locations__imp__SSL_CTX_load_verify_locations_SSL_CTX_new__imp__SSL_CTX_new_SSL_CTX_remove_session__imp__SSL_CTX_remove_session_SSL_CTX_sess_get_get_cb__imp__SSL_CTX_sess_get_get_cb_SSL_CTX_sess_get_new_cb__imp__SSL_CTX_sess_get_new_cb_SSL_CTX_sess_get_remove_cb__imp__SSL_CTX_sess_get_remove_cb_SSL_CTX_sess_set_get_cb__imp__SSL_CTX_sess_set_get_cb_SSL_CTX_sess_set_new_cb__imp__SSL_CTX_sess_set_new_cb_SSL_CTX_sess_set_remove_cb__imp__SSL_CTX_sess_set_remove_cb_SSL_CTX_sessions__imp__SSL_CTX_sessions_SSL_CTX_set_cert_store__imp__SSL_CTX_set_cert_store_SSL_CTX_set_cert_verify_callback__imp__SSL_CTX_set_cert_verify_callback_SSL_CTX_set_cipher_list__imp__SSL_CTX_set_cipher_list_SSL_CTX_set_client_CA_list__imp__SSL_CTX_set_client_CA_list_SSL_CTX_set_client_cert_cb__imp__SSL_CTX_set_client_cert_cb_SSL_CTX_set_client_cert_engine__imp__SSL_CTX_set_client_cert_engine_SSL_CTX_set_cookie_generate_cb__imp__SSL_CTX_set_cookie_generate_cb_SSL_CTX_set_cookie_verify_cb__imp__SSL_CTX_set_cookie_verify_cb_SSL_CTX_set_default_passwd_cb__imp__SSL_CTX_set_default_passwd_cb_SSL_CTX_set_default_passwd_cb_userdata__imp__SSL_CTX_set_default_passwd_cb_userdata_SSL_CTX_set_default_verify_paths__imp__SSL_CTX_set_default_verify_paths_SSL_CTX_set_ex_data__imp__SSL_CTX_set_ex_data_SSL_CTX_set_generate_session_id__imp__SSL_CTX_set_generate_session_id_SSL_CTX_set_info_callback__imp__SSL_CTX_set_info_callback_SSL_CTX_set_msg_callback__imp__SSL_CTX_set_msg_callback_SSL_CTX_set_purpose__imp__SSL_CTX_set_purpose_SSL_CTX_set_quiet_shutdown__imp__SSL_CTX_set_quiet_shutdown_SSL_CTX_set_session_id_context__imp__SSL_CTX_set_session_id_context_SSL_CTX_set_ssl_version__imp__SSL_CTX_set_ssl_version_SSL_CTX_set_timeout__imp__SSL_CTX_set_timeout_SSL_CTX_set_tmp_dh_callback__imp__SSL_CTX_set_tmp_dh_callback_SSL_CTX_set_tmp_ecdh_callback__imp__SSL_CTX_set_tmp_ecdh_callback_SSL_CTX_set_tmp_rsa_callback__imp__SSL_CTX_set_tmp_rsa_callback_SSL_CTX_set_trust__imp__SSL_CTX_set_trust_SSL_CTX_set_verify__imp__SSL_CTX_set_verify_SSL_CTX_set_verify_depth__imp__SSL_CTX_set_verify_depth_SSL_CTX_use_PrivateKey__imp__SSL_CTX_use_PrivateKey_SSL_CTX_use_PrivateKey_ASN1__imp__SSL_CTX_use_PrivateKey_ASN1_SSL_CTX_use_PrivateKey_file__imp__SSL_CTX_use_PrivateKey_file_SSL_CTX_use_RSAPrivateKey__imp__SSL_CTX_use_RSAPrivateKey_SSL_CTX_use_RSAPrivateKey_ASN1__imp__SSL_CTX_use_RSAPrivateKey_ASN1_SSL_CTX_use_RSAPrivateKey_file__imp__SSL_CTX_use_RSAPrivateKey_file_SSL_CTX_use_certificate__imp__SSL_CTX_use_certificate_SSL_CTX_use_certificate_ASN1__imp__SSL_CTX_use_certificate_ASN1_SSL_CTX_use_certificate_chain_file__imp__SSL_CTX_use_certificate_chain_file_SSL_CTX_use_certificate_file__imp__SSL_CTX_use_certificate_file_SSL_SESSION_cmp__imp__SSL_SESSION_cmp_SSL_SESSION_free__imp__SSL_SESSION_free_SSL_SESSION_get_ex_data__imp__SSL_SESSION_get_ex_data_SSL_SESSION_get_ex_new_index__imp__SSL_SESSION_get_ex_new_index_SSL_SESSION_get_id__imp__SSL_SESSION_get_id_SSL_SESSION_get_time__imp__SSL_SESSION_get_time_SSL_SESSION_get_timeout__imp__SSL_SESSION_get_timeout_SSL_SESSION_hash__imp__SSL_SESSION_hash_SSL_SESSION_new__imp__SSL_SESSION_new_SSL_SESSION_print__imp__SSL_SESSION_print_SSL_SESSION_print_fp__imp__SSL_SESSION_print_fp_SSL_SESSION_set_ex_data__imp__SSL_SESSION_set_ex_data_SSL_SESSION_set_time__imp__SSL_SESSION_set_time_SSL_SESSION_set_timeout__imp__SSL_SESSION_set_timeout_SSL_accept__imp__SSL_accept_SSL_add_client_CA__imp__SSL_add_client_CA_SSL_add_dir_cert_subjects_to_stack__imp__SSL_add_dir_cert_subjects_to_stack_SSL_add_file_cert_subjects_to_stack__imp__SSL_add_file_cert_subjects_to_stack_SSL_alert_desc_string__imp__SSL_alert_desc_string_SSL_alert_desc_string_long__imp__SSL_alert_desc_string_long_SSL_alert_type_string__imp__SSL_alert_type_string_SSL_alert_type_string_long__imp__SSL_alert_type_string_long_SSL_callback_ctrl__imp__SSL_callback_ctrl_SSL_check_private_key__imp__SSL_check_private_key_SSL_clear__imp__SSL_clear_SSL_connect__imp__SSL_connect_SSL_copy_session_id__imp__SSL_copy_session_id_SSL_ctrl__imp__SSL_ctrl_SSL_do_handshake__imp__SSL_do_handshake_SSL_dup__imp__SSL_dup_SSL_dup_CA_list__imp__SSL_dup_CA_list_SSL_free__imp__SSL_free_SSL_get1_session__imp__SSL_get1_session_SSL_get_SSL_CTX__imp__SSL_get_SSL_CTX_SSL_get_certificate__imp__SSL_get_certificate_SSL_get_cipher_list__imp__SSL_get_cipher_list_SSL_get_ciphers__imp__SSL_get_ciphers_SSL_get_client_CA_list__imp__SSL_get_client_CA_list_SSL_get_current_cipher__imp__SSL_get_current_cipher_SSL_get_current_compression__imp__SSL_get_current_compression_SSL_get_current_expansion__imp__SSL_get_current_expansion_SSL_get_default_timeout__imp__SSL_get_default_timeout_SSL_get_error__imp__SSL_get_error_SSL_get_ex_data__imp__SSL_get_ex_data_SSL_get_ex_data_X509_STORE_CTX_idx__imp__SSL_get_ex_data_X509_STORE_CTX_idx_SSL_get_ex_new_index__imp__SSL_get_ex_new_index_SSL_get_fd__imp__SSL_get_fd_SSL_get_finished__imp__SSL_get_finished_SSL_get_info_callback__imp__SSL_get_info_callback_SSL_get_peer_cert_chain__imp__SSL_get_peer_cert_chain_SSL_get_peer_certificate__imp__SSL_get_peer_certificate_SSL_get_peer_finished__imp__SSL_get_peer_finished_SSL_get_privatekey__imp__SSL_get_privatekey_SSL_get_quiet_shutdown__imp__SSL_get_quiet_shutdown_SSL_get_rbio__imp__SSL_get_rbio_SSL_get_read_ahead__imp__SSL_get_read_ahead_SSL_get_rfd__imp__SSL_get_rfd_SSL_get_servername__imp__SSL_get_servername_SSL_get_servername_type__imp__SSL_get_servername_type_SSL_get_session__imp__SSL_get_session_SSL_get_shared_ciphers__imp__SSL_get_shared_ciphers_SSL_get_shutdown__imp__SSL_get_shutdown_SSL_get_ssl_method__imp__SSL_get_ssl_method_SSL_get_verify_callback__imp__SSL_get_verify_callback_SSL_get_verify_depth__imp__SSL_get_verify_depth_SSL_get_verify_mode__imp__SSL_get_verify_mode_SSL_get_verify_result__imp__SSL_get_verify_result_SSL_get_version__imp__SSL_get_version_SSL_get_wbio__imp__SSL_get_wbio_SSL_get_wfd__imp__SSL_get_wfd_SSL_has_matching_session_id__imp__SSL_has_matching_session_id_SSL_library_init__imp__SSL_library_init_SSL_load_client_CA_file__imp__SSL_load_client_CA_file_SSL_load_error_strings__imp__SSL_load_error_strings_SSL_new__imp__SSL_new_SSL_peek__imp__SSL_peek_SSL_pending__imp__SSL_pending_SSL_read__imp__SSL_read_SSL_renegotiate__imp__SSL_renegotiate_SSL_renegotiate_pending__imp__SSL_renegotiate_pending_SSL_rstate_string__imp__SSL_rstate_string_SSL_rstate_string_long__imp__SSL_rstate_string_long_SSL_set_SSL_CTX__imp__SSL_set_SSL_CTX_SSL_set_accept_state__imp__SSL_set_accept_state_SSL_set_bio__imp__SSL_set_bio_SSL_set_cipher_list__imp__SSL_set_cipher_list_SSL_set_client_CA_list__imp__SSL_set_client_CA_list_SSL_set_connect_state__imp__SSL_set_connect_state_SSL_set_ex_data__imp__SSL_set_ex_data_SSL_set_fd__imp__SSL_set_fd_SSL_set_generate_session_id__imp__SSL_set_generate_session_id_SSL_set_info_callback__imp__SSL_set_info_callback_SSL_set_msg_callback__imp__SSL_set_msg_callback_SSL_set_purpose__imp__SSL_set_purpose_SSL_set_quiet_shutdown__imp__SSL_set_quiet_shutdown_SSL_set_read_ahead__imp__SSL_set_read_ahead_SSL_set_rfd__imp__SSL_set_rfd_SSL_set_session__imp__SSL_set_session_SSL_set_session_id_context__imp__SSL_set_session_id_context_SSL_set_shutdown__imp__SSL_set_shutdown_SSL_set_ssl_method__imp__SSL_set_ssl_method_SSL_set_tmp_dh_callback__imp__SSL_set_tmp_dh_callback_SSL_set_tmp_ecdh_callback__imp__SSL_set_tmp_ecdh_callback_SSL_set_tmp_rsa_callback__imp__SSL_set_tmp_rsa_callback_SSL_set_trust__imp__SSL_set_trust_SSL_set_verify__imp__SSL_set_verify_SSL_set_verify_depth__imp__SSL_set_verify_depth_SSL_set_verify_result__imp__SSL_set_verify_result_SSL_set_wfd__imp__SSL_set_wfd_SSL_shutdown__imp__SSL_shutdown_SSL_state__imp__SSL_state_SSL_state_string__imp__SSL_state_string_SSL_state_string_long__imp__SSL_state_string_long_SSL_use_PrivateKey__imp__SSL_use_PrivateKey_SSL_use_PrivateKey_ASN1__imp__SSL_use_PrivateKey_ASN1_SSL_use_PrivateKey_file__imp__SSL_use_PrivateKey_file_SSL_use_RSAPrivateKey__imp__SSL_use_RSAPrivateKey_SSL_use_RSAPrivateKey_ASN1__imp__SSL_use_RSAPrivateKey_ASN1_SSL_use_RSAPrivateKey_file__imp__SSL_use_RSAPrivateKey_file_SSL_use_certificate__imp__SSL_use_certificate_SSL_use_certificate_ASN1__imp__SSL_use_certificate_ASN1_SSL_use_certificate_file__imp__SSL_use_certificate_file_SSL_version__imp__SSL_version_SSL_want__imp__SSL_want_SSL_write__imp__SSL_write_SSLv23_client_method__imp__SSLv23_client_method_SSLv23_method__imp__SSLv23_method_SSLv23_server_method__imp__SSLv23_server_method_SSLv2_client_method__imp__SSLv2_client_method_SSLv2_method__imp__SSLv2_method_SSLv2_server_method__imp__SSLv2_server_method_SSLv3_client_method__imp__SSLv3_client_method_SSLv3_method__imp__SSLv3_method_SSLv3_server_method__imp__SSLv3_server_method_TLSv1_client_method__imp__TLSv1_client_method_TLSv1_method__imp__TLSv1_method_TLSv1_server_method__imp__TLSv1_server_method__imp__d2i_SSL_SESSION_d2i_SSL_SESSION__imp__i2d_SSL_SESSION_i2d_SSL_SESSION__imp__ssl2_ciphers__imp__ssl3_ciphers/ 1261339789 0 12978 ` áÖeh ¬ "¡˜¡¢Š¢£l£Ú£\¤Ð¤:¥ª¥¦”¦ §€§ò§h¨Ô¨F©°©"ª˜ª«|«ì«^¬Ô¬H­º­.®œ®¯r¯ì¯\°Ò°H±®±²€²è²V³Ì³<´²´ µ”µþµp¶æ¶Z·È·2¸¬¸ ¹”¹ºxºêºT»Â»<¼¬¼½”½ ¾„¾ð¾^¿Ò¿FÀ°ÀÁ„ÁôÁhÂÚÂPÃÆÃ:Ä´Ä.Å ÅÆÆúÆbÇÊÇ>ȪÈÉÉüÉnÊàÊL˾Ë0ÌœÌÍ|ÍêÍVν  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝ  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáÞß_BIO_f_ssl_BIO_new_buffer_ssl_connect_BIO_new_ssl_BIO_new_ssl_connect_BIO_ssl_copy_session_id_BIO_ssl_shutdown_DTLSv1_client_method_DTLSv1_method_DTLSv1_server_method_ERR_load_SSL_strings_SSL_CIPHER_description_SSL_CIPHER_get_bits_SSL_CIPHER_get_name_SSL_CIPHER_get_version_SSL_COMP_add_compression_method_SSL_COMP_get_compression_methods_SSL_COMP_get_name_SSL_CTX_add_client_CA_SSL_CTX_add_session_SSL_CTX_callback_ctrl_SSL_CTX_check_private_key_SSL_CTX_ctrl_SSL_CTX_flush_sessions_SSL_CTX_free_SSL_CTX_get_cert_store_SSL_CTX_get_client_CA_list_SSL_CTX_get_client_cert_cb_SSL_CTX_get_ex_data_SSL_CTX_get_ex_new_index_SSL_CTX_get_info_callback_SSL_CTX_get_quiet_shutdown_SSL_CTX_get_timeout_SSL_CTX_get_verify_callback_SSL_CTX_get_verify_depth_SSL_CTX_get_verify_mode_SSL_CTX_load_verify_locations_SSL_CTX_new_SSL_CTX_remove_session_SSL_CTX_sess_get_get_cb_SSL_CTX_sess_get_new_cb_SSL_CTX_sess_get_remove_cb_SSL_CTX_sess_set_get_cb_SSL_CTX_sess_set_new_cb_SSL_CTX_sess_set_remove_cb_SSL_CTX_sessions_SSL_CTX_set_cert_store_SSL_CTX_set_cert_verify_callback_SSL_CTX_set_cipher_list_SSL_CTX_set_client_CA_list_SSL_CTX_set_client_cert_cb_SSL_CTX_set_client_cert_engine_SSL_CTX_set_cookie_generate_cb_SSL_CTX_set_cookie_verify_cb_SSL_CTX_set_default_passwd_cb_SSL_CTX_set_default_passwd_cb_userdata_SSL_CTX_set_default_verify_paths_SSL_CTX_set_ex_data_SSL_CTX_set_generate_session_id_SSL_CTX_set_info_callback_SSL_CTX_set_msg_callback_SSL_CTX_set_purpose_SSL_CTX_set_quiet_shutdown_SSL_CTX_set_session_id_context_SSL_CTX_set_ssl_version_SSL_CTX_set_timeout_SSL_CTX_set_tmp_dh_callback_SSL_CTX_set_tmp_ecdh_callback_SSL_CTX_set_tmp_rsa_callback_SSL_CTX_set_trust_SSL_CTX_set_verify_SSL_CTX_set_verify_depth_SSL_CTX_use_PrivateKey_SSL_CTX_use_PrivateKey_ASN1_SSL_CTX_use_PrivateKey_file_SSL_CTX_use_RSAPrivateKey_SSL_CTX_use_RSAPrivateKey_ASN1_SSL_CTX_use_RSAPrivateKey_file_SSL_CTX_use_certificate_SSL_CTX_use_certificate_ASN1_SSL_CTX_use_certificate_chain_file_SSL_CTX_use_certificate_file_SSL_SESSION_cmp_SSL_SESSION_free_SSL_SESSION_get_ex_data_SSL_SESSION_get_ex_new_index_SSL_SESSION_get_id_SSL_SESSION_get_time_SSL_SESSION_get_timeout_SSL_SESSION_hash_SSL_SESSION_new_SSL_SESSION_print_SSL_SESSION_print_fp_SSL_SESSION_set_ex_data_SSL_SESSION_set_time_SSL_SESSION_set_timeout_SSL_accept_SSL_add_client_CA_SSL_add_dir_cert_subjects_to_stack_SSL_add_file_cert_subjects_to_stack_SSL_alert_desc_string_SSL_alert_desc_string_long_SSL_alert_type_string_SSL_alert_type_string_long_SSL_callback_ctrl_SSL_check_private_key_SSL_clear_SSL_connect_SSL_copy_session_id_SSL_ctrl_SSL_do_handshake_SSL_dup_SSL_dup_CA_list_SSL_free_SSL_get1_session_SSL_get_SSL_CTX_SSL_get_certificate_SSL_get_cipher_list_SSL_get_ciphers_SSL_get_client_CA_list_SSL_get_current_cipher_SSL_get_current_compression_SSL_get_current_expansion_SSL_get_default_timeout_SSL_get_error_SSL_get_ex_data_SSL_get_ex_data_X509_STORE_CTX_idx_SSL_get_ex_new_index_SSL_get_fd_SSL_get_finished_SSL_get_info_callback_SSL_get_peer_cert_chain_SSL_get_peer_certificate_SSL_get_peer_finished_SSL_get_privatekey_SSL_get_quiet_shutdown_SSL_get_rbio_SSL_get_read_ahead_SSL_get_rfd_SSL_get_servername_SSL_get_servername_type_SSL_get_session_SSL_get_shared_ciphers_SSL_get_shutdown_SSL_get_ssl_method_SSL_get_verify_callback_SSL_get_verify_depth_SSL_get_verify_mode_SSL_get_verify_result_SSL_get_version_SSL_get_wbio_SSL_get_wfd_SSL_has_matching_session_id_SSL_library_init_SSL_load_client_CA_file_SSL_load_error_strings_SSL_new_SSL_peek_SSL_pending_SSL_read_SSL_renegotiate_SSL_renegotiate_pending_SSL_rstate_string_SSL_rstate_string_long_SSL_set_SSL_CTX_SSL_set_accept_state_SSL_set_bio_SSL_set_cipher_list_SSL_set_client_CA_list_SSL_set_connect_state_SSL_set_ex_data_SSL_set_fd_SSL_set_generate_session_id_SSL_set_info_callback_SSL_set_msg_callback_SSL_set_purpose_SSL_set_quiet_shutdown_SSL_set_read_ahead_SSL_set_rfd_SSL_set_session_SSL_set_session_id_context_SSL_set_shutdown_SSL_set_ssl_method_SSL_set_tmp_dh_callback_SSL_set_tmp_ecdh_callback_SSL_set_tmp_rsa_callback_SSL_set_trust_SSL_set_verify_SSL_set_verify_depth_SSL_set_verify_result_SSL_set_wfd_SSL_shutdown_SSL_state_SSL_state_string_SSL_state_string_long_SSL_use_PrivateKey_SSL_use_PrivateKey_ASN1_SSL_use_PrivateKey_file_SSL_use_RSAPrivateKey_SSL_use_RSAPrivateKey_ASN1_SSL_use_RSAPrivateKey_file_SSL_use_certificate_SSL_use_certificate_ASN1_SSL_use_certificate_file_SSL_version_SSL_want_SSL_write_SSLv23_client_method_SSLv23_method_SSLv23_server_method_SSLv2_client_method_SSLv2_method_SSLv2_server_method_SSLv3_client_method_SSLv3_method_SSLv3_server_method_TLSv1_client_method_TLSv1_method_TLSv1_server_method__IMPORT_DESCRIPTOR_SSLEAY32__NULL_IMPORT_DESCRIPTOR__imp__BIO_f_ssl__imp__BIO_new_buffer_ssl_connect__imp__BIO_new_ssl__imp__BIO_new_ssl_connect__imp__BIO_ssl_copy_session_id__imp__BIO_ssl_shutdown__imp__DTLSv1_client_method__imp__DTLSv1_method__imp__DTLSv1_server_method__imp__ERR_load_SSL_strings__imp__SSL_CIPHER_description__imp__SSL_CIPHER_get_bits__imp__SSL_CIPHER_get_name__imp__SSL_CIPHER_get_version__imp__SSL_COMP_add_compression_method__imp__SSL_COMP_get_compression_methods__imp__SSL_COMP_get_name__imp__SSL_CTX_add_client_CA__imp__SSL_CTX_add_session__imp__SSL_CTX_callback_ctrl__imp__SSL_CTX_check_private_key__imp__SSL_CTX_ctrl__imp__SSL_CTX_flush_sessions__imp__SSL_CTX_free__imp__SSL_CTX_get_cert_store__imp__SSL_CTX_get_client_CA_list__imp__SSL_CTX_get_client_cert_cb__imp__SSL_CTX_get_ex_data__imp__SSL_CTX_get_ex_new_index__imp__SSL_CTX_get_info_callback__imp__SSL_CTX_get_quiet_shutdown__imp__SSL_CTX_get_timeout__imp__SSL_CTX_get_verify_callback__imp__SSL_CTX_get_verify_depth__imp__SSL_CTX_get_verify_mode__imp__SSL_CTX_load_verify_locations__imp__SSL_CTX_new__imp__SSL_CTX_remove_session__imp__SSL_CTX_sess_get_get_cb__imp__SSL_CTX_sess_get_new_cb__imp__SSL_CTX_sess_get_remove_cb__imp__SSL_CTX_sess_set_get_cb__imp__SSL_CTX_sess_set_new_cb__imp__SSL_CTX_sess_set_remove_cb__imp__SSL_CTX_sessions__imp__SSL_CTX_set_cert_store__imp__SSL_CTX_set_cert_verify_callback__imp__SSL_CTX_set_cipher_list__imp__SSL_CTX_set_client_CA_list__imp__SSL_CTX_set_client_cert_cb__imp__SSL_CTX_set_client_cert_engine__imp__SSL_CTX_set_cookie_generate_cb__imp__SSL_CTX_set_cookie_verify_cb__imp__SSL_CTX_set_default_passwd_cb__imp__SSL_CTX_set_default_passwd_cb_userdata__imp__SSL_CTX_set_default_verify_paths__imp__SSL_CTX_set_ex_data__imp__SSL_CTX_set_generate_session_id__imp__SSL_CTX_set_info_callback__imp__SSL_CTX_set_msg_callback__imp__SSL_CTX_set_purpose__imp__SSL_CTX_set_quiet_shutdown__imp__SSL_CTX_set_session_id_context__imp__SSL_CTX_set_ssl_version__imp__SSL_CTX_set_timeout__imp__SSL_CTX_set_tmp_dh_callback__imp__SSL_CTX_set_tmp_ecdh_callback__imp__SSL_CTX_set_tmp_rsa_callback__imp__SSL_CTX_set_trust__imp__SSL_CTX_set_verify__imp__SSL_CTX_set_verify_depth__imp__SSL_CTX_use_PrivateKey__imp__SSL_CTX_use_PrivateKey_ASN1__imp__SSL_CTX_use_PrivateKey_file__imp__SSL_CTX_use_RSAPrivateKey__imp__SSL_CTX_use_RSAPrivateKey_ASN1__imp__SSL_CTX_use_RSAPrivateKey_file__imp__SSL_CTX_use_certificate__imp__SSL_CTX_use_certificate_ASN1__imp__SSL_CTX_use_certificate_chain_file__imp__SSL_CTX_use_certificate_file__imp__SSL_SESSION_cmp__imp__SSL_SESSION_free__imp__SSL_SESSION_get_ex_data__imp__SSL_SESSION_get_ex_new_index__imp__SSL_SESSION_get_id__imp__SSL_SESSION_get_time__imp__SSL_SESSION_get_timeout__imp__SSL_SESSION_hash__imp__SSL_SESSION_new__imp__SSL_SESSION_print__imp__SSL_SESSION_print_fp__imp__SSL_SESSION_set_ex_data__imp__SSL_SESSION_set_time__imp__SSL_SESSION_set_timeout__imp__SSL_accept__imp__SSL_add_client_CA__imp__SSL_add_dir_cert_subjects_to_stack__imp__SSL_add_file_cert_subjects_to_stack__imp__SSL_alert_desc_string__imp__SSL_alert_desc_string_long__imp__SSL_alert_type_string__imp__SSL_alert_type_string_long__imp__SSL_callback_ctrl__imp__SSL_check_private_key__imp__SSL_clear__imp__SSL_connect__imp__SSL_copy_session_id__imp__SSL_ctrl__imp__SSL_do_handshake__imp__SSL_dup__imp__SSL_dup_CA_list__imp__SSL_free__imp__SSL_get1_session__imp__SSL_get_SSL_CTX__imp__SSL_get_certificate__imp__SSL_get_cipher_list__imp__SSL_get_ciphers__imp__SSL_get_client_CA_list__imp__SSL_get_current_cipher__imp__SSL_get_current_compression__imp__SSL_get_current_expansion__imp__SSL_get_default_timeout__imp__SSL_get_error__imp__SSL_get_ex_data__imp__SSL_get_ex_data_X509_STORE_CTX_idx__imp__SSL_get_ex_new_index__imp__SSL_get_fd__imp__SSL_get_finished__imp__SSL_get_info_callback__imp__SSL_get_peer_cert_chain__imp__SSL_get_peer_certificate__imp__SSL_get_peer_finished__imp__SSL_get_privatekey__imp__SSL_get_quiet_shutdown__imp__SSL_get_rbio__imp__SSL_get_read_ahead__imp__SSL_get_rfd__imp__SSL_get_servername__imp__SSL_get_servername_type__imp__SSL_get_session__imp__SSL_get_shared_ciphers__imp__SSL_get_shutdown__imp__SSL_get_ssl_method__imp__SSL_get_verify_callback__imp__SSL_get_verify_depth__imp__SSL_get_verify_mode__imp__SSL_get_verify_result__imp__SSL_get_version__imp__SSL_get_wbio__imp__SSL_get_wfd__imp__SSL_has_matching_session_id__imp__SSL_library_init__imp__SSL_load_client_CA_file__imp__SSL_load_error_strings__imp__SSL_new__imp__SSL_peek__imp__SSL_pending__imp__SSL_read__imp__SSL_renegotiate__imp__SSL_renegotiate_pending__imp__SSL_rstate_string__imp__SSL_rstate_string_long__imp__SSL_set_SSL_CTX__imp__SSL_set_accept_state__imp__SSL_set_bio__imp__SSL_set_cipher_list__imp__SSL_set_client_CA_list__imp__SSL_set_connect_state__imp__SSL_set_ex_data__imp__SSL_set_fd__imp__SSL_set_generate_session_id__imp__SSL_set_info_callback__imp__SSL_set_msg_callback__imp__SSL_set_purpose__imp__SSL_set_quiet_shutdown__imp__SSL_set_read_ahead__imp__SSL_set_rfd__imp__SSL_set_session__imp__SSL_set_session_id_context__imp__SSL_set_shutdown__imp__SSL_set_ssl_method__imp__SSL_set_tmp_dh_callback__imp__SSL_set_tmp_ecdh_callback__imp__SSL_set_tmp_rsa_callback__imp__SSL_set_trust__imp__SSL_set_verify__imp__SSL_set_verify_depth__imp__SSL_set_verify_result__imp__SSL_set_wfd__imp__SSL_shutdown__imp__SSL_state__imp__SSL_state_string__imp__SSL_state_string_long__imp__SSL_use_PrivateKey__imp__SSL_use_PrivateKey_ASN1__imp__SSL_use_PrivateKey_file__imp__SSL_use_RSAPrivateKey__imp__SSL_use_RSAPrivateKey_ASN1__imp__SSL_use_RSAPrivateKey_file__imp__SSL_use_certificate__imp__SSL_use_certificate_ASN1__imp__SSL_use_certificate_file__imp__SSL_version__imp__SSL_want__imp__SSL_write__imp__SSLv23_client_method__imp__SSLv23_method__imp__SSLv23_server_method__imp__SSLv2_client_method__imp__SSLv2_method__imp__SSLv2_server_method__imp__SSLv3_client_method__imp__SSLv3_method__imp__SSLv3_server_method__imp__TLSv1_client_method__imp__TLSv1_method__imp__TLSv1_server_method__imp__d2i_SSL_SESSION__imp__i2d_SSL_SESSION__imp__ssl2_ciphers__imp__ssl3_ciphers_d2i_SSL_SESSION_i2d_SSL_SESSIONSSLEAY32_NULL_THUNK_DATASSLEAY32.dll/ 1261339789 0 498 ` L„.K.debug$SBŒ@B.idata$2Îâ@0À.idata$6â@ À SSLEAY32.dll' xMicrosoft (R) LINK SSLEAY32.dll@comp.id x“ÿÿ.idata$2@Àh.idata$6.idata$4@Àh.idata$5@Àh!:T__IMPORT_DESCRIPTOR_SSLEAY32__NULL_IMPORT_DESCRIPTORSSLEAY32_NULL_THUNK_DATASSLEAY32.dll/ 1261339789 0 251 ` L„.Kº.debug$SBd@B.idata$3¦@0À SSLEAY32.dll' xMicrosoft (R) LINK@comp.id x“ÿÿ__NULL_IMPORT_DESCRIPTOR SSLEAY32.dll/ 1261339789 0 280 ` L„.KÖ.debug$SBŒ@B.idata$5Î@0À.idata$4Ò@0À SSLEAY32.dll' xMicrosoft (R) LINK@comp.id x“ÿÿSSLEAY32_NULL_THUNK_DATASSLEAY32.dll/ 1261339789 0 44 ` ÿÿL„.Ky_BIO_f_sslSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 61 ` ÿÿL„.K)­_BIO_new_buffer_ssl_connectSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 46 ` ÿÿL„.Kz_BIO_new_sslSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"®_BIO_new_ssl_connectSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&|_BIO_ssl_copy_session_idSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 51 ` ÿÿL„.Kƒ_BIO_ssl_shutdownSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 55 ` ÿÿL„.K# _DTLSv1_client_methodSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 48 ` ÿÿL„.K_DTLSv1_methodSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 55 ` ÿÿL„.K#_DTLSv1_server_methodSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 55 ` ÿÿL„.K#_ERR_load_SSL_stringsSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 57 ` ÿÿL„.K%_SSL_CIPHER_descriptionSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"€_SSL_CIPHER_get_bitsSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"‚_SSL_CIPHER_get_nameSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 57 ` ÿÿL„.K%_SSL_CIPHER_get_versionSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 66 ` ÿÿL„.K.¸_SSL_COMP_add_compression_methodSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 67 ` ÿÿL„.K/_SSL_COMP_get_compression_methodsSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 52 ` ÿÿL„.K _SSL_COMP_get_nameSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 56 ` ÿÿL„.K$_SSL_CTX_add_client_CASSLEAY32.dllSSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"_SSL_CTX_add_sessionSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 56 ` ÿÿL„.K$ó_SSL_CTX_callback_ctrlSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 60 ` ÿÿL„.K(_SSL_CTX_check_private_keySSLEAY32.dllSSLEAY32.dll/ 1261339789 0 47 ` ÿÿL„.K_SSL_CTX_ctrlSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 57 ` ÿÿL„.K%_SSL_CTX_flush_sessionsSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 47 ` ÿÿL„.K_SSL_CTX_freeSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 57 ` ÿÿL„.K%´_SSL_CTX_get_cert_storeSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 61 ` ÿÿL„.K) _SSL_CTX_get_client_CA_listSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 61 ` ÿÿL„.K) _SSL_CTX_get_client_cert_cbSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"Š_SSL_CTX_get_ex_dataSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 59 ` ÿÿL„.K'§_SSL_CTX_get_ex_new_indexSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 60 ` ÿÿL„.K(_SSL_CTX_get_info_callbackSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 61 ` ÿÿL„.K)Œ_SSL_CTX_get_quiet_shutdownSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"³_SSL_CTX_get_timeoutSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 62 ` ÿÿL„.K* _SSL_CTX_get_verify_callbackSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 59 ` ÿÿL„.K'ä_SSL_CTX_get_verify_depthSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K& _SSL_CTX_get_verify_modeSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 64 ` ÿÿL„.K,_SSL_CTX_load_verify_locationsSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 46 ` ÿÿL„.K _SSL_CTX_newSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 57 ` ÿÿL„.K% _SSL_CTX_remove_sessionSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&_SSL_CTX_sess_get_get_cbSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&_SSL_CTX_sess_get_new_cbSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 61 ` ÿÿL„.K)!_SSL_CTX_sess_get_remove_cbSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&_SSL_CTX_sess_set_get_cbSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&_SSL_CTX_sess_set_new_cbSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 61 ` ÿÿL„.K)_SSL_CTX_sess_set_remove_cbSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 51 ` ÿÿL„.Kõ_SSL_CTX_sessionsSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 57 ` ÿÿL„.K%µ_SSL_CTX_set_cert_storeSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 67 ` ÿÿL„.K/è_SSL_CTX_set_cert_verify_callbackSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&_SSL_CTX_set_cipher_listSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 61 ` ÿÿL„.K)_SSL_CTX_set_client_CA_listSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 61 ` ÿÿL„.K)_SSL_CTX_set_client_cert_cbSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 65 ` ÿÿL„.K-%_SSL_CTX_set_client_cert_engineSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 65 ` ÿÿL„.K-_SSL_CTX_set_cookie_generate_cbSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 63 ` ÿÿL„.K+_SSL_CTX_set_cookie_verify_cbSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 64 ` ÿÿL„.K,_SSL_CTX_set_default_passwd_cbSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 73 ` ÿÿL„.K5ë_SSL_CTX_set_default_passwd_cb_userdataSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 67 ` ÿÿL„.K/Ž_SSL_CTX_set_default_verify_pathsSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"_SSL_CTX_set_ex_dataSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 66 ` ÿÿL„.K._SSL_CTX_set_generate_session_idSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 60 ` ÿÿL„.K(_SSL_CTX_set_info_callbackSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 59 ` ÿÿL„.K' _SSL_CTX_set_msg_callbackSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"î_SSL_CTX_set_purposeSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 61 ` ÿÿL„.K)‘_SSL_CTX_set_quiet_shutdownSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 65 ` ÿÿL„.K-ç_SSL_CTX_set_session_id_contextSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&_SSL_CTX_set_ssl_versionSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"²_SSL_CTX_set_timeoutSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 62 ` ÿÿL„.K*°_SSL_CTX_set_tmp_dh_callbackSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 64 ` ÿÿL„.K, _SSL_CTX_set_tmp_ecdh_callbackSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 63 ` ÿÿL„.K+±_SSL_CTX_set_tmp_rsa_callbackSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 52 ` ÿÿL„.K í_SSL_CTX_set_trustSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 53 ` ÿÿL„.K!_SSL_CTX_set_verifySSLEAY32.dll SSLEAY32.dll/ 1261339789 0 59 ` ÿÿL„.K'á_SSL_CTX_set_verify_depthSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 57 ` ÿÿL„.K%_SSL_CTX_use_PrivateKeySSLEAY32.dll SSLEAY32.dll/ 1261339789 0 62 ` ÿÿL„.K*_SSL_CTX_use_PrivateKey_ASN1SSLEAY32.dllSSLEAY32.dll/ 1261339789 0 62 ` ÿÿL„.K*_SSL_CTX_use_PrivateKey_fileSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 60 ` ÿÿL„.K(_SSL_CTX_use_RSAPrivateKeySSLEAY32.dllSSLEAY32.dll/ 1261339789 0 65 ` ÿÿL„.K-_SSL_CTX_use_RSAPrivateKey_ASN1SSLEAY32.dll SSLEAY32.dll/ 1261339789 0 65 ` ÿÿL„.K-_SSL_CTX_use_RSAPrivateKey_fileSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&_SSL_CTX_use_certificateSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 63 ` ÿÿL„.K+_SSL_CTX_use_certificate_ASN1SSLEAY32.dll SSLEAY32.dll/ 1261339789 0 69 ` ÿÿL„.K1Þ_SSL_CTX_use_certificate_chain_fileSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 63 ` ÿÿL„.K+_SSL_CTX_use_certificate_fileSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 50 ` ÿÿL„.K„_SSL_SESSION_cmpSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 51 ` ÿÿL„.K_SSL_SESSION_freeSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&’_SSL_SESSION_get_ex_dataSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 63 ` ÿÿL„.K+¨_SSL_SESSION_get_ex_new_indexSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 53 ` ÿÿL„.K!_SSL_SESSION_get_idSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 55 ` ÿÿL„.K#†_SSL_SESSION_get_timeSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&ˆ_SSL_SESSION_get_timeoutSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 51 ` ÿÿL„.K…_SSL_SESSION_hashSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 50 ` ÿÿL„.K _SSL_SESSION_newSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 52 ` ÿÿL„.K !_SSL_SESSION_printSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 55 ` ÿÿL„.K#"_SSL_SESSION_print_fpSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&”_SSL_SESSION_set_ex_dataSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 55 ` ÿÿL„.K#‡_SSL_SESSION_set_timeSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&‰_SSL_SESSION_set_timeoutSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 45 ` ÿÿL„.K#_SSL_acceptSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 52 ` ÿÿL„.K $_SSL_add_client_CASSLEAY32.dllSSLEAY32.dll/ 1261339789 0 69 ` ÿÿL„.K1¼_SSL_add_dir_cert_subjects_to_stackSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 70 ` ÿÿL„.K2¹_SSL_add_file_cert_subjects_to_stackSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 56 ` ÿÿL„.K$%_SSL_alert_desc_stringSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 61 ` ÿÿL„.K)&_SSL_alert_desc_string_longSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 56 ` ÿÿL„.K$'_SSL_alert_type_stringSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 61 ` ÿÿL„.K)(_SSL_alert_type_string_longSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 52 ` ÿÿL„.K ô_SSL_callback_ctrlSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 56 ` ÿÿL„.K$)_SSL_check_private_keySSLEAY32.dllSSLEAY32.dll/ 1261339789 0 44 ` ÿÿL„.K*_SSL_clearSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 46 ` ÿÿL„.K+_SSL_connectSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K",_SSL_copy_session_idSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 43 ` ÿÿL„.K-_SSL_ctrlSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 51 ` ÿÿL„.K}_SSL_do_handshakeSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 42 ` ÿÿL„.K._SSL_dupSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 50 ` ÿÿL„.K/_SSL_dup_CA_listSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 43 ` ÿÿL„.K0_SSL_freeSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 51 ` ÿÿL„.Kò_SSL_get1_sessionSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 50 ` ÿÿL„.K–_SSL_get_SSL_CTXSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"1_SSL_get_certificateSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"4_SSL_get_cipher_listSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 50 ` ÿÿL„.K7_SSL_get_ciphersSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 57 ` ÿÿL„.K%8_SSL_get_client_CA_listSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 57 ` ÿÿL„.K%_SSL_get_current_cipherSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 62 ` ÿÿL„.K*_SSL_get_current_compressionSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 60 ` ÿÿL„.K(_SSL_get_current_expansionSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&9_SSL_get_default_timeoutSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 48 ` ÿÿL„.K:_SSL_get_errorSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 50 ` ÿÿL„.K—_SSL_get_ex_dataSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 69 ` ÿÿL„.K1¯_SSL_get_ex_data_X509_STORE_CTX_idxSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 55 ` ÿÿL„.K#©_SSL_get_ex_new_indexSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 45 ` ÿÿL„.K;_SSL_get_fdSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 51 ` ÿÿL„.Kð_SSL_get_finishedSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 56 ` ÿÿL„.K$¥_SSL_get_info_callbackSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&<_SSL_get_peer_cert_chainSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 59 ` ÿÿL„.K'=_SSL_get_peer_certificateSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 56 ` ÿÿL„.K$ñ_SSL_get_peer_finishedSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 53 ` ÿÿL„.K!~_SSL_get_privatekeySSLEAY32.dll SSLEAY32.dll/ 1261339789 0 57 ` ÿÿL„.K%™_SSL_get_quiet_shutdownSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 47 ` ÿÿL„.K?_SSL_get_rbioSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 53 ` ÿÿL„.K!@_SSL_get_read_aheadSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 46 ` ÿÿL„.Kö_SSL_get_rfdSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 53 ` ÿÿL„.K!#_SSL_get_servernameSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&$_SSL_get_servername_typeSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 50 ` ÿÿL„.Kš_SSL_get_sessionSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 57 ` ÿÿL„.K%A_SSL_get_shared_ciphersSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 51 ` ÿÿL„.K›_SSL_get_shutdownSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 53 ` ÿÿL„.K!B_SSL_get_ssl_methodSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&E_SSL_get_verify_callbackSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 55 ` ÿÿL„.K#å_SSL_get_verify_depthSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"F_SSL_get_verify_modeSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 56 ` ÿÿL„.K$_SSL_get_verify_resultSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 50 ` ÿÿL„.KG_SSL_get_versionSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 47 ` ÿÿL„.KH_SSL_get_wbioSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 46 ` ÿÿL„.K÷_SSL_get_wfdSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 62 ` ÿÿL„.K*ù_SSL_has_matching_session_idSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 51 ` ÿÿL„.K·_SSL_library_initSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&I_SSL_load_client_CA_fileSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 57 ` ÿÿL„.K%J_SSL_load_error_stringsSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 42 ` ÿÿL„.KK_SSL_newSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 43 ` ÿÿL„.KL_SSL_peekSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 46 ` ÿÿL„.KM_SSL_pendingSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 43 ` ÿÿL„.KN_SSL_readSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 50 ` ÿÿL„.KO_SSL_renegotiateSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K& _SSL_renegotiate_pendingSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 52 ` ÿÿL„.K P_SSL_rstate_stringSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 57 ` ÿÿL„.K%Q_SSL_rstate_string_longSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 50 ` ÿÿL„.K"_SSL_set_SSL_CTXSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 55 ` ÿÿL„.K#R_SSL_set_accept_stateSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 46 ` ÿÿL„.KS_SSL_set_bioSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"T_SSL_set_cipher_listSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 57 ` ÿÿL„.K%U_SSL_set_client_CA_listSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 56 ` ÿÿL„.K$V_SSL_set_connect_stateSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 50 ` ÿÿL„.Kž_SSL_set_ex_dataSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 45 ` ÿÿL„.KW_SSL_set_fdSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 62 ` ÿÿL„.K*_SSL_set_generate_session_idSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 56 ` ÿÿL„.K$ _SSL_set_info_callbackSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 55 ` ÿÿL„.K# _SSL_set_msg_callbackSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 50 ` ÿÿL„.Kì_SSL_set_purposeSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 57 ` ÿÿL„.K%¡_SSL_set_quiet_shutdownSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 53 ` ÿÿL„.K!X_SSL_set_read_aheadSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 46 ` ÿÿL„.KY_SSL_set_rfdSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 50 ` ÿÿL„.KZ_SSL_set_sessionSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 61 ` ÿÿL„.K)½_SSL_set_session_id_contextSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 51 ` ÿÿL„.K¢_SSL_set_shutdownSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 53 ` ÿÿL„.K![_SSL_set_ssl_methodSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&»_SSL_set_tmp_dh_callbackSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 60 ` ÿÿL„.K(_SSL_set_tmp_ecdh_callbackSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 59 ` ÿÿL„.K'º_SSL_set_tmp_rsa_callbackSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 48 ` ÿÿL„.Kï_SSL_set_trustSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 49 ` ÿÿL„.K^_SSL_set_verifySSLEAY32.dll SSLEAY32.dll/ 1261339789 0 55 ` ÿÿL„.K#â_SSL_set_verify_depthSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 56 ` ÿÿL„.K$£_SSL_set_verify_resultSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 46 ` ÿÿL„.K__SSL_set_wfdSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 47 ` ÿÿL„.K`_SSL_shutdownSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 44 ` ÿÿL„.K¦_SSL_stateSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 51 ` ÿÿL„.Ka_SSL_state_stringSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 56 ` ÿÿL„.K$b_SSL_state_string_longSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 53 ` ÿÿL„.K!c_SSL_use_PrivateKeySSLEAY32.dll SSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&d_SSL_use_PrivateKey_ASN1SSLEAY32.dllSSLEAY32.dll/ 1261339789 0 58 ` ÿÿL„.K&e_SSL_use_PrivateKey_fileSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 56 ` ÿÿL„.K$f_SSL_use_RSAPrivateKeySSLEAY32.dllSSLEAY32.dll/ 1261339789 0 61 ` ÿÿL„.K)g_SSL_use_RSAPrivateKey_ASN1SSLEAY32.dll SSLEAY32.dll/ 1261339789 0 61 ` ÿÿL„.K)h_SSL_use_RSAPrivateKey_fileSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"i_SSL_use_certificateSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 59 ` ÿÿL„.K'j_SSL_use_certificate_ASN1SSLEAY32.dll SSLEAY32.dll/ 1261339789 0 59 ` ÿÿL„.K'k_SSL_use_certificate_fileSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 46 ` ÿÿL„.K¤_SSL_versionSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 43 ` ÿÿL„.K¶_SSL_wantSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 44 ` ÿÿL„.Kl_SSL_writeSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 55 ` ÿÿL„.K#n_SSLv23_client_methodSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 48 ` ÿÿL„.Ko_SSLv23_methodSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 55 ` ÿÿL„.K#p_SSLv23_server_methodSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"q_SSLv2_client_methodSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 47 ` ÿÿL„.Kr_SSLv2_methodSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"s_SSLv2_server_methodSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"t_SSLv3_client_methodSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 47 ` ÿÿL„.Ku_SSLv3_methodSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"v_SSLv3_server_methodSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"¬_TLSv1_client_methodSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 47 ` ÿÿL„.Kª_TLSv1_methodSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 54 ` ÿÿL„.K"«_TLSv1_server_methodSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 50 ` ÿÿL„.Kw_d2i_SSL_SESSIONSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 50 ` ÿÿL„.Kx_i2d_SSL_SESSIONSSLEAY32.dllSSLEAY32.dll/ 1261339789 0 47 ` ÿÿL„.KÜ _ssl2_ciphersSSLEAY32.dll SSLEAY32.dll/ 1261339789 0 47 ` ÿÿL„.KÝ _ssl3_ciphersSSLEAY32.dll xmail-1.27/win32ssl/lib/libeay32.lib0000755000175000017500000244374211341640430016402 0ustar davidedavide! / 1261339772 0 163803 ` ¿Ft¬Q®Q®vvêê``ÒÒ@@²²""’’   z z ä ä R R ¼ ¼ * * œ œ   x x ê ê X X Ä Ä..¦¦||îîddÖÖLLÂÂ44¤¤„„øøjjÜÜNNÀÀ44¤¤––  „„þþvvôôjjÞÞTTÄÄ22ªªŒŒþþnnÞÞ N N ¾ ¾!,!,!œ!œ" " "~"~"ì"ì#X#X#Ä#Ä$6$6$¦$¦%%%‚%‚%ú%ú&n&n&â&â'X'X'Ì'Ì(@(@(´(´),),)¢)¢***Œ*Œ*ü*ü+n+n+à+à,P,P,Ä,Ä-<-<-°-°...Ž.Ž.ü.ü/n/n/Þ/Þ0Z0Z0Ì0Ì1B1B1°1°2 2 2”2”3x3x3 3 3è3è4^4^4Ú4Ú5Z5Z5Ì5Ì6<6<6°6°7"7"7’7’888t8t8â8â9P9P9¼9¼:(:(:–:–;;;~;~;ì;ì$>$=¸=¸>’>’???†?†?þ?þ@t@t@ì@ìAjAjAÜAÜBRBRBÂBÂC0C0C C DDD‚D‚DøDøElElEÞEÞFPFPFÆFÆG:G:G°G°H"H"H˜H˜III€I€IêIêJTJTJ¼J¼K.K.KžKžL L LxLxLâLâMNMNM¾M¾N.N.NžNžO O OzOzOêOêPZPZPÊPÊQ8Q8Q¤Q¤RRR„R„RöRöSbSbSÐSÐT>T>T®T®UUUUVVVrVrVâVâWLWLWºWºX,X,XžXžY Y YxYxYäYäZRZRZºZº[&[&[’[’\\\t\t\ä\ä]T]T]Æ]Æ^0^0^ª^ª_"_"_š_š```€`€`ò`òahahaÜaÜbPbPb¾b¾c.c.c˜c˜dddpdpdàdàeJeJe´e´fff†f†föfögdgdgÖgÖh>h>h¶h¶i2i2i¢i¢jjjŒjŒjþjþkvkvkÞkÞlHlHl²l²m m m’m’nnnpnpnÜnÜoHoHo´o´pppŠpŠpôpôqbqbqØqØrJrJr¶r¶sssŠsŠsþsþtntntâtâuPuPuÄuÄv2v2vžvžwww‚w‚wòwòxZxZxÄxÄy0y0yžyžz z zrzrzàzà{P{P{¾{¾|*|*|”|”}}}j}j}Ø}Ø~F~F~®~®€€îî€Ê€Ê€`€`44šš‚‚‚p‚p‚؂؃@ƒ@ƒ¨ƒ¨„„„|„|„è„è…V…V…¾…¾†(†(†††ú†ú‡f‡f‡Ì‡Ìˆ<ˆ<ˆ°ˆ°‰‰‰Œ‰Œ‰ø‰øŠjŠjŠÖŠÖ‹F‹F‹´‹´Œ Œ Œ˜Œ˜  ||êêŽXŽXŽÀŽÀ**––þþppææ‘^‘^‘ΑΒB’B’º’º“,“,“ “ ”””‚”‚”ú”ú•l•l•Ö•Ö–@–@–ª–ª———~—~—ê—ê˜V˜V˜À˜À™0™0™š™ššššvšvšèšè›V›V›È›Èœ6œ6œ¨œ¨ˆˆþþžxžxžæžæŸXŸXŸÈŸÈ < < ¬ ¬¡¡¡Œ¡Œ¡ü¡ü¢j¢j¢Ø¢Ø£N£N£¾£¾¤.¤.¤œ¤œ¥ ¥ ¥€¥€¥ô¥ô¦l¦l¦Ò¦Ò§<§<§¤§¤¨ ¨ ¨t¨t¨Ü¨Ü©D©D©²©²ªªª†ª†ªòªò«X«X«¾«¾¬&¬&¬Œ¬Œ¬ö¬ö­`­`­Æ­Æ®,®,®’®’¯¯¯j¯j¯Ú¯Ú°N°N°Ä°Ä±:±:±°±°²&²&²œ²œ³³³r³r³Ú³Ú´@´@´¬´¬µµµ„µ„µøµø¶n¶n·B·B¶Ú¶Ú·¬·¬¸¸¸‚¸‚¹\¹\¸ò¸ò¹Ì¹Ìº:º:º²º²»&»&»”»”¼¼¼Þ¼Þ½L½L¼r¼r½À½À¾2¾2¾œ¾œ¿¿¿„¿„¿î¿îÀXÀXÀÂÀÂÁ2Á2ÁœÁœÂÂÂjÂjÂÔÂÔÃ:Ã:èèÄÄĄĄÄòÄòÅ`Å`ÅÈÅÈÆ2Æ2Æ¢Æ¢Ç Ç ÇtÇtÇÞÇÞÈLÈLÈÀÈÀÉ&É&É’É’ÊfÊfÉþÉþÊÐÊÐË:Ë:˨˨ÌÌÌ~Ì~ÌäÌäÍJÍJÍ´Í´ÎÎÎŽÎŽÏÏÏfÏfÏÌÏÌÐ2Ð2ООÑ Ñ ÑvÑvÑèÑèÒRÒRÒ¼Ò¼Ó&Ó&ÓÓÓúÓúÔdÔdÔÔÔÔÕFÕFÕ²Õ²Ö"Ö"ÖŽÖŽ×××l×l×Ö×ÖØNØNØÄØÄÙ:Ù:٦٦ÚÚÚ„Ú„ÚôÚôÛ\Û\ÛÄÛÄÜ4Ü4Ü Ü Ý Ý ÝtÝtÝðÝðÞ^Þ^ÞÎÞÎß<ß<߲߲à(à(àœàœáááŠáŠâââxâxâàâàãLãLã¸ã¸ä&ä&äžäžåååˆåˆåøåøæhæhæÞæÞçPçPç¾ç¾è4è4è¢è¢éééˆéˆéúéúêhêhêâêâëPëPëÆëÆì6ì6ì¨ì¨íííŽíŽîîî~î~îöîöïhïhïàïàðJðJð¼ð¼ñ.ñ.ñªñªò,ò,ò®ò®ó.ó.ó¦ó¦ôôô˜ô˜õõõ„õ„õøõøözözöøöø÷r÷r÷ð÷ðøløløæøæù^ù^ùÖùÖúJúJúÀúÀû*û*û–û–üüü‚ü‚üðüðý`ý`ýÒýÒþDþDþ¶þ¶ÿ&ÿ&ÿ”ÿ”rrææTTÊÊFFÈÈJJÊÊ<<¼¼22´´22¬¬**¦¦  ˜˜   € € ð ð \ \ Ê Ê : : ¨ ¨   „ „ ð ð ` ` Î ÎBB¶¶,,  ‚‚îîZZÆÆ22œœ  vvææVVÄÄ..žž  zzìì\\ÆÆ88¬¬ppÚÚBB²²  ††ôôjjââVVÄÄ66œœ   | | ê ê!V!V!¼!¼"$"$"’"’###v#v#è#è$Z$Z$Ê$Ê%8%8%¦%¦&&&Œ&Œ&þ&þ'l'l'Ø'Ø(F(F(°(°)))†)†)ð)ð*\*\*Æ*Æ+.+.+ž+ž,,,Ž,Ž---r-r-æ-æ.L.L.º.º/"/"/Ž/Ž000r0r0à0à1H1H1¶1¶222ˆ2ˆ2ò2ò3`3`3Ò3Ò4>4>4®4®555Ž5Ž5ü5ü6l6l6Ø6Ø7D7D7¸7¸8 8 8ˆ8ˆ8ð8ð9f9f9Ö9Ö:L:L:º:º;";";Š;Š;ð;ð<^<^<Ô<Ô=D=D=²=²>(>(>’>’>þ>þ?n?n?ä?ä@T@T@È@ÈA>A>A®A®BBBˆBˆBöBöCbCbCÎCÎD>D>D¬D¬E$E$E”E”F F F‚F‚FòFòGbGbGÌGÌH8H8H¨H¨III~I~IòIòJhJhJÚJÚKNKNKÂKÂL4L4L¦L¦MMMˆMˆNNNtNtNàNàOLOLO¸O¸P$P$PšPšQ Q Q‚Q‚QøQøRlRlRâRâSXSXSÎSÎT@T@T²T²U0U0U²U²V&V&V¢V¢WWWWWüWüXvXvXìXìYbYbYÚYÚZPZPZÆZÆ[<[<[²[²\(\(\ª\ª]]]Š]Š]ô]ô^^^^^È^È_:_:_ª_ª` ` `–`–a a a~a~aøaøbtbtbÞbÞcVcVcÌcÌd8d8d¦d¦eeeŽeŽfffrfrfèfèg\g\gÈgÈh@h@h¬h¬iiiŽiŽiúiújfjfjÒjÒk>k>kªkªl2l2l¶l¶m8m8mªmªnnnŽnŽooovovoèoèpTpTpÀpÀq2q2q¢q¢rrr†r†sss’s’tttœtœu"u"ušušvvvzvzvîvîw^w^wÌwÌx<x<x¦x¦yyyˆyˆyöyöznznzØzØ{F{F{¼{¼|(|(|’|’|þ|þ}l}l}Ú}Ú~J~J~¸~¸&&––€€€~€~€ð€ðddÜÜ‚P‚P‚Ƃƃ<ƒ<ƒ´ƒ´„*„*„ „ ………ЅІ††t†t†æ†æ‡\‡\‡Ö‡ÖˆFˆFˆ¶ˆ¶‰"‰"‰š‰šŠŠŠˆŠˆ‹‹‹t‹t‹â‹âŒPŒPŒÒŒÒHH¾¾Ž(Ž(ŽšŽšzzôôddØØ‘J‘J‘¼‘¼’,’,’ž’ž“““†“†“ü“ü”v”v”ê”ê•Z•Z•ĕĖ6–6–¨–¨————˜˜˜v˜v˜ê˜ê™`™`™Ö™ÖšNšNšÆšÆ›>›>›´›´œ,œ,œ¦œ¦""œœžžžŠžŠŸŸŸlŸlŸØŸØ F F ´ ´¡$¡$¡’¡’¢¢¢p¢p¢â¢â£V£V£Î£Î¤@¤@¤´¤´¥*¥*¥ ¥ ¦¦¦Ž¦Ž§§§~§~§ø§ø¨p¨p¨ê¨ê©\©\©Î©ÎªHªHª¸ª¸«$«$«œ«œ¬¬¬š¬š­"­"­­®®®z®z®î®î¯d¯d¯Ú¯Ú°P°P°Ä°Ä±:±:±²±²²*²*²–²–³³³v³v³æ³æ´X´X´È´Èµ<µ<µ²µ²¶¶¶¶···|·|·ö·ö¸b¸b¸Ö¸Ö¹J¹J¹¾¹¾º2º2º¤º¤»»»Œ»Œ¼¼¼v¼v¼è¼è½\½\½Ð½Ð¾D¾D¾º¾º¿,¿,¿¢¿¢ÀÀÀŠÀŠÀþÀþÁrÁrÁæÁæÂ\Â\ÂÒÂÒÃFÃFúúÄ0Ä0ĢĢÅÅÅŒÅŒÆÆÆrÆrÆàÆàÇRÇRÇÊÇÊÈ<È<È´È´É0É0ɞɞÊÊʀʀÊòÊòË^Ë^ËÔËÔÌNÌN̾̾Í0Í0ͦͦÎÎ΄΄ÎòÎòÏjÏjÏÞÏÞÐTÐTÐÎÐÎÑ@Ñ@Ñ´Ñ´Ò&Ò&Ò Ò ÓÓÓŠÓŠÔÔÔtÔtÔæÔæÕ\Õ\ÕÖÕÖÖNÖNÖÊÖÊ×D×D×¼×¼Ø4Ø4ببÙÙÙŽÙŽÚÚÚvÚvÚäÚäÛ\Û\ÛÒÛÒܪܪÝÝÝŠÝŠÝøÝøÞhÞhÜ@Ü@ÞØÞØßFßFß´ß´à"à"à’à’ááátátáâáââTâTã.ã.ãœãœäää|ä|äìäìâÄâÄå\å\åÊåÊæ8æ8æ¦æ¦ççç†ç†çøçøèfèfèØèØéHéHéºéºê0ê0êžêžëëë€ë€ëòëòì`ì`ìÌìÌí@í@í´í´î$î$î”î”îþîþïhïhïÔïÔð@ð@ð²ð²ñ ñ ñŽñŽñüñüòjòjòÞòÞóPóPóÈóÈô@ô@ô¸ô¸õ&õ&õ’õ’õþõþötötöìöì÷\÷\÷Ð÷Ðø@ø@ø¬ø¬ùùùŒùŒúúúpúpúàúàûXûXûÐûÐüFüFüÀüÀý,ý,ý¤ý¤þþþ„þ„þøþøÿhÿhÿÔÿÔ@@¬¬„„òòddÒÒ@@®®nnÜܺºJJ,,œœ  xx V Vææ È È 8 8 ¦ ¦   ~ ~ ê ê T T ¾ ¾ * * ˜ ˜ppÚÚDD°°ˆˆ\\ÈÈ88¨¨ŠŠúúòòjjØØHH¶¶$$ŽŽ``úúÈÈ00œœ„„ôô``ÎÎ::¦¦  rrØØBB°°ˆˆôô^^ÈÈ . . ˜ ˜! ! !v!v"L"L"´"´###ˆ#ˆ#ò#ò!æ!æ$\$\$Ò$Ò%F%F%¼%¼&.&.&ž&ž'''~'~'ì'ì(\(\(Î(Î)B)B)´)´*&*&*Š*Š*ú*ú+f+f+Ø+Ø,B,B,ª,ª---€-€-ò-ò.b.b.Ô.Ô/B/B/®/®000Ž0Ž0þ0þ1n1n1â1â2T2T2È2È38383¦3¦444ˆ4ˆ4ø4ø5h5h5Ø5Ø6F6F6¶6¶7&7&7”7”888t8t8ä8ä9V9V9Æ9Æ:4:4:¢:¢;;;€;€;ð;ð\>\>¾>¾?&?&?Ž?Ž?ú?ú@d@d@Æ@ÆA.A.A–A–BBBlBlBàBàCRCRCÆCÆD0D0DœDœE E EvEvEàEàFNFNFÀFÀG0G0G G H H HxHxHäHäILILIÆIÆJ>J>J¸J¸K*K*KšKšL L L„L„LüLüMnMnMæMæNVNVNÆNÆO8O8O°O°P"P"P–P–QQQpQpQÜQÜRHRHR¸R¸S&S&SœSœTTTtTtTæTæUTUTUÂUÂV,V,VšVšWWWjWjWÔWÔXFXFX¬X¬YYY€Y€YêYêZTZTZ¾Z¾[([([’[’[ü[ü\f\f\Ð\Ð]J]J]À]À^8^8^ª^ª_$_$_š_š```’`’aaaabbbrbrbâbâcPcPc¾c¾d2d2d¤d¤eee„e„eðeðf^f^fÖfÖgHgHg¾g¾h.h.h¦h¦iii’i’j j jŠjŠkkkpkpkÞkÞlNlNl¼l¼m,m,m¤m¤nnnŽnŽnþnþovovoêoêpdpdpÞpÞq^q^qØqØrFrFr¶r¶s(s(s˜s˜t t tztztìtìu^u^uÎuÎv>v>v®v®wwwŠwŠwüwüxlxlxÜxÜyNyNyÂyÂz4z4z¨z¨{{{Ž{Ž|||r|r|â|â}T}T}Ð}Ð~F~F~À~À44°°€&€&€¤€¤""¤¤‚ ‚ ‚’‚’ƒƒƒ|ƒ|ƒòƒò„f„f„Ú„Ú…P…P…¾…¾†.†.†ž†ž‡‡‡€‡€‡ð‡ðˆbˆbˆÐˆÐ‰>‰>‰°‰°ŠŠŠŠŠŠŠüŠü‹n‹n‹Ü‹ÜŒPŒPŒÆŒÆ<<²²Ž*Ž*ޢޢˆˆúúhhÖÖ‘J‘J‘¸‘¸’,’,’¤’¤““““”””p”p”à”à•V•V•ȕȖ6–6–¦–¦—$—$—¤—¤˜˜˜€˜€˜ò˜ò™^™^™Î™Îš>š>šºšºœ œ œzœzœæœæRR¼¼ž2ž2ž¨ž¨ŸŸŸ‚Ÿ‚ŸîŸî Z Z Ä Ä¡0¡0¡ ¡ ¢¢¢|¢|¢è¢è£X£X£Æ£Æ¤8¤8¤¤¤¤¥¥¥~¥~¥ê¥ê¦V¦V¦Ä¦Ä§6§6§¬§¬¨"¨"¨”¨”©©©p©p©Ü©ÜªRªRª¾ª¾«&«&«–«–¬ ¬ ¬~¬~¬ð¬ð­f­f­Ú­Ú®L®L®Ê®Ê¯8¯8¯¦¯¦°"°"°°±±±x±x±ì±ì²^²^²Ê²Ê³:³:³°³°´ ´ ´´´ü´üµpµpµêµê¶`¶`¶Ö¶Ö·P·P·È·È¸>¸>¸À¸À¹2¹2¹¤¹¤º$º$º–º–» » »†»†»þ»þ¼t¼t¼ä¼ä½X½X½Ò½Ò¾F¾F¾º¾º¿"¿"¿”¿”À À À~À~ÀðÀðÁhÁhÁÞÁÞÂPÂPÂÐÂÐììÄ$Ä$Ã>Ã>Ä Ä ÅÅÅŒÅŒÆÆÆvÆvÆìÆìÇ`Ç`ÇÎÇÎÈ@È@ȸȸÉ*É*ɜɜÊÊÊ~Ê~ÊôÊôËnËnËæËæÌ\Ì\ÌØÌØÍRÍRÍÈÍÈÎLÎLÏ0Ï0ϬϬξξÐ,Ð,ЬЬÑ Ñ јјÒÒҌҌÓÓÓvÓvÓìÓìÔhÔhÔÞÔÞÕTÕTÕÎÕÎÖ@Ö@Ö°Ö°××׌׌ØØØrØrØäØäÙVÙVÙÊÙÊÚ8Ú8ÚªÚªÛÛÛŽÛŽÛþÛþÜpÜpܿܿÝTÝTÝÎÝÎÞHÞHÞ¶Þ¶ß*ß*ߘߘàààzàzàðàðá\á\áÎáÎâ8â8â¦â¦ãããŽãŽä`ä`äÖäÖåLåLãøãøåÄåÄæ6æ6æ¨æ¨ççç€ç€çôçôèfèfèÚèÚéFéFé¶é¶ê$ê$ê”ê”ë ë ë~ë~ëôëôìdìdìÖìÖíLíLí¶í¶î"î"î”î”ï ï ïxïxïäïäðXðXðÊðÊñ>ñ>ñ®ñ®òòòŒòŒòþòþónónóÞóÞôTôTôÈôÈõ<õ<õ®õ®öööö÷÷÷Š÷Šøøø~ø~øòøòùdùdùØùØúLúLú¼ú¼û*û*ûšûšüüü„ü„üøüøýlýlýäýäþZþZþÐþÐÿHÿHÿºÿº..šš  „„ööppààZZÊÊ44¤¤€€ðð\\ØØ@@¬¬ˆˆúú t t î î b b Ô Ô < < ¤ ¤   Œ Œ ü ü l l Ü ÜVVÄÄ..¢¢‚‚úúppææXXÄÄ00  ŠŠþþllØØFF¸¸((šš„„úúllÞÞNNÀÀ>>ºº66¦¦„„îîVVÀÀ,,””   l l Ú Ú!N!N!¼!¼"$"$"”"”###r#r#Ú#Ú$N$N$Â$Â%,%,%š%š&&&x&x&â&â'P'P'º'º(*(*(”(”(ö(ö)`)`)Ê)Ê*2*2* * +++€+€+ð+ð,f,f,Ö,Ö-F-F-¶-¶.$.$.”.”///~/~/î/î0^0^0Ì0Ì18181 1 222x2x2ê2ê3`3`3Î3Î4B4B4°4°555„5„5ò5ò6`6`6Ú6Ú7R7R7Î7Î8J8J8À8À94949¨9¨:$:$:¢:¢; ; ;˜;˜<<<„<„<ì<ì=X=X=Ê=Ê><><>®>®? ? ?–?–@@@r@r@ä@äALALAÆAÆB.B.B˜B˜CCC~C~DTDTD¸D¸E"E"EŠEŠEøEøFbFbFÈFÈG4G4GžGžH H HpHpHÜHÜIFIFI¶I¶J"J"JˆJˆJôJôK^K^KÊKÊL0L0LœLœMMMvMvCòCòMâMâNJNJN²N²OOOˆOˆOöOöPdPdPÔPÔQ>Q>RRR‚R‚RøRøSlSlSäSäTZTZTÔTÔUPUPUÂUÂV6V6V®V®W(W(W W XXXšXšY Y Y„Y„YúYúZtZtZîZî[Z[Z[Ê[Ê\:\:\¬\¬]]]Œ]Œ^^^t^t^æ^æ_^_^_Ô_Ô`H`H`²`²a$a$a–a–bbb|b|bèbècXcXcÎcÎd>d>d®d®e"e"e–e–fffŠfŠggg€g€gògòhdhdhÖhÖiJiJiÄiÄj>j>j¸j¸k4k4k¬k¬l&l&l l mmmšmšnnn˜n˜ooo–o–pppœpœqqq¢q¢r&r&r¦r¦s&s&s¤s¤t*t*t°t°u0u0u®u®v.v.v°v°w,w,w°w°x2x2x´x´y8y8y¼y¼z<z<z¼z¼{:{:{À{À|F|F|¼|¼}4}4}¤}¤~~~Ž~Žttää€X€X€Î€ÎDDºº‚2‚2‚ª‚ªƒ ƒ ƒƒ„„„t„t„ê„ê…X…X…ʅʆ@†@†¶†¶‡"‡"‡Œ‡Œ‡ö‡öˆjˆjˆÚˆÚ‰L‰L‰¶‰¶Š*Š*ŠšŠš‹ ‹ ‹t‹t‹Ü‹ÜŒNŒNŒ¸Œ¸**––ŽŽŽlŽlŽÖŽÖDDºº,,žž‘‘‘„‘„‘ô‘ô’h’h’Ú’Ú“J“J“°“°” ” ”’”’•••x•x•ê•ê–^–^–Ä–Ä—8—8—¬—¬˜˜˜Ž˜Ž™™™p™p™ä™äšRšRšÄšÄ›6›6›¢›¢œœœŠœŠœüœüppääžXžXžÌžÌŸ@Ÿ@Ÿ´Ÿ´ ( ( œ œ¡¡¡„¡„¡ê¡ê¢V¢V¢À¢À£4£4£¢£¢¤¤¤z¤z¤è¤è¥T¥T¥Â¥Â¦*¦*¦’¦’§§§€§€§ö§ö¨n¨n¨Ü¨Ü©P©P©Â©Âª4ª4ª¨ª¨«««««þ«þ¬p¬p¬Þ¬Þ­L­L­¾­¾®,®,®œ®œ¯¯¯€¯€¯ò¯ò°d°d°Ü°Ü±J±J±È±È²8²8²¬²¬³$³$³˜³˜´´´~´~´ô´ôµbµbµÔµÔ¶D¶D¶¸¶¸·,·,·œ·œ¸¸¸‚¸‚¸ð¸ð¹`¹`¹Ò¹Òº@º@º®º®»»»Š»Š»ö»ö¼d¼d¼Ò¼Ò½F½F½º½º¾6¾6¾²¾²¿.¿.¿ ¿ ÀÀÀŠÀŠÁÁÁ|Á|ÁìÁìÂ^Â^ÂÖÂÖÃPÃPÃÂÃÂÄ2Ä2ĢĢÅÅņņÅöÅöÆhÆhÆÖÆÖÇBÇBÇ®Ç®È È ÈÈÉÉÉtÉtÉèÉèÊXÊXÊÄÊÄË6Ë6ˤˤÌÌÌ|Ì|ÌìÌìÍbÍbÍØÍØÎTÎTÎÊÎÊÏ>Ï>ϨϨÐÐЂЂÐòÐòÑjÑjÑàÑàÒVÒVÒÊÒÊÓ6Ó6Ó¢Ó¢ÔÔÔ‚Ô‚ÔþÔþÕzÕzÕìÕìÖ^Ö^ÖØÖØ×N×NׯׯØ6Ø6ببÙ"Ù"٘٘ÚÚÚ~Ú~ÚêÚêÛ^Û^ÛØÛØÜTÜTÜÊÜÊÝ:Ý:ݪݪÞÞÞŽÞŽÞþÞþßlßlßàßàà\à\àØàØáTáTáÆáÆâ:â:â²â²ã,ã,ãžãžäääˆäˆåååtåtåîåîæhæhæâæâçNçNçÄçÄè4è4è è ééé‚é‚éôéôênênêèêèë`ë`ëØëØìFìFì²ì²íííŽíŽíüíüînînîâîâïNïNïÆïÆð@ð@ð¾ð¾ñ8ñ8ñ°ñ°òòòŠòŠóóópópóÞóÞôLôLôºôºõ(õ(õ˜õ˜ö ö ö|ö|öòöò÷h÷h÷Þ÷ÞøVøVøÌøÌù>ù>ù´ù´ú$ú$ú–ú–ûûûvûvûèûèü`ü`üØüØýPýPýÆýÆþ@þ@þºþºÿ.ÿ.ÿœÿœ   ~ ~ ê ê \ \ Ì Ì D D ¼ ¼ 2 2 ¬ ¬ " " ” ” þ þ j j Ø Ø H H ¸ ¸ 2 2 ¤ ¤     ü ü l l Ú Ú R R Æ Æ < < ¬ ¬ š š   ” ”   † † ô ô d d â â ^ ^ Ê Ê 4 4       ˆ ˆ   ~ ~ ö ö p p è è f f Þ Þ \ \ Ö Ö T T Ö Ö H H º º 8 8 ° ° ( ( ž ž       € € ú ú r r ì ì b b Ú Ú V V Ò Ò D D ¶ ¶ !* !* !˜ !˜ " " "ˆ "ˆ "ö "ö #j #j #æ #æ $Z $Z $Î $Î %D %D %¸ %¸ && && &˜ &˜ ' ' 'z 'z 'î 'î (b (b (Ö (Ö )J )J )¸ )¸ *. *. *š *š + + +p +p +ì +ì ,h ,h ,ä ,ä -Z -Z -Ô -Ô .N .N .Æ .Æ /> /> /² /² 0( 0( 0¢ 0¢ 1 1 1š 1š 2 2 2 2 3 3 3„ 3„ 4 4 4r 4r 4è 4è 5^ 5^ 5Ê 5Ê 68 68 6¦ 6¦ 7 7 7ˆ 7ˆ 7ô 7ô 8d 8d 8Ú 8Ú 9L 9L 9¼ 9¼ :$ :$ :˜ :˜ ; ; ;r ;r ;Ü ;Ü > >‚ >‚ >ð >ð ?^ ?^ ?Ø ?Ø @P @P @Ì @Ì AF AF AÄ AÄ B@ B@ B° B° C$ C$ C C D D Dt Dt Dì Dì E^ E^ EÎ EÎ FB FB F° F° G* G* Gž Gž H H H€ H€ Hú Hú It It Iè Iè J\ J\ J J K0 K0 Kž Kž L L L† L† Lø Lø M` M` MÐ MÐ N@ N@ Nº Nº O6 O6 O² O² P. P. P® P® Q" Q" Qœ Qœ R R Rœ Rœ S S S‚ S‚ Sî Sî T^ T^ TÊ TÊ U< U< U¬ U¬ V V V V W W Wr Wr Wà Wà XT XT XÈ XÈ Y8 Y8 Y  Y  Z Z Zˆ Zˆ Zþ Zþ [v [v [â [â \R \R \ \ ], ], ]œ ]œ ^ ^ ^ˆ ^ˆ ^þ ^þ _t _t _ê _ê `\ `\ `Ò `Ò a@ a@ a¶ a¶ b, b, b  b  c c c~ c~ cì cì d` d` dÔ dÔ eN eN e e f* f* f¢ f¢ g g g† g† gþ gþ hx hx hð hð ib ib iØ iØ jR jR jÊ jÊ kH kH kÈ kÈ lH lH l¾ l¾ m¨ m¨ n n m4 m4 n” n” o o o€ o€ oö oö pp pp pê pê qb qb qÖ qÖ rP rP rÈ rÈ s@ s@ s¸ s¸ t4 t4 t® t® u" u" už už v v vŽ vŽ w w w„ w„ wþ wþ xr xr xä xä yR yR yÄ yÄ z4 z4 z¢ z¢ { { {~ {~ {æ {æ |L |L |¶ |¶ }& }& }” }” ~ ~ ~n ~n ~Ú ~Ú F F ² ² €" €" €Ž €Ž €ø €ø b b Ú Ú ‚L ‚L ‚Ä ‚Ä ƒ0 ƒ0 ƒœ ƒœ „ „ „r „r „â „â …N …N …º …º †& †& †˜ †˜ ‡ ‡ ‡v ‡v ‡ì ‡ì ˆ^ ˆ^ ˆÐ ˆÐ ‰@ ‰@ ‰² ‰² Š* Š* Š  Š  ‹ ‹ ‹€ ‹€ ‹ð ‹ð Œ\ Œ\ ŒÊ ŒÊ ° ° > > Ž( Ž( Ž” Ž”   r r Þ Þ N N Æ Æ ‘6 ‘6 ‘¨ ‘¨ ’ ’ ’Œ ’Œ ’þ ’þ “v “v “è “è ”Z ”Z ”Î ”Î •D •D •¶ •¶ –" –" –” –” — — —p —p —â —â ˜R ˜R ˜Æ ˜Æ ™: ™: ™ª ™ª š š šŠ šŠ šú šú ›d ›d ›Ð ›Ð œ< œ< œ® œ®   Ž Ž ž ž žt žt žà žà ŸP ŸP ŸÀ ŸÀ  0  0 ¡ ¡  ¦  ¦ ¡ô ¡ô ¡† ¡† ¢f ¢f £F £F ¢Ö ¢Ö £º £º ¤* ¤* ¤š ¤š ¥ ¥ ¥z ¥z ¥è ¥è ¦X ¦X ¦Ò ¦Ò §D §D §´ §´ ¨ ¨ ¨ ¨ © © ©p ©p ©â ©â ªP ªP ª¾ ª¾ «. «. «ž «ž ¬ ¬ ¬€ ¬€ ¬î ¬î ­^ ­^ ­Ò ­Ò ®D ®D ®¶ ®¶ ¯( ¯( ¯” ¯” ° ° °l °l °Ú °Ú ±D ±D ±² ±² ²$ ²$ ²– ²– ³ ³ ³p ³p ³Ø ³Ø ´H ´H ´¸ ´¸ µ, µ, µž µž ¶ ¶ ¶Œ ¶Œ ¶ü ¶ü ·p ·p ·æ ·æ ¸R ¸R ¸¾ ¸¾ ¹4 ¹4 ¹ª ¹ª º º ºš ºš » » »€ »€ »ì »ì ¼` ¼` ¼Î ¼Î ½@ ½@ ½¼ ½¼ ¾, ¾, ¾– ¾– ¿ ¿ ¿p ¿p ¿Þ ¿Þ ÀP ÀP ÀÀ ÀÀ Á, Á, Áœ Áœ   „ „ Âô Âô Ãh Ãh ÃÚ ÃÚ ÄD ÄD IJ IJ Å$ Å$ Åü Åü Å” Å” Æf Æf ÆÔ ÆÔ Ǫ Ǫ Ç< Ç< È È ÈŠ ÈŠ Èö Èö Éf Éf ÉØ ÉØ ÊD ÊD ʰ ʰ Ë Ë Ë Ë Ìp Ìp Ëþ Ëþ Ìâ Ìâ ÍN ÍN ÍÀ ÍÀ Î, Î, Κ Κ Ï Ï Ïv Ïv Ïæ Ïæ ÐT ÐT ÐÄ ÐÄ Ñ0 Ñ0 Ñœ Ñœ Ò Ò Òr Òr Òè Òè Ó\ Ó\ ÓÒ ÓÒ ÔH ÔH Ô¾ Ô¾ Õ4 Õ4 Õª Õª Ö Ö ÖŒ ÖŒ × × ×t ×t ×ä ×ä ØR ØR ØÀ ØÀ Ù2 Ù2 Ù¢ Ù¢ Ú Ú ÚŠ ÚŠ Úü Úü Ûl Ûl ÛÞ ÛÞ ÜV ÜV ÜÌ ÜÌ Ý: Ý: ݬ ݬ Þ Þ Þˆ Þˆ Þö Þö ßÜ ßÜ ßj ßj àT àT àÀ àÀ á2 á2 áž áž â â â‚ â‚ âò âò ãd ãd ãÚ ãÚ äH äH äÀ äÀ å2 å2 å¦ å¦ æ æ æŽ æŽ æú æú çl çl çÚ çÚ èH èH èº èº é* é* éž éž ê ê ê‚ ê‚ êð êð ëb ëb ëÒ ëÒ ì< ì< ì¨ ì¨ í í í† í† íö íö îf îf îÚ îÚ ïL ïL ï¸ ï¸ ð( ð( ð˜ ð˜ ñ ñ ñî ñî ñ~ ñ~ òÌ òÌ ò^ ò^ ó> ó> ô ô ó® ó® ô’ ô’ õ õ õr õr õà õà öR öR öÀ öÀ ÷0 ÷0 ÷ª ÷ª ø ø øŒ øŒ øø øø ùh ùh ùÚ ùÚ úH úH úº úº û( û( û– û– ü ü üv üv üè üè ýX ýX ýÆ ýÆ þ6 þ6 þª þª ÿ ÿ ÿŽ ÿŽ l l Ø Ø D D ² ²   Š Š ü ü n n Ü Ü H H ° °       v v ð ð ^ ^ Ò Ò B B ¶ ¶ , , ˜ ˜   ~ ~ ø ø n n ä ä ^ ^ Ø Ø N N È È B B ® ®   Ž Ž ü ü n n ê ê Z Z Ä Ä 2 2 ž ž   ~ ~ î î Z Z Ê Ê > > ² ² " " – –   r r à à R R * *   ” ”   Ø Ø j j F F ¸ ¸ $ $ ” ”   r r Þ Þ N N ¾ ¾ ž ž , ,   | | î î !Z !Z !È !È "4 "4 "¤ "¤ # # #‚ #‚ #ò #ò $^ $^ $Ê $Ê %6 %6 %  %  & & &€ &€ &ø &ø 'h 'h 'Ü 'Ü (J (J ), ), (¼ (¼ )œ )œ * * *~ *~ *î *î +Z +Z +Ì +Ì ,8 ,8 ,¬ ,¬ - - -¢ -¢ . . .~ .~ .æ .æ /R /R /¸ /¸ 0 0 0† 0† 0ò 0ò 1b 1b 1Ô 1Ô 2J 2J 2¶ 2¶ 3 3 3ˆ 3ˆ 3ô 3ô 4^ 4^ 4È 4È 54 54 5  5  6 6 6t 6t 6Ü 6Ü 7J 7J 7´ 7´ 8 8 8† 8† 8ð 8ð 9\ 9\ 9Ê 9Ê :4 :4 :ž :ž ; ; ;r ;r ;Þ ;Þ b >b >Ì >Ì ?2 ?2 ?š ?š @ @ @l @l @Ö @Ö A< A< A¢ A¢ B B Br Br BØ BØ CF CF C® C® D D D~ D~ Dæ Dæ EL EL E¸ E¸ F F G G F F Gp Gp›š›*__IMPORT_DESCRIPTOR_LIBEAY32__NULL_IMPORT_DESCRIPTORLIBEAY32_NULL_THUNK_DATA_SSLeay__imp__SSLeay_ACCESS_DESCRIPTION_free__imp__ACCESS_DESCRIPTION_free_ACCESS_DESCRIPTION_it__imp__ACCESS_DESCRIPTION_it_ACCESS_DESCRIPTION_new__imp__ACCESS_DESCRIPTION_new_AES_bi_ige_encrypt__imp__AES_bi_ige_encrypt_AES_cbc_encrypt__imp__AES_cbc_encrypt_AES_cfb128_encrypt__imp__AES_cfb128_encrypt_AES_cfb1_encrypt__imp__AES_cfb1_encrypt_AES_cfb8_encrypt__imp__AES_cfb8_encrypt_AES_cfbr_encrypt_block__imp__AES_cfbr_encrypt_block_AES_ctr128_encrypt__imp__AES_ctr128_encrypt_AES_decrypt__imp__AES_decrypt_AES_ecb_encrypt__imp__AES_ecb_encrypt_AES_encrypt__imp__AES_encrypt_AES_ige_encrypt__imp__AES_ige_encrypt_AES_ofb128_encrypt__imp__AES_ofb128_encrypt_AES_options__imp__AES_options_AES_set_decrypt_key__imp__AES_set_decrypt_key_AES_set_encrypt_key__imp__AES_set_encrypt_key_AES_unwrap_key__imp__AES_unwrap_key_AES_wrap_key__imp__AES_wrap_key_ASN1_ANY_it__imp__ASN1_ANY_it_ASN1_BIT_STRING_asn1_meth__imp__ASN1_BIT_STRING_asn1_meth_ASN1_BIT_STRING_free__imp__ASN1_BIT_STRING_free_ASN1_BIT_STRING_get_bit__imp__ASN1_BIT_STRING_get_bit_ASN1_BIT_STRING_it__imp__ASN1_BIT_STRING_it_ASN1_BIT_STRING_name_print__imp__ASN1_BIT_STRING_name_print_ASN1_BIT_STRING_new__imp__ASN1_BIT_STRING_new_ASN1_BIT_STRING_num_asc__imp__ASN1_BIT_STRING_num_asc_ASN1_BIT_STRING_set__imp__ASN1_BIT_STRING_set_ASN1_BIT_STRING_set_asc__imp__ASN1_BIT_STRING_set_asc_ASN1_BIT_STRING_set_bit__imp__ASN1_BIT_STRING_set_bit_ASN1_BMPSTRING_free__imp__ASN1_BMPSTRING_free_ASN1_BMPSTRING_it__imp__ASN1_BMPSTRING_it_ASN1_BMPSTRING_new__imp__ASN1_BMPSTRING_new_ASN1_BOOLEAN_it__imp__ASN1_BOOLEAN_it_ASN1_ENUMERATED_free__imp__ASN1_ENUMERATED_free_ASN1_ENUMERATED_get__imp__ASN1_ENUMERATED_get_ASN1_ENUMERATED_it__imp__ASN1_ENUMERATED_it_ASN1_ENUMERATED_new__imp__ASN1_ENUMERATED_new_ASN1_ENUMERATED_set__imp__ASN1_ENUMERATED_set_ASN1_ENUMERATED_to_BN__imp__ASN1_ENUMERATED_to_BN_ASN1_FBOOLEAN_it__imp__ASN1_FBOOLEAN_it_ASN1_GENERALIZEDTIME_check__imp__ASN1_GENERALIZEDTIME_check_ASN1_GENERALIZEDTIME_free__imp__ASN1_GENERALIZEDTIME_free_ASN1_GENERALIZEDTIME_it__imp__ASN1_GENERALIZEDTIME_it_ASN1_GENERALIZEDTIME_new__imp__ASN1_GENERALIZEDTIME_new_ASN1_GENERALIZEDTIME_print__imp__ASN1_GENERALIZEDTIME_print_ASN1_GENERALIZEDTIME_set__imp__ASN1_GENERALIZEDTIME_set_ASN1_GENERALIZEDTIME_set_string__imp__ASN1_GENERALIZEDTIME_set_string_ASN1_GENERALSTRING_free__imp__ASN1_GENERALSTRING_free_ASN1_GENERALSTRING_it__imp__ASN1_GENERALSTRING_it_ASN1_GENERALSTRING_new__imp__ASN1_GENERALSTRING_new_ASN1_HEADER_free__imp__ASN1_HEADER_free_ASN1_HEADER_new__imp__ASN1_HEADER_new_ASN1_IA5STRING_asn1_meth__imp__ASN1_IA5STRING_asn1_meth_ASN1_IA5STRING_free__imp__ASN1_IA5STRING_free_ASN1_IA5STRING_it__imp__ASN1_IA5STRING_it_ASN1_IA5STRING_new__imp__ASN1_IA5STRING_new_ASN1_INTEGER_cmp__imp__ASN1_INTEGER_cmp_ASN1_INTEGER_dup__imp__ASN1_INTEGER_dup_ASN1_INTEGER_free__imp__ASN1_INTEGER_free_ASN1_INTEGER_get__imp__ASN1_INTEGER_get_ASN1_INTEGER_it__imp__ASN1_INTEGER_it_ASN1_INTEGER_new__imp__ASN1_INTEGER_new_ASN1_INTEGER_set__imp__ASN1_INTEGER_set_ASN1_INTEGER_to_BN__imp__ASN1_INTEGER_to_BN_ASN1_NULL_free__imp__ASN1_NULL_free_ASN1_NULL_it__imp__ASN1_NULL_it_ASN1_NULL_new__imp__ASN1_NULL_new_ASN1_OBJECT_create__imp__ASN1_OBJECT_create_ASN1_OBJECT_free__imp__ASN1_OBJECT_free_ASN1_OBJECT_it__imp__ASN1_OBJECT_it_ASN1_OBJECT_new__imp__ASN1_OBJECT_new_ASN1_OCTET_STRING_NDEF_it__imp__ASN1_OCTET_STRING_NDEF_it_ASN1_OCTET_STRING_cmp__imp__ASN1_OCTET_STRING_cmp_ASN1_OCTET_STRING_dup__imp__ASN1_OCTET_STRING_dup_ASN1_OCTET_STRING_free__imp__ASN1_OCTET_STRING_free_ASN1_OCTET_STRING_it__imp__ASN1_OCTET_STRING_it_ASN1_OCTET_STRING_new__imp__ASN1_OCTET_STRING_new_ASN1_OCTET_STRING_set__imp__ASN1_OCTET_STRING_set_ASN1_PRINTABLESTRING_free__imp__ASN1_PRINTABLESTRING_free_ASN1_PRINTABLESTRING_it__imp__ASN1_PRINTABLESTRING_it_ASN1_PRINTABLESTRING_new__imp__ASN1_PRINTABLESTRING_new_ASN1_PRINTABLE_free__imp__ASN1_PRINTABLE_free_ASN1_PRINTABLE_it__imp__ASN1_PRINTABLE_it_ASN1_PRINTABLE_new__imp__ASN1_PRINTABLE_new_ASN1_PRINTABLE_type__imp__ASN1_PRINTABLE_type_ASN1_SEQUENCE_it__imp__ASN1_SEQUENCE_it_ASN1_STRING_TABLE_add__imp__ASN1_STRING_TABLE_add_ASN1_STRING_TABLE_cleanup__imp__ASN1_STRING_TABLE_cleanup_ASN1_STRING_TABLE_get__imp__ASN1_STRING_TABLE_get_ASN1_STRING_cmp__imp__ASN1_STRING_cmp_ASN1_STRING_data__imp__ASN1_STRING_data_ASN1_STRING_dup__imp__ASN1_STRING_dup_ASN1_STRING_encode__imp__ASN1_STRING_encode_ASN1_STRING_free__imp__ASN1_STRING_free_ASN1_STRING_get_default_mask__imp__ASN1_STRING_get_default_mask_ASN1_STRING_length__imp__ASN1_STRING_length_ASN1_STRING_length_set__imp__ASN1_STRING_length_set_ASN1_STRING_new__imp__ASN1_STRING_new_ASN1_STRING_print__imp__ASN1_STRING_print_ASN1_STRING_print_ex__imp__ASN1_STRING_print_ex_ASN1_STRING_print_ex_fp__imp__ASN1_STRING_print_ex_fp_ASN1_STRING_set0__imp__ASN1_STRING_set0_ASN1_STRING_set__imp__ASN1_STRING_set_ASN1_STRING_set_by_NID__imp__ASN1_STRING_set_by_NID_ASN1_STRING_set_default_mask__imp__ASN1_STRING_set_default_mask_ASN1_STRING_set_default_mask_asc__imp__ASN1_STRING_set_default_mask_asc_ASN1_STRING_to_UTF8__imp__ASN1_STRING_to_UTF8_ASN1_STRING_type__imp__ASN1_STRING_type_ASN1_STRING_type_new__imp__ASN1_STRING_type_new_ASN1_T61STRING_free__imp__ASN1_T61STRING_free_ASN1_T61STRING_it__imp__ASN1_T61STRING_it_ASN1_T61STRING_new__imp__ASN1_T61STRING_new_ASN1_TBOOLEAN_it__imp__ASN1_TBOOLEAN_it_ASN1_TIME_check__imp__ASN1_TIME_check_ASN1_TIME_free__imp__ASN1_TIME_free_ASN1_TIME_it__imp__ASN1_TIME_it_ASN1_TIME_new__imp__ASN1_TIME_new_ASN1_TIME_print__imp__ASN1_TIME_print_ASN1_TIME_set__imp__ASN1_TIME_set_ASN1_TIME_to_generalizedtime__imp__ASN1_TIME_to_generalizedtime_ASN1_TYPE_free__imp__ASN1_TYPE_free_ASN1_TYPE_get__imp__ASN1_TYPE_get_ASN1_TYPE_get_int_octetstring__imp__ASN1_TYPE_get_int_octetstring_ASN1_TYPE_get_octetstring__imp__ASN1_TYPE_get_octetstring_ASN1_TYPE_new__imp__ASN1_TYPE_new_ASN1_TYPE_set1__imp__ASN1_TYPE_set1_ASN1_TYPE_set__imp__ASN1_TYPE_set_ASN1_TYPE_set_int_octetstring__imp__ASN1_TYPE_set_int_octetstring_ASN1_TYPE_set_octetstring__imp__ASN1_TYPE_set_octetstring_ASN1_UNIVERSALSTRING_free__imp__ASN1_UNIVERSALSTRING_free_ASN1_UNIVERSALSTRING_it__imp__ASN1_UNIVERSALSTRING_it_ASN1_UNIVERSALSTRING_new__imp__ASN1_UNIVERSALSTRING_new_ASN1_UNIVERSALSTRING_to_string__imp__ASN1_UNIVERSALSTRING_to_string_ASN1_UTCTIME_check__imp__ASN1_UTCTIME_check_ASN1_UTCTIME_cmp_time_t__imp__ASN1_UTCTIME_cmp_time_t_ASN1_UTCTIME_free__imp__ASN1_UTCTIME_free_ASN1_UTCTIME_it__imp__ASN1_UTCTIME_it_ASN1_UTCTIME_new__imp__ASN1_UTCTIME_new_ASN1_UTCTIME_print__imp__ASN1_UTCTIME_print_ASN1_UTCTIME_set__imp__ASN1_UTCTIME_set_ASN1_UTCTIME_set_string__imp__ASN1_UTCTIME_set_string_ASN1_UTF8STRING_free__imp__ASN1_UTF8STRING_free_ASN1_UTF8STRING_it__imp__ASN1_UTF8STRING_it_ASN1_UTF8STRING_new__imp__ASN1_UTF8STRING_new_ASN1_VISIBLESTRING_free__imp__ASN1_VISIBLESTRING_free_ASN1_VISIBLESTRING_it__imp__ASN1_VISIBLESTRING_it_ASN1_VISIBLESTRING_new__imp__ASN1_VISIBLESTRING_new_ASN1_add_oid_module__imp__ASN1_add_oid_module_ASN1_check_infinite_end__imp__ASN1_check_infinite_end_ASN1_const_check_infinite_end__imp__ASN1_const_check_infinite_end_ASN1_d2i_bio__imp__ASN1_d2i_bio_ASN1_d2i_fp__imp__ASN1_d2i_fp_ASN1_digest__imp__ASN1_digest_ASN1_dup__imp__ASN1_dup_ASN1_generate_nconf__imp__ASN1_generate_nconf_ASN1_generate_v3__imp__ASN1_generate_v3_ASN1_get_object__imp__ASN1_get_object_ASN1_i2d_bio__imp__ASN1_i2d_bio_ASN1_i2d_fp__imp__ASN1_i2d_fp_ASN1_item_d2i__imp__ASN1_item_d2i_ASN1_item_d2i_bio__imp__ASN1_item_d2i_bio_ASN1_item_d2i_fp__imp__ASN1_item_d2i_fp_ASN1_item_digest__imp__ASN1_item_digest_ASN1_item_dup__imp__ASN1_item_dup_ASN1_item_ex_d2i__imp__ASN1_item_ex_d2i_ASN1_item_ex_free__imp__ASN1_item_ex_free_ASN1_item_ex_i2d__imp__ASN1_item_ex_i2d_ASN1_item_ex_new__imp__ASN1_item_ex_new_ASN1_item_free__imp__ASN1_item_free_ASN1_item_i2d__imp__ASN1_item_i2d_ASN1_item_i2d_bio__imp__ASN1_item_i2d_bio_ASN1_item_i2d_fp__imp__ASN1_item_i2d_fp_ASN1_item_ndef_i2d__imp__ASN1_item_ndef_i2d_ASN1_item_new__imp__ASN1_item_new_ASN1_item_pack__imp__ASN1_item_pack_ASN1_item_sign__imp__ASN1_item_sign_ASN1_item_unpack__imp__ASN1_item_unpack_ASN1_item_verify__imp__ASN1_item_verify_ASN1_mbstring_copy__imp__ASN1_mbstring_copy_ASN1_mbstring_ncopy__imp__ASN1_mbstring_ncopy_ASN1_object_size__imp__ASN1_object_size_ASN1_pack_string__imp__ASN1_pack_string_ASN1_parse__imp__ASN1_parse_ASN1_parse_dump__imp__ASN1_parse_dump_ASN1_primitive_free__imp__ASN1_primitive_free_ASN1_primitive_new__imp__ASN1_primitive_new_ASN1_put_eoc__imp__ASN1_put_eoc_ASN1_put_object__imp__ASN1_put_object_ASN1_seq_pack__imp__ASN1_seq_pack_ASN1_seq_unpack__imp__ASN1_seq_unpack_ASN1_sign__imp__ASN1_sign_ASN1_tag2bit__imp__ASN1_tag2bit_ASN1_tag2str__imp__ASN1_tag2str_ASN1_template_d2i__imp__ASN1_template_d2i_ASN1_template_free__imp__ASN1_template_free_ASN1_template_i2d__imp__ASN1_template_i2d_ASN1_template_new__imp__ASN1_template_new_ASN1_unpack_string__imp__ASN1_unpack_string_ASN1_verify__imp__ASN1_verify_AUTHORITY_INFO_ACCESS_free__imp__AUTHORITY_INFO_ACCESS_free_AUTHORITY_INFO_ACCESS_it__imp__AUTHORITY_INFO_ACCESS_it_AUTHORITY_INFO_ACCESS_new__imp__AUTHORITY_INFO_ACCESS_new_AUTHORITY_KEYID_free__imp__AUTHORITY_KEYID_free_AUTHORITY_KEYID_it__imp__AUTHORITY_KEYID_it_AUTHORITY_KEYID_new__imp__AUTHORITY_KEYID_new_BASIC_CONSTRAINTS_free__imp__BASIC_CONSTRAINTS_free_BASIC_CONSTRAINTS_it__imp__BASIC_CONSTRAINTS_it_BASIC_CONSTRAINTS_new__imp__BASIC_CONSTRAINTS_new_BF_cbc_encrypt__imp__BF_cbc_encrypt_BF_cfb64_encrypt__imp__BF_cfb64_encrypt_BF_decrypt__imp__BF_decrypt_BF_ecb_encrypt__imp__BF_ecb_encrypt_BF_encrypt__imp__BF_encrypt_BF_ofb64_encrypt__imp__BF_ofb64_encrypt_BF_options__imp__BF_options_BF_set_key__imp__BF_set_key_BIGNUM_it__imp__BIGNUM_it_BIO_accept__imp__BIO_accept_BIO_callback_ctrl__imp__BIO_callback_ctrl_BIO_clear_flags__imp__BIO_clear_flags_BIO_copy_next_retry__imp__BIO_copy_next_retry_BIO_ctrl__imp__BIO_ctrl_BIO_ctrl_get_read_request__imp__BIO_ctrl_get_read_request_BIO_ctrl_get_write_guarantee__imp__BIO_ctrl_get_write_guarantee_BIO_ctrl_pending__imp__BIO_ctrl_pending_BIO_ctrl_reset_read_request__imp__BIO_ctrl_reset_read_request_BIO_ctrl_wpending__imp__BIO_ctrl_wpending_BIO_debug_callback__imp__BIO_debug_callback_BIO_dgram_non_fatal_error__imp__BIO_dgram_non_fatal_error_BIO_dump__imp__BIO_dump_BIO_dump_cb__imp__BIO_dump_cb_BIO_dump_fp__imp__BIO_dump_fp_BIO_dump_indent__imp__BIO_dump_indent_BIO_dump_indent_cb__imp__BIO_dump_indent_cb_BIO_dump_indent_fp__imp__BIO_dump_indent_fp_BIO_dup_chain__imp__BIO_dup_chain_BIO_f_base64__imp__BIO_f_base64_BIO_f_buffer__imp__BIO_f_buffer_BIO_f_cipher__imp__BIO_f_cipher_BIO_f_md__imp__BIO_f_md_BIO_f_nbio_test__imp__BIO_f_nbio_test_BIO_f_null__imp__BIO_f_null_BIO_f_reliable__imp__BIO_f_reliable_BIO_fd_non_fatal_error__imp__BIO_fd_non_fatal_error_BIO_fd_should_retry__imp__BIO_fd_should_retry_BIO_find_type__imp__BIO_find_type_BIO_free__imp__BIO_free_BIO_free_all__imp__BIO_free_all_BIO_get_accept_socket__imp__BIO_get_accept_socket_BIO_get_callback__imp__BIO_get_callback_BIO_get_callback_arg__imp__BIO_get_callback_arg_BIO_get_ex_data__imp__BIO_get_ex_data_BIO_get_ex_new_index__imp__BIO_get_ex_new_index_BIO_get_host_ip__imp__BIO_get_host_ip_BIO_get_port__imp__BIO_get_port_BIO_get_retry_BIO__imp__BIO_get_retry_BIO_BIO_get_retry_reason__imp__BIO_get_retry_reason_BIO_gethostbyname__imp__BIO_gethostbyname_BIO_gets__imp__BIO_gets_BIO_indent__imp__BIO_indent_BIO_int_ctrl__imp__BIO_int_ctrl_BIO_method_name__imp__BIO_method_name_BIO_method_type__imp__BIO_method_type_BIO_new__imp__BIO_new_BIO_new_accept__imp__BIO_new_accept_BIO_new_bio_pair__imp__BIO_new_bio_pair_BIO_new_connect__imp__BIO_new_connect_BIO_new_dgram__imp__BIO_new_dgram_BIO_new_fd__imp__BIO_new_fd_BIO_new_file__imp__BIO_new_file_BIO_new_fp__imp__BIO_new_fp_BIO_new_mem_buf__imp__BIO_new_mem_buf_BIO_new_socket__imp__BIO_new_socket_BIO_next__imp__BIO_next_BIO_nread0__imp__BIO_nread0_BIO_nread__imp__BIO_nread_BIO_number_read__imp__BIO_number_read_BIO_number_written__imp__BIO_number_written_BIO_nwrite0__imp__BIO_nwrite0_BIO_nwrite__imp__BIO_nwrite_BIO_pop__imp__BIO_pop_BIO_printf__imp__BIO_printf_BIO_ptr_ctrl__imp__BIO_ptr_ctrl_BIO_push__imp__BIO_push_BIO_puts__imp__BIO_puts_BIO_read__imp__BIO_read_BIO_s_accept__imp__BIO_s_accept_BIO_s_bio__imp__BIO_s_bio_BIO_s_connect__imp__BIO_s_connect_BIO_s_datagram__imp__BIO_s_datagram_BIO_s_fd__imp__BIO_s_fd_BIO_s_file__imp__BIO_s_file_BIO_s_mem__imp__BIO_s_mem_BIO_s_null__imp__BIO_s_null_BIO_s_socket__imp__BIO_s_socket_BIO_set__imp__BIO_set_BIO_set_callback__imp__BIO_set_callback_BIO_set_callback_arg__imp__BIO_set_callback_arg_BIO_set_cipher__imp__BIO_set_cipher_BIO_set_ex_data__imp__BIO_set_ex_data_BIO_set_flags__imp__BIO_set_flags_BIO_set_tcp_ndelay__imp__BIO_set_tcp_ndelay_BIO_snprintf__imp__BIO_snprintf_BIO_sock_cleanup__imp__BIO_sock_cleanup_BIO_sock_error__imp__BIO_sock_error_BIO_sock_init__imp__BIO_sock_init_BIO_sock_non_fatal_error__imp__BIO_sock_non_fatal_error_BIO_sock_should_retry__imp__BIO_sock_should_retry_BIO_socket_ioctl__imp__BIO_socket_ioctl_BIO_socket_nbio__imp__BIO_socket_nbio_BIO_test_flags__imp__BIO_test_flags_BIO_vfree__imp__BIO_vfree_BIO_vprintf__imp__BIO_vprintf_BIO_vsnprintf__imp__BIO_vsnprintf_BIO_write__imp__BIO_write_BN_BLINDING_convert__imp__BN_BLINDING_convert_BN_BLINDING_convert_ex__imp__BN_BLINDING_convert_ex_BN_BLINDING_create_param__imp__BN_BLINDING_create_param_BN_BLINDING_free__imp__BN_BLINDING_free_BN_BLINDING_get_flags__imp__BN_BLINDING_get_flags_BN_BLINDING_get_thread_id__imp__BN_BLINDING_get_thread_id_BN_BLINDING_invert__imp__BN_BLINDING_invert_BN_BLINDING_invert_ex__imp__BN_BLINDING_invert_ex_BN_BLINDING_new__imp__BN_BLINDING_new_BN_BLINDING_set_flags__imp__BN_BLINDING_set_flags_BN_BLINDING_set_thread_id__imp__BN_BLINDING_set_thread_id_BN_BLINDING_update__imp__BN_BLINDING_update_BN_CTX_end__imp__BN_CTX_end_BN_CTX_free__imp__BN_CTX_free_BN_CTX_get__imp__BN_CTX_get_BN_CTX_init__imp__BN_CTX_init_BN_CTX_new__imp__BN_CTX_new_BN_CTX_start__imp__BN_CTX_start_BN_GENCB_call__imp__BN_GENCB_call_BN_GF2m_add__imp__BN_GF2m_add_BN_GF2m_arr2poly__imp__BN_GF2m_arr2poly_BN_GF2m_mod__imp__BN_GF2m_mod_BN_GF2m_mod_arr__imp__BN_GF2m_mod_arr_BN_GF2m_mod_div__imp__BN_GF2m_mod_div_BN_GF2m_mod_div_arr__imp__BN_GF2m_mod_div_arr_BN_GF2m_mod_exp__imp__BN_GF2m_mod_exp_BN_GF2m_mod_exp_arr__imp__BN_GF2m_mod_exp_arr_BN_GF2m_mod_inv__imp__BN_GF2m_mod_inv_BN_GF2m_mod_inv_arr__imp__BN_GF2m_mod_inv_arr_BN_GF2m_mod_mul__imp__BN_GF2m_mod_mul_BN_GF2m_mod_mul_arr__imp__BN_GF2m_mod_mul_arr_BN_GF2m_mod_solve_quad__imp__BN_GF2m_mod_solve_quad_BN_GF2m_mod_solve_quad_arr__imp__BN_GF2m_mod_solve_quad_arr_BN_GF2m_mod_sqr__imp__BN_GF2m_mod_sqr_BN_GF2m_mod_sqr_arr__imp__BN_GF2m_mod_sqr_arr_BN_GF2m_mod_sqrt__imp__BN_GF2m_mod_sqrt_BN_GF2m_mod_sqrt_arr__imp__BN_GF2m_mod_sqrt_arr_BN_GF2m_poly2arr__imp__BN_GF2m_poly2arr_BN_MONT_CTX_copy__imp__BN_MONT_CTX_copy_BN_MONT_CTX_free__imp__BN_MONT_CTX_free_BN_MONT_CTX_init__imp__BN_MONT_CTX_init_BN_MONT_CTX_new__imp__BN_MONT_CTX_new_BN_MONT_CTX_set__imp__BN_MONT_CTX_set_BN_MONT_CTX_set_locked__imp__BN_MONT_CTX_set_locked_BN_RECP_CTX_free__imp__BN_RECP_CTX_free_BN_RECP_CTX_init__imp__BN_RECP_CTX_init_BN_RECP_CTX_new__imp__BN_RECP_CTX_new_BN_RECP_CTX_set__imp__BN_RECP_CTX_set_BN_X931_derive_prime_ex__imp__BN_X931_derive_prime_ex_BN_X931_generate_Xpq__imp__BN_X931_generate_Xpq_BN_X931_generate_prime_ex__imp__BN_X931_generate_prime_ex_BN_add__imp__BN_add_BN_add_word__imp__BN_add_word_BN_bin2bn__imp__BN_bin2bn_BN_bn2bin__imp__BN_bn2bin_BN_bn2dec__imp__BN_bn2dec_BN_bn2hex__imp__BN_bn2hex_BN_bn2mpi__imp__BN_bn2mpi_BN_bntest_rand__imp__BN_bntest_rand_BN_clear__imp__BN_clear_BN_clear_bit__imp__BN_clear_bit_BN_clear_free__imp__BN_clear_free_BN_cmp__imp__BN_cmp_BN_copy__imp__BN_copy_BN_dec2bn__imp__BN_dec2bn_BN_div__imp__BN_div_BN_div_recp__imp__BN_div_recp_BN_div_word__imp__BN_div_word_BN_dup__imp__BN_dup_BN_exp__imp__BN_exp_BN_free__imp__BN_free_BN_from_montgomery__imp__BN_from_montgomery_BN_gcd__imp__BN_gcd_BN_generate_prime__imp__BN_generate_prime_BN_generate_prime_ex__imp__BN_generate_prime_ex_BN_get0_nist_prime_192__imp__BN_get0_nist_prime_192_BN_get0_nist_prime_224__imp__BN_get0_nist_prime_224_BN_get0_nist_prime_256__imp__BN_get0_nist_prime_256_BN_get0_nist_prime_384__imp__BN_get0_nist_prime_384_BN_get0_nist_prime_521__imp__BN_get0_nist_prime_521_BN_get_params__imp__BN_get_params_BN_get_word__imp__BN_get_word_BN_hex2bn__imp__BN_hex2bn_BN_init__imp__BN_init_BN_is_bit_set__imp__BN_is_bit_set_BN_is_prime__imp__BN_is_prime_BN_is_prime_ex__imp__BN_is_prime_ex_BN_is_prime_fasttest__imp__BN_is_prime_fasttest_BN_is_prime_fasttest_ex__imp__BN_is_prime_fasttest_ex_BN_kronecker__imp__BN_kronecker_BN_lshift1__imp__BN_lshift1_BN_lshift__imp__BN_lshift_BN_mask_bits__imp__BN_mask_bits_BN_mod_add__imp__BN_mod_add_BN_mod_add_quick__imp__BN_mod_add_quick_BN_mod_exp2_mont__imp__BN_mod_exp2_mont_BN_mod_exp__imp__BN_mod_exp_BN_mod_exp_mont__imp__BN_mod_exp_mont_BN_mod_exp_mont_consttime__imp__BN_mod_exp_mont_consttime_BN_mod_exp_mont_word__imp__BN_mod_exp_mont_word_BN_mod_exp_recp__imp__BN_mod_exp_recp_BN_mod_exp_simple__imp__BN_mod_exp_simple_BN_mod_inverse__imp__BN_mod_inverse_BN_mod_lshift1__imp__BN_mod_lshift1_BN_mod_lshift1_quick__imp__BN_mod_lshift1_quick_BN_mod_lshift__imp__BN_mod_lshift_BN_mod_lshift_quick__imp__BN_mod_lshift_quick_BN_mod_mul__imp__BN_mod_mul_BN_mod_mul_montgomery__imp__BN_mod_mul_montgomery_BN_mod_mul_reciprocal__imp__BN_mod_mul_reciprocal_BN_mod_sqr__imp__BN_mod_sqr_BN_mod_sqrt__imp__BN_mod_sqrt_BN_mod_sub__imp__BN_mod_sub_BN_mod_sub_quick__imp__BN_mod_sub_quick_BN_mod_word__imp__BN_mod_word_BN_mpi2bn__imp__BN_mpi2bn_BN_mul__imp__BN_mul_BN_mul_word__imp__BN_mul_word_BN_new__imp__BN_new_BN_nist_mod_192__imp__BN_nist_mod_192_BN_nist_mod_224__imp__BN_nist_mod_224_BN_nist_mod_256__imp__BN_nist_mod_256_BN_nist_mod_384__imp__BN_nist_mod_384_BN_nist_mod_521__imp__BN_nist_mod_521_BN_nnmod__imp__BN_nnmod_BN_num_bits__imp__BN_num_bits_BN_num_bits_word__imp__BN_num_bits_word_BN_options__imp__BN_options_BN_print__imp__BN_print_BN_print_fp__imp__BN_print_fp_BN_pseudo_rand__imp__BN_pseudo_rand_BN_pseudo_rand_range__imp__BN_pseudo_rand_range_BN_rand__imp__BN_rand_BN_rand_range__imp__BN_rand_range_BN_reciprocal__imp__BN_reciprocal_BN_rshift1__imp__BN_rshift1_BN_rshift__imp__BN_rshift_BN_set_bit__imp__BN_set_bit_BN_set_negative__imp__BN_set_negative_BN_set_params__imp__BN_set_params_BN_set_word__imp__BN_set_word_BN_sqr__imp__BN_sqr_BN_sub__imp__BN_sub_BN_sub_word__imp__BN_sub_word_BN_swap__imp__BN_swap_BN_to_ASN1_ENUMERATED__imp__BN_to_ASN1_ENUMERATED_BN_to_ASN1_INTEGER__imp__BN_to_ASN1_INTEGER_BN_uadd__imp__BN_uadd_BN_ucmp__imp__BN_ucmp_BN_usub__imp__BN_usub_BN_value_one__imp__BN_value_one_BUF_MEM_free__imp__BUF_MEM_free_BUF_MEM_grow__imp__BUF_MEM_grow_BUF_MEM_grow_clean__imp__BUF_MEM_grow_clean_BUF_MEM_new__imp__BUF_MEM_new_BUF_memdup__imp__BUF_memdup_BUF_strdup__imp__BUF_strdup_BUF_strlcat__imp__BUF_strlcat_BUF_strlcpy__imp__BUF_strlcpy_BUF_strndup__imp__BUF_strndup_CAST_cbc_encrypt__imp__CAST_cbc_encrypt_CAST_cfb64_encrypt__imp__CAST_cfb64_encrypt_CAST_decrypt__imp__CAST_decrypt_CAST_ecb_encrypt__imp__CAST_ecb_encrypt_CAST_encrypt__imp__CAST_encrypt_CAST_ofb64_encrypt__imp__CAST_ofb64_encrypt_CAST_set_key__imp__CAST_set_key_CBIGNUM_it__imp__CBIGNUM_it_CERTIFICATEPOLICIES_free__imp__CERTIFICATEPOLICIES_free_CERTIFICATEPOLICIES_it__imp__CERTIFICATEPOLICIES_it_CERTIFICATEPOLICIES_new__imp__CERTIFICATEPOLICIES_new_COMP_CTX_free__imp__COMP_CTX_free_COMP_CTX_new__imp__COMP_CTX_new_COMP_compress_block__imp__COMP_compress_block_COMP_expand_block__imp__COMP_expand_block_COMP_rle__imp__COMP_rle_COMP_zlib__imp__COMP_zlib_COMP_zlib_cleanup__imp__COMP_zlib_cleanup_CONF_dump_bio__imp__CONF_dump_bio_CONF_dump_fp__imp__CONF_dump_fp_CONF_free__imp__CONF_free_CONF_get1_default_config_file__imp__CONF_get1_default_config_file_CONF_get_number__imp__CONF_get_number_CONF_get_section__imp__CONF_get_section_CONF_get_string__imp__CONF_get_string_CONF_imodule_get_flags__imp__CONF_imodule_get_flags_CONF_imodule_get_module__imp__CONF_imodule_get_module_CONF_imodule_get_name__imp__CONF_imodule_get_name_CONF_imodule_get_usr_data__imp__CONF_imodule_get_usr_data_CONF_imodule_get_value__imp__CONF_imodule_get_value_CONF_imodule_set_flags__imp__CONF_imodule_set_flags_CONF_imodule_set_usr_data__imp__CONF_imodule_set_usr_data_CONF_load__imp__CONF_load_CONF_load_bio__imp__CONF_load_bio_CONF_load_fp__imp__CONF_load_fp_CONF_module_add__imp__CONF_module_add_CONF_module_get_usr_data__imp__CONF_module_get_usr_data_CONF_module_set_usr_data__imp__CONF_module_set_usr_data_CONF_modules_finish__imp__CONF_modules_finish_CONF_modules_free__imp__CONF_modules_free_CONF_modules_load__imp__CONF_modules_load_CONF_modules_load_file__imp__CONF_modules_load_file_CONF_modules_unload__imp__CONF_modules_unload_CONF_parse_list__imp__CONF_parse_list_CONF_set_default_method__imp__CONF_set_default_method_CONF_set_nconf__imp__CONF_set_nconf_CRL_DIST_POINTS_free__imp__CRL_DIST_POINTS_free_CRL_DIST_POINTS_it__imp__CRL_DIST_POINTS_it_CRL_DIST_POINTS_new__imp__CRL_DIST_POINTS_new_CRYPTO_add_lock__imp__CRYPTO_add_lock_CRYPTO_cleanup_all_ex_data__imp__CRYPTO_cleanup_all_ex_data_CRYPTO_dbg_free__imp__CRYPTO_dbg_free_CRYPTO_dbg_get_options__imp__CRYPTO_dbg_get_options_CRYPTO_dbg_malloc__imp__CRYPTO_dbg_malloc_CRYPTO_dbg_pop_info__imp__CRYPTO_dbg_pop_info_CRYPTO_dbg_push_info__imp__CRYPTO_dbg_push_info_CRYPTO_dbg_realloc__imp__CRYPTO_dbg_realloc_CRYPTO_dbg_remove_all_info__imp__CRYPTO_dbg_remove_all_info_CRYPTO_dbg_set_options__imp__CRYPTO_dbg_set_options_CRYPTO_destroy_dynlockid__imp__CRYPTO_destroy_dynlockid_CRYPTO_dup_ex_data__imp__CRYPTO_dup_ex_data_CRYPTO_ex_data_new_class__imp__CRYPTO_ex_data_new_class_CRYPTO_free__imp__CRYPTO_free_CRYPTO_free_ex_data__imp__CRYPTO_free_ex_data_CRYPTO_free_locked__imp__CRYPTO_free_locked_CRYPTO_get_add_lock_callback__imp__CRYPTO_get_add_lock_callback_CRYPTO_get_dynlock_create_callback__imp__CRYPTO_get_dynlock_create_callback_CRYPTO_get_dynlock_destroy_callback__imp__CRYPTO_get_dynlock_destroy_callback_CRYPTO_get_dynlock_lock_callback__imp__CRYPTO_get_dynlock_lock_callback_CRYPTO_get_dynlock_value__imp__CRYPTO_get_dynlock_value_CRYPTO_get_ex_data__imp__CRYPTO_get_ex_data_CRYPTO_get_ex_data_implementation__imp__CRYPTO_get_ex_data_implementation_CRYPTO_get_ex_new_index__imp__CRYPTO_get_ex_new_index_CRYPTO_get_id_callback__imp__CRYPTO_get_id_callback_CRYPTO_get_lock_name__imp__CRYPTO_get_lock_name_CRYPTO_get_locked_mem_ex_functions__imp__CRYPTO_get_locked_mem_ex_functions_CRYPTO_get_locked_mem_functions__imp__CRYPTO_get_locked_mem_functions_CRYPTO_get_locking_callback__imp__CRYPTO_get_locking_callback_CRYPTO_get_mem_debug_functions__imp__CRYPTO_get_mem_debug_functions_CRYPTO_get_mem_debug_options__imp__CRYPTO_get_mem_debug_options_CRYPTO_get_mem_ex_functions__imp__CRYPTO_get_mem_ex_functions_CRYPTO_get_mem_functions__imp__CRYPTO_get_mem_functions_CRYPTO_get_new_dynlockid__imp__CRYPTO_get_new_dynlockid_CRYPTO_get_new_lockid__imp__CRYPTO_get_new_lockid_CRYPTO_is_mem_check_on__imp__CRYPTO_is_mem_check_on_CRYPTO_lock__imp__CRYPTO_lock_CRYPTO_malloc__imp__CRYPTO_malloc_CRYPTO_malloc_debug_init__imp__CRYPTO_malloc_debug_init_CRYPTO_malloc_locked__imp__CRYPTO_malloc_locked_CRYPTO_mem_ctrl__imp__CRYPTO_mem_ctrl_CRYPTO_mem_leaks__imp__CRYPTO_mem_leaks_CRYPTO_mem_leaks_cb__imp__CRYPTO_mem_leaks_cb_CRYPTO_mem_leaks_fp__imp__CRYPTO_mem_leaks_fp_CRYPTO_new_ex_data__imp__CRYPTO_new_ex_data_CRYPTO_num_locks__imp__CRYPTO_num_locks_CRYPTO_pop_info__imp__CRYPTO_pop_info_CRYPTO_push_info___imp__CRYPTO_push_info__CRYPTO_realloc__imp__CRYPTO_realloc_CRYPTO_realloc_clean__imp__CRYPTO_realloc_clean_CRYPTO_remalloc__imp__CRYPTO_remalloc_CRYPTO_remove_all_info__imp__CRYPTO_remove_all_info_CRYPTO_set_add_lock_callback__imp__CRYPTO_set_add_lock_callback_CRYPTO_set_dynlock_create_callback__imp__CRYPTO_set_dynlock_create_callback_CRYPTO_set_dynlock_destroy_callback__imp__CRYPTO_set_dynlock_destroy_callback_CRYPTO_set_dynlock_lock_callback__imp__CRYPTO_set_dynlock_lock_callback_CRYPTO_set_ex_data__imp__CRYPTO_set_ex_data_CRYPTO_set_ex_data_implementation__imp__CRYPTO_set_ex_data_implementation_CRYPTO_set_id_callback__imp__CRYPTO_set_id_callback_CRYPTO_set_locked_mem_ex_functions__imp__CRYPTO_set_locked_mem_ex_functions_CRYPTO_set_locked_mem_functions__imp__CRYPTO_set_locked_mem_functions_CRYPTO_set_locking_callback__imp__CRYPTO_set_locking_callback_CRYPTO_set_mem_debug_functions__imp__CRYPTO_set_mem_debug_functions_CRYPTO_set_mem_debug_options__imp__CRYPTO_set_mem_debug_options_CRYPTO_set_mem_ex_functions__imp__CRYPTO_set_mem_ex_functions_CRYPTO_set_mem_functions__imp__CRYPTO_set_mem_functions_CRYPTO_set_mem_info_functions__imp__CRYPTO_set_mem_info_functions_CRYPTO_strdup__imp__CRYPTO_strdup_CRYPTO_thread_id__imp__CRYPTO_thread_id_DES_cbc_cksum__imp__DES_cbc_cksum_DES_cbc_encrypt__imp__DES_cbc_encrypt_DES_cfb64_encrypt__imp__DES_cfb64_encrypt_DES_cfb_encrypt__imp__DES_cfb_encrypt_DES_check_key_parity__imp__DES_check_key_parity_DES_crypt__imp__DES_crypt_DES_decrypt3__imp__DES_decrypt3_DES_ecb3_encrypt__imp__DES_ecb3_encrypt_DES_ecb_encrypt__imp__DES_ecb_encrypt_DES_ede3_cbc_encrypt__imp__DES_ede3_cbc_encrypt_DES_ede3_cbcm_encrypt__imp__DES_ede3_cbcm_encrypt_DES_ede3_cfb64_encrypt__imp__DES_ede3_cfb64_encrypt_DES_ede3_cfb_encrypt__imp__DES_ede3_cfb_encrypt_DES_ede3_ofb64_encrypt__imp__DES_ede3_ofb64_encrypt_DES_enc_read__imp__DES_enc_read_DES_enc_write__imp__DES_enc_write_DES_encrypt1__imp__DES_encrypt1_DES_encrypt2__imp__DES_encrypt2_DES_encrypt3__imp__DES_encrypt3_DES_fcrypt__imp__DES_fcrypt_DES_is_weak_key__imp__DES_is_weak_key_DES_key_sched__imp__DES_key_sched_DES_ncbc_encrypt__imp__DES_ncbc_encrypt_DES_ofb64_encrypt__imp__DES_ofb64_encrypt_DES_ofb_encrypt__imp__DES_ofb_encrypt_DES_options__imp__DES_options_DES_pcbc_encrypt__imp__DES_pcbc_encrypt_DES_quad_cksum__imp__DES_quad_cksum_DES_random_key__imp__DES_random_key_DES_read_2passwords__imp__DES_read_2passwords_DES_read_password__imp__DES_read_password_DES_set_key__imp__DES_set_key_DES_set_key_checked__imp__DES_set_key_checked_DES_set_key_unchecked__imp__DES_set_key_unchecked_DES_set_odd_parity__imp__DES_set_odd_parity_DES_string_to_2keys__imp__DES_string_to_2keys_DES_string_to_key__imp__DES_string_to_key_DES_xcbc_encrypt__imp__DES_xcbc_encrypt_DH_OpenSSL__imp__DH_OpenSSL_DH_check__imp__DH_check_DH_check_pub_key__imp__DH_check_pub_key_DH_compute_key__imp__DH_compute_key_DH_free__imp__DH_free_DH_generate_key__imp__DH_generate_key_DH_generate_parameters__imp__DH_generate_parameters_DH_generate_parameters_ex__imp__DH_generate_parameters_ex_DH_get_default_method__imp__DH_get_default_method_DH_get_ex_data__imp__DH_get_ex_data_DH_get_ex_new_index__imp__DH_get_ex_new_index_DH_new__imp__DH_new_DH_new_method__imp__DH_new_method_DH_set_default_method__imp__DH_set_default_method_DH_set_ex_data__imp__DH_set_ex_data_DH_set_method__imp__DH_set_method_DH_size__imp__DH_size_DH_up_ref__imp__DH_up_ref_DHparams_print__imp__DHparams_print_DHparams_print_fp__imp__DHparams_print_fp_DIRECTORYSTRING_free__imp__DIRECTORYSTRING_free_DIRECTORYSTRING_it__imp__DIRECTORYSTRING_it_DIRECTORYSTRING_new__imp__DIRECTORYSTRING_new_DISPLAYTEXT_free__imp__DISPLAYTEXT_free_DISPLAYTEXT_it__imp__DISPLAYTEXT_it_DISPLAYTEXT_new__imp__DISPLAYTEXT_new_DIST_POINT_NAME_free__imp__DIST_POINT_NAME_free_DIST_POINT_NAME_it__imp__DIST_POINT_NAME_it_DIST_POINT_NAME_new__imp__DIST_POINT_NAME_new_DIST_POINT_free__imp__DIST_POINT_free_DIST_POINT_it__imp__DIST_POINT_it_DIST_POINT_new__imp__DIST_POINT_new_DSA_OpenSSL__imp__DSA_OpenSSL_DSA_SIG_free__imp__DSA_SIG_free_DSA_SIG_new__imp__DSA_SIG_new_DSA_do_sign__imp__DSA_do_sign_DSA_do_verify__imp__DSA_do_verify_DSA_dup_DH__imp__DSA_dup_DH_DSA_free__imp__DSA_free_DSA_generate_key__imp__DSA_generate_key_DSA_generate_parameters__imp__DSA_generate_parameters_DSA_generate_parameters_ex__imp__DSA_generate_parameters_ex_DSA_get_default_method__imp__DSA_get_default_method_DSA_get_ex_data__imp__DSA_get_ex_data_DSA_get_ex_new_index__imp__DSA_get_ex_new_index_DSA_new__imp__DSA_new_DSA_new_method__imp__DSA_new_method_DSA_print__imp__DSA_print_DSA_print_fp__imp__DSA_print_fp_DSA_set_default_method__imp__DSA_set_default_method_DSA_set_ex_data__imp__DSA_set_ex_data_DSA_set_method__imp__DSA_set_method_DSA_sign__imp__DSA_sign_DSA_sign_setup__imp__DSA_sign_setup_DSA_size__imp__DSA_size_DSA_up_ref__imp__DSA_up_ref_DSA_verify__imp__DSA_verify_DSAparams_print__imp__DSAparams_print_DSAparams_print_fp__imp__DSAparams_print_fp_DSO_METHOD_dl__imp__DSO_METHOD_dl_DSO_METHOD_dlfcn__imp__DSO_METHOD_dlfcn_DSO_METHOD_null__imp__DSO_METHOD_null_DSO_METHOD_openssl__imp__DSO_METHOD_openssl_DSO_METHOD_vms__imp__DSO_METHOD_vms_DSO_METHOD_win32__imp__DSO_METHOD_win32_DSO_bind_func__imp__DSO_bind_func_DSO_bind_var__imp__DSO_bind_var_DSO_convert_filename__imp__DSO_convert_filename_DSO_ctrl__imp__DSO_ctrl_DSO_flags__imp__DSO_flags_DSO_free__imp__DSO_free_DSO_get_default_method__imp__DSO_get_default_method_DSO_get_filename__imp__DSO_get_filename_DSO_get_loaded_filename__imp__DSO_get_loaded_filename_DSO_get_method__imp__DSO_get_method_DSO_load__imp__DSO_load_DSO_merge__imp__DSO_merge_DSO_new__imp__DSO_new_DSO_new_method__imp__DSO_new_method_DSO_set_default_method__imp__DSO_set_default_method_DSO_set_filename__imp__DSO_set_filename_DSO_set_method__imp__DSO_set_method_DSO_set_name_converter__imp__DSO_set_name_converter_DSO_up_ref__imp__DSO_up_ref_ECDH_OpenSSL__imp__ECDH_OpenSSL_ECDH_compute_key__imp__ECDH_compute_key_ECDH_get_default_method__imp__ECDH_get_default_method_ECDH_get_ex_data__imp__ECDH_get_ex_data_ECDH_get_ex_new_index__imp__ECDH_get_ex_new_index_ECDH_set_default_method__imp__ECDH_set_default_method_ECDH_set_ex_data__imp__ECDH_set_ex_data_ECDH_set_method__imp__ECDH_set_method_ECDSA_OpenSSL__imp__ECDSA_OpenSSL_ECDSA_SIG_free__imp__ECDSA_SIG_free_ECDSA_SIG_new__imp__ECDSA_SIG_new_ECDSA_do_sign__imp__ECDSA_do_sign_ECDSA_do_sign_ex__imp__ECDSA_do_sign_ex_ECDSA_do_verify__imp__ECDSA_do_verify_ECDSA_get_default_method__imp__ECDSA_get_default_method_ECDSA_get_ex_data__imp__ECDSA_get_ex_data_ECDSA_get_ex_new_index__imp__ECDSA_get_ex_new_index_ECDSA_set_default_method__imp__ECDSA_set_default_method_ECDSA_set_ex_data__imp__ECDSA_set_ex_data_ECDSA_set_method__imp__ECDSA_set_method_ECDSA_sign__imp__ECDSA_sign_ECDSA_sign_ex__imp__ECDSA_sign_ex_ECDSA_sign_setup__imp__ECDSA_sign_setup_ECDSA_size__imp__ECDSA_size_ECDSA_verify__imp__ECDSA_verify_ECPKParameters_print__imp__ECPKParameters_print_ECPKParameters_print_fp__imp__ECPKParameters_print_fp_ECParameters_print__imp__ECParameters_print_ECParameters_print_fp__imp__ECParameters_print_fp_EC_GF2m_simple_method__imp__EC_GF2m_simple_method_EC_GFp_mont_method__imp__EC_GFp_mont_method_EC_GFp_nist_method__imp__EC_GFp_nist_method_EC_GFp_simple_method__imp__EC_GFp_simple_method_EC_GROUP_check__imp__EC_GROUP_check_EC_GROUP_check_discriminant__imp__EC_GROUP_check_discriminant_EC_GROUP_clear_free__imp__EC_GROUP_clear_free_EC_GROUP_cmp__imp__EC_GROUP_cmp_EC_GROUP_copy__imp__EC_GROUP_copy_EC_GROUP_dup__imp__EC_GROUP_dup_EC_GROUP_free__imp__EC_GROUP_free_EC_GROUP_get0_generator__imp__EC_GROUP_get0_generator_EC_GROUP_get0_seed__imp__EC_GROUP_get0_seed_EC_GROUP_get_asn1_flag__imp__EC_GROUP_get_asn1_flag_EC_GROUP_get_basis_type__imp__EC_GROUP_get_basis_type_EC_GROUP_get_cofactor__imp__EC_GROUP_get_cofactor_EC_GROUP_get_curve_GF2m__imp__EC_GROUP_get_curve_GF2m_EC_GROUP_get_curve_GFp__imp__EC_GROUP_get_curve_GFp_EC_GROUP_get_curve_name__imp__EC_GROUP_get_curve_name_EC_GROUP_get_degree__imp__EC_GROUP_get_degree_EC_GROUP_get_order__imp__EC_GROUP_get_order_EC_GROUP_get_pentanomial_basis__imp__EC_GROUP_get_pentanomial_basis_EC_GROUP_get_point_conversion_form__imp__EC_GROUP_get_point_conversion_form_EC_GROUP_get_seed_len__imp__EC_GROUP_get_seed_len_EC_GROUP_get_trinomial_basis__imp__EC_GROUP_get_trinomial_basis_EC_GROUP_have_precompute_mult__imp__EC_GROUP_have_precompute_mult_EC_GROUP_method_of__imp__EC_GROUP_method_of_EC_GROUP_new__imp__EC_GROUP_new_EC_GROUP_new_by_curve_name__imp__EC_GROUP_new_by_curve_name_EC_GROUP_new_curve_GF2m__imp__EC_GROUP_new_curve_GF2m_EC_GROUP_new_curve_GFp__imp__EC_GROUP_new_curve_GFp_EC_GROUP_precompute_mult__imp__EC_GROUP_precompute_mult_EC_GROUP_set_asn1_flag__imp__EC_GROUP_set_asn1_flag_EC_GROUP_set_curve_GF2m__imp__EC_GROUP_set_curve_GF2m_EC_GROUP_set_curve_GFp__imp__EC_GROUP_set_curve_GFp_EC_GROUP_set_curve_name__imp__EC_GROUP_set_curve_name_EC_GROUP_set_generator__imp__EC_GROUP_set_generator_EC_GROUP_set_point_conversion_form__imp__EC_GROUP_set_point_conversion_form_EC_GROUP_set_seed__imp__EC_GROUP_set_seed_EC_KEY_check_key__imp__EC_KEY_check_key_EC_KEY_copy__imp__EC_KEY_copy_EC_KEY_dup__imp__EC_KEY_dup_EC_KEY_free__imp__EC_KEY_free_EC_KEY_generate_key__imp__EC_KEY_generate_key_EC_KEY_get0_group__imp__EC_KEY_get0_group_EC_KEY_get0_private_key__imp__EC_KEY_get0_private_key_EC_KEY_get0_public_key__imp__EC_KEY_get0_public_key_EC_KEY_get_conv_form__imp__EC_KEY_get_conv_form_EC_KEY_get_enc_flags__imp__EC_KEY_get_enc_flags_EC_KEY_get_key_method_data__imp__EC_KEY_get_key_method_data_EC_KEY_insert_key_method_data__imp__EC_KEY_insert_key_method_data_EC_KEY_new__imp__EC_KEY_new_EC_KEY_new_by_curve_name__imp__EC_KEY_new_by_curve_name_EC_KEY_precompute_mult__imp__EC_KEY_precompute_mult_EC_KEY_print__imp__EC_KEY_print_EC_KEY_print_fp__imp__EC_KEY_print_fp_EC_KEY_set_asn1_flag__imp__EC_KEY_set_asn1_flag_EC_KEY_set_conv_form__imp__EC_KEY_set_conv_form_EC_KEY_set_enc_flags__imp__EC_KEY_set_enc_flags_EC_KEY_set_group__imp__EC_KEY_set_group_EC_KEY_set_private_key__imp__EC_KEY_set_private_key_EC_KEY_set_public_key__imp__EC_KEY_set_public_key_EC_KEY_up_ref__imp__EC_KEY_up_ref_EC_METHOD_get_field_type__imp__EC_METHOD_get_field_type_EC_POINT_add__imp__EC_POINT_add_EC_POINT_bn2point__imp__EC_POINT_bn2point_EC_POINT_clear_free__imp__EC_POINT_clear_free_EC_POINT_cmp__imp__EC_POINT_cmp_EC_POINT_copy__imp__EC_POINT_copy_EC_POINT_dbl__imp__EC_POINT_dbl_EC_POINT_dup__imp__EC_POINT_dup_EC_POINT_free__imp__EC_POINT_free_EC_POINT_get_Jprojective_coordinates_GFp__imp__EC_POINT_get_Jprojective_coordinates_GFp_EC_POINT_get_affine_coordinates_GF2m__imp__EC_POINT_get_affine_coordinates_GF2m_EC_POINT_get_affine_coordinates_GFp__imp__EC_POINT_get_affine_coordinates_GFp_EC_POINT_hex2point__imp__EC_POINT_hex2point_EC_POINT_invert__imp__EC_POINT_invert_EC_POINT_is_at_infinity__imp__EC_POINT_is_at_infinity_EC_POINT_is_on_curve__imp__EC_POINT_is_on_curve_EC_POINT_make_affine__imp__EC_POINT_make_affine_EC_POINT_method_of__imp__EC_POINT_method_of_EC_POINT_mul__imp__EC_POINT_mul_EC_POINT_new__imp__EC_POINT_new_EC_POINT_oct2point__imp__EC_POINT_oct2point_EC_POINT_point2bn__imp__EC_POINT_point2bn_EC_POINT_point2hex__imp__EC_POINT_point2hex_EC_POINT_point2oct__imp__EC_POINT_point2oct_EC_POINT_set_Jprojective_coordinates_GFp__imp__EC_POINT_set_Jprojective_coordinates_GFp_EC_POINT_set_affine_coordinates_GF2m__imp__EC_POINT_set_affine_coordinates_GF2m_EC_POINT_set_affine_coordinates_GFp__imp__EC_POINT_set_affine_coordinates_GFp_EC_POINT_set_compressed_coordinates_GF2m__imp__EC_POINT_set_compressed_coordinates_GF2m_EC_POINT_set_compressed_coordinates_GFp__imp__EC_POINT_set_compressed_coordinates_GFp_EC_POINT_set_to_infinity__imp__EC_POINT_set_to_infinity_EC_POINTs_make_affine__imp__EC_POINTs_make_affine_EC_POINTs_mul__imp__EC_POINTs_mul_EC_get_builtin_curves__imp__EC_get_builtin_curves_EDIPARTYNAME_free__imp__EDIPARTYNAME_free_EDIPARTYNAME_it__imp__EDIPARTYNAME_it_EDIPARTYNAME_new__imp__EDIPARTYNAME_new_ENGINE_add__imp__ENGINE_add_ENGINE_add_conf_module__imp__ENGINE_add_conf_module_ENGINE_by_id__imp__ENGINE_by_id_ENGINE_cleanup__imp__ENGINE_cleanup_ENGINE_cmd_is_executable__imp__ENGINE_cmd_is_executable_ENGINE_ctrl__imp__ENGINE_ctrl_ENGINE_ctrl_cmd__imp__ENGINE_ctrl_cmd_ENGINE_ctrl_cmd_string__imp__ENGINE_ctrl_cmd_string_ENGINE_finish__imp__ENGINE_finish_ENGINE_free__imp__ENGINE_free_ENGINE_get_DH__imp__ENGINE_get_DH_ENGINE_get_DSA__imp__ENGINE_get_DSA_ENGINE_get_ECDH__imp__ENGINE_get_ECDH_ENGINE_get_ECDSA__imp__ENGINE_get_ECDSA_ENGINE_get_RAND__imp__ENGINE_get_RAND_ENGINE_get_RSA__imp__ENGINE_get_RSA_ENGINE_get_STORE__imp__ENGINE_get_STORE_ENGINE_get_cipher__imp__ENGINE_get_cipher_ENGINE_get_cipher_engine__imp__ENGINE_get_cipher_engine_ENGINE_get_ciphers__imp__ENGINE_get_ciphers_ENGINE_get_cmd_defns__imp__ENGINE_get_cmd_defns_ENGINE_get_ctrl_function__imp__ENGINE_get_ctrl_function_ENGINE_get_default_DH__imp__ENGINE_get_default_DH_ENGINE_get_default_DSA__imp__ENGINE_get_default_DSA_ENGINE_get_default_ECDH__imp__ENGINE_get_default_ECDH_ENGINE_get_default_ECDSA__imp__ENGINE_get_default_ECDSA_ENGINE_get_default_RAND__imp__ENGINE_get_default_RAND_ENGINE_get_default_RSA__imp__ENGINE_get_default_RSA_ENGINE_get_destroy_function__imp__ENGINE_get_destroy_function_ENGINE_get_digest__imp__ENGINE_get_digest_ENGINE_get_digest_engine__imp__ENGINE_get_digest_engine_ENGINE_get_digests__imp__ENGINE_get_digests_ENGINE_get_ex_data__imp__ENGINE_get_ex_data_ENGINE_get_ex_new_index__imp__ENGINE_get_ex_new_index_ENGINE_get_finish_function__imp__ENGINE_get_finish_function_ENGINE_get_first__imp__ENGINE_get_first_ENGINE_get_flags__imp__ENGINE_get_flags_ENGINE_get_id__imp__ENGINE_get_id_ENGINE_get_init_function__imp__ENGINE_get_init_function_ENGINE_get_last__imp__ENGINE_get_last_ENGINE_get_load_privkey_function__imp__ENGINE_get_load_privkey_function_ENGINE_get_load_pubkey_function__imp__ENGINE_get_load_pubkey_function_ENGINE_get_name__imp__ENGINE_get_name_ENGINE_get_next__imp__ENGINE_get_next_ENGINE_get_prev__imp__ENGINE_get_prev_ENGINE_get_ssl_client_cert_function__imp__ENGINE_get_ssl_client_cert_function_ENGINE_get_static_state__imp__ENGINE_get_static_state_ENGINE_get_table_flags__imp__ENGINE_get_table_flags_ENGINE_init__imp__ENGINE_init_ENGINE_load_4758cca__imp__ENGINE_load_4758cca_ENGINE_load_aep__imp__ENGINE_load_aep_ENGINE_load_atalla__imp__ENGINE_load_atalla_ENGINE_load_builtin_engines__imp__ENGINE_load_builtin_engines_ENGINE_load_chil__imp__ENGINE_load_chil_ENGINE_load_cryptodev__imp__ENGINE_load_cryptodev_ENGINE_load_cswift__imp__ENGINE_load_cswift_ENGINE_load_dynamic__imp__ENGINE_load_dynamic_ENGINE_load_nuron__imp__ENGINE_load_nuron_ENGINE_load_openssl__imp__ENGINE_load_openssl_ENGINE_load_padlock__imp__ENGINE_load_padlock_ENGINE_load_private_key__imp__ENGINE_load_private_key_ENGINE_load_public_key__imp__ENGINE_load_public_key_ENGINE_load_ssl_client_cert__imp__ENGINE_load_ssl_client_cert_ENGINE_load_sureware__imp__ENGINE_load_sureware_ENGINE_load_ubsec__imp__ENGINE_load_ubsec_ENGINE_new__imp__ENGINE_new_ENGINE_register_DH__imp__ENGINE_register_DH_ENGINE_register_DSA__imp__ENGINE_register_DSA_ENGINE_register_ECDH__imp__ENGINE_register_ECDH_ENGINE_register_ECDSA__imp__ENGINE_register_ECDSA_ENGINE_register_RAND__imp__ENGINE_register_RAND_ENGINE_register_RSA__imp__ENGINE_register_RSA_ENGINE_register_STORE__imp__ENGINE_register_STORE_ENGINE_register_all_DH__imp__ENGINE_register_all_DH_ENGINE_register_all_DSA__imp__ENGINE_register_all_DSA_ENGINE_register_all_ECDH__imp__ENGINE_register_all_ECDH_ENGINE_register_all_ECDSA__imp__ENGINE_register_all_ECDSA_ENGINE_register_all_RAND__imp__ENGINE_register_all_RAND_ENGINE_register_all_RSA__imp__ENGINE_register_all_RSA_ENGINE_register_all_STORE__imp__ENGINE_register_all_STORE_ENGINE_register_all_ciphers__imp__ENGINE_register_all_ciphers_ENGINE_register_all_complete__imp__ENGINE_register_all_complete_ENGINE_register_all_digests__imp__ENGINE_register_all_digests_ENGINE_register_ciphers__imp__ENGINE_register_ciphers_ENGINE_register_complete__imp__ENGINE_register_complete_ENGINE_register_digests__imp__ENGINE_register_digests_ENGINE_remove__imp__ENGINE_remove_ENGINE_set_DH__imp__ENGINE_set_DH_ENGINE_set_DSA__imp__ENGINE_set_DSA_ENGINE_set_ECDH__imp__ENGINE_set_ECDH_ENGINE_set_ECDSA__imp__ENGINE_set_ECDSA_ENGINE_set_RAND__imp__ENGINE_set_RAND_ENGINE_set_RSA__imp__ENGINE_set_RSA_ENGINE_set_STORE__imp__ENGINE_set_STORE_ENGINE_set_ciphers__imp__ENGINE_set_ciphers_ENGINE_set_cmd_defns__imp__ENGINE_set_cmd_defns_ENGINE_set_ctrl_function__imp__ENGINE_set_ctrl_function_ENGINE_set_default__imp__ENGINE_set_default_ENGINE_set_default_DH__imp__ENGINE_set_default_DH_ENGINE_set_default_DSA__imp__ENGINE_set_default_DSA_ENGINE_set_default_ECDH__imp__ENGINE_set_default_ECDH_ENGINE_set_default_ECDSA__imp__ENGINE_set_default_ECDSA_ENGINE_set_default_RAND__imp__ENGINE_set_default_RAND_ENGINE_set_default_RSA__imp__ENGINE_set_default_RSA_ENGINE_set_default_ciphers__imp__ENGINE_set_default_ciphers_ENGINE_set_default_digests__imp__ENGINE_set_default_digests_ENGINE_set_default_string__imp__ENGINE_set_default_string_ENGINE_set_destroy_function__imp__ENGINE_set_destroy_function_ENGINE_set_digests__imp__ENGINE_set_digests_ENGINE_set_ex_data__imp__ENGINE_set_ex_data_ENGINE_set_finish_function__imp__ENGINE_set_finish_function_ENGINE_set_flags__imp__ENGINE_set_flags_ENGINE_set_id__imp__ENGINE_set_id_ENGINE_set_init_function__imp__ENGINE_set_init_function_ENGINE_set_load_privkey_function__imp__ENGINE_set_load_privkey_function_ENGINE_set_load_pubkey_function__imp__ENGINE_set_load_pubkey_function_ENGINE_set_load_ssl_client_cert_function__imp__ENGINE_set_load_ssl_client_cert_function_ENGINE_set_name__imp__ENGINE_set_name_ENGINE_set_table_flags__imp__ENGINE_set_table_flags_ENGINE_unregister_DH__imp__ENGINE_unregister_DH_ENGINE_unregister_DSA__imp__ENGINE_unregister_DSA_ENGINE_unregister_ECDH__imp__ENGINE_unregister_ECDH_ENGINE_unregister_ECDSA__imp__ENGINE_unregister_ECDSA_ENGINE_unregister_RAND__imp__ENGINE_unregister_RAND_ENGINE_unregister_RSA__imp__ENGINE_unregister_RSA_ENGINE_unregister_STORE__imp__ENGINE_unregister_STORE_ENGINE_unregister_ciphers__imp__ENGINE_unregister_ciphers_ENGINE_unregister_digests__imp__ENGINE_unregister_digests_ENGINE_up_ref__imp__ENGINE_up_ref_ERR_add_error_data__imp__ERR_add_error_data_ERR_clear_error__imp__ERR_clear_error_ERR_error_string__imp__ERR_error_string_ERR_error_string_n__imp__ERR_error_string_n_ERR_free_strings__imp__ERR_free_strings_ERR_func_error_string__imp__ERR_func_error_string_ERR_get_err_state_table__imp__ERR_get_err_state_table_ERR_get_error__imp__ERR_get_error_ERR_get_error_line__imp__ERR_get_error_line_ERR_get_error_line_data__imp__ERR_get_error_line_data_ERR_get_implementation__imp__ERR_get_implementation_ERR_get_next_error_library__imp__ERR_get_next_error_library_ERR_get_state__imp__ERR_get_state_ERR_get_string_table__imp__ERR_get_string_table_ERR_lib_error_string__imp__ERR_lib_error_string_ERR_load_ASN1_strings__imp__ERR_load_ASN1_strings_ERR_load_BIO_strings__imp__ERR_load_BIO_strings_ERR_load_BN_strings__imp__ERR_load_BN_strings_ERR_load_BUF_strings__imp__ERR_load_BUF_strings_ERR_load_COMP_strings__imp__ERR_load_COMP_strings_ERR_load_CONF_strings__imp__ERR_load_CONF_strings_ERR_load_CRYPTO_strings__imp__ERR_load_CRYPTO_strings_ERR_load_DH_strings__imp__ERR_load_DH_strings_ERR_load_DSA_strings__imp__ERR_load_DSA_strings_ERR_load_DSO_strings__imp__ERR_load_DSO_strings_ERR_load_ECDH_strings__imp__ERR_load_ECDH_strings_ERR_load_ECDSA_strings__imp__ERR_load_ECDSA_strings_ERR_load_EC_strings__imp__ERR_load_EC_strings_ERR_load_ENGINE_strings__imp__ERR_load_ENGINE_strings_ERR_load_ERR_strings__imp__ERR_load_ERR_strings_ERR_load_EVP_strings__imp__ERR_load_EVP_strings_ERR_load_OBJ_strings__imp__ERR_load_OBJ_strings_ERR_load_OCSP_strings__imp__ERR_load_OCSP_strings_ERR_load_PEM_strings__imp__ERR_load_PEM_strings_ERR_load_PKCS12_strings__imp__ERR_load_PKCS12_strings_ERR_load_PKCS7_strings__imp__ERR_load_PKCS7_strings_ERR_load_RAND_strings__imp__ERR_load_RAND_strings_ERR_load_RSA_strings__imp__ERR_load_RSA_strings_ERR_load_STORE_strings__imp__ERR_load_STORE_strings_ERR_load_UI_strings__imp__ERR_load_UI_strings_ERR_load_X509V3_strings__imp__ERR_load_X509V3_strings_ERR_load_X509_strings__imp__ERR_load_X509_strings_ERR_load_crypto_strings__imp__ERR_load_crypto_strings_ERR_load_strings__imp__ERR_load_strings_ERR_peek_error__imp__ERR_peek_error_ERR_peek_error_line__imp__ERR_peek_error_line_ERR_peek_error_line_data__imp__ERR_peek_error_line_data_ERR_peek_last_error__imp__ERR_peek_last_error_ERR_peek_last_error_line__imp__ERR_peek_last_error_line_ERR_peek_last_error_line_data__imp__ERR_peek_last_error_line_data_ERR_pop_to_mark__imp__ERR_pop_to_mark_ERR_print_errors__imp__ERR_print_errors_ERR_print_errors_cb__imp__ERR_print_errors_cb_ERR_print_errors_fp__imp__ERR_print_errors_fp_ERR_put_error__imp__ERR_put_error_ERR_reason_error_string__imp__ERR_reason_error_string_ERR_release_err_state_table__imp__ERR_release_err_state_table_ERR_remove_state__imp__ERR_remove_state_ERR_set_error_data__imp__ERR_set_error_data_ERR_set_implementation__imp__ERR_set_implementation_ERR_set_mark__imp__ERR_set_mark_ERR_unload_strings__imp__ERR_unload_strings_EVP_BytesToKey__imp__EVP_BytesToKey_EVP_CIPHER_CTX_block_size__imp__EVP_CIPHER_CTX_block_size_EVP_CIPHER_CTX_cipher__imp__EVP_CIPHER_CTX_cipher_EVP_CIPHER_CTX_cleanup__imp__EVP_CIPHER_CTX_cleanup_EVP_CIPHER_CTX_clear_flags__imp__EVP_CIPHER_CTX_clear_flags_EVP_CIPHER_CTX_ctrl__imp__EVP_CIPHER_CTX_ctrl_EVP_CIPHER_CTX_flags__imp__EVP_CIPHER_CTX_flags_EVP_CIPHER_CTX_free__imp__EVP_CIPHER_CTX_free_EVP_CIPHER_CTX_get_app_data__imp__EVP_CIPHER_CTX_get_app_data_EVP_CIPHER_CTX_init__imp__EVP_CIPHER_CTX_init_EVP_CIPHER_CTX_iv_length__imp__EVP_CIPHER_CTX_iv_length_EVP_CIPHER_CTX_key_length__imp__EVP_CIPHER_CTX_key_length_EVP_CIPHER_CTX_new__imp__EVP_CIPHER_CTX_new_EVP_CIPHER_CTX_nid__imp__EVP_CIPHER_CTX_nid_EVP_CIPHER_CTX_rand_key__imp__EVP_CIPHER_CTX_rand_key_EVP_CIPHER_CTX_set_app_data__imp__EVP_CIPHER_CTX_set_app_data_EVP_CIPHER_CTX_set_flags__imp__EVP_CIPHER_CTX_set_flags_EVP_CIPHER_CTX_set_key_length__imp__EVP_CIPHER_CTX_set_key_length_EVP_CIPHER_CTX_set_padding__imp__EVP_CIPHER_CTX_set_padding_EVP_CIPHER_CTX_test_flags__imp__EVP_CIPHER_CTX_test_flags_EVP_CIPHER_asn1_to_param__imp__EVP_CIPHER_asn1_to_param_EVP_CIPHER_block_size__imp__EVP_CIPHER_block_size_EVP_CIPHER_flags__imp__EVP_CIPHER_flags_EVP_CIPHER_get_asn1_iv__imp__EVP_CIPHER_get_asn1_iv_EVP_CIPHER_iv_length__imp__EVP_CIPHER_iv_length_EVP_CIPHER_key_length__imp__EVP_CIPHER_key_length_EVP_CIPHER_nid__imp__EVP_CIPHER_nid_EVP_CIPHER_param_to_asn1__imp__EVP_CIPHER_param_to_asn1_EVP_CIPHER_set_asn1_iv__imp__EVP_CIPHER_set_asn1_iv_EVP_CIPHER_type__imp__EVP_CIPHER_type_EVP_CipherFinal__imp__EVP_CipherFinal_EVP_CipherFinal_ex__imp__EVP_CipherFinal_ex_EVP_CipherInit__imp__EVP_CipherInit_EVP_CipherInit_ex__imp__EVP_CipherInit_ex_EVP_CipherUpdate__imp__EVP_CipherUpdate_EVP_Cipher__imp__EVP_Cipher_EVP_DecodeBlock__imp__EVP_DecodeBlock_EVP_DecodeFinal__imp__EVP_DecodeFinal_EVP_DecodeInit__imp__EVP_DecodeInit_EVP_DecodeUpdate__imp__EVP_DecodeUpdate_EVP_DecryptFinal__imp__EVP_DecryptFinal_EVP_DecryptFinal_ex__imp__EVP_DecryptFinal_ex_EVP_DecryptInit__imp__EVP_DecryptInit_EVP_DecryptInit_ex__imp__EVP_DecryptInit_ex_EVP_DecryptUpdate__imp__EVP_DecryptUpdate_EVP_DigestFinal__imp__EVP_DigestFinal_EVP_DigestFinal_ex__imp__EVP_DigestFinal_ex_EVP_DigestInit__imp__EVP_DigestInit_EVP_DigestInit_ex__imp__EVP_DigestInit_ex_EVP_DigestUpdate__imp__EVP_DigestUpdate_EVP_Digest__imp__EVP_Digest_EVP_EncodeBlock__imp__EVP_EncodeBlock_EVP_EncodeFinal__imp__EVP_EncodeFinal_EVP_EncodeInit__imp__EVP_EncodeInit_EVP_EncodeUpdate__imp__EVP_EncodeUpdate_EVP_EncryptFinal__imp__EVP_EncryptFinal_EVP_EncryptFinal_ex__imp__EVP_EncryptFinal_ex_EVP_EncryptInit__imp__EVP_EncryptInit_EVP_EncryptInit_ex__imp__EVP_EncryptInit_ex_EVP_EncryptUpdate__imp__EVP_EncryptUpdate_EVP_MD_CTX_cleanup__imp__EVP_MD_CTX_cleanup_EVP_MD_CTX_clear_flags__imp__EVP_MD_CTX_clear_flags_EVP_MD_CTX_copy__imp__EVP_MD_CTX_copy_EVP_MD_CTX_copy_ex__imp__EVP_MD_CTX_copy_ex_EVP_MD_CTX_create__imp__EVP_MD_CTX_create_EVP_MD_CTX_destroy__imp__EVP_MD_CTX_destroy_EVP_MD_CTX_init__imp__EVP_MD_CTX_init_EVP_MD_CTX_md__imp__EVP_MD_CTX_md_EVP_MD_CTX_set_flags__imp__EVP_MD_CTX_set_flags_EVP_MD_CTX_test_flags__imp__EVP_MD_CTX_test_flags_EVP_MD_block_size__imp__EVP_MD_block_size_EVP_MD_pkey_type__imp__EVP_MD_pkey_type_EVP_MD_size__imp__EVP_MD_size_EVP_MD_type__imp__EVP_MD_type_EVP_OpenFinal__imp__EVP_OpenFinal_EVP_OpenInit__imp__EVP_OpenInit_EVP_PBE_CipherInit__imp__EVP_PBE_CipherInit_EVP_PBE_alg_add__imp__EVP_PBE_alg_add_EVP_PBE_cleanup__imp__EVP_PBE_cleanup_EVP_PKCS82PKEY__imp__EVP_PKCS82PKEY_EVP_PKEY2PKCS8__imp__EVP_PKEY2PKCS8_EVP_PKEY2PKCS8_broken__imp__EVP_PKEY2PKCS8_broken_EVP_PKEY_add1_attr__imp__EVP_PKEY_add1_attr_EVP_PKEY_add1_attr_by_NID__imp__EVP_PKEY_add1_attr_by_NID_EVP_PKEY_add1_attr_by_OBJ__imp__EVP_PKEY_add1_attr_by_OBJ_EVP_PKEY_add1_attr_by_txt__imp__EVP_PKEY_add1_attr_by_txt_EVP_PKEY_assign__imp__EVP_PKEY_assign_EVP_PKEY_bits__imp__EVP_PKEY_bits_EVP_PKEY_cmp__imp__EVP_PKEY_cmp_EVP_PKEY_cmp_parameters__imp__EVP_PKEY_cmp_parameters_EVP_PKEY_copy_parameters__imp__EVP_PKEY_copy_parameters_EVP_PKEY_decrypt__imp__EVP_PKEY_decrypt_EVP_PKEY_delete_attr__imp__EVP_PKEY_delete_attr_EVP_PKEY_encrypt__imp__EVP_PKEY_encrypt_EVP_PKEY_free__imp__EVP_PKEY_free_EVP_PKEY_get1_DH__imp__EVP_PKEY_get1_DH_EVP_PKEY_get1_DSA__imp__EVP_PKEY_get1_DSA_EVP_PKEY_get1_EC_KEY__imp__EVP_PKEY_get1_EC_KEY_EVP_PKEY_get1_RSA__imp__EVP_PKEY_get1_RSA_EVP_PKEY_get_attr__imp__EVP_PKEY_get_attr_EVP_PKEY_get_attr_by_NID__imp__EVP_PKEY_get_attr_by_NID_EVP_PKEY_get_attr_by_OBJ__imp__EVP_PKEY_get_attr_by_OBJ_EVP_PKEY_get_attr_count__imp__EVP_PKEY_get_attr_count_EVP_PKEY_missing_parameters__imp__EVP_PKEY_missing_parameters_EVP_PKEY_new__imp__EVP_PKEY_new_EVP_PKEY_save_parameters__imp__EVP_PKEY_save_parameters_EVP_PKEY_set1_DH__imp__EVP_PKEY_set1_DH_EVP_PKEY_set1_DSA__imp__EVP_PKEY_set1_DSA_EVP_PKEY_set1_EC_KEY__imp__EVP_PKEY_set1_EC_KEY_EVP_PKEY_set1_RSA__imp__EVP_PKEY_set1_RSA_EVP_PKEY_size__imp__EVP_PKEY_size_EVP_PKEY_type__imp__EVP_PKEY_type_EVP_SealFinal__imp__EVP_SealFinal_EVP_SealInit__imp__EVP_SealInit_EVP_SignFinal__imp__EVP_SignFinal_EVP_VerifyFinal__imp__EVP_VerifyFinal_EVP_add_alg_module__imp__EVP_add_alg_module_EVP_add_cipher__imp__EVP_add_cipher_EVP_add_digest__imp__EVP_add_digest_EVP_aes_128_cbc__imp__EVP_aes_128_cbc_EVP_aes_128_cfb128__imp__EVP_aes_128_cfb128_EVP_aes_128_cfb1__imp__EVP_aes_128_cfb1_EVP_aes_128_cfb8__imp__EVP_aes_128_cfb8_EVP_aes_128_ecb__imp__EVP_aes_128_ecb_EVP_aes_128_ofb__imp__EVP_aes_128_ofb_EVP_aes_192_cbc__imp__EVP_aes_192_cbc_EVP_aes_192_cfb128__imp__EVP_aes_192_cfb128_EVP_aes_192_cfb1__imp__EVP_aes_192_cfb1_EVP_aes_192_cfb8__imp__EVP_aes_192_cfb8_EVP_aes_192_ecb__imp__EVP_aes_192_ecb_EVP_aes_192_ofb__imp__EVP_aes_192_ofb_EVP_aes_256_cbc__imp__EVP_aes_256_cbc_EVP_aes_256_cfb128__imp__EVP_aes_256_cfb128_EVP_aes_256_cfb1__imp__EVP_aes_256_cfb1_EVP_aes_256_cfb8__imp__EVP_aes_256_cfb8_EVP_aes_256_ecb__imp__EVP_aes_256_ecb_EVP_aes_256_ofb__imp__EVP_aes_256_ofb_EVP_bf_cbc__imp__EVP_bf_cbc_EVP_bf_cfb64__imp__EVP_bf_cfb64_EVP_bf_ecb__imp__EVP_bf_ecb_EVP_bf_ofb__imp__EVP_bf_ofb_EVP_cast5_cbc__imp__EVP_cast5_cbc_EVP_cast5_cfb64__imp__EVP_cast5_cfb64_EVP_cast5_ecb__imp__EVP_cast5_ecb_EVP_cast5_ofb__imp__EVP_cast5_ofb_EVP_cleanup__imp__EVP_cleanup_EVP_des_cbc__imp__EVP_des_cbc_EVP_des_cfb1__imp__EVP_des_cfb1_EVP_des_cfb64__imp__EVP_des_cfb64_EVP_des_cfb8__imp__EVP_des_cfb8_EVP_des_ecb__imp__EVP_des_ecb_EVP_des_ede3__imp__EVP_des_ede3_EVP_des_ede3_cbc__imp__EVP_des_ede3_cbc_EVP_des_ede3_cfb1__imp__EVP_des_ede3_cfb1_EVP_des_ede3_cfb64__imp__EVP_des_ede3_cfb64_EVP_des_ede3_cfb8__imp__EVP_des_ede3_cfb8_EVP_des_ede3_ecb__imp__EVP_des_ede3_ecb_EVP_des_ede3_ofb__imp__EVP_des_ede3_ofb_EVP_des_ede__imp__EVP_des_ede_EVP_des_ede_cbc__imp__EVP_des_ede_cbc_EVP_des_ede_cfb64__imp__EVP_des_ede_cfb64_EVP_des_ede_ecb__imp__EVP_des_ede_ecb_EVP_des_ede_ofb__imp__EVP_des_ede_ofb_EVP_des_ofb__imp__EVP_des_ofb_EVP_desx_cbc__imp__EVP_desx_cbc_EVP_dss1__imp__EVP_dss1_EVP_dss__imp__EVP_dss_EVP_ecdsa__imp__EVP_ecdsa_EVP_enc_null__imp__EVP_enc_null_EVP_get_cipherbyname__imp__EVP_get_cipherbyname_EVP_get_digestbyname__imp__EVP_get_digestbyname_EVP_get_pw_prompt__imp__EVP_get_pw_prompt_EVP_idea_cbc__imp__EVP_idea_cbc_EVP_idea_cfb64__imp__EVP_idea_cfb64_EVP_idea_ecb__imp__EVP_idea_ecb_EVP_idea_ofb__imp__EVP_idea_ofb_EVP_md2__imp__EVP_md2_EVP_md4__imp__EVP_md4_EVP_md5__imp__EVP_md5_EVP_md_null__imp__EVP_md_null_EVP_rc2_40_cbc__imp__EVP_rc2_40_cbc_EVP_rc2_64_cbc__imp__EVP_rc2_64_cbc_EVP_rc2_cbc__imp__EVP_rc2_cbc_EVP_rc2_cfb64__imp__EVP_rc2_cfb64_EVP_rc2_ecb__imp__EVP_rc2_ecb_EVP_rc2_ofb__imp__EVP_rc2_ofb_EVP_rc4__imp__EVP_rc4_EVP_rc4_40__imp__EVP_rc4_40_EVP_read_pw_string__imp__EVP_read_pw_string_EVP_ripemd160__imp__EVP_ripemd160_EVP_set_pw_prompt__imp__EVP_set_pw_prompt_EVP_sha1__imp__EVP_sha1_EVP_sha224__imp__EVP_sha224_EVP_sha256__imp__EVP_sha256_EVP_sha384__imp__EVP_sha384_EVP_sha512__imp__EVP_sha512_EVP_sha__imp__EVP_sha_EXTENDED_KEY_USAGE_free__imp__EXTENDED_KEY_USAGE_free_EXTENDED_KEY_USAGE_it__imp__EXTENDED_KEY_USAGE_it_EXTENDED_KEY_USAGE_new__imp__EXTENDED_KEY_USAGE_new_GENERAL_NAMES_free__imp__GENERAL_NAMES_free_GENERAL_NAMES_it__imp__GENERAL_NAMES_it_GENERAL_NAMES_new__imp__GENERAL_NAMES_new_GENERAL_NAME_free__imp__GENERAL_NAME_free_GENERAL_NAME_it__imp__GENERAL_NAME_it_GENERAL_NAME_new__imp__GENERAL_NAME_new_GENERAL_NAME_print__imp__GENERAL_NAME_print_GENERAL_SUBTREE_free__imp__GENERAL_SUBTREE_free_GENERAL_SUBTREE_it__imp__GENERAL_SUBTREE_it_GENERAL_SUBTREE_new__imp__GENERAL_SUBTREE_new_HMAC__imp__HMAC_HMAC_CTX_cleanup__imp__HMAC_CTX_cleanup_HMAC_CTX_init__imp__HMAC_CTX_init_HMAC_CTX_set_flags__imp__HMAC_CTX_set_flags_HMAC_Final__imp__HMAC_Final_HMAC_Init__imp__HMAC_Init_HMAC_Init_ex__imp__HMAC_Init_ex_HMAC_Update__imp__HMAC_Update_KRB5_APREQBODY_free__imp__KRB5_APREQBODY_free_KRB5_APREQBODY_it__imp__KRB5_APREQBODY_it_KRB5_APREQBODY_new__imp__KRB5_APREQBODY_new_KRB5_APREQ_free__imp__KRB5_APREQ_free_KRB5_APREQ_it__imp__KRB5_APREQ_it_KRB5_APREQ_new__imp__KRB5_APREQ_new_KRB5_AUTHDATA_free__imp__KRB5_AUTHDATA_free_KRB5_AUTHDATA_it__imp__KRB5_AUTHDATA_it_KRB5_AUTHDATA_new__imp__KRB5_AUTHDATA_new_KRB5_AUTHENTBODY_free__imp__KRB5_AUTHENTBODY_free_KRB5_AUTHENTBODY_it__imp__KRB5_AUTHENTBODY_it_KRB5_AUTHENTBODY_new__imp__KRB5_AUTHENTBODY_new_KRB5_AUTHENT_free__imp__KRB5_AUTHENT_free_KRB5_AUTHENT_it__imp__KRB5_AUTHENT_it_KRB5_AUTHENT_new__imp__KRB5_AUTHENT_new_KRB5_CHECKSUM_free__imp__KRB5_CHECKSUM_free_KRB5_CHECKSUM_it__imp__KRB5_CHECKSUM_it_KRB5_CHECKSUM_new__imp__KRB5_CHECKSUM_new_KRB5_ENCDATA_free__imp__KRB5_ENCDATA_free_KRB5_ENCDATA_it__imp__KRB5_ENCDATA_it_KRB5_ENCDATA_new__imp__KRB5_ENCDATA_new_KRB5_ENCKEY_free__imp__KRB5_ENCKEY_free_KRB5_ENCKEY_it__imp__KRB5_ENCKEY_it_KRB5_ENCKEY_new__imp__KRB5_ENCKEY_new_KRB5_PRINCNAME_free__imp__KRB5_PRINCNAME_free_KRB5_PRINCNAME_it__imp__KRB5_PRINCNAME_it_KRB5_PRINCNAME_new__imp__KRB5_PRINCNAME_new_KRB5_TICKET_free__imp__KRB5_TICKET_free_KRB5_TICKET_it__imp__KRB5_TICKET_it_KRB5_TICKET_new__imp__KRB5_TICKET_new_KRB5_TKTBODY_free__imp__KRB5_TKTBODY_free_KRB5_TKTBODY_it__imp__KRB5_TKTBODY_it_KRB5_TKTBODY_new__imp__KRB5_TKTBODY_new_LONG_it__imp__LONG_it_MD2__imp__MD2_MD2_Final__imp__MD2_Final_MD2_Init__imp__MD2_Init_MD2_Update__imp__MD2_Update_MD2_options__imp__MD2_options_MD4__imp__MD4_MD4_Final__imp__MD4_Final_MD4_Init__imp__MD4_Init_MD4_Transform__imp__MD4_Transform_MD4_Update__imp__MD4_Update_MD5__imp__MD5_MD5_Final__imp__MD5_Final_MD5_Init__imp__MD5_Init_MD5_Transform__imp__MD5_Transform_MD5_Update__imp__MD5_Update_NAME_CONSTRAINTS_free__imp__NAME_CONSTRAINTS_free_NAME_CONSTRAINTS_it__imp__NAME_CONSTRAINTS_it_NAME_CONSTRAINTS_new__imp__NAME_CONSTRAINTS_new_NCONF_WIN32__imp__NCONF_WIN32_NCONF_default__imp__NCONF_default_NCONF_dump_bio__imp__NCONF_dump_bio_NCONF_dump_fp__imp__NCONF_dump_fp_NCONF_free__imp__NCONF_free_NCONF_free_data__imp__NCONF_free_data_NCONF_get_number_e__imp__NCONF_get_number_e_NCONF_get_section__imp__NCONF_get_section_NCONF_get_string__imp__NCONF_get_string_NCONF_load__imp__NCONF_load_NCONF_load_bio__imp__NCONF_load_bio_NCONF_load_fp__imp__NCONF_load_fp_NCONF_new__imp__NCONF_new_NETSCAPE_CERT_SEQUENCE_free__imp__NETSCAPE_CERT_SEQUENCE_free_NETSCAPE_CERT_SEQUENCE_it__imp__NETSCAPE_CERT_SEQUENCE_it_NETSCAPE_CERT_SEQUENCE_new__imp__NETSCAPE_CERT_SEQUENCE_new_NETSCAPE_SPKAC_free__imp__NETSCAPE_SPKAC_free_NETSCAPE_SPKAC_it__imp__NETSCAPE_SPKAC_it_NETSCAPE_SPKAC_new__imp__NETSCAPE_SPKAC_new_NETSCAPE_SPKI_b64_decode__imp__NETSCAPE_SPKI_b64_decode_NETSCAPE_SPKI_b64_encode__imp__NETSCAPE_SPKI_b64_encode_NETSCAPE_SPKI_free__imp__NETSCAPE_SPKI_free_NETSCAPE_SPKI_get_pubkey__imp__NETSCAPE_SPKI_get_pubkey_NETSCAPE_SPKI_it__imp__NETSCAPE_SPKI_it_NETSCAPE_SPKI_new__imp__NETSCAPE_SPKI_new_NETSCAPE_SPKI_print__imp__NETSCAPE_SPKI_print_NETSCAPE_SPKI_set_pubkey__imp__NETSCAPE_SPKI_set_pubkey_NETSCAPE_SPKI_sign__imp__NETSCAPE_SPKI_sign_NETSCAPE_SPKI_verify__imp__NETSCAPE_SPKI_verify_NOTICEREF_free__imp__NOTICEREF_free_NOTICEREF_it__imp__NOTICEREF_it_NOTICEREF_new__imp__NOTICEREF_new_OBJ_NAME_add__imp__OBJ_NAME_add_OBJ_NAME_cleanup__imp__OBJ_NAME_cleanup_OBJ_NAME_do_all__imp__OBJ_NAME_do_all_OBJ_NAME_do_all_sorted__imp__OBJ_NAME_do_all_sorted_OBJ_NAME_get__imp__OBJ_NAME_get_OBJ_NAME_init__imp__OBJ_NAME_init_OBJ_NAME_new_index__imp__OBJ_NAME_new_index_OBJ_NAME_remove__imp__OBJ_NAME_remove_OBJ_add_object__imp__OBJ_add_object_OBJ_bsearch__imp__OBJ_bsearch_OBJ_bsearch_ex__imp__OBJ_bsearch_ex_OBJ_cleanup__imp__OBJ_cleanup_OBJ_cmp__imp__OBJ_cmp_OBJ_create__imp__OBJ_create_OBJ_create_objects__imp__OBJ_create_objects_OBJ_dup__imp__OBJ_dup_OBJ_ln2nid__imp__OBJ_ln2nid_OBJ_new_nid__imp__OBJ_new_nid_OBJ_nid2ln__imp__OBJ_nid2ln_OBJ_nid2obj__imp__OBJ_nid2obj_OBJ_nid2sn__imp__OBJ_nid2sn_OBJ_obj2nid__imp__OBJ_obj2nid_OBJ_obj2txt__imp__OBJ_obj2txt_OBJ_sn2nid__imp__OBJ_sn2nid_OBJ_txt2nid__imp__OBJ_txt2nid_OBJ_txt2obj__imp__OBJ_txt2obj_OCSP_BASICRESP_add1_ext_i2d__imp__OCSP_BASICRESP_add1_ext_i2d_OCSP_BASICRESP_add_ext__imp__OCSP_BASICRESP_add_ext_OCSP_BASICRESP_delete_ext__imp__OCSP_BASICRESP_delete_ext_OCSP_BASICRESP_free__imp__OCSP_BASICRESP_free_OCSP_BASICRESP_get1_ext_d2i__imp__OCSP_BASICRESP_get1_ext_d2i_OCSP_BASICRESP_get_ext__imp__OCSP_BASICRESP_get_ext_OCSP_BASICRESP_get_ext_by_NID__imp__OCSP_BASICRESP_get_ext_by_NID_OCSP_BASICRESP_get_ext_by_OBJ__imp__OCSP_BASICRESP_get_ext_by_OBJ_OCSP_BASICRESP_get_ext_by_critical__imp__OCSP_BASICRESP_get_ext_by_critical_OCSP_BASICRESP_get_ext_count__imp__OCSP_BASICRESP_get_ext_count_OCSP_BASICRESP_it__imp__OCSP_BASICRESP_it_OCSP_BASICRESP_new__imp__OCSP_BASICRESP_new_OCSP_CERTID_free__imp__OCSP_CERTID_free_OCSP_CERTID_it__imp__OCSP_CERTID_it_OCSP_CERTID_new__imp__OCSP_CERTID_new_OCSP_CERTSTATUS_free__imp__OCSP_CERTSTATUS_free_OCSP_CERTSTATUS_it__imp__OCSP_CERTSTATUS_it_OCSP_CERTSTATUS_new__imp__OCSP_CERTSTATUS_new_OCSP_CRLID_free__imp__OCSP_CRLID_free_OCSP_CRLID_it__imp__OCSP_CRLID_it_OCSP_CRLID_new__imp__OCSP_CRLID_new_OCSP_ONEREQ_add1_ext_i2d__imp__OCSP_ONEREQ_add1_ext_i2d_OCSP_ONEREQ_add_ext__imp__OCSP_ONEREQ_add_ext_OCSP_ONEREQ_delete_ext__imp__OCSP_ONEREQ_delete_ext_OCSP_ONEREQ_free__imp__OCSP_ONEREQ_free_OCSP_ONEREQ_get1_ext_d2i__imp__OCSP_ONEREQ_get1_ext_d2i_OCSP_ONEREQ_get_ext__imp__OCSP_ONEREQ_get_ext_OCSP_ONEREQ_get_ext_by_NID__imp__OCSP_ONEREQ_get_ext_by_NID_OCSP_ONEREQ_get_ext_by_OBJ__imp__OCSP_ONEREQ_get_ext_by_OBJ_OCSP_ONEREQ_get_ext_by_critical__imp__OCSP_ONEREQ_get_ext_by_critical_OCSP_ONEREQ_get_ext_count__imp__OCSP_ONEREQ_get_ext_count_OCSP_ONEREQ_it__imp__OCSP_ONEREQ_it_OCSP_ONEREQ_new__imp__OCSP_ONEREQ_new_OCSP_REQINFO_free__imp__OCSP_REQINFO_free_OCSP_REQINFO_it__imp__OCSP_REQINFO_it_OCSP_REQINFO_new__imp__OCSP_REQINFO_new_OCSP_REQUEST_add1_ext_i2d__imp__OCSP_REQUEST_add1_ext_i2d_OCSP_REQUEST_add_ext__imp__OCSP_REQUEST_add_ext_OCSP_REQUEST_delete_ext__imp__OCSP_REQUEST_delete_ext_OCSP_REQUEST_free__imp__OCSP_REQUEST_free_OCSP_REQUEST_get1_ext_d2i__imp__OCSP_REQUEST_get1_ext_d2i_OCSP_REQUEST_get_ext__imp__OCSP_REQUEST_get_ext_OCSP_REQUEST_get_ext_by_NID__imp__OCSP_REQUEST_get_ext_by_NID_OCSP_REQUEST_get_ext_by_OBJ__imp__OCSP_REQUEST_get_ext_by_OBJ_OCSP_REQUEST_get_ext_by_critical__imp__OCSP_REQUEST_get_ext_by_critical_OCSP_REQUEST_get_ext_count__imp__OCSP_REQUEST_get_ext_count_OCSP_REQUEST_it__imp__OCSP_REQUEST_it_OCSP_REQUEST_new__imp__OCSP_REQUEST_new_OCSP_REQUEST_print__imp__OCSP_REQUEST_print_OCSP_REQ_CTX_free__imp__OCSP_REQ_CTX_free_OCSP_RESPBYTES_free__imp__OCSP_RESPBYTES_free_OCSP_RESPBYTES_it__imp__OCSP_RESPBYTES_it_OCSP_RESPBYTES_new__imp__OCSP_RESPBYTES_new_OCSP_RESPDATA_free__imp__OCSP_RESPDATA_free_OCSP_RESPDATA_it__imp__OCSP_RESPDATA_it_OCSP_RESPDATA_new__imp__OCSP_RESPDATA_new_OCSP_RESPID_free__imp__OCSP_RESPID_free_OCSP_RESPID_it__imp__OCSP_RESPID_it_OCSP_RESPID_new__imp__OCSP_RESPID_new_OCSP_RESPONSE_free__imp__OCSP_RESPONSE_free_OCSP_RESPONSE_it__imp__OCSP_RESPONSE_it_OCSP_RESPONSE_new__imp__OCSP_RESPONSE_new_OCSP_RESPONSE_print__imp__OCSP_RESPONSE_print_OCSP_REVOKEDINFO_free__imp__OCSP_REVOKEDINFO_free_OCSP_REVOKEDINFO_it__imp__OCSP_REVOKEDINFO_it_OCSP_REVOKEDINFO_new__imp__OCSP_REVOKEDINFO_new_OCSP_SERVICELOC_free__imp__OCSP_SERVICELOC_free_OCSP_SERVICELOC_it__imp__OCSP_SERVICELOC_it_OCSP_SERVICELOC_new__imp__OCSP_SERVICELOC_new_OCSP_SIGNATURE_free__imp__OCSP_SIGNATURE_free_OCSP_SIGNATURE_it__imp__OCSP_SIGNATURE_it_OCSP_SIGNATURE_new__imp__OCSP_SIGNATURE_new_OCSP_SINGLERESP_add1_ext_i2d__imp__OCSP_SINGLERESP_add1_ext_i2d_OCSP_SINGLERESP_add_ext__imp__OCSP_SINGLERESP_add_ext_OCSP_SINGLERESP_delete_ext__imp__OCSP_SINGLERESP_delete_ext_OCSP_SINGLERESP_free__imp__OCSP_SINGLERESP_free_OCSP_SINGLERESP_get1_ext_d2i__imp__OCSP_SINGLERESP_get1_ext_d2i_OCSP_SINGLERESP_get_ext__imp__OCSP_SINGLERESP_get_ext_OCSP_SINGLERESP_get_ext_by_NID__imp__OCSP_SINGLERESP_get_ext_by_NID_OCSP_SINGLERESP_get_ext_by_OBJ__imp__OCSP_SINGLERESP_get_ext_by_OBJ_OCSP_SINGLERESP_get_ext_by_critical__imp__OCSP_SINGLERESP_get_ext_by_critical_OCSP_SINGLERESP_get_ext_count__imp__OCSP_SINGLERESP_get_ext_count_OCSP_SINGLERESP_it__imp__OCSP_SINGLERESP_it_OCSP_SINGLERESP_new__imp__OCSP_SINGLERESP_new_OCSP_accept_responses_new__imp__OCSP_accept_responses_new_OCSP_archive_cutoff_new__imp__OCSP_archive_cutoff_new_OCSP_basic_add1_cert__imp__OCSP_basic_add1_cert_OCSP_basic_add1_nonce__imp__OCSP_basic_add1_nonce_OCSP_basic_add1_status__imp__OCSP_basic_add1_status_OCSP_basic_sign__imp__OCSP_basic_sign_OCSP_basic_verify__imp__OCSP_basic_verify_OCSP_cert_id_new__imp__OCSP_cert_id_new_OCSP_cert_status_str__imp__OCSP_cert_status_str_OCSP_cert_to_id__imp__OCSP_cert_to_id_OCSP_check_nonce__imp__OCSP_check_nonce_OCSP_check_validity__imp__OCSP_check_validity_OCSP_copy_nonce__imp__OCSP_copy_nonce_OCSP_crlID_new__imp__OCSP_crlID_new_OCSP_crl_reason_str__imp__OCSP_crl_reason_str_OCSP_id_cmp__imp__OCSP_id_cmp_OCSP_id_get0_info__imp__OCSP_id_get0_info_OCSP_id_issuer_cmp__imp__OCSP_id_issuer_cmp_OCSP_onereq_get0_id__imp__OCSP_onereq_get0_id_OCSP_parse_url__imp__OCSP_parse_url_OCSP_request_add0_id__imp__OCSP_request_add0_id_OCSP_request_add1_cert__imp__OCSP_request_add1_cert_OCSP_request_add1_nonce__imp__OCSP_request_add1_nonce_OCSP_request_is_signed__imp__OCSP_request_is_signed_OCSP_request_onereq_count__imp__OCSP_request_onereq_count_OCSP_request_onereq_get0__imp__OCSP_request_onereq_get0_OCSP_request_set1_name__imp__OCSP_request_set1_name_OCSP_request_sign__imp__OCSP_request_sign_OCSP_request_verify__imp__OCSP_request_verify_OCSP_resp_count__imp__OCSP_resp_count_OCSP_resp_find__imp__OCSP_resp_find_OCSP_resp_find_status__imp__OCSP_resp_find_status_OCSP_resp_get0__imp__OCSP_resp_get0_OCSP_response_create__imp__OCSP_response_create_OCSP_response_get1_basic__imp__OCSP_response_get1_basic_OCSP_response_status__imp__OCSP_response_status_OCSP_response_status_str__imp__OCSP_response_status_str_OCSP_sendreq_bio__imp__OCSP_sendreq_bio_OCSP_sendreq_nbio__imp__OCSP_sendreq_nbio_OCSP_sendreq_new__imp__OCSP_sendreq_new_OCSP_single_get0_status__imp__OCSP_single_get0_status_OCSP_url_svcloc_new__imp__OCSP_url_svcloc_new_OPENSSL_DIR_end__imp__OPENSSL_DIR_end_OPENSSL_DIR_read__imp__OPENSSL_DIR_read_OPENSSL_add_all_algorithms_conf__imp__OPENSSL_add_all_algorithms_conf_OPENSSL_add_all_algorithms_noconf__imp__OPENSSL_add_all_algorithms_noconf_OPENSSL_cleanse__imp__OPENSSL_cleanse_OPENSSL_config__imp__OPENSSL_config_OPENSSL_ia32cap_loc__imp__OPENSSL_ia32cap_loc_OPENSSL_init__imp__OPENSSL_init_OPENSSL_isservice__imp__OPENSSL_isservice_OPENSSL_issetugid__imp__OPENSSL_issetugid_OPENSSL_load_builtin_modules__imp__OPENSSL_load_builtin_modules_OPENSSL_no_config__imp__OPENSSL_no_config_OTHERNAME_free__imp__OTHERNAME_free_OTHERNAME_it__imp__OTHERNAME_it_OTHERNAME_new__imp__OTHERNAME_new_OpenSSLDie__imp__OpenSSLDie_OpenSSL_add_all_ciphers__imp__OpenSSL_add_all_ciphers_OpenSSL_add_all_digests__imp__OpenSSL_add_all_digests_PBE2PARAM_free__imp__PBE2PARAM_free_PBE2PARAM_it__imp__PBE2PARAM_it_PBE2PARAM_new__imp__PBE2PARAM_new_PBEPARAM_free__imp__PBEPARAM_free_PBEPARAM_it__imp__PBEPARAM_it_PBEPARAM_new__imp__PBEPARAM_new_PBKDF2PARAM_free__imp__PBKDF2PARAM_free_PBKDF2PARAM_it__imp__PBKDF2PARAM_it_PBKDF2PARAM_new__imp__PBKDF2PARAM_new_PEM_ASN1_read__imp__PEM_ASN1_read_PEM_ASN1_read_bio__imp__PEM_ASN1_read_bio_PEM_ASN1_write__imp__PEM_ASN1_write_PEM_ASN1_write_bio__imp__PEM_ASN1_write_bio_PEM_SealFinal__imp__PEM_SealFinal_PEM_SealInit__imp__PEM_SealInit_PEM_SealUpdate__imp__PEM_SealUpdate_PEM_SignFinal__imp__PEM_SignFinal_PEM_SignInit__imp__PEM_SignInit_PEM_SignUpdate__imp__PEM_SignUpdate_PEM_X509_INFO_read__imp__PEM_X509_INFO_read_PEM_X509_INFO_read_bio__imp__PEM_X509_INFO_read_bio_PEM_X509_INFO_write_bio__imp__PEM_X509_INFO_write_bio_PEM_bytes_read_bio__imp__PEM_bytes_read_bio_PEM_def_callback__imp__PEM_def_callback_PEM_dek_info__imp__PEM_dek_info_PEM_do_header__imp__PEM_do_header_PEM_get_EVP_CIPHER_INFO__imp__PEM_get_EVP_CIPHER_INFO_PEM_proc_type__imp__PEM_proc_type_PEM_read__imp__PEM_read_PEM_read_DHparams__imp__PEM_read_DHparams_PEM_read_DSAPrivateKey__imp__PEM_read_DSAPrivateKey_PEM_read_DSA_PUBKEY__imp__PEM_read_DSA_PUBKEY_PEM_read_DSAparams__imp__PEM_read_DSAparams_PEM_read_ECPKParameters__imp__PEM_read_ECPKParameters_PEM_read_ECPrivateKey__imp__PEM_read_ECPrivateKey_PEM_read_EC_PUBKEY__imp__PEM_read_EC_PUBKEY_PEM_read_NETSCAPE_CERT_SEQUENCE__imp__PEM_read_NETSCAPE_CERT_SEQUENCE_PEM_read_PKCS7__imp__PEM_read_PKCS7_PEM_read_PKCS8__imp__PEM_read_PKCS8_PEM_read_PKCS8_PRIV_KEY_INFO__imp__PEM_read_PKCS8_PRIV_KEY_INFO_PEM_read_PUBKEY__imp__PEM_read_PUBKEY_PEM_read_PrivateKey__imp__PEM_read_PrivateKey_PEM_read_RSAPrivateKey__imp__PEM_read_RSAPrivateKey_PEM_read_RSAPublicKey__imp__PEM_read_RSAPublicKey_PEM_read_RSA_PUBKEY__imp__PEM_read_RSA_PUBKEY_PEM_read_X509__imp__PEM_read_X509_PEM_read_X509_AUX__imp__PEM_read_X509_AUX_PEM_read_X509_CERT_PAIR__imp__PEM_read_X509_CERT_PAIR_PEM_read_X509_CRL__imp__PEM_read_X509_CRL_PEM_read_X509_REQ__imp__PEM_read_X509_REQ_PEM_read_bio__imp__PEM_read_bio_PEM_read_bio_DHparams__imp__PEM_read_bio_DHparams_PEM_read_bio_DSAPrivateKey__imp__PEM_read_bio_DSAPrivateKey_PEM_read_bio_DSA_PUBKEY__imp__PEM_read_bio_DSA_PUBKEY_PEM_read_bio_DSAparams__imp__PEM_read_bio_DSAparams_PEM_read_bio_ECPKParameters__imp__PEM_read_bio_ECPKParameters_PEM_read_bio_ECPrivateKey__imp__PEM_read_bio_ECPrivateKey_PEM_read_bio_EC_PUBKEY__imp__PEM_read_bio_EC_PUBKEY_PEM_read_bio_NETSCAPE_CERT_SEQUENCE__imp__PEM_read_bio_NETSCAPE_CERT_SEQUENCE_PEM_read_bio_PKCS7__imp__PEM_read_bio_PKCS7_PEM_read_bio_PKCS8__imp__PEM_read_bio_PKCS8_PEM_read_bio_PKCS8_PRIV_KEY_INFO__imp__PEM_read_bio_PKCS8_PRIV_KEY_INFO_PEM_read_bio_PUBKEY__imp__PEM_read_bio_PUBKEY_PEM_read_bio_PrivateKey__imp__PEM_read_bio_PrivateKey_PEM_read_bio_RSAPrivateKey__imp__PEM_read_bio_RSAPrivateKey_PEM_read_bio_RSAPublicKey__imp__PEM_read_bio_RSAPublicKey_PEM_read_bio_RSA_PUBKEY__imp__PEM_read_bio_RSA_PUBKEY_PEM_read_bio_X509__imp__PEM_read_bio_X509_PEM_read_bio_X509_AUX__imp__PEM_read_bio_X509_AUX_PEM_read_bio_X509_CERT_PAIR__imp__PEM_read_bio_X509_CERT_PAIR_PEM_read_bio_X509_CRL__imp__PEM_read_bio_X509_CRL_PEM_read_bio_X509_REQ__imp__PEM_read_bio_X509_REQ_PEM_write__imp__PEM_write_PEM_write_DHparams__imp__PEM_write_DHparams_PEM_write_DSAPrivateKey__imp__PEM_write_DSAPrivateKey_PEM_write_DSA_PUBKEY__imp__PEM_write_DSA_PUBKEY_PEM_write_DSAparams__imp__PEM_write_DSAparams_PEM_write_ECPKParameters__imp__PEM_write_ECPKParameters_PEM_write_ECPrivateKey__imp__PEM_write_ECPrivateKey_PEM_write_EC_PUBKEY__imp__PEM_write_EC_PUBKEY_PEM_write_NETSCAPE_CERT_SEQUENCE__imp__PEM_write_NETSCAPE_CERT_SEQUENCE_PEM_write_PKCS7__imp__PEM_write_PKCS7_PEM_write_PKCS8PrivateKey__imp__PEM_write_PKCS8PrivateKey_PEM_write_PKCS8PrivateKey_nid__imp__PEM_write_PKCS8PrivateKey_nid_PEM_write_PKCS8__imp__PEM_write_PKCS8_PEM_write_PKCS8_PRIV_KEY_INFO__imp__PEM_write_PKCS8_PRIV_KEY_INFO_PEM_write_PUBKEY__imp__PEM_write_PUBKEY_PEM_write_PrivateKey__imp__PEM_write_PrivateKey_PEM_write_RSAPrivateKey__imp__PEM_write_RSAPrivateKey_PEM_write_RSAPublicKey__imp__PEM_write_RSAPublicKey_PEM_write_RSA_PUBKEY__imp__PEM_write_RSA_PUBKEY_PEM_write_X509__imp__PEM_write_X509_PEM_write_X509_AUX__imp__PEM_write_X509_AUX_PEM_write_X509_CERT_PAIR__imp__PEM_write_X509_CERT_PAIR_PEM_write_X509_CRL__imp__PEM_write_X509_CRL_PEM_write_X509_REQ__imp__PEM_write_X509_REQ_PEM_write_X509_REQ_NEW__imp__PEM_write_X509_REQ_NEW_PEM_write_bio__imp__PEM_write_bio_PEM_write_bio_DHparams__imp__PEM_write_bio_DHparams_PEM_write_bio_DSAPrivateKey__imp__PEM_write_bio_DSAPrivateKey_PEM_write_bio_DSA_PUBKEY__imp__PEM_write_bio_DSA_PUBKEY_PEM_write_bio_DSAparams__imp__PEM_write_bio_DSAparams_PEM_write_bio_ECPKParameters__imp__PEM_write_bio_ECPKParameters_PEM_write_bio_ECPrivateKey__imp__PEM_write_bio_ECPrivateKey_PEM_write_bio_EC_PUBKEY__imp__PEM_write_bio_EC_PUBKEY_PEM_write_bio_NETSCAPE_CERT_SEQUENCE__imp__PEM_write_bio_NETSCAPE_CERT_SEQUENCE_PEM_write_bio_PKCS7__imp__PEM_write_bio_PKCS7_PEM_write_bio_PKCS8PrivateKey__imp__PEM_write_bio_PKCS8PrivateKey_PEM_write_bio_PKCS8PrivateKey_nid__imp__PEM_write_bio_PKCS8PrivateKey_nid_PEM_write_bio_PKCS8__imp__PEM_write_bio_PKCS8_PEM_write_bio_PKCS8_PRIV_KEY_INFO__imp__PEM_write_bio_PKCS8_PRIV_KEY_INFO_PEM_write_bio_PUBKEY__imp__PEM_write_bio_PUBKEY_PEM_write_bio_PrivateKey__imp__PEM_write_bio_PrivateKey_PEM_write_bio_RSAPrivateKey__imp__PEM_write_bio_RSAPrivateKey_PEM_write_bio_RSAPublicKey__imp__PEM_write_bio_RSAPublicKey_PEM_write_bio_RSA_PUBKEY__imp__PEM_write_bio_RSA_PUBKEY_PEM_write_bio_X509__imp__PEM_write_bio_X509_PEM_write_bio_X509_AUX__imp__PEM_write_bio_X509_AUX_PEM_write_bio_X509_CERT_PAIR__imp__PEM_write_bio_X509_CERT_PAIR_PEM_write_bio_X509_CRL__imp__PEM_write_bio_X509_CRL_PEM_write_bio_X509_REQ__imp__PEM_write_bio_X509_REQ_PEM_write_bio_X509_REQ_NEW__imp__PEM_write_bio_X509_REQ_NEW_PKCS12_AUTHSAFES_it__imp__PKCS12_AUTHSAFES_it_PKCS12_BAGS_free__imp__PKCS12_BAGS_free_PKCS12_BAGS_it__imp__PKCS12_BAGS_it_PKCS12_BAGS_new__imp__PKCS12_BAGS_new_PKCS12_MAC_DATA_free__imp__PKCS12_MAC_DATA_free_PKCS12_MAC_DATA_it__imp__PKCS12_MAC_DATA_it_PKCS12_MAC_DATA_new__imp__PKCS12_MAC_DATA_new_PKCS12_MAKE_KEYBAG__imp__PKCS12_MAKE_KEYBAG_PKCS12_MAKE_SHKEYBAG__imp__PKCS12_MAKE_SHKEYBAG_PKCS12_PBE_add__imp__PKCS12_PBE_add_PKCS12_PBE_keyivgen__imp__PKCS12_PBE_keyivgen_PKCS12_SAFEBAGS_it__imp__PKCS12_SAFEBAGS_it_PKCS12_SAFEBAG_free__imp__PKCS12_SAFEBAG_free_PKCS12_SAFEBAG_it__imp__PKCS12_SAFEBAG_it_PKCS12_SAFEBAG_new__imp__PKCS12_SAFEBAG_new_PKCS12_add_CSPName_asc__imp__PKCS12_add_CSPName_asc_PKCS12_add_cert__imp__PKCS12_add_cert_PKCS12_add_friendlyname_asc__imp__PKCS12_add_friendlyname_asc_PKCS12_add_friendlyname_uni__imp__PKCS12_add_friendlyname_uni_PKCS12_add_key__imp__PKCS12_add_key_PKCS12_add_localkeyid__imp__PKCS12_add_localkeyid_PKCS12_add_safe__imp__PKCS12_add_safe_PKCS12_add_safes__imp__PKCS12_add_safes_PKCS12_certbag2x509__imp__PKCS12_certbag2x509_PKCS12_certbag2x509crl__imp__PKCS12_certbag2x509crl_PKCS12_create__imp__PKCS12_create_PKCS12_decrypt_skey__imp__PKCS12_decrypt_skey_PKCS12_free__imp__PKCS12_free_PKCS12_gen_mac__imp__PKCS12_gen_mac_PKCS12_get_attr_gen__imp__PKCS12_get_attr_gen_PKCS12_get_friendlyname__imp__PKCS12_get_friendlyname_PKCS12_init__imp__PKCS12_init_PKCS12_item_decrypt_d2i__imp__PKCS12_item_decrypt_d2i_PKCS12_item_i2d_encrypt__imp__PKCS12_item_i2d_encrypt_PKCS12_item_pack_safebag__imp__PKCS12_item_pack_safebag_PKCS12_it__imp__PKCS12_it_PKCS12_key_gen_asc__imp__PKCS12_key_gen_asc_PKCS12_key_gen_uni__imp__PKCS12_key_gen_uni_PKCS12_new__imp__PKCS12_new_PKCS12_newpass__imp__PKCS12_newpass_PKCS12_pack_authsafes__imp__PKCS12_pack_authsafes_PKCS12_pack_p7data__imp__PKCS12_pack_p7data_PKCS12_pack_p7encdata__imp__PKCS12_pack_p7encdata_PKCS12_parse__imp__PKCS12_parse_PKCS12_pbe_crypt__imp__PKCS12_pbe_crypt_PKCS12_set_mac__imp__PKCS12_set_mac_PKCS12_setup_mac__imp__PKCS12_setup_mac_PKCS12_unpack_authsafes__imp__PKCS12_unpack_authsafes_PKCS12_unpack_p7data__imp__PKCS12_unpack_p7data_PKCS12_unpack_p7encdata__imp__PKCS12_unpack_p7encdata_PKCS12_verify_mac__imp__PKCS12_verify_mac_PKCS12_x5092certbag__imp__PKCS12_x5092certbag_PKCS12_x509crl2certbag__imp__PKCS12_x509crl2certbag_PKCS1_MGF1__imp__PKCS1_MGF1_PKCS5_PBE_add__imp__PKCS5_PBE_add_PKCS5_PBE_keyivgen__imp__PKCS5_PBE_keyivgen_PKCS5_PBKDF2_HMAC_SHA1__imp__PKCS5_PBKDF2_HMAC_SHA1_PKCS5_pbe2_set__imp__PKCS5_pbe2_set_PKCS5_pbe_set__imp__PKCS5_pbe_set_PKCS5_v2_PBE_keyivgen__imp__PKCS5_v2_PBE_keyivgen_PKCS7_ATTR_SIGN_it__imp__PKCS7_ATTR_SIGN_it_PKCS7_ATTR_VERIFY_it__imp__PKCS7_ATTR_VERIFY_it_PKCS7_DIGEST_free__imp__PKCS7_DIGEST_free_PKCS7_DIGEST_it__imp__PKCS7_DIGEST_it_PKCS7_DIGEST_new__imp__PKCS7_DIGEST_new_PKCS7_ENCRYPT_free__imp__PKCS7_ENCRYPT_free_PKCS7_ENCRYPT_it__imp__PKCS7_ENCRYPT_it_PKCS7_ENCRYPT_new__imp__PKCS7_ENCRYPT_new_PKCS7_ENC_CONTENT_free__imp__PKCS7_ENC_CONTENT_free_PKCS7_ENC_CONTENT_it__imp__PKCS7_ENC_CONTENT_it_PKCS7_ENC_CONTENT_new__imp__PKCS7_ENC_CONTENT_new_PKCS7_ENVELOPE_free__imp__PKCS7_ENVELOPE_free_PKCS7_ENVELOPE_it__imp__PKCS7_ENVELOPE_it_PKCS7_ENVELOPE_new__imp__PKCS7_ENVELOPE_new_PKCS7_ISSUER_AND_SERIAL_digest__imp__PKCS7_ISSUER_AND_SERIAL_digest_PKCS7_ISSUER_AND_SERIAL_free__imp__PKCS7_ISSUER_AND_SERIAL_free_PKCS7_ISSUER_AND_SERIAL_it__imp__PKCS7_ISSUER_AND_SERIAL_it_PKCS7_ISSUER_AND_SERIAL_new__imp__PKCS7_ISSUER_AND_SERIAL_new_PKCS7_RECIP_INFO_free__imp__PKCS7_RECIP_INFO_free_PKCS7_RECIP_INFO_it__imp__PKCS7_RECIP_INFO_it_PKCS7_RECIP_INFO_new__imp__PKCS7_RECIP_INFO_new_PKCS7_RECIP_INFO_set__imp__PKCS7_RECIP_INFO_set_PKCS7_SIGNED_free__imp__PKCS7_SIGNED_free_PKCS7_SIGNED_it__imp__PKCS7_SIGNED_it_PKCS7_SIGNED_new__imp__PKCS7_SIGNED_new_PKCS7_SIGNER_INFO_free__imp__PKCS7_SIGNER_INFO_free_PKCS7_SIGNER_INFO_it__imp__PKCS7_SIGNER_INFO_it_PKCS7_SIGNER_INFO_new__imp__PKCS7_SIGNER_INFO_new_PKCS7_SIGNER_INFO_set__imp__PKCS7_SIGNER_INFO_set_PKCS7_SIGN_ENVELOPE_free__imp__PKCS7_SIGN_ENVELOPE_free_PKCS7_SIGN_ENVELOPE_it__imp__PKCS7_SIGN_ENVELOPE_it_PKCS7_SIGN_ENVELOPE_new__imp__PKCS7_SIGN_ENVELOPE_new_PKCS7_add_attrib_smimecap__imp__PKCS7_add_attrib_smimecap_PKCS7_add_attribute__imp__PKCS7_add_attribute_PKCS7_add_certificate__imp__PKCS7_add_certificate_PKCS7_add_crl__imp__PKCS7_add_crl_PKCS7_add_recipient__imp__PKCS7_add_recipient_PKCS7_add_recipient_info__imp__PKCS7_add_recipient_info_PKCS7_add_signature__imp__PKCS7_add_signature_PKCS7_add_signed_attribute__imp__PKCS7_add_signed_attribute_PKCS7_add_signer__imp__PKCS7_add_signer_PKCS7_cert_from_signer_info__imp__PKCS7_cert_from_signer_info_PKCS7_content_new__imp__PKCS7_content_new_PKCS7_ctrl__imp__PKCS7_ctrl_PKCS7_dataDecode__imp__PKCS7_dataDecode_PKCS7_dataFinal__imp__PKCS7_dataFinal_PKCS7_dataInit__imp__PKCS7_dataInit_PKCS7_dataVerify__imp__PKCS7_dataVerify_PKCS7_decrypt__imp__PKCS7_decrypt_PKCS7_digest_from_attributes__imp__PKCS7_digest_from_attributes_PKCS7_dup__imp__PKCS7_dup_PKCS7_encrypt__imp__PKCS7_encrypt_PKCS7_free__imp__PKCS7_free_PKCS7_get0_signers__imp__PKCS7_get0_signers_PKCS7_get_attribute__imp__PKCS7_get_attribute_PKCS7_get_issuer_and_serial__imp__PKCS7_get_issuer_and_serial_PKCS7_get_signed_attribute__imp__PKCS7_get_signed_attribute_PKCS7_get_signer_info__imp__PKCS7_get_signer_info_PKCS7_get_smimecap__imp__PKCS7_get_smimecap_PKCS7_it__imp__PKCS7_it_PKCS7_new__imp__PKCS7_new_PKCS7_set0_type_other__imp__PKCS7_set0_type_other_PKCS7_set_attributes__imp__PKCS7_set_attributes_PKCS7_set_cipher__imp__PKCS7_set_cipher_PKCS7_set_content__imp__PKCS7_set_content_PKCS7_set_digest__imp__PKCS7_set_digest_PKCS7_set_signed_attributes__imp__PKCS7_set_signed_attributes_PKCS7_set_type__imp__PKCS7_set_type_PKCS7_sign__imp__PKCS7_sign_PKCS7_signatureVerify__imp__PKCS7_signatureVerify_PKCS7_simple_smimecap__imp__PKCS7_simple_smimecap_PKCS7_verify__imp__PKCS7_verify_PKCS8_PRIV_KEY_INFO_free__imp__PKCS8_PRIV_KEY_INFO_free_PKCS8_PRIV_KEY_INFO_it__imp__PKCS8_PRIV_KEY_INFO_it_PKCS8_PRIV_KEY_INFO_new__imp__PKCS8_PRIV_KEY_INFO_new_PKCS8_add_keyusage__imp__PKCS8_add_keyusage_PKCS8_decrypt__imp__PKCS8_decrypt_PKCS8_encrypt__imp__PKCS8_encrypt_PKCS8_set_broken__imp__PKCS8_set_broken_PKEY_USAGE_PERIOD_free__imp__PKEY_USAGE_PERIOD_free_PKEY_USAGE_PERIOD_it__imp__PKEY_USAGE_PERIOD_it_PKEY_USAGE_PERIOD_new__imp__PKEY_USAGE_PERIOD_new_POLICYINFO_free__imp__POLICYINFO_free_POLICYINFO_it__imp__POLICYINFO_it_POLICYINFO_new__imp__POLICYINFO_new_POLICYQUALINFO_free__imp__POLICYQUALINFO_free_POLICYQUALINFO_it__imp__POLICYQUALINFO_it_POLICYQUALINFO_new__imp__POLICYQUALINFO_new_POLICY_CONSTRAINTS_free__imp__POLICY_CONSTRAINTS_free_POLICY_CONSTRAINTS_it__imp__POLICY_CONSTRAINTS_it_POLICY_CONSTRAINTS_new__imp__POLICY_CONSTRAINTS_new_POLICY_MAPPINGS_it__imp__POLICY_MAPPINGS_it_POLICY_MAPPING_free__imp__POLICY_MAPPING_free_POLICY_MAPPING_it__imp__POLICY_MAPPING_it_POLICY_MAPPING_new__imp__POLICY_MAPPING_new_PROXY_CERT_INFO_EXTENSION_free__imp__PROXY_CERT_INFO_EXTENSION_free_PROXY_CERT_INFO_EXTENSION_it__imp__PROXY_CERT_INFO_EXTENSION_it_PROXY_CERT_INFO_EXTENSION_new__imp__PROXY_CERT_INFO_EXTENSION_new_PROXY_POLICY_free__imp__PROXY_POLICY_free_PROXY_POLICY_it__imp__PROXY_POLICY_it_PROXY_POLICY_new__imp__PROXY_POLICY_new_RAND_SSLeay__imp__RAND_SSLeay_RAND_add__imp__RAND_add_RAND_bytes__imp__RAND_bytes_RAND_cleanup__imp__RAND_cleanup_RAND_egd__imp__RAND_egd_RAND_egd_bytes__imp__RAND_egd_bytes_RAND_event__imp__RAND_event_RAND_file_name__imp__RAND_file_name_RAND_get_rand_method__imp__RAND_get_rand_method_RAND_load_file__imp__RAND_load_file_RAND_poll__imp__RAND_poll_RAND_pseudo_bytes__imp__RAND_pseudo_bytes_RAND_query_egd_bytes__imp__RAND_query_egd_bytes_RAND_screen__imp__RAND_screen_RAND_seed__imp__RAND_seed_RAND_set_rand_engine__imp__RAND_set_rand_engine_RAND_set_rand_method__imp__RAND_set_rand_method_RAND_status__imp__RAND_status_RAND_write_file__imp__RAND_write_file_RC2_cbc_encrypt__imp__RC2_cbc_encrypt_RC2_cfb64_encrypt__imp__RC2_cfb64_encrypt_RC2_decrypt__imp__RC2_decrypt_RC2_ecb_encrypt__imp__RC2_ecb_encrypt_RC2_encrypt__imp__RC2_encrypt_RC2_ofb64_encrypt__imp__RC2_ofb64_encrypt_RC2_set_key__imp__RC2_set_key_RC4__imp__RC4_RC4_options__imp__RC4_options_RC4_set_key__imp__RC4_set_key_RIPEMD160__imp__RIPEMD160_RIPEMD160_Final__imp__RIPEMD160_Final_RIPEMD160_Init__imp__RIPEMD160_Init_RIPEMD160_Transform__imp__RIPEMD160_Transform_RIPEMD160_Update__imp__RIPEMD160_Update_RSAPrivateKey_asn1_meth__imp__RSAPrivateKey_asn1_meth_RSAPrivateKey_dup__imp__RSAPrivateKey_dup_RSAPrivateKey_it__imp__RSAPrivateKey_it_RSAPublicKey_dup__imp__RSAPublicKey_dup_RSAPublicKey_it__imp__RSAPublicKey_it_RSA_PKCS1_SSLeay__imp__RSA_PKCS1_SSLeay_RSA_X931_derive_ex__imp__RSA_X931_derive_ex_RSA_X931_generate_key_ex__imp__RSA_X931_generate_key_ex_RSA_X931_hash_id__imp__RSA_X931_hash_id_RSA_blinding_off__imp__RSA_blinding_off_RSA_blinding_on__imp__RSA_blinding_on_RSA_check_key__imp__RSA_check_key_RSA_flags__imp__RSA_flags_RSA_free__imp__RSA_free_RSA_generate_key__imp__RSA_generate_key_RSA_generate_key_ex__imp__RSA_generate_key_ex_RSA_get_default_method__imp__RSA_get_default_method_RSA_get_ex_data__imp__RSA_get_ex_data_RSA_get_ex_new_index__imp__RSA_get_ex_new_index_RSA_get_method__imp__RSA_get_method_RSA_memory_lock__imp__RSA_memory_lock_RSA_new__imp__RSA_new_RSA_new_method__imp__RSA_new_method_RSA_null_method__imp__RSA_null_method_RSA_padding_add_PKCS1_OAEP__imp__RSA_padding_add_PKCS1_OAEP_RSA_padding_add_PKCS1_PSS__imp__RSA_padding_add_PKCS1_PSS_RSA_padding_add_PKCS1_type_1__imp__RSA_padding_add_PKCS1_type_1_RSA_padding_add_PKCS1_type_2__imp__RSA_padding_add_PKCS1_type_2_RSA_padding_add_SSLv23__imp__RSA_padding_add_SSLv23_RSA_padding_add_X931__imp__RSA_padding_add_X931_RSA_padding_add_none__imp__RSA_padding_add_none_RSA_padding_check_PKCS1_OAEP__imp__RSA_padding_check_PKCS1_OAEP_RSA_padding_check_PKCS1_type_1__imp__RSA_padding_check_PKCS1_type_1_RSA_padding_check_PKCS1_type_2__imp__RSA_padding_check_PKCS1_type_2_RSA_padding_check_SSLv23__imp__RSA_padding_check_SSLv23_RSA_padding_check_X931__imp__RSA_padding_check_X931_RSA_padding_check_none__imp__RSA_padding_check_none_RSA_print__imp__RSA_print_RSA_print_fp__imp__RSA_print_fp_RSA_private_decrypt__imp__RSA_private_decrypt_RSA_private_encrypt__imp__RSA_private_encrypt_RSA_public_decrypt__imp__RSA_public_decrypt_RSA_public_encrypt__imp__RSA_public_encrypt_RSA_set_default_method__imp__RSA_set_default_method_RSA_set_ex_data__imp__RSA_set_ex_data_RSA_set_method__imp__RSA_set_method_RSA_setup_blinding__imp__RSA_setup_blinding_RSA_sign__imp__RSA_sign_RSA_sign_ASN1_OCTET_STRING__imp__RSA_sign_ASN1_OCTET_STRING_RSA_size__imp__RSA_size_RSA_up_ref__imp__RSA_up_ref_RSA_verify__imp__RSA_verify_RSA_verify_ASN1_OCTET_STRING__imp__RSA_verify_ASN1_OCTET_STRING_RSA_verify_PKCS1_PSS__imp__RSA_verify_PKCS1_PSS_SHA1__imp__SHA1_SHA1_Final__imp__SHA1_Final_SHA1_Init__imp__SHA1_Init_SHA1_Transform__imp__SHA1_Transform_SHA1_Update__imp__SHA1_Update_SHA224__imp__SHA224_SHA224_Final__imp__SHA224_Final_SHA224_Init__imp__SHA224_Init_SHA224_Update__imp__SHA224_Update_SHA256__imp__SHA256_SHA256_Final__imp__SHA256_Final_SHA256_Init__imp__SHA256_Init_SHA256_Transform__imp__SHA256_Transform_SHA256_Update__imp__SHA256_Update_SHA384__imp__SHA384_SHA384_Final__imp__SHA384_Final_SHA384_Init__imp__SHA384_Init_SHA384_Update__imp__SHA384_Update_SHA512__imp__SHA512_SHA512_Final__imp__SHA512_Final_SHA512_Init__imp__SHA512_Init_SHA512_Transform__imp__SHA512_Transform_SHA512_Update__imp__SHA512_Update_SHA__imp__SHA_SHA_Final__imp__SHA_Final_SHA_Init__imp__SHA_Init_SHA_Transform__imp__SHA_Transform_SHA_Update__imp__SHA_Update_SMIME_crlf_copy__imp__SMIME_crlf_copy_SMIME_read_ASN1__imp__SMIME_read_ASN1_SMIME_read_PKCS7__imp__SMIME_read_PKCS7_SMIME_text__imp__SMIME_text_SMIME_write_PKCS7__imp__SMIME_write_PKCS7_SSLeay_version__imp__SSLeay_version_STORE_ATTR_INFO_compare__imp__STORE_ATTR_INFO_compare_STORE_ATTR_INFO_free__imp__STORE_ATTR_INFO_free_STORE_ATTR_INFO_get0_cstr__imp__STORE_ATTR_INFO_get0_cstr_STORE_ATTR_INFO_get0_dn__imp__STORE_ATTR_INFO_get0_dn_STORE_ATTR_INFO_get0_number__imp__STORE_ATTR_INFO_get0_number_STORE_ATTR_INFO_get0_sha1str__imp__STORE_ATTR_INFO_get0_sha1str_STORE_ATTR_INFO_in__imp__STORE_ATTR_INFO_in_STORE_ATTR_INFO_in_ex__imp__STORE_ATTR_INFO_in_ex_STORE_ATTR_INFO_in_range__imp__STORE_ATTR_INFO_in_range_STORE_ATTR_INFO_modify_cstr__imp__STORE_ATTR_INFO_modify_cstr_STORE_ATTR_INFO_modify_dn__imp__STORE_ATTR_INFO_modify_dn_STORE_ATTR_INFO_modify_number__imp__STORE_ATTR_INFO_modify_number_STORE_ATTR_INFO_modify_sha1str__imp__STORE_ATTR_INFO_modify_sha1str_STORE_ATTR_INFO_new__imp__STORE_ATTR_INFO_new_STORE_ATTR_INFO_set_cstr__imp__STORE_ATTR_INFO_set_cstr_STORE_ATTR_INFO_set_dn__imp__STORE_ATTR_INFO_set_dn_STORE_ATTR_INFO_set_number__imp__STORE_ATTR_INFO_set_number_STORE_ATTR_INFO_set_sha1str__imp__STORE_ATTR_INFO_set_sha1str_STORE_Memory__imp__STORE_Memory_STORE_OBJECT_free__imp__STORE_OBJECT_free_STORE_OBJECT_new__imp__STORE_OBJECT_new_STORE_create_method__imp__STORE_create_method_STORE_ctrl__imp__STORE_ctrl_STORE_delete_arbitrary__imp__STORE_delete_arbitrary_STORE_delete_certificate__imp__STORE_delete_certificate_STORE_delete_crl__imp__STORE_delete_crl_STORE_delete_number__imp__STORE_delete_number_STORE_delete_private_key__imp__STORE_delete_private_key_STORE_delete_public_key__imp__STORE_delete_public_key_STORE_destroy_method__imp__STORE_destroy_method_STORE_free__imp__STORE_free_STORE_generate_crl__imp__STORE_generate_crl_STORE_generate_key__imp__STORE_generate_key_STORE_get_arbitrary__imp__STORE_get_arbitrary_STORE_get_certificate__imp__STORE_get_certificate_STORE_get_crl__imp__STORE_get_crl_STORE_get_ex_data__imp__STORE_get_ex_data_STORE_get_ex_new_index__imp__STORE_get_ex_new_index_STORE_get_method__imp__STORE_get_method_STORE_get_number__imp__STORE_get_number_STORE_get_private_key__imp__STORE_get_private_key_STORE_get_public_key__imp__STORE_get_public_key_STORE_list_certificate_end__imp__STORE_list_certificate_end_STORE_list_certificate_endp__imp__STORE_list_certificate_endp_STORE_list_certificate_next__imp__STORE_list_certificate_next_STORE_list_certificate_start__imp__STORE_list_certificate_start_STORE_list_crl_end__imp__STORE_list_crl_end_STORE_list_crl_endp__imp__STORE_list_crl_endp_STORE_list_crl_next__imp__STORE_list_crl_next_STORE_list_crl_start__imp__STORE_list_crl_start_STORE_list_private_key_end__imp__STORE_list_private_key_end_STORE_list_private_key_endp__imp__STORE_list_private_key_endp_STORE_list_private_key_next__imp__STORE_list_private_key_next_STORE_list_private_key_start__imp__STORE_list_private_key_start_STORE_list_public_key_end__imp__STORE_list_public_key_end_STORE_list_public_key_endp__imp__STORE_list_public_key_endp_STORE_list_public_key_next__imp__STORE_list_public_key_next_STORE_list_public_key_start__imp__STORE_list_public_key_start_STORE_method_get_cleanup_function__imp__STORE_method_get_cleanup_function_STORE_method_get_ctrl_function__imp__STORE_method_get_ctrl_function_STORE_method_get_delete_function__imp__STORE_method_get_delete_function_STORE_method_get_generate_function__imp__STORE_method_get_generate_function_STORE_method_get_get_function__imp__STORE_method_get_get_function_STORE_method_get_initialise_function__imp__STORE_method_get_initialise_function_STORE_method_get_list_end_function__imp__STORE_method_get_list_end_function_STORE_method_get_list_next_function__imp__STORE_method_get_list_next_function_STORE_method_get_list_start_function__imp__STORE_method_get_list_start_function_STORE_method_get_lock_store_function__imp__STORE_method_get_lock_store_function_STORE_method_get_modify_function__imp__STORE_method_get_modify_function_STORE_method_get_revoke_function__imp__STORE_method_get_revoke_function_STORE_method_get_store_function__imp__STORE_method_get_store_function_STORE_method_get_unlock_store_function__imp__STORE_method_get_unlock_store_function_STORE_method_get_update_store_function__imp__STORE_method_get_update_store_function_STORE_method_set_cleanup_function__imp__STORE_method_set_cleanup_function_STORE_method_set_ctrl_function__imp__STORE_method_set_ctrl_function_STORE_method_set_delete_function__imp__STORE_method_set_delete_function_STORE_method_set_generate_function__imp__STORE_method_set_generate_function_STORE_method_set_get_function__imp__STORE_method_set_get_function_STORE_method_set_initialise_function__imp__STORE_method_set_initialise_function_STORE_method_set_list_end_function__imp__STORE_method_set_list_end_function_STORE_method_set_list_next_function__imp__STORE_method_set_list_next_function_STORE_method_set_list_start_function__imp__STORE_method_set_list_start_function_STORE_method_set_lock_store_function__imp__STORE_method_set_lock_store_function_STORE_method_set_modify_function__imp__STORE_method_set_modify_function_STORE_method_set_revoke_function__imp__STORE_method_set_revoke_function_STORE_method_set_store_function__imp__STORE_method_set_store_function_STORE_method_set_unlock_store_function__imp__STORE_method_set_unlock_store_function_STORE_method_set_update_store_function__imp__STORE_method_set_update_store_function_STORE_modify_arbitrary__imp__STORE_modify_arbitrary_STORE_modify_certificate__imp__STORE_modify_certificate_STORE_modify_crl__imp__STORE_modify_crl_STORE_modify_number__imp__STORE_modify_number_STORE_modify_private_key__imp__STORE_modify_private_key_STORE_modify_public_key__imp__STORE_modify_public_key_STORE_new_engine__imp__STORE_new_engine_STORE_new_method__imp__STORE_new_method_STORE_parse_attrs_end__imp__STORE_parse_attrs_end_STORE_parse_attrs_endp__imp__STORE_parse_attrs_endp_STORE_parse_attrs_next__imp__STORE_parse_attrs_next_STORE_parse_attrs_start__imp__STORE_parse_attrs_start_STORE_revoke_certificate__imp__STORE_revoke_certificate_STORE_revoke_private_key__imp__STORE_revoke_private_key_STORE_revoke_public_key__imp__STORE_revoke_public_key_STORE_set_ex_data__imp__STORE_set_ex_data_STORE_set_method__imp__STORE_set_method_STORE_store_arbitrary__imp__STORE_store_arbitrary_STORE_store_certificate__imp__STORE_store_certificate_STORE_store_crl__imp__STORE_store_crl_STORE_store_number__imp__STORE_store_number_STORE_store_private_key__imp__STORE_store_private_key_STORE_store_public_key__imp__STORE_store_public_key_SXNETID_free__imp__SXNETID_free_SXNETID_it__imp__SXNETID_it_SXNETID_new__imp__SXNETID_new_SXNET_add_id_INTEGER__imp__SXNET_add_id_INTEGER_SXNET_add_id_asc__imp__SXNET_add_id_asc_SXNET_add_id_ulong__imp__SXNET_add_id_ulong_SXNET_free__imp__SXNET_free_SXNET_get_id_INTEGER__imp__SXNET_get_id_INTEGER_SXNET_get_id_asc__imp__SXNET_get_id_asc_SXNET_get_id_ulong__imp__SXNET_get_id_ulong_SXNET_it__imp__SXNET_it_SXNET_new__imp__SXNET_new_TXT_DB_create_index__imp__TXT_DB_create_index_TXT_DB_free__imp__TXT_DB_free_TXT_DB_get_by_index__imp__TXT_DB_get_by_index_TXT_DB_insert__imp__TXT_DB_insert_TXT_DB_read__imp__TXT_DB_read_TXT_DB_write__imp__TXT_DB_write_UI_OpenSSL__imp__UI_OpenSSL_UI_UTIL_read_pw__imp__UI_UTIL_read_pw_UI_UTIL_read_pw_string__imp__UI_UTIL_read_pw_string_UI_add_error_string__imp__UI_add_error_string_UI_add_info_string__imp__UI_add_info_string_UI_add_input_boolean__imp__UI_add_input_boolean_UI_add_input_string__imp__UI_add_input_string_UI_add_user_data__imp__UI_add_user_data_UI_add_verify_string__imp__UI_add_verify_string_UI_construct_prompt__imp__UI_construct_prompt_UI_create_method__imp__UI_create_method_UI_ctrl__imp__UI_ctrl_UI_destroy_method__imp__UI_destroy_method_UI_dup_error_string__imp__UI_dup_error_string_UI_dup_info_string__imp__UI_dup_info_string_UI_dup_input_boolean__imp__UI_dup_input_boolean_UI_dup_input_string__imp__UI_dup_input_string_UI_dup_verify_string__imp__UI_dup_verify_string_UI_free__imp__UI_free_UI_get0_action_string__imp__UI_get0_action_string_UI_get0_output_string__imp__UI_get0_output_string_UI_get0_result__imp__UI_get0_result_UI_get0_result_string__imp__UI_get0_result_string_UI_get0_test_string__imp__UI_get0_test_string_UI_get0_user_data__imp__UI_get0_user_data_UI_get_default_method__imp__UI_get_default_method_UI_get_ex_data__imp__UI_get_ex_data_UI_get_ex_new_index__imp__UI_get_ex_new_index_UI_get_input_flags__imp__UI_get_input_flags_UI_get_method__imp__UI_get_method_UI_get_result_maxsize__imp__UI_get_result_maxsize_UI_get_result_minsize__imp__UI_get_result_minsize_UI_get_string_type__imp__UI_get_string_type_UI_method_get_closer__imp__UI_method_get_closer_UI_method_get_flusher__imp__UI_method_get_flusher_UI_method_get_opener__imp__UI_method_get_opener_UI_method_get_reader__imp__UI_method_get_reader_UI_method_get_writer__imp__UI_method_get_writer_UI_method_set_closer__imp__UI_method_set_closer_UI_method_set_flusher__imp__UI_method_set_flusher_UI_method_set_opener__imp__UI_method_set_opener_UI_method_set_reader__imp__UI_method_set_reader_UI_method_set_writer__imp__UI_method_set_writer_UI_new__imp__UI_new_UI_new_method__imp__UI_new_method_UI_process__imp__UI_process_UI_set_default_method__imp__UI_set_default_method_UI_set_ex_data__imp__UI_set_ex_data_UI_set_method__imp__UI_set_method_UI_set_result__imp__UI_set_result_USERNOTICE_free__imp__USERNOTICE_free_USERNOTICE_it__imp__USERNOTICE_it_USERNOTICE_new__imp__USERNOTICE_new_UTF8_getc__imp__UTF8_getc_UTF8_putc__imp__UTF8_putc_X509V3_EXT_CRL_add_conf__imp__X509V3_EXT_CRL_add_conf_X509V3_EXT_CRL_add_nconf__imp__X509V3_EXT_CRL_add_nconf_X509V3_EXT_REQ_add_conf__imp__X509V3_EXT_REQ_add_conf_X509V3_EXT_REQ_add_nconf__imp__X509V3_EXT_REQ_add_nconf_X509V3_EXT_add__imp__X509V3_EXT_add_X509V3_EXT_add_alias__imp__X509V3_EXT_add_alias_X509V3_EXT_add_conf__imp__X509V3_EXT_add_conf_X509V3_EXT_add_list__imp__X509V3_EXT_add_list_X509V3_EXT_add_nconf__imp__X509V3_EXT_add_nconf_X509V3_EXT_add_nconf_sk__imp__X509V3_EXT_add_nconf_sk_X509V3_EXT_cleanup__imp__X509V3_EXT_cleanup_X509V3_EXT_conf__imp__X509V3_EXT_conf_X509V3_EXT_conf_nid__imp__X509V3_EXT_conf_nid_X509V3_EXT_d2i__imp__X509V3_EXT_d2i_X509V3_EXT_get__imp__X509V3_EXT_get_X509V3_EXT_get_nid__imp__X509V3_EXT_get_nid_X509V3_EXT_i2d__imp__X509V3_EXT_i2d_X509V3_EXT_nconf__imp__X509V3_EXT_nconf_X509V3_EXT_nconf_nid__imp__X509V3_EXT_nconf_nid_X509V3_EXT_print__imp__X509V3_EXT_print_X509V3_EXT_print_fp__imp__X509V3_EXT_print_fp_X509V3_EXT_val_prn__imp__X509V3_EXT_val_prn_X509V3_NAME_from_section__imp__X509V3_NAME_from_section_X509V3_add1_i2d__imp__X509V3_add1_i2d_X509V3_add_standard_extensions__imp__X509V3_add_standard_extensions_X509V3_add_value__imp__X509V3_add_value_X509V3_add_value_bool__imp__X509V3_add_value_bool_X509V3_add_value_bool_nf__imp__X509V3_add_value_bool_nf_X509V3_add_value_int__imp__X509V3_add_value_int_X509V3_add_value_uchar__imp__X509V3_add_value_uchar_X509V3_conf_free__imp__X509V3_conf_free_X509V3_extensions_print__imp__X509V3_extensions_print_X509V3_get_d2i__imp__X509V3_get_d2i_X509V3_get_section__imp__X509V3_get_section_X509V3_get_string__imp__X509V3_get_string_X509V3_get_value_bool__imp__X509V3_get_value_bool_X509V3_get_value_int__imp__X509V3_get_value_int_X509V3_parse_list__imp__X509V3_parse_list_X509V3_section_free__imp__X509V3_section_free_X509V3_set_conf_lhash__imp__X509V3_set_conf_lhash_X509V3_set_ctx__imp__X509V3_set_ctx_X509V3_set_nconf__imp__X509V3_set_nconf_X509V3_string_free__imp__X509V3_string_free_X509_ALGORS_it__imp__X509_ALGORS_it_X509_ALGOR_dup__imp__X509_ALGOR_dup_X509_ALGOR_free__imp__X509_ALGOR_free_X509_ALGOR_get0__imp__X509_ALGOR_get0_X509_ALGOR_it__imp__X509_ALGOR_it_X509_ALGOR_new__imp__X509_ALGOR_new_X509_ALGOR_set0__imp__X509_ALGOR_set0_X509_ATTRIBUTE_count__imp__X509_ATTRIBUTE_count_X509_ATTRIBUTE_create__imp__X509_ATTRIBUTE_create_X509_ATTRIBUTE_create_by_NID__imp__X509_ATTRIBUTE_create_by_NID_X509_ATTRIBUTE_create_by_OBJ__imp__X509_ATTRIBUTE_create_by_OBJ_X509_ATTRIBUTE_create_by_txt__imp__X509_ATTRIBUTE_create_by_txt_X509_ATTRIBUTE_dup__imp__X509_ATTRIBUTE_dup_X509_ATTRIBUTE_free__imp__X509_ATTRIBUTE_free_X509_ATTRIBUTE_get0_data__imp__X509_ATTRIBUTE_get0_data_X509_ATTRIBUTE_get0_object__imp__X509_ATTRIBUTE_get0_object_X509_ATTRIBUTE_get0_type__imp__X509_ATTRIBUTE_get0_type_X509_ATTRIBUTE_it__imp__X509_ATTRIBUTE_it_X509_ATTRIBUTE_new__imp__X509_ATTRIBUTE_new_X509_ATTRIBUTE_set1_data__imp__X509_ATTRIBUTE_set1_data_X509_ATTRIBUTE_set1_object__imp__X509_ATTRIBUTE_set1_object_X509_CERT_AUX_free__imp__X509_CERT_AUX_free_X509_CERT_AUX_it__imp__X509_CERT_AUX_it_X509_CERT_AUX_new__imp__X509_CERT_AUX_new_X509_CERT_AUX_print__imp__X509_CERT_AUX_print_X509_CERT_PAIR_free__imp__X509_CERT_PAIR_free_X509_CERT_PAIR_it__imp__X509_CERT_PAIR_it_X509_CERT_PAIR_new__imp__X509_CERT_PAIR_new_X509_CINF_free__imp__X509_CINF_free_X509_CINF_it__imp__X509_CINF_it_X509_CINF_new__imp__X509_CINF_new_X509_CRL_INFO_free__imp__X509_CRL_INFO_free_X509_CRL_INFO_it__imp__X509_CRL_INFO_it_X509_CRL_INFO_new__imp__X509_CRL_INFO_new_X509_CRL_add0_revoked__imp__X509_CRL_add0_revoked_X509_CRL_add1_ext_i2d__imp__X509_CRL_add1_ext_i2d_X509_CRL_add_ext__imp__X509_CRL_add_ext_X509_CRL_cmp__imp__X509_CRL_cmp_X509_CRL_delete_ext__imp__X509_CRL_delete_ext_X509_CRL_digest__imp__X509_CRL_digest_X509_CRL_dup__imp__X509_CRL_dup_X509_CRL_free__imp__X509_CRL_free_X509_CRL_get_ext__imp__X509_CRL_get_ext_X509_CRL_get_ext_by_NID__imp__X509_CRL_get_ext_by_NID_X509_CRL_get_ext_by_OBJ__imp__X509_CRL_get_ext_by_OBJ_X509_CRL_get_ext_by_critical__imp__X509_CRL_get_ext_by_critical_X509_CRL_get_ext_count__imp__X509_CRL_get_ext_count_X509_CRL_get_ext_d2i__imp__X509_CRL_get_ext_d2i_X509_CRL_it__imp__X509_CRL_it_X509_CRL_new__imp__X509_CRL_new_X509_CRL_print__imp__X509_CRL_print_X509_CRL_print_fp__imp__X509_CRL_print_fp_X509_CRL_set_issuer_name__imp__X509_CRL_set_issuer_name_X509_CRL_set_lastUpdate__imp__X509_CRL_set_lastUpdate_X509_CRL_set_nextUpdate__imp__X509_CRL_set_nextUpdate_X509_CRL_set_version__imp__X509_CRL_set_version_X509_CRL_sign__imp__X509_CRL_sign_X509_CRL_sort__imp__X509_CRL_sort_X509_CRL_verify__imp__X509_CRL_verify_X509_EXTENSIONS_it__imp__X509_EXTENSIONS_it_X509_EXTENSION_create_by_NID__imp__X509_EXTENSION_create_by_NID_X509_EXTENSION_create_by_OBJ__imp__X509_EXTENSION_create_by_OBJ_X509_EXTENSION_dup__imp__X509_EXTENSION_dup_X509_EXTENSION_free__imp__X509_EXTENSION_free_X509_EXTENSION_get_critical__imp__X509_EXTENSION_get_critical_X509_EXTENSION_get_data__imp__X509_EXTENSION_get_data_X509_EXTENSION_get_object__imp__X509_EXTENSION_get_object_X509_EXTENSION_it__imp__X509_EXTENSION_it_X509_EXTENSION_new__imp__X509_EXTENSION_new_X509_EXTENSION_set_critical__imp__X509_EXTENSION_set_critical_X509_EXTENSION_set_data__imp__X509_EXTENSION_set_data_X509_EXTENSION_set_object__imp__X509_EXTENSION_set_object_X509_INFO_free__imp__X509_INFO_free_X509_INFO_new__imp__X509_INFO_new_X509_LOOKUP_by_alias__imp__X509_LOOKUP_by_alias_X509_LOOKUP_by_fingerprint__imp__X509_LOOKUP_by_fingerprint_X509_LOOKUP_by_issuer_serial__imp__X509_LOOKUP_by_issuer_serial_X509_LOOKUP_by_subject__imp__X509_LOOKUP_by_subject_X509_LOOKUP_ctrl__imp__X509_LOOKUP_ctrl_X509_LOOKUP_file__imp__X509_LOOKUP_file_X509_LOOKUP_free__imp__X509_LOOKUP_free_X509_LOOKUP_hash_dir__imp__X509_LOOKUP_hash_dir_X509_LOOKUP_init__imp__X509_LOOKUP_init_X509_LOOKUP_new__imp__X509_LOOKUP_new_X509_LOOKUP_shutdown__imp__X509_LOOKUP_shutdown_X509_NAME_ENTRY_create_by_NID__imp__X509_NAME_ENTRY_create_by_NID_X509_NAME_ENTRY_create_by_OBJ__imp__X509_NAME_ENTRY_create_by_OBJ_X509_NAME_ENTRY_create_by_txt__imp__X509_NAME_ENTRY_create_by_txt_X509_NAME_ENTRY_dup__imp__X509_NAME_ENTRY_dup_X509_NAME_ENTRY_free__imp__X509_NAME_ENTRY_free_X509_NAME_ENTRY_get_data__imp__X509_NAME_ENTRY_get_data_X509_NAME_ENTRY_get_object__imp__X509_NAME_ENTRY_get_object_X509_NAME_ENTRY_it__imp__X509_NAME_ENTRY_it_X509_NAME_ENTRY_new__imp__X509_NAME_ENTRY_new_X509_NAME_ENTRY_set_data__imp__X509_NAME_ENTRY_set_data_X509_NAME_ENTRY_set_object__imp__X509_NAME_ENTRY_set_object_X509_NAME_add_entry__imp__X509_NAME_add_entry_X509_NAME_add_entry_by_NID__imp__X509_NAME_add_entry_by_NID_X509_NAME_add_entry_by_OBJ__imp__X509_NAME_add_entry_by_OBJ_X509_NAME_add_entry_by_txt__imp__X509_NAME_add_entry_by_txt_X509_NAME_cmp__imp__X509_NAME_cmp_X509_NAME_delete_entry__imp__X509_NAME_delete_entry_X509_NAME_digest__imp__X509_NAME_digest_X509_NAME_dup__imp__X509_NAME_dup_X509_NAME_entry_count__imp__X509_NAME_entry_count_X509_NAME_free__imp__X509_NAME_free_X509_NAME_get_entry__imp__X509_NAME_get_entry_X509_NAME_get_index_by_NID__imp__X509_NAME_get_index_by_NID_X509_NAME_get_index_by_OBJ__imp__X509_NAME_get_index_by_OBJ_X509_NAME_get_text_by_NID__imp__X509_NAME_get_text_by_NID_X509_NAME_get_text_by_OBJ__imp__X509_NAME_get_text_by_OBJ_X509_NAME_hash__imp__X509_NAME_hash_X509_NAME_it__imp__X509_NAME_it_X509_NAME_new__imp__X509_NAME_new_X509_NAME_oneline__imp__X509_NAME_oneline_X509_NAME_print__imp__X509_NAME_print_X509_NAME_print_ex__imp__X509_NAME_print_ex_X509_NAME_print_ex_fp__imp__X509_NAME_print_ex_fp_X509_NAME_set__imp__X509_NAME_set_X509_OBJECT_free_contents__imp__X509_OBJECT_free_contents_X509_OBJECT_idx_by_subject__imp__X509_OBJECT_idx_by_subject_X509_OBJECT_retrieve_by_subject__imp__X509_OBJECT_retrieve_by_subject_X509_OBJECT_retrieve_match__imp__X509_OBJECT_retrieve_match_X509_OBJECT_up_ref_count__imp__X509_OBJECT_up_ref_count_X509_PKEY_free__imp__X509_PKEY_free_X509_PKEY_new__imp__X509_PKEY_new_X509_POLICY_NODE_print__imp__X509_POLICY_NODE_print_X509_PUBKEY_free__imp__X509_PUBKEY_free_X509_PUBKEY_get__imp__X509_PUBKEY_get_X509_PUBKEY_it__imp__X509_PUBKEY_it_X509_PUBKEY_new__imp__X509_PUBKEY_new_X509_PUBKEY_set__imp__X509_PUBKEY_set_X509_PURPOSE_add__imp__X509_PURPOSE_add_X509_PURPOSE_cleanup__imp__X509_PURPOSE_cleanup_X509_PURPOSE_get0__imp__X509_PURPOSE_get0_X509_PURPOSE_get0_name__imp__X509_PURPOSE_get0_name_X509_PURPOSE_get0_sname__imp__X509_PURPOSE_get0_sname_X509_PURPOSE_get_by_id__imp__X509_PURPOSE_get_by_id_X509_PURPOSE_get_by_sname__imp__X509_PURPOSE_get_by_sname_X509_PURPOSE_get_count__imp__X509_PURPOSE_get_count_X509_PURPOSE_get_id__imp__X509_PURPOSE_get_id_X509_PURPOSE_get_trust__imp__X509_PURPOSE_get_trust_X509_PURPOSE_set__imp__X509_PURPOSE_set_X509_REQ_INFO_free__imp__X509_REQ_INFO_free_X509_REQ_INFO_it__imp__X509_REQ_INFO_it_X509_REQ_INFO_new__imp__X509_REQ_INFO_new_X509_REQ_add1_attr__imp__X509_REQ_add1_attr_X509_REQ_add1_attr_by_NID__imp__X509_REQ_add1_attr_by_NID_X509_REQ_add1_attr_by_OBJ__imp__X509_REQ_add1_attr_by_OBJ_X509_REQ_add1_attr_by_txt__imp__X509_REQ_add1_attr_by_txt_X509_REQ_add_extensions__imp__X509_REQ_add_extensions_X509_REQ_add_extensions_nid__imp__X509_REQ_add_extensions_nid_X509_REQ_check_private_key__imp__X509_REQ_check_private_key_X509_REQ_delete_attr__imp__X509_REQ_delete_attr_X509_REQ_digest__imp__X509_REQ_digest_X509_REQ_dup__imp__X509_REQ_dup_X509_REQ_extension_nid__imp__X509_REQ_extension_nid_X509_REQ_free__imp__X509_REQ_free_X509_REQ_get1_email__imp__X509_REQ_get1_email_X509_REQ_get_attr__imp__X509_REQ_get_attr_X509_REQ_get_attr_by_NID__imp__X509_REQ_get_attr_by_NID_X509_REQ_get_attr_by_OBJ__imp__X509_REQ_get_attr_by_OBJ_X509_REQ_get_attr_count__imp__X509_REQ_get_attr_count_X509_REQ_get_extension_nids__imp__X509_REQ_get_extension_nids_X509_REQ_get_extensions__imp__X509_REQ_get_extensions_X509_REQ_get_pubkey__imp__X509_REQ_get_pubkey_X509_REQ_it__imp__X509_REQ_it_X509_REQ_new__imp__X509_REQ_new_X509_REQ_print__imp__X509_REQ_print_X509_REQ_print_ex__imp__X509_REQ_print_ex_X509_REQ_print_fp__imp__X509_REQ_print_fp_X509_REQ_set_extension_nids__imp__X509_REQ_set_extension_nids_X509_REQ_set_pubkey__imp__X509_REQ_set_pubkey_X509_REQ_set_subject_name__imp__X509_REQ_set_subject_name_X509_REQ_set_version__imp__X509_REQ_set_version_X509_REQ_sign__imp__X509_REQ_sign_X509_REQ_to_X509__imp__X509_REQ_to_X509_X509_REQ_verify__imp__X509_REQ_verify_X509_REVOKED_add1_ext_i2d__imp__X509_REVOKED_add1_ext_i2d_X509_REVOKED_add_ext__imp__X509_REVOKED_add_ext_X509_REVOKED_delete_ext__imp__X509_REVOKED_delete_ext_X509_REVOKED_free__imp__X509_REVOKED_free_X509_REVOKED_get_ext__imp__X509_REVOKED_get_ext_X509_REVOKED_get_ext_by_NID__imp__X509_REVOKED_get_ext_by_NID_X509_REVOKED_get_ext_by_OBJ__imp__X509_REVOKED_get_ext_by_OBJ_X509_REVOKED_get_ext_by_critical__imp__X509_REVOKED_get_ext_by_critical_X509_REVOKED_get_ext_count__imp__X509_REVOKED_get_ext_count_X509_REVOKED_get_ext_d2i__imp__X509_REVOKED_get_ext_d2i_X509_REVOKED_it__imp__X509_REVOKED_it_X509_REVOKED_new__imp__X509_REVOKED_new_X509_REVOKED_set_revocationDate__imp__X509_REVOKED_set_revocationDate_X509_REVOKED_set_serialNumber__imp__X509_REVOKED_set_serialNumber_X509_SIG_free__imp__X509_SIG_free_X509_SIG_it__imp__X509_SIG_it_X509_SIG_new__imp__X509_SIG_new_X509_STORE_CTX_cleanup__imp__X509_STORE_CTX_cleanup_X509_STORE_CTX_free__imp__X509_STORE_CTX_free_X509_STORE_CTX_get0_param__imp__X509_STORE_CTX_get0_param_X509_STORE_CTX_get0_policy_tree__imp__X509_STORE_CTX_get0_policy_tree_X509_STORE_CTX_get1_chain__imp__X509_STORE_CTX_get1_chain_X509_STORE_CTX_get1_issuer__imp__X509_STORE_CTX_get1_issuer_X509_STORE_CTX_get_chain__imp__X509_STORE_CTX_get_chain_X509_STORE_CTX_get_current_cert__imp__X509_STORE_CTX_get_current_cert_X509_STORE_CTX_get_error__imp__X509_STORE_CTX_get_error_X509_STORE_CTX_get_error_depth__imp__X509_STORE_CTX_get_error_depth_X509_STORE_CTX_get_ex_data__imp__X509_STORE_CTX_get_ex_data_X509_STORE_CTX_get_ex_new_index__imp__X509_STORE_CTX_get_ex_new_index_X509_STORE_CTX_get_explicit_policy__imp__X509_STORE_CTX_get_explicit_policy_X509_STORE_CTX_init__imp__X509_STORE_CTX_init_X509_STORE_CTX_new__imp__X509_STORE_CTX_new_X509_STORE_CTX_purpose_inherit__imp__X509_STORE_CTX_purpose_inherit_X509_STORE_CTX_set0_crls__imp__X509_STORE_CTX_set0_crls_X509_STORE_CTX_set0_param__imp__X509_STORE_CTX_set0_param_X509_STORE_CTX_set_cert__imp__X509_STORE_CTX_set_cert_X509_STORE_CTX_set_chain__imp__X509_STORE_CTX_set_chain_X509_STORE_CTX_set_default__imp__X509_STORE_CTX_set_default_X509_STORE_CTX_set_depth__imp__X509_STORE_CTX_set_depth_X509_STORE_CTX_set_error__imp__X509_STORE_CTX_set_error_X509_STORE_CTX_set_ex_data__imp__X509_STORE_CTX_set_ex_data_X509_STORE_CTX_set_flags__imp__X509_STORE_CTX_set_flags_X509_STORE_CTX_set_purpose__imp__X509_STORE_CTX_set_purpose_X509_STORE_CTX_set_time__imp__X509_STORE_CTX_set_time_X509_STORE_CTX_set_trust__imp__X509_STORE_CTX_set_trust_X509_STORE_CTX_set_verify_cb__imp__X509_STORE_CTX_set_verify_cb_X509_STORE_CTX_trusted_stack__imp__X509_STORE_CTX_trusted_stack_X509_STORE_add_cert__imp__X509_STORE_add_cert_X509_STORE_add_crl__imp__X509_STORE_add_crl_X509_STORE_add_lookup__imp__X509_STORE_add_lookup_X509_STORE_free__imp__X509_STORE_free_X509_STORE_get_by_subject__imp__X509_STORE_get_by_subject_X509_STORE_load_locations__imp__X509_STORE_load_locations_X509_STORE_new__imp__X509_STORE_new_X509_STORE_set1_param__imp__X509_STORE_set1_param_X509_STORE_set_default_paths__imp__X509_STORE_set_default_paths_X509_STORE_set_depth__imp__X509_STORE_set_depth_X509_STORE_set_flags__imp__X509_STORE_set_flags_X509_STORE_set_purpose__imp__X509_STORE_set_purpose_X509_STORE_set_trust__imp__X509_STORE_set_trust_X509_TRUST_add__imp__X509_TRUST_add_X509_TRUST_cleanup__imp__X509_TRUST_cleanup_X509_TRUST_get0__imp__X509_TRUST_get0_X509_TRUST_get0_name__imp__X509_TRUST_get0_name_X509_TRUST_get_by_id__imp__X509_TRUST_get_by_id_X509_TRUST_get_count__imp__X509_TRUST_get_count_X509_TRUST_get_flags__imp__X509_TRUST_get_flags_X509_TRUST_get_trust__imp__X509_TRUST_get_trust_X509_TRUST_set__imp__X509_TRUST_set_X509_TRUST_set_default__imp__X509_TRUST_set_default_X509_VAL_free__imp__X509_VAL_free_X509_VAL_it__imp__X509_VAL_it_X509_VAL_new__imp__X509_VAL_new_X509_VERIFY_PARAM_add0_policy__imp__X509_VERIFY_PARAM_add0_policy_X509_VERIFY_PARAM_add0_table__imp__X509_VERIFY_PARAM_add0_table_X509_VERIFY_PARAM_clear_flags__imp__X509_VERIFY_PARAM_clear_flags_X509_VERIFY_PARAM_free__imp__X509_VERIFY_PARAM_free_X509_VERIFY_PARAM_get_depth__imp__X509_VERIFY_PARAM_get_depth_X509_VERIFY_PARAM_get_flags__imp__X509_VERIFY_PARAM_get_flags_X509_VERIFY_PARAM_inherit__imp__X509_VERIFY_PARAM_inherit_X509_VERIFY_PARAM_lookup__imp__X509_VERIFY_PARAM_lookup_X509_VERIFY_PARAM_new__imp__X509_VERIFY_PARAM_new_X509_VERIFY_PARAM_set1__imp__X509_VERIFY_PARAM_set1_X509_VERIFY_PARAM_set1_name__imp__X509_VERIFY_PARAM_set1_name_X509_VERIFY_PARAM_set1_policies__imp__X509_VERIFY_PARAM_set1_policies_X509_VERIFY_PARAM_set_depth__imp__X509_VERIFY_PARAM_set_depth_X509_VERIFY_PARAM_set_flags__imp__X509_VERIFY_PARAM_set_flags_X509_VERIFY_PARAM_set_purpose__imp__X509_VERIFY_PARAM_set_purpose_X509_VERIFY_PARAM_set_time__imp__X509_VERIFY_PARAM_set_time_X509_VERIFY_PARAM_set_trust__imp__X509_VERIFY_PARAM_set_trust_X509_VERIFY_PARAM_table_cleanup__imp__X509_VERIFY_PARAM_table_cleanup_X509_add1_ext_i2d__imp__X509_add1_ext_i2d_X509_add1_reject_object__imp__X509_add1_reject_object_X509_add1_trust_object__imp__X509_add1_trust_object_X509_add_ext__imp__X509_add_ext_X509_alias_get0__imp__X509_alias_get0_X509_alias_set1__imp__X509_alias_set1_X509_asn1_meth__imp__X509_asn1_meth_X509_certificate_type__imp__X509_certificate_type_X509_check_ca__imp__X509_check_ca_X509_check_issued__imp__X509_check_issued_X509_check_private_key__imp__X509_check_private_key_X509_check_purpose__imp__X509_check_purpose_X509_check_trust__imp__X509_check_trust_X509_cmp__imp__X509_cmp_X509_cmp_current_time__imp__X509_cmp_current_time_X509_cmp_time__imp__X509_cmp_time_X509_delete_ext__imp__X509_delete_ext_X509_digest__imp__X509_digest_X509_dup__imp__X509_dup_X509_email_free__imp__X509_email_free_X509_find_by_issuer_and_serial__imp__X509_find_by_issuer_and_serial_X509_find_by_subject__imp__X509_find_by_subject_X509_free__imp__X509_free_X509_get0_pubkey_bitstr__imp__X509_get0_pubkey_bitstr_X509_get1_email__imp__X509_get1_email_X509_get1_ocsp__imp__X509_get1_ocsp_X509_get_default_cert_area__imp__X509_get_default_cert_area_X509_get_default_cert_dir__imp__X509_get_default_cert_dir_X509_get_default_cert_dir_env__imp__X509_get_default_cert_dir_env_X509_get_default_cert_file__imp__X509_get_default_cert_file_X509_get_default_cert_file_env__imp__X509_get_default_cert_file_env_X509_get_default_private_dir__imp__X509_get_default_private_dir_X509_get_ex_data__imp__X509_get_ex_data_X509_get_ex_new_index__imp__X509_get_ex_new_index_X509_get_ext__imp__X509_get_ext_X509_get_ext_by_NID__imp__X509_get_ext_by_NID_X509_get_ext_by_OBJ__imp__X509_get_ext_by_OBJ_X509_get_ext_by_critical__imp__X509_get_ext_by_critical_X509_get_ext_count__imp__X509_get_ext_count_X509_get_ext_d2i__imp__X509_get_ext_d2i_X509_get_issuer_name__imp__X509_get_issuer_name_X509_get_pubkey__imp__X509_get_pubkey_X509_get_pubkey_parameters__imp__X509_get_pubkey_parameters_X509_get_serialNumber__imp__X509_get_serialNumber_X509_get_subject_name__imp__X509_get_subject_name_X509_gmtime_adj__imp__X509_gmtime_adj_X509_issuer_and_serial_cmp__imp__X509_issuer_and_serial_cmp_X509_issuer_and_serial_hash__imp__X509_issuer_and_serial_hash_X509_issuer_name_cmp__imp__X509_issuer_name_cmp_X509_issuer_name_hash__imp__X509_issuer_name_hash_X509_it__imp__X509_it_X509_keyid_get0__imp__X509_keyid_get0_X509_keyid_set1__imp__X509_keyid_set1_X509_load_cert_crl_file__imp__X509_load_cert_crl_file_X509_load_cert_file__imp__X509_load_cert_file_X509_load_crl_file__imp__X509_load_crl_file_X509_new__imp__X509_new_X509_ocspid_print__imp__X509_ocspid_print_X509_policy_check__imp__X509_policy_check_X509_policy_level_get0_node__imp__X509_policy_level_get0_node_X509_policy_level_node_count__imp__X509_policy_level_node_count_X509_policy_node_get0_parent__imp__X509_policy_node_get0_parent_X509_policy_node_get0_policy__imp__X509_policy_node_get0_policy_X509_policy_node_get0_qualifiers__imp__X509_policy_node_get0_qualifiers_X509_policy_tree_free__imp__X509_policy_tree_free_X509_policy_tree_get0_level__imp__X509_policy_tree_get0_level_X509_policy_tree_get0_policies__imp__X509_policy_tree_get0_policies_X509_policy_tree_get0_user_policies__imp__X509_policy_tree_get0_user_policies_X509_policy_tree_level_count__imp__X509_policy_tree_level_count_X509_print__imp__X509_print_X509_print_ex__imp__X509_print_ex_X509_print_ex_fp__imp__X509_print_ex_fp_X509_print_fp__imp__X509_print_fp_X509_pubkey_digest__imp__X509_pubkey_digest_X509_reject_clear__imp__X509_reject_clear_X509_set_ex_data__imp__X509_set_ex_data_X509_set_issuer_name__imp__X509_set_issuer_name_X509_set_notAfter__imp__X509_set_notAfter_X509_set_notBefore__imp__X509_set_notBefore_X509_set_pubkey__imp__X509_set_pubkey_X509_set_serialNumber__imp__X509_set_serialNumber_X509_set_subject_name__imp__X509_set_subject_name_X509_set_version__imp__X509_set_version_X509_sign__imp__X509_sign_X509_signature_print__imp__X509_signature_print_X509_subject_name_cmp__imp__X509_subject_name_cmp_X509_subject_name_hash__imp__X509_subject_name_hash_X509_supported_extension__imp__X509_supported_extension_X509_time_adj__imp__X509_time_adj_X509_to_X509_REQ__imp__X509_to_X509_REQ_X509_trust_clear__imp__X509_trust_clear_X509_verify__imp__X509_verify_X509_verify_cert__imp__X509_verify_cert_X509_verify_cert_error_string__imp__X509_verify_cert_error_string_X509at_add1_attr__imp__X509at_add1_attr_X509at_add1_attr_by_NID__imp__X509at_add1_attr_by_NID_X509at_add1_attr_by_OBJ__imp__X509at_add1_attr_by_OBJ_X509at_add1_attr_by_txt__imp__X509at_add1_attr_by_txt_X509at_delete_attr__imp__X509at_delete_attr_X509at_get0_data_by_OBJ__imp__X509at_get0_data_by_OBJ_X509at_get_attr__imp__X509at_get_attr_X509at_get_attr_by_NID__imp__X509at_get_attr_by_NID_X509at_get_attr_by_OBJ__imp__X509at_get_attr_by_OBJ_X509at_get_attr_count__imp__X509at_get_attr_count_X509v3_add_ext__imp__X509v3_add_ext_X509v3_delete_ext__imp__X509v3_delete_ext_X509v3_get_ext__imp__X509v3_get_ext_X509v3_get_ext_by_NID__imp__X509v3_get_ext_by_NID_X509v3_get_ext_by_OBJ__imp__X509v3_get_ext_by_OBJ_X509v3_get_ext_by_critical__imp__X509v3_get_ext_by_critical_X509v3_get_ext_count__imp__X509v3_get_ext_count_ZLONG_it__imp__ZLONG_it__imp___ossl_096_des_random_seed__ossl_096_des_random_seed__imp___ossl_old_crypt__ossl_old_crypt__imp___ossl_old_des_cbc_cksum__ossl_old_des_cbc_cksum__imp___ossl_old_des_cbc_encrypt__ossl_old_des_cbc_encrypt__imp___ossl_old_des_cfb64_encrypt__ossl_old_des_cfb64_encrypt__imp___ossl_old_des_cfb_encrypt__ossl_old_des_cfb_encrypt__imp___ossl_old_des_crypt__ossl_old_des_crypt__imp___ossl_old_des_decrypt3__ossl_old_des_decrypt3__imp___ossl_old_des_ecb3_encrypt__ossl_old_des_ecb3_encrypt__imp___ossl_old_des_ecb_encrypt__ossl_old_des_ecb_encrypt__imp___ossl_old_des_ede3_cbc_encrypt__ossl_old_des_ede3_cbc_encrypt__imp___ossl_old_des_ede3_cfb64_encrypt__ossl_old_des_ede3_cfb64_encrypt__imp___ossl_old_des_ede3_ofb64_encrypt__ossl_old_des_ede3_ofb64_encrypt__imp___ossl_old_des_enc_read__ossl_old_des_enc_read__imp___ossl_old_des_enc_write__ossl_old_des_enc_write__imp___ossl_old_des_encrypt2__ossl_old_des_encrypt2__imp___ossl_old_des_encrypt3__ossl_old_des_encrypt3__imp___ossl_old_des_encrypt__ossl_old_des_encrypt__imp___ossl_old_des_fcrypt__ossl_old_des_fcrypt__imp___ossl_old_des_is_weak_key__ossl_old_des_is_weak_key__imp___ossl_old_des_key_sched__ossl_old_des_key_sched__imp___ossl_old_des_ncbc_encrypt__ossl_old_des_ncbc_encrypt__imp___ossl_old_des_ofb64_encrypt__ossl_old_des_ofb64_encrypt__imp___ossl_old_des_ofb_encrypt__ossl_old_des_ofb_encrypt__imp___ossl_old_des_options__ossl_old_des_options__imp___ossl_old_des_pcbc_encrypt__ossl_old_des_pcbc_encrypt__imp___ossl_old_des_quad_cksum__ossl_old_des_quad_cksum__imp___ossl_old_des_random_key__ossl_old_des_random_key__imp___ossl_old_des_random_seed__ossl_old_des_random_seed__imp___ossl_old_des_read_2passwords__ossl_old_des_read_2passwords__imp___ossl_old_des_read_password__ossl_old_des_read_password__imp___ossl_old_des_read_pw__ossl_old_des_read_pw__imp___ossl_old_des_read_pw_string__ossl_old_des_read_pw_string__imp___ossl_old_des_set_key__ossl_old_des_set_key__imp___ossl_old_des_set_odd_parity__ossl_old_des_set_odd_parity__imp___ossl_old_des_string_to_2keys__ossl_old_des_string_to_2keys__imp___ossl_old_des_string_to_key__ossl_old_des_string_to_key__imp___ossl_old_des_xcbc_encrypt__ossl_old_des_xcbc_encrypt__imp___shadow_DES_check_key__shadow_DES_check_key__imp___shadow_DES_rw_mode__shadow_DES_rw_mode__imp__a2d_ASN1_OBJECT_a2d_ASN1_OBJECT__imp__a2i_ASN1_ENUMERATED_a2i_ASN1_ENUMERATED__imp__a2i_ASN1_INTEGER_a2i_ASN1_INTEGER__imp__a2i_ASN1_STRING_a2i_ASN1_STRING__imp__a2i_IPADDRESS_a2i_IPADDRESS__imp__a2i_IPADDRESS_NC_a2i_IPADDRESS_NC__imp__a2i_ipadd_a2i_ipadd__imp__asc2uni_asc2uni__imp__asn1_Finish_asn1_Finish__imp__asn1_GetSequence_asn1_GetSequence__imp__asn1_add_error_asn1_add_error__imp__asn1_const_Finish_asn1_const_Finish__imp__asn1_do_adb_asn1_do_adb__imp__asn1_do_lock_asn1_do_lock__imp__asn1_enc_free_asn1_enc_free__imp__asn1_enc_init_asn1_enc_init__imp__asn1_enc_restore_asn1_enc_restore__imp__asn1_enc_save_asn1_enc_save__imp__asn1_ex_c2i_asn1_ex_c2i__imp__asn1_ex_i2c_asn1_ex_i2c__imp__asn1_get_choice_selector_asn1_get_choice_selector__imp__asn1_get_field_ptr_asn1_get_field_ptr__imp__asn1_set_choice_selector_asn1_set_choice_selector__imp__bn_add_words_bn_add_words__imp__bn_div_words_bn_div_words__imp__bn_dup_expand_bn_dup_expand__imp__bn_expand2_bn_expand2__imp__bn_mul_add_words_bn_mul_add_words__imp__bn_mul_words_bn_mul_words__imp__bn_sqr_words_bn_sqr_words__imp__bn_sub_words_bn_sub_words__imp__c2i_ASN1_BIT_STRING_c2i_ASN1_BIT_STRING__imp__c2i_ASN1_INTEGER_c2i_ASN1_INTEGER__imp__c2i_ASN1_OBJECT_c2i_ASN1_OBJECT__imp__d2i_ACCESS_DESCRIPTION_d2i_ACCESS_DESCRIPTION__imp__d2i_ASN1_BIT_STRING_d2i_ASN1_BIT_STRING__imp__d2i_ASN1_BMPSTRING_d2i_ASN1_BMPSTRING__imp__d2i_ASN1_BOOLEAN_d2i_ASN1_BOOLEAN__imp__d2i_ASN1_ENUMERATED_d2i_ASN1_ENUMERATED__imp__d2i_ASN1_GENERALIZEDTIME_d2i_ASN1_GENERALIZEDTIME__imp__d2i_ASN1_GENERALSTRING_d2i_ASN1_GENERALSTRING__imp__d2i_ASN1_HEADER_d2i_ASN1_HEADER__imp__d2i_ASN1_IA5STRING_d2i_ASN1_IA5STRING__imp__d2i_ASN1_INTEGER_d2i_ASN1_INTEGER__imp__d2i_ASN1_NULL_d2i_ASN1_NULL__imp__d2i_ASN1_OBJECT_d2i_ASN1_OBJECT__imp__d2i_ASN1_OCTET_STRING_d2i_ASN1_OCTET_STRING__imp__d2i_ASN1_PRINTABLESTRING_d2i_ASN1_PRINTABLESTRING__imp__d2i_ASN1_PRINTABLE_d2i_ASN1_PRINTABLE__imp__d2i_ASN1_SET_d2i_ASN1_SET__imp__d2i_ASN1_T61STRING_d2i_ASN1_T61STRING__imp__d2i_ASN1_TIME_d2i_ASN1_TIME__imp__d2i_ASN1_TYPE_d2i_ASN1_TYPE__imp__d2i_ASN1_UINTEGER_d2i_ASN1_UINTEGER__imp__d2i_ASN1_UNIVERSALSTRING_d2i_ASN1_UNIVERSALSTRING__imp__d2i_ASN1_UTCTIME_d2i_ASN1_UTCTIME__imp__d2i_ASN1_UTF8STRING_d2i_ASN1_UTF8STRING__imp__d2i_ASN1_VISIBLESTRING_d2i_ASN1_VISIBLESTRING__imp__d2i_ASN1_bytes_d2i_ASN1_bytes__imp__d2i_ASN1_type_bytes_d2i_ASN1_type_bytes__imp__d2i_AUTHORITY_INFO_ACCESS_d2i_AUTHORITY_INFO_ACCESS__imp__d2i_AUTHORITY_KEYID_d2i_AUTHORITY_KEYID__imp__d2i_AutoPrivateKey_d2i_AutoPrivateKey__imp__d2i_BASIC_CONSTRAINTS_d2i_BASIC_CONSTRAINTS__imp__d2i_CERTIFICATEPOLICIES_d2i_CERTIFICATEPOLICIES__imp__d2i_CRL_DIST_POINTS_d2i_CRL_DIST_POINTS__imp__d2i_DHparams_d2i_DHparams__imp__d2i_DIRECTORYSTRING_d2i_DIRECTORYSTRING__imp__d2i_DISPLAYTEXT_d2i_DISPLAYTEXT__imp__d2i_DIST_POINT_d2i_DIST_POINT__imp__d2i_DIST_POINT_NAME_d2i_DIST_POINT_NAME__imp__d2i_DSAPrivateKey_d2i_DSAPrivateKey__imp__d2i_DSAPrivateKey_bio_d2i_DSAPrivateKey_bio__imp__d2i_DSAPrivateKey_fp_d2i_DSAPrivateKey_fp__imp__d2i_DSAPublicKey_d2i_DSAPublicKey__imp__d2i_DSA_PUBKEY_d2i_DSA_PUBKEY__imp__d2i_DSA_PUBKEY_bio_d2i_DSA_PUBKEY_bio__imp__d2i_DSA_PUBKEY_fp_d2i_DSA_PUBKEY_fp__imp__d2i_DSA_SIG_d2i_DSA_SIG__imp__d2i_DSAparams_d2i_DSAparams__imp__d2i_ECDSA_SIG_d2i_ECDSA_SIG__imp__d2i_ECPKParameters_d2i_ECPKParameters__imp__d2i_ECParameters_d2i_ECParameters__imp__d2i_ECPrivateKey_d2i_ECPrivateKey__imp__d2i_ECPrivateKey_bio_d2i_ECPrivateKey_bio__imp__d2i_ECPrivateKey_fp_d2i_ECPrivateKey_fp__imp__d2i_EC_PUBKEY_d2i_EC_PUBKEY__imp__d2i_EC_PUBKEY_bio_d2i_EC_PUBKEY_bio__imp__d2i_EC_PUBKEY_fp_d2i_EC_PUBKEY_fp__imp__d2i_EDIPARTYNAME_d2i_EDIPARTYNAME__imp__d2i_EXTENDED_KEY_USAGE_d2i_EXTENDED_KEY_USAGE__imp__d2i_GENERAL_NAMES_d2i_GENERAL_NAMES__imp__d2i_GENERAL_NAME_d2i_GENERAL_NAME__imp__d2i_KRB5_APREQBODY_d2i_KRB5_APREQBODY__imp__d2i_KRB5_APREQ_d2i_KRB5_APREQ__imp__d2i_KRB5_AUTHDATA_d2i_KRB5_AUTHDATA__imp__d2i_KRB5_AUTHENTBODY_d2i_KRB5_AUTHENTBODY__imp__d2i_KRB5_AUTHENT_d2i_KRB5_AUTHENT__imp__d2i_KRB5_CHECKSUM_d2i_KRB5_CHECKSUM__imp__d2i_KRB5_ENCDATA_d2i_KRB5_ENCDATA__imp__d2i_KRB5_ENCKEY_d2i_KRB5_ENCKEY__imp__d2i_KRB5_PRINCNAME_d2i_KRB5_PRINCNAME__imp__d2i_KRB5_TICKET_d2i_KRB5_TICKET__imp__d2i_KRB5_TKTBODY_d2i_KRB5_TKTBODY__imp__d2i_NETSCAPE_CERT_SEQUENCE_d2i_NETSCAPE_CERT_SEQUENCE__imp__d2i_NETSCAPE_SPKAC_d2i_NETSCAPE_SPKAC__imp__d2i_NETSCAPE_SPKI_d2i_NETSCAPE_SPKI__imp__d2i_NOTICEREF_d2i_NOTICEREF__imp__d2i_Netscape_RSA_d2i_Netscape_RSA__imp__d2i_OCSP_BASICRESP_d2i_OCSP_BASICRESP__imp__d2i_OCSP_CERTID_d2i_OCSP_CERTID__imp__d2i_OCSP_CERTSTATUS_d2i_OCSP_CERTSTATUS__imp__d2i_OCSP_CRLID_d2i_OCSP_CRLID__imp__d2i_OCSP_ONEREQ_d2i_OCSP_ONEREQ__imp__d2i_OCSP_REQINFO_d2i_OCSP_REQINFO__imp__d2i_OCSP_REQUEST_d2i_OCSP_REQUEST__imp__d2i_OCSP_RESPBYTES_d2i_OCSP_RESPBYTES__imp__d2i_OCSP_RESPDATA_d2i_OCSP_RESPDATA__imp__d2i_OCSP_RESPID_d2i_OCSP_RESPID__imp__d2i_OCSP_RESPONSE_d2i_OCSP_RESPONSE__imp__d2i_OCSP_REVOKEDINFO_d2i_OCSP_REVOKEDINFO__imp__d2i_OCSP_SERVICELOC_d2i_OCSP_SERVICELOC__imp__d2i_OCSP_SIGNATURE_d2i_OCSP_SIGNATURE__imp__d2i_OCSP_SINGLERESP_d2i_OCSP_SINGLERESP__imp__d2i_OTHERNAME_d2i_OTHERNAME__imp__d2i_PBE2PARAM_d2i_PBE2PARAM__imp__d2i_PBEPARAM_d2i_PBEPARAM__imp__d2i_PBKDF2PARAM_d2i_PBKDF2PARAM__imp__d2i_PKCS12_d2i_PKCS12__imp__d2i_PKCS12_BAGS_d2i_PKCS12_BAGS__imp__d2i_PKCS12_MAC_DATA_d2i_PKCS12_MAC_DATA__imp__d2i_PKCS12_SAFEBAG_d2i_PKCS12_SAFEBAG__imp__d2i_PKCS12_bio_d2i_PKCS12_bio__imp__d2i_PKCS12_fp_d2i_PKCS12_fp__imp__d2i_PKCS7_d2i_PKCS7__imp__d2i_PKCS7_DIGEST_d2i_PKCS7_DIGEST__imp__d2i_PKCS7_ENCRYPT_d2i_PKCS7_ENCRYPT__imp__d2i_PKCS7_ENC_CONTENT_d2i_PKCS7_ENC_CONTENT__imp__d2i_PKCS7_ENVELOPE_d2i_PKCS7_ENVELOPE__imp__d2i_PKCS7_ISSUER_AND_SERIAL_d2i_PKCS7_ISSUER_AND_SERIAL__imp__d2i_PKCS7_RECIP_INFO_d2i_PKCS7_RECIP_INFO__imp__d2i_PKCS7_SIGNED_d2i_PKCS7_SIGNED__imp__d2i_PKCS7_SIGNER_INFO_d2i_PKCS7_SIGNER_INFO__imp__d2i_PKCS7_SIGN_ENVELOPE_d2i_PKCS7_SIGN_ENVELOPE__imp__d2i_PKCS7_bio_d2i_PKCS7_bio__imp__d2i_PKCS7_fp_d2i_PKCS7_fp__imp__d2i_PKCS8PrivateKey_bio_d2i_PKCS8PrivateKey_bio__imp__d2i_PKCS8PrivateKey_fp_d2i_PKCS8PrivateKey_fp__imp__d2i_PKCS8_PRIV_KEY_INFO_d2i_PKCS8_PRIV_KEY_INFO__imp__d2i_PKCS8_PRIV_KEY_INFO_bio_d2i_PKCS8_PRIV_KEY_INFO_bio__imp__d2i_PKCS8_PRIV_KEY_INFO_fp_d2i_PKCS8_PRIV_KEY_INFO_fp__imp__d2i_PKCS8_bio_d2i_PKCS8_bio__imp__d2i_PKCS8_fp_d2i_PKCS8_fp__imp__d2i_PKEY_USAGE_PERIOD_d2i_PKEY_USAGE_PERIOD__imp__d2i_POLICYINFO_d2i_POLICYINFO__imp__d2i_POLICYQUALINFO_d2i_POLICYQUALINFO__imp__d2i_PROXY_CERT_INFO_EXTENSION_d2i_PROXY_CERT_INFO_EXTENSION__imp__d2i_PROXY_POLICY_d2i_PROXY_POLICY__imp__d2i_PUBKEY_d2i_PUBKEY__imp__d2i_PUBKEY_bio_d2i_PUBKEY_bio__imp__d2i_PUBKEY_fp_d2i_PUBKEY_fp__imp__d2i_PrivateKey_d2i_PrivateKey__imp__d2i_PrivateKey_bio_d2i_PrivateKey_bio__imp__d2i_PrivateKey_fp_d2i_PrivateKey_fp__imp__d2i_PublicKey_d2i_PublicKey__imp__d2i_RSAPrivateKey_d2i_RSAPrivateKey__imp__d2i_RSAPrivateKey_bio_d2i_RSAPrivateKey_bio__imp__d2i_RSAPrivateKey_fp_d2i_RSAPrivateKey_fp__imp__d2i_RSAPublicKey_d2i_RSAPublicKey__imp__d2i_RSAPublicKey_bio_d2i_RSAPublicKey_bio__imp__d2i_RSAPublicKey_fp_d2i_RSAPublicKey_fp__imp__d2i_RSA_NET_d2i_RSA_NET__imp__d2i_RSA_PUBKEY_d2i_RSA_PUBKEY__imp__d2i_RSA_PUBKEY_bio_d2i_RSA_PUBKEY_bio__imp__d2i_RSA_PUBKEY_fp_d2i_RSA_PUBKEY_fp__imp__d2i_SXNETID_d2i_SXNETID__imp__d2i_SXNET_d2i_SXNET__imp__d2i_USERNOTICE_d2i_USERNOTICE__imp__d2i_X509_d2i_X509__imp__d2i_X509_ALGORS_d2i_X509_ALGORS__imp__d2i_X509_ALGOR_d2i_X509_ALGOR__imp__d2i_X509_ATTRIBUTE_d2i_X509_ATTRIBUTE__imp__d2i_X509_AUX_d2i_X509_AUX__imp__d2i_X509_CERT_AUX_d2i_X509_CERT_AUX__imp__d2i_X509_CERT_PAIR_d2i_X509_CERT_PAIR__imp__d2i_X509_CINF_d2i_X509_CINF__imp__d2i_X509_CRL_d2i_X509_CRL__imp__d2i_X509_CRL_INFO_d2i_X509_CRL_INFO__imp__d2i_X509_CRL_bio_d2i_X509_CRL_bio__imp__d2i_X509_CRL_fp_d2i_X509_CRL_fp__imp__d2i_X509_EXTENSIONS_d2i_X509_EXTENSIONS__imp__d2i_X509_EXTENSION_d2i_X509_EXTENSION__imp__d2i_X509_NAME_d2i_X509_NAME__imp__d2i_X509_NAME_ENTRY_d2i_X509_NAME_ENTRY__imp__d2i_X509_PKEY_d2i_X509_PKEY__imp__d2i_X509_PUBKEY_d2i_X509_PUBKEY__imp__d2i_X509_REQ_d2i_X509_REQ__imp__d2i_X509_REQ_INFO_d2i_X509_REQ_INFO__imp__d2i_X509_REQ_bio_d2i_X509_REQ_bio__imp__d2i_X509_REQ_fp_d2i_X509_REQ_fp__imp__d2i_X509_REVOKED_d2i_X509_REVOKED__imp__d2i_X509_SIG_d2i_X509_SIG__imp__d2i_X509_VAL_d2i_X509_VAL__imp__d2i_X509_bio_d2i_X509_bio__imp__d2i_X509_fp_d2i_X509_fp__imp__get_rfc2409_prime_1024_get_rfc2409_prime_1024__imp__get_rfc2409_prime_768_get_rfc2409_prime_768__imp__get_rfc3526_prime_1536_get_rfc3526_prime_1536__imp__get_rfc3526_prime_2048_get_rfc3526_prime_2048__imp__get_rfc3526_prime_3072_get_rfc3526_prime_3072__imp__get_rfc3526_prime_4096_get_rfc3526_prime_4096__imp__get_rfc3526_prime_6144_get_rfc3526_prime_6144__imp__get_rfc3526_prime_8192_get_rfc3526_prime_8192__imp__hex_to_string_hex_to_string__imp__i2a_ACCESS_DESCRIPTION_i2a_ACCESS_DESCRIPTION__imp__i2a_ASN1_ENUMERATED_i2a_ASN1_ENUMERATED__imp__i2a_ASN1_INTEGER_i2a_ASN1_INTEGER__imp__i2a_ASN1_OBJECT_i2a_ASN1_OBJECT__imp__i2a_ASN1_STRING_i2a_ASN1_STRING__imp__i2c_ASN1_BIT_STRING_i2c_ASN1_BIT_STRING__imp__i2c_ASN1_INTEGER_i2c_ASN1_INTEGER__imp__i2d_ACCESS_DESCRIPTION_i2d_ACCESS_DESCRIPTION__imp__i2d_ASN1_BIT_STRING_i2d_ASN1_BIT_STRING__imp__i2d_ASN1_BMPSTRING_i2d_ASN1_BMPSTRING__imp__i2d_ASN1_BOOLEAN_i2d_ASN1_BOOLEAN__imp__i2d_ASN1_ENUMERATED_i2d_ASN1_ENUMERATED__imp__i2d_ASN1_GENERALIZEDTIME_i2d_ASN1_GENERALIZEDTIME__imp__i2d_ASN1_GENERALSTRING_i2d_ASN1_GENERALSTRING__imp__i2d_ASN1_HEADER_i2d_ASN1_HEADER__imp__i2d_ASN1_IA5STRING_i2d_ASN1_IA5STRING__imp__i2d_ASN1_INTEGER_i2d_ASN1_INTEGER__imp__i2d_ASN1_NULL_i2d_ASN1_NULL__imp__i2d_ASN1_OBJECT_i2d_ASN1_OBJECT__imp__i2d_ASN1_OCTET_STRING_i2d_ASN1_OCTET_STRING__imp__i2d_ASN1_PRINTABLESTRING_i2d_ASN1_PRINTABLESTRING__imp__i2d_ASN1_PRINTABLE_i2d_ASN1_PRINTABLE__imp__i2d_ASN1_SET_i2d_ASN1_SET__imp__i2d_ASN1_T61STRING_i2d_ASN1_T61STRING__imp__i2d_ASN1_TIME_i2d_ASN1_TIME__imp__i2d_ASN1_TYPE_i2d_ASN1_TYPE__imp__i2d_ASN1_UNIVERSALSTRING_i2d_ASN1_UNIVERSALSTRING__imp__i2d_ASN1_UTCTIME_i2d_ASN1_UTCTIME__imp__i2d_ASN1_UTF8STRING_i2d_ASN1_UTF8STRING__imp__i2d_ASN1_VISIBLESTRING_i2d_ASN1_VISIBLESTRING__imp__i2d_ASN1_bytes_i2d_ASN1_bytes__imp__i2d_AUTHORITY_INFO_ACCESS_i2d_AUTHORITY_INFO_ACCESS__imp__i2d_AUTHORITY_KEYID_i2d_AUTHORITY_KEYID__imp__i2d_BASIC_CONSTRAINTS_i2d_BASIC_CONSTRAINTS__imp__i2d_CERTIFICATEPOLICIES_i2d_CERTIFICATEPOLICIES__imp__i2d_CRL_DIST_POINTS_i2d_CRL_DIST_POINTS__imp__i2d_DHparams_i2d_DHparams__imp__i2d_DIRECTORYSTRING_i2d_DIRECTORYSTRING__imp__i2d_DISPLAYTEXT_i2d_DISPLAYTEXT__imp__i2d_DIST_POINT_i2d_DIST_POINT__imp__i2d_DIST_POINT_NAME_i2d_DIST_POINT_NAME__imp__i2d_DSAPrivateKey_i2d_DSAPrivateKey__imp__i2d_DSAPrivateKey_bio_i2d_DSAPrivateKey_bio__imp__i2d_DSAPrivateKey_fp_i2d_DSAPrivateKey_fp__imp__i2d_DSAPublicKey_i2d_DSAPublicKey__imp__i2d_DSA_PUBKEY_i2d_DSA_PUBKEY__imp__i2d_DSA_PUBKEY_bio_i2d_DSA_PUBKEY_bio__imp__i2d_DSA_PUBKEY_fp_i2d_DSA_PUBKEY_fp__imp__i2d_DSA_SIG_i2d_DSA_SIG__imp__i2d_DSAparams_i2d_DSAparams__imp__i2d_ECDSA_SIG_i2d_ECDSA_SIG__imp__i2d_ECPKParameters_i2d_ECPKParameters__imp__i2d_ECParameters_i2d_ECParameters__imp__i2d_ECPrivateKey_i2d_ECPrivateKey__imp__i2d_ECPrivateKey_bio_i2d_ECPrivateKey_bio__imp__i2d_ECPrivateKey_fp_i2d_ECPrivateKey_fp__imp__i2d_EC_PUBKEY_i2d_EC_PUBKEY__imp__i2d_EC_PUBKEY_bio_i2d_EC_PUBKEY_bio__imp__i2d_EC_PUBKEY_fp_i2d_EC_PUBKEY_fp__imp__i2d_EDIPARTYNAME_i2d_EDIPARTYNAME__imp__i2d_EXTENDED_KEY_USAGE_i2d_EXTENDED_KEY_USAGE__imp__i2d_GENERAL_NAMES_i2d_GENERAL_NAMES__imp__i2d_GENERAL_NAME_i2d_GENERAL_NAME__imp__i2d_KRB5_APREQBODY_i2d_KRB5_APREQBODY__imp__i2d_KRB5_APREQ_i2d_KRB5_APREQ__imp__i2d_KRB5_AUTHDATA_i2d_KRB5_AUTHDATA__imp__i2d_KRB5_AUTHENTBODY_i2d_KRB5_AUTHENTBODY__imp__i2d_KRB5_AUTHENT_i2d_KRB5_AUTHENT__imp__i2d_KRB5_CHECKSUM_i2d_KRB5_CHECKSUM__imp__i2d_KRB5_ENCDATA_i2d_KRB5_ENCDATA__imp__i2d_KRB5_ENCKEY_i2d_KRB5_ENCKEY__imp__i2d_KRB5_PRINCNAME_i2d_KRB5_PRINCNAME__imp__i2d_KRB5_TICKET_i2d_KRB5_TICKET__imp__i2d_KRB5_TKTBODY_i2d_KRB5_TKTBODY__imp__i2d_NETSCAPE_CERT_SEQUENCE_i2d_NETSCAPE_CERT_SEQUENCE__imp__i2d_NETSCAPE_SPKAC_i2d_NETSCAPE_SPKAC__imp__i2d_NETSCAPE_SPKI_i2d_NETSCAPE_SPKI__imp__i2d_NOTICEREF_i2d_NOTICEREF__imp__i2d_Netscape_RSA_i2d_Netscape_RSA__imp__i2d_OCSP_BASICRESP_i2d_OCSP_BASICRESP__imp__i2d_OCSP_CERTID_i2d_OCSP_CERTID__imp__i2d_OCSP_CERTSTATUS_i2d_OCSP_CERTSTATUS__imp__i2d_OCSP_CRLID_i2d_OCSP_CRLID__imp__i2d_OCSP_ONEREQ_i2d_OCSP_ONEREQ__imp__i2d_OCSP_REQINFO_i2d_OCSP_REQINFO__imp__i2d_OCSP_REQUEST_i2d_OCSP_REQUEST__imp__i2d_OCSP_RESPBYTES_i2d_OCSP_RESPBYTES__imp__i2d_OCSP_RESPDATA_i2d_OCSP_RESPDATA__imp__i2d_OCSP_RESPID_i2d_OCSP_RESPID__imp__i2d_OCSP_RESPONSE_i2d_OCSP_RESPONSE__imp__i2d_OCSP_REVOKEDINFO_i2d_OCSP_REVOKEDINFO__imp__i2d_OCSP_SERVICELOC_i2d_OCSP_SERVICELOC__imp__i2d_OCSP_SIGNATURE_i2d_OCSP_SIGNATURE__imp__i2d_OCSP_SINGLERESP_i2d_OCSP_SINGLERESP__imp__i2d_OTHERNAME_i2d_OTHERNAME__imp__i2d_PBE2PARAM_i2d_PBE2PARAM__imp__i2d_PBEPARAM_i2d_PBEPARAM__imp__i2d_PBKDF2PARAM_i2d_PBKDF2PARAM__imp__i2d_PKCS12_i2d_PKCS12__imp__i2d_PKCS12_BAGS_i2d_PKCS12_BAGS__imp__i2d_PKCS12_MAC_DATA_i2d_PKCS12_MAC_DATA__imp__i2d_PKCS12_SAFEBAG_i2d_PKCS12_SAFEBAG__imp__i2d_PKCS12_bio_i2d_PKCS12_bio__imp__i2d_PKCS12_fp_i2d_PKCS12_fp__imp__i2d_PKCS7_i2d_PKCS7__imp__i2d_PKCS7_DIGEST_i2d_PKCS7_DIGEST__imp__i2d_PKCS7_ENCRYPT_i2d_PKCS7_ENCRYPT__imp__i2d_PKCS7_ENC_CONTENT_i2d_PKCS7_ENC_CONTENT__imp__i2d_PKCS7_ENVELOPE_i2d_PKCS7_ENVELOPE__imp__i2d_PKCS7_ISSUER_AND_SERIAL_i2d_PKCS7_ISSUER_AND_SERIAL__imp__i2d_PKCS7_NDEF_i2d_PKCS7_NDEF__imp__i2d_PKCS7_RECIP_INFO_i2d_PKCS7_RECIP_INFO__imp__i2d_PKCS7_SIGNED_i2d_PKCS7_SIGNED__imp__i2d_PKCS7_SIGNER_INFO_i2d_PKCS7_SIGNER_INFO__imp__i2d_PKCS7_SIGN_ENVELOPE_i2d_PKCS7_SIGN_ENVELOPE__imp__i2d_PKCS7_bio_i2d_PKCS7_bio__imp__i2d_PKCS7_fp_i2d_PKCS7_fp__imp__i2d_PKCS8PrivateKeyInfo_bio_i2d_PKCS8PrivateKeyInfo_bio__imp__i2d_PKCS8PrivateKeyInfo_fp_i2d_PKCS8PrivateKeyInfo_fp__imp__i2d_PKCS8PrivateKey_bio_i2d_PKCS8PrivateKey_bio__imp__i2d_PKCS8PrivateKey_fp_i2d_PKCS8PrivateKey_fp__imp__i2d_PKCS8PrivateKey_nid_bio_i2d_PKCS8PrivateKey_nid_bio__imp__i2d_PKCS8PrivateKey_nid_fp_i2d_PKCS8PrivateKey_nid_fp__imp__i2d_PKCS8_PRIV_KEY_INFO_i2d_PKCS8_PRIV_KEY_INFO__imp__i2d_PKCS8_PRIV_KEY_INFO_bio_i2d_PKCS8_PRIV_KEY_INFO_bio__imp__i2d_PKCS8_PRIV_KEY_INFO_fp_i2d_PKCS8_PRIV_KEY_INFO_fp__imp__i2d_PKCS8_bio_i2d_PKCS8_bio__imp__i2d_PKCS8_fp_i2d_PKCS8_fp__imp__i2d_PKEY_USAGE_PERIOD_i2d_PKEY_USAGE_PERIOD__imp__i2d_POLICYINFO_i2d_POLICYINFO__imp__i2d_POLICYQUALINFO_i2d_POLICYQUALINFO__imp__i2d_PROXY_CERT_INFO_EXTENSION_i2d_PROXY_CERT_INFO_EXTENSION__imp__i2d_PROXY_POLICY_i2d_PROXY_POLICY__imp__i2d_PUBKEY_i2d_PUBKEY__imp__i2d_PUBKEY_bio_i2d_PUBKEY_bio__imp__i2d_PUBKEY_fp_i2d_PUBKEY_fp__imp__i2d_PrivateKey_i2d_PrivateKey__imp__i2d_PrivateKey_bio_i2d_PrivateKey_bio__imp__i2d_PrivateKey_fp_i2d_PrivateKey_fp__imp__i2d_PublicKey_i2d_PublicKey__imp__i2d_RSAPrivateKey_i2d_RSAPrivateKey__imp__i2d_RSAPrivateKey_bio_i2d_RSAPrivateKey_bio__imp__i2d_RSAPrivateKey_fp_i2d_RSAPrivateKey_fp__imp__i2d_RSAPublicKey_i2d_RSAPublicKey__imp__i2d_RSAPublicKey_bio_i2d_RSAPublicKey_bio__imp__i2d_RSAPublicKey_fp_i2d_RSAPublicKey_fp__imp__i2d_RSA_NET_i2d_RSA_NET__imp__i2d_RSA_PUBKEY_i2d_RSA_PUBKEY__imp__i2d_RSA_PUBKEY_bio_i2d_RSA_PUBKEY_bio__imp__i2d_RSA_PUBKEY_fp_i2d_RSA_PUBKEY_fp__imp__i2d_SXNETID_i2d_SXNETID__imp__i2d_SXNET_i2d_SXNET__imp__i2d_USERNOTICE_i2d_USERNOTICE__imp__i2d_X509_i2d_X509__imp__i2d_X509_ALGORS_i2d_X509_ALGORS__imp__i2d_X509_ALGOR_i2d_X509_ALGOR__imp__i2d_X509_ATTRIBUTE_i2d_X509_ATTRIBUTE__imp__i2d_X509_AUX_i2d_X509_AUX__imp__i2d_X509_CERT_AUX_i2d_X509_CERT_AUX__imp__i2d_X509_CERT_PAIR_i2d_X509_CERT_PAIR__imp__i2d_X509_CINF_i2d_X509_CINF__imp__i2d_X509_CRL_i2d_X509_CRL__imp__i2d_X509_CRL_INFO_i2d_X509_CRL_INFO__imp__i2d_X509_CRL_bio_i2d_X509_CRL_bio__imp__i2d_X509_CRL_fp_i2d_X509_CRL_fp__imp__i2d_X509_EXTENSIONS_i2d_X509_EXTENSIONS__imp__i2d_X509_EXTENSION_i2d_X509_EXTENSION__imp__i2d_X509_NAME_i2d_X509_NAME__imp__i2d_X509_NAME_ENTRY_i2d_X509_NAME_ENTRY__imp__i2d_X509_PKEY_i2d_X509_PKEY__imp__i2d_X509_PUBKEY_i2d_X509_PUBKEY__imp__i2d_X509_REQ_i2d_X509_REQ__imp__i2d_X509_REQ_INFO_i2d_X509_REQ_INFO__imp__i2d_X509_REQ_bio_i2d_X509_REQ_bio__imp__i2d_X509_REQ_fp_i2d_X509_REQ_fp__imp__i2d_X509_REVOKED_i2d_X509_REVOKED__imp__i2d_X509_SIG_i2d_X509_SIG__imp__i2d_X509_VAL_i2d_X509_VAL__imp__i2d_X509_bio_i2d_X509_bio__imp__i2d_X509_fp_i2d_X509_fp__imp__i2o_ECPublicKey_i2o_ECPublicKey__imp__i2s_ASN1_ENUMERATED_i2s_ASN1_ENUMERATED__imp__i2s_ASN1_ENUMERATED_TABLE_i2s_ASN1_ENUMERATED_TABLE__imp__i2s_ASN1_INTEGER_i2s_ASN1_INTEGER__imp__i2s_ASN1_OCTET_STRING_i2s_ASN1_OCTET_STRING__imp__i2t_ASN1_OBJECT_i2t_ASN1_OBJECT__imp__i2v_ASN1_BIT_STRING_i2v_ASN1_BIT_STRING__imp__i2v_GENERAL_NAMES_i2v_GENERAL_NAMES__imp__i2v_GENERAL_NAME_i2v_GENERAL_NAME__imp__idea_cbc_encrypt_idea_cbc_encrypt__imp__idea_cfb64_encrypt_idea_cfb64_encrypt__imp__idea_ecb_encrypt_idea_ecb_encrypt__imp__idea_encrypt_idea_encrypt__imp__idea_ofb64_encrypt_idea_ofb64_encrypt__imp__idea_options_idea_options__imp__idea_set_decrypt_key_idea_set_decrypt_key__imp__idea_set_encrypt_key_idea_set_encrypt_key__imp__int_CRYPTO_set_do_dynlock_callback_int_CRYPTO_set_do_dynlock_callback__imp__int_smime_write_ASN1_int_smime_write_ASN1__imp__lh_delete_lh_delete__imp__lh_doall_lh_doall__imp__lh_doall_arg_lh_doall_arg__imp__lh_free_lh_free__imp__lh_insert_lh_insert__imp__lh_new_lh_new__imp__lh_node_stats_lh_node_stats__imp__lh_node_stats_bio_lh_node_stats_bio__imp__lh_node_usage_stats_lh_node_usage_stats__imp__lh_node_usage_stats_bio_lh_node_usage_stats_bio__imp__lh_num_items_lh_num_items__imp__lh_retrieve_lh_retrieve__imp__lh_stats_lh_stats__imp__lh_stats_bio_lh_stats_bio__imp__lh_strhash_lh_strhash__imp__ms_time_cmp_ms_time_cmp__imp__ms_time_diff_ms_time_diff__imp__ms_time_free_ms_time_free__imp__ms_time_get_ms_time_get__imp__ms_time_new_ms_time_new__imp__name_cmp_name_cmp__imp__o2i_ECPublicKey_o2i_ECPublicKey__imp__pitem_free_pitem_free__imp__pitem_new_pitem_new__imp__pqueue_find_pqueue_find__imp__pqueue_free_pqueue_free__imp__pqueue_insert_pqueue_insert__imp__pqueue_iterator_pqueue_iterator__imp__pqueue_new_pqueue_new__imp__pqueue_next_pqueue_next__imp__pqueue_peek_pqueue_peek__imp__pqueue_pop_pqueue_pop__imp__pqueue_print_pqueue_print__imp__s2i_ASN1_INTEGER_s2i_ASN1_INTEGER__imp__s2i_ASN1_OCTET_STRING_s2i_ASN1_OCTET_STRING__imp__sk_delete_sk_delete__imp__sk_delete_ptr_sk_delete_ptr__imp__sk_dup_sk_dup__imp__sk_find_sk_find__imp__sk_find_ex_sk_find_ex__imp__sk_free_sk_free__imp__sk_insert_sk_insert__imp__sk_is_sorted_sk_is_sorted__imp__sk_new_sk_new__imp__sk_new_null_sk_new_null__imp__sk_num_sk_num__imp__sk_pop_sk_pop__imp__sk_pop_free_sk_pop_free__imp__sk_push_sk_push__imp__sk_set_sk_set__imp__sk_set_cmp_func_sk_set_cmp_func__imp__sk_shift_sk_shift__imp__sk_sort_sk_sort__imp__sk_unshift_sk_unshift__imp__sk_value_sk_value__imp__sk_zero_sk_zero__imp__string_to_hex_string_to_hex__imp__uni2asc_uni2asc__imp__v2i_ASN1_BIT_STRING_v2i_ASN1_BIT_STRING__imp__v2i_GENERAL_NAMES_v2i_GENERAL_NAMES__imp__v2i_GENERAL_NAME_v2i_GENERAL_NAME__imp__v2i_GENERAL_NAME_ex_v2i_GENERAL_NAME_ex__imp__OSSL_libdes_version__imp__OSSL_DES_version / 1261339772 0 163817 ` â Ft¬®Qvê`Ò@²"’ z ä R ¼ * œ  x ê X Ä .¦|îdÖLÂ4¤„øjÜNÀ4¤– „þvôjÞTÄ2ªŒþnÞN ¾ ,!œ! "~"ì"X#Ä#6$¦$%‚%ú%n&â&X'Ì'@(´(,)¢)*Œ*ü*n+à+P,Ä,<-°-.Ž.ü.n/Þ/Z0Ì0B1°1 2”2x3 3è3^4Ú4Z5Ì5<6°6"7’78t8â8P9¼9(:–:;~;ì;X<Ô<L=$>¸=’>?†?þ?t@ì@jAÜARBÂB0C CD‚DøDlEÞEPFÆF:G°G"H˜HI€IêITJ¼J.KžK LxLâLNM¾M.NžN OzOêOZPÊP8Q¤QR„RöRbSÐS>T®TUUVrVâVLWºW,XžX YxYäYRZºZ&[’[\t\ä\T]Æ]0^ª^"_š_`€`ò`haÜaPb¾b.c˜cdpdàdJe´ef†föfdgÖg>h¶h2i¢ijŒjþjvkÞkHl²l m’mnpnÜnHo´opŠpôpbqØqJr¶rsŠsþsntâtPuÄu2vžvw‚wòwZxÄx0yžy zrzàzP{¾{*|”|}j}Ø}F~®~€îÊ€`€4š‚p‚Ø‚@ƒ¨ƒ„|„è„V…¾…(††ú†f‡̇<ˆ°ˆ‰Œ‰ø‰jŠÖŠF‹´‹ Œ˜Œ |êXŽÀŽ*–þpæ^‘ΑB’º’,“ “”‚”ú”l•Ö•@–ª–—~—ê—V˜À˜0™š™švšèšV›È›6œ¨œˆþxžæžXŸÈŸ< ¬ ¡Œ¡ü¡j¢Ø¢N£¾£.¤œ¤ ¥€¥ô¥l¦Ò¦<§¤§ ¨t¨ܨD©²©ª†ªòªX«¾«&¬Œ¬ö¬`­Æ­,®’®¯j¯Ú¯N°İ:±°±&²œ²³r³Ú³@´¬´µ„µøµn¶B·Ú¶¬·¸‚¸\¹ò¸̹:º²º&»”»¼Þ¼L½r¼À½2¾œ¾¿„¿î¿XÀÂÀ2ÁœÁÂjÂÔÂ:èÃÄ„ÄòÄ`ÅÈÅ2Æ¢Æ ÇtÇÞÇLÈÀÈ&É’ÉfÊþÉÐÊ:˨ËÌ~ÌäÌJÍ´ÍÎŽÎÏfÏÌÏ2ОРÑvÑèÑRÒ¼Ò&ÓÓúÓdÔÔÔFÕ²Õ"ÖŽÖ×l×Ö×NØÄØ:Ù¦ÙÚ„ÚôÚ\ÛÄÛ4Ü Ü ÝtÝðÝ^ÞÎÞ<ß²ß(àœàáŠáâxâàâLã¸ã&äžäåˆåøåhæÞæPç¾ç4è¢èéˆéúéhêâêPëÆë6ì¨ìíŽíî~îöîhïàïJð¼ð.ñªñ,ò®ò.ó¦óô˜ôõ„õøõzöøör÷ð÷løæø^ùÖùJúÀú*û–ûü‚üðü`ýÒýDþ¶þ&ÿ”ÿræTÊFÈJÊ<¼2´2¬*¦ ˜ € ð \ Ê : ¨  „ ð ` Î B¶, ‚îZÆ2œ væVÄ.ž zì\Æ8¬pÚB² †ôjâVÄ6œ | ê V!¼!$"’"#v#è#Z$Ê$8%¦%&Œ&þ&l'Ø'F(°()†)ð)\*Æ*.+ž+,Ž,-r-æ-L.º."/Ž/0r0à0H1¶12ˆ2ò2`3Ò3>4®45Ž5ü5l6Ø6D7¸7 8ˆ8ð8f9Ö9L:º:";Š;ð;^<Ô<D=²=(>’>þ>n?ä?T@È@>A®ABˆBöBbCÎC>D¬D$E”E F‚FòFbGÌG8H¨HI~IòIhJÚJNKÂK4L¦LMˆMNtNàNLO¸O$PšP Q‚QøQlRâRXSÎS@T²T0U²U&V¢VWWüWvXìXbYÚYPZÆZ<[²[(\ª\]Š]ô]^^È^:_ª_ `–` a~aøatbÞbVcÌc8d¦deŽefrfèf\gÈg@h¬hiŽiúifjÒj>kªk2l¶l8mªmnŽnovoèoTpÀp2q¢qr†rs’stœt"ušuvzvîv^wÌw›´›,œ¦œ"œžŠžŸlŸØŸF ´ $¡’¡¢p¢â¢V£Σ@¤´¤*¥ ¥¦ަ§~§ø§p¨ê¨\©ΩHª¸ª$«œ«¬š¬"­­®z®î®d¯Ú¯P°İ:±²±*²–²³v³æ³X´È´<µ²µ¶¶·|·ö·b¸Ö¸J¹¾¹2º¤º»Œ»¼v¼è¼\½нD¾º¾,¿¢¿ÀŠÀþÀrÁæÁ\ÂÒÂFúÃ0Ä¢ÄÅŒÅÆrÆàÆRÇÊÇ<È´È0ÉžÉÊ€ÊòÊ^ËÔËN̾Ì0ͦÍ΄ÎòÎjÏÞÏTÐÎÐ@Ñ´Ñ&Ò ÒÓŠÓÔtÔæÔ\ÕÖÕNÖÊÖD×¼×4بØÙŽÙÚvÚäÚ\ÛÒÛªÜÝŠÝøÝhÞ@ÜØÞFß´ß"à’àátáâáTâ.ãœãä|äìäÄâ\åÊå8æ¦æç†çøçfèØèHéºé0êžêë€ëòë`ìÌì@í´í$î”îþîhïÔï@ð²ð ñŽñüñjòÞòPóÈó@ô¸ô&õ’õþõtöìö\÷Ð÷@ø¬øùŒùúpúàúXûÐûFüÀü,ý¤ýþ„þøþhÿÔÿ@¬„òdÒ@®nܺJ,œ xV æÈ 8 ¦  ~ ê T ¾ * ˜ pÚD°ˆ\È8¨ŠúòjØH¶$Ž`úÈ0œ„ô`Î:¦ rØB°ˆô^È. ˜  !v!L"´"#ˆ#ò#æ!\$Ò$F%¼%.&ž&'~'ì'\(Î(B)´)&*Š*ú*f+Ø+B,ª,-€-ò-b.Ô.B/®/0Ž0þ0n1â1T2È283¦34ˆ4ø4h5Ø5F6¶6&7”78t8ä8V9Æ94:¢:;€;ð;V<¸< =ˆ=ò=\>¾>&?Ž?ú?d@Æ@.A–ABlBàBRCÆC0DœD EvEàENFÀF0G G HxHäHLIÆI>J¸J*KšK L„LüLnMæMVNÆN8O°O"P–PQpQÜQHR¸R&SœSTtTæTTUÂU,VšVWjWÔWFX¬XY€YêYTZ¾Z([’[ü[f\Ð\J]À]8^ª^$_š_`’`aabrbâbPc¾c2d¤de„eðe^fÖfHg¾g.h¦hi’i jŠjkpkÞkNl¼l,m¤mnŽnþnvoêodpÞp^qØqFr¶r(s˜s tztìt^uÎu>v®vwŠwüwlxÜxNyÂy4z¨z{Ž{|r|â|T}Ð}F~À~4°&€¤€"¤ ‚’‚ƒ|ƒòƒf„Ú„P…¾….†ž†‡€‡ð‡bˆЈ>‰°‰ŠŠŠüŠn‹Ü‹PŒÆŒ<²*Ž¢ŽˆúhÖJ‘¸‘,’¤’““”p”à”V•È•6–¦–$—¤—˜€˜ò˜^™Ι>šºš œzœæœR¼2ž¨žŸ‚ŸîŸZ Ä 0¡ ¡¢|¢è¢X£Æ£8¤¤¤¥~¥ê¥V¦Ħ6§¬§"¨”¨©p©Ü©Rª¾ª&«–« ¬~¬ð¬f­Ú­L®Ê®8¯¦¯"°°±x±ì±^²ʲ:³°³ ´´ü´pµêµ`¶Ö¶P·È·>¸À¸2¹¤¹$º–º »†»þ»t¼ä¼X½Ò½F¾º¾"¿”¿ À~ÀðÀhÁÞÁPÂЬÃ$Ä>àÄÅŒÅÆvÆìÆ`ÇÎÇ@ȸÈ*ÉœÉÊ~ÊôÊnËæË\ÌØÌRÍÈÍLÎ0ϬϾÎ,ЬРјÑÒŒÒÓvÓìÓhÔÞÔTÕÎÕ@Ö°Ö×Œ×ØrØäØVÙÊÙ8ÚªÚÛŽÛþÛpÜæÜTÝÎÝHÞ¶Þ*ߘßàzàðà\áÎá8â¦âãŽã`äÖäLåøãÄå6æ¨æç€çôçfèÚèFé¶é$ê”ê ë~ëôëdìÖìLí¶í"î”î ïxïäïXðÊð>ñ®ñòŒòþònóÞóTôÈô<õ®õöö÷Š÷ø~øòødùØùLú¼ú*ûšûü„üøülýäýZþÐþHÿºÿ.š „öpàZÊ4¤€ð\Ø@¬ˆút î b Ô < ¤  Œ ü l Ü VÄ.¢‚úpæXÄ0 ŠþlØF¸(š„úlÞNÀ>º6¦„îVÀ,” l Ú N!¼!$"”"#r#Ú#N$Â$,%š%&x&â&P'º'*(”(ö(`)Ê)2* *+€+ð+f,Ö,F-¶-$.”./~/î/^0Ì081 12x2ê2`3Î3B4°45„5ò5`6Ú6R7Î7J8À849¨9$:¢: ;˜;<„<ì<X=Ê=<>®> ?–?@r@ä@LAÆA.B˜BC~CTD¸D"EŠEøEbFÈF4GžG HpHÜHFI¶I"JˆJôJ^KÊK0LœLMvMòCâMJN²NOˆOöOdPÔP>QR‚RøRlSäSZTÔTPUÂU6V®V(W WXšX Y„YúYtZîZZ[Ê[:\¬\]Œ]^t^æ^^_Ô_H`²`$a–ab|bèbXcÎc>d®d"e–efŠfg€gògdhÖhJiÄi>j¸j4k¬k&l lmšmn˜no–opœpq¢q&r¦r&s¤s*t°t0u®u.v°v,w°w2x´x8y¼yϨÏЂÐòÐjÑàÑVÒÊÒ6Ó¢ÓÔ‚ÔþÔzÕìÕ^ÖØÖNׯ×6بØ"Ù˜ÙÚ~ÚêÚ^ÛØÛTÜÊÜ:ݪÝÞŽÞþÞlßàß\àØàTáÆá:â²â,ãžãäˆäåtåîåhæâæNçÄç4è èé‚éôénêèê`ëØëFì²ìíŽíüínîâîNïÆï@ð¾ð8ñ°ñòŠòópóÞóLôºô(õ˜õ ö|öòöh÷Þ÷VøÌø>ù´ù$ú–úûvûèû`üØüPýÆý@þºþ.ÿœÿ ~ ê \ Ì D ¼ 2 ¬ " ” þ j Ø H ¸ 2 ¤   ü l Ú R Æ < ¬ š  ”  † ô d â ^ Ê 4    ˆ  ~ ö p è f Þ \ Ö T Ö H º 8 ° ( ž    € ú r ì b Ú V Ò D ¶ *! ˜! " ˆ" ö" j# æ# Z$ Î$ D% ¸% && ˜& ' z' î' b( Ö( J) ¸) .* š* + p+ ì+ h, ä, Z- Ô- N. Æ. >/ ²/ (0 ¢0 1 š1 2 2 3 „3 4 r4 è4 ^5 Ê5 86 ¦6 7 ˆ7 ô7 d8 Ú8 L9 ¼9 $: ˜: ; r; Ü; D< ²< 0= ¤= > ‚> ð> ^? Ø? P@ Ì@ FA ÄA @B °B $C C D tD ìD ^E ÎE BF °F *G žG H €H úH tI èI \J ÂJ 0K žK L †L øL `M ÐM @N ºN 6O ²O .P ®P "Q œQ R œR S ‚S îS ^T ÊT (Ž ”Ž  r Þ N Æ 6‘ ¨‘ ’ Œ’ þ’ v“ è“ Z” Δ D• ¶• "– ”– — p— â— R˜ Ƙ :™ ª™ š Šš úš d› Л <œ ®œ  Ž ž tž àž PŸ ÀŸ 0  ¡ ¦  ô¡ †¡ f¢ F£ Ö¢ º£ *¤ 𤠥 z¥ è¥ X¦ Ò¦ D§ ´§ ¨ ¨ © p© â© Pª ¾ª .« ž« ¬ €¬ î¬ ^­ Ò­ D® ¶® (¯ ”¯ ° l° Ú° D± ²± $² –² ³ p³ س H´ ¸´ ,µ žµ ¶ Œ¶ ü¶ p· æ· R¸ ¾¸ 4¹ ª¹ º šº » €» ì» `¼ μ @½ ¼½ ,¾ –¾ ¿ p¿ Þ¿ PÀ ÀÀ ,Á œÁ  „ ô hà Úà DÄ ²Ä $Å üÅ ”Å fÆ ÔÆ ªÇ <Ç È ŠÈ öÈ fÉ ØÉ DÊ °Ê Ë Ë pÌ þË âÌ NÍ ÀÍ ,Î šÎ Ï vÏ æÏ TÐ ÄÐ 0Ñ œÑ Ò rÒ èÒ \Ó ÒÓ HÔ ¾Ô 4Õ ªÕ Ö ŒÖ × t× ä× RØ ÀØ 2Ù ¢Ù Ú ŠÚ üÚ lÛ ÞÛ VÜ ÌÜ :Ý ¬Ý Þ ˆÞ öÞ Üß jß Tà Àà 2á žá â ‚â òâ dã Úã Hä Àä 2å ¦å æ Žæ úæ lç Úç Hè ºè *é žé ê ‚ê ðê bë Òë <ì ¨ì í †í öí fî Úî Lï ¸ï (ð ˜ð ñ îñ ~ñ Ìò ^ò >ó ô ®ó ’ô õ rõ àõ Rö Àö 0÷ ª÷ ø Œø øø hù Úù Hú ºú (û –û ü vü èü Xý Æý 6þ ªþ ÿ Žÿ l Ø D ²  Š ü n Ü H °    v ð ^ Ò B ¶ , ˜  ~ ø n ä ^ Ø N È B ®  Ž ü n ê Z Ä 2 ž  ~ î Z Ê > ² " –  r à R *  ”  Ø j F ¸ $ ”  r Þ N ¾ ž ,  | î Z! È! 4" ¤" # ‚# ò# ^$ Ê$ 6%  % & €& ø& h' Ü' J( ,) ¼( œ) * ~* î* Z+ Ì+ 8, ¬, - ¢- . ~. æ. R/ ¸/ 0 †0 ò0 b1 Ô1 J2 ¶2 3 ˆ3 ô3 ^4 È4 45  5 6 t6 Ü6 J7 ´7 8 †8 ð8 \9 Ê9 4: ž: ; r; Þ; N< Â< *= –= ü= b> Ì> 2? š? @ l@ Ö@ ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkmlnopqrstuvwxyz{|}~€‚ƒ…„†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¢¡£¤¥¦§¨«©ª¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÊÉËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-.4/012356789:;<=C>?@ABDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆŠ‰‹ŒŽ‘’“”–•—˜™š›œžŸ ¡¢£¤¥¦§¯¨©ª«¬­®°±²³´µ·¶¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÕÐÑÒÓÔÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:=;<>?@ABCDEFGHIJKLMNOPQRSVTUWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚†ƒ„…‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[s\]^_`abcdefghijklmnopqrtuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkmlnopqrstuvwxyz{|}~€‚ƒ…„†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¢¡£¤¥¦§¨«©ª¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÊÉËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-.4/012356789:;<=C>?@ABDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆŠ‰‹ŒŽ‘’“”–•—˜™š›œžŸ ¡¢£¤¥¦§¯¨©ª«¬­®°±²³´µ·¶¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÕÐÑÒÓÔÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáââ á ãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:=;<>?@ABCDEFGHIJKLMNOPQRSVTUWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚†ƒ„…‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[s\]^_`abcdefghijklmnopqrtuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì ï í î ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 6 5 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` b a d c e g f h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ ¶ µ · ¸ º ¹ » ¼ ½ ¾ ¿ À Á Â Ã Å Ä Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ñ ð ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q s r t u w v x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – ˜ — ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý ß Þ à Þ ß à á â ã ä å æ ç è é ê ë ì ï í î ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 6 5 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` b a d c e g f h i j k l m n o p q r s t u v w x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ ¶ µ · ¸ º ¹ » ¼ ½ ¾ ¿ À Á Â Ã Å Ä Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ñ ð ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ                           ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q s r t u w v x y z { | } ~  € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ž ‘ ’ “ ” • – ˜ — ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù Ú Û Ü Ý ß Þ à _ACCESS_DESCRIPTION_free_ACCESS_DESCRIPTION_it_ACCESS_DESCRIPTION_new_AES_bi_ige_encrypt_AES_cbc_encrypt_AES_cfb128_encrypt_AES_cfb1_encrypt_AES_cfb8_encrypt_AES_cfbr_encrypt_block_AES_ctr128_encrypt_AES_decrypt_AES_ecb_encrypt_AES_encrypt_AES_ige_encrypt_AES_ofb128_encrypt_AES_options_AES_set_decrypt_key_AES_set_encrypt_key_AES_unwrap_key_AES_wrap_key_ASN1_ANY_it_ASN1_BIT_STRING_asn1_meth_ASN1_BIT_STRING_free_ASN1_BIT_STRING_get_bit_ASN1_BIT_STRING_it_ASN1_BIT_STRING_name_print_ASN1_BIT_STRING_new_ASN1_BIT_STRING_num_asc_ASN1_BIT_STRING_set_ASN1_BIT_STRING_set_asc_ASN1_BIT_STRING_set_bit_ASN1_BMPSTRING_free_ASN1_BMPSTRING_it_ASN1_BMPSTRING_new_ASN1_BOOLEAN_it_ASN1_ENUMERATED_free_ASN1_ENUMERATED_get_ASN1_ENUMERATED_it_ASN1_ENUMERATED_new_ASN1_ENUMERATED_set_ASN1_ENUMERATED_to_BN_ASN1_FBOOLEAN_it_ASN1_GENERALIZEDTIME_check_ASN1_GENERALIZEDTIME_free_ASN1_GENERALIZEDTIME_it_ASN1_GENERALIZEDTIME_new_ASN1_GENERALIZEDTIME_print_ASN1_GENERALIZEDTIME_set_ASN1_GENERALIZEDTIME_set_string_ASN1_GENERALSTRING_free_ASN1_GENERALSTRING_it_ASN1_GENERALSTRING_new_ASN1_HEADER_free_ASN1_HEADER_new_ASN1_IA5STRING_asn1_meth_ASN1_IA5STRING_free_ASN1_IA5STRING_it_ASN1_IA5STRING_new_ASN1_INTEGER_cmp_ASN1_INTEGER_dup_ASN1_INTEGER_free_ASN1_INTEGER_get_ASN1_INTEGER_it_ASN1_INTEGER_new_ASN1_INTEGER_set_ASN1_INTEGER_to_BN_ASN1_NULL_free_ASN1_NULL_it_ASN1_NULL_new_ASN1_OBJECT_create_ASN1_OBJECT_free_ASN1_OBJECT_it_ASN1_OBJECT_new_ASN1_OCTET_STRING_NDEF_it_ASN1_OCTET_STRING_cmp_ASN1_OCTET_STRING_dup_ASN1_OCTET_STRING_free_ASN1_OCTET_STRING_it_ASN1_OCTET_STRING_new_ASN1_OCTET_STRING_set_ASN1_PRINTABLESTRING_free_ASN1_PRINTABLESTRING_it_ASN1_PRINTABLESTRING_new_ASN1_PRINTABLE_free_ASN1_PRINTABLE_it_ASN1_PRINTABLE_new_ASN1_PRINTABLE_type_ASN1_SEQUENCE_it_ASN1_STRING_TABLE_add_ASN1_STRING_TABLE_cleanup_ASN1_STRING_TABLE_get_ASN1_STRING_cmp_ASN1_STRING_data_ASN1_STRING_dup_ASN1_STRING_encode_ASN1_STRING_free_ASN1_STRING_get_default_mask_ASN1_STRING_length_ASN1_STRING_length_set_ASN1_STRING_new_ASN1_STRING_print_ASN1_STRING_print_ex_ASN1_STRING_print_ex_fp_ASN1_STRING_set_ASN1_STRING_set0_ASN1_STRING_set_by_NID_ASN1_STRING_set_default_mask_ASN1_STRING_set_default_mask_asc_ASN1_STRING_to_UTF8_ASN1_STRING_type_ASN1_STRING_type_new_ASN1_T61STRING_free_ASN1_T61STRING_it_ASN1_T61STRING_new_ASN1_TBOOLEAN_it_ASN1_TIME_check_ASN1_TIME_free_ASN1_TIME_it_ASN1_TIME_new_ASN1_TIME_print_ASN1_TIME_set_ASN1_TIME_to_generalizedtime_ASN1_TYPE_free_ASN1_TYPE_get_ASN1_TYPE_get_int_octetstring_ASN1_TYPE_get_octetstring_ASN1_TYPE_new_ASN1_TYPE_set_ASN1_TYPE_set1_ASN1_TYPE_set_int_octetstring_ASN1_TYPE_set_octetstring_ASN1_UNIVERSALSTRING_free_ASN1_UNIVERSALSTRING_it_ASN1_UNIVERSALSTRING_new_ASN1_UNIVERSALSTRING_to_string_ASN1_UTCTIME_check_ASN1_UTCTIME_cmp_time_t_ASN1_UTCTIME_free_ASN1_UTCTIME_it_ASN1_UTCTIME_new_ASN1_UTCTIME_print_ASN1_UTCTIME_set_ASN1_UTCTIME_set_string_ASN1_UTF8STRING_free_ASN1_UTF8STRING_it_ASN1_UTF8STRING_new_ASN1_VISIBLESTRING_free_ASN1_VISIBLESTRING_it_ASN1_VISIBLESTRING_new_ASN1_add_oid_module_ASN1_check_infinite_end_ASN1_const_check_infinite_end_ASN1_d2i_bio_ASN1_d2i_fp_ASN1_digest_ASN1_dup_ASN1_generate_nconf_ASN1_generate_v3_ASN1_get_object_ASN1_i2d_bio_ASN1_i2d_fp_ASN1_item_d2i_ASN1_item_d2i_bio_ASN1_item_d2i_fp_ASN1_item_digest_ASN1_item_dup_ASN1_item_ex_d2i_ASN1_item_ex_free_ASN1_item_ex_i2d_ASN1_item_ex_new_ASN1_item_free_ASN1_item_i2d_ASN1_item_i2d_bio_ASN1_item_i2d_fp_ASN1_item_ndef_i2d_ASN1_item_new_ASN1_item_pack_ASN1_item_sign_ASN1_item_unpack_ASN1_item_verify_ASN1_mbstring_copy_ASN1_mbstring_ncopy_ASN1_object_size_ASN1_pack_string_ASN1_parse_ASN1_parse_dump_ASN1_primitive_free_ASN1_primitive_new_ASN1_put_eoc_ASN1_put_object_ASN1_seq_pack_ASN1_seq_unpack_ASN1_sign_ASN1_tag2bit_ASN1_tag2str_ASN1_template_d2i_ASN1_template_free_ASN1_template_i2d_ASN1_template_new_ASN1_unpack_string_ASN1_verify_AUTHORITY_INFO_ACCESS_free_AUTHORITY_INFO_ACCESS_it_AUTHORITY_INFO_ACCESS_new_AUTHORITY_KEYID_free_AUTHORITY_KEYID_it_AUTHORITY_KEYID_new_BASIC_CONSTRAINTS_free_BASIC_CONSTRAINTS_it_BASIC_CONSTRAINTS_new_BF_cbc_encrypt_BF_cfb64_encrypt_BF_decrypt_BF_ecb_encrypt_BF_encrypt_BF_ofb64_encrypt_BF_options_BF_set_key_BIGNUM_it_BIO_accept_BIO_callback_ctrl_BIO_clear_flags_BIO_copy_next_retry_BIO_ctrl_BIO_ctrl_get_read_request_BIO_ctrl_get_write_guarantee_BIO_ctrl_pending_BIO_ctrl_reset_read_request_BIO_ctrl_wpending_BIO_debug_callback_BIO_dgram_non_fatal_error_BIO_dump_BIO_dump_cb_BIO_dump_fp_BIO_dump_indent_BIO_dump_indent_cb_BIO_dump_indent_fp_BIO_dup_chain_BIO_f_base64_BIO_f_buffer_BIO_f_cipher_BIO_f_md_BIO_f_nbio_test_BIO_f_null_BIO_f_reliable_BIO_fd_non_fatal_error_BIO_fd_should_retry_BIO_find_type_BIO_free_BIO_free_all_BIO_get_accept_socket_BIO_get_callback_BIO_get_callback_arg_BIO_get_ex_data_BIO_get_ex_new_index_BIO_get_host_ip_BIO_get_port_BIO_get_retry_BIO_BIO_get_retry_reason_BIO_gethostbyname_BIO_gets_BIO_indent_BIO_int_ctrl_BIO_method_name_BIO_method_type_BIO_new_BIO_new_accept_BIO_new_bio_pair_BIO_new_connect_BIO_new_dgram_BIO_new_fd_BIO_new_file_BIO_new_fp_BIO_new_mem_buf_BIO_new_socket_BIO_next_BIO_nread_BIO_nread0_BIO_number_read_BIO_number_written_BIO_nwrite_BIO_nwrite0_BIO_pop_BIO_printf_BIO_ptr_ctrl_BIO_push_BIO_puts_BIO_read_BIO_s_accept_BIO_s_bio_BIO_s_connect_BIO_s_datagram_BIO_s_fd_BIO_s_file_BIO_s_mem_BIO_s_null_BIO_s_socket_BIO_set_BIO_set_callback_BIO_set_callback_arg_BIO_set_cipher_BIO_set_ex_data_BIO_set_flags_BIO_set_tcp_ndelay_BIO_snprintf_BIO_sock_cleanup_BIO_sock_error_BIO_sock_init_BIO_sock_non_fatal_error_BIO_sock_should_retry_BIO_socket_ioctl_BIO_socket_nbio_BIO_test_flags_BIO_vfree_BIO_vprintf_BIO_vsnprintf_BIO_write_BN_BLINDING_convert_BN_BLINDING_convert_ex_BN_BLINDING_create_param_BN_BLINDING_free_BN_BLINDING_get_flags_BN_BLINDING_get_thread_id_BN_BLINDING_invert_BN_BLINDING_invert_ex_BN_BLINDING_new_BN_BLINDING_set_flags_BN_BLINDING_set_thread_id_BN_BLINDING_update_BN_CTX_end_BN_CTX_free_BN_CTX_get_BN_CTX_init_BN_CTX_new_BN_CTX_start_BN_GENCB_call_BN_GF2m_add_BN_GF2m_arr2poly_BN_GF2m_mod_BN_GF2m_mod_arr_BN_GF2m_mod_div_BN_GF2m_mod_div_arr_BN_GF2m_mod_exp_BN_GF2m_mod_exp_arr_BN_GF2m_mod_inv_BN_GF2m_mod_inv_arr_BN_GF2m_mod_mul_BN_GF2m_mod_mul_arr_BN_GF2m_mod_solve_quad_BN_GF2m_mod_solve_quad_arr_BN_GF2m_mod_sqr_BN_GF2m_mod_sqr_arr_BN_GF2m_mod_sqrt_BN_GF2m_mod_sqrt_arr_BN_GF2m_poly2arr_BN_MONT_CTX_copy_BN_MONT_CTX_free_BN_MONT_CTX_init_BN_MONT_CTX_new_BN_MONT_CTX_set_BN_MONT_CTX_set_locked_BN_RECP_CTX_free_BN_RECP_CTX_init_BN_RECP_CTX_new_BN_RECP_CTX_set_BN_X931_derive_prime_ex_BN_X931_generate_Xpq_BN_X931_generate_prime_ex_BN_add_BN_add_word_BN_bin2bn_BN_bn2bin_BN_bn2dec_BN_bn2hex_BN_bn2mpi_BN_bntest_rand_BN_clear_BN_clear_bit_BN_clear_free_BN_cmp_BN_copy_BN_dec2bn_BN_div_BN_div_recp_BN_div_word_BN_dup_BN_exp_BN_free_BN_from_montgomery_BN_gcd_BN_generate_prime_BN_generate_prime_ex_BN_get0_nist_prime_192_BN_get0_nist_prime_224_BN_get0_nist_prime_256_BN_get0_nist_prime_384_BN_get0_nist_prime_521_BN_get_params_BN_get_word_BN_hex2bn_BN_init_BN_is_bit_set_BN_is_prime_BN_is_prime_ex_BN_is_prime_fasttest_BN_is_prime_fasttest_ex_BN_kronecker_BN_lshift_BN_lshift1_BN_mask_bits_BN_mod_add_BN_mod_add_quick_BN_mod_exp_BN_mod_exp2_mont_BN_mod_exp_mont_BN_mod_exp_mont_consttime_BN_mod_exp_mont_word_BN_mod_exp_recp_BN_mod_exp_simple_BN_mod_inverse_BN_mod_lshift_BN_mod_lshift1_BN_mod_lshift1_quick_BN_mod_lshift_quick_BN_mod_mul_BN_mod_mul_montgomery_BN_mod_mul_reciprocal_BN_mod_sqr_BN_mod_sqrt_BN_mod_sub_BN_mod_sub_quick_BN_mod_word_BN_mpi2bn_BN_mul_BN_mul_word_BN_new_BN_nist_mod_192_BN_nist_mod_224_BN_nist_mod_256_BN_nist_mod_384_BN_nist_mod_521_BN_nnmod_BN_num_bits_BN_num_bits_word_BN_options_BN_print_BN_print_fp_BN_pseudo_rand_BN_pseudo_rand_range_BN_rand_BN_rand_range_BN_reciprocal_BN_rshift_BN_rshift1_BN_set_bit_BN_set_negative_BN_set_params_BN_set_word_BN_sqr_BN_sub_BN_sub_word_BN_swap_BN_to_ASN1_ENUMERATED_BN_to_ASN1_INTEGER_BN_uadd_BN_ucmp_BN_usub_BN_value_one_BUF_MEM_free_BUF_MEM_grow_BUF_MEM_grow_clean_BUF_MEM_new_BUF_memdup_BUF_strdup_BUF_strlcat_BUF_strlcpy_BUF_strndup_CAST_cbc_encrypt_CAST_cfb64_encrypt_CAST_decrypt_CAST_ecb_encrypt_CAST_encrypt_CAST_ofb64_encrypt_CAST_set_key_CBIGNUM_it_CERTIFICATEPOLICIES_free_CERTIFICATEPOLICIES_it_CERTIFICATEPOLICIES_new_COMP_CTX_free_COMP_CTX_new_COMP_compress_block_COMP_expand_block_COMP_rle_COMP_zlib_COMP_zlib_cleanup_CONF_dump_bio_CONF_dump_fp_CONF_free_CONF_get1_default_config_file_CONF_get_number_CONF_get_section_CONF_get_string_CONF_imodule_get_flags_CONF_imodule_get_module_CONF_imodule_get_name_CONF_imodule_get_usr_data_CONF_imodule_get_value_CONF_imodule_set_flags_CONF_imodule_set_usr_data_CONF_load_CONF_load_bio_CONF_load_fp_CONF_module_add_CONF_module_get_usr_data_CONF_module_set_usr_data_CONF_modules_finish_CONF_modules_free_CONF_modules_load_CONF_modules_load_file_CONF_modules_unload_CONF_parse_list_CONF_set_default_method_CONF_set_nconf_CRL_DIST_POINTS_free_CRL_DIST_POINTS_it_CRL_DIST_POINTS_new_CRYPTO_add_lock_CRYPTO_cleanup_all_ex_data_CRYPTO_dbg_free_CRYPTO_dbg_get_options_CRYPTO_dbg_malloc_CRYPTO_dbg_pop_info_CRYPTO_dbg_push_info_CRYPTO_dbg_realloc_CRYPTO_dbg_remove_all_info_CRYPTO_dbg_set_options_CRYPTO_destroy_dynlockid_CRYPTO_dup_ex_data_CRYPTO_ex_data_new_class_CRYPTO_free_CRYPTO_free_ex_data_CRYPTO_free_locked_CRYPTO_get_add_lock_callback_CRYPTO_get_dynlock_create_callback_CRYPTO_get_dynlock_destroy_callback_CRYPTO_get_dynlock_lock_callback_CRYPTO_get_dynlock_value_CRYPTO_get_ex_data_CRYPTO_get_ex_data_implementation_CRYPTO_get_ex_new_index_CRYPTO_get_id_callback_CRYPTO_get_lock_name_CRYPTO_get_locked_mem_ex_functions_CRYPTO_get_locked_mem_functions_CRYPTO_get_locking_callback_CRYPTO_get_mem_debug_functions_CRYPTO_get_mem_debug_options_CRYPTO_get_mem_ex_functions_CRYPTO_get_mem_functions_CRYPTO_get_new_dynlockid_CRYPTO_get_new_lockid_CRYPTO_is_mem_check_on_CRYPTO_lock_CRYPTO_malloc_CRYPTO_malloc_debug_init_CRYPTO_malloc_locked_CRYPTO_mem_ctrl_CRYPTO_mem_leaks_CRYPTO_mem_leaks_cb_CRYPTO_mem_leaks_fp_CRYPTO_new_ex_data_CRYPTO_num_locks_CRYPTO_pop_info_CRYPTO_push_info__CRYPTO_realloc_CRYPTO_realloc_clean_CRYPTO_remalloc_CRYPTO_remove_all_info_CRYPTO_set_add_lock_callback_CRYPTO_set_dynlock_create_callback_CRYPTO_set_dynlock_destroy_callback_CRYPTO_set_dynlock_lock_callback_CRYPTO_set_ex_data_CRYPTO_set_ex_data_implementation_CRYPTO_set_id_callback_CRYPTO_set_locked_mem_ex_functions_CRYPTO_set_locked_mem_functions_CRYPTO_set_locking_callback_CRYPTO_set_mem_debug_functions_CRYPTO_set_mem_debug_options_CRYPTO_set_mem_ex_functions_CRYPTO_set_mem_functions_CRYPTO_set_mem_info_functions_CRYPTO_strdup_CRYPTO_thread_id_DES_cbc_cksum_DES_cbc_encrypt_DES_cfb64_encrypt_DES_cfb_encrypt_DES_check_key_parity_DES_crypt_DES_decrypt3_DES_ecb3_encrypt_DES_ecb_encrypt_DES_ede3_cbc_encrypt_DES_ede3_cbcm_encrypt_DES_ede3_cfb64_encrypt_DES_ede3_cfb_encrypt_DES_ede3_ofb64_encrypt_DES_enc_read_DES_enc_write_DES_encrypt1_DES_encrypt2_DES_encrypt3_DES_fcrypt_DES_is_weak_key_DES_key_sched_DES_ncbc_encrypt_DES_ofb64_encrypt_DES_ofb_encrypt_DES_options_DES_pcbc_encrypt_DES_quad_cksum_DES_random_key_DES_read_2passwords_DES_read_password_DES_set_key_DES_set_key_checked_DES_set_key_unchecked_DES_set_odd_parity_DES_string_to_2keys_DES_string_to_key_DES_xcbc_encrypt_DH_OpenSSL_DH_check_DH_check_pub_key_DH_compute_key_DH_free_DH_generate_key_DH_generate_parameters_DH_generate_parameters_ex_DH_get_default_method_DH_get_ex_data_DH_get_ex_new_index_DH_new_DH_new_method_DH_set_default_method_DH_set_ex_data_DH_set_method_DH_size_DH_up_ref_DHparams_print_DHparams_print_fp_DIRECTORYSTRING_free_DIRECTORYSTRING_it_DIRECTORYSTRING_new_DISPLAYTEXT_free_DISPLAYTEXT_it_DISPLAYTEXT_new_DIST_POINT_NAME_free_DIST_POINT_NAME_it_DIST_POINT_NAME_new_DIST_POINT_free_DIST_POINT_it_DIST_POINT_new_DSA_OpenSSL_DSA_SIG_free_DSA_SIG_new_DSA_do_sign_DSA_do_verify_DSA_dup_DH_DSA_free_DSA_generate_key_DSA_generate_parameters_DSA_generate_parameters_ex_DSA_get_default_method_DSA_get_ex_data_DSA_get_ex_new_index_DSA_new_DSA_new_method_DSA_print_DSA_print_fp_DSA_set_default_method_DSA_set_ex_data_DSA_set_method_DSA_sign_DSA_sign_setup_DSA_size_DSA_up_ref_DSA_verify_DSAparams_print_DSAparams_print_fp_DSO_METHOD_dl_DSO_METHOD_dlfcn_DSO_METHOD_null_DSO_METHOD_openssl_DSO_METHOD_vms_DSO_METHOD_win32_DSO_bind_func_DSO_bind_var_DSO_convert_filename_DSO_ctrl_DSO_flags_DSO_free_DSO_get_default_method_DSO_get_filename_DSO_get_loaded_filename_DSO_get_method_DSO_load_DSO_merge_DSO_new_DSO_new_method_DSO_set_default_method_DSO_set_filename_DSO_set_method_DSO_set_name_converter_DSO_up_ref_ECDH_OpenSSL_ECDH_compute_key_ECDH_get_default_method_ECDH_get_ex_data_ECDH_get_ex_new_index_ECDH_set_default_method_ECDH_set_ex_data_ECDH_set_method_ECDSA_OpenSSL_ECDSA_SIG_free_ECDSA_SIG_new_ECDSA_do_sign_ECDSA_do_sign_ex_ECDSA_do_verify_ECDSA_get_default_method_ECDSA_get_ex_data_ECDSA_get_ex_new_index_ECDSA_set_default_method_ECDSA_set_ex_data_ECDSA_set_method_ECDSA_sign_ECDSA_sign_ex_ECDSA_sign_setup_ECDSA_size_ECDSA_verify_ECPKParameters_print_ECPKParameters_print_fp_ECParameters_print_ECParameters_print_fp_EC_GF2m_simple_method_EC_GFp_mont_method_EC_GFp_nist_method_EC_GFp_simple_method_EC_GROUP_check_EC_GROUP_check_discriminant_EC_GROUP_clear_free_EC_GROUP_cmp_EC_GROUP_copy_EC_GROUP_dup_EC_GROUP_free_EC_GROUP_get0_generator_EC_GROUP_get0_seed_EC_GROUP_get_asn1_flag_EC_GROUP_get_basis_type_EC_GROUP_get_cofactor_EC_GROUP_get_curve_GF2m_EC_GROUP_get_curve_GFp_EC_GROUP_get_curve_name_EC_GROUP_get_degree_EC_GROUP_get_order_EC_GROUP_get_pentanomial_basis_EC_GROUP_get_point_conversion_form_EC_GROUP_get_seed_len_EC_GROUP_get_trinomial_basis_EC_GROUP_have_precompute_mult_EC_GROUP_method_of_EC_GROUP_new_EC_GROUP_new_by_curve_name_EC_GROUP_new_curve_GF2m_EC_GROUP_new_curve_GFp_EC_GROUP_precompute_mult_EC_GROUP_set_asn1_flag_EC_GROUP_set_curve_GF2m_EC_GROUP_set_curve_GFp_EC_GROUP_set_curve_name_EC_GROUP_set_generator_EC_GROUP_set_point_conversion_form_EC_GROUP_set_seed_EC_KEY_check_key_EC_KEY_copy_EC_KEY_dup_EC_KEY_free_EC_KEY_generate_key_EC_KEY_get0_group_EC_KEY_get0_private_key_EC_KEY_get0_public_key_EC_KEY_get_conv_form_EC_KEY_get_enc_flags_EC_KEY_get_key_method_data_EC_KEY_insert_key_method_data_EC_KEY_new_EC_KEY_new_by_curve_name_EC_KEY_precompute_mult_EC_KEY_print_EC_KEY_print_fp_EC_KEY_set_asn1_flag_EC_KEY_set_conv_form_EC_KEY_set_enc_flags_EC_KEY_set_group_EC_KEY_set_private_key_EC_KEY_set_public_key_EC_KEY_up_ref_EC_METHOD_get_field_type_EC_POINT_add_EC_POINT_bn2point_EC_POINT_clear_free_EC_POINT_cmp_EC_POINT_copy_EC_POINT_dbl_EC_POINT_dup_EC_POINT_free_EC_POINT_get_Jprojective_coordinates_GFp_EC_POINT_get_affine_coordinates_GF2m_EC_POINT_get_affine_coordinates_GFp_EC_POINT_hex2point_EC_POINT_invert_EC_POINT_is_at_infinity_EC_POINT_is_on_curve_EC_POINT_make_affine_EC_POINT_method_of_EC_POINT_mul_EC_POINT_new_EC_POINT_oct2point_EC_POINT_point2bn_EC_POINT_point2hex_EC_POINT_point2oct_EC_POINT_set_Jprojective_coordinates_GFp_EC_POINT_set_affine_coordinates_GF2m_EC_POINT_set_affine_coordinates_GFp_EC_POINT_set_compressed_coordinates_GF2m_EC_POINT_set_compressed_coordinates_GFp_EC_POINT_set_to_infinity_EC_POINTs_make_affine_EC_POINTs_mul_EC_get_builtin_curves_EDIPARTYNAME_free_EDIPARTYNAME_it_EDIPARTYNAME_new_ENGINE_add_ENGINE_add_conf_module_ENGINE_by_id_ENGINE_cleanup_ENGINE_cmd_is_executable_ENGINE_ctrl_ENGINE_ctrl_cmd_ENGINE_ctrl_cmd_string_ENGINE_finish_ENGINE_free_ENGINE_get_DH_ENGINE_get_DSA_ENGINE_get_ECDH_ENGINE_get_ECDSA_ENGINE_get_RAND_ENGINE_get_RSA_ENGINE_get_STORE_ENGINE_get_cipher_ENGINE_get_cipher_engine_ENGINE_get_ciphers_ENGINE_get_cmd_defns_ENGINE_get_ctrl_function_ENGINE_get_default_DH_ENGINE_get_default_DSA_ENGINE_get_default_ECDH_ENGINE_get_default_ECDSA_ENGINE_get_default_RAND_ENGINE_get_default_RSA_ENGINE_get_destroy_function_ENGINE_get_digest_ENGINE_get_digest_engine_ENGINE_get_digests_ENGINE_get_ex_data_ENGINE_get_ex_new_index_ENGINE_get_finish_function_ENGINE_get_first_ENGINE_get_flags_ENGINE_get_id_ENGINE_get_init_function_ENGINE_get_last_ENGINE_get_load_privkey_function_ENGINE_get_load_pubkey_function_ENGINE_get_name_ENGINE_get_next_ENGINE_get_prev_ENGINE_get_ssl_client_cert_function_ENGINE_get_static_state_ENGINE_get_table_flags_ENGINE_init_ENGINE_load_4758cca_ENGINE_load_aep_ENGINE_load_atalla_ENGINE_load_builtin_engines_ENGINE_load_chil_ENGINE_load_cryptodev_ENGINE_load_cswift_ENGINE_load_dynamic_ENGINE_load_nuron_ENGINE_load_openssl_ENGINE_load_padlock_ENGINE_load_private_key_ENGINE_load_public_key_ENGINE_load_ssl_client_cert_ENGINE_load_sureware_ENGINE_load_ubsec_ENGINE_new_ENGINE_register_DH_ENGINE_register_DSA_ENGINE_register_ECDH_ENGINE_register_ECDSA_ENGINE_register_RAND_ENGINE_register_RSA_ENGINE_register_STORE_ENGINE_register_all_DH_ENGINE_register_all_DSA_ENGINE_register_all_ECDH_ENGINE_register_all_ECDSA_ENGINE_register_all_RAND_ENGINE_register_all_RSA_ENGINE_register_all_STORE_ENGINE_register_all_ciphers_ENGINE_register_all_complete_ENGINE_register_all_digests_ENGINE_register_ciphers_ENGINE_register_complete_ENGINE_register_digests_ENGINE_remove_ENGINE_set_DH_ENGINE_set_DSA_ENGINE_set_ECDH_ENGINE_set_ECDSA_ENGINE_set_RAND_ENGINE_set_RSA_ENGINE_set_STORE_ENGINE_set_ciphers_ENGINE_set_cmd_defns_ENGINE_set_ctrl_function_ENGINE_set_default_ENGINE_set_default_DH_ENGINE_set_default_DSA_ENGINE_set_default_ECDH_ENGINE_set_default_ECDSA_ENGINE_set_default_RAND_ENGINE_set_default_RSA_ENGINE_set_default_ciphers_ENGINE_set_default_digests_ENGINE_set_default_string_ENGINE_set_destroy_function_ENGINE_set_digests_ENGINE_set_ex_data_ENGINE_set_finish_function_ENGINE_set_flags_ENGINE_set_id_ENGINE_set_init_function_ENGINE_set_load_privkey_function_ENGINE_set_load_pubkey_function_ENGINE_set_load_ssl_client_cert_function_ENGINE_set_name_ENGINE_set_table_flags_ENGINE_unregister_DH_ENGINE_unregister_DSA_ENGINE_unregister_ECDH_ENGINE_unregister_ECDSA_ENGINE_unregister_RAND_ENGINE_unregister_RSA_ENGINE_unregister_STORE_ENGINE_unregister_ciphers_ENGINE_unregister_digests_ENGINE_up_ref_ERR_add_error_data_ERR_clear_error_ERR_error_string_ERR_error_string_n_ERR_free_strings_ERR_func_error_string_ERR_get_err_state_table_ERR_get_error_ERR_get_error_line_ERR_get_error_line_data_ERR_get_implementation_ERR_get_next_error_library_ERR_get_state_ERR_get_string_table_ERR_lib_error_string_ERR_load_ASN1_strings_ERR_load_BIO_strings_ERR_load_BN_strings_ERR_load_BUF_strings_ERR_load_COMP_strings_ERR_load_CONF_strings_ERR_load_CRYPTO_strings_ERR_load_DH_strings_ERR_load_DSA_strings_ERR_load_DSO_strings_ERR_load_ECDH_strings_ERR_load_ECDSA_strings_ERR_load_EC_strings_ERR_load_ENGINE_strings_ERR_load_ERR_strings_ERR_load_EVP_strings_ERR_load_OBJ_strings_ERR_load_OCSP_strings_ERR_load_PEM_strings_ERR_load_PKCS12_strings_ERR_load_PKCS7_strings_ERR_load_RAND_strings_ERR_load_RSA_strings_ERR_load_STORE_strings_ERR_load_UI_strings_ERR_load_X509V3_strings_ERR_load_X509_strings_ERR_load_crypto_strings_ERR_load_strings_ERR_peek_error_ERR_peek_error_line_ERR_peek_error_line_data_ERR_peek_last_error_ERR_peek_last_error_line_ERR_peek_last_error_line_data_ERR_pop_to_mark_ERR_print_errors_ERR_print_errors_cb_ERR_print_errors_fp_ERR_put_error_ERR_reason_error_string_ERR_release_err_state_table_ERR_remove_state_ERR_set_error_data_ERR_set_implementation_ERR_set_mark_ERR_unload_strings_EVP_BytesToKey_EVP_CIPHER_CTX_block_size_EVP_CIPHER_CTX_cipher_EVP_CIPHER_CTX_cleanup_EVP_CIPHER_CTX_clear_flags_EVP_CIPHER_CTX_ctrl_EVP_CIPHER_CTX_flags_EVP_CIPHER_CTX_free_EVP_CIPHER_CTX_get_app_data_EVP_CIPHER_CTX_init_EVP_CIPHER_CTX_iv_length_EVP_CIPHER_CTX_key_length_EVP_CIPHER_CTX_new_EVP_CIPHER_CTX_nid_EVP_CIPHER_CTX_rand_key_EVP_CIPHER_CTX_set_app_data_EVP_CIPHER_CTX_set_flags_EVP_CIPHER_CTX_set_key_length_EVP_CIPHER_CTX_set_padding_EVP_CIPHER_CTX_test_flags_EVP_CIPHER_asn1_to_param_EVP_CIPHER_block_size_EVP_CIPHER_flags_EVP_CIPHER_get_asn1_iv_EVP_CIPHER_iv_length_EVP_CIPHER_key_length_EVP_CIPHER_nid_EVP_CIPHER_param_to_asn1_EVP_CIPHER_set_asn1_iv_EVP_CIPHER_type_EVP_Cipher_EVP_CipherFinal_EVP_CipherFinal_ex_EVP_CipherInit_EVP_CipherInit_ex_EVP_CipherUpdate_EVP_DecodeBlock_EVP_DecodeFinal_EVP_DecodeInit_EVP_DecodeUpdate_EVP_DecryptFinal_EVP_DecryptFinal_ex_EVP_DecryptInit_EVP_DecryptInit_ex_EVP_DecryptUpdate_EVP_Digest_EVP_DigestFinal_EVP_DigestFinal_ex_EVP_DigestInit_EVP_DigestInit_ex_EVP_DigestUpdate_EVP_EncodeBlock_EVP_EncodeFinal_EVP_EncodeInit_EVP_EncodeUpdate_EVP_EncryptFinal_EVP_EncryptFinal_ex_EVP_EncryptInit_EVP_EncryptInit_ex_EVP_EncryptUpdate_EVP_MD_CTX_cleanup_EVP_MD_CTX_clear_flags_EVP_MD_CTX_copy_EVP_MD_CTX_copy_ex_EVP_MD_CTX_create_EVP_MD_CTX_destroy_EVP_MD_CTX_init_EVP_MD_CTX_md_EVP_MD_CTX_set_flags_EVP_MD_CTX_test_flags_EVP_MD_block_size_EVP_MD_pkey_type_EVP_MD_size_EVP_MD_type_EVP_OpenFinal_EVP_OpenInit_EVP_PBE_CipherInit_EVP_PBE_alg_add_EVP_PBE_cleanup_EVP_PKCS82PKEY_EVP_PKEY2PKCS8_EVP_PKEY2PKCS8_broken_EVP_PKEY_add1_attr_EVP_PKEY_add1_attr_by_NID_EVP_PKEY_add1_attr_by_OBJ_EVP_PKEY_add1_attr_by_txt_EVP_PKEY_assign_EVP_PKEY_bits_EVP_PKEY_cmp_EVP_PKEY_cmp_parameters_EVP_PKEY_copy_parameters_EVP_PKEY_decrypt_EVP_PKEY_delete_attr_EVP_PKEY_encrypt_EVP_PKEY_free_EVP_PKEY_get1_DH_EVP_PKEY_get1_DSA_EVP_PKEY_get1_EC_KEY_EVP_PKEY_get1_RSA_EVP_PKEY_get_attr_EVP_PKEY_get_attr_by_NID_EVP_PKEY_get_attr_by_OBJ_EVP_PKEY_get_attr_count_EVP_PKEY_missing_parameters_EVP_PKEY_new_EVP_PKEY_save_parameters_EVP_PKEY_set1_DH_EVP_PKEY_set1_DSA_EVP_PKEY_set1_EC_KEY_EVP_PKEY_set1_RSA_EVP_PKEY_size_EVP_PKEY_type_EVP_SealFinal_EVP_SealInit_EVP_SignFinal_EVP_VerifyFinal_EVP_add_alg_module_EVP_add_cipher_EVP_add_digest_EVP_aes_128_cbc_EVP_aes_128_cfb1_EVP_aes_128_cfb128_EVP_aes_128_cfb8_EVP_aes_128_ecb_EVP_aes_128_ofb_EVP_aes_192_cbc_EVP_aes_192_cfb1_EVP_aes_192_cfb128_EVP_aes_192_cfb8_EVP_aes_192_ecb_EVP_aes_192_ofb_EVP_aes_256_cbc_EVP_aes_256_cfb1_EVP_aes_256_cfb128_EVP_aes_256_cfb8_EVP_aes_256_ecb_EVP_aes_256_ofb_EVP_bf_cbc_EVP_bf_cfb64_EVP_bf_ecb_EVP_bf_ofb_EVP_cast5_cbc_EVP_cast5_cfb64_EVP_cast5_ecb_EVP_cast5_ofb_EVP_cleanup_EVP_des_cbc_EVP_des_cfb1_EVP_des_cfb64_EVP_des_cfb8_EVP_des_ecb_EVP_des_ede_EVP_des_ede3_EVP_des_ede3_cbc_EVP_des_ede3_cfb1_EVP_des_ede3_cfb64_EVP_des_ede3_cfb8_EVP_des_ede3_ecb_EVP_des_ede3_ofb_EVP_des_ede_cbc_EVP_des_ede_cfb64_EVP_des_ede_ecb_EVP_des_ede_ofb_EVP_des_ofb_EVP_desx_cbc_EVP_dss_EVP_dss1_EVP_ecdsa_EVP_enc_null_EVP_get_cipherbyname_EVP_get_digestbyname_EVP_get_pw_prompt_EVP_idea_cbc_EVP_idea_cfb64_EVP_idea_ecb_EVP_idea_ofb_EVP_md2_EVP_md4_EVP_md5_EVP_md_null_EVP_rc2_40_cbc_EVP_rc2_64_cbc_EVP_rc2_cbc_EVP_rc2_cfb64_EVP_rc2_ecb_EVP_rc2_ofb_EVP_rc4_EVP_rc4_40_EVP_read_pw_string_EVP_ripemd160_EVP_set_pw_prompt_EVP_sha_EVP_sha1_EVP_sha224_EVP_sha256_EVP_sha384_EVP_sha512_EXTENDED_KEY_USAGE_free_EXTENDED_KEY_USAGE_it_EXTENDED_KEY_USAGE_new_GENERAL_NAMES_free_GENERAL_NAMES_it_GENERAL_NAMES_new_GENERAL_NAME_free_GENERAL_NAME_it_GENERAL_NAME_new_GENERAL_NAME_print_GENERAL_SUBTREE_free_GENERAL_SUBTREE_it_GENERAL_SUBTREE_new_HMAC_HMAC_CTX_cleanup_HMAC_CTX_init_HMAC_CTX_set_flags_HMAC_Final_HMAC_Init_HMAC_Init_ex_HMAC_Update_KRB5_APREQBODY_free_KRB5_APREQBODY_it_KRB5_APREQBODY_new_KRB5_APREQ_free_KRB5_APREQ_it_KRB5_APREQ_new_KRB5_AUTHDATA_free_KRB5_AUTHDATA_it_KRB5_AUTHDATA_new_KRB5_AUTHENTBODY_free_KRB5_AUTHENTBODY_it_KRB5_AUTHENTBODY_new_KRB5_AUTHENT_free_KRB5_AUTHENT_it_KRB5_AUTHENT_new_KRB5_CHECKSUM_free_KRB5_CHECKSUM_it_KRB5_CHECKSUM_new_KRB5_ENCDATA_free_KRB5_ENCDATA_it_KRB5_ENCDATA_new_KRB5_ENCKEY_free_KRB5_ENCKEY_it_KRB5_ENCKEY_new_KRB5_PRINCNAME_free_KRB5_PRINCNAME_it_KRB5_PRINCNAME_new_KRB5_TICKET_free_KRB5_TICKET_it_KRB5_TICKET_new_KRB5_TKTBODY_free_KRB5_TKTBODY_it_KRB5_TKTBODY_new_LONG_it_MD2_MD2_Final_MD2_Init_MD2_Update_MD2_options_MD4_MD4_Final_MD4_Init_MD4_Transform_MD4_Update_MD5_MD5_Final_MD5_Init_MD5_Transform_MD5_Update_NAME_CONSTRAINTS_free_NAME_CONSTRAINTS_it_NAME_CONSTRAINTS_new_NCONF_WIN32_NCONF_default_NCONF_dump_bio_NCONF_dump_fp_NCONF_free_NCONF_free_data_NCONF_get_number_e_NCONF_get_section_NCONF_get_string_NCONF_load_NCONF_load_bio_NCONF_load_fp_NCONF_new_NETSCAPE_CERT_SEQUENCE_free_NETSCAPE_CERT_SEQUENCE_it_NETSCAPE_CERT_SEQUENCE_new_NETSCAPE_SPKAC_free_NETSCAPE_SPKAC_it_NETSCAPE_SPKAC_new_NETSCAPE_SPKI_b64_decode_NETSCAPE_SPKI_b64_encode_NETSCAPE_SPKI_free_NETSCAPE_SPKI_get_pubkey_NETSCAPE_SPKI_it_NETSCAPE_SPKI_new_NETSCAPE_SPKI_print_NETSCAPE_SPKI_set_pubkey_NETSCAPE_SPKI_sign_NETSCAPE_SPKI_verify_NOTICEREF_free_NOTICEREF_it_NOTICEREF_new_OBJ_NAME_add_OBJ_NAME_cleanup_OBJ_NAME_do_all_OBJ_NAME_do_all_sorted_OBJ_NAME_get_OBJ_NAME_init_OBJ_NAME_new_index_OBJ_NAME_remove_OBJ_add_object_OBJ_bsearch_OBJ_bsearch_ex_OBJ_cleanup_OBJ_cmp_OBJ_create_OBJ_create_objects_OBJ_dup_OBJ_ln2nid_OBJ_new_nid_OBJ_nid2ln_OBJ_nid2obj_OBJ_nid2sn_OBJ_obj2nid_OBJ_obj2txt_OBJ_sn2nid_OBJ_txt2nid_OBJ_txt2obj_OCSP_BASICRESP_add1_ext_i2d_OCSP_BASICRESP_add_ext_OCSP_BASICRESP_delete_ext_OCSP_BASICRESP_free_OCSP_BASICRESP_get1_ext_d2i_OCSP_BASICRESP_get_ext_OCSP_BASICRESP_get_ext_by_NID_OCSP_BASICRESP_get_ext_by_OBJ_OCSP_BASICRESP_get_ext_by_critical_OCSP_BASICRESP_get_ext_count_OCSP_BASICRESP_it_OCSP_BASICRESP_new_OCSP_CERTID_free_OCSP_CERTID_it_OCSP_CERTID_new_OCSP_CERTSTATUS_free_OCSP_CERTSTATUS_it_OCSP_CERTSTATUS_new_OCSP_CRLID_free_OCSP_CRLID_it_OCSP_CRLID_new_OCSP_ONEREQ_add1_ext_i2d_OCSP_ONEREQ_add_ext_OCSP_ONEREQ_delete_ext_OCSP_ONEREQ_free_OCSP_ONEREQ_get1_ext_d2i_OCSP_ONEREQ_get_ext_OCSP_ONEREQ_get_ext_by_NID_OCSP_ONEREQ_get_ext_by_OBJ_OCSP_ONEREQ_get_ext_by_critical_OCSP_ONEREQ_get_ext_count_OCSP_ONEREQ_it_OCSP_ONEREQ_new_OCSP_REQINFO_free_OCSP_REQINFO_it_OCSP_REQINFO_new_OCSP_REQUEST_add1_ext_i2d_OCSP_REQUEST_add_ext_OCSP_REQUEST_delete_ext_OCSP_REQUEST_free_OCSP_REQUEST_get1_ext_d2i_OCSP_REQUEST_get_ext_OCSP_REQUEST_get_ext_by_NID_OCSP_REQUEST_get_ext_by_OBJ_OCSP_REQUEST_get_ext_by_critical_OCSP_REQUEST_get_ext_count_OCSP_REQUEST_it_OCSP_REQUEST_new_OCSP_REQUEST_print_OCSP_REQ_CTX_free_OCSP_RESPBYTES_free_OCSP_RESPBYTES_it_OCSP_RESPBYTES_new_OCSP_RESPDATA_free_OCSP_RESPDATA_it_OCSP_RESPDATA_new_OCSP_RESPID_free_OCSP_RESPID_it_OCSP_RESPID_new_OCSP_RESPONSE_free_OCSP_RESPONSE_it_OCSP_RESPONSE_new_OCSP_RESPONSE_print_OCSP_REVOKEDINFO_free_OCSP_REVOKEDINFO_it_OCSP_REVOKEDINFO_new_OCSP_SERVICELOC_free_OCSP_SERVICELOC_it_OCSP_SERVICELOC_new_OCSP_SIGNATURE_free_OCSP_SIGNATURE_it_OCSP_SIGNATURE_new_OCSP_SINGLERESP_add1_ext_i2d_OCSP_SINGLERESP_add_ext_OCSP_SINGLERESP_delete_ext_OCSP_SINGLERESP_free_OCSP_SINGLERESP_get1_ext_d2i_OCSP_SINGLERESP_get_ext_OCSP_SINGLERESP_get_ext_by_NID_OCSP_SINGLERESP_get_ext_by_OBJ_OCSP_SINGLERESP_get_ext_by_critical_OCSP_SINGLERESP_get_ext_count_OCSP_SINGLERESP_it_OCSP_SINGLERESP_new_OCSP_accept_responses_new_OCSP_archive_cutoff_new_OCSP_basic_add1_cert_OCSP_basic_add1_nonce_OCSP_basic_add1_status_OCSP_basic_sign_OCSP_basic_verify_OCSP_cert_id_new_OCSP_cert_status_str_OCSP_cert_to_id_OCSP_check_nonce_OCSP_check_validity_OCSP_copy_nonce_OCSP_crlID_new_OCSP_crl_reason_str_OCSP_id_cmp_OCSP_id_get0_info_OCSP_id_issuer_cmp_OCSP_onereq_get0_id_OCSP_parse_url_OCSP_request_add0_id_OCSP_request_add1_cert_OCSP_request_add1_nonce_OCSP_request_is_signed_OCSP_request_onereq_count_OCSP_request_onereq_get0_OCSP_request_set1_name_OCSP_request_sign_OCSP_request_verify_OCSP_resp_count_OCSP_resp_find_OCSP_resp_find_status_OCSP_resp_get0_OCSP_response_create_OCSP_response_get1_basic_OCSP_response_status_OCSP_response_status_str_OCSP_sendreq_bio_OCSP_sendreq_nbio_OCSP_sendreq_new_OCSP_single_get0_status_OCSP_url_svcloc_new_OPENSSL_DIR_end_OPENSSL_DIR_read_OPENSSL_add_all_algorithms_conf_OPENSSL_add_all_algorithms_noconf_OPENSSL_cleanse_OPENSSL_config_OPENSSL_ia32cap_loc_OPENSSL_init_OPENSSL_isservice_OPENSSL_issetugid_OPENSSL_load_builtin_modules_OPENSSL_no_config_OTHERNAME_free_OTHERNAME_it_OTHERNAME_new_OpenSSLDie_OpenSSL_add_all_ciphers_OpenSSL_add_all_digests_PBE2PARAM_free_PBE2PARAM_it_PBE2PARAM_new_PBEPARAM_free_PBEPARAM_it_PBEPARAM_new_PBKDF2PARAM_free_PBKDF2PARAM_it_PBKDF2PARAM_new_PEM_ASN1_read_PEM_ASN1_read_bio_PEM_ASN1_write_PEM_ASN1_write_bio_PEM_SealFinal_PEM_SealInit_PEM_SealUpdate_PEM_SignFinal_PEM_SignInit_PEM_SignUpdate_PEM_X509_INFO_read_PEM_X509_INFO_read_bio_PEM_X509_INFO_write_bio_PEM_bytes_read_bio_PEM_def_callback_PEM_dek_info_PEM_do_header_PEM_get_EVP_CIPHER_INFO_PEM_proc_type_PEM_read_PEM_read_DHparams_PEM_read_DSAPrivateKey_PEM_read_DSA_PUBKEY_PEM_read_DSAparams_PEM_read_ECPKParameters_PEM_read_ECPrivateKey_PEM_read_EC_PUBKEY_PEM_read_NETSCAPE_CERT_SEQUENCE_PEM_read_PKCS7_PEM_read_PKCS8_PEM_read_PKCS8_PRIV_KEY_INFO_PEM_read_PUBKEY_PEM_read_PrivateKey_PEM_read_RSAPrivateKey_PEM_read_RSAPublicKey_PEM_read_RSA_PUBKEY_PEM_read_X509_PEM_read_X509_AUX_PEM_read_X509_CERT_PAIR_PEM_read_X509_CRL_PEM_read_X509_REQ_PEM_read_bio_PEM_read_bio_DHparams_PEM_read_bio_DSAPrivateKey_PEM_read_bio_DSA_PUBKEY_PEM_read_bio_DSAparams_PEM_read_bio_ECPKParameters_PEM_read_bio_ECPrivateKey_PEM_read_bio_EC_PUBKEY_PEM_read_bio_NETSCAPE_CERT_SEQUENCE_PEM_read_bio_PKCS7_PEM_read_bio_PKCS8_PEM_read_bio_PKCS8_PRIV_KEY_INFO_PEM_read_bio_PUBKEY_PEM_read_bio_PrivateKey_PEM_read_bio_RSAPrivateKey_PEM_read_bio_RSAPublicKey_PEM_read_bio_RSA_PUBKEY_PEM_read_bio_X509_PEM_read_bio_X509_AUX_PEM_read_bio_X509_CERT_PAIR_PEM_read_bio_X509_CRL_PEM_read_bio_X509_REQ_PEM_write_PEM_write_DHparams_PEM_write_DSAPrivateKey_PEM_write_DSA_PUBKEY_PEM_write_DSAparams_PEM_write_ECPKParameters_PEM_write_ECPrivateKey_PEM_write_EC_PUBKEY_PEM_write_NETSCAPE_CERT_SEQUENCE_PEM_write_PKCS7_PEM_write_PKCS8_PEM_write_PKCS8PrivateKey_PEM_write_PKCS8PrivateKey_nid_PEM_write_PKCS8_PRIV_KEY_INFO_PEM_write_PUBKEY_PEM_write_PrivateKey_PEM_write_RSAPrivateKey_PEM_write_RSAPublicKey_PEM_write_RSA_PUBKEY_PEM_write_X509_PEM_write_X509_AUX_PEM_write_X509_CERT_PAIR_PEM_write_X509_CRL_PEM_write_X509_REQ_PEM_write_X509_REQ_NEW_PEM_write_bio_PEM_write_bio_DHparams_PEM_write_bio_DSAPrivateKey_PEM_write_bio_DSA_PUBKEY_PEM_write_bio_DSAparams_PEM_write_bio_ECPKParameters_PEM_write_bio_ECPrivateKey_PEM_write_bio_EC_PUBKEY_PEM_write_bio_NETSCAPE_CERT_SEQUENCE_PEM_write_bio_PKCS7_PEM_write_bio_PKCS8_PEM_write_bio_PKCS8PrivateKey_PEM_write_bio_PKCS8PrivateKey_nid_PEM_write_bio_PKCS8_PRIV_KEY_INFO_PEM_write_bio_PUBKEY_PEM_write_bio_PrivateKey_PEM_write_bio_RSAPrivateKey_PEM_write_bio_RSAPublicKey_PEM_write_bio_RSA_PUBKEY_PEM_write_bio_X509_PEM_write_bio_X509_AUX_PEM_write_bio_X509_CERT_PAIR_PEM_write_bio_X509_CRL_PEM_write_bio_X509_REQ_PEM_write_bio_X509_REQ_NEW_PKCS12_AUTHSAFES_it_PKCS12_BAGS_free_PKCS12_BAGS_it_PKCS12_BAGS_new_PKCS12_MAC_DATA_free_PKCS12_MAC_DATA_it_PKCS12_MAC_DATA_new_PKCS12_MAKE_KEYBAG_PKCS12_MAKE_SHKEYBAG_PKCS12_PBE_add_PKCS12_PBE_keyivgen_PKCS12_SAFEBAGS_it_PKCS12_SAFEBAG_free_PKCS12_SAFEBAG_it_PKCS12_SAFEBAG_new_PKCS12_add_CSPName_asc_PKCS12_add_cert_PKCS12_add_friendlyname_asc_PKCS12_add_friendlyname_uni_PKCS12_add_key_PKCS12_add_localkeyid_PKCS12_add_safe_PKCS12_add_safes_PKCS12_certbag2x509_PKCS12_certbag2x509crl_PKCS12_create_PKCS12_decrypt_skey_PKCS12_free_PKCS12_gen_mac_PKCS12_get_attr_gen_PKCS12_get_friendlyname_PKCS12_init_PKCS12_it_PKCS12_item_decrypt_d2i_PKCS12_item_i2d_encrypt_PKCS12_item_pack_safebag_PKCS12_key_gen_asc_PKCS12_key_gen_uni_PKCS12_new_PKCS12_newpass_PKCS12_pack_authsafes_PKCS12_pack_p7data_PKCS12_pack_p7encdata_PKCS12_parse_PKCS12_pbe_crypt_PKCS12_set_mac_PKCS12_setup_mac_PKCS12_unpack_authsafes_PKCS12_unpack_p7data_PKCS12_unpack_p7encdata_PKCS12_verify_mac_PKCS12_x5092certbag_PKCS12_x509crl2certbag_PKCS1_MGF1_PKCS5_PBE_add_PKCS5_PBE_keyivgen_PKCS5_PBKDF2_HMAC_SHA1_PKCS5_pbe2_set_PKCS5_pbe_set_PKCS5_v2_PBE_keyivgen_PKCS7_ATTR_SIGN_it_PKCS7_ATTR_VERIFY_it_PKCS7_DIGEST_free_PKCS7_DIGEST_it_PKCS7_DIGEST_new_PKCS7_ENCRYPT_free_PKCS7_ENCRYPT_it_PKCS7_ENCRYPT_new_PKCS7_ENC_CONTENT_free_PKCS7_ENC_CONTENT_it_PKCS7_ENC_CONTENT_new_PKCS7_ENVELOPE_free_PKCS7_ENVELOPE_it_PKCS7_ENVELOPE_new_PKCS7_ISSUER_AND_SERIAL_digest_PKCS7_ISSUER_AND_SERIAL_free_PKCS7_ISSUER_AND_SERIAL_it_PKCS7_ISSUER_AND_SERIAL_new_PKCS7_RECIP_INFO_free_PKCS7_RECIP_INFO_it_PKCS7_RECIP_INFO_new_PKCS7_RECIP_INFO_set_PKCS7_SIGNED_free_PKCS7_SIGNED_it_PKCS7_SIGNED_new_PKCS7_SIGNER_INFO_free_PKCS7_SIGNER_INFO_it_PKCS7_SIGNER_INFO_new_PKCS7_SIGNER_INFO_set_PKCS7_SIGN_ENVELOPE_free_PKCS7_SIGN_ENVELOPE_it_PKCS7_SIGN_ENVELOPE_new_PKCS7_add_attrib_smimecap_PKCS7_add_attribute_PKCS7_add_certificate_PKCS7_add_crl_PKCS7_add_recipient_PKCS7_add_recipient_info_PKCS7_add_signature_PKCS7_add_signed_attribute_PKCS7_add_signer_PKCS7_cert_from_signer_info_PKCS7_content_new_PKCS7_ctrl_PKCS7_dataDecode_PKCS7_dataFinal_PKCS7_dataInit_PKCS7_dataVerify_PKCS7_decrypt_PKCS7_digest_from_attributes_PKCS7_dup_PKCS7_encrypt_PKCS7_free_PKCS7_get0_signers_PKCS7_get_attribute_PKCS7_get_issuer_and_serial_PKCS7_get_signed_attribute_PKCS7_get_signer_info_PKCS7_get_smimecap_PKCS7_it_PKCS7_new_PKCS7_set0_type_other_PKCS7_set_attributes_PKCS7_set_cipher_PKCS7_set_content_PKCS7_set_digest_PKCS7_set_signed_attributes_PKCS7_set_type_PKCS7_sign_PKCS7_signatureVerify_PKCS7_simple_smimecap_PKCS7_verify_PKCS8_PRIV_KEY_INFO_free_PKCS8_PRIV_KEY_INFO_it_PKCS8_PRIV_KEY_INFO_new_PKCS8_add_keyusage_PKCS8_decrypt_PKCS8_encrypt_PKCS8_set_broken_PKEY_USAGE_PERIOD_free_PKEY_USAGE_PERIOD_it_PKEY_USAGE_PERIOD_new_POLICYINFO_free_POLICYINFO_it_POLICYINFO_new_POLICYQUALINFO_free_POLICYQUALINFO_it_POLICYQUALINFO_new_POLICY_CONSTRAINTS_free_POLICY_CONSTRAINTS_it_POLICY_CONSTRAINTS_new_POLICY_MAPPINGS_it_POLICY_MAPPING_free_POLICY_MAPPING_it_POLICY_MAPPING_new_PROXY_CERT_INFO_EXTENSION_free_PROXY_CERT_INFO_EXTENSION_it_PROXY_CERT_INFO_EXTENSION_new_PROXY_POLICY_free_PROXY_POLICY_it_PROXY_POLICY_new_RAND_SSLeay_RAND_add_RAND_bytes_RAND_cleanup_RAND_egd_RAND_egd_bytes_RAND_event_RAND_file_name_RAND_get_rand_method_RAND_load_file_RAND_poll_RAND_pseudo_bytes_RAND_query_egd_bytes_RAND_screen_RAND_seed_RAND_set_rand_engine_RAND_set_rand_method_RAND_status_RAND_write_file_RC2_cbc_encrypt_RC2_cfb64_encrypt_RC2_decrypt_RC2_ecb_encrypt_RC2_encrypt_RC2_ofb64_encrypt_RC2_set_key_RC4_RC4_options_RC4_set_key_RIPEMD160_RIPEMD160_Final_RIPEMD160_Init_RIPEMD160_Transform_RIPEMD160_Update_RSAPrivateKey_asn1_meth_RSAPrivateKey_dup_RSAPrivateKey_it_RSAPublicKey_dup_RSAPublicKey_it_RSA_PKCS1_SSLeay_RSA_X931_derive_ex_RSA_X931_generate_key_ex_RSA_X931_hash_id_RSA_blinding_off_RSA_blinding_on_RSA_check_key_RSA_flags_RSA_free_RSA_generate_key_RSA_generate_key_ex_RSA_get_default_method_RSA_get_ex_data_RSA_get_ex_new_index_RSA_get_method_RSA_memory_lock_RSA_new_RSA_new_method_RSA_null_method_RSA_padding_add_PKCS1_OAEP_RSA_padding_add_PKCS1_PSS_RSA_padding_add_PKCS1_type_1_RSA_padding_add_PKCS1_type_2_RSA_padding_add_SSLv23_RSA_padding_add_X931_RSA_padding_add_none_RSA_padding_check_PKCS1_OAEP_RSA_padding_check_PKCS1_type_1_RSA_padding_check_PKCS1_type_2_RSA_padding_check_SSLv23_RSA_padding_check_X931_RSA_padding_check_none_RSA_print_RSA_print_fp_RSA_private_decrypt_RSA_private_encrypt_RSA_public_decrypt_RSA_public_encrypt_RSA_set_default_method_RSA_set_ex_data_RSA_set_method_RSA_setup_blinding_RSA_sign_RSA_sign_ASN1_OCTET_STRING_RSA_size_RSA_up_ref_RSA_verify_RSA_verify_ASN1_OCTET_STRING_RSA_verify_PKCS1_PSS_SHA_SHA1_SHA1_Final_SHA1_Init_SHA1_Transform_SHA1_Update_SHA224_SHA224_Final_SHA224_Init_SHA224_Update_SHA256_SHA256_Final_SHA256_Init_SHA256_Transform_SHA256_Update_SHA384_SHA384_Final_SHA384_Init_SHA384_Update_SHA512_SHA512_Final_SHA512_Init_SHA512_Transform_SHA512_Update_SHA_Final_SHA_Init_SHA_Transform_SHA_Update_SMIME_crlf_copy_SMIME_read_ASN1_SMIME_read_PKCS7_SMIME_text_SMIME_write_PKCS7_SSLeay_SSLeay_version_STORE_ATTR_INFO_compare_STORE_ATTR_INFO_free_STORE_ATTR_INFO_get0_cstr_STORE_ATTR_INFO_get0_dn_STORE_ATTR_INFO_get0_number_STORE_ATTR_INFO_get0_sha1str_STORE_ATTR_INFO_in_STORE_ATTR_INFO_in_ex_STORE_ATTR_INFO_in_range_STORE_ATTR_INFO_modify_cstr_STORE_ATTR_INFO_modify_dn_STORE_ATTR_INFO_modify_number_STORE_ATTR_INFO_modify_sha1str_STORE_ATTR_INFO_new_STORE_ATTR_INFO_set_cstr_STORE_ATTR_INFO_set_dn_STORE_ATTR_INFO_set_number_STORE_ATTR_INFO_set_sha1str_STORE_Memory_STORE_OBJECT_free_STORE_OBJECT_new_STORE_create_method_STORE_ctrl_STORE_delete_arbitrary_STORE_delete_certificate_STORE_delete_crl_STORE_delete_number_STORE_delete_private_key_STORE_delete_public_key_STORE_destroy_method_STORE_free_STORE_generate_crl_STORE_generate_key_STORE_get_arbitrary_STORE_get_certificate_STORE_get_crl_STORE_get_ex_data_STORE_get_ex_new_index_STORE_get_method_STORE_get_number_STORE_get_private_key_STORE_get_public_key_STORE_list_certificate_end_STORE_list_certificate_endp_STORE_list_certificate_next_STORE_list_certificate_start_STORE_list_crl_end_STORE_list_crl_endp_STORE_list_crl_next_STORE_list_crl_start_STORE_list_private_key_end_STORE_list_private_key_endp_STORE_list_private_key_next_STORE_list_private_key_start_STORE_list_public_key_end_STORE_list_public_key_endp_STORE_list_public_key_next_STORE_list_public_key_start_STORE_method_get_cleanup_function_STORE_method_get_ctrl_function_STORE_method_get_delete_function_STORE_method_get_generate_function_STORE_method_get_get_function_STORE_method_get_initialise_function_STORE_method_get_list_end_function_STORE_method_get_list_next_function_STORE_method_get_list_start_function_STORE_method_get_lock_store_function_STORE_method_get_modify_function_STORE_method_get_revoke_function_STORE_method_get_store_function_STORE_method_get_unlock_store_function_STORE_method_get_update_store_function_STORE_method_set_cleanup_function_STORE_method_set_ctrl_function_STORE_method_set_delete_function_STORE_method_set_generate_function_STORE_method_set_get_function_STORE_method_set_initialise_function_STORE_method_set_list_end_function_STORE_method_set_list_next_function_STORE_method_set_list_start_function_STORE_method_set_lock_store_function_STORE_method_set_modify_function_STORE_method_set_revoke_function_STORE_method_set_store_function_STORE_method_set_unlock_store_function_STORE_method_set_update_store_function_STORE_modify_arbitrary_STORE_modify_certificate_STORE_modify_crl_STORE_modify_number_STORE_modify_private_key_STORE_modify_public_key_STORE_new_engine_STORE_new_method_STORE_parse_attrs_end_STORE_parse_attrs_endp_STORE_parse_attrs_next_STORE_parse_attrs_start_STORE_revoke_certificate_STORE_revoke_private_key_STORE_revoke_public_key_STORE_set_ex_data_STORE_set_method_STORE_store_arbitrary_STORE_store_certificate_STORE_store_crl_STORE_store_number_STORE_store_private_key_STORE_store_public_key_SXNETID_free_SXNETID_it_SXNETID_new_SXNET_add_id_INTEGER_SXNET_add_id_asc_SXNET_add_id_ulong_SXNET_free_SXNET_get_id_INTEGER_SXNET_get_id_asc_SXNET_get_id_ulong_SXNET_it_SXNET_new_TXT_DB_create_index_TXT_DB_free_TXT_DB_get_by_index_TXT_DB_insert_TXT_DB_read_TXT_DB_write_UI_OpenSSL_UI_UTIL_read_pw_UI_UTIL_read_pw_string_UI_add_error_string_UI_add_info_string_UI_add_input_boolean_UI_add_input_string_UI_add_user_data_UI_add_verify_string_UI_construct_prompt_UI_create_method_UI_ctrl_UI_destroy_method_UI_dup_error_string_UI_dup_info_string_UI_dup_input_boolean_UI_dup_input_string_UI_dup_verify_string_UI_free_UI_get0_action_string_UI_get0_output_string_UI_get0_result_UI_get0_result_string_UI_get0_test_string_UI_get0_user_data_UI_get_default_method_UI_get_ex_data_UI_get_ex_new_index_UI_get_input_flags_UI_get_method_UI_get_result_maxsize_UI_get_result_minsize_UI_get_string_type_UI_method_get_closer_UI_method_get_flusher_UI_method_get_opener_UI_method_get_reader_UI_method_get_writer_UI_method_set_closer_UI_method_set_flusher_UI_method_set_opener_UI_method_set_reader_UI_method_set_writer_UI_new_UI_new_method_UI_process_UI_set_default_method_UI_set_ex_data_UI_set_method_UI_set_result_USERNOTICE_free_USERNOTICE_it_USERNOTICE_new_UTF8_getc_UTF8_putc_X509V3_EXT_CRL_add_conf_X509V3_EXT_CRL_add_nconf_X509V3_EXT_REQ_add_conf_X509V3_EXT_REQ_add_nconf_X509V3_EXT_add_X509V3_EXT_add_alias_X509V3_EXT_add_conf_X509V3_EXT_add_list_X509V3_EXT_add_nconf_X509V3_EXT_add_nconf_sk_X509V3_EXT_cleanup_X509V3_EXT_conf_X509V3_EXT_conf_nid_X509V3_EXT_d2i_X509V3_EXT_get_X509V3_EXT_get_nid_X509V3_EXT_i2d_X509V3_EXT_nconf_X509V3_EXT_nconf_nid_X509V3_EXT_print_X509V3_EXT_print_fp_X509V3_EXT_val_prn_X509V3_NAME_from_section_X509V3_add1_i2d_X509V3_add_standard_extensions_X509V3_add_value_X509V3_add_value_bool_X509V3_add_value_bool_nf_X509V3_add_value_int_X509V3_add_value_uchar_X509V3_conf_free_X509V3_extensions_print_X509V3_get_d2i_X509V3_get_section_X509V3_get_string_X509V3_get_value_bool_X509V3_get_value_int_X509V3_parse_list_X509V3_section_free_X509V3_set_conf_lhash_X509V3_set_ctx_X509V3_set_nconf_X509V3_string_free_X509_ALGORS_it_X509_ALGOR_dup_X509_ALGOR_free_X509_ALGOR_get0_X509_ALGOR_it_X509_ALGOR_new_X509_ALGOR_set0_X509_ATTRIBUTE_count_X509_ATTRIBUTE_create_X509_ATTRIBUTE_create_by_NID_X509_ATTRIBUTE_create_by_OBJ_X509_ATTRIBUTE_create_by_txt_X509_ATTRIBUTE_dup_X509_ATTRIBUTE_free_X509_ATTRIBUTE_get0_data_X509_ATTRIBUTE_get0_object_X509_ATTRIBUTE_get0_type_X509_ATTRIBUTE_it_X509_ATTRIBUTE_new_X509_ATTRIBUTE_set1_data_X509_ATTRIBUTE_set1_object_X509_CERT_AUX_free_X509_CERT_AUX_it_X509_CERT_AUX_new_X509_CERT_AUX_print_X509_CERT_PAIR_free_X509_CERT_PAIR_it_X509_CERT_PAIR_new_X509_CINF_free_X509_CINF_it_X509_CINF_new_X509_CRL_INFO_free_X509_CRL_INFO_it_X509_CRL_INFO_new_X509_CRL_add0_revoked_X509_CRL_add1_ext_i2d_X509_CRL_add_ext_X509_CRL_cmp_X509_CRL_delete_ext_X509_CRL_digest_X509_CRL_dup_X509_CRL_free_X509_CRL_get_ext_X509_CRL_get_ext_by_NID_X509_CRL_get_ext_by_OBJ_X509_CRL_get_ext_by_critical_X509_CRL_get_ext_count_X509_CRL_get_ext_d2i_X509_CRL_it_X509_CRL_new_X509_CRL_print_X509_CRL_print_fp_X509_CRL_set_issuer_name_X509_CRL_set_lastUpdate_X509_CRL_set_nextUpdate_X509_CRL_set_version_X509_CRL_sign_X509_CRL_sort_X509_CRL_verify_X509_EXTENSIONS_it_X509_EXTENSION_create_by_NID_X509_EXTENSION_create_by_OBJ_X509_EXTENSION_dup_X509_EXTENSION_free_X509_EXTENSION_get_critical_X509_EXTENSION_get_data_X509_EXTENSION_get_object_X509_EXTENSION_it_X509_EXTENSION_new_X509_EXTENSION_set_critical_X509_EXTENSION_set_data_X509_EXTENSION_set_object_X509_INFO_free_X509_INFO_new_X509_LOOKUP_by_alias_X509_LOOKUP_by_fingerprint_X509_LOOKUP_by_issuer_serial_X509_LOOKUP_by_subject_X509_LOOKUP_ctrl_X509_LOOKUP_file_X509_LOOKUP_free_X509_LOOKUP_hash_dir_X509_LOOKUP_init_X509_LOOKUP_new_X509_LOOKUP_shutdown_X509_NAME_ENTRY_create_by_NID_X509_NAME_ENTRY_create_by_OBJ_X509_NAME_ENTRY_create_by_txt_X509_NAME_ENTRY_dup_X509_NAME_ENTRY_free_X509_NAME_ENTRY_get_data_X509_NAME_ENTRY_get_object_X509_NAME_ENTRY_it_X509_NAME_ENTRY_new_X509_NAME_ENTRY_set_data_X509_NAME_ENTRY_set_object_X509_NAME_add_entry_X509_NAME_add_entry_by_NID_X509_NAME_add_entry_by_OBJ_X509_NAME_add_entry_by_txt_X509_NAME_cmp_X509_NAME_delete_entry_X509_NAME_digest_X509_NAME_dup_X509_NAME_entry_count_X509_NAME_free_X509_NAME_get_entry_X509_NAME_get_index_by_NID_X509_NAME_get_index_by_OBJ_X509_NAME_get_text_by_NID_X509_NAME_get_text_by_OBJ_X509_NAME_hash_X509_NAME_it_X509_NAME_new_X509_NAME_oneline_X509_NAME_print_X509_NAME_print_ex_X509_NAME_print_ex_fp_X509_NAME_set_X509_OBJECT_free_contents_X509_OBJECT_idx_by_subject_X509_OBJECT_retrieve_by_subject_X509_OBJECT_retrieve_match_X509_OBJECT_up_ref_count_X509_PKEY_free_X509_PKEY_new_X509_POLICY_NODE_print_X509_PUBKEY_free_X509_PUBKEY_get_X509_PUBKEY_it_X509_PUBKEY_new_X509_PUBKEY_set_X509_PURPOSE_add_X509_PURPOSE_cleanup_X509_PURPOSE_get0_X509_PURPOSE_get0_name_X509_PURPOSE_get0_sname_X509_PURPOSE_get_by_id_X509_PURPOSE_get_by_sname_X509_PURPOSE_get_count_X509_PURPOSE_get_id_X509_PURPOSE_get_trust_X509_PURPOSE_set_X509_REQ_INFO_free_X509_REQ_INFO_it_X509_REQ_INFO_new_X509_REQ_add1_attr_X509_REQ_add1_attr_by_NID_X509_REQ_add1_attr_by_OBJ_X509_REQ_add1_attr_by_txt_X509_REQ_add_extensions_X509_REQ_add_extensions_nid_X509_REQ_check_private_key_X509_REQ_delete_attr_X509_REQ_digest_X509_REQ_dup_X509_REQ_extension_nid_X509_REQ_free_X509_REQ_get1_email_X509_REQ_get_attr_X509_REQ_get_attr_by_NID_X509_REQ_get_attr_by_OBJ_X509_REQ_get_attr_count_X509_REQ_get_extension_nids_X509_REQ_get_extensions_X509_REQ_get_pubkey_X509_REQ_it_X509_REQ_new_X509_REQ_print_X509_REQ_print_ex_X509_REQ_print_fp_X509_REQ_set_extension_nids_X509_REQ_set_pubkey_X509_REQ_set_subject_name_X509_REQ_set_version_X509_REQ_sign_X509_REQ_to_X509_X509_REQ_verify_X509_REVOKED_add1_ext_i2d_X509_REVOKED_add_ext_X509_REVOKED_delete_ext_X509_REVOKED_free_X509_REVOKED_get_ext_X509_REVOKED_get_ext_by_NID_X509_REVOKED_get_ext_by_OBJ_X509_REVOKED_get_ext_by_critical_X509_REVOKED_get_ext_count_X509_REVOKED_get_ext_d2i_X509_REVOKED_it_X509_REVOKED_new_X509_REVOKED_set_revocationDate_X509_REVOKED_set_serialNumber_X509_SIG_free_X509_SIG_it_X509_SIG_new_X509_STORE_CTX_cleanup_X509_STORE_CTX_free_X509_STORE_CTX_get0_param_X509_STORE_CTX_get0_policy_tree_X509_STORE_CTX_get1_chain_X509_STORE_CTX_get1_issuer_X509_STORE_CTX_get_chain_X509_STORE_CTX_get_current_cert_X509_STORE_CTX_get_error_X509_STORE_CTX_get_error_depth_X509_STORE_CTX_get_ex_data_X509_STORE_CTX_get_ex_new_index_X509_STORE_CTX_get_explicit_policy_X509_STORE_CTX_init_X509_STORE_CTX_new_X509_STORE_CTX_purpose_inherit_X509_STORE_CTX_set0_crls_X509_STORE_CTX_set0_param_X509_STORE_CTX_set_cert_X509_STORE_CTX_set_chain_X509_STORE_CTX_set_default_X509_STORE_CTX_set_depth_X509_STORE_CTX_set_error_X509_STORE_CTX_set_ex_data_X509_STORE_CTX_set_flags_X509_STORE_CTX_set_purpose_X509_STORE_CTX_set_time_X509_STORE_CTX_set_trust_X509_STORE_CTX_set_verify_cb_X509_STORE_CTX_trusted_stack_X509_STORE_add_cert_X509_STORE_add_crl_X509_STORE_add_lookup_X509_STORE_free_X509_STORE_get_by_subject_X509_STORE_load_locations_X509_STORE_new_X509_STORE_set1_param_X509_STORE_set_default_paths_X509_STORE_set_depth_X509_STORE_set_flags_X509_STORE_set_purpose_X509_STORE_set_trust_X509_TRUST_add_X509_TRUST_cleanup_X509_TRUST_get0_X509_TRUST_get0_name_X509_TRUST_get_by_id_X509_TRUST_get_count_X509_TRUST_get_flags_X509_TRUST_get_trust_X509_TRUST_set_X509_TRUST_set_default_X509_VAL_free_X509_VAL_it_X509_VAL_new_X509_VERIFY_PARAM_add0_policy_X509_VERIFY_PARAM_add0_table_X509_VERIFY_PARAM_clear_flags_X509_VERIFY_PARAM_free_X509_VERIFY_PARAM_get_depth_X509_VERIFY_PARAM_get_flags_X509_VERIFY_PARAM_inherit_X509_VERIFY_PARAM_lookup_X509_VERIFY_PARAM_new_X509_VERIFY_PARAM_set1_X509_VERIFY_PARAM_set1_name_X509_VERIFY_PARAM_set1_policies_X509_VERIFY_PARAM_set_depth_X509_VERIFY_PARAM_set_flags_X509_VERIFY_PARAM_set_purpose_X509_VERIFY_PARAM_set_time_X509_VERIFY_PARAM_set_trust_X509_VERIFY_PARAM_table_cleanup_X509_add1_ext_i2d_X509_add1_reject_object_X509_add1_trust_object_X509_add_ext_X509_alias_get0_X509_alias_set1_X509_asn1_meth_X509_certificate_type_X509_check_ca_X509_check_issued_X509_check_private_key_X509_check_purpose_X509_check_trust_X509_cmp_X509_cmp_current_time_X509_cmp_time_X509_delete_ext_X509_digest_X509_dup_X509_email_free_X509_find_by_issuer_and_serial_X509_find_by_subject_X509_free_X509_get0_pubkey_bitstr_X509_get1_email_X509_get1_ocsp_X509_get_default_cert_area_X509_get_default_cert_dir_X509_get_default_cert_dir_env_X509_get_default_cert_file_X509_get_default_cert_file_env_X509_get_default_private_dir_X509_get_ex_data_X509_get_ex_new_index_X509_get_ext_X509_get_ext_by_NID_X509_get_ext_by_OBJ_X509_get_ext_by_critical_X509_get_ext_count_X509_get_ext_d2i_X509_get_issuer_name_X509_get_pubkey_X509_get_pubkey_parameters_X509_get_serialNumber_X509_get_subject_name_X509_gmtime_adj_X509_issuer_and_serial_cmp_X509_issuer_and_serial_hash_X509_issuer_name_cmp_X509_issuer_name_hash_X509_it_X509_keyid_get0_X509_keyid_set1_X509_load_cert_crl_file_X509_load_cert_file_X509_load_crl_file_X509_new_X509_ocspid_print_X509_policy_check_X509_policy_level_get0_node_X509_policy_level_node_count_X509_policy_node_get0_parent_X509_policy_node_get0_policy_X509_policy_node_get0_qualifiers_X509_policy_tree_free_X509_policy_tree_get0_level_X509_policy_tree_get0_policies_X509_policy_tree_get0_user_policies_X509_policy_tree_level_count_X509_print_X509_print_ex_X509_print_ex_fp_X509_print_fp_X509_pubkey_digest_X509_reject_clear_X509_set_ex_data_X509_set_issuer_name_X509_set_notAfter_X509_set_notBefore_X509_set_pubkey_X509_set_serialNumber_X509_set_subject_name_X509_set_version_X509_sign_X509_signature_print_X509_subject_name_cmp_X509_subject_name_hash_X509_supported_extension_X509_time_adj_X509_to_X509_REQ_X509_trust_clear_X509_verify_X509_verify_cert_X509_verify_cert_error_string_X509at_add1_attr_X509at_add1_attr_by_NID_X509at_add1_attr_by_OBJ_X509at_add1_attr_by_txt_X509at_delete_attr_X509at_get0_data_by_OBJ_X509at_get_attr_X509at_get_attr_by_NID_X509at_get_attr_by_OBJ_X509at_get_attr_count_X509v3_add_ext_X509v3_delete_ext_X509v3_get_ext_X509v3_get_ext_by_NID_X509v3_get_ext_by_OBJ_X509v3_get_ext_by_critical_X509v3_get_ext_count_ZLONG_it__IMPORT_DESCRIPTOR_LIBEAY32__NULL_IMPORT_DESCRIPTOR__imp__ACCESS_DESCRIPTION_free__imp__ACCESS_DESCRIPTION_it__imp__ACCESS_DESCRIPTION_new__imp__AES_bi_ige_encrypt__imp__AES_cbc_encrypt__imp__AES_cfb128_encrypt__imp__AES_cfb1_encrypt__imp__AES_cfb8_encrypt__imp__AES_cfbr_encrypt_block__imp__AES_ctr128_encrypt__imp__AES_decrypt__imp__AES_ecb_encrypt__imp__AES_encrypt__imp__AES_ige_encrypt__imp__AES_ofb128_encrypt__imp__AES_options__imp__AES_set_decrypt_key__imp__AES_set_encrypt_key__imp__AES_unwrap_key__imp__AES_wrap_key__imp__ASN1_ANY_it__imp__ASN1_BIT_STRING_asn1_meth__imp__ASN1_BIT_STRING_free__imp__ASN1_BIT_STRING_get_bit__imp__ASN1_BIT_STRING_it__imp__ASN1_BIT_STRING_name_print__imp__ASN1_BIT_STRING_new__imp__ASN1_BIT_STRING_num_asc__imp__ASN1_BIT_STRING_set__imp__ASN1_BIT_STRING_set_asc__imp__ASN1_BIT_STRING_set_bit__imp__ASN1_BMPSTRING_free__imp__ASN1_BMPSTRING_it__imp__ASN1_BMPSTRING_new__imp__ASN1_BOOLEAN_it__imp__ASN1_ENUMERATED_free__imp__ASN1_ENUMERATED_get__imp__ASN1_ENUMERATED_it__imp__ASN1_ENUMERATED_new__imp__ASN1_ENUMERATED_set__imp__ASN1_ENUMERATED_to_BN__imp__ASN1_FBOOLEAN_it__imp__ASN1_GENERALIZEDTIME_check__imp__ASN1_GENERALIZEDTIME_free__imp__ASN1_GENERALIZEDTIME_it__imp__ASN1_GENERALIZEDTIME_new__imp__ASN1_GENERALIZEDTIME_print__imp__ASN1_GENERALIZEDTIME_set__imp__ASN1_GENERALIZEDTIME_set_string__imp__ASN1_GENERALSTRING_free__imp__ASN1_GENERALSTRING_it__imp__ASN1_GENERALSTRING_new__imp__ASN1_HEADER_free__imp__ASN1_HEADER_new__imp__ASN1_IA5STRING_asn1_meth__imp__ASN1_IA5STRING_free__imp__ASN1_IA5STRING_it__imp__ASN1_IA5STRING_new__imp__ASN1_INTEGER_cmp__imp__ASN1_INTEGER_dup__imp__ASN1_INTEGER_free__imp__ASN1_INTEGER_get__imp__ASN1_INTEGER_it__imp__ASN1_INTEGER_new__imp__ASN1_INTEGER_set__imp__ASN1_INTEGER_to_BN__imp__ASN1_NULL_free__imp__ASN1_NULL_it__imp__ASN1_NULL_new__imp__ASN1_OBJECT_create__imp__ASN1_OBJECT_free__imp__ASN1_OBJECT_it__imp__ASN1_OBJECT_new__imp__ASN1_OCTET_STRING_NDEF_it__imp__ASN1_OCTET_STRING_cmp__imp__ASN1_OCTET_STRING_dup__imp__ASN1_OCTET_STRING_free__imp__ASN1_OCTET_STRING_it__imp__ASN1_OCTET_STRING_new__imp__ASN1_OCTET_STRING_set__imp__ASN1_PRINTABLESTRING_free__imp__ASN1_PRINTABLESTRING_it__imp__ASN1_PRINTABLESTRING_new__imp__ASN1_PRINTABLE_free__imp__ASN1_PRINTABLE_it__imp__ASN1_PRINTABLE_new__imp__ASN1_PRINTABLE_type__imp__ASN1_SEQUENCE_it__imp__ASN1_STRING_TABLE_add__imp__ASN1_STRING_TABLE_cleanup__imp__ASN1_STRING_TABLE_get__imp__ASN1_STRING_cmp__imp__ASN1_STRING_data__imp__ASN1_STRING_dup__imp__ASN1_STRING_encode__imp__ASN1_STRING_free__imp__ASN1_STRING_get_default_mask__imp__ASN1_STRING_length__imp__ASN1_STRING_length_set__imp__ASN1_STRING_new__imp__ASN1_STRING_print__imp__ASN1_STRING_print_ex__imp__ASN1_STRING_print_ex_fp__imp__ASN1_STRING_set__imp__ASN1_STRING_set0__imp__ASN1_STRING_set_by_NID__imp__ASN1_STRING_set_default_mask__imp__ASN1_STRING_set_default_mask_asc__imp__ASN1_STRING_to_UTF8__imp__ASN1_STRING_type__imp__ASN1_STRING_type_new__imp__ASN1_T61STRING_free__imp__ASN1_T61STRING_it__imp__ASN1_T61STRING_new__imp__ASN1_TBOOLEAN_it__imp__ASN1_TIME_check__imp__ASN1_TIME_free__imp__ASN1_TIME_it__imp__ASN1_TIME_new__imp__ASN1_TIME_print__imp__ASN1_TIME_set__imp__ASN1_TIME_to_generalizedtime__imp__ASN1_TYPE_free__imp__ASN1_TYPE_get__imp__ASN1_TYPE_get_int_octetstring__imp__ASN1_TYPE_get_octetstring__imp__ASN1_TYPE_new__imp__ASN1_TYPE_set__imp__ASN1_TYPE_set1__imp__ASN1_TYPE_set_int_octetstring__imp__ASN1_TYPE_set_octetstring__imp__ASN1_UNIVERSALSTRING_free__imp__ASN1_UNIVERSALSTRING_it__imp__ASN1_UNIVERSALSTRING_new__imp__ASN1_UNIVERSALSTRING_to_string__imp__ASN1_UTCTIME_check__imp__ASN1_UTCTIME_cmp_time_t__imp__ASN1_UTCTIME_free__imp__ASN1_UTCTIME_it__imp__ASN1_UTCTIME_new__imp__ASN1_UTCTIME_print__imp__ASN1_UTCTIME_set__imp__ASN1_UTCTIME_set_string__imp__ASN1_UTF8STRING_free__imp__ASN1_UTF8STRING_it__imp__ASN1_UTF8STRING_new__imp__ASN1_VISIBLESTRING_free__imp__ASN1_VISIBLESTRING_it__imp__ASN1_VISIBLESTRING_new__imp__ASN1_add_oid_module__imp__ASN1_check_infinite_end__imp__ASN1_const_check_infinite_end__imp__ASN1_d2i_bio__imp__ASN1_d2i_fp__imp__ASN1_digest__imp__ASN1_dup__imp__ASN1_generate_nconf__imp__ASN1_generate_v3__imp__ASN1_get_object__imp__ASN1_i2d_bio__imp__ASN1_i2d_fp__imp__ASN1_item_d2i__imp__ASN1_item_d2i_bio__imp__ASN1_item_d2i_fp__imp__ASN1_item_digest__imp__ASN1_item_dup__imp__ASN1_item_ex_d2i__imp__ASN1_item_ex_free__imp__ASN1_item_ex_i2d__imp__ASN1_item_ex_new__imp__ASN1_item_free__imp__ASN1_item_i2d__imp__ASN1_item_i2d_bio__imp__ASN1_item_i2d_fp__imp__ASN1_item_ndef_i2d__imp__ASN1_item_new__imp__ASN1_item_pack__imp__ASN1_item_sign__imp__ASN1_item_unpack__imp__ASN1_item_verify__imp__ASN1_mbstring_copy__imp__ASN1_mbstring_ncopy__imp__ASN1_object_size__imp__ASN1_pack_string__imp__ASN1_parse__imp__ASN1_parse_dump__imp__ASN1_primitive_free__imp__ASN1_primitive_new__imp__ASN1_put_eoc__imp__ASN1_put_object__imp__ASN1_seq_pack__imp__ASN1_seq_unpack__imp__ASN1_sign__imp__ASN1_tag2bit__imp__ASN1_tag2str__imp__ASN1_template_d2i__imp__ASN1_template_free__imp__ASN1_template_i2d__imp__ASN1_template_new__imp__ASN1_unpack_string__imp__ASN1_verify__imp__AUTHORITY_INFO_ACCESS_free__imp__AUTHORITY_INFO_ACCESS_it__imp__AUTHORITY_INFO_ACCESS_new__imp__AUTHORITY_KEYID_free__imp__AUTHORITY_KEYID_it__imp__AUTHORITY_KEYID_new__imp__BASIC_CONSTRAINTS_free__imp__BASIC_CONSTRAINTS_it__imp__BASIC_CONSTRAINTS_new__imp__BF_cbc_encrypt__imp__BF_cfb64_encrypt__imp__BF_decrypt__imp__BF_ecb_encrypt__imp__BF_encrypt__imp__BF_ofb64_encrypt__imp__BF_options__imp__BF_set_key__imp__BIGNUM_it__imp__BIO_accept__imp__BIO_callback_ctrl__imp__BIO_clear_flags__imp__BIO_copy_next_retry__imp__BIO_ctrl__imp__BIO_ctrl_get_read_request__imp__BIO_ctrl_get_write_guarantee__imp__BIO_ctrl_pending__imp__BIO_ctrl_reset_read_request__imp__BIO_ctrl_wpending__imp__BIO_debug_callback__imp__BIO_dgram_non_fatal_error__imp__BIO_dump__imp__BIO_dump_cb__imp__BIO_dump_fp__imp__BIO_dump_indent__imp__BIO_dump_indent_cb__imp__BIO_dump_indent_fp__imp__BIO_dup_chain__imp__BIO_f_base64__imp__BIO_f_buffer__imp__BIO_f_cipher__imp__BIO_f_md__imp__BIO_f_nbio_test__imp__BIO_f_null__imp__BIO_f_reliable__imp__BIO_fd_non_fatal_error__imp__BIO_fd_should_retry__imp__BIO_find_type__imp__BIO_free__imp__BIO_free_all__imp__BIO_get_accept_socket__imp__BIO_get_callback__imp__BIO_get_callback_arg__imp__BIO_get_ex_data__imp__BIO_get_ex_new_index__imp__BIO_get_host_ip__imp__BIO_get_port__imp__BIO_get_retry_BIO__imp__BIO_get_retry_reason__imp__BIO_gethostbyname__imp__BIO_gets__imp__BIO_indent__imp__BIO_int_ctrl__imp__BIO_method_name__imp__BIO_method_type__imp__BIO_new__imp__BIO_new_accept__imp__BIO_new_bio_pair__imp__BIO_new_connect__imp__BIO_new_dgram__imp__BIO_new_fd__imp__BIO_new_file__imp__BIO_new_fp__imp__BIO_new_mem_buf__imp__BIO_new_socket__imp__BIO_next__imp__BIO_nread__imp__BIO_nread0__imp__BIO_number_read__imp__BIO_number_written__imp__BIO_nwrite__imp__BIO_nwrite0__imp__BIO_pop__imp__BIO_printf__imp__BIO_ptr_ctrl__imp__BIO_push__imp__BIO_puts__imp__BIO_read__imp__BIO_s_accept__imp__BIO_s_bio__imp__BIO_s_connect__imp__BIO_s_datagram__imp__BIO_s_fd__imp__BIO_s_file__imp__BIO_s_mem__imp__BIO_s_null__imp__BIO_s_socket__imp__BIO_set__imp__BIO_set_callback__imp__BIO_set_callback_arg__imp__BIO_set_cipher__imp__BIO_set_ex_data__imp__BIO_set_flags__imp__BIO_set_tcp_ndelay__imp__BIO_snprintf__imp__BIO_sock_cleanup__imp__BIO_sock_error__imp__BIO_sock_init__imp__BIO_sock_non_fatal_error__imp__BIO_sock_should_retry__imp__BIO_socket_ioctl__imp__BIO_socket_nbio__imp__BIO_test_flags__imp__BIO_vfree__imp__BIO_vprintf__imp__BIO_vsnprintf__imp__BIO_write__imp__BN_BLINDING_convert__imp__BN_BLINDING_convert_ex__imp__BN_BLINDING_create_param__imp__BN_BLINDING_free__imp__BN_BLINDING_get_flags__imp__BN_BLINDING_get_thread_id__imp__BN_BLINDING_invert__imp__BN_BLINDING_invert_ex__imp__BN_BLINDING_new__imp__BN_BLINDING_set_flags__imp__BN_BLINDING_set_thread_id__imp__BN_BLINDING_update__imp__BN_CTX_end__imp__BN_CTX_free__imp__BN_CTX_get__imp__BN_CTX_init__imp__BN_CTX_new__imp__BN_CTX_start__imp__BN_GENCB_call__imp__BN_GF2m_add__imp__BN_GF2m_arr2poly__imp__BN_GF2m_mod__imp__BN_GF2m_mod_arr__imp__BN_GF2m_mod_div__imp__BN_GF2m_mod_div_arr__imp__BN_GF2m_mod_exp__imp__BN_GF2m_mod_exp_arr__imp__BN_GF2m_mod_inv__imp__BN_GF2m_mod_inv_arr__imp__BN_GF2m_mod_mul__imp__BN_GF2m_mod_mul_arr__imp__BN_GF2m_mod_solve_quad__imp__BN_GF2m_mod_solve_quad_arr__imp__BN_GF2m_mod_sqr__imp__BN_GF2m_mod_sqr_arr__imp__BN_GF2m_mod_sqrt__imp__BN_GF2m_mod_sqrt_arr__imp__BN_GF2m_poly2arr__imp__BN_MONT_CTX_copy__imp__BN_MONT_CTX_free__imp__BN_MONT_CTX_init__imp__BN_MONT_CTX_new__imp__BN_MONT_CTX_set__imp__BN_MONT_CTX_set_locked__imp__BN_RECP_CTX_free__imp__BN_RECP_CTX_init__imp__BN_RECP_CTX_new__imp__BN_RECP_CTX_set__imp__BN_X931_derive_prime_ex__imp__BN_X931_generate_Xpq__imp__BN_X931_generate_prime_ex__imp__BN_add__imp__BN_add_word__imp__BN_bin2bn__imp__BN_bn2bin__imp__BN_bn2dec__imp__BN_bn2hex__imp__BN_bn2mpi__imp__BN_bntest_rand__imp__BN_clear__imp__BN_clear_bit__imp__BN_clear_free__imp__BN_cmp__imp__BN_copy__imp__BN_dec2bn__imp__BN_div__imp__BN_div_recp__imp__BN_div_word__imp__BN_dup__imp__BN_exp__imp__BN_free__imp__BN_from_montgomery__imp__BN_gcd__imp__BN_generate_prime__imp__BN_generate_prime_ex__imp__BN_get0_nist_prime_192__imp__BN_get0_nist_prime_224__imp__BN_get0_nist_prime_256__imp__BN_get0_nist_prime_384__imp__BN_get0_nist_prime_521__imp__BN_get_params__imp__BN_get_word__imp__BN_hex2bn__imp__BN_init__imp__BN_is_bit_set__imp__BN_is_prime__imp__BN_is_prime_ex__imp__BN_is_prime_fasttest__imp__BN_is_prime_fasttest_ex__imp__BN_kronecker__imp__BN_lshift__imp__BN_lshift1__imp__BN_mask_bits__imp__BN_mod_add__imp__BN_mod_add_quick__imp__BN_mod_exp__imp__BN_mod_exp2_mont__imp__BN_mod_exp_mont__imp__BN_mod_exp_mont_consttime__imp__BN_mod_exp_mont_word__imp__BN_mod_exp_recp__imp__BN_mod_exp_simple__imp__BN_mod_inverse__imp__BN_mod_lshift__imp__BN_mod_lshift1__imp__BN_mod_lshift1_quick__imp__BN_mod_lshift_quick__imp__BN_mod_mul__imp__BN_mod_mul_montgomery__imp__BN_mod_mul_reciprocal__imp__BN_mod_sqr__imp__BN_mod_sqrt__imp__BN_mod_sub__imp__BN_mod_sub_quick__imp__BN_mod_word__imp__BN_mpi2bn__imp__BN_mul__imp__BN_mul_word__imp__BN_new__imp__BN_nist_mod_192__imp__BN_nist_mod_224__imp__BN_nist_mod_256__imp__BN_nist_mod_384__imp__BN_nist_mod_521__imp__BN_nnmod__imp__BN_num_bits__imp__BN_num_bits_word__imp__BN_options__imp__BN_print__imp__BN_print_fp__imp__BN_pseudo_rand__imp__BN_pseudo_rand_range__imp__BN_rand__imp__BN_rand_range__imp__BN_reciprocal__imp__BN_rshift__imp__BN_rshift1__imp__BN_set_bit__imp__BN_set_negative__imp__BN_set_params__imp__BN_set_word__imp__BN_sqr__imp__BN_sub__imp__BN_sub_word__imp__BN_swap__imp__BN_to_ASN1_ENUMERATED__imp__BN_to_ASN1_INTEGER__imp__BN_uadd__imp__BN_ucmp__imp__BN_usub__imp__BN_value_one__imp__BUF_MEM_free__imp__BUF_MEM_grow__imp__BUF_MEM_grow_clean__imp__BUF_MEM_new__imp__BUF_memdup__imp__BUF_strdup__imp__BUF_strlcat__imp__BUF_strlcpy__imp__BUF_strndup__imp__CAST_cbc_encrypt__imp__CAST_cfb64_encrypt__imp__CAST_decrypt__imp__CAST_ecb_encrypt__imp__CAST_encrypt__imp__CAST_ofb64_encrypt__imp__CAST_set_key__imp__CBIGNUM_it__imp__CERTIFICATEPOLICIES_free__imp__CERTIFICATEPOLICIES_it__imp__CERTIFICATEPOLICIES_new__imp__COMP_CTX_free__imp__COMP_CTX_new__imp__COMP_compress_block__imp__COMP_expand_block__imp__COMP_rle__imp__COMP_zlib__imp__COMP_zlib_cleanup__imp__CONF_dump_bio__imp__CONF_dump_fp__imp__CONF_free__imp__CONF_get1_default_config_file__imp__CONF_get_number__imp__CONF_get_section__imp__CONF_get_string__imp__CONF_imodule_get_flags__imp__CONF_imodule_get_module__imp__CONF_imodule_get_name__imp__CONF_imodule_get_usr_data__imp__CONF_imodule_get_value__imp__CONF_imodule_set_flags__imp__CONF_imodule_set_usr_data__imp__CONF_load__imp__CONF_load_bio__imp__CONF_load_fp__imp__CONF_module_add__imp__CONF_module_get_usr_data__imp__CONF_module_set_usr_data__imp__CONF_modules_finish__imp__CONF_modules_free__imp__CONF_modules_load__imp__CONF_modules_load_file__imp__CONF_modules_unload__imp__CONF_parse_list__imp__CONF_set_default_method__imp__CONF_set_nconf__imp__CRL_DIST_POINTS_free__imp__CRL_DIST_POINTS_it__imp__CRL_DIST_POINTS_new__imp__CRYPTO_add_lock__imp__CRYPTO_cleanup_all_ex_data__imp__CRYPTO_dbg_free__imp__CRYPTO_dbg_get_options__imp__CRYPTO_dbg_malloc__imp__CRYPTO_dbg_pop_info__imp__CRYPTO_dbg_push_info__imp__CRYPTO_dbg_realloc__imp__CRYPTO_dbg_remove_all_info__imp__CRYPTO_dbg_set_options__imp__CRYPTO_destroy_dynlockid__imp__CRYPTO_dup_ex_data__imp__CRYPTO_ex_data_new_class__imp__CRYPTO_free__imp__CRYPTO_free_ex_data__imp__CRYPTO_free_locked__imp__CRYPTO_get_add_lock_callback__imp__CRYPTO_get_dynlock_create_callback__imp__CRYPTO_get_dynlock_destroy_callback__imp__CRYPTO_get_dynlock_lock_callback__imp__CRYPTO_get_dynlock_value__imp__CRYPTO_get_ex_data__imp__CRYPTO_get_ex_data_implementation__imp__CRYPTO_get_ex_new_index__imp__CRYPTO_get_id_callback__imp__CRYPTO_get_lock_name__imp__CRYPTO_get_locked_mem_ex_functions__imp__CRYPTO_get_locked_mem_functions__imp__CRYPTO_get_locking_callback__imp__CRYPTO_get_mem_debug_functions__imp__CRYPTO_get_mem_debug_options__imp__CRYPTO_get_mem_ex_functions__imp__CRYPTO_get_mem_functions__imp__CRYPTO_get_new_dynlockid__imp__CRYPTO_get_new_lockid__imp__CRYPTO_is_mem_check_on__imp__CRYPTO_lock__imp__CRYPTO_malloc__imp__CRYPTO_malloc_debug_init__imp__CRYPTO_malloc_locked__imp__CRYPTO_mem_ctrl__imp__CRYPTO_mem_leaks__imp__CRYPTO_mem_leaks_cb__imp__CRYPTO_mem_leaks_fp__imp__CRYPTO_new_ex_data__imp__CRYPTO_num_locks__imp__CRYPTO_pop_info__imp__CRYPTO_push_info___imp__CRYPTO_realloc__imp__CRYPTO_realloc_clean__imp__CRYPTO_remalloc__imp__CRYPTO_remove_all_info__imp__CRYPTO_set_add_lock_callback__imp__CRYPTO_set_dynlock_create_callback__imp__CRYPTO_set_dynlock_destroy_callback__imp__CRYPTO_set_dynlock_lock_callback__imp__CRYPTO_set_ex_data__imp__CRYPTO_set_ex_data_implementation__imp__CRYPTO_set_id_callback__imp__CRYPTO_set_locked_mem_ex_functions__imp__CRYPTO_set_locked_mem_functions__imp__CRYPTO_set_locking_callback__imp__CRYPTO_set_mem_debug_functions__imp__CRYPTO_set_mem_debug_options__imp__CRYPTO_set_mem_ex_functions__imp__CRYPTO_set_mem_functions__imp__CRYPTO_set_mem_info_functions__imp__CRYPTO_strdup__imp__CRYPTO_thread_id__imp__DES_cbc_cksum__imp__DES_cbc_encrypt__imp__DES_cfb64_encrypt__imp__DES_cfb_encrypt__imp__DES_check_key_parity__imp__DES_crypt__imp__DES_decrypt3__imp__DES_ecb3_encrypt__imp__DES_ecb_encrypt__imp__DES_ede3_cbc_encrypt__imp__DES_ede3_cbcm_encrypt__imp__DES_ede3_cfb64_encrypt__imp__DES_ede3_cfb_encrypt__imp__DES_ede3_ofb64_encrypt__imp__DES_enc_read__imp__DES_enc_write__imp__DES_encrypt1__imp__DES_encrypt2__imp__DES_encrypt3__imp__DES_fcrypt__imp__DES_is_weak_key__imp__DES_key_sched__imp__DES_ncbc_encrypt__imp__DES_ofb64_encrypt__imp__DES_ofb_encrypt__imp__DES_options__imp__DES_pcbc_encrypt__imp__DES_quad_cksum__imp__DES_random_key__imp__DES_read_2passwords__imp__DES_read_password__imp__DES_set_key__imp__DES_set_key_checked__imp__DES_set_key_unchecked__imp__DES_set_odd_parity__imp__DES_string_to_2keys__imp__DES_string_to_key__imp__DES_xcbc_encrypt__imp__DH_OpenSSL__imp__DH_check__imp__DH_check_pub_key__imp__DH_compute_key__imp__DH_free__imp__DH_generate_key__imp__DH_generate_parameters__imp__DH_generate_parameters_ex__imp__DH_get_default_method__imp__DH_get_ex_data__imp__DH_get_ex_new_index__imp__DH_new__imp__DH_new_method__imp__DH_set_default_method__imp__DH_set_ex_data__imp__DH_set_method__imp__DH_size__imp__DH_up_ref__imp__DHparams_print__imp__DHparams_print_fp__imp__DIRECTORYSTRING_free__imp__DIRECTORYSTRING_it__imp__DIRECTORYSTRING_new__imp__DISPLAYTEXT_free__imp__DISPLAYTEXT_it__imp__DISPLAYTEXT_new__imp__DIST_POINT_NAME_free__imp__DIST_POINT_NAME_it__imp__DIST_POINT_NAME_new__imp__DIST_POINT_free__imp__DIST_POINT_it__imp__DIST_POINT_new__imp__DSA_OpenSSL__imp__DSA_SIG_free__imp__DSA_SIG_new__imp__DSA_do_sign__imp__DSA_do_verify__imp__DSA_dup_DH__imp__DSA_free__imp__DSA_generate_key__imp__DSA_generate_parameters__imp__DSA_generate_parameters_ex__imp__DSA_get_default_method__imp__DSA_get_ex_data__imp__DSA_get_ex_new_index__imp__DSA_new__imp__DSA_new_method__imp__DSA_print__imp__DSA_print_fp__imp__DSA_set_default_method__imp__DSA_set_ex_data__imp__DSA_set_method__imp__DSA_sign__imp__DSA_sign_setup__imp__DSA_size__imp__DSA_up_ref__imp__DSA_verify__imp__DSAparams_print__imp__DSAparams_print_fp__imp__DSO_METHOD_dl__imp__DSO_METHOD_dlfcn__imp__DSO_METHOD_null__imp__DSO_METHOD_openssl__imp__DSO_METHOD_vms__imp__DSO_METHOD_win32__imp__DSO_bind_func__imp__DSO_bind_var__imp__DSO_convert_filename__imp__DSO_ctrl__imp__DSO_flags__imp__DSO_free__imp__DSO_get_default_method__imp__DSO_get_filename__imp__DSO_get_loaded_filename__imp__DSO_get_method__imp__DSO_load__imp__DSO_merge__imp__DSO_new__imp__DSO_new_method__imp__DSO_set_default_method__imp__DSO_set_filename__imp__DSO_set_method__imp__DSO_set_name_converter__imp__DSO_up_ref__imp__ECDH_OpenSSL__imp__ECDH_compute_key__imp__ECDH_get_default_method__imp__ECDH_get_ex_data__imp__ECDH_get_ex_new_index__imp__ECDH_set_default_method__imp__ECDH_set_ex_data__imp__ECDH_set_method__imp__ECDSA_OpenSSL__imp__ECDSA_SIG_free__imp__ECDSA_SIG_new__imp__ECDSA_do_sign__imp__ECDSA_do_sign_ex__imp__ECDSA_do_verify__imp__ECDSA_get_default_method__imp__ECDSA_get_ex_data__imp__ECDSA_get_ex_new_index__imp__ECDSA_set_default_method__imp__ECDSA_set_ex_data__imp__ECDSA_set_method__imp__ECDSA_sign__imp__ECDSA_sign_ex__imp__ECDSA_sign_setup__imp__ECDSA_size__imp__ECDSA_verify__imp__ECPKParameters_print__imp__ECPKParameters_print_fp__imp__ECParameters_print__imp__ECParameters_print_fp__imp__EC_GF2m_simple_method__imp__EC_GFp_mont_method__imp__EC_GFp_nist_method__imp__EC_GFp_simple_method__imp__EC_GROUP_check__imp__EC_GROUP_check_discriminant__imp__EC_GROUP_clear_free__imp__EC_GROUP_cmp__imp__EC_GROUP_copy__imp__EC_GROUP_dup__imp__EC_GROUP_free__imp__EC_GROUP_get0_generator__imp__EC_GROUP_get0_seed__imp__EC_GROUP_get_asn1_flag__imp__EC_GROUP_get_basis_type__imp__EC_GROUP_get_cofactor__imp__EC_GROUP_get_curve_GF2m__imp__EC_GROUP_get_curve_GFp__imp__EC_GROUP_get_curve_name__imp__EC_GROUP_get_degree__imp__EC_GROUP_get_order__imp__EC_GROUP_get_pentanomial_basis__imp__EC_GROUP_get_point_conversion_form__imp__EC_GROUP_get_seed_len__imp__EC_GROUP_get_trinomial_basis__imp__EC_GROUP_have_precompute_mult__imp__EC_GROUP_method_of__imp__EC_GROUP_new__imp__EC_GROUP_new_by_curve_name__imp__EC_GROUP_new_curve_GF2m__imp__EC_GROUP_new_curve_GFp__imp__EC_GROUP_precompute_mult__imp__EC_GROUP_set_asn1_flag__imp__EC_GROUP_set_curve_GF2m__imp__EC_GROUP_set_curve_GFp__imp__EC_GROUP_set_curve_name__imp__EC_GROUP_set_generator__imp__EC_GROUP_set_point_conversion_form__imp__EC_GROUP_set_seed__imp__EC_KEY_check_key__imp__EC_KEY_copy__imp__EC_KEY_dup__imp__EC_KEY_free__imp__EC_KEY_generate_key__imp__EC_KEY_get0_group__imp__EC_KEY_get0_private_key__imp__EC_KEY_get0_public_key__imp__EC_KEY_get_conv_form__imp__EC_KEY_get_enc_flags__imp__EC_KEY_get_key_method_data__imp__EC_KEY_insert_key_method_data__imp__EC_KEY_new__imp__EC_KEY_new_by_curve_name__imp__EC_KEY_precompute_mult__imp__EC_KEY_print__imp__EC_KEY_print_fp__imp__EC_KEY_set_asn1_flag__imp__EC_KEY_set_conv_form__imp__EC_KEY_set_enc_flags__imp__EC_KEY_set_group__imp__EC_KEY_set_private_key__imp__EC_KEY_set_public_key__imp__EC_KEY_up_ref__imp__EC_METHOD_get_field_type__imp__EC_POINT_add__imp__EC_POINT_bn2point__imp__EC_POINT_clear_free__imp__EC_POINT_cmp__imp__EC_POINT_copy__imp__EC_POINT_dbl__imp__EC_POINT_dup__imp__EC_POINT_free__imp__EC_POINT_get_Jprojective_coordinates_GFp__imp__EC_POINT_get_affine_coordinates_GF2m__imp__EC_POINT_get_affine_coordinates_GFp__imp__EC_POINT_hex2point__imp__EC_POINT_invert__imp__EC_POINT_is_at_infinity__imp__EC_POINT_is_on_curve__imp__EC_POINT_make_affine__imp__EC_POINT_method_of__imp__EC_POINT_mul__imp__EC_POINT_new__imp__EC_POINT_oct2point__imp__EC_POINT_point2bn__imp__EC_POINT_point2hex__imp__EC_POINT_point2oct__imp__EC_POINT_set_Jprojective_coordinates_GFp__imp__EC_POINT_set_affine_coordinates_GF2m__imp__EC_POINT_set_affine_coordinates_GFp__imp__EC_POINT_set_compressed_coordinates_GF2m__imp__EC_POINT_set_compressed_coordinates_GFp__imp__EC_POINT_set_to_infinity__imp__EC_POINTs_make_affine__imp__EC_POINTs_mul__imp__EC_get_builtin_curves__imp__EDIPARTYNAME_free__imp__EDIPARTYNAME_it__imp__EDIPARTYNAME_new__imp__ENGINE_add__imp__ENGINE_add_conf_module__imp__ENGINE_by_id__imp__ENGINE_cleanup__imp__ENGINE_cmd_is_executable__imp__ENGINE_ctrl__imp__ENGINE_ctrl_cmd__imp__ENGINE_ctrl_cmd_string__imp__ENGINE_finish__imp__ENGINE_free__imp__ENGINE_get_DH__imp__ENGINE_get_DSA__imp__ENGINE_get_ECDH__imp__ENGINE_get_ECDSA__imp__ENGINE_get_RAND__imp__ENGINE_get_RSA__imp__ENGINE_get_STORE__imp__ENGINE_get_cipher__imp__ENGINE_get_cipher_engine__imp__ENGINE_get_ciphers__imp__ENGINE_get_cmd_defns__imp__ENGINE_get_ctrl_function__imp__ENGINE_get_default_DH__imp__ENGINE_get_default_DSA__imp__ENGINE_get_default_ECDH__imp__ENGINE_get_default_ECDSA__imp__ENGINE_get_default_RAND__imp__ENGINE_get_default_RSA__imp__ENGINE_get_destroy_function__imp__ENGINE_get_digest__imp__ENGINE_get_digest_engine__imp__ENGINE_get_digests__imp__ENGINE_get_ex_data__imp__ENGINE_get_ex_new_index__imp__ENGINE_get_finish_function__imp__ENGINE_get_first__imp__ENGINE_get_flags__imp__ENGINE_get_id__imp__ENGINE_get_init_function__imp__ENGINE_get_last__imp__ENGINE_get_load_privkey_function__imp__ENGINE_get_load_pubkey_function__imp__ENGINE_get_name__imp__ENGINE_get_next__imp__ENGINE_get_prev__imp__ENGINE_get_ssl_client_cert_function__imp__ENGINE_get_static_state__imp__ENGINE_get_table_flags__imp__ENGINE_init__imp__ENGINE_load_4758cca__imp__ENGINE_load_aep__imp__ENGINE_load_atalla__imp__ENGINE_load_builtin_engines__imp__ENGINE_load_chil__imp__ENGINE_load_cryptodev__imp__ENGINE_load_cswift__imp__ENGINE_load_dynamic__imp__ENGINE_load_nuron__imp__ENGINE_load_openssl__imp__ENGINE_load_padlock__imp__ENGINE_load_private_key__imp__ENGINE_load_public_key__imp__ENGINE_load_ssl_client_cert__imp__ENGINE_load_sureware__imp__ENGINE_load_ubsec__imp__ENGINE_new__imp__ENGINE_register_DH__imp__ENGINE_register_DSA__imp__ENGINE_register_ECDH__imp__ENGINE_register_ECDSA__imp__ENGINE_register_RAND__imp__ENGINE_register_RSA__imp__ENGINE_register_STORE__imp__ENGINE_register_all_DH__imp__ENGINE_register_all_DSA__imp__ENGINE_register_all_ECDH__imp__ENGINE_register_all_ECDSA__imp__ENGINE_register_all_RAND__imp__ENGINE_register_all_RSA__imp__ENGINE_register_all_STORE__imp__ENGINE_register_all_ciphers__imp__ENGINE_register_all_complete__imp__ENGINE_register_all_digests__imp__ENGINE_register_ciphers__imp__ENGINE_register_complete__imp__ENGINE_register_digests__imp__ENGINE_remove__imp__ENGINE_set_DH__imp__ENGINE_set_DSA__imp__ENGINE_set_ECDH__imp__ENGINE_set_ECDSA__imp__ENGINE_set_RAND__imp__ENGINE_set_RSA__imp__ENGINE_set_STORE__imp__ENGINE_set_ciphers__imp__ENGINE_set_cmd_defns__imp__ENGINE_set_ctrl_function__imp__ENGINE_set_default__imp__ENGINE_set_default_DH__imp__ENGINE_set_default_DSA__imp__ENGINE_set_default_ECDH__imp__ENGINE_set_default_ECDSA__imp__ENGINE_set_default_RAND__imp__ENGINE_set_default_RSA__imp__ENGINE_set_default_ciphers__imp__ENGINE_set_default_digests__imp__ENGINE_set_default_string__imp__ENGINE_set_destroy_function__imp__ENGINE_set_digests__imp__ENGINE_set_ex_data__imp__ENGINE_set_finish_function__imp__ENGINE_set_flags__imp__ENGINE_set_id__imp__ENGINE_set_init_function__imp__ENGINE_set_load_privkey_function__imp__ENGINE_set_load_pubkey_function__imp__ENGINE_set_load_ssl_client_cert_function__imp__ENGINE_set_name__imp__ENGINE_set_table_flags__imp__ENGINE_unregister_DH__imp__ENGINE_unregister_DSA__imp__ENGINE_unregister_ECDH__imp__ENGINE_unregister_ECDSA__imp__ENGINE_unregister_RAND__imp__ENGINE_unregister_RSA__imp__ENGINE_unregister_STORE__imp__ENGINE_unregister_ciphers__imp__ENGINE_unregister_digests__imp__ENGINE_up_ref__imp__ERR_add_error_data__imp__ERR_clear_error__imp__ERR_error_string__imp__ERR_error_string_n__imp__ERR_free_strings__imp__ERR_func_error_string__imp__ERR_get_err_state_table__imp__ERR_get_error__imp__ERR_get_error_line__imp__ERR_get_error_line_data__imp__ERR_get_implementation__imp__ERR_get_next_error_library__imp__ERR_get_state__imp__ERR_get_string_table__imp__ERR_lib_error_string__imp__ERR_load_ASN1_strings__imp__ERR_load_BIO_strings__imp__ERR_load_BN_strings__imp__ERR_load_BUF_strings__imp__ERR_load_COMP_strings__imp__ERR_load_CONF_strings__imp__ERR_load_CRYPTO_strings__imp__ERR_load_DH_strings__imp__ERR_load_DSA_strings__imp__ERR_load_DSO_strings__imp__ERR_load_ECDH_strings__imp__ERR_load_ECDSA_strings__imp__ERR_load_EC_strings__imp__ERR_load_ENGINE_strings__imp__ERR_load_ERR_strings__imp__ERR_load_EVP_strings__imp__ERR_load_OBJ_strings__imp__ERR_load_OCSP_strings__imp__ERR_load_PEM_strings__imp__ERR_load_PKCS12_strings__imp__ERR_load_PKCS7_strings__imp__ERR_load_RAND_strings__imp__ERR_load_RSA_strings__imp__ERR_load_STORE_strings__imp__ERR_load_UI_strings__imp__ERR_load_X509V3_strings__imp__ERR_load_X509_strings__imp__ERR_load_crypto_strings__imp__ERR_load_strings__imp__ERR_peek_error__imp__ERR_peek_error_line__imp__ERR_peek_error_line_data__imp__ERR_peek_last_error__imp__ERR_peek_last_error_line__imp__ERR_peek_last_error_line_data__imp__ERR_pop_to_mark__imp__ERR_print_errors__imp__ERR_print_errors_cb__imp__ERR_print_errors_fp__imp__ERR_put_error__imp__ERR_reason_error_string__imp__ERR_release_err_state_table__imp__ERR_remove_state__imp__ERR_set_error_data__imp__ERR_set_implementation__imp__ERR_set_mark__imp__ERR_unload_strings__imp__EVP_BytesToKey__imp__EVP_CIPHER_CTX_block_size__imp__EVP_CIPHER_CTX_cipher__imp__EVP_CIPHER_CTX_cleanup__imp__EVP_CIPHER_CTX_clear_flags__imp__EVP_CIPHER_CTX_ctrl__imp__EVP_CIPHER_CTX_flags__imp__EVP_CIPHER_CTX_free__imp__EVP_CIPHER_CTX_get_app_data__imp__EVP_CIPHER_CTX_init__imp__EVP_CIPHER_CTX_iv_length__imp__EVP_CIPHER_CTX_key_length__imp__EVP_CIPHER_CTX_new__imp__EVP_CIPHER_CTX_nid__imp__EVP_CIPHER_CTX_rand_key__imp__EVP_CIPHER_CTX_set_app_data__imp__EVP_CIPHER_CTX_set_flags__imp__EVP_CIPHER_CTX_set_key_length__imp__EVP_CIPHER_CTX_set_padding__imp__EVP_CIPHER_CTX_test_flags__imp__EVP_CIPHER_asn1_to_param__imp__EVP_CIPHER_block_size__imp__EVP_CIPHER_flags__imp__EVP_CIPHER_get_asn1_iv__imp__EVP_CIPHER_iv_length__imp__EVP_CIPHER_key_length__imp__EVP_CIPHER_nid__imp__EVP_CIPHER_param_to_asn1__imp__EVP_CIPHER_set_asn1_iv__imp__EVP_CIPHER_type__imp__EVP_Cipher__imp__EVP_CipherFinal__imp__EVP_CipherFinal_ex__imp__EVP_CipherInit__imp__EVP_CipherInit_ex__imp__EVP_CipherUpdate__imp__EVP_DecodeBlock__imp__EVP_DecodeFinal__imp__EVP_DecodeInit__imp__EVP_DecodeUpdate__imp__EVP_DecryptFinal__imp__EVP_DecryptFinal_ex__imp__EVP_DecryptInit__imp__EVP_DecryptInit_ex__imp__EVP_DecryptUpdate__imp__EVP_Digest__imp__EVP_DigestFinal__imp__EVP_DigestFinal_ex__imp__EVP_DigestInit__imp__EVP_DigestInit_ex__imp__EVP_DigestUpdate__imp__EVP_EncodeBlock__imp__EVP_EncodeFinal__imp__EVP_EncodeInit__imp__EVP_EncodeUpdate__imp__EVP_EncryptFinal__imp__EVP_EncryptFinal_ex__imp__EVP_EncryptInit__imp__EVP_EncryptInit_ex__imp__EVP_EncryptUpdate__imp__EVP_MD_CTX_cleanup__imp__EVP_MD_CTX_clear_flags__imp__EVP_MD_CTX_copy__imp__EVP_MD_CTX_copy_ex__imp__EVP_MD_CTX_create__imp__EVP_MD_CTX_destroy__imp__EVP_MD_CTX_init__imp__EVP_MD_CTX_md__imp__EVP_MD_CTX_set_flags__imp__EVP_MD_CTX_test_flags__imp__EVP_MD_block_size__imp__EVP_MD_pkey_type__imp__EVP_MD_size__imp__EVP_MD_type__imp__EVP_OpenFinal__imp__EVP_OpenInit__imp__EVP_PBE_CipherInit__imp__EVP_PBE_alg_add__imp__EVP_PBE_cleanup__imp__EVP_PKCS82PKEY__imp__EVP_PKEY2PKCS8__imp__EVP_PKEY2PKCS8_broken__imp__EVP_PKEY_add1_attr__imp__EVP_PKEY_add1_attr_by_NID__imp__EVP_PKEY_add1_attr_by_OBJ__imp__EVP_PKEY_add1_attr_by_txt__imp__EVP_PKEY_assign__imp__EVP_PKEY_bits__imp__EVP_PKEY_cmp__imp__EVP_PKEY_cmp_parameters__imp__EVP_PKEY_copy_parameters__imp__EVP_PKEY_decrypt__imp__EVP_PKEY_delete_attr__imp__EVP_PKEY_encrypt__imp__EVP_PKEY_free__imp__EVP_PKEY_get1_DH__imp__EVP_PKEY_get1_DSA__imp__EVP_PKEY_get1_EC_KEY__imp__EVP_PKEY_get1_RSA__imp__EVP_PKEY_get_attr__imp__EVP_PKEY_get_attr_by_NID__imp__EVP_PKEY_get_attr_by_OBJ__imp__EVP_PKEY_get_attr_count__imp__EVP_PKEY_missing_parameters__imp__EVP_PKEY_new__imp__EVP_PKEY_save_parameters__imp__EVP_PKEY_set1_DH__imp__EVP_PKEY_set1_DSA__imp__EVP_PKEY_set1_EC_KEY__imp__EVP_PKEY_set1_RSA__imp__EVP_PKEY_size__imp__EVP_PKEY_type__imp__EVP_SealFinal__imp__EVP_SealInit__imp__EVP_SignFinal__imp__EVP_VerifyFinal__imp__EVP_add_alg_module__imp__EVP_add_cipher__imp__EVP_add_digest__imp__EVP_aes_128_cbc__imp__EVP_aes_128_cfb1__imp__EVP_aes_128_cfb128__imp__EVP_aes_128_cfb8__imp__EVP_aes_128_ecb__imp__EVP_aes_128_ofb__imp__EVP_aes_192_cbc__imp__EVP_aes_192_cfb1__imp__EVP_aes_192_cfb128__imp__EVP_aes_192_cfb8__imp__EVP_aes_192_ecb__imp__EVP_aes_192_ofb__imp__EVP_aes_256_cbc__imp__EVP_aes_256_cfb1__imp__EVP_aes_256_cfb128__imp__EVP_aes_256_cfb8__imp__EVP_aes_256_ecb__imp__EVP_aes_256_ofb__imp__EVP_bf_cbc__imp__EVP_bf_cfb64__imp__EVP_bf_ecb__imp__EVP_bf_ofb__imp__EVP_cast5_cbc__imp__EVP_cast5_cfb64__imp__EVP_cast5_ecb__imp__EVP_cast5_ofb__imp__EVP_cleanup__imp__EVP_des_cbc__imp__EVP_des_cfb1__imp__EVP_des_cfb64__imp__EVP_des_cfb8__imp__EVP_des_ecb__imp__EVP_des_ede__imp__EVP_des_ede3__imp__EVP_des_ede3_cbc__imp__EVP_des_ede3_cfb1__imp__EVP_des_ede3_cfb64__imp__EVP_des_ede3_cfb8__imp__EVP_des_ede3_ecb__imp__EVP_des_ede3_ofb__imp__EVP_des_ede_cbc__imp__EVP_des_ede_cfb64__imp__EVP_des_ede_ecb__imp__EVP_des_ede_ofb__imp__EVP_des_ofb__imp__EVP_desx_cbc__imp__EVP_dss__imp__EVP_dss1__imp__EVP_ecdsa__imp__EVP_enc_null__imp__EVP_get_cipherbyname__imp__EVP_get_digestbyname__imp__EVP_get_pw_prompt__imp__EVP_idea_cbc__imp__EVP_idea_cfb64__imp__EVP_idea_ecb__imp__EVP_idea_ofb__imp__EVP_md2__imp__EVP_md4__imp__EVP_md5__imp__EVP_md_null__imp__EVP_rc2_40_cbc__imp__EVP_rc2_64_cbc__imp__EVP_rc2_cbc__imp__EVP_rc2_cfb64__imp__EVP_rc2_ecb__imp__EVP_rc2_ofb__imp__EVP_rc4__imp__EVP_rc4_40__imp__EVP_read_pw_string__imp__EVP_ripemd160__imp__EVP_set_pw_prompt__imp__EVP_sha__imp__EVP_sha1__imp__EVP_sha224__imp__EVP_sha256__imp__EVP_sha384__imp__EVP_sha512__imp__EXTENDED_KEY_USAGE_free__imp__EXTENDED_KEY_USAGE_it__imp__EXTENDED_KEY_USAGE_new__imp__GENERAL_NAMES_free__imp__GENERAL_NAMES_it__imp__GENERAL_NAMES_new__imp__GENERAL_NAME_free__imp__GENERAL_NAME_it__imp__GENERAL_NAME_new__imp__GENERAL_NAME_print__imp__GENERAL_SUBTREE_free__imp__GENERAL_SUBTREE_it__imp__GENERAL_SUBTREE_new__imp__HMAC__imp__HMAC_CTX_cleanup__imp__HMAC_CTX_init__imp__HMAC_CTX_set_flags__imp__HMAC_Final__imp__HMAC_Init__imp__HMAC_Init_ex__imp__HMAC_Update__imp__KRB5_APREQBODY_free__imp__KRB5_APREQBODY_it__imp__KRB5_APREQBODY_new__imp__KRB5_APREQ_free__imp__KRB5_APREQ_it__imp__KRB5_APREQ_new__imp__KRB5_AUTHDATA_free__imp__KRB5_AUTHDATA_it__imp__KRB5_AUTHDATA_new__imp__KRB5_AUTHENTBODY_free__imp__KRB5_AUTHENTBODY_it__imp__KRB5_AUTHENTBODY_new__imp__KRB5_AUTHENT_free__imp__KRB5_AUTHENT_it__imp__KRB5_AUTHENT_new__imp__KRB5_CHECKSUM_free__imp__KRB5_CHECKSUM_it__imp__KRB5_CHECKSUM_new__imp__KRB5_ENCDATA_free__imp__KRB5_ENCDATA_it__imp__KRB5_ENCDATA_new__imp__KRB5_ENCKEY_free__imp__KRB5_ENCKEY_it__imp__KRB5_ENCKEY_new__imp__KRB5_PRINCNAME_free__imp__KRB5_PRINCNAME_it__imp__KRB5_PRINCNAME_new__imp__KRB5_TICKET_free__imp__KRB5_TICKET_it__imp__KRB5_TICKET_new__imp__KRB5_TKTBODY_free__imp__KRB5_TKTBODY_it__imp__KRB5_TKTBODY_new__imp__LONG_it__imp__MD2__imp__MD2_Final__imp__MD2_Init__imp__MD2_Update__imp__MD2_options__imp__MD4__imp__MD4_Final__imp__MD4_Init__imp__MD4_Transform__imp__MD4_Update__imp__MD5__imp__MD5_Final__imp__MD5_Init__imp__MD5_Transform__imp__MD5_Update__imp__NAME_CONSTRAINTS_free__imp__NAME_CONSTRAINTS_it__imp__NAME_CONSTRAINTS_new__imp__NCONF_WIN32__imp__NCONF_default__imp__NCONF_dump_bio__imp__NCONF_dump_fp__imp__NCONF_free__imp__NCONF_free_data__imp__NCONF_get_number_e__imp__NCONF_get_section__imp__NCONF_get_string__imp__NCONF_load__imp__NCONF_load_bio__imp__NCONF_load_fp__imp__NCONF_new__imp__NETSCAPE_CERT_SEQUENCE_free__imp__NETSCAPE_CERT_SEQUENCE_it__imp__NETSCAPE_CERT_SEQUENCE_new__imp__NETSCAPE_SPKAC_free__imp__NETSCAPE_SPKAC_it__imp__NETSCAPE_SPKAC_new__imp__NETSCAPE_SPKI_b64_decode__imp__NETSCAPE_SPKI_b64_encode__imp__NETSCAPE_SPKI_free__imp__NETSCAPE_SPKI_get_pubkey__imp__NETSCAPE_SPKI_it__imp__NETSCAPE_SPKI_new__imp__NETSCAPE_SPKI_print__imp__NETSCAPE_SPKI_set_pubkey__imp__NETSCAPE_SPKI_sign__imp__NETSCAPE_SPKI_verify__imp__NOTICEREF_free__imp__NOTICEREF_it__imp__NOTICEREF_new__imp__OBJ_NAME_add__imp__OBJ_NAME_cleanup__imp__OBJ_NAME_do_all__imp__OBJ_NAME_do_all_sorted__imp__OBJ_NAME_get__imp__OBJ_NAME_init__imp__OBJ_NAME_new_index__imp__OBJ_NAME_remove__imp__OBJ_add_object__imp__OBJ_bsearch__imp__OBJ_bsearch_ex__imp__OBJ_cleanup__imp__OBJ_cmp__imp__OBJ_create__imp__OBJ_create_objects__imp__OBJ_dup__imp__OBJ_ln2nid__imp__OBJ_new_nid__imp__OBJ_nid2ln__imp__OBJ_nid2obj__imp__OBJ_nid2sn__imp__OBJ_obj2nid__imp__OBJ_obj2txt__imp__OBJ_sn2nid__imp__OBJ_txt2nid__imp__OBJ_txt2obj__imp__OCSP_BASICRESP_add1_ext_i2d__imp__OCSP_BASICRESP_add_ext__imp__OCSP_BASICRESP_delete_ext__imp__OCSP_BASICRESP_free__imp__OCSP_BASICRESP_get1_ext_d2i__imp__OCSP_BASICRESP_get_ext__imp__OCSP_BASICRESP_get_ext_by_NID__imp__OCSP_BASICRESP_get_ext_by_OBJ__imp__OCSP_BASICRESP_get_ext_by_critical__imp__OCSP_BASICRESP_get_ext_count__imp__OCSP_BASICRESP_it__imp__OCSP_BASICRESP_new__imp__OCSP_CERTID_free__imp__OCSP_CERTID_it__imp__OCSP_CERTID_new__imp__OCSP_CERTSTATUS_free__imp__OCSP_CERTSTATUS_it__imp__OCSP_CERTSTATUS_new__imp__OCSP_CRLID_free__imp__OCSP_CRLID_it__imp__OCSP_CRLID_new__imp__OCSP_ONEREQ_add1_ext_i2d__imp__OCSP_ONEREQ_add_ext__imp__OCSP_ONEREQ_delete_ext__imp__OCSP_ONEREQ_free__imp__OCSP_ONEREQ_get1_ext_d2i__imp__OCSP_ONEREQ_get_ext__imp__OCSP_ONEREQ_get_ext_by_NID__imp__OCSP_ONEREQ_get_ext_by_OBJ__imp__OCSP_ONEREQ_get_ext_by_critical__imp__OCSP_ONEREQ_get_ext_count__imp__OCSP_ONEREQ_it__imp__OCSP_ONEREQ_new__imp__OCSP_REQINFO_free__imp__OCSP_REQINFO_it__imp__OCSP_REQINFO_new__imp__OCSP_REQUEST_add1_ext_i2d__imp__OCSP_REQUEST_add_ext__imp__OCSP_REQUEST_delete_ext__imp__OCSP_REQUEST_free__imp__OCSP_REQUEST_get1_ext_d2i__imp__OCSP_REQUEST_get_ext__imp__OCSP_REQUEST_get_ext_by_NID__imp__OCSP_REQUEST_get_ext_by_OBJ__imp__OCSP_REQUEST_get_ext_by_critical__imp__OCSP_REQUEST_get_ext_count__imp__OCSP_REQUEST_it__imp__OCSP_REQUEST_new__imp__OCSP_REQUEST_print__imp__OCSP_REQ_CTX_free__imp__OCSP_RESPBYTES_free__imp__OCSP_RESPBYTES_it__imp__OCSP_RESPBYTES_new__imp__OCSP_RESPDATA_free__imp__OCSP_RESPDATA_it__imp__OCSP_RESPDATA_new__imp__OCSP_RESPID_free__imp__OCSP_RESPID_it__imp__OCSP_RESPID_new__imp__OCSP_RESPONSE_free__imp__OCSP_RESPONSE_it__imp__OCSP_RESPONSE_new__imp__OCSP_RESPONSE_print__imp__OCSP_REVOKEDINFO_free__imp__OCSP_REVOKEDINFO_it__imp__OCSP_REVOKEDINFO_new__imp__OCSP_SERVICELOC_free__imp__OCSP_SERVICELOC_it__imp__OCSP_SERVICELOC_new__imp__OCSP_SIGNATURE_free__imp__OCSP_SIGNATURE_it__imp__OCSP_SIGNATURE_new__imp__OCSP_SINGLERESP_add1_ext_i2d__imp__OCSP_SINGLERESP_add_ext__imp__OCSP_SINGLERESP_delete_ext__imp__OCSP_SINGLERESP_free__imp__OCSP_SINGLERESP_get1_ext_d2i__imp__OCSP_SINGLERESP_get_ext__imp__OCSP_SINGLERESP_get_ext_by_NID__imp__OCSP_SINGLERESP_get_ext_by_OBJ__imp__OCSP_SINGLERESP_get_ext_by_critical__imp__OCSP_SINGLERESP_get_ext_count__imp__OCSP_SINGLERESP_it__imp__OCSP_SINGLERESP_new__imp__OCSP_accept_responses_new__imp__OCSP_archive_cutoff_new__imp__OCSP_basic_add1_cert__imp__OCSP_basic_add1_nonce__imp__OCSP_basic_add1_status__imp__OCSP_basic_sign__imp__OCSP_basic_verify__imp__OCSP_cert_id_new__imp__OCSP_cert_status_str__imp__OCSP_cert_to_id__imp__OCSP_check_nonce__imp__OCSP_check_validity__imp__OCSP_copy_nonce__imp__OCSP_crlID_new__imp__OCSP_crl_reason_str__imp__OCSP_id_cmp__imp__OCSP_id_get0_info__imp__OCSP_id_issuer_cmp__imp__OCSP_onereq_get0_id__imp__OCSP_parse_url__imp__OCSP_request_add0_id__imp__OCSP_request_add1_cert__imp__OCSP_request_add1_nonce__imp__OCSP_request_is_signed__imp__OCSP_request_onereq_count__imp__OCSP_request_onereq_get0__imp__OCSP_request_set1_name__imp__OCSP_request_sign__imp__OCSP_request_verify__imp__OCSP_resp_count__imp__OCSP_resp_find__imp__OCSP_resp_find_status__imp__OCSP_resp_get0__imp__OCSP_response_create__imp__OCSP_response_get1_basic__imp__OCSP_response_status__imp__OCSP_response_status_str__imp__OCSP_sendreq_bio__imp__OCSP_sendreq_nbio__imp__OCSP_sendreq_new__imp__OCSP_single_get0_status__imp__OCSP_url_svcloc_new__imp__OPENSSL_DIR_end__imp__OPENSSL_DIR_read__imp__OPENSSL_add_all_algorithms_conf__imp__OPENSSL_add_all_algorithms_noconf__imp__OPENSSL_cleanse__imp__OPENSSL_config__imp__OPENSSL_ia32cap_loc__imp__OPENSSL_init__imp__OPENSSL_isservice__imp__OPENSSL_issetugid__imp__OPENSSL_load_builtin_modules__imp__OPENSSL_no_config__imp__OSSL_DES_version__imp__OSSL_libdes_version__imp__OTHERNAME_free__imp__OTHERNAME_it__imp__OTHERNAME_new__imp__OpenSSLDie__imp__OpenSSL_add_all_ciphers__imp__OpenSSL_add_all_digests__imp__PBE2PARAM_free__imp__PBE2PARAM_it__imp__PBE2PARAM_new__imp__PBEPARAM_free__imp__PBEPARAM_it__imp__PBEPARAM_new__imp__PBKDF2PARAM_free__imp__PBKDF2PARAM_it__imp__PBKDF2PARAM_new__imp__PEM_ASN1_read__imp__PEM_ASN1_read_bio__imp__PEM_ASN1_write__imp__PEM_ASN1_write_bio__imp__PEM_SealFinal__imp__PEM_SealInit__imp__PEM_SealUpdate__imp__PEM_SignFinal__imp__PEM_SignInit__imp__PEM_SignUpdate__imp__PEM_X509_INFO_read__imp__PEM_X509_INFO_read_bio__imp__PEM_X509_INFO_write_bio__imp__PEM_bytes_read_bio__imp__PEM_def_callback__imp__PEM_dek_info__imp__PEM_do_header__imp__PEM_get_EVP_CIPHER_INFO__imp__PEM_proc_type__imp__PEM_read__imp__PEM_read_DHparams__imp__PEM_read_DSAPrivateKey__imp__PEM_read_DSA_PUBKEY__imp__PEM_read_DSAparams__imp__PEM_read_ECPKParameters__imp__PEM_read_ECPrivateKey__imp__PEM_read_EC_PUBKEY__imp__PEM_read_NETSCAPE_CERT_SEQUENCE__imp__PEM_read_PKCS7__imp__PEM_read_PKCS8__imp__PEM_read_PKCS8_PRIV_KEY_INFO__imp__PEM_read_PUBKEY__imp__PEM_read_PrivateKey__imp__PEM_read_RSAPrivateKey__imp__PEM_read_RSAPublicKey__imp__PEM_read_RSA_PUBKEY__imp__PEM_read_X509__imp__PEM_read_X509_AUX__imp__PEM_read_X509_CERT_PAIR__imp__PEM_read_X509_CRL__imp__PEM_read_X509_REQ__imp__PEM_read_bio__imp__PEM_read_bio_DHparams__imp__PEM_read_bio_DSAPrivateKey__imp__PEM_read_bio_DSA_PUBKEY__imp__PEM_read_bio_DSAparams__imp__PEM_read_bio_ECPKParameters__imp__PEM_read_bio_ECPrivateKey__imp__PEM_read_bio_EC_PUBKEY__imp__PEM_read_bio_NETSCAPE_CERT_SEQUENCE__imp__PEM_read_bio_PKCS7__imp__PEM_read_bio_PKCS8__imp__PEM_read_bio_PKCS8_PRIV_KEY_INFO__imp__PEM_read_bio_PUBKEY__imp__PEM_read_bio_PrivateKey__imp__PEM_read_bio_RSAPrivateKey__imp__PEM_read_bio_RSAPublicKey__imp__PEM_read_bio_RSA_PUBKEY__imp__PEM_read_bio_X509__imp__PEM_read_bio_X509_AUX__imp__PEM_read_bio_X509_CERT_PAIR__imp__PEM_read_bio_X509_CRL__imp__PEM_read_bio_X509_REQ__imp__PEM_write__imp__PEM_write_DHparams__imp__PEM_write_DSAPrivateKey__imp__PEM_write_DSA_PUBKEY__imp__PEM_write_DSAparams__imp__PEM_write_ECPKParameters__imp__PEM_write_ECPrivateKey__imp__PEM_write_EC_PUBKEY__imp__PEM_write_NETSCAPE_CERT_SEQUENCE__imp__PEM_write_PKCS7__imp__PEM_write_PKCS8__imp__PEM_write_PKCS8PrivateKey__imp__PEM_write_PKCS8PrivateKey_nid__imp__PEM_write_PKCS8_PRIV_KEY_INFO__imp__PEM_write_PUBKEY__imp__PEM_write_PrivateKey__imp__PEM_write_RSAPrivateKey__imp__PEM_write_RSAPublicKey__imp__PEM_write_RSA_PUBKEY__imp__PEM_write_X509__imp__PEM_write_X509_AUX__imp__PEM_write_X509_CERT_PAIR__imp__PEM_write_X509_CRL__imp__PEM_write_X509_REQ__imp__PEM_write_X509_REQ_NEW__imp__PEM_write_bio__imp__PEM_write_bio_DHparams__imp__PEM_write_bio_DSAPrivateKey__imp__PEM_write_bio_DSA_PUBKEY__imp__PEM_write_bio_DSAparams__imp__PEM_write_bio_ECPKParameters__imp__PEM_write_bio_ECPrivateKey__imp__PEM_write_bio_EC_PUBKEY__imp__PEM_write_bio_NETSCAPE_CERT_SEQUENCE__imp__PEM_write_bio_PKCS7__imp__PEM_write_bio_PKCS8__imp__PEM_write_bio_PKCS8PrivateKey__imp__PEM_write_bio_PKCS8PrivateKey_nid__imp__PEM_write_bio_PKCS8_PRIV_KEY_INFO__imp__PEM_write_bio_PUBKEY__imp__PEM_write_bio_PrivateKey__imp__PEM_write_bio_RSAPrivateKey__imp__PEM_write_bio_RSAPublicKey__imp__PEM_write_bio_RSA_PUBKEY__imp__PEM_write_bio_X509__imp__PEM_write_bio_X509_AUX__imp__PEM_write_bio_X509_CERT_PAIR__imp__PEM_write_bio_X509_CRL__imp__PEM_write_bio_X509_REQ__imp__PEM_write_bio_X509_REQ_NEW__imp__PKCS12_AUTHSAFES_it__imp__PKCS12_BAGS_free__imp__PKCS12_BAGS_it__imp__PKCS12_BAGS_new__imp__PKCS12_MAC_DATA_free__imp__PKCS12_MAC_DATA_it__imp__PKCS12_MAC_DATA_new__imp__PKCS12_MAKE_KEYBAG__imp__PKCS12_MAKE_SHKEYBAG__imp__PKCS12_PBE_add__imp__PKCS12_PBE_keyivgen__imp__PKCS12_SAFEBAGS_it__imp__PKCS12_SAFEBAG_free__imp__PKCS12_SAFEBAG_it__imp__PKCS12_SAFEBAG_new__imp__PKCS12_add_CSPName_asc__imp__PKCS12_add_cert__imp__PKCS12_add_friendlyname_asc__imp__PKCS12_add_friendlyname_uni__imp__PKCS12_add_key__imp__PKCS12_add_localkeyid__imp__PKCS12_add_safe__imp__PKCS12_add_safes__imp__PKCS12_certbag2x509__imp__PKCS12_certbag2x509crl__imp__PKCS12_create__imp__PKCS12_decrypt_skey__imp__PKCS12_free__imp__PKCS12_gen_mac__imp__PKCS12_get_attr_gen__imp__PKCS12_get_friendlyname__imp__PKCS12_init__imp__PKCS12_it__imp__PKCS12_item_decrypt_d2i__imp__PKCS12_item_i2d_encrypt__imp__PKCS12_item_pack_safebag__imp__PKCS12_key_gen_asc__imp__PKCS12_key_gen_uni__imp__PKCS12_new__imp__PKCS12_newpass__imp__PKCS12_pack_authsafes__imp__PKCS12_pack_p7data__imp__PKCS12_pack_p7encdata__imp__PKCS12_parse__imp__PKCS12_pbe_crypt__imp__PKCS12_set_mac__imp__PKCS12_setup_mac__imp__PKCS12_unpack_authsafes__imp__PKCS12_unpack_p7data__imp__PKCS12_unpack_p7encdata__imp__PKCS12_verify_mac__imp__PKCS12_x5092certbag__imp__PKCS12_x509crl2certbag__imp__PKCS1_MGF1__imp__PKCS5_PBE_add__imp__PKCS5_PBE_keyivgen__imp__PKCS5_PBKDF2_HMAC_SHA1__imp__PKCS5_pbe2_set__imp__PKCS5_pbe_set__imp__PKCS5_v2_PBE_keyivgen__imp__PKCS7_ATTR_SIGN_it__imp__PKCS7_ATTR_VERIFY_it__imp__PKCS7_DIGEST_free__imp__PKCS7_DIGEST_it__imp__PKCS7_DIGEST_new__imp__PKCS7_ENCRYPT_free__imp__PKCS7_ENCRYPT_it__imp__PKCS7_ENCRYPT_new__imp__PKCS7_ENC_CONTENT_free__imp__PKCS7_ENC_CONTENT_it__imp__PKCS7_ENC_CONTENT_new__imp__PKCS7_ENVELOPE_free__imp__PKCS7_ENVELOPE_it__imp__PKCS7_ENVELOPE_new__imp__PKCS7_ISSUER_AND_SERIAL_digest__imp__PKCS7_ISSUER_AND_SERIAL_free__imp__PKCS7_ISSUER_AND_SERIAL_it__imp__PKCS7_ISSUER_AND_SERIAL_new__imp__PKCS7_RECIP_INFO_free__imp__PKCS7_RECIP_INFO_it__imp__PKCS7_RECIP_INFO_new__imp__PKCS7_RECIP_INFO_set__imp__PKCS7_SIGNED_free__imp__PKCS7_SIGNED_it__imp__PKCS7_SIGNED_new__imp__PKCS7_SIGNER_INFO_free__imp__PKCS7_SIGNER_INFO_it__imp__PKCS7_SIGNER_INFO_new__imp__PKCS7_SIGNER_INFO_set__imp__PKCS7_SIGN_ENVELOPE_free__imp__PKCS7_SIGN_ENVELOPE_it__imp__PKCS7_SIGN_ENVELOPE_new__imp__PKCS7_add_attrib_smimecap__imp__PKCS7_add_attribute__imp__PKCS7_add_certificate__imp__PKCS7_add_crl__imp__PKCS7_add_recipient__imp__PKCS7_add_recipient_info__imp__PKCS7_add_signature__imp__PKCS7_add_signed_attribute__imp__PKCS7_add_signer__imp__PKCS7_cert_from_signer_info__imp__PKCS7_content_new__imp__PKCS7_ctrl__imp__PKCS7_dataDecode__imp__PKCS7_dataFinal__imp__PKCS7_dataInit__imp__PKCS7_dataVerify__imp__PKCS7_decrypt__imp__PKCS7_digest_from_attributes__imp__PKCS7_dup__imp__PKCS7_encrypt__imp__PKCS7_free__imp__PKCS7_get0_signers__imp__PKCS7_get_attribute__imp__PKCS7_get_issuer_and_serial__imp__PKCS7_get_signed_attribute__imp__PKCS7_get_signer_info__imp__PKCS7_get_smimecap__imp__PKCS7_it__imp__PKCS7_new__imp__PKCS7_set0_type_other__imp__PKCS7_set_attributes__imp__PKCS7_set_cipher__imp__PKCS7_set_content__imp__PKCS7_set_digest__imp__PKCS7_set_signed_attributes__imp__PKCS7_set_type__imp__PKCS7_sign__imp__PKCS7_signatureVerify__imp__PKCS7_simple_smimecap__imp__PKCS7_verify__imp__PKCS8_PRIV_KEY_INFO_free__imp__PKCS8_PRIV_KEY_INFO_it__imp__PKCS8_PRIV_KEY_INFO_new__imp__PKCS8_add_keyusage__imp__PKCS8_decrypt__imp__PKCS8_encrypt__imp__PKCS8_set_broken__imp__PKEY_USAGE_PERIOD_free__imp__PKEY_USAGE_PERIOD_it__imp__PKEY_USAGE_PERIOD_new__imp__POLICYINFO_free__imp__POLICYINFO_it__imp__POLICYINFO_new__imp__POLICYQUALINFO_free__imp__POLICYQUALINFO_it__imp__POLICYQUALINFO_new__imp__POLICY_CONSTRAINTS_free__imp__POLICY_CONSTRAINTS_it__imp__POLICY_CONSTRAINTS_new__imp__POLICY_MAPPINGS_it__imp__POLICY_MAPPING_free__imp__POLICY_MAPPING_it__imp__POLICY_MAPPING_new__imp__PROXY_CERT_INFO_EXTENSION_free__imp__PROXY_CERT_INFO_EXTENSION_it__imp__PROXY_CERT_INFO_EXTENSION_new__imp__PROXY_POLICY_free__imp__PROXY_POLICY_it__imp__PROXY_POLICY_new__imp__RAND_SSLeay__imp__RAND_add__imp__RAND_bytes__imp__RAND_cleanup__imp__RAND_egd__imp__RAND_egd_bytes__imp__RAND_event__imp__RAND_file_name__imp__RAND_get_rand_method__imp__RAND_load_file__imp__RAND_poll__imp__RAND_pseudo_bytes__imp__RAND_query_egd_bytes__imp__RAND_screen__imp__RAND_seed__imp__RAND_set_rand_engine__imp__RAND_set_rand_method__imp__RAND_status__imp__RAND_write_file__imp__RC2_cbc_encrypt__imp__RC2_cfb64_encrypt__imp__RC2_decrypt__imp__RC2_ecb_encrypt__imp__RC2_encrypt__imp__RC2_ofb64_encrypt__imp__RC2_set_key__imp__RC4__imp__RC4_options__imp__RC4_set_key__imp__RIPEMD160__imp__RIPEMD160_Final__imp__RIPEMD160_Init__imp__RIPEMD160_Transform__imp__RIPEMD160_Update__imp__RSAPrivateKey_asn1_meth__imp__RSAPrivateKey_dup__imp__RSAPrivateKey_it__imp__RSAPublicKey_dup__imp__RSAPublicKey_it__imp__RSA_PKCS1_SSLeay__imp__RSA_X931_derive_ex__imp__RSA_X931_generate_key_ex__imp__RSA_X931_hash_id__imp__RSA_blinding_off__imp__RSA_blinding_on__imp__RSA_check_key__imp__RSA_flags__imp__RSA_free__imp__RSA_generate_key__imp__RSA_generate_key_ex__imp__RSA_get_default_method__imp__RSA_get_ex_data__imp__RSA_get_ex_new_index__imp__RSA_get_method__imp__RSA_memory_lock__imp__RSA_new__imp__RSA_new_method__imp__RSA_null_method__imp__RSA_padding_add_PKCS1_OAEP__imp__RSA_padding_add_PKCS1_PSS__imp__RSA_padding_add_PKCS1_type_1__imp__RSA_padding_add_PKCS1_type_2__imp__RSA_padding_add_SSLv23__imp__RSA_padding_add_X931__imp__RSA_padding_add_none__imp__RSA_padding_check_PKCS1_OAEP__imp__RSA_padding_check_PKCS1_type_1__imp__RSA_padding_check_PKCS1_type_2__imp__RSA_padding_check_SSLv23__imp__RSA_padding_check_X931__imp__RSA_padding_check_none__imp__RSA_print__imp__RSA_print_fp__imp__RSA_private_decrypt__imp__RSA_private_encrypt__imp__RSA_public_decrypt__imp__RSA_public_encrypt__imp__RSA_set_default_method__imp__RSA_set_ex_data__imp__RSA_set_method__imp__RSA_setup_blinding__imp__RSA_sign__imp__RSA_sign_ASN1_OCTET_STRING__imp__RSA_size__imp__RSA_up_ref__imp__RSA_verify__imp__RSA_verify_ASN1_OCTET_STRING__imp__RSA_verify_PKCS1_PSS__imp__SHA__imp__SHA1__imp__SHA1_Final__imp__SHA1_Init__imp__SHA1_Transform__imp__SHA1_Update__imp__SHA224__imp__SHA224_Final__imp__SHA224_Init__imp__SHA224_Update__imp__SHA256__imp__SHA256_Final__imp__SHA256_Init__imp__SHA256_Transform__imp__SHA256_Update__imp__SHA384__imp__SHA384_Final__imp__SHA384_Init__imp__SHA384_Update__imp__SHA512__imp__SHA512_Final__imp__SHA512_Init__imp__SHA512_Transform__imp__SHA512_Update__imp__SHA_Final__imp__SHA_Init__imp__SHA_Transform__imp__SHA_Update__imp__SMIME_crlf_copy__imp__SMIME_read_ASN1__imp__SMIME_read_PKCS7__imp__SMIME_text__imp__SMIME_write_PKCS7__imp__SSLeay__imp__SSLeay_version__imp__STORE_ATTR_INFO_compare__imp__STORE_ATTR_INFO_free__imp__STORE_ATTR_INFO_get0_cstr__imp__STORE_ATTR_INFO_get0_dn__imp__STORE_ATTR_INFO_get0_number__imp__STORE_ATTR_INFO_get0_sha1str__imp__STORE_ATTR_INFO_in__imp__STORE_ATTR_INFO_in_ex__imp__STORE_ATTR_INFO_in_range__imp__STORE_ATTR_INFO_modify_cstr__imp__STORE_ATTR_INFO_modify_dn__imp__STORE_ATTR_INFO_modify_number__imp__STORE_ATTR_INFO_modify_sha1str__imp__STORE_ATTR_INFO_new__imp__STORE_ATTR_INFO_set_cstr__imp__STORE_ATTR_INFO_set_dn__imp__STORE_ATTR_INFO_set_number__imp__STORE_ATTR_INFO_set_sha1str__imp__STORE_Memory__imp__STORE_OBJECT_free__imp__STORE_OBJECT_new__imp__STORE_create_method__imp__STORE_ctrl__imp__STORE_delete_arbitrary__imp__STORE_delete_certificate__imp__STORE_delete_crl__imp__STORE_delete_number__imp__STORE_delete_private_key__imp__STORE_delete_public_key__imp__STORE_destroy_method__imp__STORE_free__imp__STORE_generate_crl__imp__STORE_generate_key__imp__STORE_get_arbitrary__imp__STORE_get_certificate__imp__STORE_get_crl__imp__STORE_get_ex_data__imp__STORE_get_ex_new_index__imp__STORE_get_method__imp__STORE_get_number__imp__STORE_get_private_key__imp__STORE_get_public_key__imp__STORE_list_certificate_end__imp__STORE_list_certificate_endp__imp__STORE_list_certificate_next__imp__STORE_list_certificate_start__imp__STORE_list_crl_end__imp__STORE_list_crl_endp__imp__STORE_list_crl_next__imp__STORE_list_crl_start__imp__STORE_list_private_key_end__imp__STORE_list_private_key_endp__imp__STORE_list_private_key_next__imp__STORE_list_private_key_start__imp__STORE_list_public_key_end__imp__STORE_list_public_key_endp__imp__STORE_list_public_key_next__imp__STORE_list_public_key_start__imp__STORE_method_get_cleanup_function__imp__STORE_method_get_ctrl_function__imp__STORE_method_get_delete_function__imp__STORE_method_get_generate_function__imp__STORE_method_get_get_function__imp__STORE_method_get_initialise_function__imp__STORE_method_get_list_end_function__imp__STORE_method_get_list_next_function__imp__STORE_method_get_list_start_function__imp__STORE_method_get_lock_store_function__imp__STORE_method_get_modify_function__imp__STORE_method_get_revoke_function__imp__STORE_method_get_store_function__imp__STORE_method_get_unlock_store_function__imp__STORE_method_get_update_store_function__imp__STORE_method_set_cleanup_function__imp__STORE_method_set_ctrl_function__imp__STORE_method_set_delete_function__imp__STORE_method_set_generate_function__imp__STORE_method_set_get_function__imp__STORE_method_set_initialise_function__imp__STORE_method_set_list_end_function__imp__STORE_method_set_list_next_function__imp__STORE_method_set_list_start_function__imp__STORE_method_set_lock_store_function__imp__STORE_method_set_modify_function__imp__STORE_method_set_revoke_function__imp__STORE_method_set_store_function__imp__STORE_method_set_unlock_store_function__imp__STORE_method_set_update_store_function__imp__STORE_modify_arbitrary__imp__STORE_modify_certificate__imp__STORE_modify_crl__imp__STORE_modify_number__imp__STORE_modify_private_key__imp__STORE_modify_public_key__imp__STORE_new_engine__imp__STORE_new_method__imp__STORE_parse_attrs_end__imp__STORE_parse_attrs_endp__imp__STORE_parse_attrs_next__imp__STORE_parse_attrs_start__imp__STORE_revoke_certificate__imp__STORE_revoke_private_key__imp__STORE_revoke_public_key__imp__STORE_set_ex_data__imp__STORE_set_method__imp__STORE_store_arbitrary__imp__STORE_store_certificate__imp__STORE_store_crl__imp__STORE_store_number__imp__STORE_store_private_key__imp__STORE_store_public_key__imp__SXNETID_free__imp__SXNETID_it__imp__SXNETID_new__imp__SXNET_add_id_INTEGER__imp__SXNET_add_id_asc__imp__SXNET_add_id_ulong__imp__SXNET_free__imp__SXNET_get_id_INTEGER__imp__SXNET_get_id_asc__imp__SXNET_get_id_ulong__imp__SXNET_it__imp__SXNET_new__imp__TXT_DB_create_index__imp__TXT_DB_free__imp__TXT_DB_get_by_index__imp__TXT_DB_insert__imp__TXT_DB_read__imp__TXT_DB_write__imp__UI_OpenSSL__imp__UI_UTIL_read_pw__imp__UI_UTIL_read_pw_string__imp__UI_add_error_string__imp__UI_add_info_string__imp__UI_add_input_boolean__imp__UI_add_input_string__imp__UI_add_user_data__imp__UI_add_verify_string__imp__UI_construct_prompt__imp__UI_create_method__imp__UI_ctrl__imp__UI_destroy_method__imp__UI_dup_error_string__imp__UI_dup_info_string__imp__UI_dup_input_boolean__imp__UI_dup_input_string__imp__UI_dup_verify_string__imp__UI_free__imp__UI_get0_action_string__imp__UI_get0_output_string__imp__UI_get0_result__imp__UI_get0_result_string__imp__UI_get0_test_string__imp__UI_get0_user_data__imp__UI_get_default_method__imp__UI_get_ex_data__imp__UI_get_ex_new_index__imp__UI_get_input_flags__imp__UI_get_method__imp__UI_get_result_maxsize__imp__UI_get_result_minsize__imp__UI_get_string_type__imp__UI_method_get_closer__imp__UI_method_get_flusher__imp__UI_method_get_opener__imp__UI_method_get_reader__imp__UI_method_get_writer__imp__UI_method_set_closer__imp__UI_method_set_flusher__imp__UI_method_set_opener__imp__UI_method_set_reader__imp__UI_method_set_writer__imp__UI_new__imp__UI_new_method__imp__UI_process__imp__UI_set_default_method__imp__UI_set_ex_data__imp__UI_set_method__imp__UI_set_result__imp__USERNOTICE_free__imp__USERNOTICE_it__imp__USERNOTICE_new__imp__UTF8_getc__imp__UTF8_putc__imp__X509V3_EXT_CRL_add_conf__imp__X509V3_EXT_CRL_add_nconf__imp__X509V3_EXT_REQ_add_conf__imp__X509V3_EXT_REQ_add_nconf__imp__X509V3_EXT_add__imp__X509V3_EXT_add_alias__imp__X509V3_EXT_add_conf__imp__X509V3_EXT_add_list__imp__X509V3_EXT_add_nconf__imp__X509V3_EXT_add_nconf_sk__imp__X509V3_EXT_cleanup__imp__X509V3_EXT_conf__imp__X509V3_EXT_conf_nid__imp__X509V3_EXT_d2i__imp__X509V3_EXT_get__imp__X509V3_EXT_get_nid__imp__X509V3_EXT_i2d__imp__X509V3_EXT_nconf__imp__X509V3_EXT_nconf_nid__imp__X509V3_EXT_print__imp__X509V3_EXT_print_fp__imp__X509V3_EXT_val_prn__imp__X509V3_NAME_from_section__imp__X509V3_add1_i2d__imp__X509V3_add_standard_extensions__imp__X509V3_add_value__imp__X509V3_add_value_bool__imp__X509V3_add_value_bool_nf__imp__X509V3_add_value_int__imp__X509V3_add_value_uchar__imp__X509V3_conf_free__imp__X509V3_extensions_print__imp__X509V3_get_d2i__imp__X509V3_get_section__imp__X509V3_get_string__imp__X509V3_get_value_bool__imp__X509V3_get_value_int__imp__X509V3_parse_list__imp__X509V3_section_free__imp__X509V3_set_conf_lhash__imp__X509V3_set_ctx__imp__X509V3_set_nconf__imp__X509V3_string_free__imp__X509_ALGORS_it__imp__X509_ALGOR_dup__imp__X509_ALGOR_free__imp__X509_ALGOR_get0__imp__X509_ALGOR_it__imp__X509_ALGOR_new__imp__X509_ALGOR_set0__imp__X509_ATTRIBUTE_count__imp__X509_ATTRIBUTE_create__imp__X509_ATTRIBUTE_create_by_NID__imp__X509_ATTRIBUTE_create_by_OBJ__imp__X509_ATTRIBUTE_create_by_txt__imp__X509_ATTRIBUTE_dup__imp__X509_ATTRIBUTE_free__imp__X509_ATTRIBUTE_get0_data__imp__X509_ATTRIBUTE_get0_object__imp__X509_ATTRIBUTE_get0_type__imp__X509_ATTRIBUTE_it__imp__X509_ATTRIBUTE_new__imp__X509_ATTRIBUTE_set1_data__imp__X509_ATTRIBUTE_set1_object__imp__X509_CERT_AUX_free__imp__X509_CERT_AUX_it__imp__X509_CERT_AUX_new__imp__X509_CERT_AUX_print__imp__X509_CERT_PAIR_free__imp__X509_CERT_PAIR_it__imp__X509_CERT_PAIR_new__imp__X509_CINF_free__imp__X509_CINF_it__imp__X509_CINF_new__imp__X509_CRL_INFO_free__imp__X509_CRL_INFO_it__imp__X509_CRL_INFO_new__imp__X509_CRL_add0_revoked__imp__X509_CRL_add1_ext_i2d__imp__X509_CRL_add_ext__imp__X509_CRL_cmp__imp__X509_CRL_delete_ext__imp__X509_CRL_digest__imp__X509_CRL_dup__imp__X509_CRL_free__imp__X509_CRL_get_ext__imp__X509_CRL_get_ext_by_NID__imp__X509_CRL_get_ext_by_OBJ__imp__X509_CRL_get_ext_by_critical__imp__X509_CRL_get_ext_count__imp__X509_CRL_get_ext_d2i__imp__X509_CRL_it__imp__X509_CRL_new__imp__X509_CRL_print__imp__X509_CRL_print_fp__imp__X509_CRL_set_issuer_name__imp__X509_CRL_set_lastUpdate__imp__X509_CRL_set_nextUpdate__imp__X509_CRL_set_version__imp__X509_CRL_sign__imp__X509_CRL_sort__imp__X509_CRL_verify__imp__X509_EXTENSIONS_it__imp__X509_EXTENSION_create_by_NID__imp__X509_EXTENSION_create_by_OBJ__imp__X509_EXTENSION_dup__imp__X509_EXTENSION_free__imp__X509_EXTENSION_get_critical__imp__X509_EXTENSION_get_data__imp__X509_EXTENSION_get_object__imp__X509_EXTENSION_it__imp__X509_EXTENSION_new__imp__X509_EXTENSION_set_critical__imp__X509_EXTENSION_set_data__imp__X509_EXTENSION_set_object__imp__X509_INFO_free__imp__X509_INFO_new__imp__X509_LOOKUP_by_alias__imp__X509_LOOKUP_by_fingerprint__imp__X509_LOOKUP_by_issuer_serial__imp__X509_LOOKUP_by_subject__imp__X509_LOOKUP_ctrl__imp__X509_LOOKUP_file__imp__X509_LOOKUP_free__imp__X509_LOOKUP_hash_dir__imp__X509_LOOKUP_init__imp__X509_LOOKUP_new__imp__X509_LOOKUP_shutdown__imp__X509_NAME_ENTRY_create_by_NID__imp__X509_NAME_ENTRY_create_by_OBJ__imp__X509_NAME_ENTRY_create_by_txt__imp__X509_NAME_ENTRY_dup__imp__X509_NAME_ENTRY_free__imp__X509_NAME_ENTRY_get_data__imp__X509_NAME_ENTRY_get_object__imp__X509_NAME_ENTRY_it__imp__X509_NAME_ENTRY_new__imp__X509_NAME_ENTRY_set_data__imp__X509_NAME_ENTRY_set_object__imp__X509_NAME_add_entry__imp__X509_NAME_add_entry_by_NID__imp__X509_NAME_add_entry_by_OBJ__imp__X509_NAME_add_entry_by_txt__imp__X509_NAME_cmp__imp__X509_NAME_delete_entry__imp__X509_NAME_digest__imp__X509_NAME_dup__imp__X509_NAME_entry_count__imp__X509_NAME_free__imp__X509_NAME_get_entry__imp__X509_NAME_get_index_by_NID__imp__X509_NAME_get_index_by_OBJ__imp__X509_NAME_get_text_by_NID__imp__X509_NAME_get_text_by_OBJ__imp__X509_NAME_hash__imp__X509_NAME_it__imp__X509_NAME_new__imp__X509_NAME_oneline__imp__X509_NAME_print__imp__X509_NAME_print_ex__imp__X509_NAME_print_ex_fp__imp__X509_NAME_set__imp__X509_OBJECT_free_contents__imp__X509_OBJECT_idx_by_subject__imp__X509_OBJECT_retrieve_by_subject__imp__X509_OBJECT_retrieve_match__imp__X509_OBJECT_up_ref_count__imp__X509_PKEY_free__imp__X509_PKEY_new__imp__X509_POLICY_NODE_print__imp__X509_PUBKEY_free__imp__X509_PUBKEY_get__imp__X509_PUBKEY_it__imp__X509_PUBKEY_new__imp__X509_PUBKEY_set__imp__X509_PURPOSE_add__imp__X509_PURPOSE_cleanup__imp__X509_PURPOSE_get0__imp__X509_PURPOSE_get0_name__imp__X509_PURPOSE_get0_sname__imp__X509_PURPOSE_get_by_id__imp__X509_PURPOSE_get_by_sname__imp__X509_PURPOSE_get_count__imp__X509_PURPOSE_get_id__imp__X509_PURPOSE_get_trust__imp__X509_PURPOSE_set__imp__X509_REQ_INFO_free__imp__X509_REQ_INFO_it__imp__X509_REQ_INFO_new__imp__X509_REQ_add1_attr__imp__X509_REQ_add1_attr_by_NID__imp__X509_REQ_add1_attr_by_OBJ__imp__X509_REQ_add1_attr_by_txt__imp__X509_REQ_add_extensions__imp__X509_REQ_add_extensions_nid__imp__X509_REQ_check_private_key__imp__X509_REQ_delete_attr__imp__X509_REQ_digest__imp__X509_REQ_dup__imp__X509_REQ_extension_nid__imp__X509_REQ_free__imp__X509_REQ_get1_email__imp__X509_REQ_get_attr__imp__X509_REQ_get_attr_by_NID__imp__X509_REQ_get_attr_by_OBJ__imp__X509_REQ_get_attr_count__imp__X509_REQ_get_extension_nids__imp__X509_REQ_get_extensions__imp__X509_REQ_get_pubkey__imp__X509_REQ_it__imp__X509_REQ_new__imp__X509_REQ_print__imp__X509_REQ_print_ex__imp__X509_REQ_print_fp__imp__X509_REQ_set_extension_nids__imp__X509_REQ_set_pubkey__imp__X509_REQ_set_subject_name__imp__X509_REQ_set_version__imp__X509_REQ_sign__imp__X509_REQ_to_X509__imp__X509_REQ_verify__imp__X509_REVOKED_add1_ext_i2d__imp__X509_REVOKED_add_ext__imp__X509_REVOKED_delete_ext__imp__X509_REVOKED_free__imp__X509_REVOKED_get_ext__imp__X509_REVOKED_get_ext_by_NID__imp__X509_REVOKED_get_ext_by_OBJ__imp__X509_REVOKED_get_ext_by_critical__imp__X509_REVOKED_get_ext_count__imp__X509_REVOKED_get_ext_d2i__imp__X509_REVOKED_it__imp__X509_REVOKED_new__imp__X509_REVOKED_set_revocationDate__imp__X509_REVOKED_set_serialNumber__imp__X509_SIG_free__imp__X509_SIG_it__imp__X509_SIG_new__imp__X509_STORE_CTX_cleanup__imp__X509_STORE_CTX_free__imp__X509_STORE_CTX_get0_param__imp__X509_STORE_CTX_get0_policy_tree__imp__X509_STORE_CTX_get1_chain__imp__X509_STORE_CTX_get1_issuer__imp__X509_STORE_CTX_get_chain__imp__X509_STORE_CTX_get_current_cert__imp__X509_STORE_CTX_get_error__imp__X509_STORE_CTX_get_error_depth__imp__X509_STORE_CTX_get_ex_data__imp__X509_STORE_CTX_get_ex_new_index__imp__X509_STORE_CTX_get_explicit_policy__imp__X509_STORE_CTX_init__imp__X509_STORE_CTX_new__imp__X509_STORE_CTX_purpose_inherit__imp__X509_STORE_CTX_set0_crls__imp__X509_STORE_CTX_set0_param__imp__X509_STORE_CTX_set_cert__imp__X509_STORE_CTX_set_chain__imp__X509_STORE_CTX_set_default__imp__X509_STORE_CTX_set_depth__imp__X509_STORE_CTX_set_error__imp__X509_STORE_CTX_set_ex_data__imp__X509_STORE_CTX_set_flags__imp__X509_STORE_CTX_set_purpose__imp__X509_STORE_CTX_set_time__imp__X509_STORE_CTX_set_trust__imp__X509_STORE_CTX_set_verify_cb__imp__X509_STORE_CTX_trusted_stack__imp__X509_STORE_add_cert__imp__X509_STORE_add_crl__imp__X509_STORE_add_lookup__imp__X509_STORE_free__imp__X509_STORE_get_by_subject__imp__X509_STORE_load_locations__imp__X509_STORE_new__imp__X509_STORE_set1_param__imp__X509_STORE_set_default_paths__imp__X509_STORE_set_depth__imp__X509_STORE_set_flags__imp__X509_STORE_set_purpose__imp__X509_STORE_set_trust__imp__X509_TRUST_add__imp__X509_TRUST_cleanup__imp__X509_TRUST_get0__imp__X509_TRUST_get0_name__imp__X509_TRUST_get_by_id__imp__X509_TRUST_get_count__imp__X509_TRUST_get_flags__imp__X509_TRUST_get_trust__imp__X509_TRUST_set__imp__X509_TRUST_set_default__imp__X509_VAL_free__imp__X509_VAL_it__imp__X509_VAL_new__imp__X509_VERIFY_PARAM_add0_policy__imp__X509_VERIFY_PARAM_add0_table__imp__X509_VERIFY_PARAM_clear_flags__imp__X509_VERIFY_PARAM_free__imp__X509_VERIFY_PARAM_get_depth__imp__X509_VERIFY_PARAM_get_flags__imp__X509_VERIFY_PARAM_inherit__imp__X509_VERIFY_PARAM_lookup__imp__X509_VERIFY_PARAM_new__imp__X509_VERIFY_PARAM_set1__imp__X509_VERIFY_PARAM_set1_name__imp__X509_VERIFY_PARAM_set1_policies__imp__X509_VERIFY_PARAM_set_depth__imp__X509_VERIFY_PARAM_set_flags__imp__X509_VERIFY_PARAM_set_purpose__imp__X509_VERIFY_PARAM_set_time__imp__X509_VERIFY_PARAM_set_trust__imp__X509_VERIFY_PARAM_table_cleanup__imp__X509_add1_ext_i2d__imp__X509_add1_reject_object__imp__X509_add1_trust_object__imp__X509_add_ext__imp__X509_alias_get0__imp__X509_alias_set1__imp__X509_asn1_meth__imp__X509_certificate_type__imp__X509_check_ca__imp__X509_check_issued__imp__X509_check_private_key__imp__X509_check_purpose__imp__X509_check_trust__imp__X509_cmp__imp__X509_cmp_current_time__imp__X509_cmp_time__imp__X509_delete_ext__imp__X509_digest__imp__X509_dup__imp__X509_email_free__imp__X509_find_by_issuer_and_serial__imp__X509_find_by_subject__imp__X509_free__imp__X509_get0_pubkey_bitstr__imp__X509_get1_email__imp__X509_get1_ocsp__imp__X509_get_default_cert_area__imp__X509_get_default_cert_dir__imp__X509_get_default_cert_dir_env__imp__X509_get_default_cert_file__imp__X509_get_default_cert_file_env__imp__X509_get_default_private_dir__imp__X509_get_ex_data__imp__X509_get_ex_new_index__imp__X509_get_ext__imp__X509_get_ext_by_NID__imp__X509_get_ext_by_OBJ__imp__X509_get_ext_by_critical__imp__X509_get_ext_count__imp__X509_get_ext_d2i__imp__X509_get_issuer_name__imp__X509_get_pubkey__imp__X509_get_pubkey_parameters__imp__X509_get_serialNumber__imp__X509_get_subject_name__imp__X509_gmtime_adj__imp__X509_issuer_and_serial_cmp__imp__X509_issuer_and_serial_hash__imp__X509_issuer_name_cmp__imp__X509_issuer_name_hash__imp__X509_it__imp__X509_keyid_get0__imp__X509_keyid_set1__imp__X509_load_cert_crl_file__imp__X509_load_cert_file__imp__X509_load_crl_file__imp__X509_new__imp__X509_ocspid_print__imp__X509_policy_check__imp__X509_policy_level_get0_node__imp__X509_policy_level_node_count__imp__X509_policy_node_get0_parent__imp__X509_policy_node_get0_policy__imp__X509_policy_node_get0_qualifiers__imp__X509_policy_tree_free__imp__X509_policy_tree_get0_level__imp__X509_policy_tree_get0_policies__imp__X509_policy_tree_get0_user_policies__imp__X509_policy_tree_level_count__imp__X509_print__imp__X509_print_ex__imp__X509_print_ex_fp__imp__X509_print_fp__imp__X509_pubkey_digest__imp__X509_reject_clear__imp__X509_set_ex_data__imp__X509_set_issuer_name__imp__X509_set_notAfter__imp__X509_set_notBefore__imp__X509_set_pubkey__imp__X509_set_serialNumber__imp__X509_set_subject_name__imp__X509_set_version__imp__X509_sign__imp__X509_signature_print__imp__X509_subject_name_cmp__imp__X509_subject_name_hash__imp__X509_supported_extension__imp__X509_time_adj__imp__X509_to_X509_REQ__imp__X509_trust_clear__imp__X509_verify__imp__X509_verify_cert__imp__X509_verify_cert_error_string__imp__X509at_add1_attr__imp__X509at_add1_attr_by_NID__imp__X509at_add1_attr_by_OBJ__imp__X509at_add1_attr_by_txt__imp__X509at_delete_attr__imp__X509at_get0_data_by_OBJ__imp__X509at_get_attr__imp__X509at_get_attr_by_NID__imp__X509at_get_attr_by_OBJ__imp__X509at_get_attr_count__imp__X509v3_add_ext__imp__X509v3_delete_ext__imp__X509v3_get_ext__imp__X509v3_get_ext_by_NID__imp__X509v3_get_ext_by_OBJ__imp__X509v3_get_ext_by_critical__imp__X509v3_get_ext_count__imp__ZLONG_it__imp___ossl_096_des_random_seed__imp___ossl_old_crypt__imp___ossl_old_des_cbc_cksum__imp___ossl_old_des_cbc_encrypt__imp___ossl_old_des_cfb64_encrypt__imp___ossl_old_des_cfb_encrypt__imp___ossl_old_des_crypt__imp___ossl_old_des_decrypt3__imp___ossl_old_des_ecb3_encrypt__imp___ossl_old_des_ecb_encrypt__imp___ossl_old_des_ede3_cbc_encrypt__imp___ossl_old_des_ede3_cfb64_encrypt__imp___ossl_old_des_ede3_ofb64_encrypt__imp___ossl_old_des_enc_read__imp___ossl_old_des_enc_write__imp___ossl_old_des_encrypt__imp___ossl_old_des_encrypt2__imp___ossl_old_des_encrypt3__imp___ossl_old_des_fcrypt__imp___ossl_old_des_is_weak_key__imp___ossl_old_des_key_sched__imp___ossl_old_des_ncbc_encrypt__imp___ossl_old_des_ofb64_encrypt__imp___ossl_old_des_ofb_encrypt__imp___ossl_old_des_options__imp___ossl_old_des_pcbc_encrypt__imp___ossl_old_des_quad_cksum__imp___ossl_old_des_random_key__imp___ossl_old_des_random_seed__imp___ossl_old_des_read_2passwords__imp___ossl_old_des_read_password__imp___ossl_old_des_read_pw__imp___ossl_old_des_read_pw_string__imp___ossl_old_des_set_key__imp___ossl_old_des_set_odd_parity__imp___ossl_old_des_string_to_2keys__imp___ossl_old_des_string_to_key__imp___ossl_old_des_xcbc_encrypt__imp___shadow_DES_check_key__imp___shadow_DES_rw_mode__imp__a2d_ASN1_OBJECT__imp__a2i_ASN1_ENUMERATED__imp__a2i_ASN1_INTEGER__imp__a2i_ASN1_STRING__imp__a2i_IPADDRESS__imp__a2i_IPADDRESS_NC__imp__a2i_ipadd__imp__asc2uni__imp__asn1_Finish__imp__asn1_GetSequence__imp__asn1_add_error__imp__asn1_const_Finish__imp__asn1_do_adb__imp__asn1_do_lock__imp__asn1_enc_free__imp__asn1_enc_init__imp__asn1_enc_restore__imp__asn1_enc_save__imp__asn1_ex_c2i__imp__asn1_ex_i2c__imp__asn1_get_choice_selector__imp__asn1_get_field_ptr__imp__asn1_set_choice_selector__imp__bn_add_words__imp__bn_div_words__imp__bn_dup_expand__imp__bn_expand2__imp__bn_mul_add_words__imp__bn_mul_words__imp__bn_sqr_words__imp__bn_sub_words__imp__c2i_ASN1_BIT_STRING__imp__c2i_ASN1_INTEGER__imp__c2i_ASN1_OBJECT__imp__d2i_ACCESS_DESCRIPTION__imp__d2i_ASN1_BIT_STRING__imp__d2i_ASN1_BMPSTRING__imp__d2i_ASN1_BOOLEAN__imp__d2i_ASN1_ENUMERATED__imp__d2i_ASN1_GENERALIZEDTIME__imp__d2i_ASN1_GENERALSTRING__imp__d2i_ASN1_HEADER__imp__d2i_ASN1_IA5STRING__imp__d2i_ASN1_INTEGER__imp__d2i_ASN1_NULL__imp__d2i_ASN1_OBJECT__imp__d2i_ASN1_OCTET_STRING__imp__d2i_ASN1_PRINTABLE__imp__d2i_ASN1_PRINTABLESTRING__imp__d2i_ASN1_SET__imp__d2i_ASN1_T61STRING__imp__d2i_ASN1_TIME__imp__d2i_ASN1_TYPE__imp__d2i_ASN1_UINTEGER__imp__d2i_ASN1_UNIVERSALSTRING__imp__d2i_ASN1_UTCTIME__imp__d2i_ASN1_UTF8STRING__imp__d2i_ASN1_VISIBLESTRING__imp__d2i_ASN1_bytes__imp__d2i_ASN1_type_bytes__imp__d2i_AUTHORITY_INFO_ACCESS__imp__d2i_AUTHORITY_KEYID__imp__d2i_AutoPrivateKey__imp__d2i_BASIC_CONSTRAINTS__imp__d2i_CERTIFICATEPOLICIES__imp__d2i_CRL_DIST_POINTS__imp__d2i_DHparams__imp__d2i_DIRECTORYSTRING__imp__d2i_DISPLAYTEXT__imp__d2i_DIST_POINT__imp__d2i_DIST_POINT_NAME__imp__d2i_DSAPrivateKey__imp__d2i_DSAPrivateKey_bio__imp__d2i_DSAPrivateKey_fp__imp__d2i_DSAPublicKey__imp__d2i_DSA_PUBKEY__imp__d2i_DSA_PUBKEY_bio__imp__d2i_DSA_PUBKEY_fp__imp__d2i_DSA_SIG__imp__d2i_DSAparams__imp__d2i_ECDSA_SIG__imp__d2i_ECPKParameters__imp__d2i_ECParameters__imp__d2i_ECPrivateKey__imp__d2i_ECPrivateKey_bio__imp__d2i_ECPrivateKey_fp__imp__d2i_EC_PUBKEY__imp__d2i_EC_PUBKEY_bio__imp__d2i_EC_PUBKEY_fp__imp__d2i_EDIPARTYNAME__imp__d2i_EXTENDED_KEY_USAGE__imp__d2i_GENERAL_NAME__imp__d2i_GENERAL_NAMES__imp__d2i_KRB5_APREQ__imp__d2i_KRB5_APREQBODY__imp__d2i_KRB5_AUTHDATA__imp__d2i_KRB5_AUTHENT__imp__d2i_KRB5_AUTHENTBODY__imp__d2i_KRB5_CHECKSUM__imp__d2i_KRB5_ENCDATA__imp__d2i_KRB5_ENCKEY__imp__d2i_KRB5_PRINCNAME__imp__d2i_KRB5_TICKET__imp__d2i_KRB5_TKTBODY__imp__d2i_NETSCAPE_CERT_SEQUENCE__imp__d2i_NETSCAPE_SPKAC__imp__d2i_NETSCAPE_SPKI__imp__d2i_NOTICEREF__imp__d2i_Netscape_RSA__imp__d2i_OCSP_BASICRESP__imp__d2i_OCSP_CERTID__imp__d2i_OCSP_CERTSTATUS__imp__d2i_OCSP_CRLID__imp__d2i_OCSP_ONEREQ__imp__d2i_OCSP_REQINFO__imp__d2i_OCSP_REQUEST__imp__d2i_OCSP_RESPBYTES__imp__d2i_OCSP_RESPDATA__imp__d2i_OCSP_RESPID__imp__d2i_OCSP_RESPONSE__imp__d2i_OCSP_REVOKEDINFO__imp__d2i_OCSP_SERVICELOC__imp__d2i_OCSP_SIGNATURE__imp__d2i_OCSP_SINGLERESP__imp__d2i_OTHERNAME__imp__d2i_PBE2PARAM__imp__d2i_PBEPARAM__imp__d2i_PBKDF2PARAM__imp__d2i_PKCS12__imp__d2i_PKCS12_BAGS__imp__d2i_PKCS12_MAC_DATA__imp__d2i_PKCS12_SAFEBAG__imp__d2i_PKCS12_bio__imp__d2i_PKCS12_fp__imp__d2i_PKCS7__imp__d2i_PKCS7_DIGEST__imp__d2i_PKCS7_ENCRYPT__imp__d2i_PKCS7_ENC_CONTENT__imp__d2i_PKCS7_ENVELOPE__imp__d2i_PKCS7_ISSUER_AND_SERIAL__imp__d2i_PKCS7_RECIP_INFO__imp__d2i_PKCS7_SIGNED__imp__d2i_PKCS7_SIGNER_INFO__imp__d2i_PKCS7_SIGN_ENVELOPE__imp__d2i_PKCS7_bio__imp__d2i_PKCS7_fp__imp__d2i_PKCS8PrivateKey_bio__imp__d2i_PKCS8PrivateKey_fp__imp__d2i_PKCS8_PRIV_KEY_INFO__imp__d2i_PKCS8_PRIV_KEY_INFO_bio__imp__d2i_PKCS8_PRIV_KEY_INFO_fp__imp__d2i_PKCS8_bio__imp__d2i_PKCS8_fp__imp__d2i_PKEY_USAGE_PERIOD__imp__d2i_POLICYINFO__imp__d2i_POLICYQUALINFO__imp__d2i_PROXY_CERT_INFO_EXTENSION__imp__d2i_PROXY_POLICY__imp__d2i_PUBKEY__imp__d2i_PUBKEY_bio__imp__d2i_PUBKEY_fp__imp__d2i_PrivateKey__imp__d2i_PrivateKey_bio__imp__d2i_PrivateKey_fp__imp__d2i_PublicKey__imp__d2i_RSAPrivateKey__imp__d2i_RSAPrivateKey_bio__imp__d2i_RSAPrivateKey_fp__imp__d2i_RSAPublicKey__imp__d2i_RSAPublicKey_bio__imp__d2i_RSAPublicKey_fp__imp__d2i_RSA_NET__imp__d2i_RSA_PUBKEY__imp__d2i_RSA_PUBKEY_bio__imp__d2i_RSA_PUBKEY_fp__imp__d2i_SXNET__imp__d2i_SXNETID__imp__d2i_USERNOTICE__imp__d2i_X509__imp__d2i_X509_ALGOR__imp__d2i_X509_ALGORS__imp__d2i_X509_ATTRIBUTE__imp__d2i_X509_AUX__imp__d2i_X509_CERT_AUX__imp__d2i_X509_CERT_PAIR__imp__d2i_X509_CINF__imp__d2i_X509_CRL__imp__d2i_X509_CRL_INFO__imp__d2i_X509_CRL_bio__imp__d2i_X509_CRL_fp__imp__d2i_X509_EXTENSION__imp__d2i_X509_EXTENSIONS__imp__d2i_X509_NAME__imp__d2i_X509_NAME_ENTRY__imp__d2i_X509_PKEY__imp__d2i_X509_PUBKEY__imp__d2i_X509_REQ__imp__d2i_X509_REQ_INFO__imp__d2i_X509_REQ_bio__imp__d2i_X509_REQ_fp__imp__d2i_X509_REVOKED__imp__d2i_X509_SIG__imp__d2i_X509_VAL__imp__d2i_X509_bio__imp__d2i_X509_fp__imp__get_rfc2409_prime_1024__imp__get_rfc2409_prime_768__imp__get_rfc3526_prime_1536__imp__get_rfc3526_prime_2048__imp__get_rfc3526_prime_3072__imp__get_rfc3526_prime_4096__imp__get_rfc3526_prime_6144__imp__get_rfc3526_prime_8192__imp__hex_to_string__imp__i2a_ACCESS_DESCRIPTION__imp__i2a_ASN1_ENUMERATED__imp__i2a_ASN1_INTEGER__imp__i2a_ASN1_OBJECT__imp__i2a_ASN1_STRING__imp__i2c_ASN1_BIT_STRING__imp__i2c_ASN1_INTEGER__imp__i2d_ACCESS_DESCRIPTION__imp__i2d_ASN1_BIT_STRING__imp__i2d_ASN1_BMPSTRING__imp__i2d_ASN1_BOOLEAN__imp__i2d_ASN1_ENUMERATED__imp__i2d_ASN1_GENERALIZEDTIME__imp__i2d_ASN1_GENERALSTRING__imp__i2d_ASN1_HEADER__imp__i2d_ASN1_IA5STRING__imp__i2d_ASN1_INTEGER__imp__i2d_ASN1_NULL__imp__i2d_ASN1_OBJECT__imp__i2d_ASN1_OCTET_STRING__imp__i2d_ASN1_PRINTABLE__imp__i2d_ASN1_PRINTABLESTRING__imp__i2d_ASN1_SET__imp__i2d_ASN1_T61STRING__imp__i2d_ASN1_TIME__imp__i2d_ASN1_TYPE__imp__i2d_ASN1_UNIVERSALSTRING__imp__i2d_ASN1_UTCTIME__imp__i2d_ASN1_UTF8STRING__imp__i2d_ASN1_VISIBLESTRING__imp__i2d_ASN1_bytes__imp__i2d_AUTHORITY_INFO_ACCESS__imp__i2d_AUTHORITY_KEYID__imp__i2d_BASIC_CONSTRAINTS__imp__i2d_CERTIFICATEPOLICIES__imp__i2d_CRL_DIST_POINTS__imp__i2d_DHparams__imp__i2d_DIRECTORYSTRING__imp__i2d_DISPLAYTEXT__imp__i2d_DIST_POINT__imp__i2d_DIST_POINT_NAME__imp__i2d_DSAPrivateKey__imp__i2d_DSAPrivateKey_bio__imp__i2d_DSAPrivateKey_fp__imp__i2d_DSAPublicKey__imp__i2d_DSA_PUBKEY__imp__i2d_DSA_PUBKEY_bio__imp__i2d_DSA_PUBKEY_fp__imp__i2d_DSA_SIG__imp__i2d_DSAparams__imp__i2d_ECDSA_SIG__imp__i2d_ECPKParameters__imp__i2d_ECParameters__imp__i2d_ECPrivateKey__imp__i2d_ECPrivateKey_bio__imp__i2d_ECPrivateKey_fp__imp__i2d_EC_PUBKEY__imp__i2d_EC_PUBKEY_bio__imp__i2d_EC_PUBKEY_fp__imp__i2d_EDIPARTYNAME__imp__i2d_EXTENDED_KEY_USAGE__imp__i2d_GENERAL_NAME__imp__i2d_GENERAL_NAMES__imp__i2d_KRB5_APREQ__imp__i2d_KRB5_APREQBODY__imp__i2d_KRB5_AUTHDATA__imp__i2d_KRB5_AUTHENT__imp__i2d_KRB5_AUTHENTBODY__imp__i2d_KRB5_CHECKSUM__imp__i2d_KRB5_ENCDATA__imp__i2d_KRB5_ENCKEY__imp__i2d_KRB5_PRINCNAME__imp__i2d_KRB5_TICKET__imp__i2d_KRB5_TKTBODY__imp__i2d_NETSCAPE_CERT_SEQUENCE__imp__i2d_NETSCAPE_SPKAC__imp__i2d_NETSCAPE_SPKI__imp__i2d_NOTICEREF__imp__i2d_Netscape_RSA__imp__i2d_OCSP_BASICRESP__imp__i2d_OCSP_CERTID__imp__i2d_OCSP_CERTSTATUS__imp__i2d_OCSP_CRLID__imp__i2d_OCSP_ONEREQ__imp__i2d_OCSP_REQINFO__imp__i2d_OCSP_REQUEST__imp__i2d_OCSP_RESPBYTES__imp__i2d_OCSP_RESPDATA__imp__i2d_OCSP_RESPID__imp__i2d_OCSP_RESPONSE__imp__i2d_OCSP_REVOKEDINFO__imp__i2d_OCSP_SERVICELOC__imp__i2d_OCSP_SIGNATURE__imp__i2d_OCSP_SINGLERESP__imp__i2d_OTHERNAME__imp__i2d_PBE2PARAM__imp__i2d_PBEPARAM__imp__i2d_PBKDF2PARAM__imp__i2d_PKCS12__imp__i2d_PKCS12_BAGS__imp__i2d_PKCS12_MAC_DATA__imp__i2d_PKCS12_SAFEBAG__imp__i2d_PKCS12_bio__imp__i2d_PKCS12_fp__imp__i2d_PKCS7__imp__i2d_PKCS7_DIGEST__imp__i2d_PKCS7_ENCRYPT__imp__i2d_PKCS7_ENC_CONTENT__imp__i2d_PKCS7_ENVELOPE__imp__i2d_PKCS7_ISSUER_AND_SERIAL__imp__i2d_PKCS7_NDEF__imp__i2d_PKCS7_RECIP_INFO__imp__i2d_PKCS7_SIGNED__imp__i2d_PKCS7_SIGNER_INFO__imp__i2d_PKCS7_SIGN_ENVELOPE__imp__i2d_PKCS7_bio__imp__i2d_PKCS7_fp__imp__i2d_PKCS8PrivateKeyInfo_bio__imp__i2d_PKCS8PrivateKeyInfo_fp__imp__i2d_PKCS8PrivateKey_bio__imp__i2d_PKCS8PrivateKey_fp__imp__i2d_PKCS8PrivateKey_nid_bio__imp__i2d_PKCS8PrivateKey_nid_fp__imp__i2d_PKCS8_PRIV_KEY_INFO__imp__i2d_PKCS8_PRIV_KEY_INFO_bio__imp__i2d_PKCS8_PRIV_KEY_INFO_fp__imp__i2d_PKCS8_bio__imp__i2d_PKCS8_fp__imp__i2d_PKEY_USAGE_PERIOD__imp__i2d_POLICYINFO__imp__i2d_POLICYQUALINFO__imp__i2d_PROXY_CERT_INFO_EXTENSION__imp__i2d_PROXY_POLICY__imp__i2d_PUBKEY__imp__i2d_PUBKEY_bio__imp__i2d_PUBKEY_fp__imp__i2d_PrivateKey__imp__i2d_PrivateKey_bio__imp__i2d_PrivateKey_fp__imp__i2d_PublicKey__imp__i2d_RSAPrivateKey__imp__i2d_RSAPrivateKey_bio__imp__i2d_RSAPrivateKey_fp__imp__i2d_RSAPublicKey__imp__i2d_RSAPublicKey_bio__imp__i2d_RSAPublicKey_fp__imp__i2d_RSA_NET__imp__i2d_RSA_PUBKEY__imp__i2d_RSA_PUBKEY_bio__imp__i2d_RSA_PUBKEY_fp__imp__i2d_SXNET__imp__i2d_SXNETID__imp__i2d_USERNOTICE__imp__i2d_X509__imp__i2d_X509_ALGOR__imp__i2d_X509_ALGORS__imp__i2d_X509_ATTRIBUTE__imp__i2d_X509_AUX__imp__i2d_X509_CERT_AUX__imp__i2d_X509_CERT_PAIR__imp__i2d_X509_CINF__imp__i2d_X509_CRL__imp__i2d_X509_CRL_INFO__imp__i2d_X509_CRL_bio__imp__i2d_X509_CRL_fp__imp__i2d_X509_EXTENSION__imp__i2d_X509_EXTENSIONS__imp__i2d_X509_NAME__imp__i2d_X509_NAME_ENTRY__imp__i2d_X509_PKEY__imp__i2d_X509_PUBKEY__imp__i2d_X509_REQ__imp__i2d_X509_REQ_INFO__imp__i2d_X509_REQ_bio__imp__i2d_X509_REQ_fp__imp__i2d_X509_REVOKED__imp__i2d_X509_SIG__imp__i2d_X509_VAL__imp__i2d_X509_bio__imp__i2d_X509_fp__imp__i2o_ECPublicKey__imp__i2s_ASN1_ENUMERATED__imp__i2s_ASN1_ENUMERATED_TABLE__imp__i2s_ASN1_INTEGER__imp__i2s_ASN1_OCTET_STRING__imp__i2t_ASN1_OBJECT__imp__i2v_ASN1_BIT_STRING__imp__i2v_GENERAL_NAME__imp__i2v_GENERAL_NAMES__imp__idea_cbc_encrypt__imp__idea_cfb64_encrypt__imp__idea_ecb_encrypt__imp__idea_encrypt__imp__idea_ofb64_encrypt__imp__idea_options__imp__idea_set_decrypt_key__imp__idea_set_encrypt_key__imp__int_CRYPTO_set_do_dynlock_callback__imp__int_smime_write_ASN1__imp__lh_delete__imp__lh_doall__imp__lh_doall_arg__imp__lh_free__imp__lh_insert__imp__lh_new__imp__lh_node_stats__imp__lh_node_stats_bio__imp__lh_node_usage_stats__imp__lh_node_usage_stats_bio__imp__lh_num_items__imp__lh_retrieve__imp__lh_stats__imp__lh_stats_bio__imp__lh_strhash__imp__ms_time_cmp__imp__ms_time_diff__imp__ms_time_free__imp__ms_time_get__imp__ms_time_new__imp__name_cmp__imp__o2i_ECPublicKey__imp__pitem_free__imp__pitem_new__imp__pqueue_find__imp__pqueue_free__imp__pqueue_insert__imp__pqueue_iterator__imp__pqueue_new__imp__pqueue_next__imp__pqueue_peek__imp__pqueue_pop__imp__pqueue_print__imp__s2i_ASN1_INTEGER__imp__s2i_ASN1_OCTET_STRING__imp__sk_delete__imp__sk_delete_ptr__imp__sk_dup__imp__sk_find__imp__sk_find_ex__imp__sk_free__imp__sk_insert__imp__sk_is_sorted__imp__sk_new__imp__sk_new_null__imp__sk_num__imp__sk_pop__imp__sk_pop_free__imp__sk_push__imp__sk_set__imp__sk_set_cmp_func__imp__sk_shift__imp__sk_sort__imp__sk_unshift__imp__sk_value__imp__sk_zero__imp__string_to_hex__imp__uni2asc__imp__v2i_ASN1_BIT_STRING__imp__v2i_GENERAL_NAME__imp__v2i_GENERAL_NAMES__imp__v2i_GENERAL_NAME_ex__ossl_096_des_random_seed__ossl_old_crypt__ossl_old_des_cbc_cksum__ossl_old_des_cbc_encrypt__ossl_old_des_cfb64_encrypt__ossl_old_des_cfb_encrypt__ossl_old_des_crypt__ossl_old_des_decrypt3__ossl_old_des_ecb3_encrypt__ossl_old_des_ecb_encrypt__ossl_old_des_ede3_cbc_encrypt__ossl_old_des_ede3_cfb64_encrypt__ossl_old_des_ede3_ofb64_encrypt__ossl_old_des_enc_read__ossl_old_des_enc_write__ossl_old_des_encrypt__ossl_old_des_encrypt2__ossl_old_des_encrypt3__ossl_old_des_fcrypt__ossl_old_des_is_weak_key__ossl_old_des_key_sched__ossl_old_des_ncbc_encrypt__ossl_old_des_ofb64_encrypt__ossl_old_des_ofb_encrypt__ossl_old_des_options__ossl_old_des_pcbc_encrypt__ossl_old_des_quad_cksum__ossl_old_des_random_key__ossl_old_des_random_seed__ossl_old_des_read_2passwords__ossl_old_des_read_password__ossl_old_des_read_pw__ossl_old_des_read_pw_string__ossl_old_des_set_key__ossl_old_des_set_odd_parity__ossl_old_des_string_to_2keys__ossl_old_des_string_to_key__ossl_old_des_xcbc_encrypt__shadow_DES_check_key__shadow_DES_rw_mode_a2d_ASN1_OBJECT_a2i_ASN1_ENUMERATED_a2i_ASN1_INTEGER_a2i_ASN1_STRING_a2i_IPADDRESS_a2i_IPADDRESS_NC_a2i_ipadd_asc2uni_asn1_Finish_asn1_GetSequence_asn1_add_error_asn1_const_Finish_asn1_do_adb_asn1_do_lock_asn1_enc_free_asn1_enc_init_asn1_enc_restore_asn1_enc_save_asn1_ex_c2i_asn1_ex_i2c_asn1_get_choice_selector_asn1_get_field_ptr_asn1_set_choice_selector_bn_add_words_bn_div_words_bn_dup_expand_bn_expand2_bn_mul_add_words_bn_mul_words_bn_sqr_words_bn_sub_words_c2i_ASN1_BIT_STRING_c2i_ASN1_INTEGER_c2i_ASN1_OBJECT_d2i_ACCESS_DESCRIPTION_d2i_ASN1_BIT_STRING_d2i_ASN1_BMPSTRING_d2i_ASN1_BOOLEAN_d2i_ASN1_ENUMERATED_d2i_ASN1_GENERALIZEDTIME_d2i_ASN1_GENERALSTRING_d2i_ASN1_HEADER_d2i_ASN1_IA5STRING_d2i_ASN1_INTEGER_d2i_ASN1_NULL_d2i_ASN1_OBJECT_d2i_ASN1_OCTET_STRING_d2i_ASN1_PRINTABLE_d2i_ASN1_PRINTABLESTRING_d2i_ASN1_SET_d2i_ASN1_T61STRING_d2i_ASN1_TIME_d2i_ASN1_TYPE_d2i_ASN1_UINTEGER_d2i_ASN1_UNIVERSALSTRING_d2i_ASN1_UTCTIME_d2i_ASN1_UTF8STRING_d2i_ASN1_VISIBLESTRING_d2i_ASN1_bytes_d2i_ASN1_type_bytes_d2i_AUTHORITY_INFO_ACCESS_d2i_AUTHORITY_KEYID_d2i_AutoPrivateKey_d2i_BASIC_CONSTRAINTS_d2i_CERTIFICATEPOLICIES_d2i_CRL_DIST_POINTS_d2i_DHparams_d2i_DIRECTORYSTRING_d2i_DISPLAYTEXT_d2i_DIST_POINT_d2i_DIST_POINT_NAME_d2i_DSAPrivateKey_d2i_DSAPrivateKey_bio_d2i_DSAPrivateKey_fp_d2i_DSAPublicKey_d2i_DSA_PUBKEY_d2i_DSA_PUBKEY_bio_d2i_DSA_PUBKEY_fp_d2i_DSA_SIG_d2i_DSAparams_d2i_ECDSA_SIG_d2i_ECPKParameters_d2i_ECParameters_d2i_ECPrivateKey_d2i_ECPrivateKey_bio_d2i_ECPrivateKey_fp_d2i_EC_PUBKEY_d2i_EC_PUBKEY_bio_d2i_EC_PUBKEY_fp_d2i_EDIPARTYNAME_d2i_EXTENDED_KEY_USAGE_d2i_GENERAL_NAME_d2i_GENERAL_NAMES_d2i_KRB5_APREQ_d2i_KRB5_APREQBODY_d2i_KRB5_AUTHDATA_d2i_KRB5_AUTHENT_d2i_KRB5_AUTHENTBODY_d2i_KRB5_CHECKSUM_d2i_KRB5_ENCDATA_d2i_KRB5_ENCKEY_d2i_KRB5_PRINCNAME_d2i_KRB5_TICKET_d2i_KRB5_TKTBODY_d2i_NETSCAPE_CERT_SEQUENCE_d2i_NETSCAPE_SPKAC_d2i_NETSCAPE_SPKI_d2i_NOTICEREF_d2i_Netscape_RSA_d2i_OCSP_BASICRESP_d2i_OCSP_CERTID_d2i_OCSP_CERTSTATUS_d2i_OCSP_CRLID_d2i_OCSP_ONEREQ_d2i_OCSP_REQINFO_d2i_OCSP_REQUEST_d2i_OCSP_RESPBYTES_d2i_OCSP_RESPDATA_d2i_OCSP_RESPID_d2i_OCSP_RESPONSE_d2i_OCSP_REVOKEDINFO_d2i_OCSP_SERVICELOC_d2i_OCSP_SIGNATURE_d2i_OCSP_SINGLERESP_d2i_OTHERNAME_d2i_PBE2PARAM_d2i_PBEPARAM_d2i_PBKDF2PARAM_d2i_PKCS12_d2i_PKCS12_BAGS_d2i_PKCS12_MAC_DATA_d2i_PKCS12_SAFEBAG_d2i_PKCS12_bio_d2i_PKCS12_fp_d2i_PKCS7_d2i_PKCS7_DIGEST_d2i_PKCS7_ENCRYPT_d2i_PKCS7_ENC_CONTENT_d2i_PKCS7_ENVELOPE_d2i_PKCS7_ISSUER_AND_SERIAL_d2i_PKCS7_RECIP_INFO_d2i_PKCS7_SIGNED_d2i_PKCS7_SIGNER_INFO_d2i_PKCS7_SIGN_ENVELOPE_d2i_PKCS7_bio_d2i_PKCS7_fp_d2i_PKCS8PrivateKey_bio_d2i_PKCS8PrivateKey_fp_d2i_PKCS8_PRIV_KEY_INFO_d2i_PKCS8_PRIV_KEY_INFO_bio_d2i_PKCS8_PRIV_KEY_INFO_fp_d2i_PKCS8_bio_d2i_PKCS8_fp_d2i_PKEY_USAGE_PERIOD_d2i_POLICYINFO_d2i_POLICYQUALINFO_d2i_PROXY_CERT_INFO_EXTENSION_d2i_PROXY_POLICY_d2i_PUBKEY_d2i_PUBKEY_bio_d2i_PUBKEY_fp_d2i_PrivateKey_d2i_PrivateKey_bio_d2i_PrivateKey_fp_d2i_PublicKey_d2i_RSAPrivateKey_d2i_RSAPrivateKey_bio_d2i_RSAPrivateKey_fp_d2i_RSAPublicKey_d2i_RSAPublicKey_bio_d2i_RSAPublicKey_fp_d2i_RSA_NET_d2i_RSA_PUBKEY_d2i_RSA_PUBKEY_bio_d2i_RSA_PUBKEY_fp_d2i_SXNET_d2i_SXNETID_d2i_USERNOTICE_d2i_X509_d2i_X509_ALGOR_d2i_X509_ALGORS_d2i_X509_ATTRIBUTE_d2i_X509_AUX_d2i_X509_CERT_AUX_d2i_X509_CERT_PAIR_d2i_X509_CINF_d2i_X509_CRL_d2i_X509_CRL_INFO_d2i_X509_CRL_bio_d2i_X509_CRL_fp_d2i_X509_EXTENSION_d2i_X509_EXTENSIONS_d2i_X509_NAME_d2i_X509_NAME_ENTRY_d2i_X509_PKEY_d2i_X509_PUBKEY_d2i_X509_REQ_d2i_X509_REQ_INFO_d2i_X509_REQ_bio_d2i_X509_REQ_fp_d2i_X509_REVOKED_d2i_X509_SIG_d2i_X509_VAL_d2i_X509_bio_d2i_X509_fp_get_rfc2409_prime_1024_get_rfc2409_prime_768_get_rfc3526_prime_1536_get_rfc3526_prime_2048_get_rfc3526_prime_3072_get_rfc3526_prime_4096_get_rfc3526_prime_6144_get_rfc3526_prime_8192_hex_to_string_i2a_ACCESS_DESCRIPTION_i2a_ASN1_ENUMERATED_i2a_ASN1_INTEGER_i2a_ASN1_OBJECT_i2a_ASN1_STRING_i2c_ASN1_BIT_STRING_i2c_ASN1_INTEGER_i2d_ACCESS_DESCRIPTION_i2d_ASN1_BIT_STRING_i2d_ASN1_BMPSTRING_i2d_ASN1_BOOLEAN_i2d_ASN1_ENUMERATED_i2d_ASN1_GENERALIZEDTIME_i2d_ASN1_GENERALSTRING_i2d_ASN1_HEADER_i2d_ASN1_IA5STRING_i2d_ASN1_INTEGER_i2d_ASN1_NULL_i2d_ASN1_OBJECT_i2d_ASN1_OCTET_STRING_i2d_ASN1_PRINTABLE_i2d_ASN1_PRINTABLESTRING_i2d_ASN1_SET_i2d_ASN1_T61STRING_i2d_ASN1_TIME_i2d_ASN1_TYPE_i2d_ASN1_UNIVERSALSTRING_i2d_ASN1_UTCTIME_i2d_ASN1_UTF8STRING_i2d_ASN1_VISIBLESTRING_i2d_ASN1_bytes_i2d_AUTHORITY_INFO_ACCESS_i2d_AUTHORITY_KEYID_i2d_BASIC_CONSTRAINTS_i2d_CERTIFICATEPOLICIES_i2d_CRL_DIST_POINTS_i2d_DHparams_i2d_DIRECTORYSTRING_i2d_DISPLAYTEXT_i2d_DIST_POINT_i2d_DIST_POINT_NAME_i2d_DSAPrivateKey_i2d_DSAPrivateKey_bio_i2d_DSAPrivateKey_fp_i2d_DSAPublicKey_i2d_DSA_PUBKEY_i2d_DSA_PUBKEY_bio_i2d_DSA_PUBKEY_fp_i2d_DSA_SIG_i2d_DSAparams_i2d_ECDSA_SIG_i2d_ECPKParameters_i2d_ECParameters_i2d_ECPrivateKey_i2d_ECPrivateKey_bio_i2d_ECPrivateKey_fp_i2d_EC_PUBKEY_i2d_EC_PUBKEY_bio_i2d_EC_PUBKEY_fp_i2d_EDIPARTYNAME_i2d_EXTENDED_KEY_USAGE_i2d_GENERAL_NAME_i2d_GENERAL_NAMES_i2d_KRB5_APREQ_i2d_KRB5_APREQBODY_i2d_KRB5_AUTHDATA_i2d_KRB5_AUTHENT_i2d_KRB5_AUTHENTBODY_i2d_KRB5_CHECKSUM_i2d_KRB5_ENCDATA_i2d_KRB5_ENCKEY_i2d_KRB5_PRINCNAME_i2d_KRB5_TICKET_i2d_KRB5_TKTBODY_i2d_NETSCAPE_CERT_SEQUENCE_i2d_NETSCAPE_SPKAC_i2d_NETSCAPE_SPKI_i2d_NOTICEREF_i2d_Netscape_RSA_i2d_OCSP_BASICRESP_i2d_OCSP_CERTID_i2d_OCSP_CERTSTATUS_i2d_OCSP_CRLID_i2d_OCSP_ONEREQ_i2d_OCSP_REQINFO_i2d_OCSP_REQUEST_i2d_OCSP_RESPBYTES_i2d_OCSP_RESPDATA_i2d_OCSP_RESPID_i2d_OCSP_RESPONSE_i2d_OCSP_REVOKEDINFO_i2d_OCSP_SERVICELOC_i2d_OCSP_SIGNATURE_i2d_OCSP_SINGLERESP_i2d_OTHERNAME_i2d_PBE2PARAM_i2d_PBEPARAM_i2d_PBKDF2PARAM_i2d_PKCS12_i2d_PKCS12_BAGS_i2d_PKCS12_MAC_DATA_i2d_PKCS12_SAFEBAG_i2d_PKCS12_bio_i2d_PKCS12_fp_i2d_PKCS7_i2d_PKCS7_DIGEST_i2d_PKCS7_ENCRYPT_i2d_PKCS7_ENC_CONTENT_i2d_PKCS7_ENVELOPE_i2d_PKCS7_ISSUER_AND_SERIAL_i2d_PKCS7_NDEF_i2d_PKCS7_RECIP_INFO_i2d_PKCS7_SIGNED_i2d_PKCS7_SIGNER_INFO_i2d_PKCS7_SIGN_ENVELOPE_i2d_PKCS7_bio_i2d_PKCS7_fp_i2d_PKCS8PrivateKeyInfo_bio_i2d_PKCS8PrivateKeyInfo_fp_i2d_PKCS8PrivateKey_bio_i2d_PKCS8PrivateKey_fp_i2d_PKCS8PrivateKey_nid_bio_i2d_PKCS8PrivateKey_nid_fp_i2d_PKCS8_PRIV_KEY_INFO_i2d_PKCS8_PRIV_KEY_INFO_bio_i2d_PKCS8_PRIV_KEY_INFO_fp_i2d_PKCS8_bio_i2d_PKCS8_fp_i2d_PKEY_USAGE_PERIOD_i2d_POLICYINFO_i2d_POLICYQUALINFO_i2d_PROXY_CERT_INFO_EXTENSION_i2d_PROXY_POLICY_i2d_PUBKEY_i2d_PUBKEY_bio_i2d_PUBKEY_fp_i2d_PrivateKey_i2d_PrivateKey_bio_i2d_PrivateKey_fp_i2d_PublicKey_i2d_RSAPrivateKey_i2d_RSAPrivateKey_bio_i2d_RSAPrivateKey_fp_i2d_RSAPublicKey_i2d_RSAPublicKey_bio_i2d_RSAPublicKey_fp_i2d_RSA_NET_i2d_RSA_PUBKEY_i2d_RSA_PUBKEY_bio_i2d_RSA_PUBKEY_fp_i2d_SXNET_i2d_SXNETID_i2d_USERNOTICE_i2d_X509_i2d_X509_ALGOR_i2d_X509_ALGORS_i2d_X509_ATTRIBUTE_i2d_X509_AUX_i2d_X509_CERT_AUX_i2d_X509_CERT_PAIR_i2d_X509_CINF_i2d_X509_CRL_i2d_X509_CRL_INFO_i2d_X509_CRL_bio_i2d_X509_CRL_fp_i2d_X509_EXTENSION_i2d_X509_EXTENSIONS_i2d_X509_NAME_i2d_X509_NAME_ENTRY_i2d_X509_PKEY_i2d_X509_PUBKEY_i2d_X509_REQ_i2d_X509_REQ_INFO_i2d_X509_REQ_bio_i2d_X509_REQ_fp_i2d_X509_REVOKED_i2d_X509_SIG_i2d_X509_VAL_i2d_X509_bio_i2d_X509_fp_i2o_ECPublicKey_i2s_ASN1_ENUMERATED_i2s_ASN1_ENUMERATED_TABLE_i2s_ASN1_INTEGER_i2s_ASN1_OCTET_STRING_i2t_ASN1_OBJECT_i2v_ASN1_BIT_STRING_i2v_GENERAL_NAME_i2v_GENERAL_NAMES_idea_cbc_encrypt_idea_cfb64_encrypt_idea_ecb_encrypt_idea_encrypt_idea_ofb64_encrypt_idea_options_idea_set_decrypt_key_idea_set_encrypt_key_int_CRYPTO_set_do_dynlock_callback_int_smime_write_ASN1_lh_delete_lh_doall_lh_doall_arg_lh_free_lh_insert_lh_new_lh_node_stats_lh_node_stats_bio_lh_node_usage_stats_lh_node_usage_stats_bio_lh_num_items_lh_retrieve_lh_stats_lh_stats_bio_lh_strhash_ms_time_cmp_ms_time_diff_ms_time_free_ms_time_get_ms_time_new_name_cmp_o2i_ECPublicKey_pitem_free_pitem_new_pqueue_find_pqueue_free_pqueue_insert_pqueue_iterator_pqueue_new_pqueue_next_pqueue_peek_pqueue_pop_pqueue_print_s2i_ASN1_INTEGER_s2i_ASN1_OCTET_STRING_sk_delete_sk_delete_ptr_sk_dup_sk_find_sk_find_ex_sk_free_sk_insert_sk_is_sorted_sk_new_sk_new_null_sk_num_sk_pop_sk_pop_free_sk_push_sk_set_sk_set_cmp_func_sk_shift_sk_sort_sk_unshift_sk_value_sk_zero_string_to_hex_uni2asc_v2i_ASN1_BIT_STRING_v2i_GENERAL_NAME_v2i_GENERAL_NAMES_v2i_GENERAL_NAME_exLIBEAY32_NULL_THUNK_DATA LIBEAY32.dll/ 1261339772 0 498 ` L|„.K.debug$SBŒ@B.idata$2Îâ@0À.idata$6â@ À LIBEAY32.dll' xMicrosoft (R) LINK LIBEAY32.dll@comp.id x“ÿÿ.idata$2@Àh.idata$6.idata$4@Àh.idata$5@Àh!:T__IMPORT_DESCRIPTOR_LIBEAY32__NULL_IMPORT_DESCRIPTORLIBEAY32_NULL_THUNK_DATALIBEAY32.dll/ 1261339772 0 251 ` L|„.Kº.debug$SBd@B.idata$3¦@0À LIBEAY32.dll' xMicrosoft (R) LINK@comp.id x“ÿÿ__NULL_IMPORT_DESCRIPTOR LIBEAY32.dll/ 1261339772 0 280 ` L|„.KÖ.debug$SBŒ@B.idata$5Î@0À.idata$4Ò@0À LIBEAY32.dll' xMicrosoft (R) LINK@comp.id x“ÿÿLIBEAY32_NULL_THUNK_DATALIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Ê_ACCESS_DESCRIPTION_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$¿ _ACCESS_DESCRIPTION_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%…_ACCESS_DESCRIPTION_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_AES_bi_ige_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kc _AES_cbc_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!‘ _AES_cfb128_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÏ _AES_cfb1_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K½ _AES_cfb8_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%¼ _AES_cfbr_encrypt_blockLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _AES_ctr128_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kà _AES_decryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kñ _AES_ecb_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.KÙ _AES_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kõ_AES_ige_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _AES_ofb128_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K _AES_optionsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"" _AES_set_decrypt_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Ð _AES_set_encrypt_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KY_AES_unwrap_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KZ_AES_wrap_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.KÛ _ASN1_ANY_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(_ASN1_BIT_STRING_asn1_methLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K# _ASN1_BIT_STRING_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&$_ASN1_BIT_STRING_get_bitLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!> _ASN1_BIT_STRING_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)V_ASN1_BIT_STRING_name_printLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"¥_ASN1_BIT_STRING_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Â_ASN1_BIT_STRING_num_ascLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"=_ASN1_BIT_STRING_setLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&á_ASN1_BIT_STRING_set_ascLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&%_ASN1_BIT_STRING_set_bitLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _ASN1_BMPSTRING_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ã _ASN1_BMPSTRING_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_ASN1_BMPSTRING_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KF _ASN1_BOOLEAN_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ë_ASN1_ENUMERATED_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"¶_ASN1_ENUMERATED_getLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Ç _ASN1_ENUMERATED_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_ASN1_ENUMERATED_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"µ_ASN1_ENUMERATED_setLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$¸_ASN1_ENUMERATED_to_BNLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kö _ASN1_FBOOLEAN_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)…_ASN1_GENERALIZEDTIME_checkLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(t_ASN1_GENERALIZEDTIME_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&# _ASN1_GENERALIZEDTIME_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'N_ASN1_GENERALIZEDTIME_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)†_ASN1_GENERALIZEDTIME_printLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'‡_ASN1_GENERALIZEDTIME_setLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 66 ` ÿÿL|„.K.ˆ_ASN1_GENERALIZEDTIME_set_stringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&í _ASN1_GENERALSTRING_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$É _ASN1_GENERALSTRING_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K% _ASN1_GENERALSTRING_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_ASN1_HEADER_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_ASN1_HEADER_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'_ASN1_IA5STRING_asn1_methLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_ASN1_IA5STRING_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ¢ _ASN1_IA5STRING_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_ASN1_IA5STRING_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K«_ASN1_INTEGER_cmpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KB_ASN1_INTEGER_dupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ?_ASN1_INTEGER_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_ASN1_INTEGER_getLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kb _ASN1_INTEGER_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KS_ASN1_INTEGER_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_ASN1_INTEGER_setLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _ASN1_INTEGER_to_BNLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kx_ASN1_NULL_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KN _ASN1_NULL_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kz_ASN1_NULL_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _ASN1_OBJECT_createLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _ASN1_OBJECT_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kl _ASN1_OBJECT_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K _ASN1_OBJECT_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(= _ASN1_OCTET_STRING_NDEF_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$£_ASN1_OCTET_STRING_cmpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$<_ASN1_OCTET_STRING_dupLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%à_ASN1_OCTET_STRING_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K# _ASN1_OCTET_STRING_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$R_ASN1_OCTET_STRING_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ø_ASN1_OCTET_STRING_setLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(Ž_ASN1_PRINTABLESTRING_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&í _ASN1_PRINTABLESTRING_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'é_ASN1_PRINTABLESTRING_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _ASN1_PRINTABLE_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K - _ASN1_PRINTABLE_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _ASN1_PRINTABLE_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _ASN1_PRINTABLE_typeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _ASN1_SEQUENCE_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$Å_ASN1_STRING_TABLE_addLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(ä_ASN1_STRING_TABLE_cleanupLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$+_ASN1_STRING_TABLE_getLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_ASN1_STRING_cmpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_ASN1_STRING_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_ASN1_STRING_dupLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!S _ASN1_STRING_encodeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_ASN1_STRING_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+_ASN1_STRING_get_default_maskLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ç_ASN1_STRING_lengthLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%X_ASN1_STRING_length_setLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_ASN1_STRING_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K _ASN1_STRING_printLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#€ _ASN1_STRING_print_exLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&~ _ASN1_STRING_print_ex_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_ASN1_STRING_setLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K]_ASN1_STRING_set0LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Ì_ASN1_STRING_set_by_NIDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+ð_ASN1_STRING_set_default_maskLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 67 ` ÿÿL|„.K/¨_ASN1_STRING_set_default_mask_ascLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Š _ASN1_STRING_to_UTF8LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KŸ_ASN1_STRING_typeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#_ASN1_STRING_type_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"š_ASN1_T61STRING_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K  _ASN1_T61STRING_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _ASN1_T61STRING_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_ _ASN1_TBOOLEAN_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÞ _ASN1_TIME_checkLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K¢_ASN1_TIME_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K› _ASN1_TIME_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kµ_ASN1_TIME_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K‰_ASN1_TIME_printLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kå_ASN1_TIME_setLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+a _ASN1_TIME_to_generalizedtimeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_ASN1_TYPE_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K”_ASN1_TYPE_getLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,4_ASN1_TYPE_get_int_octetstringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(5_ASN1_TYPE_get_octetstringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K_ASN1_TYPE_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K•_ASN1_TYPE_setLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K\_ASN1_TYPE_set1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,6_ASN1_TYPE_set_int_octetstringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(7_ASN1_TYPE_set_octetstringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(¡ _ASN1_UNIVERSALSTRING_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&¢ _ASN1_UNIVERSALSTRING_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'ž _ASN1_UNIVERSALSTRING_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K-_ASN1_UNIVERSALSTRING_to_stringLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_ASN1_UTCTIME_checkLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&— _ASN1_UTCTIME_cmp_time_tLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Ä_ASN1_UTCTIME_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÍ _ASN1_UTCTIME_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _ASN1_UTCTIME_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_ASN1_UTCTIME_printLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_ASN1_UTCTIME_setLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&8_ASN1_UTCTIME_set_stringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#,_ASN1_UTF8STRING_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ß _ASN1_UTF8STRING_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"’_ASN1_UTF8STRING_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&F_ASN1_VISIBLESTRING_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$1 _ASN1_VISIBLESTRING_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Œ_ASN1_VISIBLESTRING_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"r _ASN1_add_oid_moduleLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&_ASN1_check_infinite_endLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,'_ASN1_const_check_infinite_endLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_ASN1_d2i_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K_ASN1_d2i_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K_ASN1_digestLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.K_ASN1_dupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"  _ASN1_generate_nconfLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kó _ASN1_generate_v3LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K _ASN1_get_objectLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K!_ASN1_i2d_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K"_ASN1_i2d_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kê _ASN1_item_d2iLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ý _ASN1_item_d2i_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K4 _ASN1_item_d2i_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kø _ASN1_item_digestLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KÔ _ASN1_item_dupLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _ASN1_item_ex_d2iLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K E _ASN1_item_ex_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kå _ASN1_item_ex_i2dLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K÷ _ASN1_item_ex_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K? _ASN1_item_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K_ _ASN1_item_i2dLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K * _ASN1_item_i2d_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _ASN1_item_i2d_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ì _ASN1_item_ndef_i2dLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K` _ASN1_item_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K@ _ASN1_item_packLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kµ _ASN1_item_signLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KP _ASN1_item_unpackLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÙ _ASN1_item_verifyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!‘_ASN1_mbstring_copyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"K_ASN1_mbstring_ncopyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K#_ASN1_object_sizeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kí_ASN1_pack_stringLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K$_ASN1_parseLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K{ _ASN1_parse_dumpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ë _ASN1_primitive_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!, _ASN1_primitive_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kà _ASN1_put_eocLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K%_ASN1_put_objectLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kë_ASN1_seq_packLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kê_ASN1_seq_unpackLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K&_ASN1_signLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kä _ASN1_tag2bitLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kq_ASN1_tag2strLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K « _ASN1_template_d2iLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ž _ASN1_template_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K  _ASN1_template_i2dLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K  _ASN1_template_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ì_ASN1_unpack_stringLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K'_ASN1_verifyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)_AUTHORITY_INFO_ACCESS_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'õ _AUTHORITY_INFO_ACCESS_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(Ç_AUTHORITY_INFO_ACCESS_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#é_AUTHORITY_KEYID_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!A _AUTHORITY_KEYID_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"è_AUTHORITY_KEYID_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Š_BASIC_CONSTRAINTS_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#j _BASIC_CONSTRAINTS_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$‹_BASIC_CONSTRAINTS_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K(_BF_cbc_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K)_BF_cfb64_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KÛ_BF_decryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K*_BF_ecb_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K+_BF_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K,_BF_ofb64_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K-_BF_optionsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K._BF_set_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Kb _BIGNUM_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K3_BIO_acceptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Ì_BIO_callback_ctrlLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_BIO_clear_flagsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"»_BIO_copy_next_retryLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.K4_BIO_ctrlLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(_BIO_ctrl_get_read_requestLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+ _BIO_ctrl_get_write_guaranteeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_BIO_ctrl_pendingLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*r_BIO_ctrl_reset_read_requestLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K _BIO_ctrl_wpendingLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!6_BIO_debug_callbackLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(_BIO_dgram_non_fatal_errorLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.K7_BIO_dumpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K´_BIO_dump_cbLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K* _BIO_dump_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kz _BIO_dump_indentLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!q_BIO_dump_indent_cbLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!· _BIO_dump_indent_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K8_BIO_dup_chainLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K9_BIO_f_base64LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K:_BIO_f_bufferLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K;_BIO_f_cipherLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.K<_BIO_f_mdLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K“_BIO_f_nbio_testLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K=_BIO_f_nullLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÜ_BIO_f_reliableLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%?_BIO_fd_non_fatal_errorLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"@_BIO_fd_should_retryLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KA_BIO_find_typeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KB_BIO_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KC_BIO_free_allLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$E_BIO_get_accept_socketLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_BIO_get_callbackLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#>_BIO_get_callback_argLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K&_BIO_get_ex_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#'_BIO_get_ex_new_indexLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KG_BIO_get_host_ipLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KH_BIO_get_portLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K I_BIO_get_retry_BIOLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#J_BIO_get_retry_reasonLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K K_BIO_gethostbynameLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KL_BIO_getsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kª _BIO_indentLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K5_BIO_int_ctrlLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K:_BIO_method_nameLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kò_BIO_method_typeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.KN_BIO_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KO_BIO_new_acceptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _BIO_new_bio_pairLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KP_BIO_new_connectLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K _BIO_new_dgramLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KQ_BIO_new_fdLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KR_BIO_new_fileLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KS_BIO_new_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KZ_BIO_new_mem_bufLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KT_BIO_new_socketLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.K _BIO_nextLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.KT_BIO_nreadLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KX_BIO_nread0LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K›_BIO_number_readLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!š_BIO_number_writtenLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KR_BIO_nwriteLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.KV_BIO_nwrite0LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.KU_BIO_popLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KV_BIO_printfLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KÉ_BIO_ptr_ctrlLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KW_BIO_pushLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KX_BIO_putsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KY_BIO_readLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KZ_BIO_s_acceptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K_BIO_s_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K[_BIO_s_connectLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÖ _BIO_s_datagramLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.K\_BIO_s_fdLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K]_BIO_s_fileLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K__BIO_s_memLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K`_BIO_s_nullLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kb_BIO_s_socketLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.Kd_BIO_setLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K?_BIO_set_callbackLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ì_BIO_set_callback_argLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Ke_BIO_set_cipherLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K(_BIO_set_ex_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kï_BIO_set_flagsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!f_BIO_set_tcp_ndelayLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kô_BIO_snprintfLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kg_BIO_sock_cleanupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kh_BIO_sock_errorLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Ki_BIO_sock_initLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'j_BIO_sock_non_fatal_errorLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$k_BIO_sock_should_retryLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kl_BIO_socket_ioctlLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KN_BIO_socket_nbioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_BIO_test_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K _BIO_vfreeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K‹ _BIO_vprintfLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KŒ _BIO_vsnprintfLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Km_BIO_writeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Í_BN_BLINDING_convertLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%‰ _BN_BLINDING_convert_exLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'y_BN_BLINDING_create_paramLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÕ_BN_BLINDING_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$_BN_BLINDING_get_flagsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K( _BN_BLINDING_get_thread_idLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Î_BN_BLINDING_invertLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ _BN_BLINDING_invert_exLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÔ_BN_BLINDING_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$S _BN_BLINDING_set_flagsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(º_BN_BLINDING_set_thread_idLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Ï_BN_BLINDING_updateLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KÁ_BN_CTX_endLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kn_BN_CTX_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KÃ_BN_CTX_getLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Ko_BN_CTX_initLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Ko_BN_CTX_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KÂ_BN_CTX_startLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K’ _BN_GENCB_callLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kö _BN_GF2m_addLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kà _BN_GF2m_arr2polyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K» _BN_GF2m_modLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kg _BN_GF2m_mod_arrLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K\ _BN_GF2m_mod_divLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_BN_GF2m_mod_div_arrLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_BN_GF2m_mod_expLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"! _BN_GF2m_mod_exp_arrLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K _BN_GF2m_mod_invLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"¸_BN_GF2m_mod_inv_arrLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K¢ _BN_GF2m_mod_mulLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"& _BN_GF2m_mod_mul_arrLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%E_BN_GF2m_mod_solve_quadLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)Y _BN_GF2m_mod_solve_quad_arrLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KE _BN_GF2m_mod_sqrLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Ô _BN_GF2m_mod_sqr_arrLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÜ _BN_GF2m_mod_sqrtLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#{ _BN_GF2m_mod_sqrt_arrLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KŒ _BN_GF2m_poly2arrLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KU_BN_MONT_CTX_copyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kp_BN_MONT_CTX_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kp_BN_MONT_CTX_initLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kq_BN_MONT_CTX_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kr_BN_MONT_CTX_setLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%î _BN_MONT_CTX_set_lockedLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kj_BN_RECP_CTX_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kh_BN_RECP_CTX_initLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Ki_BN_RECP_CTX_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kk_BN_RECP_CTX_setLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&õ_BN_X931_derive_prime_exLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ý _BN_X931_generate_XpqLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(Ü_BN_X931_generate_prime_exLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.Ks_BN_addLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kt_BN_add_wordLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Kv_BN_bin2bnLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Kx_BN_bn2binLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Kê_BN_bn2decLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Kw_BN_bn2hexLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K"_BN_bn2mpiLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K  _BN_bntest_randLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.Ky_BN_clearLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kz_BN_clear_bitLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K{_BN_clear_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.K|_BN_cmpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.K}_BN_copyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Ké_BN_dec2bnLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.K~_BN_divLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kn_BN_div_recpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K_BN_div_wordLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.K€_BN_dupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.Kæ_BN_expLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.K_BN_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!‚_BN_from_montgomeryLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.Kƒ_BN_gcdLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K „_BN_generate_primeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#~_BN_generate_prime_exLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K% _BN_get0_nist_prime_192LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K% _BN_get0_nist_prime_224LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%-_BN_get0_nist_prime_256LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K% _BN_get0_nist_prime_384LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%|_BN_get0_nist_prime_521LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Ká_BN_get_paramsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K…_BN_get_wordLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Ku_BN_hex2bnLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.KG_BN_initLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K†_BN_is_bit_setLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K‡_BN_is_primeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K¯ _BN_is_prime_exLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#À_BN_is_prime_fasttestLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&†_BN_is_prime_fasttest_exLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kà _BN_kroneckerLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Kˆ_BN_lshiftLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K‰_BN_lshift1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KŠ_BN_mask_bitsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KÖ _BN_mod_addLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kk _BN_mod_add_quickLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KŒ_BN_mod_expLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kê_BN_mod_exp2_montLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_BN_mod_exp_montLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(ö _BN_mod_exp_mont_consttimeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#a _BN_mod_exp_mont_wordLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Km_BN_mod_exp_recpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K _BN_mod_exp_simpleLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_BN_mod_inverseLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K0 _BN_mod_lshiftLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KO _BN_mod_lshift1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#Ž _BN_mod_lshift1_quickLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"= _BN_mod_lshift_quickLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K‘_BN_mod_mulLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$’_BN_mod_mul_montgomeryLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$l_BN_mod_mul_reciprocalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kò _BN_mod_sqrLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K‘ _BN_mod_sqrtLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K _BN_mod_subLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Ku _BN_mod_sub_quickLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K”_BN_mod_wordLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K#_BN_mpi2bnLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.K•_BN_mulLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kç_BN_mul_wordLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.K–_BN_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K _BN_nist_mod_192LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kü _BN_nist_mod_224LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kv_BN_nist_mod_256LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K9_BN_nist_mod_384LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_BN_nist_mod_521LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.K. _BN_nnmodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K—_BN_num_bitsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K˜_BN_num_bits_wordLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K™_BN_optionsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.Kš_BN_printLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K›_BN_print_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K¿_BN_pseudo_randLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#Û _BN_pseudo_rand_rangeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.Kœ_BN_randLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K¢ _BN_rand_rangeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K_BN_reciprocalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Kž_BN_rshiftLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KŸ_BN_rshift1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K _BN_set_bitLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K3_BN_set_negativeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kà_BN_set_paramsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K¡_BN_set_wordLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.K¢_BN_sqrLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.K£_BN_subLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kè_BN_sub_wordLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.K® _BN_swapLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$·_BN_to_ASN1_ENUMERATEDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!¤_BN_to_ASN1_INTEGERLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.KÄ_BN_uaddLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.K¥_BN_ucmpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.KÅ_BN_usubLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K¦_BN_value_oneLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K§_BUF_MEM_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K¨_BUF_MEM_growLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!§ _BUF_MEM_grow_cleanLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K©_BUF_MEM_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K¡ _BUF_memdupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kª_BUF_strdupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K© _BUF_strlcatLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K« _BUF_strlcpyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K¹ _BUF_strndupLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kà_CAST_cbc_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!á_CAST_cfb64_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KÞ_CAST_decryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kß_CAST_ecb_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KÝ_CAST_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!â_CAST_ofb64_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KÜ_CAST_set_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K¦ _CBIGNUM_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'Î_CERTIFICATEPOLICIES_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%¨ _CERTIFICATEPOLICIES_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Í_CERTIFICATEPOLICIES_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KI_COMP_CTX_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KH_COMP_CTX_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"x_COMP_compress_blockLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K y_COMP_expand_blockLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.Kz_COMP_rleLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K{_COMP_zlibLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K `_COMP_zlib_cleanupLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kð_CONF_dump_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kë_CONF_dump_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K«_CONF_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,z _CONF_get1_default_config_fileLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K¬_CONF_get_numberLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K­_CONF_get_sectionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K®_CONF_get_stringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%{ _CONF_imodule_get_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&| _CONF_imodule_get_moduleLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$~ _CONF_imodule_get_nameLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(€ _CONF_imodule_get_usr_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%v _CONF_imodule_get_valueLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K% _CONF_imodule_set_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(o _CONF_imodule_set_usr_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K¯_CONF_loadLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K _CONF_load_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_CONF_load_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Ky _CONF_module_addLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'q _CONF_module_get_usr_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'w _CONF_module_set_usr_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"s _CONF_modules_finishLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K š _CONF_modules_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K } _CONF_modules_loadLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%n _CONF_modules_load_fileLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"u _CONF_modules_unloadLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kx _CONF_parse_listLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&ò_CONF_set_default_methodLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K _CONF_set_nconfLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#_CRL_DIST_POINTS_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!5 _CRL_DIST_POINTS_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_CRL_DIST_POINTS_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K°_CRYPTO_add_lockLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K), _CRYPTO_cleanup_all_ex_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K±_CRYPTO_dbg_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Æ_CRYPTO_dbg_get_optionsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ²_CRYPTO_dbg_mallocLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ß_CRYPTO_dbg_pop_infoLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ç_CRYPTO_dbg_push_infoLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!³_CRYPTO_dbg_reallocLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)ú_CRYPTO_dbg_remove_all_infoLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%m_CRYPTO_dbg_set_optionsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'm _CRYPTO_destroy_dynlockidLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_CRYPTO_dup_ex_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'Ü _CRYPTO_ex_data_new_classLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kµ_CRYPTO_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ì_CRYPTO_free_ex_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!é_CRYPTO_free_lockedLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+¶_CRYPTO_get_add_lock_callbackLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 69 ` ÿÿL|„.K1t _CRYPTO_get_dynlock_create_callbackLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 70 ` ÿÿL|„.K2r _CRYPTO_get_dynlock_destroy_callbackLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 67 ` ÿÿL|„.K/q _CRYPTO_get_dynlock_lock_callbackLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K's _CRYPTO_get_dynlock_valueLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!í_CRYPTO_get_ex_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 68 ` ÿÿL|„.K0? _CRYPTO_get_ex_data_implementationLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&_CRYPTO_get_ex_new_indexLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%·_CRYPTO_get_id_callbackLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#¸_CRYPTO_get_lock_nameLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 69 ` ÿÿL|„.K1Ý _CRYPTO_get_locked_mem_ex_functionsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 66 ` ÿÿL|„.K.ç_CRYPTO_get_locked_mem_functionsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*¹_CRYPTO_get_locking_callbackLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K-o_CRYPTO_get_mem_debug_functionsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+È_CRYPTO_get_mem_debug_optionsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*' _CRYPTO_get_mem_ex_functionsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'º_CRYPTO_get_mem_functionsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'j _CRYPTO_get_new_dynlockidLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$_CRYPTO_get_new_lockidLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%p_CRYPTO_is_mem_check_onLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K»_CRYPTO_lockLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K¼_CRYPTO_mallocLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'æ_CRYPTO_malloc_debug_initLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#è_CRYPTO_malloc_lockedLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K½_CRYPTO_mem_ctrlLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K¾_CRYPTO_mem_leaksLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"¿_CRYPTO_mem_leaks_cbLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"À_CRYPTO_mem_leaks_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_CRYPTO_new_ex_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _CRYPTO_num_locksLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kr_CRYPTO_pop_infoLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K s_CRYPTO_push_info_LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÁ_CRYPTO_reallocLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#¨ _CRYPTO_realloc_cleanLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÂ_CRYPTO_remallocLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%n_CRYPTO_remove_all_infoLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+Ã_CRYPTO_set_add_lock_callbackLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 69 ` ÿÿL|„.K1o _CRYPTO_set_dynlock_create_callbackLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 70 ` ÿÿL|„.K2l _CRYPTO_set_dynlock_destroy_callbackLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 67 ` ÿÿL|„.K/p _CRYPTO_set_dynlock_lock_callbackLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ï_CRYPTO_set_ex_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 68 ` ÿÿL|„.K0 _CRYPTO_set_ex_data_implementationLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Ä_CRYPTO_set_id_callbackLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 69 ` ÿÿL|„.K1Ò _CRYPTO_set_locked_mem_ex_functionsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 66 ` ÿÿL|„.K.æ_CRYPTO_set_locked_mem_functionsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*Å_CRYPTO_set_locking_callbackLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K-q_CRYPTO_set_mem_debug_functionsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+t_CRYPTO_set_mem_debug_optionsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*Ú _CRYPTO_set_mem_ex_functionsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'Æ_CRYPTO_set_mem_functionsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,Õ_CRYPTO_set_mem_info_functionsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Ký_CRYPTO_strdupLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÇ_CRYPTO_thread_idLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K _DES_cbc_cksumLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K _DES_cbc_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K _DES_cfb64_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K _DES_cfb_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#Ð_DES_check_key_parityLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.KÉ_DES_cryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_DES_decrypt3LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_DES_ecb3_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_DES_ecb_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#_DES_ede3_cbc_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$É_DES_ede3_cbcm_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%_DES_ede3_cfb64_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#¹ _DES_ede3_cfb_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%_DES_ede3_ofb64_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_DES_enc_readLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K_DES_enc_writeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_DES_encrypt1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_DES_encrypt2LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_DES_encrypt3LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K_DES_fcryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_DES_is_weak_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K_DES_key_schedLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_DES_ncbc_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K _DES_ofb64_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_DES_ofb_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K_DES_optionsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _DES_pcbc_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K!_DES_quad_cksumLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K"_DES_random_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"† _DES_read_2passwordsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ‡ _DES_read_passwordLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K(_DES_set_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"`_DES_set_key_checkedLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$c_DES_set_key_uncheckedLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!)_DES_set_odd_parityLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"*_DES_string_to_2keysLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K +_DES_string_to_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K,_DES_xcbc_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kb_DH_OpenSSLLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KÈ_DH_checkLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K¾_DH_check_pub_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÉ_DH_compute_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.KÊ_DH_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KË_DH_generate_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Ì_DH_generate_parametersLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(_DH_generate_parameters_exLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$d_DH_get_default_methodLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K^_DH_get_ex_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"__DH_get_ex_new_indexLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.KÍ_DH_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Ka_DH_new_methodLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$f_DH_set_default_methodLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K[_DH_set_ex_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K\_DH_set_methodLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.KÎ_DH_sizeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Kr _DH_up_refLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÏ_DHparams_printLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Ð_DHparams_print_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ö_DIRECTORYSTRING_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Ï _DIRECTORYSTRING_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Y_DIRECTORYSTRING_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÎ_DISPLAYTEXT_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K _DISPLAYTEXT_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Ks_DISPLAYTEXT_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K# _DIST_POINT_NAME_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _DIST_POINT_NAME_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _DIST_POINT_NAME_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_DIST_POINT_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K† _DIST_POINT_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_DIST_POINT_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K]_DSA_OpenSSLLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K6_DSA_SIG_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K5_DSA_SIG_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K7_DSA_do_signLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K8_DSA_do_verifyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KO_DSA_dup_DHLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KÑ_DSA_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÒ_DSA_generate_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Ó_DSA_generate_parametersLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)g_DSA_generate_parameters_exLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%•_DSA_get_default_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kg_DSA_get_ex_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#c_DSA_get_ex_new_indexLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.KÕ_DSA_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K`_DSA_new_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.KÖ_DSA_printLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K×_DSA_print_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Å_DSA_set_default_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Ke_DSA_set_ex_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_DSA_set_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KØ_DSA_signLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÙ_DSA_sign_setupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KÚ_DSA_sizeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Ká _DSA_up_refLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KÛ_DSA_verifyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÜ_DSAparams_printLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Ý_DSAparams_print_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kã_DSO_METHOD_dlLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kà_DSO_METHOD_dlfcnLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÞ_DSO_METHOD_nullLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ß_DSO_METHOD_opensslLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kž _DSO_METHOD_vmsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Ká_DSO_METHOD_win32LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Ki _DSO_bind_funcLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KÝ_DSO_bind_varLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#: _DSO_convert_filenameLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.Kõ_DSO_ctrlLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.KÖ_DSO_flagsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KÕ_DSO_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Ù_DSO_get_default_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K+ _DSO_get_filenameLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&« _DSO_get_loaded_filenameLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÚ_DSO_get_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KÜ_DSO_loadLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K²_DSO_mergeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.KÓ_DSO_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÔ_DSO_new_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Ø_DSO_set_default_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K> _DSO_set_filenameLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÛ_DSO_set_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%! _DSO_set_name_converterLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K _DSO_up_refLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kr _ECDH_OpenSSLLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K<_ECDH_compute_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K& _ECDH_get_default_methodLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kn _ECDH_get_ex_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$_ECDH_get_ex_new_indexLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Ý _ECDH_set_default_methodLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_ECDH_set_ex_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_ECDH_set_methodLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K$_ECDSA_OpenSSLLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K _ECDSA_SIG_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KC _ECDSA_SIG_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kp _ECDSA_do_signLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KW_ECDSA_do_sign_exLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KX_ECDSA_do_verifyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K' _ECDSA_get_default_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K µ _ECDSA_get_ex_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K% _ECDSA_get_ex_new_indexLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K')_ECDSA_set_default_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ›_ECDSA_set_ex_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K“_ECDSA_set_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K‡_ECDSA_signLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KK _ECDSA_sign_exLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KX _ECDSA_sign_setupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kz_ECDSA_sizeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KR_ECDSA_verifyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#_ECPKParameters_printLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&} _ECPKParameters_print_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _ECParameters_printLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$h_ECParameters_print_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$š_EC_GF2m_simple_methodLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _EC_GFp_mont_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!É _EC_GFp_nist_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K# _EC_GFp_simple_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kã _EC_GROUP_checkLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*, _EC_GROUP_check_discriminantLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ö _EC_GROUP_clear_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K+_EC_GROUP_cmpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K’ _EC_GROUP_copyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KM_EC_GROUP_dupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K= _EC_GROUP_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&… _EC_GROUP_get0_generatorLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_EC_GROUP_get0_seedLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%_EC_GROUP_get_asn1_flagLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&5_EC_GROUP_get_basis_typeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K${ _EC_GROUP_get_cofactorLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&¬ _EC_GROUP_get_curve_GF2mLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%© _EC_GROUP_get_curve_GFpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&o_EC_GROUP_get_curve_nameLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ò _EC_GROUP_get_degreeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _EC_GROUP_get_orderLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K-Q _EC_GROUP_get_pentanomial_basisLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 69 ` ÿÿL|„.K1M _EC_GROUP_get_point_conversion_formLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$½ _EC_GROUP_get_seed_lenLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+ _EC_GROUP_get_trinomial_basisLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,e _EC_GROUP_have_precompute_multLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _EC_GROUP_method_ofLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K³ _EC_GROUP_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)_EC_GROUP_new_by_curve_nameLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&6 _EC_GROUP_new_curve_GF2mLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%E _EC_GROUP_new_curve_GFpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K' _EC_GROUP_precompute_multLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%¥_EC_GROUP_set_asn1_flagLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Ù _EC_GROUP_set_curve_GF2mLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K% _EC_GROUP_set_curve_GFpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Í _EC_GROUP_set_curve_nameLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%¤ _EC_GROUP_set_generatorLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 69 ` ÿÿL|„.K1!_EC_GROUP_set_point_conversion_formLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ¦ _EC_GROUP_set_seedLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K¦_EC_KEY_check_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K) _EC_KEY_copyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K‘_EC_KEY_dupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K^ _EC_KEY_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Þ _EC_KEY_generate_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ÷ _EC_KEY_get0_groupLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&_EC_KEY_get0_private_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%˜ _EC_KEY_get0_public_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#< _EC_KEY_get_conv_formLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#&_EC_KEY_get_enc_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)J _EC_KEY_get_key_method_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,å _EC_KEY_insert_key_method_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KO_EC_KEY_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K' _EC_KEY_new_by_curve_nameLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%. _EC_KEY_precompute_multLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kž_EC_KEY_printLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kf _EC_KEY_print_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#H _EC_KEY_set_asn1_flagLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#s _EC_KEY_set_conv_formLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#Q_EC_KEY_set_enc_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K¸ _EC_KEY_set_groupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%ƒ _EC_KEY_set_private_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$b_EC_KEY_set_public_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KZ _EC_KEY_up_refLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'È _EC_METHOD_get_field_typeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kä _EC_POINT_addLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K F _EC_POINT_bn2pointLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ß _EC_POINT_clear_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K‰ _EC_POINT_cmpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K _EC_POINT_copyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kþ _EC_POINT_dblLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kt _EC_POINT_dupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kq _EC_POINT_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 75 ` ÿÿL|„.K7Û _EC_POINT_get_Jprojective_coordinates_GFpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 71 ` ÿÿL|„.K3L_EC_POINT_get_affine_coordinates_GF2mLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 70 ` ÿÿL|„.K2] _EC_POINT_get_affine_coordinates_GFpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!³_EC_POINT_hex2pointLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KP _EC_POINT_invertLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&8 _EC_POINT_is_at_infinityLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#Ñ _EC_POINT_is_on_curveLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#* _EC_POINT_make_affineLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!$ _EC_POINT_method_ofLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K _EC_POINT_mulLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kl _EC_POINT_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _EC_POINT_oct2pointLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K 3 _EC_POINT_point2bnLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!S_EC_POINT_point2hexLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!j _EC_POINT_point2octLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 75 ` ÿÿL|„.K7 _EC_POINT_set_Jprojective_coordinates_GFpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 71 ` ÿÿL|„.K3 _EC_POINT_set_affine_coordinates_GF2mLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 70 ` ÿÿL|„.K23 _EC_POINT_set_affine_coordinates_GFpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 75 ` ÿÿL|„.K7*_EC_POINT_set_compressed_coordinates_GF2mLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 74 ` ÿÿL|„.K6% _EC_POINT_set_compressed_coordinates_GFpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'h _EC_POINT_set_to_infinityLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ _EC_POINTs_make_affineLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K| _EC_POINTs_mulLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$w _EC_get_builtin_curvesLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K C _EDIPARTYNAME_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K½ _EDIPARTYNAME_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Ko _EDIPARTYNAME_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KÖ _ENGINE_addLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%‚ _ENGINE_add_conf_moduleLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K½ _ENGINE_by_idLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K… _ENGINE_cleanupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'Ç _ENGINE_cmd_is_executableLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K± _ENGINE_ctrlLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KT _ENGINE_ctrl_cmdLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%D _ENGINE_ctrl_cmd_stringLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K® _ENGINE_finishLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.KÆ _ENGINE_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K° _ENGINE_get_DHLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KØ _ENGINE_get_DSALIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K„_ENGINE_get_ECDHLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K‹_ENGINE_get_ECDSALIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K» _ENGINE_get_RANDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K¹ _ENGINE_get_RSALIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KT_ENGINE_get_STORELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Ä _ENGINE_get_cipherLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'À _ENGINE_get_cipher_engineLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!á _ENGINE_get_ciphersLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#b _ENGINE_get_cmd_defnsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'Ù _ENGINE_get_ctrl_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$¸ _ENGINE_get_default_DHLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Ê _ENGINE_get_default_DSALIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&; _ENGINE_get_default_ECDHLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'N_ENGINE_get_default_ECDSALIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Í _ENGINE_get_default_RANDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%¦ _ENGINE_get_default_RSALIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K* _ENGINE_get_destroy_functionLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ¼ _ENGINE_get_digestLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K' _ENGINE_get_digest_engineLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _ENGINE_get_digestsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!( _ENGINE_get_ex_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K& _ENGINE_get_ex_new_indexLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)¥ _ENGINE_get_finish_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K¼ _ENGINE_get_firstLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_ _ENGINE_get_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KÔ _ENGINE_get_idLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'² _ENGINE_get_init_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K¶ _ENGINE_get_lastLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 67 ` ÿÿL|„.K/d _ENGINE_get_load_privkey_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 66 ` ÿÿL|„.K.è _ENGINE_get_load_pubkey_functionLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kµ _ENGINE_get_nameLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÈ _ENGINE_get_nextLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K· _ENGINE_get_prevLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 70 ` ÿÿL|„.K2Í_ENGINE_get_ssl_client_cert_functionLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&A _ENGINE_get_static_stateLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%G _ENGINE_get_table_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K« _ENGINE_initLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"’ _ENGINE_load_4758ccaLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KŠ _ENGINE_load_aepLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!: _ENGINE_load_atallaLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*” _ENGINE_load_builtin_enginesLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _ENGINE_load_chilLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$9 _ENGINE_load_cryptodevLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Ó _ENGINE_load_cswiftLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ó _ENGINE_load_dynamicLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ï _ENGINE_load_nuronLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"a _ENGINE_load_opensslLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Ì _ENGINE_load_padlockLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K& _ENGINE_load_private_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%¯ _ENGINE_load_public_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*Î_ENGINE_load_ssl_client_certLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#‹ _ENGINE_load_surewareLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K L _ENGINE_load_ubsecLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KÓ _ENGINE_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _ENGINE_register_DHLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Ê _ENGINE_register_DSALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K# _ENGINE_register_ECDHLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ _ENGINE_register_ECDSALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#1 _ENGINE_register_RANDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"h _ENGINE_register_RSALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$e_ENGINE_register_STORELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%[ _ENGINE_register_all_DHLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&f _ENGINE_register_all_DSALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'>_ENGINE_register_all_ECDHLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(J_ENGINE_register_all_ECDSALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'ò _ENGINE_register_all_RANDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&ù _ENGINE_register_all_RSALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(ï _ENGINE_register_all_STORELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*Á _ENGINE_register_all_ciphersLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+š _ENGINE_register_all_completeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*M _ENGINE_register_all_digestsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&< _ENGINE_register_ciphersLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'} _ENGINE_register_completeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&I _ENGINE_register_digestsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KÅ _ENGINE_removeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K© _ENGINE_set_DHLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K¤ _ENGINE_set_DSALIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K• _ENGINE_set_ECDHLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_ENGINE_set_ECDSALIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÏ _ENGINE_set_RANDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÁ _ENGINE_set_RSALIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _ENGINE_set_STORELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!t _ENGINE_set_ciphersLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#; _ENGINE_set_cmd_defnsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'Ú _ENGINE_set_ctrl_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!º _ENGINE_set_defaultLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$Ò _ENGINE_set_default_DHLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%´ _ENGINE_set_default_DSALIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&¯_ENGINE_set_default_ECDHLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'Ú _ENGINE_set_default_ECDSALIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&à _ENGINE_set_default_RANDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Ì _ENGINE_set_default_RSALIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)Õ _ENGINE_set_default_ciphersLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)e _ENGINE_set_default_digestsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(p _ENGINE_set_default_stringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*° _ENGINE_set_destroy_functionLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!y _ENGINE_set_digestsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!¤ _ENGINE_set_ex_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)¾ _ENGINE_set_finish_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KZ _ENGINE_set_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KÐ _ENGINE_set_idLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'³ _ENGINE_set_init_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 67 ` ÿÿL|„.K/c _ENGINE_set_load_privkey_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 66 ` ÿÿL|„.K.Ì _ENGINE_set_load_pubkey_functionLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 75 ` ÿÿL|„.K7Ì_ENGINE_set_load_ssl_client_cert_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÉ _ENGINE_set_nameLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K% _ENGINE_set_table_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#e _ENGINE_unregister_DHLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$i _ENGINE_unregister_DSALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%q _ENGINE_unregister_ECDHLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&¹_ENGINE_unregister_ECDSALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%ä _ENGINE_unregister_RANDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ë _ENGINE_unregister_RSALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&8 _ENGINE_unregister_STORELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(à _ENGINE_unregister_ciphersLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(ý _ENGINE_unregister_digestsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K¦ _ENGINE_up_refLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!9_ERR_add_error_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÞ_ERR_clear_errorLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kß_ERR_error_stringLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ó_ERR_error_string_nLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kà_ERR_free_stringsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$á_ERR_func_error_stringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&â_ERR_get_err_state_tableLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kã_ERR_get_errorLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ä_ERR_get_error_lineLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&ë_ERR_get_error_line_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%) _ERR_get_implementationLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)Æ_ERR_get_next_error_libraryLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kå_ERR_get_stateLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#æ_ERR_get_string_tableLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ç_ERR_lib_error_stringLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$è_ERR_load_ASN1_stringsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#é_ERR_load_BIO_stringsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ê_ERR_load_BN_stringsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ë_ERR_load_BUF_stringsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$Ý _ERR_load_COMP_stringsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ì_ERR_load_CONF_stringsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&ñ_ERR_load_CRYPTO_stringsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"í_ERR_load_DH_stringsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#î_ERR_load_DSA_stringsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#â_ERR_load_DSO_stringsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$_ERR_load_ECDH_stringsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%4_ERR_load_ECDSA_stringsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"! _ERR_load_EC_stringsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&£ _ERR_load_ENGINE_stringsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ï_ERR_load_ERR_stringsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ð_ERR_load_EVP_stringsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ñ_ERR_load_OBJ_stringsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$i _ERR_load_OCSP_stringsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ò_ERR_load_PEM_stringsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&_ERR_load_PKCS12_stringsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%—_ERR_load_PKCS7_stringsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$_ERR_load_RAND_stringsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ô_ERR_load_RSA_stringsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%¾ _ERR_load_STORE_stringsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _ERR_load_UI_stringsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Œ_ERR_load_X509V3_stringsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$õ_ERR_load_X509_stringsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&ö_ERR_load_crypto_stringsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K÷_ERR_load_stringsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kø_ERR_peek_errorLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ù_ERR_peek_error_lineLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'ì_ERR_peek_error_line_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"… _ERR_peek_last_errorLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'ƒ _ERR_peek_last_error_lineLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,„ _ERR_peek_last_error_line_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kî _ERR_pop_to_markLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kú_ERR_print_errorsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"s _ERR_print_errors_cbLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"û_ERR_print_errors_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kü_ERR_put_errorLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&ý_ERR_reason_error_stringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*¯ _ERR_release_err_state_tableLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kþ_ERR_remove_stateLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!:_ERR_set_error_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K% _ERR_set_implementationLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K _ERR_set_markLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!A _ERR_unload_stringsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kÿ_EVP_BytesToKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K('_EVP_CIPHER_CTX_block_sizeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$0_EVP_CIPHER_CTX_cipherLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%_EVP_CIPHER_CTX_cleanupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)Ò_EVP_CIPHER_CTX_clear_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"` _EVP_CIPHER_CTX_ctrlLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#3_EVP_CIPHER_CTX_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Ç_EVP_CIPHER_CTX_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*1_EVP_CIPHER_CTX_get_app_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Á_EVP_CIPHER_CTX_initLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K';_EVP_CIPHER_CTX_iv_lengthLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(_EVP_CIPHER_CTX_key_lengthLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Æ_EVP_CIPHER_CTX_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!÷_EVP_CIPHER_CTX_nidLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&’_EVP_CIPHER_CTX_rand_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*ë_EVP_CIPHER_CTX_set_app_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'Û_EVP_CIPHER_CTX_set_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,_ _EVP_CIPHER_CTX_set_key_lengthLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)Ë _EVP_CIPHER_CTX_set_paddingLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(å_EVP_CIPHER_CTX_test_flagsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K';_EVP_CIPHER_asn1_to_paramLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$è_EVP_CIPHER_block_sizeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_EVP_CIPHER_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%=_EVP_CIPHER_get_asn1_ivLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ü_EVP_CIPHER_iv_lengthLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$!_EVP_CIPHER_key_lengthLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K%_EVP_CIPHER_nidLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'<_EVP_CIPHER_param_to_asn1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%>_EVP_CIPHER_set_asn1_ivLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kq_EVP_CIPHER_typeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K"_EVP_CipherLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_EVP_CipherFinalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!* _EVP_CipherFinal_exLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_EVP_CipherInitLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K c _EVP_CipherInit_exLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_EVP_CipherUpdateLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_EVP_DecodeBlockLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_EVP_DecodeFinalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_EVP_DecodeInitLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_EVP_DecodeUpdateLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_EVP_DecryptFinalLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"` _EVP_DecryptFinal_exLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K _EVP_DecryptInitLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!û _EVP_DecryptInit_exLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K _EVP_DecryptUpdateLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K] _EVP_DigestLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K _EVP_DigestFinalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!x _EVP_DigestFinal_exLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K _EVP_DigestInitLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K % _EVP_DigestInit_exLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _EVP_DigestUpdateLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_EVP_EncodeBlockLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_EVP_EncodeFinalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_EVP_EncodeInitLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_EVP_EncodeUpdateLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_EVP_EncryptFinalLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"d _EVP_EncryptFinal_exLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_EVP_EncryptInitLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!N _EVP_EncryptInit_exLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K _EVP_EncryptUpdateLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _EVP_MD_CTX_cleanupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K% _EVP_MD_CTX_clear_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K²_EVP_MD_CTX_copyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _EVP_MD_CTX_copy_exLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ˜ _EVP_MD_CTX_createLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!m _EVP_MD_CTX_destroyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KF _EVP_MD_CTX_initLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K8_EVP_MD_CTX_mdLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#+_EVP_MD_CTX_set_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$_EVP_MD_CTX_test_flagsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K 2_EVP_MD_block_sizeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _EVP_MD_pkey_typeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K_EVP_MD_sizeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Ký_EVP_MD_typeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K_EVP_OpenFinalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_EVP_OpenInitLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!r_EVP_PBE_CipherInitLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K*_EVP_PBE_alg_addLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K,_EVP_PBE_cleanupLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K&_EVP_PKCS82PKEYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K'_EVP_PKEY2PKCS8LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$Ä_EVP_PKEY2PKCS8_brokenLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!j_EVP_PKEY_add1_attrLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K( _EVP_PKEY_add1_attr_by_NIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(¬_EVP_PKEY_add1_attr_by_OBJLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(R _EVP_PKEY_add1_attr_by_txtLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_EVP_PKEY_assignLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kò_EVP_PKEY_bitsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Ki _EVP_PKEY_cmpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Ç_EVP_PKEY_cmp_parametersLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'_EVP_PKEY_copy_parametersLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K._EVP_PKEY_decryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#(_EVP_PKEY_delete_attrLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K/_EVP_PKEY_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K_EVP_PKEY_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KP_EVP_PKEY_get1_DHLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K _EVP_PKEY_get1_DSALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#9 _EVP_PKEY_get1_EC_KEYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ò_EVP_PKEY_get1_RSALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K o _EVP_PKEY_get_attrLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'‰_EVP_PKEY_get_attr_by_NIDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'C_EVP_PKEY_get_attr_by_OBJLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&ª _EVP_PKEY_get_attr_countLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*_EVP_PKEY_missing_parametersLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_EVP_PKEY_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'_EVP_PKEY_save_parametersLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K;_EVP_PKEY_set1_DHLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ²_EVP_PKEY_set1_DSALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#z _EVP_PKEY_set1_EC_KEYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K _EVP_PKEY_set1_RSALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K_EVP_PKEY_sizeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K_EVP_PKEY_typeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K_EVP_SealFinalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K _EVP_SealInitLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K!_EVP_SignFinalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K"_EVP_VerifyFinalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!í_EVP_add_alg_moduleLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K$_EVP_add_cipherLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K%_EVP_add_digestLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Ko _EVP_aes_128_cbcLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K³ _EVP_aes_128_cfb1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!– _EVP_aes_128_cfb128LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K° _EVP_aes_128_cfb8LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KT _EVP_aes_128_ecbLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K˜ _EVP_aes_128_ofbLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KS _EVP_aes_192_cbcLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÀ _EVP_aes_192_cfb1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!™ _EVP_aes_192_cfb128LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K´ _EVP_aes_192_cfb8LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K. _EVP_aes_192_ecbLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K• _EVP_aes_192_ofbLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K´ _EVP_aes_256_cbcLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÇ _EVP_aes_256_cfb1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!— _EVP_aes_256_cfb128LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K· _EVP_aes_256_cfb8LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K  _EVP_aes_256_ecbLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K” _EVP_aes_256_ofbLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K&_EVP_bf_cbcLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K'_EVP_bf_cfb64LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K(_EVP_bf_ecbLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K)_EVP_bf_ofbLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K×_EVP_cast5_cbcLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KØ_EVP_cast5_cfb64LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KÙ_EVP_cast5_ecbLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KÚ_EVP_cast5_ofbLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K*_EVP_cleanupLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K+_EVP_des_cbcLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KÍ _EVP_des_cfb1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K,_EVP_des_cfb64LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kà _EVP_des_cfb8LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K-_EVP_des_ecbLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K._EVP_des_edeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K/_EVP_des_ede3LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K0_EVP_des_ede3_cbcLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Ð _EVP_des_ede3_cfb1LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!1_EVP_des_ede3_cfb64LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K º _EVP_des_ede3_cfb8LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K¤ _EVP_des_ede3_ecbLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K2_EVP_des_ede3_ofbLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K3_EVP_des_ede_cbcLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K 4_EVP_des_ede_cfb64LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KŸ _EVP_des_ede_ecbLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K5_EVP_des_ede_ofbLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K6_EVP_des_ofbLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K7_EVP_desx_cbcLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.K8_EVP_dssLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.K9_EVP_dss1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.KŒ_EVP_ecdsaLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K:_EVP_enc_nullLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#;_EVP_get_cipherbynameLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#<_EVP_get_digestbynameLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K =_EVP_get_pw_promptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K>_EVP_idea_cbcLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K?_EVP_idea_cfb64LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K@_EVP_idea_ecbLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KA_EVP_idea_ofbLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.KB_EVP_md2LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.K† _EVP_md4LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.KC_EVP_md5LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.KD_EVP_md_nullLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K¿_EVP_rc2_40_cbcLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KO_EVP_rc2_64_cbcLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.KE_EVP_rc2_cbcLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KF_EVP_rc2_cfb64LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.KG_EVP_rc2_ecbLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.KH_EVP_rc2_ofbLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.KI_EVP_rc4LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KÀ_EVP_rc4_40LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!J_EVP_read_pw_stringLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kä_EVP_ripemd160LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K K_EVP_set_pw_promptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.KL_EVP_shaLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KM_EVP_sha1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kò _EVP_sha224LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kó _EVP_sha256LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kð _EVP_sha384LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kñ _EVP_sha512LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&G _EXTENDED_KEY_USAGE_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ _EXTENDED_KEY_USAGE_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%õ _EXTENDED_KEY_USAGE_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!À_GENERAL_NAMES_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kô _GENERAL_NAMES_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ¿_GENERAL_NAMES_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ¾_GENERAL_NAME_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K" _GENERAL_NAME_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K½_GENERAL_NAME_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!6 _GENERAL_NAME_printLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K# _GENERAL_SUBTREE_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!n_GENERAL_SUBTREE_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"u _GENERAL_SUBTREE_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 39 ` ÿÿL|„.KÂ_HMACLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kà _HMAC_CTX_cleanupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K» _HMAC_CTX_initLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Ø _HMAC_CTX_set_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KÅ_HMAC_FinalLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.KÃ_HMAC_InitLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K _HMAC_Init_exLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.KÄ_HMAC_UpdateLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"„ _KRB5_APREQBODY_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K õ _KRB5_APREQBODY_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!B _KRB5_APREQBODY_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kk _KRB5_APREQ_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K _KRB5_APREQ_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K¨ _KRB5_APREQ_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!× _KRB5_AUTHDATA_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K1 _KRB5_AUTHDATA_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K  _KRB5_AUTHDATA_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$é _KRB5_AUTHENTBODY_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"  _KRB5_AUTHENTBODY_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#» _KRB5_AUTHENTBODY_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K U _KRB5_AUTHENT_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K¯ _KRB5_AUTHENT_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _KRB5_AUTHENT_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!J _KRB5_CHECKSUM_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kã _KRB5_CHECKSUM_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Ò _KRB5_CHECKSUM_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K “ _KRB5_ENCDATA_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kç _KRB5_ENCDATA_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _KRB5_ENCDATA_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _KRB5_ENCKEY_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Ký _KRB5_ENCKEY_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kª _KRB5_ENCKEY_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _KRB5_PRINCNAME_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ú _KRB5_PRINCNAME_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!‹ _KRB5_PRINCNAME_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KT _KRB5_TICKET_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KR _KRB5_TICKET_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K§ _KRB5_TICKET_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K @ _KRB5_TKTBODY_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K¾ _KRB5_TKTBODY_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _KRB5_TKTBODY_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.K0 _LONG_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 38 ` ÿÿL|„.KN_MD2LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.KO_MD2_FinalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KP_MD2_InitLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KQ_MD2_UpdateLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.KR_MD2_optionsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 38 ` ÿÿL|„.K _MD4LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Kƒ _MD4_FinalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.K… _MD4_InitLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K‚ _MD4_TransformLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K„ _MD4_UpdateLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 38 ` ÿÿL|„.KS_MD5LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.KT_MD5_FinalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KU_MD5_InitLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kó_MD5_TransformLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KV_MD5_UpdateLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ _NAME_CONSTRAINTS_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _NAME_CONSTRAINTS_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#– _NAME_CONSTRAINTS_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K _NCONF_WIN32LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K› _NCONF_defaultLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kï_NCONF_dump_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kí_NCONF_dump_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Ké_NCONF_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kñ_NCONF_free_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _NCONF_get_number_eLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K î_NCONF_get_sectionLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kè_NCONF_get_stringLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kä_NCONF_loadLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kì_NCONF_load_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kæ_NCONF_load_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Kç_NCONF_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*_NETSCAPE_CERT_SEQUENCE_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(ó _NETSCAPE_CERT_SEQUENCE_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)Ž_NETSCAPE_CERT_SEQUENCE_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"[_NETSCAPE_SPKAC_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Q _NETSCAPE_SPKAC_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!\_NETSCAPE_SPKAC_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'm_NETSCAPE_SPKI_b64_decodeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'k_NETSCAPE_SPKI_b64_encodeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!]_NETSCAPE_SPKI_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'l_NETSCAPE_SPKI_get_pubkeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K¾ _NETSCAPE_SPKI_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ^_NETSCAPE_SPKI_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"i_NETSCAPE_SPKI_printLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'j_NETSCAPE_SPKI_set_pubkeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!__NETSCAPE_SPKI_signLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#`_NETSCAPE_SPKI_verifyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kß_NOTICEREF_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KÖ _NOTICEREF_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KÝ_NOTICEREF_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KM_OBJ_NAME_addLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KP_OBJ_NAME_cleanupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K{ _OBJ_NAME_do_allLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%· _OBJ_NAME_do_all_sortedLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KQ_OBJ_NAME_getLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KR_OBJ_NAME_initLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!S_OBJ_NAME_new_indexLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KT_OBJ_NAME_removeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Ka_OBJ_add_objectLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kb_OBJ_bsearchLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K _OBJ_bsearch_exLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kc_OBJ_cleanupLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.Kd_OBJ_cmpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Ke_OBJ_createLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!å_OBJ_create_objectsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.Kf_OBJ_dupLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kg_OBJ_ln2nidLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kh_OBJ_new_nidLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Ki_OBJ_nid2lnLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kj_OBJ_nid2objLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kk_OBJ_nid2snLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kl_OBJ_obj2nidLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.KN_OBJ_obj2txtLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Km_OBJ_sn2nidLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kn_OBJ_txt2nidLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K_OBJ_txt2objLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K* _OCSP_BASICRESP_add1_ext_i2dLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%ü _OCSP_BASICRESP_add_extLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(ù _OCSP_BASICRESP_delete_extLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _OCSP_BASICRESP_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*Y _OCSP_BASICRESP_get1_ext_d2iLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%> _OCSP_BASICRESP_get_extLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K, _OCSP_BASICRESP_get_ext_by_NIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K, _OCSP_BASICRESP_get_ext_by_OBJLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 69 ` ÿÿL|„.K1V _OCSP_BASICRESP_get_ext_by_criticalLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+Æ _OCSP_BASICRESP_get_ext_countLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ð _OCSP_BASICRESP_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _OCSP_BASICRESP_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K¦ _OCSP_CERTID_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kæ _OCSP_CERTID_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kã _OCSP_CERTID_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#] _OCSP_CERTSTATUS_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!, _OCSP_CERTSTATUS_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"+ _OCSP_CERTSTATUS_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KX _OCSP_CRLID_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K7 _OCSP_CRLID_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K^ _OCSP_CRLID_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'I _OCSP_ONEREQ_add1_ext_i2dLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"v _OCSP_ONEREQ_add_extLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%^ _OCSP_ONEREQ_delete_extLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kì _OCSP_ONEREQ_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'ñ _OCSP_ONEREQ_get1_ext_d2iLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"# _OCSP_ONEREQ_get_extLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)­ _OCSP_ONEREQ_get_ext_by_NIDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)+ _OCSP_ONEREQ_get_ext_by_OBJLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 66 ` ÿÿL|„.K.g _OCSP_ONEREQ_get_ext_by_criticalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K( _OCSP_ONEREQ_get_ext_countLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K` _OCSP_ONEREQ_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KQ _OCSP_ONEREQ_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K D _OCSP_REQINFO_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K¹ _OCSP_REQINFO_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K= _OCSP_REQINFO_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K( _OCSP_REQUEST_add1_ext_i2dLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#– _OCSP_REQUEST_add_extLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&ê _OCSP_REQUEST_delete_extLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K _OCSP_REQUEST_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(F _OCSP_REQUEST_get1_ext_d2iLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#K _OCSP_REQUEST_get_extLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K* _OCSP_REQUEST_get_ext_by_NIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K* _OCSP_REQUEST_get_ext_by_OBJLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 67 ` ÿÿL|„.K/Y _OCSP_REQUEST_get_ext_by_criticalLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)9 _OCSP_REQUEST_get_ext_countLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kï _OCSP_REQUEST_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÚ _OCSP_REQUEST_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!¥ _OCSP_REQUEST_printLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Q_OCSP_REQ_CTX_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"n _OCSP_RESPBYTES_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K û _OCSP_RESPBYTES_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!— _OCSP_RESPBYTES_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _OCSP_RESPDATA_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K˜ _OCSP_RESPDATA_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K € _OCSP_RESPDATA_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K4 _OCSP_RESPID_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K² _OCSP_RESPID_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K— _OCSP_RESPID_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!e _OCSP_RESPONSE_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K' _OCSP_RESPONSE_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Ï _OCSP_RESPONSE_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"½ _OCSP_RESPONSE_printLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$‚ _OCSP_REVOKEDINFO_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Ø _OCSP_REVOKEDINFO_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#Š _OCSP_REVOKEDINFO_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#< _OCSP_SERVICELOC_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!´ _OCSP_SERVICELOC_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"2 _OCSP_SERVICELOC_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _OCSP_SIGNATURE_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ú _OCSP_SIGNATURE_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!/ _OCSP_SIGNATURE_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+2 _OCSP_SINGLERESP_add1_ext_i2dLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Ÿ _OCSP_SINGLERESP_add_extLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)7 _OCSP_SINGLERESP_delete_extLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#“ _OCSP_SINGLERESP_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+p _OCSP_SINGLERESP_get1_ext_d2iLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&W _OCSP_SINGLERESP_get_extLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K- _OCSP_SINGLERESP_get_ext_by_NIDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K-• _OCSP_SINGLERESP_get_ext_by_OBJLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 70 ` ÿÿL|„.K2\ _OCSP_SINGLERESP_get_ext_by_criticalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K, _OCSP_SINGLERESP_get_ext_countLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!‡ _OCSP_SINGLERESP_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Æ _OCSP_SINGLERESP_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(ò _OCSP_accept_responses_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K& _OCSP_archive_cutoff_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#( _OCSP_basic_add1_certLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$Œ _OCSP_basic_add1_nonceLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%3 _OCSP_basic_add1_statusLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KQ _OCSP_basic_signLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K è _OCSP_basic_verifyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Ki _OCSP_cert_id_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#W _OCSP_cert_status_strLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K– _OCSP_cert_to_idLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KS _OCSP_check_nonceLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"› _OCSP_check_validityLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K~ _OCSP_copy_nonceLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Km _OCSP_crlID_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _OCSP_crl_reason_strLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K _OCSP_id_cmpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K _OCSP_id_get0_infoLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!z _OCSP_id_issuer_cmpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Ô _OCSP_onereq_get0_idLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KV _OCSP_parse_urlLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#) _OCSP_request_add0_idLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%- _OCSP_request_add1_certLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&: _OCSP_request_add1_nonceLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K% _OCSP_request_is_signedLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(ç _OCSP_request_onereq_countLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K' _OCSP_request_onereq_get0LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%œ _OCSP_request_set1_nameLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K w _OCSP_request_signLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _OCSP_request_verifyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÑ _OCSP_resp_countLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K- _OCSP_resp_findLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$™ _OCSP_resp_find_statusLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K! _OCSP_resp_get0LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#V _OCSP_response_createLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'\ _OCSP_response_get1_basicLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K# _OCSP_response_statusLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'& _OCSP_response_status_strLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K÷ _OCSP_sendreq_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K S_OCSP_sendreq_nbioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KT_OCSP_sendreq_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&­ _OCSP_single_get0_statusLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _OCSP_url_svcloc_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KD _OPENSSL_DIR_endLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KI_OPENSSL_DIR_readLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 66 ` ÿÿL|„.K. _OPENSSL_add_all_algorithms_confLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 68 ` ÿÿL|„.K0Œ _OPENSSL_add_all_algorithms_noconfLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K­ _OPENSSL_cleanseLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kt _OPENSSL_configLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"‹ _OPENSSL_ia32cap_locLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kû_OPENSSL_initLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Ð_OPENSSL_isserviceLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ¡ _OPENSSL_issetugidLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+Ž _OPENSSL_load_builtin_modulesLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K œ _OPENSSL_no_configLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÞ _OSSL_DES_versionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ß _OSSL_libdes_versionLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K@_OTHERNAME_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K _OTHERNAME_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KÏ_OTHERNAME_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K¬ _OpenSSLDieLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&ý_OpenSSL_add_all_ciphersLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&þ_OpenSSL_add_all_digestsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K|_PBE2PARAM_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KÁ _PBE2PARAM_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kz_PBE2PARAM_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K!_PBEPARAM_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kº _PBEPARAM_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_PBEPARAM_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kx_PBKDF2PARAM_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kô _PBKDF2PARAM_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kv_PBKDF2PARAM_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Ko_PEM_ASN1_readLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K p_PEM_ASN1_read_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kq_PEM_ASN1_writeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!r_PEM_ASN1_write_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Ks_PEM_SealFinalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kt_PEM_SealInitLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Ku_PEM_SealUpdateLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kv_PEM_SignFinalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kw_PEM_SignInitLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kx_PEM_SignUpdateLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!y_PEM_X509_INFO_readLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%z_PEM_X509_INFO_read_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&{_PEM_X509_INFO_write_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Î _PEM_bytes_read_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K„ _PEM_def_callbackLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K|_PEM_dek_infoLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K}_PEM_do_headerLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&~_PEM_get_EVP_CIPHER_INFOLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K_PEM_proc_typeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.K€_PEM_readLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K _PEM_read_DHparamsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%‚_PEM_read_DSAPrivateKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"À_PEM_read_DSA_PUBKEYLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ƒ_PEM_read_DSAparamsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&c_PEM_read_ECPKParametersLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$0_PEM_read_ECPrivateKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!"_PEM_read_EC_PUBKEYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 66 ` ÿÿL|„.K._PEM_read_NETSCAPE_CERT_SEQUENCELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K„_PEM_read_PKCS7LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kö_PEM_read_PKCS8LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+ú_PEM_read_PKCS8_PRIV_KEY_INFOLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÜ_PEM_read_PUBKEYLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"…_PEM_read_PrivateKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%†_PEM_read_RSAPrivateKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$³_PEM_read_RSAPublicKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"¹_PEM_read_RSA_PUBKEYLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K‡_PEM_read_X509LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K }_PEM_read_X509_AUXLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&³ _PEM_read_X509_CERT_PAIRLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ˆ_PEM_read_X509_CRLLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ‰_PEM_read_X509_REQLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KŠ_PEM_read_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$‹_PEM_read_bio_DHparamsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)Œ_PEM_read_bio_DSAPrivateKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&(_PEM_read_bio_DSA_PUBKEYLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%_PEM_read_bio_DSAparamsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*P _PEM_read_bio_ECPKParametersLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(‚_PEM_read_bio_ECPrivateKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%¿ _PEM_read_bio_EC_PUBKEYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 70 ` ÿÿL|„.K2‘_PEM_read_bio_NETSCAPE_CERT_SEQUENCELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Ž_PEM_read_bio_PKCS7LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!û_PEM_read_bio_PKCS8LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 67 ` ÿÿL|„.K/ò_PEM_read_bio_PKCS8_PRIV_KEY_INFOLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Ë_PEM_read_bio_PUBKEYLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&_PEM_read_bio_PrivateKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)_PEM_read_bio_RSAPrivateKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(¯_PEM_read_bio_RSAPublicKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&!_PEM_read_bio_RSA_PUBKEYLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ‘_PEM_read_bio_X509LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$§_PEM_read_bio_X509_AUXLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*©_PEM_read_bio_X509_CERT_PAIRLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$’_PEM_read_bio_X509_CRLLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$“_PEM_read_bio_X509_REQLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K”_PEM_writeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!•_PEM_write_DHparamsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&–_PEM_write_DSAPrivateKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#5_PEM_write_DSA_PUBKEYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"—_PEM_write_DSAparamsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K';_PEM_write_ECPKParametersLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%__PEM_write_ECPrivateKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_PEM_write_EC_PUBKEYLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 67 ` ÿÿL|„.K/’_PEM_write_NETSCAPE_CERT_SEQUENCELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K˜_PEM_write_PKCS7LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kù_PEM_write_PKCS8LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(_PEM_write_PKCS8PrivateKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,u_PEM_write_PKCS8PrivateKey_nidLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,ü_PEM_write_PKCS8_PRIV_KEY_INFOLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_PEM_write_PUBKEYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#™_PEM_write_PrivateKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&š_PEM_write_RSAPrivateKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%µ_PEM_write_RSAPublicKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#/_PEM_write_RSA_PUBKEYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K›_PEM_write_X509LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!÷_PEM_write_X509_AUXLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'p_PEM_write_X509_CERT_PAIRLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!œ_PEM_write_X509_CRLLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_PEM_write_X509_REQLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Ë_PEM_write_X509_REQ_NEWLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kž_PEM_write_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Ÿ_PEM_write_bio_DHparamsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K* _PEM_write_bio_DSAPrivateKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'°_PEM_write_bio_DSA_PUBKEYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&¡_PEM_write_bio_DSAparamsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+€ _PEM_write_bio_ECPKParametersLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)` _PEM_write_bio_ECPrivateKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&™ _PEM_write_bio_EC_PUBKEYLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 71 ` ÿÿL|„.K3“_PEM_write_bio_NETSCAPE_CERT_SEQUENCELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"¢_PEM_write_bio_PKCS7LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ð_PEM_write_bio_PKCS8LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,_PEM_write_bio_PKCS8PrivateKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 68 ` ÿÿL|„.K0v_PEM_write_bio_PKCS8PrivateKey_nidLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 68 ` ÿÿL|„.K0õ_PEM_write_bio_PKCS8_PRIV_KEY_INFOLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#E_PEM_write_bio_PUBKEYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'£_PEM_write_bio_PrivateKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*¤_PEM_write_bio_RSAPrivateKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)°_PEM_write_bio_RSAPublicKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'©_PEM_write_bio_RSA_PUBKEYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!¥_PEM_write_bio_X509LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%_PEM_write_bio_X509_AUXLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+h _PEM_write_bio_X509_CERT_PAIRLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%¦_PEM_write_bio_X509_CRLLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%§_PEM_write_bio_X509_REQLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)Ê_PEM_write_bio_X509_REQ_NEWLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Ÿ _PKCS12_AUTHSAFES_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_PKCS12_BAGS_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kœ _PKCS12_BAGS_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_PKCS12_BAGS_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#_PKCS12_MAC_DATA_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ñ _PKCS12_MAC_DATA_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _PKCS12_MAC_DATA_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ï_PKCS12_MAKE_KEYBAGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ñ_PKCS12_MAKE_SHKEYBAGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_PKCS12_PBE_addLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"í_PKCS12_PBE_keyivgenLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!8 _PKCS12_SAFEBAGS_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_PKCS12_SAFEBAG_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Œ _PKCS12_SAFEBAG_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_PKCS12_SAFEBAG_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%7 _PKCS12_add_CSPName_ascLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KŽ_PKCS12_add_certLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*õ_PKCS12_add_friendlyname_ascLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*ö_PKCS12_add_friendlyname_uniLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K±_PKCS12_add_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ô_PKCS12_add_localkeyidLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K _PKCS12_add_safeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kˆ _PKCS12_add_safesLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"p _PKCS12_certbag2x509LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K% _PKCS12_certbag2x509crlLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K_PKCS12_createLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"® _PKCS12_decrypt_skeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K _PKCS12_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kþ_PKCS12_gen_macLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_PKCS12_get_attr_genLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&÷_PKCS12_get_friendlynameLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kû_PKCS12_initLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K[ _PKCS12_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Þ _PKCS12_item_decrypt_d2iLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&ˆ _PKCS12_item_i2d_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'G _PKCS12_item_pack_safebagLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ü_PKCS12_key_gen_ascLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ý_PKCS12_key_gen_uniLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K _PKCS12_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K]_PKCS12_newpassLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$¡ _PKCS12_pack_authsafesLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ò_PKCS12_pack_p7dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ó_PKCS12_pack_p7encdataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_PKCS12_parseLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kø_PKCS12_pbe_cryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_PKCS12_set_macLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_PKCS12_setup_macLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&O _PKCS12_unpack_authsafesLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#| _PKCS12_unpack_p7dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&º _PKCS12_unpack_p7encdataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ÿ_PKCS12_verify_macLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"$ _PKCS12_x5092certbagLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%³ _PKCS12_x509crl2certbagLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kü _PKCS1_MGF1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kï_PKCS5_PBE_addLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ý_PKCS5_PBE_keyivgenLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%_PKCS5_PBKDF2_HMAC_SHA1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_PKCS5_pbe2_setLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K+_PKCS5_pbe_setLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$_PKCS5_v2_PBE_keyivgenLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!H _PKCS7_ATTR_SIGN_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ô _PKCS7_ATTR_VERIFY_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ¨_PKCS7_DIGEST_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K# _PKCS7_DIGEST_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K©_PKCS7_DIGEST_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ª_PKCS7_ENCRYPT_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Ky _PKCS7_ENCRYPT_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K «_PKCS7_ENCRYPT_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%¬_PKCS7_ENC_CONTENT_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#( _PKCS7_ENC_CONTENT_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$­_PKCS7_ENC_CONTENT_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"®_PKCS7_ENVELOPE_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K é _PKCS7_ENVELOPE_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!¯_PKCS7_ENVELOPE_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K-°_PKCS7_ISSUER_AND_SERIAL_digestLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+±_PKCS7_ISSUER_AND_SERIAL_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)À _PKCS7_ISSUER_AND_SERIAL_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*²_PKCS7_ISSUER_AND_SERIAL_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$³_PKCS7_RECIP_INFO_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _PKCS7_RECIP_INFO_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#´_PKCS7_RECIP_INFO_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#0_PKCS7_RECIP_INFO_setLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K µ_PKCS7_SIGNED_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kà _PKCS7_SIGNED_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K¶_PKCS7_SIGNED_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%·_PKCS7_SIGNER_INFO_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#Š _PKCS7_SIGNER_INFO_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$¸_PKCS7_SIGNER_INFO_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$¢_PKCS7_SIGNER_INFO_setLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'¹_PKCS7_SIGN_ENVELOPE_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%B _PKCS7_SIGN_ENVELOPE_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&º_PKCS7_SIGN_ENVELOPE_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(l_PKCS7_add_attrib_smimecapLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"r_PKCS7_add_attributeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$¤_PKCS7_add_certificateLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K¥_PKCS7_add_crlLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"1_PKCS7_add_recipientLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'2_PKCS7_add_recipient_infoLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ª_PKCS7_add_signatureLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)s_PKCS7_add_signed_attributeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K£_PKCS7_add_signerLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*«_PKCS7_cert_from_signer_infoLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ¦_PKCS7_content_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KŸ_PKCS7_ctrlLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÞ_PKCS7_dataDecodeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÝ_PKCS7_dataFinalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K©_PKCS7_dataInitLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K¨_PKCS7_dataVerifyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kg_PKCS7_decryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+t_PKCS7_digest_from_attributesLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K»_PKCS7_dupLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kb_PKCS7_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K¼_PKCS7_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!f_PKCS7_get0_signersLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"u_PKCS7_get_attributeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*v_PKCS7_get_issuer_and_serialLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)w_PKCS7_get_signed_attributeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$¬_PKCS7_get_signer_infoLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!j_PKCS7_get_smimecapLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KX _PKCS7_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K½_PKCS7_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$¨_PKCS7_set0_type_otherLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#_PKCS7_set_attributesLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K3_PKCS7_set_cipherLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ¡_PKCS7_set_contentLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_PKCS7_set_digestLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*‚_PKCS7_set_signed_attributesLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K _PKCS7_set_typeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kk_PKCS7_signLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$5_PKCS7_signatureVerifyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$i_PKCS7_simple_smimecapLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Ka_PKCS7_verifyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'%_PKCS8_PRIV_KEY_INFO_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%¸ _PKCS8_PRIV_KEY_INFO_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&#_PKCS8_PRIV_KEY_INFO_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_PKCS8_add_keyusageLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KÍ _PKCS8_decryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kð_PKCS8_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K(_PKCS8_set_brokenLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Ó_PKEY_USAGE_PERIOD_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#N _PKEY_USAGE_PERIOD_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$Ò_PKEY_USAGE_PERIOD_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÓ_POLICYINFO_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K¯ _POLICYINFO_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÑ_POLICYINFO_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"×_POLICYQUALINFO_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ; _POLICYQUALINFO_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Õ_POLICYQUALINFO_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K& _POLICY_CONSTRAINTS_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$A_POLICY_CONSTRAINTS_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Û _POLICY_CONSTRAINTS_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!m_POLICY_MAPPINGS_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"[ _POLICY_MAPPING_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K  _POLICY_MAPPING_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!¢_POLICY_MAPPING_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K-ê _PROXY_CERT_INFO_EXTENSION_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+ë _PROXY_CERT_INFO_EXTENSION_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,é _PROXY_CERT_INFO_EXTENSION_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ì _PROXY_POLICY_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kå _PROXY_POLICY_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kí _PROXY_POLICY_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.KY_RAND_SSLeayLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.K™_RAND_addLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KÐ_RAND_bytesLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KÑ_RAND_cleanupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KÍ_RAND_egdLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kb _RAND_egd_bytesLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KÒ_RAND_eventLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÒ_RAND_file_nameLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#q_RAND_get_rand_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÓ_RAND_load_fileLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Kw _RAND_pollLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ž_RAND_pseudo_bytesLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K# _RAND_query_egd_bytesLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.KÔ_RAND_screenLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.KÕ_RAND_seedLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ª _RAND_set_rand_engineLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#Z_RAND_set_rand_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.KÎ_RAND_statusLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÖ_RAND_write_fileLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K×_RC2_cbc_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Ø_RC2_cfb64_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kã_RC2_decryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÙ_RC2_ecb_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.KÚ_RC2_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Û_RC2_ofb64_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.KÜ_RC2_set_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 38 ` ÿÿL|„.KÝ_RC4LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.KÞ_RC4_optionsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kß_RC4_set_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K_RIPEMD160LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_RIPEMD160_FinalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_RIPEMD160_InitLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_RIPEMD160_TransformLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_RIPEMD160_UpdateLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&à_RSAPrivateKey_asn1_methLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K á_RSAPrivateKey_dupLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KZ _RSAPrivateKey_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kâ_RSAPublicKey_dupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K± _RSAPublicKey_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kã_RSA_PKCS1_SSLeayLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!á_RSA_X931_derive_exLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'Ö_RSA_X931_generate_key_exLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K÷ _RSA_X931_hash_idLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÒ_RSA_blinding_offLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÑ_RSA_blinding_onLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KM_RSA_check_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K¼_RSA_flagsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.Kä_RSA_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kå_RSA_generate_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"f_RSA_generate_key_exLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%8_RSA_get_default_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_RSA_get_ex_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#_RSA_get_ex_new_indexLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K7_RSA_get_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K[_RSA_memory_lockLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.Kæ_RSA_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kç_RSA_new_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kp_RSA_null_methodLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)Ê_RSA_padding_add_PKCS1_OAEPLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(û _RSA_padding_add_PKCS1_PSSLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+_RSA_padding_add_PKCS1_type_1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+_RSA_padding_add_PKCS1_type_2LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K% _RSA_padding_add_SSLv23LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ú _RSA_padding_add_X931LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K# _RSA_padding_add_noneLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+Ë_RSA_padding_check_PKCS1_OAEPLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K- _RSA_padding_check_PKCS1_type_1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K- _RSA_padding_check_PKCS1_type_2LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K' _RSA_padding_check_SSLv23LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%ø _RSA_padding_check_X931LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%_RSA_padding_check_noneLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Kè_RSA_printLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Ké_RSA_print_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ê_RSA_private_decryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ë_RSA_private_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ì_RSA_public_decryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!í_RSA_public_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%î_RSA_set_default_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_RSA_set_ex_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K6_RSA_set_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Õ _RSA_setup_blindingLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.Kï_RSA_signLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)ð_RSA_sign_ASN1_OCTET_STRINGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.Kñ_RSA_sizeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KÈ _RSA_up_refLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kò_RSA_verifyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+ó_RSA_verify_ASN1_OCTET_STRINGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ù _RSA_verify_PKCS1_PSSLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 38 ` ÿÿL|„.Kô_SHALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 39 ` ÿÿL|„.Kõ_SHA1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kö_SHA1_FinalLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K÷_SHA1_InitLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kô_SHA1_TransformLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kø_SHA1_UpdateLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.K¶ _SHA224LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kè _SHA224_FinalLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K/_SHA224_InitLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kê _SHA224_UpdateLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.KF_SHA256LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K€_SHA256_FinalLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K— _SHA256_InitLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KP_SHA256_TransformLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kµ_SHA256_UpdateLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.K¡_SHA384LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kœ_SHA384_FinalLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K™_SHA384_InitLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kß _SHA384_UpdateLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.KU_SHA512LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Ký _SHA512_FinalLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K1_SHA512_InitLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K[_SHA512_TransformLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K _SHA512_UpdateLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Kù_SHA_FinalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.Kú_SHA_InitLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kõ_SHA_TransformLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kû_SHA_UpdateLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kd_SMIME_crlf_copyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K±_SMIME_read_ASN1LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K__SMIME_read_PKCS7LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kh_SMIME_textLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ^_SMIME_write_PKCS7LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.K_SSLeayLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_SSLeay_versionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Ž _STORE_ATTR_INFO_compareLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#¨ _STORE_ATTR_INFO_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(@_STORE_ATTR_INFO_get0_cstrLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&¤ _STORE_ATTR_INFO_get0_dnLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*: _STORE_ATTR_INFO_get0_numberLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+=_STORE_ATTR_INFO_get0_sha1strLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!O _STORE_ATTR_INFO_inLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$_STORE_ATTR_INFO_in_exLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'œ _STORE_ATTR_INFO_in_rangeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*ô _STORE_ATTR_INFO_modify_cstrLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(þ _STORE_ATTR_INFO_modify_dnLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K," _STORE_ATTR_INFO_modify_numberLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K-}_STORE_ATTR_INFO_modify_sha1strLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"« _STORE_ATTR_INFO_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'š _STORE_ATTR_INFO_set_cstrLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%4 _STORE_ATTR_INFO_set_dnLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K) _STORE_ATTR_INFO_set_numberLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K* _STORE_ATTR_INFO_set_sha1strLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K× _STORE_MemoryLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K 8_STORE_OBJECT_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_STORE_OBJECT_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_STORE_create_methodLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K _STORE_ctrlLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%² _STORE_delete_arbitraryLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'Z_STORE_delete_certificateLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K%_STORE_delete_crlLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_STORE_delete_numberLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'í _STORE_delete_private_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&> _STORE_delete_public_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#7 _STORE_destroy_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K^_STORE_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ø _STORE_generate_crlLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_STORE_generate_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"… _STORE_get_arbitraryLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$V_STORE_get_certificateLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K—_STORE_get_crlLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K a_STORE_get_ex_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%B_STORE_get_ex_new_indexLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KI _STORE_get_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KW _STORE_get_numberLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$© _STORE_get_private_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#? _STORE_get_public_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)–_STORE_list_certificate_endLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*£_STORE_list_certificate_endpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*Ÿ _STORE_list_certificate_nextLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+º _STORE_list_certificate_startLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!y _STORE_list_crl_endLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"v _STORE_list_crl_endpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"› _STORE_list_crl_nextLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#_STORE_list_crl_startLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)À _STORE_list_private_key_endLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*s_STORE_list_private_key_endpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*¥ _STORE_list_private_key_nextLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+l_STORE_list_private_key_startLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(‚ _STORE_list_public_key_endLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)' _STORE_list_public_key_endpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)6_STORE_list_public_key_nextLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*l _STORE_list_public_key_startLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 68 ` ÿÿL|„.K0ƒ_STORE_method_get_cleanup_functionLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K-]_STORE_method_get_ctrl_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 67 ` ÿÿL|„.K/._STORE_method_get_delete_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 69 ` ÿÿL|„.K1b _STORE_method_get_generate_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,á _STORE_method_get_get_functionLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 71 ` ÿÿL|„.K3ÿ _STORE_method_get_initialise_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 69 ` ÿÿL|„.K1«_STORE_method_get_list_end_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 70 ` ÿÿL|„.K2£ _STORE_method_get_list_next_functionLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 71 ` ÿÿL|„.K3_STORE_method_get_list_start_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 71 ` ÿÿL|„.K3æ _STORE_method_get_lock_store_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 67 ` ÿÿL|„.K/_STORE_method_get_modify_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 67 ` ÿÿL|„.K/Ï _STORE_method_get_revoke_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 66 ` ÿÿL|„.K.Ò _STORE_method_get_store_functionLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 73 ` ÿÿL|„.K5`_STORE_method_get_unlock_store_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 73 ` ÿÿL|„.K5 _STORE_method_get_update_store_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 68 ` ÿÿL|„.K0â _STORE_method_set_cleanup_functionLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K- _STORE_method_set_ctrl_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 67 ` ÿÿL|„.K/ž _STORE_method_set_delete_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 69 ` ÿÿL|„.K1” _STORE_method_set_generate_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,Ð _STORE_method_set_get_functionLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 71 ` ÿÿL|„.K30 _STORE_method_set_initialise_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 69 ` ÿÿL|„.K1c _STORE_method_set_list_end_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 70 ` ÿÿL|„.K2_ _STORE_method_set_list_next_functionLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 71 ` ÿÿL|„.K3 _STORE_method_set_list_start_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 71 ` ÿÿL|„.K3Ÿ_STORE_method_set_lock_store_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 67 ` ÿÿL|„.K/Ê _STORE_method_set_modify_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 67 ` ÿÿL|„.K/­ _STORE_method_set_revoke_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 66 ` ÿÿL|„.K.N _STORE_method_set_store_functionLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 73 ` ÿÿL|„.K5_STORE_method_set_unlock_store_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 73 ` ÿÿL|„.K5é _STORE_method_set_update_store_functionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%@ _STORE_modify_arbitraryLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K' _STORE_modify_certificateLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kk_STORE_modify_crlLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Ñ _STORE_modify_numberLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'Æ _STORE_modify_private_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&_STORE_modify_public_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kk _STORE_new_engineLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K°_STORE_new_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$L _STORE_parse_attrs_endLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%2_STORE_parse_attrs_endpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Ë _STORE_parse_attrs_nextLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K& _STORE_parse_attrs_startLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K',_STORE_revoke_certificateLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'û _STORE_revoke_private_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&° _STORE_revoke_public_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Š_STORE_set_ex_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _STORE_set_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$_STORE_store_arbitraryLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K& _STORE_store_certificateLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K† _STORE_store_crlLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!® _STORE_store_numberLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Ó _STORE_store_private_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%ù _STORE_store_public_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K4_SXNETID_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Km _SXNETID_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K3_SXNETID_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#Ç_SXNET_add_id_INTEGERLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÅ_SXNET_add_id_ascLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Æ_SXNET_add_id_ulongLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K0_SXNET_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#Ê_SXNET_get_id_INTEGERLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÈ_SXNET_get_id_ascLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!É_SXNET_get_id_ulongLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.K5 _SXNET_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K/_SXNET_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ÿ_TXT_DB_create_indexLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K_TXT_DB_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_TXT_DB_get_by_indexLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K_TXT_DB_insertLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K_TXT_DB_readLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_TXT_DB_writeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Kƒ _UI_OpenSSLLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kˆ _UI_UTIL_read_pwLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%‰ _UI_UTIL_read_pw_stringLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"I _UI_add_error_stringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!L _UI_add_info_stringLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ê _UI_add_input_booleanLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"6 _UI_add_input_stringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Ké _UI_add_user_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ø _UI_add_verify_stringLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _UI_construct_promptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KH _UI_create_methodLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.K _UI_ctrlLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ) _UI_destroy_methodLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"° _UI_dup_error_stringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Y _UI_dup_info_stringLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#6 _UI_dup_input_booleanLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _UI_dup_input_stringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#/ _UI_dup_verify_stringLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.KL _UI_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$" _UI_get0_action_stringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$. _UI_get0_output_stringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kž _UI_get0_resultLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ _UI_get0_result_stringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"¿ _UI_get0_test_stringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ß _UI_get0_user_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$† _UI_get_default_methodLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kƒ _UI_get_ex_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"t _UI_get_ex_new_indexLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!£ _UI_get_input_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kë _UI_get_methodLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$â _UI_get_result_maxsizeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$M _UI_get_result_minsizeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!d _UI_get_string_typeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#å _UI_method_get_closerLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$v _UI_method_get_flusherLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#£ _UI_method_get_openerLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#Å _UI_method_get_readerLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#‚ _UI_method_get_writerLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#þ _UI_method_set_closerLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$å _UI_method_set_flusherLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#D _UI_method_set_openerLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#f _UI_method_set_readerLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K# _UI_method_set_writerLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.KU _UI_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KM _UI_new_methodLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.Ka _UI_processLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$€ _UI_set_default_methodLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K÷ _UI_set_ex_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K _UI_set_methodLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KÈ _UI_set_resultLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÛ_USERNOTICE_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K< _USERNOTICE_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÙ_USERNOTICE_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Ko_UTF8_getcLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Kn_UTF8_putcLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&ß_X509V3_EXT_CRL_add_confLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'× _X509V3_EXT_CRL_add_nconfLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&h_X509V3_EXT_REQ_add_confLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'C _X509V3_EXT_REQ_add_nconfLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K”_X509V3_EXT_addLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#•_X509V3_EXT_add_aliasLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"–_X509V3_EXT_add_confLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"p_X509V3_EXT_add_listLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K# _X509V3_EXT_add_nconfLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Ë _X509V3_EXT_add_nconf_skLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!—_X509V3_EXT_cleanupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K˜_X509V3_EXT_confLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"™_X509V3_EXT_conf_nidLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÖ_X509V3_EXT_d2iLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kš_X509V3_EXT_getLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!›_X509V3_EXT_get_nidLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kn_X509V3_EXT_i2dLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kì _X509V3_EXT_nconfLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#~ _X509V3_EXT_nconf_nidLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kœ_X509V3_EXT_printLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_X509V3_EXT_print_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!o_X509V3_EXT_val_prnLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'i_X509V3_NAME_from_sectionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kè _X509V3_add1_i2dLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K-ž_X509V3_add_standard_extensionsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KŸ_X509V3_add_valueLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ _X509V3_add_value_boolLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K's_X509V3_add_value_bool_nfLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#¡_X509V3_add_value_intLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K% _X509V3_add_value_ucharLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K¢_X509V3_conf_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K& _X509V3_extensions_printLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kê_X509V3_get_d2iLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!á_X509V3_get_sectionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K à_X509V3_get_stringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$£_X509V3_get_value_boolLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#¤_X509V3_get_value_intLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ¥_X509V3_parse_listLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ã_X509V3_section_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$Ë_X509V3_set_conf_lhashLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kä_X509V3_set_ctxLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K‡ _X509V3_set_nconfLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!â_X509V3_string_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KV_X509_ALGORS_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kî_X509_ALGOR_dupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_X509_ALGOR_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KW_X509_ALGOR_get0LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kš _X509_ALGOR_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_X509_ALGOR_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KX_X509_ALGOR_set0LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#‘_X509_ATTRIBUTE_countLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ƒ_X509_ATTRIBUTE_createLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+_X509_ATTRIBUTE_create_by_NIDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+’_X509_ATTRIBUTE_create_by_OBJLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+ª_X509_ATTRIBUTE_create_by_txtLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!„_X509_ATTRIBUTE_dupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_X509_ATTRIBUTE_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'–_X509_ATTRIBUTE_get0_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)“_X509_ATTRIBUTE_get0_objectLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'‹_X509_ATTRIBUTE_get0_typeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ¬ _X509_ATTRIBUTE_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_X509_ATTRIBUTE_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'Œ_X509_ATTRIBUTE_set1_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)_X509_ATTRIBUTE_set1_objectLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!†_X509_CERT_AUX_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K§ _X509_CERT_AUX_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Ñ_X509_CERT_AUX_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"¾_X509_CERT_AUX_printLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ú _X509_CERT_PAIR_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Î _X509_CERT_PAIR_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!d_X509_CERT_PAIR_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K _X509_CINF_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kü _X509_CINF_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K _X509_CINF_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _X509_CRL_INFO_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _X509_CRL_INFO_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K _X509_CRL_INFO_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$¼ _X509_CRL_add0_revokedLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ _X509_CRL_add1_ext_i2dLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _X509_CRL_add_extLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_X509_CRL_cmpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_X509_CRL_delete_extLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KW _X509_CRL_digestLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_X509_CRL_dupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K_X509_CRL_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_X509_CRL_get_extLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&_X509_CRL_get_ext_by_NIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&_X509_CRL_get_ext_by_OBJLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+_X509_CRL_get_ext_by_criticalLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%_X509_CRL_get_ext_countLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#Ù_X509_CRL_get_ext_d2iLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kû _X509_CRL_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_X509_CRL_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÍ_X509_CRL_printLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Ì_X509_CRL_print_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'¶ _X509_CRL_set_issuer_nameLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K& _X509_CRL_set_lastUpdateLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&î _X509_CRL_set_nextUpdateLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K# _X509_CRL_set_versionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K_X509_CRL_signLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K/ _X509_CRL_sortLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_X509_CRL_verifyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!O_X509_EXTENSIONS_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+_X509_EXTENSION_create_by_NIDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+_X509_EXTENSION_create_by_OBJLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_X509_EXTENSION_dupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_X509_EXTENSION_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*_X509_EXTENSION_get_criticalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&_X509_EXTENSION_get_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K( _X509_EXTENSION_get_objectLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K k _X509_EXTENSION_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!!_X509_EXTENSION_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*"_X509_EXTENSION_set_criticalLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&#_X509_EXTENSION_set_dataLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K($_X509_EXTENSION_set_objectLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K%_X509_INFO_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K&_X509_INFO_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#'_X509_LOOKUP_by_aliasLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)(_X509_LOOKUP_by_fingerprintLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+)_X509_LOOKUP_by_issuer_serialLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%*_X509_LOOKUP_by_subjectLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K+_X509_LOOKUP_ctrlLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K,_X509_LOOKUP_fileLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K-_X509_LOOKUP_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#._X509_LOOKUP_hash_dirLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K/_X509_LOOKUP_initLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K0_X509_LOOKUP_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#1_X509_LOOKUP_shutdownLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,2_X509_NAME_ENTRY_create_by_NIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,3_X509_NAME_ENTRY_create_by_OBJLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,_X509_NAME_ENTRY_create_by_txtLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"4_X509_NAME_ENTRY_dupLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#5_X509_NAME_ENTRY_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'6_X509_NAME_ENTRY_get_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)7_X509_NAME_ENTRY_get_objectLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!s _X509_NAME_ENTRY_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"8_X509_NAME_ENTRY_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'9_X509_NAME_ENTRY_set_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K):_X509_NAME_ENTRY_set_objectLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K";_X509_NAME_add_entryLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)z_X509_NAME_add_entry_by_NIDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)Ø_X509_NAME_add_entry_by_OBJLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)x_X509_NAME_add_entry_by_txtLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K<_X509_NAME_cmpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%=_X509_NAME_delete_entryLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K>_X509_NAME_digestLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K?_X509_NAME_dupLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$@_X509_NAME_entry_countLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KA_X509_NAME_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"B_X509_NAME_get_entryLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)C_X509_NAME_get_index_by_NIDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)D_X509_NAME_get_index_by_OBJLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(E_X509_NAME_get_text_by_NIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(F_X509_NAME_get_text_by_OBJLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KG_X509_NAME_hashLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K; _X509_NAME_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KH_X509_NAME_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K I_X509_NAME_onelineLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KJ_X509_NAME_printLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K! _X509_NAME_print_exLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$} _X509_NAME_print_ex_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KK_X509_NAME_setLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(L_X509_OBJECT_free_contentsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)’ _X509_OBJECT_idx_by_subjectLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 66 ` ÿÿL|„.K.M_X509_OBJECT_retrieve_by_subjectLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)‘ _X509_OBJECT_retrieve_matchLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'N_X509_OBJECT_up_ref_countLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KO_X509_PKEY_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KP_X509_PKEY_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%˜_X509_POLICY_NODE_printLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KQ_X509_PUBKEY_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KR_X509_PUBKEY_getLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kw _X509_PUBKEY_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KS_X509_PUBKEY_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KT_X509_PUBKEY_setLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K*_X509_PURPOSE_addLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#G_X509_PURPOSE_cleanupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K {_X509_PURPOSE_get0LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Û_X509_PURPOSE_get0_nameLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&9_X509_PURPOSE_get0_snameLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Æ_X509_PURPOSE_get_by_idLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K( _X509_PURPOSE_get_by_snameLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%_X509_PURPOSE_get_countLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Í_X509_PURPOSE_get_idLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%æ_X509_PURPOSE_get_trustLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KB _X509_PURPOSE_setLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!U_X509_REQ_INFO_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KC _X509_REQ_INFO_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K V_X509_REQ_INFO_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!¦_X509_REQ_add1_attrLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(¡_X509_REQ_add1_attr_by_NIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(¤_X509_REQ_add1_attr_by_OBJLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(©_X509_REQ_add1_attr_by_txtLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Y_X509_REQ_add_extensionsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*W_X509_REQ_add_extensions_nidLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)¼ _X509_REQ_check_private_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#§_X509_REQ_delete_attrLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K: _X509_REQ_digestLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KW_X509_REQ_dupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%S_X509_REQ_extension_nidLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KX_X509_REQ_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"c _X509_REQ_get1_emailLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K  _X509_REQ_get_attrLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'Ÿ_X509_REQ_get_attr_by_NIDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'¢_X509_REQ_get_attr_by_OBJLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&¥_X509_REQ_get_attr_countLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*U_X509_REQ_get_extension_nidsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&P_X509_REQ_get_extensionsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Y_X509_REQ_get_pubkeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K? _X509_REQ_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KZ_X509_REQ_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K[_X509_REQ_printLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ¥ _X509_REQ_print_exLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K \_X509_REQ_print_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*Q_X509_REQ_set_extension_nidsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"]_X509_REQ_set_pubkeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(^_X509_REQ_set_subject_nameLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#__X509_REQ_set_versionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K`_X509_REQ_signLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Ka_X509_REQ_to_X509LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kb_X509_REQ_verifyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K( _X509_REVOKED_add1_ext_i2dLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#c_X509_REVOKED_add_extLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&d_X509_REVOKED_delete_extLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K e_X509_REVOKED_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#f_X509_REVOKED_get_extLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*g_X509_REVOKED_get_ext_by_NIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*h_X509_REVOKED_get_ext_by_OBJLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 67 ` ÿÿL|„.K/i_X509_REVOKED_get_ext_by_criticalLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)j_X509_REVOKED_get_ext_countLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'u_X509_REVOKED_get_ext_d2iLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KR _X509_REVOKED_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kk_X509_REVOKED_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 66 ` ÿÿL|„.K.0 _X509_REVOKED_set_revocationDateLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,ï _X509_REVOKED_set_serialNumberLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kl_X509_SIG_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K _X509_SIG_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Km_X509_SIG_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%n_X509_STORE_CTX_cleanupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"±_X509_STORE_CTX_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(± _X509_STORE_CTX_get0_paramLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 66 ` ÿÿL|„.K.¤_X509_STORE_CTX_get0_policy_treeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(œ_X509_STORE_CTX_get1_chainLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K) _X509_STORE_CTX_get1_issuerLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'ö_X509_STORE_CTX_get_chainLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 66 ` ÿÿL|„.K.÷_X509_STORE_CTX_get_current_certLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'ø_X509_STORE_CTX_get_errorLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K-ù_X509_STORE_CTX_get_error_depthLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)ú_X509_STORE_CTX_get_ex_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 66 ` ÿÿL|„.K.L_X509_STORE_CTX_get_ex_new_indexLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 69 ` ÿÿL|„.K1Ä _X509_STORE_CTX_get_explicit_policyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"o_X509_STORE_CTX_initLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ñ_X509_STORE_CTX_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K-¸_X509_STORE_CTX_purpose_inheritLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K' _X509_STORE_CTX_set0_crlsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K( _X509_STORE_CTX_set0_paramLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&ü_X509_STORE_CTX_set_certLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'ý_X509_STORE_CTX_set_chainLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K) _X509_STORE_CTX_set_defaultLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'1 _X509_STORE_CTX_set_depthLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'þ_X509_STORE_CTX_set_errorLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)ÿ_X509_STORE_CTX_set_ex_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'“ _X509_STORE_CTX_set_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)_X509_STORE_CTX_set_purposeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K& _X509_STORE_CTX_set_timeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'î_X509_STORE_CTX_set_trustLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+Ü _X509_STORE_CTX_set_verify_cbLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+” _X509_STORE_CTX_trusted_stackLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"p_X509_STORE_add_certLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!½_X509_STORE_add_crlLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$q_X509_STORE_add_lookupLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kr_X509_STORE_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(s_X509_STORE_get_by_subjectLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(t_X509_STORE_load_locationsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Ku_X509_STORE_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$\_X509_STORE_set1_paramLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+v_X509_STORE_set_default_pathsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#´ _X509_STORE_set_depthLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#$ _X509_STORE_set_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%ÿ _X509_STORE_set_purposeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K# _X509_STORE_set_trustLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K‹_X509_TRUST_addLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!×_X509_TRUST_cleanupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kÿ_X509_TRUST_get0LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#þ_X509_TRUST_get0_nameLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#å_X509_TRUST_get_by_idLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#>_X509_TRUST_get_countLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#_X509_TRUST_get_flagsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#_X509_TRUST_get_trustLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K _X509_TRUST_setLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%‰_X509_TRUST_set_defaultLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kw_X509_VAL_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K _X509_VAL_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kx_X509_VAL_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,D_X509_VERIFY_PARAM_add0_policyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+w_X509_VERIFY_PARAM_add0_tableLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,¼_X509_VERIFY_PARAM_clear_flagsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Ç _X509_VERIFY_PARAM_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*ç _X509_VERIFY_PARAM_get_depthLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*Å_X509_VERIFY_PARAM_get_flagsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(2 _X509_VERIFY_PARAM_inheritLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'K_X509_VERIFY_PARAM_lookupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$m _X509_VERIFY_PARAM_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%_X509_VERIFY_PARAM_set1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*U _X509_VERIFY_PARAM_set1_nameLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 66 ` ÿÿL|„.K.T _X509_VERIFY_PARAM_set1_policiesLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*G _X509_VERIFY_PARAM_set_depthLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*] _X509_VERIFY_PARAM_set_flagsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,V _X509_VERIFY_PARAM_set_purposeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)­_X509_VERIFY_PARAM_set_timeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*§ _X509_VERIFY_PARAM_set_trustLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 66 ` ÿÿL|„.K.Å _X509_VERIFY_PARAM_table_cleanupLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ‰ _X509_add1_ext_i2dLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&"_X509_add1_reject_objectLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%\_X509_add1_trust_objectLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Ky_X509_add_extLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_X509_alias_get0LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_X509_alias_set1LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kz_X509_asn1_methLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K${_X509_certificate_typeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KÖ _X509_check_caLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K – _X509_check_issuedLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%|_X509_check_private_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_X509_check_purposeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K#_X509_check_trustLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KW_X509_cmpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$}_X509_cmp_current_timeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KŽ _X509_cmp_timeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K~_X509_delete_extLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K_X509_digestLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.K€_X509_dupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Ke _X509_email_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K-˜_X509_find_by_issuer_and_serialLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#™_X509_find_by_subjectLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K_X509_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&f _X509_get0_pubkey_bitstrLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kd _X509_get1_emailLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KP_X509_get1_ocspLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)‚_X509_get_default_cert_areaLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(ƒ_X509_get_default_cert_dirLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,„_X509_get_default_cert_dir_envLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)…_X509_get_default_cert_fileLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K-†_X509_get_default_cert_file_envLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+‡_X509_get_default_private_dirLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kž_X509_get_ex_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ã_X509_get_ex_new_indexLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kˆ_X509_get_extLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"‰_X509_get_ext_by_NIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Š_X509_get_ext_by_OBJLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'‹_X509_get_ext_by_criticalLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Œ_X509_get_ext_countLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K¦_X509_get_ext_d2iLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#_X509_get_issuer_nameLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KŽ_X509_get_pubkeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)_X509_get_pubkey_parametersLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$_X509_get_serialNumberLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$‘_X509_get_subject_nameLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K’_X509_gmtime_adjLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)“_X509_issuer_and_serial_cmpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*”_X509_issuer_and_serial_hashLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#•_X509_issuer_name_cmpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$–_X509_issuer_name_hashLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.KÕ _X509_itLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K# _X509_keyid_get0LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kœ _X509_keyid_set1LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&´_X509_load_cert_crl_fileLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"—_X509_load_cert_fileLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!¾_X509_load_crl_fileLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.K˜_X509_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K æ _X509_ocspid_printLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ˆ_X509_policy_checkLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*ð _X509_policy_level_get0_nodeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+j _X509_policy_level_node_countLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K++ _X509_policy_node_get0_parentLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+‡ _X509_policy_node_get0_policyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 67 ` ÿÿL|„.K/x _X509_policy_node_get0_qualifiersLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$Š _X509_policy_tree_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K* _X509_policy_tree_get0_levelLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K-5 _X509_policy_tree_get0_policiesLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 70 ` ÿÿL|„.K2H_X509_policy_tree_get0_user_policiesLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+õ _X509_policy_tree_level_countLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K™_X509_printLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kð _X509_print_exLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÊ _X509_print_ex_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kš_X509_print_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!O _X509_pubkey_digestLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ˆ_X509_reject_clearLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kv_X509_set_ex_dataLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#›_X509_set_issuer_nameLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K œ_X509_set_notAfterLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_X509_set_notBeforeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kž_X509_set_pubkeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$Ÿ_X509_set_serialNumberLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ _X509_set_subject_nameLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K¡_X509_set_versionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K¢_X509_signLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#’ _X509_signature_printLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$£_X509_subject_name_cmpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%¤_X509_subject_name_hashLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'¡ _X509_supported_extensionLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K• _X509_time_adjLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K¥_X509_to_X509_REQLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kˆ_X509_trust_clearLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K¦_X509_verifyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K§_X509_verify_certLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,¨_X509_verify_cert_error_stringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K•_X509at_add1_attrLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&£_X509at_add1_attr_by_NIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&¨_X509at_add1_attr_by_OBJLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&«_X509at_add1_attr_by_txtLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!—_X509at_delete_attrLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&[_X509at_get0_data_by_OBJLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_X509at_get_attrLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%”_X509at_get_attr_by_NIDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%˜_X509at_get_attr_by_OBJLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$Ž_X509at_get_attr_countLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K©_X509v3_add_extLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K °_X509v3_delete_extLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K±_X509v3_get_extLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$²_X509v3_get_ext_by_NIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$³_X509v3_get_ext_by_OBJLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)´_X509v3_get_ext_by_criticalLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#µ_X509v3_get_ext_countLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KÜ _ZLONG_itLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(“ __ossl_096_des_random_seedLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÇ__ossl_old_cryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Ø __ossl_old_des_cbc_cksumLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(@ __ossl_old_des_cbc_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K* __ossl_old_des_cfb64_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(” __ossl_old_des_cfb_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"^ __ossl_old_des_cryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%‘ __ossl_old_des_decrypt3LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)& __ossl_old_des_ecb3_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K([ __ossl_old_des_ecb_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 65 ` ÿÿL|„.K-© __ossl_old_des_ede3_cbc_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 67 ` ÿÿL|„.K/â __ossl_old_des_ede3_cfb64_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 67 ` ÿÿL|„.K/Ä __ossl_old_des_ede3_ofb64_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%x __ossl_old_des_enc_readLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Î __ossl_old_des_enc_writeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ __ossl_old_des_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%¶ __ossl_old_des_encrypt2LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%· __ossl_old_des_encrypt3LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K# __ossl_old_des_fcryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K( __ossl_old_des_is_weak_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&j __ossl_old_des_key_schedLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)Ý __ossl_old_des_ncbc_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*q __ossl_old_des_ofb64_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K( __ossl_old_des_ofb_encryptLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$4 __ossl_old_des_optionsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)ð __ossl_old_des_pcbc_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'¬ __ossl_old_des_quad_cksumLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K' __ossl_old_des_random_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(#__ossl_old_des_random_seedLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,$__ossl_old_des_read_2passwordsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*%__ossl_old_des_read_passwordLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$&__ossl_old_des_read_pwLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+'__ossl_old_des_read_pw_stringLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ù __ossl_old_des_set_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 63 ` ÿÿL|„.K+ __ossl_old_des_set_odd_parityLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,¥ __ossl_old_des_string_to_2keysLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*ø __ossl_old_des_string_to_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)W __ossl_old_des_xcbc_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$J __shadow_DES_check_keyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" __shadow_DES_rw_modeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K»_a2d_ASN1_OBJECTLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"º_a2i_ASN1_ENUMERATEDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K¼_a2i_ASN1_INTEGERLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K½_a2i_ASN1_STRINGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K/ _a2i_IPADDRESSLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K”_a2i_IPADDRESS_NCLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Kå_a2i_ipaddLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.K_asc2uniLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K¾_asn1_FinishLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K¿_asn1_GetSequenceLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KC_asn1_add_errorLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K t_asn1_const_FinishLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K _asn1_do_adbLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kó _asn1_do_lockLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K± _asn1_enc_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Ká _asn1_enc_initLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KK _asn1_enc_restoreLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kî _asn1_enc_saveLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.KH _asn1_ex_c2iLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kg _asn1_ex_i2cLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'ÿ _asn1_get_choice_selectorLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!5 _asn1_get_field_ptrLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'2 _asn1_set_choice_selectorLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_bn_add_wordsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KÀ_bn_div_wordsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kh _bn_dup_expandLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KÁ_bn_expand2LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÂ_bn_mul_add_wordsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KÃ_bn_mul_wordsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KÆ_bn_sqr_wordsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K\_bn_sub_wordsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"u _c2i_ASN1_BIT_STRINGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kx _c2i_ASN1_INTEGERLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K| _c2i_ASN1_OBJECTLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%‡_d2i_ACCESS_DESCRIPTIONLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"È_d2i_ASN1_BIT_STRINGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!D_d2i_ASN1_BMPSTRINGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÉ_d2i_ASN1_BOOLEANLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"´_d2i_ASN1_ENUMERATEDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'¦_d2i_ASN1_GENERALIZEDTIMELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K% _d2i_ASN1_GENERALSTRINGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÊ_d2i_ASN1_HEADERLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Ë_d2i_ASN1_IA5STRINGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÌ_d2i_ASN1_INTEGERLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Ky_d2i_ASN1_NULLLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÍ_d2i_ASN1_OBJECTLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$Î_d2i_ASN1_OCTET_STRINGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Ï_d2i_ASN1_PRINTABLELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'Ð_d2i_ASN1_PRINTABLESTRINGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KÑ_d2i_ASN1_SETLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Ò_d2i_ASN1_T61STRINGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K§_d2i_ASN1_TIMELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KÓ_d2i_ASN1_TYPELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K t_d2i_ASN1_UINTEGERLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'£ _d2i_ASN1_UNIVERSALSTRINGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÔ_d2i_ASN1_UTCTIMELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K">_d2i_ASN1_UTF8STRINGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%<_d2i_ASN1_VISIBLESTRINGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÕ_d2i_ASN1_bytesLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Ö_d2i_ASN1_type_bytesLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(~_d2i_AUTHORITY_INFO_ACCESSLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ç_d2i_AUTHORITY_KEYIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Š_d2i_AutoPrivateKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$¨_d2i_BASIC_CONSTRAINTSLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Ï_d2i_CERTIFICATEPOLICIESLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_d2i_CRL_DIST_POINTSLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K×_d2i_DHparamsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"@_d2i_DIRECTORYSTRINGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KB_d2i_DISPLAYTEXTLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_d2i_DIST_POINTLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _d2i_DIST_POINT_NAMELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Ø_d2i_DSAPrivateKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$Ù_d2i_DSAPrivateKey_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#Ú_d2i_DSAPrivateKey_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÛ_d2i_DSAPublicKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_d2i_DSA_PUBKEYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!-_d2i_DSA_PUBKEY_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ù_d2i_DSA_PUBKEY_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K9_d2i_DSA_SIGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KÜ_d2i_DSAparamsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K…_d2i_ECDSA_SIGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!“ _d2i_ECPKParametersLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K•_d2i_ECParametersLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kë _d2i_ECPrivateKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ä _d2i_ECPrivateKey_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Y_d2i_ECPrivateKey_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Ka _d2i_EC_PUBKEYLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K {_d2i_EC_PUBKEY_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K§_d2i_EC_PUBKEY_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kþ _d2i_EDIPARTYNAMELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%r _d2i_EXTENDED_KEY_USAGELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K¼_d2i_GENERAL_NAMELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Á_d2i_GENERAL_NAMESLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K _d2i_KRB5_APREQLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!u _d2i_KRB5_APREQBODYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K } _d2i_KRB5_AUTHDATALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _d2i_KRB5_AUTHENTLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K# _d2i_KRB5_AUTHENTBODYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Ó _d2i_KRB5_CHECKSUMLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kæ _d2i_KRB5_ENCDATALIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KU _d2i_KRB5_ENCKEYLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ú _d2i_KRB5_PRINCNAMELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K _d2i_KRB5_TICKETLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kˆ _d2i_KRB5_TKTBODYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)©_d2i_NETSCAPE_CERT_SEQUENCELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Ý_d2i_NETSCAPE_SPKACLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Þ_d2i_NETSCAPE_SPKILIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KÞ_d2i_NOTICEREFLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kß_d2i_Netscape_RSALIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!â _d2i_OCSP_BASICRESPLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K3 _d2i_OCSP_CERTIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"î _d2i_OCSP_CERTSTATUSLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÐ _d2i_OCSP_CRLIDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KP _d2i_OCSP_ONEREQLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KK _d2i_OCSP_REQINFOLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KX _d2i_OCSP_REQUESTLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ç _d2i_OCSP_RESPBYTESLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ™ _d2i_OCSP_RESPDATALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KŽ _d2i_OCSP_RESPIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Ì _d2i_OCSP_RESPONSELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#' _d2i_OCSP_REVOKEDINFOLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ÿ _d2i_OCSP_SERVICELOCLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!9 _d2i_OCSP_SIGNATURELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"n _d2i_OCSP_SINGLERESPLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K0_d2i_OTHERNAMELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K{_d2i_PBE2PARAMLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K _d2i_PBEPARAMLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kw_d2i_PBKDF2PARAMLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K _d2i_PKCS12LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_d2i_PKCS12_BAGSLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_d2i_PKCS12_MAC_DATALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_d2i_PKCS12_SAFEBAGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_d2i_PKCS12_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K_d2i_PKCS12_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Kà_d2i_PKCS7LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Ká_d2i_PKCS7_DIGESTLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K â_d2i_PKCS7_ENCRYPTLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ã_d2i_PKCS7_ENC_CONTENTLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ä_d2i_PKCS7_ENVELOPELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*å_d2i_PKCS7_ISSUER_AND_SERIALLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#æ_d2i_PKCS7_RECIP_INFOLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kç_d2i_PKCS7_SIGNEDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$è_d2i_PKCS7_SIGNER_INFOLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&é_d2i_PKCS7_SIGN_ENVELOPELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kê_d2i_PKCS7_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kë_d2i_PKCS7_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&w_d2i_PKCS8PrivateKey_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%_d2i_PKCS8PrivateKey_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&$_d2i_PKCS8_PRIV_KEY_INFOLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*÷_d2i_PKCS8_PRIV_KEY_INFO_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)ô_d2i_PKCS8_PRIV_KEY_INFO_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kó_d2i_PKCS8_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kø_d2i_PKCS8_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$Ñ_d2i_PKEY_USAGE_PERIODLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÒ_d2i_POLICYINFOLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Ö_d2i_POLICYQUALINFOLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,ä _d2i_PROXY_CERT_INFO_EXTENSIONLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kè _d2i_PROXY_POLICYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K_d2i_PUBKEYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K‰ _d2i_PUBKEY_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K _d2i_PUBKEY_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kì_d2i_PrivateKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!…_d2i_PrivateKey_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K †_d2i_PrivateKey_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kí_d2i_PublicKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K î_d2i_RSAPrivateKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$ï_d2i_RSAPrivateKey_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#ð_d2i_RSAPrivateKey_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kñ_d2i_RSAPublicKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#±_d2i_RSAPublicKey_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"¸_d2i_RSAPublicKey_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kh _d2i_RSA_NETLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kü_d2i_RSA_PUBKEYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_d2i_RSA_PUBKEY_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ¬_d2i_RSA_PUBKEY_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K._d2i_SXNETLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K2_d2i_SXNETIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÚ_d2i_USERNOTICELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.Kò_d2i_X509LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kó_d2i_X509_ALGORLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Ka_d2i_X509_ALGORSLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ô_d2i_X509_ATTRIBUTELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K¼_d2i_X509_AUXLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K C_d2i_X509_CERT_AUXLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!r_d2i_X509_CERT_PAIRLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kõ_d2i_X509_CINFLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kö_d2i_X509_CRLLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ÷_d2i_X509_CRL_INFOLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kø_d2i_X509_CRL_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kù_d2i_X509_CRL_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!ú_d2i_X509_EXTENSIONLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"U_d2i_X509_EXTENSIONSLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kû_d2i_X509_NAMELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ü_d2i_X509_NAME_ENTRYLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Ký_d2i_X509_PKEYLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kþ_d2i_X509_PUBKEYLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kÿ_d2i_X509_REQLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K _d2i_X509_REQ_INFOLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_d2i_X509_REQ_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_d2i_X509_REQ_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K_d2i_X509_REVOKEDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_d2i_X509_SIGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_d2i_X509_VALLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_d2i_X509_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K_d2i_X509_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%½_get_rfc2409_prime_1024LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$Ä_get_rfc2409_prime_768LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Á_get_rfc3526_prime_1536LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%¿_get_rfc3526_prime_2048LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Â_get_rfc3526_prime_3072LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%Ã_get_rfc3526_prime_4096LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%À_get_rfc3526_prime_6144LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%»_get_rfc3526_prime_8192LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KÇ_hex_to_stringLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%& _i2a_ACCESS_DESCRIPTIONLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"¹_i2a_ASN1_ENUMERATEDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K/_i2a_ASN1_INTEGERLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K0_i2a_ASN1_OBJECTLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K1_i2a_ASN1_STRINGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"v _i2c_ASN1_BIT_STRINGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Ky _i2c_ASN1_INTEGERLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%_i2d_ACCESS_DESCRIPTIONLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"2_i2d_ASN1_BIT_STRINGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!E_i2d_ASN1_BMPSTRINGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K3_i2d_ASN1_BOOLEANLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"³_i2d_ASN1_ENUMERATEDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'­_i2d_ASN1_GENERALIZEDTIMELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K% _i2d_ASN1_GENERALSTRINGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K4_i2d_ASN1_HEADERLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!5_i2d_ASN1_IA5STRINGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K6_i2d_ASN1_INTEGERLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K}_i2d_ASN1_NULLLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K7_i2d_ASN1_OBJECTLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$8_i2d_ASN1_OCTET_STRINGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!9_i2d_ASN1_PRINTABLELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'e_i2d_ASN1_PRINTABLESTRINGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K:_i2d_ASN1_SETLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!g _i2d_ASN1_T61STRINGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K®_i2d_ASN1_TIMELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K;_i2d_ASN1_TYPELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 59 ` ÿÿL|„.K'  _i2d_ASN1_UNIVERSALSTRINGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K<_i2d_ASN1_UTCTIMELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"=_i2d_ASN1_UTF8STRINGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%;_i2d_ASN1_VISIBLESTRINGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K=_i2d_ASN1_bytesLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(_i2d_AUTHORITY_INFO_ACCESSLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"æ_i2d_AUTHORITY_KEYIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$¯_i2d_BASIC_CONSTRAINTSLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&Ì_i2d_CERTIFICATEPOLICIESLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_i2d_CRL_DIST_POINTSLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K>_i2d_DHparamsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"?_i2d_DIRECTORYSTRINGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KA_i2d_DISPLAYTEXTLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_i2d_DIST_POINTLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _i2d_DIST_POINT_NAMELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ?_i2d_DSAPrivateKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$@_i2d_DSAPrivateKey_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#A_i2d_DSAPrivateKey_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KB_i2d_DSAPublicKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K½_i2d_DSA_PUBKEYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Þ_i2d_DSA_PUBKEY_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ³_i2d_DSA_PUBKEY_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K:_i2d_DSA_SIGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KC_i2d_DSAparamsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K#_i2d_ECDSA_SIGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!‘ _i2d_ECPKParametersLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _i2d_ECParametersLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _i2d_ECPrivateKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#| _i2d_ECPrivateKey_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"G_i2d_ECPrivateKey_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KÁ _i2d_EC_PUBKEYLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K _i2d_EC_PUBKEY_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Ku_i2d_EC_PUBKEY_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K\ _i2d_EDIPARTYNAMELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%ì _i2d_EXTENDED_KEY_USAGELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K»_i2d_GENERAL_NAMELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Â_i2d_GENERAL_NAMESLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K _i2d_KRB5_APREQLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!% _i2d_KRB5_APREQBODYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ¢ _i2d_KRB5_AUTHDATALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kl _i2d_KRB5_AUTHENTLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#8 _i2d_KRB5_AUTHENTBODYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K _i2d_KRB5_CHECKSUMLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KA _i2d_KRB5_ENCDATALIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K _i2d_KRB5_ENCKEYLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!µ _i2d_KRB5_PRINCNAMELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÉ _i2d_KRB5_TICKETLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÞ _i2d_KRB5_TKTBODYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)°_i2d_NETSCAPE_CERT_SEQUENCELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!D_i2d_NETSCAPE_SPKACLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K E_i2d_NETSCAPE_SPKILIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KÜ_i2d_NOTICEREFLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KF_i2d_Netscape_RSALIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!¸ _i2d_OCSP_BASICRESPLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Kü _i2d_OCSP_CERTIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"‹ _i2d_OCSP_CERTSTATUSLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÅ _i2d_OCSP_CRLIDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K• _i2d_OCSP_ONEREQLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K _i2d_OCSP_REQINFOLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K² _i2d_OCSP_REQUESTLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!¹ _i2d_OCSP_RESPBYTESLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K E _i2d_OCSP_RESPDATALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KR _i2d_OCSP_RESPIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K z _i2d_OCSP_RESPONSELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#J _i2d_OCSP_REVOKEDINFOLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _i2d_OCSP_SERVICELOCLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!í _i2d_OCSP_SIGNATURELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"ö _i2d_OCSP_SINGLERESPLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kß_i2d_OTHERNAMELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Ky_i2d_PBE2PARAMLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K_i2d_PBEPARAMLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Ku_i2d_PBKDF2PARAMLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K_i2d_PKCS12LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_i2d_PKCS12_BAGSLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K" _i2d_PKCS12_MAC_DATALIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!_i2d_PKCS12_SAFEBAGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K_i2d_PKCS12_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K_i2d_PKCS12_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.KG_i2d_PKCS7LIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KH_i2d_PKCS7_DIGESTLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K I_i2d_PKCS7_ENCRYPTLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$J_i2d_PKCS7_ENC_CONTENTLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!K_i2d_PKCS7_ENVELOPELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*L_i2d_PKCS7_ISSUER_AND_SERIALLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.Kñ _i2d_PKCS7_NDEFLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#M_i2d_PKCS7_RECIP_INFOLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KN_i2d_PKCS7_SIGNEDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$O_i2d_PKCS7_SIGNER_INFOLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&P_i2d_PKCS7_SIGN_ENVELOPELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KQ_i2d_PKCS7_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KR_i2d_PKCS7_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*‚_i2d_PKCS8PrivateKeyInfo_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)_i2d_PKCS8PrivateKeyInfo_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&{_i2d_PKCS8PrivateKey_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 57 ` ÿÿL|„.K%|_i2d_PKCS8PrivateKey_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*€_i2d_PKCS8PrivateKey_nid_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)~_i2d_PKCS8PrivateKey_nid_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&"_i2d_PKCS8_PRIV_KEY_INFOLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 62 ` ÿÿL|„.K*_i2d_PKCS8_PRIV_KEY_INFO_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 61 ` ÿÿL|„.K)ÿ_i2d_PKCS8_PRIV_KEY_INFO_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kþ_i2d_PKCS8_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kñ_i2d_PKCS8_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$Ð_i2d_PKEY_USAGE_PERIODLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KÐ_i2d_POLICYINFOLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Ô_i2d_POLICYQUALINFOLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 64 ` ÿÿL|„.K,ç _i2d_PROXY_CERT_INFO_EXTENSIONLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kæ _i2d_PROXY_POLICYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KÃ_i2d_PUBKEYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K‡ _i2d_PUBKEY_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kˆ _i2d_PUBKEY_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KS_i2d_PrivateKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!‡_i2d_PrivateKey_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K „_i2d_PrivateKey_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KT_i2d_PublicKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K U_i2d_RSAPrivateKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$V_i2d_RSAPrivateKey_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#W_i2d_RSAPrivateKey_fpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KX_i2d_RSAPublicKeyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#²_i2d_RSAPublicKey_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"º_i2d_RSAPublicKey_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kf _i2d_RSA_NETLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.K¶_i2d_RSA_PUBKEYLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!Á_i2d_RSA_PUBKEY_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K A_i2d_RSA_PUBKEY_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K-_i2d_SXNETLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K1_i2d_SXNETIDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KØ_i2d_USERNOTICELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.KY_i2d_X509LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 49 ` ÿÿL|„.KZ_i2d_X509_ALGORLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K^_i2d_X509_ALGORSLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K![_i2d_X509_ATTRIBUTELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KT_i2d_X509_AUXLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ì_i2d_X509_CERT_AUXLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!:_i2d_X509_CERT_PAIRLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K\_i2d_X509_CINFLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K]_i2d_X509_CRLLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ^_i2d_X509_CRL_INFOLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.K__i2d_X509_CRL_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K`_i2d_X509_CRL_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!a_i2d_X509_EXTENSIONLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"R_i2d_X509_EXTENSIONSLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kb_i2d_X509_NAMELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"c_i2d_X509_NAME_ENTRYLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.Kd_i2d_X509_PKEYLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Ke_i2d_X509_PUBKEYLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kf_i2d_X509_REQLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K g_i2d_X509_REQ_INFOLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kh_i2d_X509_REQ_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.Ki_i2d_X509_REQ_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kj_i2d_X509_REVOKEDLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kk_i2d_X509_SIGLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kl_i2d_X509_VALLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Km_i2d_X509_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kn_i2d_X509_fpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K- _i2o_ECPublicKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"Ù_i2s_ASN1_ENUMERATEDLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 60 ` ÿÿL|„.K(Ú_i2s_ASN1_ENUMERATED_TABLELIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÕ_i2s_ASN1_INTEGERLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$Ä_i2s_ASN1_OCTET_STRINGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KÓ_i2t_ASN1_OBJECTLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"7_i2v_ASN1_BIT_STRINGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÎ_i2v_GENERAL_NAMELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Ã_i2v_GENERAL_NAMESLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Ko_idea_cbc_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!p_idea_cfb64_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kq_idea_ecb_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kr_idea_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 53 ` ÿÿL|„.K!s_idea_ofb64_encryptLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kt_idea_optionsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#u_idea_set_decrypt_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#v_idea_set_encrypt_keyLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 69 ` ÿÿL|„.K1Ù_int_CRYPTO_set_do_dynlock_callbackLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 55 ` ÿÿL|„.K#‹_int_smime_write_ASN1LIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.Kw_lh_deleteLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.Kx_lh_doallLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Ky_lh_doall_argLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.Kz_lh_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K{_lh_insertLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.K|_lh_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K}_lh_node_statsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K ~_lh_node_stats_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_lh_node_usage_statsLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 58 ` ÿÿL|„.K&€_lh_node_usage_stats_bioLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KÑ_lh_num_itemsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K_lh_retrieveLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.K‚_lh_statsLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kƒ_lh_stats_bioLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K„_lh_strhashLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K_ms_time_cmpLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K|_ms_time_diffLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.K~_ms_time_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K€_ms_time_getLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K}_ms_time_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.K×_name_cmpLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K( _o2i_ECPublicKeyLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K·_pitem_freeLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K% _pitem_newLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K~ _pqueue_findLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kx_pqueue_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K¶_pqueue_insertLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.KB _pqueue_iteratorLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K®_pqueue_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kª_pqueue_nextLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K„ _pqueue_peekLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K?_pqueue_popLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.Kd _pqueue_printLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.Kå_s2i_ASN1_INTEGERLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 56 ` ÿÿL|„.K$Å_s2i_ASN1_OCTET_STRINGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.K…_sk_deleteLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.K†_sk_delete_ptrLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.K‡_sk_dupLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.Kˆ_sk_findLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.KØ _sk_find_exLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.K‰_sk_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 44 ` ÿÿL|„.KŠ_sk_insertLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 47 ` ÿÿL|„.KÕ _sk_is_sortedLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.K‹_sk_newLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.Kk _sk_new_nullLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.Kv_sk_numLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.KŒ_sk_popLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 46 ` ÿÿL|„.K_sk_pop_freeLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.KŽ_sk_pushLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 41 ` ÿÿL|„.Kw_sk_setLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 50 ` ÿÿL|„.K_sk_set_cmp_funcLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.K_sk_shiftLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.K‡_sk_sortLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 45 ` ÿÿL|„.K‘_sk_unshiftLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 43 ` ÿÿL|„.Ku_sk_valueLIBEAY32.dll LIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.K’_sk_zeroLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 48 ` ÿÿL|„.KÈ_string_to_hexLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 42 ` ÿÿL|„.K_uni2ascLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_v2i_ASN1_BIT_STRINGLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 51 ` ÿÿL|„.KÏ_v2i_GENERAL_NAMELIBEAY32.dll LIBEAY32.dll/ 1261339772 0 52 ` ÿÿL|„.K Ô_v2i_GENERAL_NAMESLIBEAY32.dllLIBEAY32.dll/ 1261339772 0 54 ` ÿÿL|„.K"_v2i_GENERAL_NAME_exLIBEAY32.dllxmail-1.27/win32ssl/conf/0000755000175000017500000000000011341640430014434 5ustar davidedavidexmail-1.27/win32ssl/conf/openssl.cnf0000644000175000017500000002223611341640430016614 0ustar davidedavide# # OpenSSL example configuration file. # This is mostly being used for generation of certificate requests. # # This definition stops the following lines choking if HOME isn't # defined. HOME = . RANDFILE = $ENV::HOME/.rnd # Extra OBJECT IDENTIFIER info: #oid_file = $ENV::HOME/.oid oid_section = new_oids # To use this configuration file with the "-extfile" option of the # "openssl x509" utility, name here the section containing the # X.509v3 extensions to use: # extensions = # (Alternatively, use a configuration file that has only # X.509v3 extensions in its main [= default] section.) [ new_oids ] # We can add new OIDs in here for use by 'ca' and 'req'. # Add a simple OID like this: # testoid1=1.2.3.4 # Or use config file substitution like this: # testoid2=${testoid1}.5.6 #################################################################### [ ca ] default_ca = CA_default # The default ca section #################################################################### [ CA_default ] dir = ./demoCA # Where everything is kept certs = $dir/certs # Where the issued certs are kept crl_dir = $dir/crl # Where the issued crl are kept database = $dir/index.txt # database index file. #unique_subject = no # Set to 'no' to allow creation of # several ctificates with same subject. new_certs_dir = $dir/newcerts # default place for new certs. certificate = $dir/cacert.pem # The CA certificate serial = $dir/serial # The current serial number crlnumber = $dir/crlnumber # the current crl number # must be commented out to leave a V1 CRL crl = $dir/crl.pem # The current CRL private_key = $dir/private/cakey.pem# The private key RANDFILE = $dir/private/.rand # private random number file x509_extensions = usr_cert # The extentions to add to the cert # Comment out the following two lines for the "traditional" # (and highly broken) format. name_opt = ca_default # Subject Name options cert_opt = ca_default # Certificate field options # Extension copying option: use with caution. # copy_extensions = copy # Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs # so this is commented out by default to leave a V1 CRL. # crlnumber must also be commented out to leave a V1 CRL. # crl_extensions = crl_ext default_days = 365 # how long to certify for default_crl_days= 30 # how long before next CRL default_md = sha1 # which md to use. preserve = no # keep passed DN ordering # A few difference way of specifying how similar the request should look # For type CA, the listed attributes must be the same, and the optional # and supplied fields are just that :-) policy = policy_match # For the CA policy [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional # For the 'anything' policy # At this point in time, you must list all acceptable 'object' # types. [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional #################################################################### [ req ] default_bits = 1024 default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca # The extentions to add to the self signed cert # Passwords for private keys if not present they will be prompted for # input_password = secret # output_password = secret # This sets a mask for permitted string types. There are several options. # default: PrintableString, T61String, BMPString. # pkix : PrintableString, BMPString. # utf8only: only UTF8Strings. # nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings). # MASK:XXXX a literal mask value. # WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings # so use this option with caution! string_mask = nombstr # req_extensions = v3_req # The extensions to add to a certificate request [ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = AU countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = Some-State localityName = Locality Name (eg, city) 0.organizationName = Organization Name (eg, company) 0.organizationName_default = Internet Widgits Pty Ltd # we can do this but it is not needed normally :-) #1.organizationName = Second Organization Name (eg, company) #1.organizationName_default = World Wide Web Pty Ltd organizationalUnitName = Organizational Unit Name (eg, section) #organizationalUnitName_default = commonName = Common Name (eg, YOUR name) commonName_max = 64 emailAddress = Email Address emailAddress_max = 64 # SET-ex3 = SET extension number 3 [ req_attributes ] challengePassword = A challenge password challengePassword_min = 4 challengePassword_max = 20 unstructuredName = An optional company name [ usr_cert ] # These extensions are added when 'ca' signs a request. # This goes against PKIX guidelines but some CAs do it and some software # requires this to avoid interpreting an end user certificate as a CA. basicConstraints=CA:FALSE # Here are some examples of the usage of nsCertType. If it is omitted # the certificate can be used for anything *except* object signing. # This is OK for an SSL server. # nsCertType = server # For an object signing certificate this would be used. # nsCertType = objsign # For normal client use this is typical # nsCertType = client, email # and for everything including object signing: # nsCertType = client, email, objsign # This is typical in keyUsage for a client certificate. # keyUsage = nonRepudiation, digitalSignature, keyEncipherment # This will be displayed in Netscape's comment listbox. nsComment = "OpenSSL Generated Certificate" # PKIX recommendations harmless if included in all certificates. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer # This stuff is for subjectAltName and issuerAltname. # Import the email address. # subjectAltName=email:copy # An alternative to produce certificates that aren't # deprecated according to PKIX. # subjectAltName=email:move # Copy subject details # issuerAltName=issuer:copy #nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem #nsBaseUrl #nsRevocationUrl #nsRenewalUrl #nsCaPolicyUrl #nsSslServerName [ v3_req ] # Extensions to add to a certificate request basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment [ v3_ca ] # Extensions for a typical CA # PKIX recommendation. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid:always,issuer:always # This is what PKIX recommends but some broken software chokes on critical # extensions. #basicConstraints = critical,CA:true # So we do this instead. basicConstraints = CA:true # Key usage: this is typical for a CA certificate. However since it will # prevent it being used as an test self-signed certificate it is best # left out by default. # keyUsage = cRLSign, keyCertSign # Some might want this also # nsCertType = sslCA, emailCA # Include email address in subject alt name: another PKIX recommendation # subjectAltName=email:copy # Copy issuer details # issuerAltName=issuer:copy # DER hex encoding of an extension: beware experts only! # obj=DER:02:03 # Where 'obj' is a standard or added object # You can even override a supported extension: # basicConstraints= critical, DER:30:03:01:01:FF [ crl_ext ] # CRL extensions. # Only issuerAltName and authorityKeyIdentifier make any sense in a CRL. # issuerAltName=issuer:copy authorityKeyIdentifier=keyid:always,issuer:always [ proxy_cert_ext ] # These extensions should be added when creating a proxy certificate # This goes against PKIX guidelines but some CAs do it and some software # requires this to avoid interpreting an end user certificate as a CA. basicConstraints=CA:FALSE # Here are some examples of the usage of nsCertType. If it is omitted # the certificate can be used for anything *except* object signing. # This is OK for an SSL server. # nsCertType = server # For an object signing certificate this would be used. # nsCertType = objsign # For normal client use this is typical # nsCertType = client, email # and for everything including object signing: # nsCertType = client, email, objsign # This is typical in keyUsage for a client certificate. # keyUsage = nonRepudiation, digitalSignature, keyEncipherment # This will be displayed in Netscape's comment listbox. nsComment = "OpenSSL Generated Certificate" # PKIX recommendations harmless if included in all certificates. subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer:always # This stuff is for subjectAltName and issuerAltname. # Import the email address. # subjectAltName=email:copy # An alternative to produce certificates that aren't # deprecated according to PKIX. # subjectAltName=email:move # Copy subject details # issuerAltName=issuer:copy #nsCaRevocationUrl = http://www.domain.dom/ca-crl.pem #nsBaseUrl #nsRevocationUrl #nsRenewalUrl #nsCaPolicyUrl #nsSslServerName # This really needs to be in place for it to be a proxy certificate. proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo xmail-1.27/win32ssl/certs/0000755000175000017500000000000011341640430014627 5ustar davidedavidexmail-1.27/win32ssl/certs/412bea73.00000644000175000017500000000220311341640430016035 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/0481cb65.00000644000175000017500000000407211341640430015767 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ 7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO 1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q 7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT 9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5 fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/f4996e82.00000644000175000017500000000205211341640430016007 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/c215bc69.00000644000175000017500000000220311341640430016043 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i +DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/755f7420.00000644000175000017500000000216711341640430015721 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG 29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk 3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/ccb919f9.00000644000175000017500000000306211341640430016142 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEZjCCA06gAwIBAgIQRL4Mi1AAJLQR0zYt4LNfGzANBgkqhkiG9w0BAQUFADCB lTELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHTAbBgNVBAMTFFVUTi1VU0VSRmlyc3Qt T2JqZWN0MB4XDTk5MDcwOTE4MzEyMFoXDTE5MDcwOTE4NDAzNlowgZUxCzAJBgNV BAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxHjAc BgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0cDovL3d3 dy51c2VydHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9iamVjdDCC ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6qgT+jo2F4qjEAVZURnicP HxzfOpuCaDDASmEd8S8O+r5596Uj71VRloTN2+O5bj4x2AogZ8f02b+U60cEPgLO KqJdhwQJ9jCdGIqXsqoc/EHSoTbL+z2RuufZcDX65OeQw5ujm9M89RKZd7G3CeBo 5hy485RjiGpq/gt2yb70IuRnuasaXnfBhQfdDWy/7gbHd2pBnqcP1/vulBe3/IW+ pKvEHDHd17bR5PDv3xaPslKT16HUiaEHLr/hARJCHhrh2JU022R5KP+6LhHC5ehb kkj7RwvCbNqtMoNB86XlQXD9ZZBt+vpRxPm9lisZBCzTbafc8H9vg2XiaquHhnUC AwEAAaOBrzCBrDALBgNVHQ8EBAMCAcYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E FgQU2u1kdBScFDyr3ZmpvVsoTYs8ydgwQgYDVR0fBDswOTA3oDWgM4YxaHR0cDov L2NybC51c2VydHJ1c3QuY29tL1VUTi1VU0VSRmlyc3QtT2JqZWN0LmNybDApBgNV HSUEIjAgBggrBgEFBQcDAwYIKwYBBQUHAwgGCisGAQQBgjcKAwQwDQYJKoZIhvcN AQEFBQADggEBAAgfUrE3RHjb/c652pWWmKpVZIC1WkDdIaXFwfNfLEzIR1pp6ujw NTX00CXzyKakh0q9G7FzCL3Uw8q2NbtZhncxzaeAFK4T7/yxSPlrJSUtUbYsbUXB mMiKVl0+7kNOPmsnjtA6S4ULX9Ptaqd1y9Fahy85dRNacrACgZ++8A+EVCBibGnU 4U3GDZlDAQ0Slox4nb9QorFEqmrPF3rPbw/U+CRVX/A0FklmPlBGyWNxODFiuGK5 81OtbLUrohKqGU8J2l7nk8aOFAj+8DCAGKCGhU3IfdeLA/5u1fedFqySLKAj5ZyR Uh+U3xeUc8OzwcFxBSAAeL0TUh2oPs0AH8g= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/33815e15.00000644000175000017500000000531011341640430015705 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w +2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B 26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ 9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/d2adc77d.00000644000175000017500000000313311341640430016207 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChML RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBp bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVu dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcxNjE2NDBaFw0yMDAy MDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp YWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG A1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7Ny Spj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0 iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn 5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHd BgNVHR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0 MUAwPgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5l dCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAy MDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdF fP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMS hAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/ GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKd zmVml64mXg== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/418595b9.00000644000175000017500000000344211341640430015725 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2 ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0 aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/ BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM 7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs yZyQ2uypQjyttgI= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/cf701eeb.00000644000175000017500000000250611341640430016207 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO 0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj 7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS 8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB /zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ 3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR 3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/6e8bf996.00000644000175000017500000000213711341640430016075 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs 6GAqm4VKQPNriiTsBhYscw== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/bda4cc84.00000644000175000017500000000245211341640430016207 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym 1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb 2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/3ad48a91.00000644000175000017500000000235511341640430016053 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/54edfa5d.00000644000175000017500000000231011341640430016205 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENBMSkwJwYJKoZIhvcN AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1 c3RDZW50ZXIgQ2xhc3MgMyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUF Lg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGw Dtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDW w1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQF MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3 LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIE Tb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yCGdHHsbHD 2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQSCdS7kjXvD9s0 -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/8470719d.00000644000175000017500000000232111341640430015715 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg /9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch 6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 7CAFYd4= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/3a3b02ce.00000644000175000017500000000262411341640430016116 0ustar davidedavide-----BEGIN CERTIFICATE----- MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2 w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg 4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9 4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2 ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8 vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ /L7fCg0= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/2fa87019.00000644000175000017500000000260311341640430015772 0ustar davidedavide-----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH /nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/f80cc7f6.00000644000175000017500000000407211341640430016141 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4 MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h 4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4 c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z +kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2 l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB /wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+ 8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI 6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4 7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7 QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/c19d42c7.00000644000175000017500000000211711341640430016051 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 DzFc6PLZ -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/a6776c69.00000644000175000017500000000540511341640430016010 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVT MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEzMDEGA1UECxMq SVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTMwMQYD VQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx HjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczAeFw0wMTEyMjkwMDUzNTha Fw0yNTEyMjcwMDUzNThaMIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQg cHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMu ZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBD QXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFp bmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYP aXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJ spQgvJhPUOtopKdJC7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCB hYEFcYGdtJUZqV92NC5jNzVXjrQfQj8VXOF6wV8TGDIxya2+o8eDZh65nAQTy2nB Bt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQIDAQABo4IEQzCCBD8wHQYDVR0O BBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCCAUGAFKGtMbH5 PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQGEwJFUzESMBAGA1UE CBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJ bnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0Bt YWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxMzAxBgNVBAsTKklQUyBDQSBD aGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEzMDEGA1UEAxMqSVBT IENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMG CCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYB BAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBC BglghkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg aHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlw cy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5pcHMuZXMv aXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYtaHR0cDovL3d3 dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/MDkGCWCGSAGG+EIB BwQsFipodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3JlbmV3YWxDQUMuaHRtbD8w NwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5 Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYoaHR0cDovL3d3dy5pcHMuZXMvaXBz MjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCgLoYsaHR0cDovL3d3d2JhY2suaXBzLmVz L2lwczIwMDIvaXBzMjAwMkNBQy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1W WKJBGyi3leGmGpVfp3hAK+/blkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfN HnNDJGD1HWHc3JagvPsd4+cSACczAsDAK1M92GsDgaPb1pOVIO/Tln4mkImcJpvN b2ar7QMiRDjMWb2f2/YHogF/JsRj9SVCXmK9 -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/81b9768f.00000644000175000017500000000252711341640430016014 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm +9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep +OkuE6N36B9K -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/343eb6cb.00000644000175000017500000000244611341640430016131 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5 7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/ MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW WL1WMRJOEcgh4LMRkWXbtKaIOM5V -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/57692373.00000644000175000017500000000233111341640430015640 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL 5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe 2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv /NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz 4iIprn2DQKi6bA== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/6fcc125d.00000644000175000017500000000245211341640430016130 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h 2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq 299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd 7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw ++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt 398znM/jra6O1I7mT1GvFpLgXPYHDw== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/052e396b.00000644000175000017500000000272111341640430015771 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G 87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i 2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no xqE= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/00673b5b.00000644000175000017500000000272511341640430015766 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta 3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk 6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 /qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 jVaMaA== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/f559733c.00000644000175000017500000000311611341640430016001 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEezCCA2OgAwIBAgIQNxkY5lNUfBq1uMtZWts1tzANBgkqhkiG9w0BAQUFADCB rjELMAkGA1UEBhMCREUxIDAeBgNVBAgTF0JhZGVuLVd1ZXJ0dGVtYmVyZyAoQlcp MRIwEAYDVQQHEwlTdHV0dGdhcnQxKTAnBgNVBAoTIERldXRzY2hlciBTcGFya2Fz c2VuIFZlcmxhZyBHbWJIMT4wPAYDVQQDEzVTLVRSVVNUIEF1dGhlbnRpY2F0aW9u IGFuZCBFbmNyeXB0aW9uIFJvb3QgQ0EgMjAwNTpQTjAeFw0wNTA2MjIwMDAwMDBa Fw0zMDA2MjEyMzU5NTlaMIGuMQswCQYDVQQGEwJERTEgMB4GA1UECBMXQmFkZW4t V3VlcnR0ZW1iZXJnIChCVykxEjAQBgNVBAcTCVN0dXR0Z2FydDEpMCcGA1UEChMg RGV1dHNjaGVyIFNwYXJrYXNzZW4gVmVybGFnIEdtYkgxPjA8BgNVBAMTNVMtVFJV U1QgQXV0aGVudGljYXRpb24gYW5kIEVuY3J5cHRpb24gUm9vdCBDQSAyMDA1OlBO MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2bVKwdMz6tNGs9HiTNL1 toPQb9UY6ZOvJ44TzbUlNlA0EmQpoVXhOmCTnijJ4/Ob4QSwI7+Vio5bG0F/WsPo TUzVJBY+h0jUJ67m91MduwwA7z5hca2/OnpYH5Q9XIHV1W/fuJvS9eXLg3KSwlOy ggLrra1fFi2SU3bxibYs9cEv4KdKb6AwajLrmnQDaHgTncovmwsdvs91DSaXm8f1 XgqfeN+zvOyauu9VjxuapgdjKRdZYgkqeQd3peDRF2npW932kKvimAoA0SVtnteF hy+S8dF2g08LOlk3KC8zpxdQ1iALCvQm+Z845y2kuJuJja2tyWp9iRe79n+Ag3rm 7QIDAQABo4GSMIGPMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEG MCkGA1UdEQQiMCCkHjAcMRowGAYDVQQDExFTVFJvbmxpbmUxLTIwNDgtNTAdBgNV HQ4EFgQUD8oeXHngovMpttKFswtKtWXsa1IwHwYDVR0jBBgwFoAUD8oeXHngovMp ttKFswtKtWXsa1IwDQYJKoZIhvcNAQEFBQADggEBAK8B8O0ZPCjoTVy7pWMciDMD pwCHpB8gq9Yc4wYfl35UvbfRssnV2oDsF9eK9XvCAPbpEW+EoFolMeKJ+aQAPzFo LtU96G7m1R08P7K9n3frndOMusDXtk3sU5wPBG7qNWdX4wple5A64U8+wwCSersF iXOMy6ZNwPv2AtawB6MDwidAnwzkhYItr5pCHdDHjfhA7p0GVxzZotiAFP7hYy0y h9WUUpY6RsZxlj33mA6ykaqP2vROJAA5VeitF7nTNCtKqUDMFypVZUF0Qn71wK/I k63yGFs9iQzbRzkk+OBM8h+wPQrKBU6JIRrjKpms/H+h8Q8bHz2eBIPdltkdOpQ= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/b0f3e76e.00000644000175000017500000000235511341640430016136 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp 1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE 38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/f58a60fe.00000644000175000017500000000246611341640430016144 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAw PDEbMBkGA1UEAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWdu MQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwx GzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBDQTEQMA4GA1UEChMHQ29tU2lnbjEL MAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGtWhf HZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs49oh gHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sW v+bznkqH7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ue Mv5WJDmyVIRD9YTC2LxBkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr 9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d19guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt 6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUwAwEB/zBEBgNVHR8EPTA7 MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29tU2lnblNl Y3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58 ADsAj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkq hkiG9w0BAQUFAAOCAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7p iL1DRYHjZiM/EoZNGeQFsOY3wo3aBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtC dsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtpFhpFfTMDZflScZAmlaxMDPWL kz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP51qJThRv4zdL hfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/5a3f0ff8.00000644000175000017500000000272111341640430016134 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI 2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp +2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW /zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB ZQ== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/219d9499.00000644000175000017500000000265011341640430015731 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h /t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf ReYNnyicsbkqWletNw+vHX/bvZ8= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/add67345.00000644000175000017500000000440511341640430016054 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi 3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP 0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK 8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/12d55845.00000644000175000017500000000226011341640430015711 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw 7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/89c02a45.00000644000175000017500000000165411341640430015775 0ustar davidedavide-----BEGIN CERTIFICATE----- MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/7d3cd826.00000644000175000017500000000205211341640430016053 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs 2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/97b4211c.00000644000175000017500000000135111341640430015764 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgwFgYD VQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRydXN0IFJv b3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQswCQYDVQQGEwJV UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQDExNHVEUgQ3liZXJU cnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC45k+625h8cXyv RLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8KDPufpz+iCWaEVh43KRuH6X4M ypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPwKfWVWgkWYXcKIiXUT0Wqx73llt/5 1KiOQswkwB6RJ0q1bQaAYznEol44AwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBABKz dcZfHeFhVYAA1IFLezEPI2PnPfMD+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWl IjeaY8JIILTbcuPI9tl8vrGvU9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9Apy bW1EDp3zdHSo1TRJ6V6e6bR64eVaH4QwnNOfpSXY -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/2afc57aa.00000644000175000017500000000321711341640430016204 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK 8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/5021a0a2.00000644000175000017500000000256711341640430015755 0ustar davidedavide-----BEGIN CERTIFICATE----- MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn 8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ 2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/5cf9d536.00000644000175000017500000000403611341640430016063 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK SnQ2+Q== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/9ec3a561.00000644000175000017500000000320311341640430016046 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9 hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM 1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws 6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50 aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u 7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0 xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/ed524cf5.00000644000175000017500000000331411341640430016132 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN 95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd 2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/7a481e66.00000644000175000017500000000321711341640430016000 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB 95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/788c9bfc.00000644000175000017500000000237111341640430016150 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCVVMx DTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2 aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcNMDAwODE2MjI1 MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklT QTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRp b24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC AQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZDK9vZBv42pWUJGkzEXDK41Z0ohdX ZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJXLB1LRckaeNCYOTudNargFbYiCjh+20i /SN8RnNPflRzHqgsVVh1t0zzWkWlAhr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU 58fy+pmjIlC++QU3o63tmsPm7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/g halMCXI5Etuz9c9OYmTaxhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E 1w0cslSsMoW0ZA3eQbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ ca3CBfYDdYDOqU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG MA0GCSqGSIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHb mQdpNSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoLaxhN dBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/RtLdh6yumJ ivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8ofyrEK9ca3Cn B+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/e268a4c5.00000644000175000017500000000271011341640430016051 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC +Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X 7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz 43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/f3cf1e8e.00000644000175000017500000000362311341640430016220 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq YmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0aW9uMB4XDTAy MDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UEChMJYmVUUlVTVGVk MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl ZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBALx+xDmcjOPWHIb/ymKt4H8wRXqOGrO4x/nRNv8i 805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R9U+jK7wYFuK13XneIviCfsuBH/0nLI/6 l2Qijvj/YaOcGx6Sj8CoCd8JEey3fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92B FODEPM2dMPgwqZfT7syj0B9fHBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+Ymp kbIq2eszh+6l/ePazIjmiSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7 eHgZFLL8kFKJOGJgB7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIa MA8GA1UdEwEB/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4A AAEJKIORMTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3Ig dXNlIG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJk IHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmljYXRpb24g UHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0eSBBZ3JlZW1l bnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVTVGVkIHdlYiBzaXRl LCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNfc2VydmljZXMvaW5k ZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3dy5iZXRydXN0ZWQuY29tL3By b2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwHQYDVR0OBBYEFEU9w6nR3D8kVpgc cxiIav+DR+22MB8GA1UdIwQYMBaAFEU9w6nR3D8kVpgccxiIav+DR+22MA4GA1Ud DwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCA WXf82n+0S9/DZEtqTg6t8n1ZdwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu6 7RMdmgduyzFiEuhjA6p9beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AY gkHNZTfqjjJ+vWuZXTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb 4cV97yHgjQ5dUX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9 CReJf8Py05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/ddc328ff.00000644000175000017500000000214711341640430016217 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG 7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ qdq5snUb9kLy78fyGPmJvKP/iiMucEc= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/8f7b96c4.00000644000175000017500000000216711341640430016072 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy 0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/72fa7371.00000644000175000017500000000211711341640430015772 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY oJ2daZH9 -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/5046c355.00000644000175000017500000000400111341640430015701 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH 6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ 2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/4184de39.00000644000175000017500000000553611341640430016006 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVT MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjE0MDIGA1UECxMr SVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE0MDIG A1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMTAx OFoXDTI1MTIyNzAxMTAxOFowggEeMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFy Y2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5l dCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlw cy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3Rh bXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBU aW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0B CQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA vLjuVqWajOY2ycJioGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4 Efdo/BdApWgnMjvEp+ZCccWZ73b/K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6KaFY q6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0GmqaMCAwEAAaOCBIAwggR8MB0G A1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSCAUcwggFDgBSL 0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkGA1UEBhMCRVMxEjAQ BgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJ UFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJp cHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMg Q0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTQwMgYDVQQD EytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4w HAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYB BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYD VR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlw cy5lczBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl IGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgECBBwWGmh0 dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFodHRwOi8v d3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMEUGCWCG SAGG+EIBAwQ4FjZodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25U aW1lc3RhbXBpbmcuaHRtbD8wQgYJYIZIAYb4QgEHBDUWM2h0dHA6Ly93d3cuaXBz LmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGluZy5odG1sPzBABglghkgBhvhC AQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lUaW1lc3RhbXBp bmcuaHRtbDB/BgNVHR8EeDB2MDegNaAzhjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMy MDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFj ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEF BQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI hvcNAQEFBQADgYEAZbrBzAAalZHK6Ww6vzoeFAh8+4Pua2JR0zORtWB5fgTYXXk3 6MNbsMRnLWhasl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWTs/zif/WN87GphV+I 3pGW7hdbrqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/4643210f.00000644000175000017500000000256311341640430015707 0ustar davidedavide-----BEGIN CERTIFICATE----- MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGpMQsw CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE CxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0B CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAyMjQ2MTZaFw0wODExMjcy MjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0 IENvLjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbV p9oaBBg5kkp4o4HC9Xd6ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWw BZoPFflrWXJW8vo5/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl 5WJp3OXuAFK9MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi 3sOP17ihYqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+ QVCvbK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG 9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWogWxyQ 2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6HE3K1GjN I3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV6YyDfFk/xPEL 553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8PzGn0EdzMzkbzE5q 10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30sPDst2yC7S8xmUJMqbIN uBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/bf87590f.00000644000175000017500000000361711341640430016071 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUFADBi MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENB czEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRp b24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBiMRIwEAYDVQQKEwli ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEvMC0GA1UEAxMm YmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQwCY5X0LkGLG9uJIAiv11DpvpPrILn HGhwhRujbrWqeNluB0s/6d/16uhUoWGKDi9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I 1DpAa5LxmZZk3tv/ePTulh1HiXzUvrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPk tPDgaTuID0GQ+NRxQyTBjyZLO1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnU GxlkVgoZ98zh/4avflherHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8er cmsl9fNTGwxMLvF1S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIY MIICFDAMBgNVHRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+ AAADCSiDkTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5j b20vcHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjcmVh dGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRoZSB0aGVu IGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNl LCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgYW5kIHRoZSBS ZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRo ZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuYmV0cnVzdGVkLmNvbS9w cm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMAsGA1UdDwQEAwIBBjAfBgNVHSME GDAWgBSp7BR++dlDzFMrFK3P9/BZiUHNGTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxSt z/fwWYlBzRkwDQYJKoZIhvcNAQEFBQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g 6IHHtt9DwSwddUvUQo3neqh03GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuK mET7m9cqg5c0Lcd9NUwtNLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbd LrML3kqNWz2rDcI1UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28Bb J1zTcwfBwvNMm2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3 SK41ty8ymmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/e60bf0c0.00000644000175000017500000000405211341640430016116 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo 19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e 3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 MBr1mmz0DlP5OlvRHA== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/56b8a0b6.00000644000175000017500000000277111341640430016054 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/bdacca6f.00000644000175000017500000000251211341640430016341 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa /FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/2fb1850a.00000644000175000017500000000374111341640430016045 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC 206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 +L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw RY8mkaKO/qk= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/d8274e24.00000644000175000017500000000305611341640430015777 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1 NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2 N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1 axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4 ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb QErNaLly7HF27FSOH4UMAWr6pjisH8SE -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/7a819ef2.00000644000175000017500000000377111341640430016066 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp +ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og /zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y 4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza 8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/f61bff45.00000644000175000017500000000523311341640430016136 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4 NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+ LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770 Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx 62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5 ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS 8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl 7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a 86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/ MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/ff783690.00000644000175000017500000000310611341640430016004 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn 0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM //bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t 3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/11f154d6.00000644000175000017500000000271411341640430015767 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO 8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/a2df7ad7.00000644000175000017500000000270411341640430016212 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV 6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH 1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF 62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh 4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/ed62f4e3.00000644000175000017500000000212311341640430016130 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn jBJ7xUS0rg== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/7651b327.00000644000175000017500000000150211341640430015706 0ustar davidedavide-----BEGIN CERTIFICATE----- MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/aaa45464.00000644000175000017500000000171511341640430016045 0ustar davidedavide-----BEGIN CERTIFICATE----- MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT 6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL 8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC 9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ CayJSdM= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/c9bc75ba.00000644000175000017500000000250211341640430016206 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEFBQAw gYkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2FzaGluZ3Rv bjEXMBUGA1UEChMOQUJBLkVDT00sIElOQy4xGTAXBgNVBAMTEEFCQS5FQ09NIFJv b3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWluQGRpZ3NpZ3RydXN0LmNvbTAeFw05 OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQswCQYDVQQGEwJVUzELMAkG A1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24xFzAVBgNVBAoTDkFCQS5FQ09N LCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBSb290IENBMSQwIgYJKoZIhvcNAQkB FhVhZG1pbkBkaWdzaWd0cnVzdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw ggEKAoIBAQCx0xHgeVVDBwhMywVCAOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM 0KLMsFWWU4RmBQDaREmA2FQKpSWGlO1jVv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFG PR7wuSw0X4x8TAgpnUBV6zx9g9618PeKgw6hTLQ6pbNfWiKX7BmbwQVo/ea3qZGU LOR4SCQaJRk665WcOQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtxA6k4ShZs iSrK2jMTecJVjO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU +/94Qby9cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYB Af8CAQgwDQYJKoZIhvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0k qS8Kfv2kRLD4VAe9G52dyntQJHsRW0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvTZOir vRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJhkoHWG9YA8A6eKHegTYjHInYZ w8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm/lowdiT/QHI8 eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgxfexgeqMiKL0ZJGA/ O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJTzFxiNmIf1Q= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/124bbd54.00000644000175000017500000000300111341640430016031 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW 1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/87753b0d.00000644000175000017500000000362311341640430015777 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m 1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH 6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/1155c94b.00000644000175000017500000000303611341640430015767 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0 MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5 quGnM/b9Sh/22WA= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/6adf0799.00000644000175000017500000000260311341640430016062 0ustar davidedavide-----BEGIN CERTIFICATE----- MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0 MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13 5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo 7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/ 0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7 nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ 33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/d78a75c7.00000644000175000017500000000271011341640430016061 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u 7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/facacbc6.00000644000175000017500000000330411341640430016340 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y 5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ 4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/cb796bc1.00000644000175000017500000000344211341640430016133 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwx DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0 Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBG cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS YWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoXDTM1MDMxMDE3Mzc0 OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcTBUVp bGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3Jp dHkgRGVwLjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkxITAfBgkqhkiG9w0BCQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG 9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOeyEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x 18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+o5c5s7XvIywI6Nivcy+5 yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2IhULpNYI LzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0G A1UdDgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOW zL3+MtUNjIExtpidjShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4x GjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBD ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3Rh cnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8G CWCGSAGG+EIBDQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAy BglghkgBhvhCAQQEJRYjaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5j cmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJ YIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9pbmRleC5waHA/ YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhBOlP1 ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p 00UOpO6wNnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLb cCOxgN8aIDjnfg== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/31044350.00000644000175000017500000000347611341640430015625 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJX VzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQgUm9vdCBD QXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYyMDE0MjEwNFoX DTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNVBAoTCWJlVFJVU1Rl ZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRowGAYDVQQDExFiZVRSVVNU ZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANS0c3oT CjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4SP+00PpeQY1hRIfo7clY+vyTmt9P 6j41ffgzeubx181vSUs9Ty1uDoM6GHh3o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwM jmVZxXH/YgmPqsWPzGCgc0rXOD8Vcr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX 2P8ZDoMbjNx4RWc0PfSvHI3kbWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2N R47rtMNE5qdMf1ZD6Li8tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5j rEq2I8QBoa2k5MUCAwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNV HSAEggFQMIIBTDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQa gfFSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1 bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0 ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9uIHBy YWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJlVFJVU1Rl ZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0L3Rl cm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0 L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYDVQQKEwliZVRSVVNUZWQx CzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub2M3eKjEENGvKBxirZzAfBgNV HSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxirZzAOBgNVHQ8BAf8EBAMCAf4wDQYJ KoZIhvcNAQEFBQADggEBAHlh26Nebhax6nZR+csVm8tpvuaBa58oH2U+3RGFktTo Qb9+M70j5/Egv6S0phkBxoyNNXxlpE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2 jCBHOElQBp1yZzrwmAOtlmdE/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe 1lMBzW1MaFVA4e5rxyoAAEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5 mlWXKWWuGVUlBXJH0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYc tmBjRYoQtLpGEK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/c0cafbd2.00000644000175000017500000000367411341640430016266 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIFijCCA3KgAwIBAgIQDHbanJEMTiye/hXQWJM8TDANBgkqhkiG9w0BAQUFADBf MQswCQYDVQQGEwJOTDESMBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdp Tm90YXIgUm9vdCBDQTEgMB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmww HhcNMDcwNTE2MTcxOTM2WhcNMjUwMzMxMTgxOTIxWjBfMQswCQYDVQQGEwJOTDES MBAGA1UEChMJRGlnaU5vdGFyMRowGAYDVQQDExFEaWdpTm90YXIgUm9vdCBDQTEg MB4GCSqGSIb3DQEJARYRaW5mb0BkaWdpbm90YXIubmwwggIiMA0GCSqGSIb3DQEB AQUAA4ICDwAwggIKAoICAQCssFjBAL3YIQgLK5r+blYwBZ8bd5AQQVzDDYcRd46B 8cp86Yxq7Th0Nbva3/m7wAk3tJZzgX0zGpg595NvlX89ubF1h7pRSOiLcD6VBMXY tsMW2YiwsYcdcNqGtA8Ui3rPENF0NqISe3eGSnnme98CEWilToauNFibJBN4ViIl HgGLS1Fx+4LMWZZpiFpoU8W5DQI3y0u8ZkqQfioLBQftFl9VkHXYRskbg+IIvvEj zJkd1ioPgyAVWCeCLvriIsJJsbkBgWqdbZ1Ad2h2TiEqbYRAhU52mXyC8/O3AlnU JgEbjt+tUwbRrhjd4rI6y9eIOI6sWym5GdOY+RgDz0iChmYLG2kPyes4iHomGgVM ktck1JbyrFIto0fVUvY//s6EBnCmqj6i8rZWNBhXouSBbefK8GrTx5FrAoNBfBXv a5pkXuPQPOWx63tdhvvL5ndJzaNl3Pe5nLjkC1+Tz8wwGjIczhxjlaX56uF0i57p K6kwe6AYHw4YC+VbqdPRbB4HZ4+RS6mKvNJmqpMBiLKR+jFc1abBUggJzQpjotMi puih2TkGl/VujQKQjBR7P4DNG5y6xFhyI6+2Vp/GekIzKQc/gsnmHwUNzUwoNovT yD4cxojvXu6JZOkd69qJfjKmadHdzIif0dDJZiHcBmfFlHqabWJMfczgZICynkeO owIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV HQ4EFgQUiGi/4I41xDs4a2L3KDuEgcgM100wDQYJKoZIhvcNAQEFBQADggIBADsC jcs8MOhuoK3yc7NfniUTBAXT9uOLuwt5zlPe5JbF0a9zvNXD0EBVfEB/zRtfCdXy fJ9oHbtdzno5wozWmHvFg1Wo1X1AyuAe94leY12hE8JdiraKfADzI8PthV9xdvBo Y6pFITlIYXg23PFDk9Qlx/KAZeFTAnVR/Ho67zerhChXDNjU1JlWbOOi/lmEtDHo M/hklJRRl6s5xUvt2t2AC298KQ3EjopyDedTFLJgQT2EkTFoPSdE2+Xe9PpjRchM Ppj1P0G6Tss3DbpmmPHdy59c91Q2gmssvBNhl0L4eLvMyKKfyvBovWsdst+Nbwed 2o5nx0ceyrm/KkKRt2NTZvFCo+H0Wk1Ya7XkpDOtXHAd3ODy63MUkZoDweoAZbwH /M8SESIsrqC9OuCiKthZ6SnTGDWkrBFfGbW1G/8iSlzGeuQX7yCpp/Q/rYqnmgQl nQ7KN+ZQ/YxCKQSa7LnPS3K94gg2ryMvYuXKAdNw23yCIywWMQzGNgeQerEfZ1jE O1hZibCMjFCz2IbLaKPECudpSyDOwR5WS5WpI2jYMNjD67BVUc3l/Su49bsRn1NU 9jQZjHkJNsphFyUXC4KYcwx3dMPVDceoEkzHp1RxRy4sGn3J4ys7SN4nhKdjNrN9 j6BkOSQNPXuHr2ZcdBtLc7LljPCGmbjlxd+Ewbfr -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/72f369af.00000644000175000017500000000227411341640430016064 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0 ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B 5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3 WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+ DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/a7605362.00000644000175000017500000000216711341640430015713 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt 5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s 3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu 8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ 3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/b5f329fa.00000644000175000017500000000150211341640430016127 0ustar davidedavide-----BEGIN CERTIFICATE----- MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/128b9c8d.00000644000175000017500000000256311341640430016062 0ustar davidedavide-----BEGIN CERTIFICATE----- MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGpMQsw CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE CxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0B CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDExODE4NTVaFw0wODExMjgx ODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0 IENvLjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdf WvnTLnUv2Chi0ZMv/E3Uq4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uK xBmd9LIO/BZsubEFkoPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBE zUNKcI5YhZXhTizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F 5X5yP4WdlGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMv OnNn7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG 9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+Legz ZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvVWlHG4VME lo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX8ngvYzZAOONG Dx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn86Oawde3uPclwx12q gUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsTF7ANUkz+/m9c4pFuHf2k Ytdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/ee7cd6fb.00000644000175000017500000000325011341640430016275 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq 7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p 26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi 1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu tGWaIZDgqtCYvDi1czyL+Nw= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/0dbd0096.00000644000175000017500000000260311341640430016041 0ustar davidedavide-----BEGIN CERTIFICATE----- MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1 MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U 0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn 9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/46b2fd3b.00000644000175000017500000000401111341640430016120 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+ 6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl +zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0 ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0 uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+ FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7 jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/ u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1 puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/d537fba6.00000644000175000017500000000274111341640430016135 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a 0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ 2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 aQNiuJkFBT1reBK9sG9l -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/47996b5c.00000644000175000017500000000431411341640430016006 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq YmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0aW9uMB4XDTAy MDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UEChMJYmVUUlVTVGVk MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl ZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN AQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1Q+xVkrYwfTVXDNvzDSduTPdQqJtO K2/b9a0cS12zqcH+e0TrW6MFDR/FNCswACnxeECypP869AGIF37m1CbTukzqMvtD d5eHI8XbQ6P1KqNRXuE70mVpflUVm3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdj DheT389Lrm5zdeDzqrmkwAkbhepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCe yv78IZTuEyhL11xeDGbu6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCkt VjMFu5dZfsZJT4nXLySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMB MIIBtwYDVR0gBIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYI KwYBBQUHAgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRp ZmljYXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0 aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu dCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGljaCBjYW4gYmUg Zm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0cHM6Ly93d3cuYmV0 cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMEIGCCsGAQUF BwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2Vz L2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQDAgAHMIGJBgNVHR8EgYEwfzB9oHug eaR3MHUxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJv b3QgQ0FzMTMwMQYDVQQDEypiZVRSVVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1w bGVtZW50YXRpb24xDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEw ODI0MjdagQ8yMDIyMDQxMTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaA FH1w5a44iwY/qhwaj/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQw qoSEFjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIE kDANBgkqhkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ 5V04ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220Y/oz ADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2KjiS2d2k XgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFiaDrmLzfzgYYh xKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep9w== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/76579174.00000644000175000017500000000275111341640430015652 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ O+7ETPTsJ3xCwnR8gooJybQDJbw= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/9dbefe7b.00000644000175000017500000000236511341640430016305 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11 bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5 bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1 VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+ Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/3c58f906.00000644000175000017500000000276111341640430016005 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/bf64f35b.00000644000175000017500000000315311341640430016133 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi 94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP 9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m 0vdXcDazv/wor3ElhVsT/h5/WrQ8 -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/72bf6a04.00000644000175000017500000000540511341640430016047 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm SVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNzUwWhcNMjUxMjI3 MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvN G7uGBiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4Ninn 6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2YZM50yz8 2l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz82l09BXW3mQKh ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBD QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2 b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRtbD8wOwYJYIZIAYb4QgEI BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMy5odG1s MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz MjAwMkNMQVNFQTMuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz MjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca 2on0eisxeewBwMwB9dbB/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI 3y2s6Q73nMify5NF8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYS AfWRMS1Jjbs/RU4s4OjNtckUFQzjB4ObJnXv -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/02b73561.00000644000175000017500000000277511341640430015714 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk 3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz 6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/c8763593.00000644000175000017500000000435111341640430015726 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4 Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ 54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50 7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6 xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/ Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42 gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0 jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+ XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/ RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk BYn8eNZcLCZDqQ== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/95750816.00000644000175000017500000000254311341640430015644 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUFADCB wTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTwwOgYDVQQL EzNDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1 dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv cmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1OTU5WjCBpTEXMBUGA1UEChMO VmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsx OzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5j b20vcnBhIChjKTAwMSwwKgYDVQQDEyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1 dGhvcml0eSBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVli zrQJIkRpivglWtvtDbc2fk7gu5Q+kCWHwmFHKdm9VLhjzCx9abQzNvQ3B5rB3UBU /OB4naCTuQk9I1F/RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6ov8uQjI11 S7zi6ESHzeZBCiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/ AgEAMEUGA1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0 dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0 cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIGCCsG AQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j b20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2DcIBcBlK0lRW HqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQnKeg3S/LvRJdrF1Ea w1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937ntag+RaypJXUie28/sJyU 58dzq6wf7iWbwBbtt8pb8BQ= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/8317b10c.00000644000175000017500000000456711341640430015774 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5 3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0 TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6 b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0 ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3 dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3 Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+ NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY 83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3 macqaJVmlaut74nLYKkGEsaUR+ko -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/a3896b44.00000644000175000017500000000231011341640430015770 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/23f4c490.00000644000175000017500000000267411341640430015777 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf 8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN +lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA 1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/84cba82f.00000644000175000017500000000264011341640430016133 0ustar davidedavide-----BEGIN CERTIFICATE----- MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV 9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS RGQDJereW26fyfJOrN3H -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/17b51fe6.00000644000175000017500000000242211341640430016050 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 l7+ijrRU -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/9339512a.00000644000175000017500000000446211341640430015716 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB 4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd 8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A 4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd +LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B 4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK 4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/a0bc6fbb.00000644000175000017500000000326411341640430016262 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/f950ccc2.00000644000175000017500000000536511341640430016137 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAwNTkzOFoXDTI1MTIyNzAw NTkzOFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywS zHb5BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJZHMQ KD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzcuh9morKb adB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKbadB4CKGCARqk ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRp ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMD8GCWCG SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D TEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw czIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTEuaHRtbDBzBgNVHR8EbDBq MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEu Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy Q0xBU0UxLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuK Yn4VLenZMdMu9Ccj/1urxUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpj V4F1Wo7ojPsCwJTGKbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+ hjM+5i9Ibq9UkE6tsSU= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/08aef7bb.00000644000175000017500000000325011341640430016206 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd /ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv 2G0xffX8oRAHh84vWdw+WNs= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/5a5372fc.00000644000175000017500000000354711341640430016060 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS NitjrFgBazMpUIaD8QFI -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/69105f4f.00000644000175000017500000000250611341640430015777 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe +o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/ff588423.00000644000175000017500000000242611341640430016005 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDkzCCAnugAwIBAgIQFBOWgxRVjOp7Y+X8NId3RDANBgkqhkiG9w0BAQUFADA0 MRMwEQYDVQQDEwpDb21TaWduIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQG EwJJTDAeFw0wNDAzMjQxMTMyMThaFw0yOTAzMTkxNTAyMThaMDQxEzARBgNVBAMT CkNvbVNpZ24gQ0ExEDAOBgNVBAoTB0NvbVNpZ24xCzAJBgNVBAYTAklMMIIBIjAN BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8ORUaSvTx49qROR+WCf4C9DklBKK 8Rs4OC8fMZwG1Cyn3gsqrhqg455qv588x26i+YtkbDqthVVRVKU4VbirgwTyP2Q2 98CNQ0NqZtH3FyrV7zb6MBBC11PN+fozc0yz6YQgitZBJzXkOPqUm7h65HkfM/sb 2CEJKHxNGGleZIp6GZPKfuzzcuc3B1hZKKxC+cX/zT/npfo4sdAMx9lSGlPWgcxC ejVb7Us6eva1jsz/D3zkYDaHL63woSV9/9JLEYhwVKZBqGdTUkJe5DSe5L6j7Kpi Xd3DTKaCQeQzC6zJMw9kglcq/QytNuEMrkvF7zuZ2SOzW120V+x0cAwqTwIDAQAB o4GgMIGdMAwGA1UdEwQFMAMBAf8wPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2Zl ZGlyLmNvbXNpZ24uY28uaWwvY3JsL0NvbVNpZ25DQS5jcmwwDgYDVR0PAQH/BAQD AgGGMB8GA1UdIwQYMBaAFEsBmz5WGmU2dst7l6qSBe4y5ygxMB0GA1UdDgQWBBRL AZs+VhplNnbLe5eqkgXuMucoMTANBgkqhkiG9w0BAQUFAAOCAQEA0Nmlfv4pYEWd foPPbrxHbvUanlR2QnG0PFg/LUAlQvaBnPGJEMgOqnhPOAlXsDzACPw1jvFIUY0M cXS6hMTXcpuEfDhOZAYnKuGntewImbQKDdSFc8gS4TXt8QUxHXOZDOuWyt3T5oWq 8Ir7dcHyCTxlZWTzTNity4hp8+SDtwy9F1qWF8pb/627HOkthIDYIb6FUtnUdLlp hbpN7Sgy6/lhSuTENh4Z3G+EER+V9YMoGKgzkkMn3V0TBEVPh9VGzT2ouvDzuFYk Res3x+F2T3I5GN9+dHLHcy056mDmrRGiVod7w2ia/viMcKjfZTL0pECMocJEAw6U AGegcQCCSA== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/bcdd5959.00000644000175000017500000000205211341640430016137 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG 9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/4fbd6bfa.00000644000175000017500000000304611341640430016271 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK 4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv 2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 mfnGV/TJVTl4uix5yaaIK/QI -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/8fe643df.00000644000175000017500000000540511341640430016145 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm SVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNTMyWhcNMjUxMjI3 MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8 m2mdd81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1e+J8 eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/2LUDnf47 3P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf473P7yiuYV3TCh ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBD QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2 b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRtbD8wOwYJYIZIAYb4QgEI BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMS5odG1s MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz MjAwMkNMQVNFQTEuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz MjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyA AIQVCtWYUQxkxZwCWINmyq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeF aQoO42Hu6r4okzPV7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aL H2betgPAK7N41lUH5Y85UN4HI3LmvSAUS7SG -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/399e7759.00000644000175000017500000000247211341640430015742 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt 43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg 06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/86f32474.00000644000175000017500000000536511341640430015730 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMDE0NFoXDTI1MTIyNzAx MDE0NFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZ H49NzjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY 8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBxRiVr SXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLnev42USGj mFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGjmFsMNKGCARqk ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRp ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMD8GCWCG SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D TEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw czIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTMuaHRtbDBzBgNVHR8EbDBq MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMu Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy Q0xBU0UzLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dD qsfwfewPxqmurpYPdikc4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9 D6eSb9ijBmgpjnn1/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGy r33I6unUVtkOE7LFRVA= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/e7b8d656.00000644000175000017500000000164411341640430016067 0ustar davidedavide-----BEGIN CERTIFICATE----- MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN /Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/9d6523ce.00000644000175000017500000000376111341640430016063 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0 ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1 TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/ gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2 j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6 5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS /jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D hNQ+IIX3Sj0rnP0qCglN6oH4EZw= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/ed049835.00000644000175000017500000000211711341640430015776 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP T8qAkbYp -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/4e18c148.00000644000175000017500000000244611341640430015777 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl 6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/7d453d8f.00000644000175000017500000000271411341640430016064 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te 2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC /Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/4166ec0c.00000644000175000017500000000155711341640430016053 0ustar davidedavide-----BEGIN CERTIFICATE----- MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6 MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp dHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAX BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAx MDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV3f5mCc8kPD6ugU5O isRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4mmdxY 78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9 zp9+1BlqFikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4G A1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAd BgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEA Py1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdN T1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgD mMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/256fd83b.00000644000175000017500000000231011341640430016047 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENBMSkwJwYJKoZIhvcN AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1 c3RDZW50ZXIgQ2xhc3MgMiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0y AClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDw TFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8 /vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQF MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3 LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/ jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xRT3h2oNms Gb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/AcASZ4smZHcFFk -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/2edf7016.00000644000175000017500000000150711341640430016051 0ustar davidedavide-----BEGIN CERTIFICATE----- MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05 NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR 4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5 FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx lA== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/fde84897.00000644000175000017500000000246211341640430016076 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3 DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4 QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q 130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2 JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG 9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/19899da5.00000644000175000017500000000316311341640430016010 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChML RW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGlu Y29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg RW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJl IFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDQxNzIwMDBa Fw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0GA1UE CxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVk MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp b24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO 8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaB bL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2 dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4 QgEBBAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoT C0VudHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw IEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3Vy ZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEw KwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1Ud DgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2 fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsia d0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbvH9X07t9WLebKahlzqlO+krNQAraF JnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1U yrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/3e7271e8.00000644000175000017500000000304611341640430016000 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH 4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy vUxFnmG6v4SBkgPR0ml8xQ== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/0c364b2d.00000644000175000017500000000335111341640430016041 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMC VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5u ZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlh Yi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe Fw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJVUzEU MBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9D bGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjEl MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMq RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0G CSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo 6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux 5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zm AqTmT173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSC ARkwggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5m by9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMp IDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQg Q2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNV HRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8E BAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYE FMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7 pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzz wy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/a EkP/TOYGJqibGapEPHayXOw= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/1dac3003.00000644000175000017500000000266411341640430016036 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/594f1775.00000644000175000017500000000216711341640430015731 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y 7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/f64d9715.00000644000175000017500000000175111341640430016005 0ustar davidedavide-----BEGIN CERTIFICATE----- MIICtzCCAiACAQAwDQYJKoZIhvcNAQEEBQAwgaMxCzAJBgNVBAYTAkVTMRIwEAYD VQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UEChMQSVBT IFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQD Ew5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVz MB4XDTk4MDEwMTIzMjEwN1oXDTA5MTIyOTIzMjEwN1owgaMxCzAJBgNVBAYTAkVT MRIwEAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UE ChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVzMRcw FQYDVQQDEw5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwu aXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsT1J0nznqjtwlxLyY XZhkJAk8IbPMGbWOlI6H0fg3PqHILVikgDVboXVsHUUMH2Fjal5vmwpMwci4YSM1 gf/+rHhwLWjhOgeYlQJU3c0jt4BT18g3RXIGJBK6E2Ehim51KODFDzT9NthFf+G4 Nu+z4cYgjui0OLzhPvYR3oydAQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACzzw3lY JN7GO9HgQmm47mSzPWIBubOE3yN93ZjPEKn+ANgilgUTB1RXxafey9m4iEL2mdsU dx+2/iU94aI+A6mB0i1sR/WWRowiq8jMDQ6XXotBtDvECgZAHd1G9AHduoIuPD14 cJ58GNCr+Lh3B0Zx8coLY1xq+XKU1QFPoNtC -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/1dcd6f4c.00000644000175000017500000000363411341640430016214 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl pYYsfPQS -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/c527e4ab.00000644000175000017500000000271411341640430016130 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ +mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c 2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/74c26bd0.00000644000175000017500000000166411341640430016052 0ustar davidedavide-----BEGIN CERTIFICATE----- MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc 58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv 8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/7999be0d.00000644000175000017500000000230011341640430016057 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU 1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV 5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/58a44af1.00000644000175000017500000000265411341640430016054 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG 9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R 0982gaEbeC9xs/FZTEYYKKuF0mBWWg== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/0e82f83a.00000644000175000017500000000217311341640430016053 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53 dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7 G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P 9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/75680d2e.00000644000175000017500000000275511341640430016005 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe 3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/c33a80d4.00000644000175000017500000000220311341640430016036 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG 9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/f73e89fd.00000644000175000017500000000147211341640430016153 0ustar davidedavide-----BEGIN CERTIFICATE----- MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0 MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII 0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3 YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc 1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/3c860d51.00000644000175000017500000000377511341640430016001 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c 6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn 8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a 77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/eb375c3e.00000644000175000017500000000227411341640430016135 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI +MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+ mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2 mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/9772ca32.00000644000175000017500000000236511341640430015777 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl 4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/709afd2b.00000644000175000017500000000221411341640430016125 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa /RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei gQ== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/a15b3b6b.00000644000175000017500000000220311341640430016112 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/ k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3 MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5 WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/111e6273.00000644000175000017500000000251211341640430015701 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG 3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO 291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/cdaebb72.00000644000175000017500000000251211341640430016261 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA 7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k /rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy 7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/11a09b38.00000644000175000017500000000344611341640430015767 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr 2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s 2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/ BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9 BKNDLdr8C2LqL19iUw== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/4d654d1d.00000644000175000017500000000155311341640430016053 0ustar davidedavide-----BEGIN CERTIFICATE----- MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/e775ed2d.00000644000175000017500000000361711341640430016145 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB /wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG 9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/e7461595.00000644000175000017500000000275511341640430015732 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIEMjCCA5ugAwIBAgIBQjANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTA0MDczMTAwMDAwMVoXDTA0 MDkwMjAwMDAwMVowPDE6MDgGA1UEAxMxTUQ1IENvbGxpc2lvbnMgSW5jLiAoaHR0 cDovL3d3dy5waHJlZWRvbS5vcmcvbWQ1KTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw gYkCgYEAuqZZySwo1iqw+O2fRqSkN+4OGWhZ0bMDmVHWFppeN2sV4A5L9YRk+KPb QW811ZsVH9vEOFJwgZdej6C193458DKsHq1E0rP6SMPOkZvs9Jx84Vr1yDdrmoPe 58oglzFCcxWRaPSIr/koKMXpD3OwF0sTTJl10ETmfghsGvJPG0ECAwEAAaOCAiQw ggIgMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSnBGAf q3JDCMV/CJBVVhzWzuY46zAfBgNVHSMEGDAWgBS+qKB0clBrRLfJI9j7qP+zV2to bDCCAb4GCWCGSAGG+EIBDQSCAa8WggGrMwAAACdeOeCJYQ9Oo8VFCza7AdFTqsMI j2/4Tz6Hh0QR3GDg35JV+bhzG1STxZ/QRsRgtjVizbmvHKhpGslbPJY3wO1n77v+ wIucUC8pvYMino4I+qwTcKJYf2JiihH3ifbftmdZcxb7YxaKtJE4zi71tr5MpJRJ 5GURCkIVycEw4mnVRX2lJru5YexiZPA54ee8aNhQUZ4dYNPRo6cK+AMgoXABF5E2 TwJwMYaD3fcP2AcdEbMTBKXc8K5QsSgOY2kqDIJvj0cz32yiBpLxT0W+2TA2oyuM 1neuNWN/Tkyak0g22Z8CAwEAAaOBvTCBujAOBgNVHQ8BAf8EBAMCBPAwHQYDVR0O BBYEFM2mg/qlYDf3ljcXKd5BePGHiVXnMDsGA1UdHwQ0MDIwMKAuoCyGKmh0dHA6 Ly9jcmwuZ2VvdHJ1c3QuY29tL2NybHMvZ2xvYmFsY2ExLmNybDAfBgNVHSMEGDAW gBS+qKB0clBrRLfJI9j7qP+zV2tobDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYB BQUHAwIwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQQFAAOBgQCnIQKN0Q6igHcl /UNgFY/s75BH1IRCFSYRHM3CPBApqbbfq1d1kdrlK7OQRRwwY1Y/itlQ+u1YbMBl rGZX3hzGdjv1AA6ORc5/TJDsK8bNs7SPYtD+t8UmckTt9phbrsvRlfXaCL5oRrF1 yOwdjx56lPGqU3iiRa5U6tGedMh2Zw== -----END CERTIFICATE----- xmail-1.27/win32ssl/certs/635ccfd5.00000644000175000017500000000355711341640430016144 0ustar davidedavide-----BEGIN CERTIFICATE----- MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC 2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 Fp1hBWeAyNDYpQcCNJgEjTME1A== -----END CERTIFICATE----- xmail-1.27/win32ssl/dll/0000755000175000017500000000000011341640430014262 5ustar davidedavidexmail-1.27/win32ssl/dll/libeay32.dll0000755000175000017500000370200011341640430016376 0ustar davidedavideMZÿÿ¸@º´ Í!¸LÍ!This program cannot be run in DOS mode. $úŽ›¨¾ïõû¾ïõû¾ïõû cû¿ïõû·—fû¼ïõû·—qû¼ïõû™)Žûµïõû¾ïôû&ïõû·—vû¶íõû·—`û¦ïõû·—gû¿ïõû ½aû¿ïõû·—dû¿ïõûRich¾ïõûPEL|„.Kà!   x·S  àÔ¹P— @h Œ Ø0¡ p.text˜   `.rdataß à @@.dataÌèì @À.rsrcØ Ô@@.reloc$¦0¨Ü@BhØçh" 豃Äjÿ´ ÌÌÌÌÌ̸èÖ< ‹D$SU‹l$VWUPhô" hØçÇD$ ÿì! ˜Øç¡Xè¹¾Ü" ‹ûó¥f¥ƒÄ¤…ÀuVPÿ° …ÀuF‹ È" ‹Ì" ¡Ð" ‰ ‹ Ô" ‰S‹Ø" ‰C‰K ÇXèÿÿÿÿ‰S‹D$‹L$_^‰©][YãXè¡XèƒÎÿ;ÆtÞ‹\è…Ò…¢h¸" Pÿ¸ …ÀuL¡¤" ‹ ¨" ‹¬" ‰¡°" ‰Kf‹ ´" ‰Sж" ‰C ‹D$f‰K‹L$_‰5XèˆS^‰©][YÃÿÐ…Àu9‹”" ¡˜" ‹ œ" ‰‹ " ‰C‹D$‰K‹L$_‰5Xè‰S ^‰©][Yã\èë¡\è;(‹¨…Àu‹D$‹T$_^‰ª][YËT$‹D$_^‰¨][YÃÌÌÌÌÌÌÌÌÌjhèTþÿÿƒÄÿ%ÌÌÌÌÌÌÌÌÌÌÌjhè4þÿÿƒÄÿ%ÌÌÌÌÌÌÌÌÌÌÌjhèþÿÿƒÄÿ% ÌÌÌÌÌÌÌÌÌÌÌjhèôýÿÿƒÄÿ%ÌÌÌÌÌÌÌÌÌÌÌjhèÔýÿÿƒÄÿ%ÌÌÌÌÌÌÌÌÌÌÌjhè´ýÿÿƒÄÿ%ÌÌÌÌÌÌÌÌÌÌÌjhè”ýÿÿƒÄÿ%ÌÌÌÌÌÌÌÌÌÌÌjhètýÿÿƒÄÿ% ÌÌÌÌÌÌÌÌÌÌÌj hèTýÿÿƒÄÿ%$ÌÌÌÌÌÌÌÌÌÌÌj hè4ýÿÿƒÄÿ%(ÌÌÌÌÌÌÌÌÌÌÌj hèýÿÿƒÄÿ%,ÌÌÌÌÌÌÌÌÌÌÌj hèôüÿÿƒÄÿ%0ÌÌÌÌÌÌÌÌÌÌÌj hèÔüÿÿƒÄÿ%4ÌÌÌÌÌÌÌÌÌÌÌjhè´üÿÿƒÄÿ%8ÌÌÌÌÌÌÌÌÌÌÌjhè”üÿÿƒÄÿ%<ÌÌÌÌÌÌÌÌÌÌÌjhètüÿÿƒÄÿ%@ÌÌÌÌÌÌÌÌÌÌÌjhèTüÿÿƒÄÿ%DÌÌÌÌÌÌÌÌÌÌÌjhè4üÿÿƒÄÿ%HÌÌÌÌÌÌÌÌÌÌÌjhèüÿÿƒÄÿ%LÌÌÌÌÌÌÌÌÌÌÌjhèôûÿÿƒÄÿ%PÌÌÌÌÌÌÌÌÌÌÌjhèÔûÿÿƒÄÿ%TÌÌÌÌÌÌÌÌÌÌÌjhè´ûÿÿƒÄÿ%XÌÌÌÌÌÌÌÌÌÌÌjhè”ûÿÿƒÄÿ%\ÌÌÌÌÌÌÌÌÌÌÌjhètûÿÿƒÄÿ%`ÌÌÌÌÌÌÌÌÌÌÌjhèTûÿÿƒÄÿ%dÌÌÌÌÌÌÌÌÌÌ̸'ÃÌÌÌÌÌÌÌÌÌÌ¡dèÃÌÌÌÌÌÌÌÌÌÌ¡pèÃÌÌÌÌÌÌÌÌÌÌ‹D$£dèÃÌÌÌÌÌÌ‹D$£pèÃÌÌÌÌÌÌ¡tèÃÌÌÌÌÌÌÌÌÌÌ‹D$£tèÃÌÌÌÌÌÌ¡tè…Àuÿ%¬ ÿàÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$£`èÃÌÌÌÌÌÌ‹L$…É}¡`è…Àt‰L$ÿà¡dè…Àt‰L$ÿàÃÌÌÌÌÌÌÌÌÌ¡pè…Àtÿà¡`èS‹\$U‹l$W‹|$…ÿ|¡dè…Àt SUWj ÿЃÄ‹D$V‹0t$‰0¡`è…ÿ|¡dè…Àt SUWj ÿЃÄ‹Æ^_][ÃÌÌÌÌÌÌÌÌÌ̸xèÃÌÌÌÌÌÌÌÌÌ̃=|èuDh# Ç|èÿÀ ƒÄ…ÀtjjPÿü ƒÄ £xèÃèC £xèÃÌÌ‹D$ƒètƒèu PèlõƒÄ¸ èŒÿÿÿ‹L$¸MZf9uå‹A<Á8PEuØ;H4¸tÓ£€è ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌU‹ì¸è6 ¡Àç3ʼnEüSVWÿø! ÿü! ‹Ø…Û„‹EøPjjjSÿ" …Àuvÿ¨ ƒøzuk‹Eø=wapƒæþF‰uøèõ5 ‹üMøQVWjSÿ" …Àt;‹Eø@ƒàþ‰EøÑè3Òh # Wf‰GÿÄ ƒÄ÷ØÀ÷Øeì_^[‹Mü3Íè”5 ‹å]ÃÈÿeì_^[‹Mü3Íè}5 ‹å]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸è65 ¡Àç3ĉ„$jôÿd …ÀtCPÿ  …Àt8‹Œ$ „$PQÿÐ ƒÀ@PÿÌ ƒÄ ‹Œ$3Ìè 5 ÄË„$ ”$RPL$ hÿQÿÈ ƒÄÆ„$ÿ¤ =€sXè|þÿÿ…ÀtOVhH# jÿ j‹ðD$PjjjjjjT$(V‰T$(ÿ Vÿ ^‹Œ$3Ìè{4 ÄÃjh8# L$ Qjÿô! ‹Œ$3ÌèR4 ÄËD$ ‹L$‹T$PQRhP# èÇþÿÿƒÄÿ%Ô ÌÌÌÌÌÌÌÌÌÌÌÌÌ̃=èV‹t$¾F¾‰D$ÛD$‰L$ÛD$ÞÉ݈èu*èn¼£è…ÀuhÖh”% jAjejèÀàƒÄ3À^ÃVè#J‹ðƒÄ…öuhÛëÓ‹èWVRè幋øƒÄ…ÿuVèF ƒÄ‹Ç_^ÃÇ'‹Ç_^ÃÌÌÌÌÌ̃=˜èuhíh”% jdjgjèRàƒÄ3ÀÃhðh”% jj è™ûÿÿƒÄƒ=”èu<踻£”è…Àu.hôh”% jj èlûÿÿhõh”% jAjgjè÷߃Ä$3ÀÃWhøh”% jj è=ûÿÿhúh”% jèÜ‹øƒÄ…ÿuhýh”% jAjgjè®ßƒÄ3À_Ãhh”% Çÿ˜èƒÄ‰G…Àu"WèA hh”% jAjgjèl߃Ä3À_ÃVh h”% jj è±úÿÿ¡”èjPèÄ»ƒÄ‹ðWƒþÿu‹ ”èQè}¸‹ðƒÄNë‹”èVR蘹ƒÄ hh”% jj èbúÿÿƒÄƒþÿu$‹Ghh”% Pÿ èW蠃ċÆ^÷Ø_ÃF‹Æ^÷Ø_ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌW‹|$…ÿtƒÈÿ+Ç‹øƒ= è„˜h+h”% jj èðùÿÿ¡”èƒÄ…Àt{PèθƒÄ;ø}n‹ ”èVWQèɸ‹ðƒÄ…ötÿƒ>‹”èjWRèʸƒÄ ë3öhEh”% jj èùÿÿƒÄ…öt‹FhIh”% Pÿ èVèσÄ^_Ãh/h”% jj èVùÿÿƒÄ_ÃÌVW‹|$ 3ö…ÿtƒÈÿ+Ç‹øhTh”% jj è*ùÿÿ¡”èƒÄ…Àt%P踃Ä;ø}‹ ”èWQ踋ðƒÄ…ötÿh[h”% jj èæøÿÿƒÄ…öt‹F_^Ã_3À^ÃÌÌÌÌ¡˜èÃÌÌÌÌÌÌÌÌÌÌ¡œèÃÌÌÌÌÌÌÌÌÌÌ¡ èÃÌÌÌÌÌÌÌÌÌÌ‹D$£˜èÃÌÌÌÌÌ̃=œètMVW‹|$Wè+ÿÿÿ‹ðƒÄ…öuh¨% hh”% è¾ûÿÿƒÄ ‹D$‹L$‹T$ PQVRÿœèWèþÿÿƒÄ_^ÃÌÌÌÌÌÌÌÌ̃=¤èu!hðè øÿÿ‹D$ƒÄǤ補èËL$‰ œèÃÌÌÌÌÌÌÌÌÌÌÌ‹D$£ èÃÌÌÌÌÌÌ‹D$…À}¸À% Ãø'}‹…ø$ ÃVpÙ¡èP覶ƒÄ;ð~¸¸% ^Ë èVQè›¶ƒÄ^ÃÌÌÌÌÌÌ‹D$PÿxƒÄÃÌ‹D$‹L$PQÿ€ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$PÿŒƒÄÃ̃=ptX‹L$…ÉtP‹T$…ÒtH‹D$ …Àt@£ˆ£”‰ xÇ|ð‰€Ç„‰ ŒÇ ¸Ã3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌ3Ò9pu3ÀËL$V;ÊtE‹t$ ;òt=‹D$;Ât5‰5„£ˆ£”‰x‰ |‰€‰Œ‰ ¸^Ã3À^Ã̃=pt+‹L$…Ét#‹D$…Àt£”‰ ŒÇ ¸Ã3ÀÃÌÌÌÌÌÌÌÌ̃=pt+‹L$…Ét#‹D$…Àt£ˆÇŒ‰ ¸Ã3ÀÃÌÌÌÌÌÌÌÌ̃=tu3ÀËD$‹L$‹T$ £¨è‹D$‰ ¬è‹L$£´è‰°è‰ ¸è¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‹T$ £¼è‰ Àè‰ÄèÃÌÌ‹D$…Àt3É=|ð•ÁI# x‰‹D$…Àt3Ò=„•ÂJ#€‰‹D$ …Àt‹ ˆ‰ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$…Ét¡|‹Ðêð÷ÚÒ#Љ‹L$…Ét¡„‹Ðê÷ÚÒ#Љ‹D$ …Àt‹ ˆ‰ÃÌÌÌÌÌ‹D$…Àt3É= •ÁI# Œ‰‹D$…Àt‹”‰ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$…Ét¡‹Ðê ÷ÚÒ#Љ‹D$…Àt‹ ”‰ÃÌÌ‹D$…Àt‹ ¨è‰‹D$…Àt‹¬è‰‹D$ …Àt‹ °è‰‹D$…Àt‹´è‰‹D$…Àt‹ ¸è‰ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$3É;Ù3À[á¨èUV‹t$W‹|$‰ p;ÁtQVWSQ‰ tÿЃÄVWSÿ‹è¡¨èƒÄ …Àt jVWSUÿЃÄ…ítû~ ÈèˆE_^‹Å][ÃÌÌÌÌÌÌÌÌÌÌ¡°èV‹t$…ÀtjVÿЃÄVÿ”¡°èƒÄ^…Àt jjÿЃÄÃÌÌÌÌÌÌÌÌÌÌÌÌS‹\$3É;Ù3À[á¨èUV‹t$W‹|$‰ p;ÁtQVWSQ‰ tÿЃÄVWSÿ|‹è¡¨èƒÄ …Àt jVWSUÿЃÄ…ítû~ ÈèˆE_^‹Å][ÃÌÌÌÌÌÌÌÌÌÌU‹l$…íu‹D$‹L$‹T$ PQRècÿÿÿƒÄ ]ÃS‹\$…Û[3À]á¬èV‹t$W‹|$…Àt jVWSjUÿЃÄVWSUÿ„‹ ¬èƒÄ‰D$…ÉtjVWSPUÿÑ‹D$,ƒÄ_^[]ÃW‹|$…ÿu‹D$‹L$‹T$PQRèãþÿÿƒÄ _ÃV‹t$…ö^3À_á¬èS‹\$ U‹l$ …Àt jSUVjWÿЃÄSUVÿ|‹ðƒÄ …öt!‹D$PWVèä) ‹L$$QWèGWÿˆƒÄ¡¬è…Àt‹T$jSURVWÿЃÄ][‹Æ^_ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ¡°èV‹t$…ÀtjVÿЃÄVÿˆ¡°èƒÄ^…Àt jjÿЃÄÃÌÌÌÌÌÌÌÌÌÌÌÌV‹t$…öt-¡°è…ÀtjVÿЃÄVÿˆ¡°èƒÄ…Àt jjÿЃÄ‹D$ hšhÈ% PèÆýÿÿƒÄ ^ÃÌ¡´è…ÀtÿàÃÌÌÌÌ¡¸è…Àtÿà3ÀÃÌÌ¡¼è…Àtÿà¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¡Àè…Àtÿà¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¡Äè…Àtÿà¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$S¶ÈèV‹t$ ‹Æ‹Ê…ÒtW›ˆ@‹øIƒç\;…Éuï_¶ÃRPVÿè ƒÄ …Àt D?^¢Èè[Ã^ˆÈè[ÃÌÌÌÌÌÌV‹t$ÿN‹F…À‹F…Àt PèäÿÿÿƒÄVèkþÿÿƒÄ^ÃÌÌÌÌÌÌV‹5Ìèh¡hØ% jj èæïÿÿ‹D$ƒÄƒø‡áÿ$…¨&ÇÌèÇàèéÁ3À£Ìè£àèé°öÌè„£ƒ=àèt èZïÿÿ9äètMh½hØ% jj èoïÿÿhÃhØ% jj è\ïÿÿhÄhØ% jj èIïÿÿƒ%ÌèýƒÄ0è ïÿÿ£äèÿàèë8öÌèt/ƒ=àèt&ƒ-àèuƒ ÌèhÔhØ% jj èøîÿÿƒÄhÝhØ% jj èâîÿÿƒÄ‹Æ^ÃIÊ%±%S&Û%ÌÌÌÌÌÌÌÌ3ÀöÌètOVhçhØ% jjè¡îÿÿƒÄöÌèuè`îÿÿ9äèu3öë¾hìhØ% jjèlîÿÿƒÄ‹Æ^ÃÌÌÌÌÌ‹D$£ÜèÃÌÌÌÌÌÌ¡ÜèÃÌÌÌÌÌÌÌÌÌÌ‹D$‹‹T$3À; •ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‹ÁÁèiÀû‹ÑiÉ»EVÁê4Õ+òÆÁ^ÃÌÌÌ̸èf% 3À9ØètfVè¦íÿÿ‹ Øè‰D$D$PQèA´‹ðƒÄ…ötAW‹~…ÿt‹ØèÿGWR賃ăÈÿFƒ~ÇF…ÿtGVèÝûÿÿƒÄ‹Æ_^ƒÄÃÌÌè«þÿÿ…À„ŠSh¡hØ% jj èOíÿÿ»ƒÄ„Ìètiƒ=àèt èíÿÿ9äètMh½hØ% jj èíÿÿhÃhØ% jj èíÿÿhÄhØ% jj èðìÿÿƒ%ÌèýƒÄ0è±ìÿÿ£äèàèVhÝhØ% jj èÂìÿÿhVhØ% jèaùÿÿ‹ðƒÄ…ötkƒ=Øèu&h@'h`'è°±ƒÄ£Øè…Àu VèÞúÿÿƒÄë<èDìÿÿ‹L$‹T$ ‰‹D$‰F¡ØèVP‰N‰V ‰^ÇFè7²ƒÄ…Àt‰Fh¡hØ% jj è*ìÿÿƒÄ^„Ìèt.ƒ=àèt%)àèuƒ ÌèhÔhØ% jj èóëÿÿƒÄhÝhØ% jj èÝëÿÿƒÄ[3ÀÃÌÌÌÌÌÌV3öèýÿÿ…À„Sh¡hØ% jj è¬ëÿÿ»ƒÄ„Ìèth95àèt è_ëÿÿ9äètMh½hØ% jj ètëÿÿhÃhØ% jj èaëÿÿhÄhØ% jj èNëÿÿƒ%ÌèýƒÄ0èëÿÿ£äèàèhÝhØ% jj è!ëÿÿè,ýÿÿh¡‹ðhØ% ÷Þöjj ÷ÞèëÿÿƒÄ „Ìèt.ƒ=àèt%)àèuƒ ÌèhÔhØ% jj èËêÿÿƒÄhÝhØ% jj èµêÿÿƒÄ[‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌV3öèØûÿÿ…À„Sh¡hØ% jj è|êÿÿ»ƒÄ„Ìèth95àèt è/êÿÿ9äètMh½hØ% jj èDêÿÿhÃhØ% jj è1êÿÿhÄhØ% jj èêÿÿƒ%ÌèýƒÄ0èßéÿÿ£äèàèhÝhØ% jj èñéÿÿƒÄèùûÿÿ…ÀtëIóèéûÿÿ…Àuõh¡hØ% jj èÂéÿÿƒÄ„Ìèt.ƒ=àèt%)àèuƒ ÌèhÔhØ% jj èŒéÿÿƒÄhÝhØ% jj èvéÿÿƒÄ[‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èÖ ‹D$,Sƒà»+Ã…IUW‹|$(3í;ý„7èlúÿÿ…À„*h¡hØ% jj èéÿÿƒÄ„Ìèth9-àèt èÉèÿÿ9äètMh½hØ% jj èÞèÿÿhÃhØ% jj èËèÿÿhÄhØ% jj è¸èÿÿƒ%ÌèýƒÄ0èyèÿÿ£äèàèVhÝhØ% jj èŠèÿÿh±hØ% j(è)õÿÿ‹ðƒÄ;õu!WèÊöÿÿh¡hØ% jj èWèÿÿƒÄé 9-Ôèu/hð h`'èX­ƒÄ£Ôè;ÅuWè†öÿÿVè€öÿÿƒÄé¼öÜè‹D$4‹L$8‹T$0‰>‰F‰N ‰Vt èÃçÿÿ‰Fë‰n¡Ðè;èèu‰F‰FãÐè„ÜètUÿð ƒÄ‰F‰Vë‰n‰nè|çÿÿ‰D$¡Øè‰n ;ÅtL$QP讃Ä;Åt‰F X‹ÔèVRèg­ƒÄ;Åt9h t‹H ÿIPè¿õÿÿƒÄh¡hØ% jj èIçÿÿƒÄ„Ìèt-9-àèt%)àèuƒ ÌèhÔhØ% jj èçÿÿƒÄhÝhØ% jj èþæÿÿƒÄ^_][ƒÄÃÌÌ̸(èf ƒ|$0…bV‹t$0…ö„Tè øÿÿ…À„Gƒ=Ôè„:Sh¡hØ% jj è æÿÿ»ƒÄ„Ìètiƒ=àèt èRæÿÿ9äètMh½hØ% jj ègæÿÿhÃhØ% jj èTæÿÿhÄhØ% jj èAæÿÿƒ%ÌèýƒÄ0èæÿÿ£äèàèhÝhØ% jj èæÿÿ‹ ÔèD$PQ‰t$ 謋ðƒÄ…öt‹F …Àt Pè¹õÿÿƒÄVè@ôÿÿƒÄh¡hØ% jj èÊåÿÿƒÄ„Ìèt.ƒ=àèt%)àèuƒ ÌèhÔhØ% jj è”åÿÿƒÄhÝhØ% jj è~åÿÿƒÄ[^ƒÄ(ÃÌÌÌÌ̸(èæ ‹D$@S»+Ã…yW‹|$8…ÿ„kV‹t$8…öu$‹D$H‹L$D‹T$@hPQRWèÄûÿÿƒÄ^_[ƒÄ(ÃèUöÿÿ…À„0h¡hØ% jj èúäÿÿƒÄ„Ìètiƒ=àèt è±äÿÿ9äètMh½hØ% jj èÆäÿÿhÃhØ% jj è³äÿÿhÄhØ% jj è äÿÿƒ%ÌèýƒÄ0èaäÿÿ£äèàèhÝhØ% jj èsäÿÿ‹ ÔèD$PQ‰t$$èÞªƒÄ…Àt‹T$@P‰8‰P¡ÔèPè2ªƒÄh¡hØ% jj è,äÿÿƒÄ„Ìèt.ƒ=àèt%)àèuƒ ÌèhÔhØ% jj èöãÿÿƒÄhÝhØ% jj èàãÿÿƒÄ^_[ƒÄ(ÃÌÌÌÌÌ̸ èF ¡Àç3ĉ„$SVW‹ù‹‹Ú‰\$t$;„çöÜètCOQÿì ‹‹HR‹PQRh\& ‹ÆhPè¿v‹ÆƒÄP¤$Š@„Éuù+Ât‹O ‹W‹GQRPŒ$ hD& +ÎQVè‚v‹ÆƒÄPŠ@„Éuù+ÂðöÜèt1‹WR„$h4& +ÆPVèMv‹ÆƒÄPëIŠ@„Éuù+Âð‹‹WQR„$h& +ÆPVèv‹L$(QRè 4ÿC‹GC‹w ƒÄ3Û…ö„닉L$ UCST$j>Rè– ‹F‹N‹PQR¸hð% +ÃPL8Qè¼uD$<ƒÄ$P‹ÿŠ@„Éuù‹~ ‹Ï+ÂiŠA„Òuùº}+Ð+Í;ÑT}¹}+ÈQWRè* ƒÄ ¸}ë'¹+ÈQWRè/D$$ƒÄ PëIŠ@„Éuù+¹hì% +ÈQT Rè0u‹L$ ‹D$$PRè3‹vƒÄ…öt ‹D$9„ÿÿÿ]‹Œ$_^[3ÌèR Ä ËT$‹L$éÃýÿÿÌÌ̸ è W3ÿ9=Ôèu 9=Øè„ÍSh¡hØ% jj è[áÿÿ»ƒÄ„Ìèth9=àèt èáÿÿ9äètMh½hØ% jj è#áÿÿhÃhØ% jj èáÿÿhÄhØ% jj èýàÿÿƒ%ÌèýƒÄ0è¾àÿÿ£äèàèVhÝhØ% jj èÏàÿÿ¡Ôè‹t$,ƒÄ‰t$ ‰|$‰|$;Çt.L$ Qhà3PèC£‹D$ƒÄ ;Çt‹T$PRhp& Vè·së}hØhØ% jj èràÿÿ¡Ôè‹5ÌèƒÄ‰=Ìè;ÇtP袃ĉ=Ôè¡Øè;Çt!PèL¥ƒÄ…Àu¡ØèPèÚ¡ƒÄ‰=ØèhîhØ% jj ‰5ÌèèàÿÿƒÄh¡hØ% jj èòßÿÿƒÄ^„Ìèt-9=àèt%)àèuƒ ÌèhÔhØ% jj è¼ßÿÿƒÄhÝhØ% jj è¦ßÿÿƒÄ[_ƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌ̃=Ôè„4SVh¡hØ% jj ènßÿÿ»ƒÄ„Ìètiƒ=àèt è ßÿÿ9äètMh½hØ% jj è5ßÿÿhÃhØ% jj è"ßÿÿhÄhØ% jj èßÿÿƒ%ÌèýƒÄ0èÐÞÿÿ£äèàèhÝhØ% jj èâÞÿÿèÝBPè5h¡hØ% jj ‹ðèÂÞÿÿƒÄ$„Ìèt.ƒ=àèt%)àèuƒ ÌèhÔhØ% jj èŒÞÿÿƒÄhÝhØ% jj èvÞÿÿƒÄ…öt‹D$ PjjjVè`1VèÊüÿÿVèD-ƒÄ^[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‹PQ‹H R‹P‹@Q‹L$R‹PÿÒƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̃=Ôèt?hhØ% jj èôÝÿÿ‹ ÔèD$Ph@7Qè~ hhØ% jj èËÝÿÿƒÄ,ÃÌÌÌÌÌÌÌh0'h 'h.h0h ,è¢çÿÿhà*h°)h(èÞçÿÿƒÄ ÃÌÌÌÌÌÌÌÌÌÌVW‹|$ ‹ÇPëIŠ@„Éuù‹L$+‹T$QR@Pèêÿÿ‹ðƒÄ ‹Ï+÷ŠˆA„Òuö_^ËD$…Àu¸8) Ãøuh) h ) j$héègpƒÄ¸éÃøu"hð& hà& h$h(éè@pƒÄ¸(éÃøuhÔ& hÄ& jhðèèpƒÄ¸ðèÃø¸ & t¸& ÃÌÌ̸πÃÌÌÌÌÌÌÌÌÌÌ¡Lë…ÀuDhËhT) jj è„ÜÿÿƒÄƒ=Lëu ÇLë˜hÎhT) jj è[Üÿÿ¡LëƒÄÃÌÌVhÝhT) jj 3öè:ÜÿÿƒÄ95Lëu‹D$£Lë¾hãhT) jj èÜÿÿƒÄ‹Æ^ÃÌÌÌÌÌÌÌVh hT) jj ¾èçÛÿÿƒÄƒ=Pëuhð hÀ è젃ģPë…Àu3öhhT) jj è«ÛÿÿƒÄ‹Æ^ÃÌÌÌÌV‹t$‹FhPèíœVèçéÿÿƒÄ ^ÃÌ̸ èö ƒ=Pëu èhÿÿÿ…ÀuƒÄ ÃWh,hT) jj ‰\$èHÛÿÿ‹ PëD$PQè'¢‹øƒÄ…ÿuIVh0hT) j èÌçÿÿ‹ðƒÄ …öt-‰‰~è9›‰FV…Àu è\éÿÿƒÄë‹PëRèÛ ƒÄ‹þ^hAhT) jj èÒÚÿÿƒÄ…ÿuhChT) jAjijèV¿ƒÄ‹Ç_ƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌSVhOhT) jƒËÿè:çÿÿ‹ðƒÄ …öuhRhT) jAjhjè ¿ƒÄ^ Ã[ËD$ ‹L$‹T$hZhT) ‰‹D$ ‰N‹L$$jj ‰V‰F‰N è/Úÿÿ‹WR虃Ä;G#‹GjP蘃ąÀtC‹OQèó˜ƒÄ;G~Ý‹_‹GVSSP‰Wè™ƒÄ hghT) jj èÑÙÿÿƒÄ^‹Ã[Ãh_hT) jAjhjèT¾VèèÿÿƒÄëÅÌÌÌÌÌÌÌÌÌVhqhT) jj èŒÙÿÿ¡°hshT) ‹ð@jj £°èlÙÿÿƒÄ ‹Æ^ÃÌÌÌÌ̃=Pëu èRýÿÿ…Àt3¡Pëhà9Pèž›‹ PëQèâšƒÄ ÇPëÇLëÃÌÌÌÌÌÌÌÌÌÌS‹\$è†ýÿÿ[…ÀuƒÈÿËL$‹T$WQ‹L$R‹T$Q‹L$RQ‹øè<þÿÿƒÄ_ÃÌÌÌÌÌÌ̃=Lëu?hËhT) jj è´ØÿÿƒÄƒ=Lëu ÇLë˜hÎhT) jj è‹ØÿÿƒÄ¡Lë‹ÿáÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̃=Lëu?hËhT) jj èTØÿÿƒÄƒ=Lëu ÇLë˜hÎhT) jj è+ØÿÿƒÄ¡Lë‹HÿáÌÌÌÌÌÌÌÌÌÌÌÌÌ̃=Lëu?hËhT) jj èô×ÿÿƒÄƒ=Lëu ÇLë˜hÎhT) jj èË×ÿÿƒÄ¡Lë‹HÿáÌÌÌÌÌÌÌÌÌÌÌÌÌ̃=Lëu?hËhT) jj è”×ÿÿƒÄƒ=Lëu ÇLë˜hÎhT) jj èk×ÿÿƒÄ¡Lë‹H ÿáÌÌÌÌÌÌÌÌÌÌÌÌÌ̃=Lëu?hËhT) jj è4×ÿÿƒÄƒ=Lëu ÇLë˜hÎhT) jj è ×ÿÿƒÄ¡Lë‹HÿáÌÌÌÌÌÌÌÌÌÌÌÌÌ̃=Lëu?hËhT) jj èÔÖÿÿƒÄƒ=Lëu ÇLë˜hÎhT) jj è«ÖÿÿƒÄ¡Lë‹HÿáÌÌÌÌÌÌÌÌÌÌÌÌÌÌW‹|$ƒ?u'è±–‰…ÀuhYhT) jAjfj軃Ä3À_ËSVPèE•‹\$‹ðƒÄ;ó‹jQè.”ƒÄ…ÀtF;ó~ê‹T$‹RSPèD•ƒÄ ^[¸_ÃhchT) jAjfj裺ƒÄ^[3À_ÃÌÌÌÌÌÌÌÌÌÌV‹t$‹…Àu3À^ÃPèË”‹L$ƒÄ;È}ë‹QPèÇ”ƒÄ^ÃÌÌS‹\$W3ÿè3úÿÿ‹Ø…Ûu_[ËD$UVh™hT) jj‰8èÕÿÿ‹KQèv”‹èƒÄ…í~Bh­hT) Rèâÿÿ‹øƒÄ …ÿt"3ö…í~¤$‹CVPèF”‰·FƒÄ;õ|ëh¤hT) jjè(ÕÿÿƒÄ…í~#…ÿuh§hT) jAjlj訹ƒÄ^]_3À[Ã3ö…í~S‹·…ÀtGƒxtA‹\$‹…ÀtPèË“ƒÄ;ð|3Àë ‹ VQèÇ“ƒÄ‹ ·‹QR‹‹IRVSP‹D$,PÿуÄF;õ|­…ÿt WèûâÿÿƒÄ^]_¸[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èö UV‹t$3í9.u^E]YÃS‹\$èÙøÿÿ‹Ø…Ûu[^]YÃWhÅhT) jjè:Ôÿÿ‹CPè!“‹Q‹øè“ƒÄ;Ç}‹ø…ÿ~@h̽hT) Rè³àÿÿ‹èƒÄ …ít 3ö…ÿ~d$‹CVPèæ’‰DµFƒÄ;÷|êhÓhT) jjèÇÓÿÿƒÄ…ÿ~$…íu hÖhT) jAjjjèG¸ƒÄ_[^3À]YÃ3ö…ÿ~r›‹\$ ‹…ÀtPèp’ƒÄ;ð|3Àë ‹ VQèl’ƒÄ‰D$‹Dµ…Àt!ƒxt‹P‹RQ‹L$$VT$R‹PSQÿ҃ċD$‹L$PVQèœüÿÿFƒÄ ;÷|”…ít UèzáÿÿƒÄ_[^¸]YÃÌÌÌÌÌÌÌÌÌÌÌÌS‹\$W3ÿès÷ÿÿ‹Ø…Û„UVhðhT) jjèÔÒÿÿ‹CP軑‹èƒÄ…í~;hô ­hT) Qè[ßÿÿ‹øƒÄ …ÿt3ö…í~‹SVRè’‘‰·FƒÄ;õ|ëhûhT) jjètÒÿÿƒÄ…í~!…ÿuhþhT) jAjkjèô¶ƒÄ^]_[Ë\$3ö…í~Q‹ÿ‹·…ÀtCƒx t=‹…ÀtP葃Ä;ð|3Àë ‹VP葃ċ ·‹QR‹‹I RVSP‹D$,PÿуÄF;õ|±…ÿt WèGàÿÿƒÄ‹…ÀtP蘃ÄÇ^]_[ÃÌÌÌÌÌÌÌÌÌÌVh˜hh) j è^Þÿÿ‹ðƒÄ 3À…öt‰‰F‰Fÿ` ‰‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èö ‹D$H‹QT$RL$QT$RPÿ\ ƒÄÃÌ̸èÆ SUV‹t$‹nW‹|$ ‹Gj3ÛSSPè8 ‹N+ÃÕ3ö+Á‹OÖÁÖ‰D$‰T$ßl$_^]Ü5ˆ) [Ý€) ØÑßàöÄAuÝÙƒÄÃÝØƒÄÃÌÌÌ‹L$‹A%ÿÿ€À‰D$ÛD$…À}Ü) ‹I‰L$ÛD$…É}Ü) ݈) ‹L$Üù‹A%ÿÿ€Ò‰T$ÙÊÞÁÛD$…Ò}Ü) ‹AÛA…À}Ü) ÞóÞÂÞáÙîÙÀÝêßàöÄDzÝÙ3ÀÝØÃÞÙßàöÄA¸ÿÿÿÿt¸ÃÌÌÌÌÌÌÌÌÌÌÌ¡¸PèŃąÀuh¸Pè3Âhjè'ƒÄÃÌÌÌ‹D$Pÿø ƒÄ…ÀuÃVW‹ð‹D$¹ ‹øó¥_^ÃÌÌÌÌÌÌÌÌÌSV‹t$ …ö„΋\$…Û„ÂW‹=! ÿ×Ç‹…ÀumhDÿà ƒÄ‰…Àuÿ×Ç _^3À[ÃhDjPèz ‹ƒÄ PSÿT ‹‰@‹ƒ¸@ÿu0PÿØ ƒÄÇÿ×_^Ç3À[Ë@PRÿX …Àt‹H,hÿQDPÿ! ‹ƒÄ _Æ‚C‹^D[Ãÿ! ^Ç3À[ÃÌÌÌV‹t$…öt,‹…Àt&‹€@Pÿœ ‹QÿØ ƒÄǸ^Ãÿ! Ç3À^ÃÌÌÌÌÌÌÌÌÌÌ̸* ÃÌÌÌÌÌÌÌÌÌÌV‹t$j@FTjPÇèp j@NjQèc 3À‰F‰F‰F ƒÄ‰F¸^ÃÌÌ̸Èè¶ SUVATq‹N^][¸_Ë\$ƒÿr&‹ÇÁè‰D$ëIS‹Îè¨ýÿÿƒÄƒÃƒïƒl$uèWSUèÒ ƒÄ ‰>^][¸_Ã̸˜è6 ¡Àç3ĉ„$”V‹´$¨W‹¼$¤…öu¾TëD$PèýÿÿƒÄ…Àu_^‹Œ$”3Ìè ĘËŒ$¨QT$ WRèÔþÿÿD$PVèIþÿÿL$h”QèªÚÿÿ‹Œ$¸ƒÄ_‹Æ^3ÌèÐ ĘÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸Hè† ƒ|$T‹L$L‹‹D$PS‹YU‹iV‹q ‰T$\„šW¶¶P@Áâ ʶP@Áâ ʶP@Áâ Ê@¶P‹ù¶@Áâ ʶP@Áâ ʶP@Áâ ʶP‰L$0‹Î@3͉|$P@ÿL$d#Ë3Î϶8L$`Áç ×¶x@Áç ×¶x@Áç ׉T$ ÁÁ‹Õ3Ó#Ñ3ÕT$0@¶xÖ¶0@Áç ÷¶x@Áç ÷¶x@Áç ÷‰t$@‹ó3ñÁÂ#ò3ó@t$ ¶8õ¶hÁå ý@¶hÁå ý@¶h@Áå ý‰|$ÁÆ @¶h‹ú3ù#þ3ù|$@@û¶XÿÁå ݶh@Áå ݶh@Áå ݉\$8‹Ú3ÞÁÇ#ß3Ú\$@¶hÙ¶@Áå Ͷh@Áå Ͷh@Áå ͉L$(ÁËÎ3Ï#Ë3ÎL$8@¶hʶ@Áå Õ¶h@Áå Õ¶h@ÁåÁÁ Õ@¶h‰T$H‹×3Ó#Ñ3×T$(@Ö¶pÿÁå õ¶h@Áå õ¶h@Áå õ‰t$Á @¶h‹ñ3ó#ò3ót$H@÷¶xÿÁå ý¶h@Áå ý¶h@Áå ý‰|$4ÁÆ‹ù3ú#þ3ù|$@¶hû¶@Áå ݶh@Áå ݶh@Áå ݉\$$ÁÇ‹Ú3Þ#ß3Ú\$4@¶hÙ¶@ÁåÁà Í@¶(Áå ͶhÁå Í@‰L$D‹Î3Ï@¶hÁå#Ë3ÎL$$@ʶPÿ Õ¶hÁå Õ@¶hÁå Õ@‰T$ÁÁ @¶h‹Ó3×#Ñ3×T$DÁåÖ¶0 õ@¶hÁå õ@¶h@Áå õ‰t$<Á‹ó3ñ#ò3ót$@¶h÷¶8@Áå ý¶h@Áå ý¶h@Áå ý‹é3êÁÆ#î3él$<@‰|$,ë¶8¶XÁã û@¶XÁã û@¶XÁã û@Áʼn|$L‹ú3þ#ý3ú|$,@ùÁÇ ‹Í3Î#Ï3ÎL$L‹ßÊÁÁ#Ù‹× Ñ#Õ ÓT$P‹Ù´2™y‚ZÁÆ#Þ‹Ñ Ö‰T$T#× ÓT$‰\$`¬*™y‚Z‹T$TÁÅ#Õ ÓT$‰l$¼:™y‚ZÁÇ ‹× Ö#Õ‹ß#Þ ÓT$‹ßŒ ™y‚ZÁÁ ‹× Ñ#Õ#Ù ÓT$0‹Ù´2™y‚ZÁÆ‹Ñ Ö#Þ‰\$`‹ê#ï ël$8‹\$œ+™y‚ZÁÃ#Ó T$`‰\$T$4”:™y‚ZÁ ‹ú‹ê#î þ#û ý|$<¼™y‚Z‹ÊÁÇ Ï#Ë‹Ú#ß ËL$ ‹ß´1™y‚ZÁÆ#Þ‹Ï Î‰\$`‹é#ê ël$(‹\$œ+™y‚ZÁÃ#Ë L$`‰\$L$$Œ™y‚ZÁÁ ‹Ñ Ö#Ó‹é#î ÕT$,¼:™y‚ZÁÇ ‹Ñ ×#Ó‹Ù#ß ÓT$@‹ß´2™y‚ZÁÆ‹× Ö#Þ‹ê#é ël$H‰\$`‹\$œ+™y‚ZÁÃ#Ó T$`T$DŒ ™y‚ZÁÁ ‹Ñ Ö#Ó‹é#î ÕT$L¼:™y‚ZÁÇ ‹Ó3Ñ3×T$P´2¡ëÙnÁÆ‹Ñ3×3ÖT$œ¡ëÙnÁà ‹Ó3×3ÖT$Œ ¡ëÙnÁÁ ‹Ó3Ñ‹ê3îl$¼/¡ëÙnÁÇ3×T$ ”2¡ëÙnÁ‹ñ3÷3òt$$œ¡ëÙnÁà ‹ó3÷3òt$(¬¡ëÙnÁÅ ‹Ë3Í‹ñ3òt$,´>¡ëÙnÁÆ3ÎL$0Œ¡ëÙnÁÁ‹Õ3Ö3ÑT$4¼¡ëÙnÁÇ ‹×3Ö3ÑT$8œ*¡ëÙnÁà ‹×3Ó‹ê3él$<´.¡ëÙnÁÆ3ÖT$@” ¡ëÙnÁ‹Ë3Î3ÊL$D¼9¡ëÙnÁÇ ‹Ï3Î3ÊL$H¬¡ëÙnÁÅ ‹Ï3Í3ÊL$L´1¡ëÙn‹L$\iy ‹‹iÁÆqƒ|$d‹Y‹q ‰T$`…hùÿÿ_^][ƒÄHËT$UW‹|$‹ê…ÿ„ÁV‹t$‹F ø;ÈsÿF‹ÇÁèF‹FXS‰N…Àtjnƒÿ@s" 8ƒù@sWRèUèïûƒÄ ~X[^_¸]û@+ØSR(RèÍûjUVè²øÿÿ‹D$0j@ jU‰L$<+ûÇFXè¬û‹l$<ƒÄ$‹ßÁë…ÛvSUVè|øÿÿÁãƒÄ ë+û…ÿtW‰~XUƒÆVèrûƒÄ [^_¸]ÃÌÌÌ‹D$‹L$jPQè?øÿÿƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌSVW‹|$‹_XwÆ3€Cƒû8v ¸@+ÃPjÞSèûjVW3Ûèü÷ÿÿƒÄ¹8+ËQjÞSèÿú¶WˆV8¶GƒÆ8ˆF¶OFˆN¶WFˆV¶GFˆF¶OFˆN¶WFFˆ¶GFˆjƒî?VWè›÷ÿÿj@jVÇGXè¢ú‹‹D$4ˆ@‹ÑÁêˆ@‹ÑÁêˆ@Á鈋OˆH@@‹ÑÁêˆ@‹ÑÁêˆ@Á鈋O@ˆ@‹ÑÁêˆ@‹ÑƒÄ$Áêˆ@Á鈋O ˆH@‹Ñ@ÁꈋÑ@_ÁêˆÁé^ˆH¸[ÃÌÌÌÌÌÌÌÌÌ̸\è†ùV‹t$l…öu¾dëD$Pè~ƒÄ…Àu^ƒÄ\ËL$h‹T$dQRD$ PèŽýÿÿL$QVèƒþÿÿT$j\Rè'ÑÿÿƒÄ‹Æ^ƒÄ\ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$UW‹|$‹ê…ÿ„ÁV‹t$‹F ø;ÈsÿF‹ÇÁèF‹FXS‰N…Àtjnƒÿ@s" 8ƒù@sWRèUèOùƒÄ ~X[^_¸]û@+ØSR(Rè-ùjUVè¢ ‹D$0j@ jU‰L$<+ûÇFXè ù‹l$<ƒÄ$‹ßÁë…ÛvSUVèl ÁãƒÄ ë+û…ÿtW‰~XUƒÆVèÒøƒÄ [^_¸]ÃÌÌÌ‹D$‹L$jPQè/ ƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌSVW‹|$‹_XwÆ3€Cƒû8v ¸@+ÃPjÞSèøjVW3Ûèì ƒÄ¹8+ËQjÞSè_ø¶WˆV8¶GƒÆ8ˆF¶OFˆN¶WFˆV¶GFˆF¶OFˆN¶WFFˆ¶GFˆjƒî?VWè‹ j@jVÇGXèø‹‹D$4ˆ@‹ÑÁêˆ@‹ÑÁêˆ@Á鈋OˆH@@‹ÑÁêˆ@‹ÑÁêˆ@Á鈋O@ˆ@‹ÑÁêˆ@‹ÑƒÄ$Áêˆ@Á鈋O ˆH@‹Ñ@ÁꈋÑ@_ÁêˆÁé^ˆH¸[ÃÌÌÌÌÌÌÌÌÌÌ‹D$3ÉÇ#EgÇ@‰«ÍïÇ@þܺ˜Ç@ vT2‰H‰H‰HXAÃÌ̸\è¶öV‹t$l…öu¾tëD$Pè®ÿÿÿƒÄ…Àu^ƒÄ\ËL$h‹T$dQRD$ Pè^ýÿÿL$QVèSþÿÿT$j\RèWÎÿÿƒÄ‹Æ^ƒÄ\ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸TèFö‹L$X‹D$\S‹YUVW‹9‹i‹q ‹I¶‰L$¶HÁáÁâ Ñ@¶HÁá Ñ@¶H Ñ@‰T$T¶P@¶HÁáÁâ Ñ@¶HÁá Ñ@¶H Ñ@‰T$X@‹Î3Í#Ë3΋×ÁÂT$T@Ê‹T$‰t$l´™y‚Z¶Hÿ¶ÁâÁá ʶP@Áâ ʶP Ê@‰L$$ÁÃ@‹Õ3Ó#׋ÎÁÁL$X3ÕÑ‹L$l” ™y‚Z¶@‰l$¶(ÁáÁåÁÇ ͉|$@¶(Áå Ͷh Í@‰L$,@‹ÊÁÁL$$‹ë3ï#î3ëé‹L$¼)™y‚Z¶¶h@ÁáÁå Ͷh@@Áå Ͷ( ÍÁƉL$4‹L$‰t$3ñ#ò3ñ¶H@‹ïÁÅl$,@õÁ‹ê¶ÁáÁâ ʶP@Áâ ʶP@ Êœ™y‚Z‰L$<‹L$‹ñ3õ@#÷3ñ‹L$‹ÓÁÂT$4@ò”™y‚Z¶Hÿ¶0ÁáÁæÁÇ Ή|$l@¶0@Áæ ζ0 ΉL$D@‹ÊÁÁL$<‹õ3÷¶x#ó3õñ‹L$´™y‚Z¶Áá@Áç ϶x@Áç ϶x Ï‹|$l@ÁÉL$H3û#ú3|$l@‹ÎÁÁL$D@ù¶HÿÁÂÁá¼/™y‚Z‹ê¶Áâ ʶP@Áâ ʶP@ ʉ\$‰L$(‹Ë3Ý@#Þ3Ù‹L$l‹×ÁÂT$H@Ú” ™y‚Z¶Hÿ¶ÁãÁáÁÆ Ë¶X@‰t$@Áã ˶ ˉL$0@‹ÊÁÁL$(‹Ý3Þ¶p#ß3ÝÙ‹L$œ ™y‚Z¶@ÁáÁæ ζp@@Áæ ζ0 ÎÁljL$8‹L$‰|$3ù#ú3ù¶H@‹óÁÆt$0@þÁ´/™y‚Z‹ê¶ÁáÁâ ʶP@Áâ ʶP@ ʉL$@‹L$‹ù3ý@#û3ù‹L$‹ÖÁÂT$8@ú”™y‚Z¶Hÿ¶8ÁçÁáÁà ϶x@‰\$l@Áç ϶8 ωL$P@‹ý3û¶X#þ3ý‹ÊÁÁL$@@ù‹L$¼™y‚Z¶HÿÁáÁã ˶X@Áã ˶X Ë‹\$l@ÁÆ3Þ@‰L$L#Ú3\$l‹ÏÁÁL$P‰t$¶pÙÁ‹ʶ@ÁæÁâ Ö¶p@Áæ Ö¶p@œ+™y‚Z‹l$3é Ö#ï3l$@‹óÁÆt$L‰L$ ‹L$lî´)™y‚Z¶¶h@ÁåÁáÁÇ Í¶h@‰t$‰|$Áå Ͷh Í‹l$ 3ï#ë3l$ @@ÁÆòî‹t$´.™y‚ZÁÉt$l‹þ‹t$ÁÇù‹ë3l$‰\$#î3l$ï‹|$ ¼/™y‚ZÁÆ‹î‹t$L3t$(3Ý3t$$#\$l3t$T3\$‰|$ÁÇ|$‰t$Tß‹|$l´™y‚ZÁNj߉l$3ë#l$‰t$ 3l$‹ú3|$0‰\$l3|$,3|$XÁÆt$‰|$Xî‹t$ÁƋ޼/™y‚Z‹l$l‹ñ3t$83ë3t$4#l$ 3t$$3l$l‰|$ÁÇ|$‰t$$ï´.™y‚Z‰\$‰t$‹|$ ÁÇ‹l$‹ß‹|$@3|$<3ë3|$,#l$3|$T3l$ÁÆt$l‰|$,î‹t$ÁƉt$‹t$P3t$D¼/™y‚Z3t$4‰|$3t$XÁÇ|$‰\$ ‹\$3\$ ‰t$43\$ß‹|$ÁÇ´¡ëÙn‹ß‹|$L3|$H‰t$l3|$<‰\$3|$$3\$‹l$3\$ÁÆt$ ‰|$<Þ‹t$ÁƼ¡ëÙn‹Þ‹ò3t$(‰|$3t$D3ë3t$,3l$lÁÇ|$‰\$ï‹|$lÁNjߋù3|$0‰t$D3|$H´.¡ëÙn3|$4‹î‰t$ ‹t$ÁÅ3ó‰\$l‰|$H‹Þl$‹t$3Þݼ¡ëÙnÁƋދt$83t$(‰|$3t$<‹ï3t$T‹|$l3û‰\$‹ß‹|$ 3ßÁÅl$‰t$(Ý´¡ëÙnÁNjߋ|$@3|$0‰t$3|$D‹î3|$X‹t$3ó‰\$ ‹Þ‹t$3ÞÁÅl$l‰|$0ÝÁƼ¡ëÙn‹\$3\$ ‰t$‹t$P3t$83\$3t$H‰|$3t$$ÁÇ|$‰t$8ß‹|$´¡ëÙnÁNjߋ|$L3|$@‰\$3|$(3\$3|$,3\$‰t$lÁÆt$ ‰|$@Þ‹t$¼¡ëÙnÁƉ|$‹Þ‹l$3ë3l$l‹ò3t$P3T$@3t$03T$D3t$4ÁÇ|$3T$Tï‹|$lÁlj\$‹ß‹ù3|$L‰t$P3|$83L$P3|$<3L$H´.¡ëÙn3L$X‰\$l‰t$ ‹î‹t$3óÁÅl$‹Þ‹t$3ÞÝ‹l$l‰|$L¼¡ëÙnÁÆ3î‹ßÁÃ\$‰t$‹t$ 3îëÁƉL$‹Úœ+¡ëÙn‹î‹ñ‹L$3Í3ωT$‰\$ÁÃ\$l‰l$ ˋޜ ¡ëÙn‹L$L3L$(ÁÇ3L$$‰|$3L$T‹|$‰\$ÁÃ\$3ý3|$‰L$TûŒ9¡ëÙn‹|$ÁNj߉L$l‰\$3\$‹ú3|$03\$3|$,3|$XÁÁÍÙ‹L$‹l$ÁÁ‰|$X¼¡ëÙn‹Ù3ë3l$l‰|$‹Î3L$8‰\$3L$43L$$ÁÇ|$‰L$$ï‹|$lÁÇŒ)¡ëÙn‹ß‹|$@3|$<‰L$ 3|$,‹é3|$T‹L$3ˉL$`‹L$‰\$l‹\$`3ÙÁÅl$‰|$,ݼ¡ëÙnÁÁ‹Ù‹L$P3L$D‹ï3L$4‰|$3L$X‹|$l3û‰|$`‹|$ ‰\$‹\$`ÁÅl$3ßÝÁljL$4Œ¡ëÙn‹ß‹|$L3|$H‰L$‰\$ 3|$<‹é3|$$‹L$3ËÁÅl$l‹Ù‹L$3ÙÝÁÁ‰|$<¼¡ëÙn‹\$3\$ ‰L$3\$‰|$‹Ê3L$(3L$D3L$,ÁÇ|$‰L$Dß‹|$ÁÇŒ¡ëÙn‹ß‹þ3|$0‰\$3|$H3\$3|$43\$‰|$‰|$H‹ùÁÇ|$ ß‹|$œ¡ëÙn‹|$ÁÇ‹ï‹|$83|$(‰l$3|$< é3|$T#l$‰|$ ‰|$(‹|$#ù ïl$‰\$l$ ÁÃÁÁ‹ù‹L$@3L$0œ+ܼ3L$D‰\$ 3L$X‹ï‰L$‰L$0‹L$ÁÉ|$l é#l$#ù ïl$l$ÁÁ‹ù‹L$P3L$8œ+ܼ3L$H‹ï3L$$‰|$‰L$‰L$8‹L$ é#l$l#ù ïl$‰\$l$ÁÃÁÁ‹ù‹L$L3L$@œ+ܼ3L$(‹ï3L$,‰|$ ‰L$‰L$@‹L$ é#l$#ù ïl$l‰\$l$ÁÃÁÁ‹ù‹Ê3L$Pœ+ܼ3L$0‰\$3L$4ÁÉL$l‰L$P‹L$‹é ï#l$ #Ï él$‹L$l$lÁÁ‰|$¼+ܼ‹Ù‹Î3L$L‰|$l3L$8‰\$3L$<‹ë‰L$‰L$L‹Ï‹|$ÁÁ ï#l$3T$@#ß3T$D ël$ 3T$Tl$ÁÇ3t$PŒ)ܼ‹ß |$l3t$H#|$3t$X‹ë#l$l‰T$ ý|$‰T$\|$ ‹ÑÁ¼ܼ‹T$lÁ‰\$‹ê é#ë‹Ú#Ù ël$‰t$l$‰t$`‹÷ÁÆÁÁ‹Ù‹L$L3L$(‰\$3L$$ ß3L$T#Ú‰T$l‹T$#× Ú\$‹T$\3T$0´.ܼ3T$,Ù3T$X‹îÁÅÁlj|$ þ#|$œ+ܼ‹l$ #î ý|$l‰\$úÁÜܼÁÆ‹þ‰\$‰|$‹t$`3t$83t$43t$$ÁÉt$$‹t$‹î ï#l$ #÷ îl$‹t$l$$ÁÆ‹þ‹t$@3t$<œ+ܼ3t$,‹ï3ñ‰t$‰t$,‹t$ î#l$‰|$#þ ïl$ ‰\$ll$ÁÃÁÆ‹þ‹t$P3t$Dœ+ܼ3t$4‹ï3ò‰t$ ‰t$4‹t$l î#l$‰|$#þ ïl$‰\$l$ ÁÃÁÆ‹þ‹t$L3t$Hœ+ܼ3t$<‹ï3t$$‰|$l‰t$‰t$<‹t$ î#l$#þ ïl$‰\$ l$ÁÃÁÆ‹þ‹t$\œ+ܼ‰\$‰|$3t$(‹ï3t$D3t$,ÁÉt$‰t$D‹t$ î#l$l#þ ïl$l$ÁÆ‹þ‹t$`3t$0œ+ܼ3t$H‹ï3t$4‰|$ ‰t$‰t$H‹t$ î#l$#þ ïl$l‰\$l$ÁÃÁÆ‹þ‹t$83t$(œ+ܼ3t$<‰\$3ñ‰t$l‰t$(‹t$‹î ï#l$ #÷ îl$‹t$l$lÁÃÁƉ|$‹þ‹t$@3t$0œ+ܼ3t$D‹ï3ò‰t$‰t$0‹t$ î#l$‰|$#þ ïl$ ‰\$ll$ÁÃÁÆ‹þ‹t$Pœ+ܼ‰\$‰|$3t$8‹ï3t$H3t$$ÁÉt$ ‰t$8‹t$l#þ î#l$ ïl$l$ ÁÆ‹þ‹t$L3t$@œ+ܼ3t$(‹ï3t$,‰|$l‰t$‰t$@‹t$#þ î#l$‰\$ ïl$ÁÃl$ÁƼ+ܼ‰|$‹ï‹|$l‹Þ‹t$\3t$P3û3t$0‰|$X3t$4‹|$ ‰\$‹\$X3ßÁÅl$ÞÁÇœ+ÖÁbÊ‹ï‹|$`3|$L‰\$3|$8‰l$ 3|$<ÁÃ\$l‰|$L‹|$3ý3|$|$LœÖÁbÊ‹|$Álj|$‹|$\3|$@‰\$3|$D3ù‰|$\‹|$ÁÃ3ý3|$\$|$\œÖÁbÊ‹|$ÁÇ‹ï‹|$`3þ3|$H‰l$3l$3ú3l$‰\$lïÁÃ\$ ‰|$`œ+ÖÁbÊ‹l$L3l$(‹|$3l$$ÁÇ3Í‹l$3ï3l$l‰\$ÁÃ\$é‰|$‹|$lœ+ÖÁbÊ‹l$\3l$0ÁÇ3l$,‰|$l3Õ‹l$3ï3l$‹|$l$‰\$ ÁÃÚÁlj|$‹|$`3|$8œ+ÖÁbÊ3|$4‰\$1|$$‹|$l3|$ÁÃ3|$ \$|$$œÖÁbÊ‹|$ ÁÇ‹ï‹|$@3|$<‰\$3|$,‰l$ 3ù‰|$,‹|$3ý3|$ÁÃ|$,\$lœÖÁbÊ‹|$Álj|$‰\$‹þ3|$D3|$43ú‰|$4‹|$3ý3|$ÁÃ|$4\$œÖÁbÊ‹|$ÁÇ‹ï‹|$L3|$H‰\$l3|$<‰l$3|$$3l$‰|$<3l$ÁÃ\$ ï‹|$ÁÇœ+ÖÁbÊ‹ï‹|$\3|$(‰\$3|$D‰l$3|$,ÁÃ\$‰|$D‹|$3ý3|$l|$DœÖÁbÊ‹|$lÁÇ‹ï‹|$`3|$0‰\$ 3|$H‰l$l3|$4ÁÃ\$‰|$H‹|$3ý3|$|$HœÖÁbÊ‹|$ÁÇ‹ï‹|$83|$(‰\$3|$<‰l$3ù‰|$(‹|$lÁÃ3ý3|$ \$|$(œÖÁbÊ‹|$ ÁÇ‹ï‹|$@3|$0‰\$3|$D‰l$ 3ú‰|$0‹|$3ý3|$ÁÃ|$0\$lœÖÁbÊ‹|$Álj|$‹þ3|$8‰\$3|$H3|$$ÁÃ\$‰|$8‹|$3ý3|$|$8œÖÁbÊ‹|$ÁÇ‹ï‹|$L3|$@‰l$3l$3|$(3l$3|$,‰\$lï‰|$@‹|$ÁÃ\$ ÁǬ+ÖÁbʋߋ|$\3þ3|$0‹t$3|$43ó3t$l‰l$ÁÅl$÷‰|$P¼.ÖÁbÊ‹l$`3l$L‹t$l3l$8ÁÆ3l$<‰|$ ‰\$Áljt$l3Þ‹t$|$3ÞëÁƋދt$\3t$@¼/ÖÁbÊ3t$D‰\$3ñ‹L$l3ˋًL$ 3Ùó‹ïÁÅl$ÁÁ‰L$ ‹L$`3L$P´.ÖÁbÊ3L$H‹Þ3Ê‹T$ÁÃ\$l‹ê3l$ 3ïÍœÖÁbÊ‹L$hq‹q ‹)‹YÁÇy‰y‹|$ ÷‰q ‹qòƒl$p‰qt‹ýéëÿÿ_^][ƒÄTÃÌÌÌÌÌÌÌÌ‹T$UW‹|$‹ê…ÿ„ÁV‹t$‹F ø;ÈsÿF‹ÇÁèF‹F\S‰N…Àtjnƒÿ@s" 8ƒù@sWRèUèoáƒÄ ~\[^_¸]û@+ØSR(RèMájUVèrêÿÿ‹D$0j@ jU‰L$<+ûÇF\è,á‹l$<ƒÄ$‹ßÁë…ÛvSUVè<êÿÿÁãƒÄ ë+û…ÿtW‰~\UƒÆVèòàƒÄ [^_¸]ÃÌÌÌ‹D$‹L$jPQèÿéÿÿƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌSVW‹|$‹_\wÆ3€Cƒû8v ¸@+ÃPjÞSèŸàjVW3Ûè¼éÿÿƒÄ¹8+ËQjÞSèà¶WˆV8¶GƒÆ8ˆF¶OFˆN¶WFˆV¶GFˆF¶OFˆN¶WFFˆ¶GFˆjƒî?VWè[éÿÿj@jVÇG\è"à‹‹D$4‹ÑÁêˆ@‹ÑÁêˆ@‹ÑÁꈈH‹O@@‹ÑÁêˆ@‹ÑÁêˆ@‹ÑÁêˆ@ˆ‹O@‹ÑÁêˆ@‹ÑƒÄ$Áêˆ@@‹ÑÁêˆPÿˆ‹O @‹ÑÁêˆ@‹ÑÁêˆ@‹ÑÁꈈH‹O@@‹ÑÁêˆ@‹ÑÁêˆ@‹Ñ_Áêˆ^ˆH¸[ÃÌÌÌ‹T$UW‹|$‹ê…ÿ„ÁV‹t$‹F ø;ÈsÿF‹ÇÁèF‹F\S‰N…Àtjnƒÿ@s" 8ƒù@sWRèUè៎ ~\[^_¸]û@+ØSR(RèýÞjUVèrô‹D$0j@ jU‰L$<+ûÇF\èÜÞ‹l$<ƒÄ$‹ßÁë…ÛvSUVè<ôÁãƒÄ ë+û…ÿtW‰~\UƒÆVè¢ÞƒÄ [^_¸]ÃÌÌÌ‹D$‹L$jPQèÿóƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌSVW‹|$‹_\wÆ3€Cƒû8v ¸@+ÃPjÞSèOÞjVW3Ûè¼óƒÄ¹8+ËQjÞSè/Þ¶WˆV8¶GƒÆ8ˆF¶OFˆN¶WFˆV¶GFˆF¶OFˆN¶WFFˆ¶GFˆjƒî?VWè[ój@jVÇG\èÒÝ‹‹D$4‹ÑÁêˆ@‹ÑÁêˆ@‹ÑÁꈈH‹O@@‹ÑÁêˆ@‹ÑÁêˆ@‹ÑÁêˆ@ˆ‹O@‹ÑÁêˆ@‹ÑƒÄ$Áêˆ@@‹ÑÁêˆPÿˆ‹O @‹ÑÁêˆ@‹ÑÁêˆ@‹ÑÁꈈH‹O@@‹ÑÁêˆ@‹ÑÁêˆ@‹Ñ_Áêˆ^ˆH¸[ÃÌÌ̸`è–ÜV‹t$p…öu¾„ëD$PèÎLƒÄ…Àu^ƒÄ`ËL$l‹T$hQRD$ PèûÿÿL$QVèüÿÿT$j`Rè7´ÿÿƒÄ‹Æ^ƒÄ`ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸`è&ÜV‹t$p…öu¾˜ëD$Pè^LƒÄ…Àu^ƒÄ`ËL$l‹T$hQRD$ PèþüÿÿL$QVèóýÿÿT$j`RèdzÿÿƒÄ‹Æ^ƒÄ`ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$3ÉÇØžÁÇ@Õ|6Ç@Ýp0Ç@ 9Y÷Ç@1 ÀÿÇ@XhÇ@§ùdÇ@¤Oú¾‰H ‰H$‰HhÇ@lAÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$3ÉÇgæ jÇ@…®g»Ç@rón<Ç@ :õO¥Ç@RQÇ@Œh›Ç@«ÙƒÇ@Íà[‰H ‰H$‰HhÇ@l AÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸€èöÚƒ¼$Œ‹„$ˆW‹¼$ˆ„wSUV›‹W‹O‹7‹_‹o‰T$‹W‰T$<‹W‰T$D¶ÿŒ$œÁâ@@‰L$ ‹O ¶xÿÁç ×¶8Áç ×¶x ×@‰T$‰T$P‹Ó@Á‹ûÁÇ3׋ûÁÇ3×T$‹û÷×#ý‰l$@‹l$<#ë3ýú‹T$D”˜/ŠB‹|$ ʉ\$(‰T$‹×#þ3Ö‹ÞÁËîÁÅ3݉T$8#T$‹îÁÅ 3Ý\$3׉|$4¶8Ó¶X@ÁãÁç û¶X@Áã û‰L$$@¶ û‹l$(@#é‰|$‰|$T‹ùÁÇ‹ÙÁÃ3û‹ÙÁÃ3û|$‹Ù÷Ó#\$<@3Ýß‹|$@œ;‘D7q‹|$û‰\$‹êÁÅ‹ÚÁÃ3ë‹ÚÁà 3ël$‹\$8#Ú3\$4@‰\$Dݶhÿ‰\$,¶XþÁåÁã ݶ(Áå ݶh Ý@‰\$‰\$X@‹ßÁËïÁÅ3Ý‹ïÁÅ3Ý\$‹ï÷Õ#l$(#Ï3é‹L$<ë‹\$,Œ)ÏûÀµL$ ‹ë‰L$‰|$ÁÅ‹ËÁÁ3é‹ËÁÁ 3él$‹Ë3Î#Þ#Ê3ËͶX‰L$0¶ÁãÁá Ë@¶XÁã Ë@¶X Ë@‰L$‰L$\‹L$ ‹Ù‹é@ÁÃÁÅ3Ý‹éÁÅ3Ý\$#ù‹é‹L$(÷Õ#l$$@3ï‹|$0ë‹\$,Œ)¥Ûµéñ‰L$‹ï‹ÏÁÅÁÁ3é‹ÏÁÁ 3él$‹Ë#ß3϶xÿ#Ê3˶ÁãÁç û¶X@Áã@ û¶Í û‰t$‰|$‰|$`‹l$ @‹þÁÇ‹ÞÁÃ3û#î‹ÞÁÃ3û|$‹Þ‹t$$÷Ó#\$@3Ýß¼3[ÂV9׋\$0‹éÁÅ‹ñÁÆ3î‹ñÁÆ 3î‹ó#Ùï¶xÿ3ñ#t$,Áç3ó¶Áã û¶XÁã û@¶X û@‰|$‰|$dõ@‹úÁÇ‹ÚÁÃ3û‹ÚÁÃ3û|$‹Ú÷Ó#\$ ‰T$#T$3Ú‹T$ß¼ññY‹T$,׉|$‹ÞÁËþÁÇ3߉T$,‹þÁÇ 3ß\$‹ù3þ#|$0@‹é#î3ýû¶Áã‰|$¶xÿÁç û¶XÁã û@¶X û@‹l$‰|$‰|$h@‹úÁÇ‹ÚÁÃ3û‹ÚÁÃ3û|$#ê‹Ú÷Ó#\$@3Ýß‹|$ ¼;¤‚?’|$0‰|$‹|$‹ï‹ßÁÅÁÃ3ë‹ßÁà 3ël$‹Þ3ß#Ù‰\$D‹Þ#ß‹|$D3û¶ý‰|$ ¶xÿÁãÁç û¶X@Áã@ û¶ û‰|$@‰|$l‹|$0#׋ßÁËïÁÅ3Ý‹ïÁÅ3Ý\$‹ï÷Õ#l$@3ê‹T$ë”*Õ^«Ê‹\$‰T$‹T$ ‹ê‹úÁÅÁÇ3ï‹úÁÇ 3ï‹û#Ú3ú¶Pÿl$#þ3û¶ÁãÁâ Ó¶XÁã Ó@¶X Ó@‰T$‰T$pý‹l$0@‹ÑÁ‹ÙÁÃ3Ó‹ÙÁÃ3ÓT$‹Ù÷Ó#\$,#é3ÝÚ‹T$”˜ªØ‹\$ ò‰T$‹Ó‰L$(‰|$‰t$$3×#߉\$4‹ßÁËïÁÅ3ÝÁÇ 3ß\$‹ú#|$‰T$83|$4¶û¶XÁâ@Áã Ó¶X@Áã Ó¶X Ó@‰T$‰T$t@‹ÖÁ‹ÞÁÃ3Ó‹ÞÁÃ3ÓT$‹Þ÷Ó#\$0‹é#î3ÝÚ‹T$,”[ƒ‹\$Ú‰T$‹ïÁÅ‹×ÁÂ3ê‹×Á 3êl$‹T$8#×3T$4‰|$¶8Õ¶h@ÁåÁç ý¶h@Áå@ ý¶( ý‰\$‰|$‹ë‰|$x‹û@ÁÇÁÅ3ý‹ëÁÅ3ý|$‹ë÷Õ#é‹Î#Ë3é‹L$0ï‹|$Œ)¾…1$L$ ‰L$‹ÚÁËÊÁÁ3Ù‹ÊÁÁ 3Ù\$‹Ê3Ï#L$@‹ê#ï¶xÿ3Í˶ÁãÁç û¶X@Áã û¶X û@‰|$‰|$|‹|$ @‹ßÁËïÁÅ3Ý‹ïÁÅ3Ý\$‹ï÷Õ#î‹t$#÷3î‹t$(ë¼.Ã} U‹t$÷‹Ù‰|$‰t$ÁËùÁÇ3ß‹ùÁÇ 3ß\$‹ú3ù#|$@‹ê#é3ýû¶Áã‰|$(¶xÿÁç û¶XÁã û@¶X û@‹l$ ‰|$‰¼$€@‹þÁÇ‹ÞÁÃ3û‹ÞÁÃ3û|$#î‹Þ÷Ó#\$@3Ýß‹|$$¼;t]¾r|$‰|$‹|$(‹ï‹ßÁÅÁÃ3ë‹ßÁà 3ël$‹Ù3ß#Ú‰\$D‹Ù#ß‹|$D3û¶ý‰|$$¶xÿÁãÁç û¶X@Áã û@¶ û‰|$@‰¼$„‹|$‹ßÁËïÁÅ3Ý‹ïÁÅ3Ý\$‹ï#þ‹t$÷Õ#l$ @3ïë´.þ±Þ€Ö‹\$(‰t$‹t$$‹î‹þÁÅÁÇ3ï‹þÁÇ 3ï‹û#Þ3þ¶pÿl$#ù3û¶ÁãÁæ ó¶XÁã ó@¶X ó@‰t$‰´$ˆý‹l$@‹òÁÆ‹ÚÁÃ3ó‹ÚÁÃ3ót$‹Ú÷Ó#\$#ê3ÝÞ‹t$ ´3§Ü›‹ßΉ|$‰t$ÁË÷‹l$$#ïÁÆ3Þ‹÷ÁÆ 3Þ\$‹t$$3÷#t$(¶8Áç3õó¶XÁã û@¶XÁã û@¶X û‰|$@‰¼$Œ@‹ùÁÇ‹ÙÁÃ3û‹ÙÁÃ3û|$‹Ù÷Ó#\$‹ê#é3Ýß‹|$¼;tñ›Á|$(‹l$‰|$‹ÞÁËþÁÇ3ß‹þÁÇ 3ß‹|$\$3þ#|$$#î3ýû‰|$¿‰|$,ÇD$0´+ ‹ßƒã\œP‰\$@‹‰\$_ýƒãOƒç\œP‰\$H‹|¼P‹ë‰|$<‹ûÁë ÁÅÁÇ 3ï3ë‹|$‹ßÁÃÁÇ3ß‹|$Áï3ß‹|$,ëƒÇøƒçl¼P‹|$</‹|$(‹ßÁËïÁÅ3Ý‹ïÁÅ3݉\$D‹ß÷Ó#Ú‹é#ï‹|$D3Ýû‹\$0{ü‹\$<;‹Þ|$|$$‰|$‹|$3߉\$8‹Þ#߉\$4‹ß‹ïÁÃÁÅ3ÝÁÇ 3ß‹|$8#|$\$3|$4û‹\$,‰|${ƒç|¼P‰|$D‹?‰|${þƒç|¼P‰|$L‹?‹ßÁËïÁï ÁÅ 3Ý3ß‹|$‹ïÁÅÁÇ3ï‹|$Áï3ï‹|$,݃Çùƒç\¼P‹|$@‹|$$‹ßÁËïÁÅ3Ý‹ïÁÅ3Ý‹l$(#ï‰\$ ‹ß‹|$ ÷Ó#Ù3Ýû‹\$0;‹\$@;‹\$ú|$‹ëÁÅ‹ÓÁÂ3ê‹ÓÁ 3ê‹T$8ï‹|$,#Ó3T$4ƒÇÕƒç|¼P‰|$8‹?‰|$‹|$<‹?‹ßÁËïÁï ÁÅ 3Ý3ß‹|$‹ïÁÅÁÇ3ï‹|$Áï3ï‹|$,݃Çúƒç\¼P‹|$D‹|$‹ßÁËïÁÅ3Ý‹ïÁÅ3Ý‹l$$#ï‰\$4‹ß‹|$4÷Ó#\$(3Ýû‹\$0{‹\$D;‹Úù÷‰|$‹úÁÇ‹ÊÁÁ3ù‹ÊÁÁ 3ù|$‹L$3Ù#\$‹ê#é3Ýß‹|$,ƒÇƒç|¼P‰|$4‹?‰|$‹|$@‹?‹Ë‹ßÁËïÁÅ ‰t$ 3ÝÁï 3ß‹|$‹ïÁÅÁÇ3ï‹|$Áï3ï‹|$,ƒÇû݃ç\¼P‹|$8‹?‰|$@‹l$‹þÁÇ‹ÞÁÃ3û#î‹ÞÁÃ3û‹Þ÷Ó#\$$3Ýû‹\$0{‹Ù|$@‹ê|$(#é|$‰|$‹ùÁÇÁÃ3û‹ÙÁà 3û|$‹Ú3Ù#\$3Ýß‹|$,ƒÇƒç|¼P‰|$@‹?‰|$‹|$D‹?‰\$(‹ß‹ïÁÃÁÅ Áï 3Ý3ß‹|$‹ïÁÅÁÇ3ï‹|$Áï3ï#t$Ý‹|$,ƒÇüƒç\¼P‹|$4‹?‹\$‹ë‰|$D‹ûÁÇÁÅ3ý‹ë÷Ó#\$ÁÅ3Þ‹t$03ýû~ ‹é|$D|$$|$‰|$‹|$(‹÷ÁÆ‹ßÁÃ3ó‹ßÁà 3ót$#ï‹Ù3ß#Ú3ÝÞ‹t$,ƒÆƒæt´P‰t$D‹6‰t$‹t$8‹6‹î‰\$$‹ÞÁÃÁî ÁÅ 3Ý3Þ‹t$‹îÁÅÁÆ3î‹t$Áî3î‹t$HÝ‹t$@‹6‹\$‰t$H‹óÁÆ‹ëÁÅ3õ‹ëÁÅ3õ‹ë#\$÷Õ#l$ 3ëõ‹\$0s‹\$$t$H‹ët$Ö‰t$‹óÁÆÁÅ3õ‹ëÁÅ 3õt$‹ï#û3ë#é3ïî‹t$,ƒÆƒæt´P‰t$H‹6‰t$‹t$4‹6‹þÁljl$‹îÁî ÁÅ 3ý3þ‹t$‹îÁÅÁÆ3î‹t$Áî3î‹t$Lý>‹t$D>‹6‹l$‰t$L‹òÁÆ‹úÁÇ3÷‹úÁÇ3÷‹ú÷×#|$#ê3ý÷‹|$0wt$Lt$ Ήt$‹t$‹þÁÇ‹îÁÅ3ý‹îÁÅ 3ý|$‹ë#Þ3î#l$(3ëï‹|$,ƒÇƒç‹|¼P‰|$‹|$@‹?‹ßÁËõ‹ïÁï ÁÅ 3Ý3ß‹|$‹ïÁÅÁÇ3ï‹|$Áï3ï‹|$<Ý‹|$H‹?‰|$L‹ùÁÇ‹ÙÁÃ3û‹ÙÁÃ3û‹Ù÷Ó#\$‹ê#é3Ýû‹\$0{‹Þ|$L|$|$(‰|$ÁËþÁÇ3ß‹þÁÇ 3ß‹|$\$ƒD$0 ‹ï3î#l$$#þ3ï‹|$,ƒÇÝoÿƒý@‰\$‰|$,Œˆùÿÿ‹¼$”‹/ë‹_Þ‹w‰_‹\$ó‹\$$‰w‹w ó‹\$(‰w ‹wó‰w‹wñ‹OÊ‹T$‰O‹Oʃ¼$œ‰/‰w‰O…•ïÿÿ^][_Ä€ÃÌÌÌÌÌÌÌÌÌÌ‹T$UW‹|$‹ê…ÿ„ÁV‹t$‹F ø;ÈsÿF$‹ÇÁèF$‹FhS‰N …Àtjn(ƒÿ@s" 8ƒù@sWRèUèÊƒÄ ~h[^_¸]û@+ØSR(Rè]ÊjUVèÒîÿÿ‹D$0j@ jU‰L$<+ûÇFhè<Ê‹l$<ƒÄ$‹ßÁë…ÛvSUVèœîÿÿÁãƒÄ ë+û…ÿtW‰~hUƒÆ(VèÊƒÄ [^_¸]ÃÌÌÌ‹D$‹L$jPQè_îÿÿƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌSV‹t$‹^hW~(Æ;€Cƒû8v ¸@+ÃPjßSè¯ÉjWV3ÛèîÿÿƒÄ¹8+ËQjßSèɶV'ˆW8¶F&ƒÇ8ˆG¶N%GˆO¶V$GˆW¶F#GˆG¶N"GˆO¶V!GGˆ¶F Gˆjƒï?WVè»íÿÿj@jWÇFhè2É‹FlƒÄ$ƒø„8ƒø tKv_^3À[Ã3ÿ©üÿÿÿ†ü‹D$‹ ¾‹ÑÁêˆ@‹ÑÁꈋÑ@Áêˆ@ˆ‹NlGÁé@;ùr×_^¸[Ë‹D$@@‹ÑÁêˆPþ@‹ÑÁêˆPþ‹ÑÁêˆPÿˆ‹N@@‹ÑÁêˆPÿ@‹ÑÁêˆPÿ@‹ÑÁêˆPÿˆ‹N@@‹ÑÁêˆPÿ@‹ÑÁêˆPÿ@‹ÑÁêˆPÿˆ‹N @‹ÑÁêˆ@‹ÑÁêˆ@‹ÑÁꈈH‹N@@‹ÑÁêˆ@‹ÑÁêˆ@‹ÑÁêˆ@ˆ‹N‹Ñ@Áêˆ@‹ÑÁêˆ@‹ÑÁꈈH‹N@@‹ÑÁꈋÑÁêˆP@‹Ñ@Áêˆ@ˆ‹NéË‹D$@@‹ÑÁêˆPþ@‹ÑÁêˆPþ‹ÑÁêˆPÿˆ‹N@@‹ÑÁêˆPÿ@‹ÑÁêˆPÿ@‹ÑÁêˆPÿˆ‹N@@‹ÑÁêˆPÿ@‹ÑÁêˆPÿ@‹ÑÁêˆPÿˆ‹N @‹ÑÁêˆ@‹ÑÁêˆ@‹ÑÁꈈH‹N@@‹ÑÁêˆ@‹ÑÁêˆ@‹ÑÁêˆ@ˆ‹N‹Ñ@Áêˆ@‹ÑÁꈋÑ@Áêˆ@ˆ‹N@‹ÑÁꈋÑ@Áêˆ@‹ÑÁꈈH_^¸[ÃÌÌÌÌÌÌÌÌÌÌÌ̸pèfÆV‹´$€3À;ðu¾Ìë‹L$x‰D$$‰D$(‰D$l‹D$|PQT$ RÇD$ØžÁÇD$Õ|6ÇD$Ýp0ÇD$9Y÷ÇD$ 1 ÀÿÇD$$XhÇD$(§ùdÇD$,¤Oú¾ÇD$|è›ûÿÿD$PVèüÿÿL$jpQèÄÿÿƒÄ‹Æ^ƒÄpÃÌÌÌÌÌÌÌÌÌ̸pè¶ÅV‹´$€3À;ðu¾¬ë‹L$x‰D$$‰D$(‰D$l‹D$|PQT$ RÇD$gæ jÇD$…®g»ÇD$rón<ÇD$:õO¥ÇD$ RQÇD$$Œh›ÇD$(«ÙƒÇD$,Íà[ÇD$| èëúÿÿD$PVèàûÿÿL$jpQèÿÿƒÄ‹Æ^ƒÄpÃÌÌÌÌÌÌÌÌÌÌé»úÿÿÌÌÌÌÌÌÌÌÌÌÌé«ûÿÿÌÌÌÌÌÌÌÌÌÌÌ‹D$3ÉÇØžÁÇ@]»ËÇ@Õ|6Ç@ *)šbÇ@Ýp0Ç@ZY‘Ç@9Y÷Ç@Øì/Ç@ 1 ÀÿÇ@$g&3gÇ@(XhÇ@,‡J´ŽÇ@0§ùdÇ@4 . ÛÇ@8¤Oú¾Ç@<HµG‰H@‰HD‰HH‰HL‰ˆÐÇ€Ô0AÃÌÌÌÌÌÌÌÌÌÌÌ‹D$3ÉÇɼóÇ@gæ jÇ@;§Ê„Ç@ …®g»Ç@+ø”þÇ@rón<Ç@ñ6_Ç@:õO¥Ç@ Ñ‚æ­Ç@$RQÇ@(l>+Ç@,Œh›Ç@0k½AûÇ@4«ÙƒÇ@8y!~Ç@<Íà[‰H@‰HD‰HH‰HL‰ˆÐÇ€Ô@AÃÌÌÌÌÌÌÌÌÌÌÌ‹‹AÊÈÃÌÌÌÌÌ̸Dè–Ã÷x苌$L‹„$H…h(…É„k(SUƒÂV‰T$\WëI‹PI‹p ‹x$‰Œ$\‹‰L$H‹H‰L$P‹H‰T$L‹P ‰L$8‹H‰T$T‹P‰L$0‹H(‰T$<‹P‰L$(‹H0‰T$4‹P,‰L$ ‹H8‰T$,‹P4‰L$‹L$`‰T$$‹P<ƒÁð‰t$@‰|$D‰T$è-ÿÿÿ‰”$¸3ɋ֋ß¤Ó ËÁ≄$´‰Œ$8‹Þ‹ï¬ë‹ÇÁè Â3Ò ÓÁí‹ÎÁá Í1Œ$83‹ދï¬ë3É Ë‹ÖÁâÁí Õ‹l$(3Á‹Œ$83ʋ֋ß÷Ò#T$ ÷Ó#\$$#î‹t$,3Õ‹l$P#÷3ÞÂË„$´‹t$0Œ$¸D$‹\$TL$"®(×ј/ŠB‰L$‹ÕðL$4‹L$H3щ”$€‹T$L3Ú‰œ$„‹Ý#Ù‰\$x‹\$T#Ú‰\$|‹ÙÁ㉜$œ‹Ù¬ÓÁê ”$œ‹T$L3í ë‹Ú¤Ê‰¬$˜3í ê1¬$œ‹l$HÁáÁë Ù1œ$˜‹L$L‹Ñ¤éÁê3Û Ù‹Œ$˜Áå Õ‹¬$„#l$<3Ê‹”$œ3l$|3Ó‹œ$€#\$8‰t$03\$xËÕÈT$‰L$‹L$`ƒÁø‰T$è‚ýÿÿ‰„$¼‰”$À‹L$43Ò‹é#|$4‹Á‹Þ¤Ý ÕÁãÁè Ã3Û‰”$P‹î¬Í Ý‹l$43ÃÁé‹ÖÁâ Ñ1”$P3ɋެë Ë‹\$4Áí3Á‹Œ$P‹ÖÁâ Õ‹l$@3Ê#î÷Ó#\$,‹Ö‹t$83ß÷Ò#T$(3Õ‹l$ÂË„$¼‹T$Œ$ÀD$ ‹úL$$Íeï#Ñ‘D7qðL$<Á牼$¨‹ú¬ï3Û ß‹|$‰œ$¤‹ß¤×Áí ¬$¨ÁâÁë Ú‹T$1œ$¤3í ï1¬$¨‹ú‰t$8Áï‹l$¤ê3Û Ú‹”$€#T$Áå3T$x ý‹¬$¨‰\$l‹œ$¤3ß‹|$l3$„#|$3|$|ÚïØé‹L$`‰\$ ‰l$$èüÿÿ‰”$È‹T$<‹Ú‰„$Ä3ɋ‹þ¤û ËÁç3ÛÁè Ç‹î¬Õ Ý‹l$<3ÃÁê‹þÁç ú3ϋެë3ÿ ûÁí‹ÖÁâ Õ‹l$03Ê‹T$<3Ç#î‹þ‹t$4÷×#|$@‹Ú#ò÷Ó#\$D3ý3ÞÇË„$ÄŒ$ÈD$(L$,/;Mì‰D$ÑÏûÀµD$P‹t$ ‰L$L$T‹L$$‹þ‹Ù¬ßÁë‹ÆÁà Ã3Û‹é¤õ Ý3Ë\$ 3Ò ×Áæ‹ùÁï þ3׋é¤Ý3ÿ ýÁã‹ñ3Ç‹|$ Áî ó3Ö‹t$H‹é3l$L#L$L#l$‹ß3Þ#\$#þ3é‹L$`3ßÓÅT$D$ƒÁ‰T$(‰D$,è·úÿÿ‹t$T‰”$ЋT$P‹Þ‹ú¤û‰„$Ì‹ÆÁçÁè Ç‹ê¬õ3É Ë‹úÁî3ÛÁç þ Ý3Ã3Ï‹ò3ÿ‹l$TÁæ‹Ú¬ë û3ÇÁí õ‹l$83΋t$T#ê‹Þ÷Ó#\$4‹ú‹T$<#Ö3Ú÷×#|$0‹t$(3ýÇË„$Ì‹þŒ$ÐD$@L$D¼Û‰Ñ¥ÛµéD$H‰L$‰D$L$L‹L$,‹Æ‹Ù¬ßÁëÁà Ã3Û‹é¤õ Ý3Ë\$(3Ò ×Áæ‹ùÁï þ3׋é¤Ý3ÿ ý‹l$$Áã‹ñÁî ó3Ç‹|$ 3Ö‹t$(‹ß3Þ#\$#þ‹t$$3é#l$#ñ3ß3îÓÅT$‹L$`D$ƒÁ‰T$@‰D$Dèfùÿÿ‹t$L‰„$Ô‰”$Ø‹T$H3ɋދú¤û ËÁç3Û‹ÆÁè Ç‹ê¬õ Ý‹l$L3ÃÁî‹úÁç þ3Ï3ÿ‹Ú¬ë û3ÇÁí‹òÁæ õ‹l$P3΋t$L#ê‹ú‹T$T÷×#|$8#Ö3ý‹Þ‹t$@÷Ó#\$<3ÚÇË„$Ô‹þŒ$ØD$0L$48µHóÑ[ÂV9D$‰L$‰D$L$‹L$D‹Ù¬ß3Ò ×‹ÆÁàÁë‹ù ÃÁï3Û‹é¤õ Ý3Ë\$@Áæ þ3׋é¤Ý3ÿ ý‹l$,Áã‹ñÁî ó3Ç‹|$(3Ö‹t$@3é#l$$‹ß3Þ#\$ #þ‹t$,#ñ‹L$`3ß3îÓÅT$D$ƒÁ‰T$0‰D$4èøÿÿ‹t$‹Þ‰”$à‹T$‰„$܋Ƌú¤ûÁç3É Ë3Û‹ê¬õ Ý‹l$Áè Ç3ÃÁî‹úÁç þ‹Ú¬ë3Ï‹ò3ÿ ûÁæÁí õ3Ç3΋t$‹ú‹Þ÷×#|$P÷Ó#\$T#T$H#t$L3ú3ÞÇË„$Ü‹t$0Œ$àD$8‹þL$<жÑññYD$ ‰L$‰D$L$$‹L$4‹Æ‹Ù¬ßÁëÁà Ã3Û‹é¤õ Ý3Ë\$03Ò ×Áæ‹ùÁï þ3׋é¤Ý3ÿ ý‹l$DÁã‹ñÁî ó3Ç‹|$@3Ö‹t$03é#l$,‹ß3Þ#\$(#þ‹t$D#ñ‹L$`3ß3îÓÅT$D$ƒÁ ‰T$8‰D$<èÈöÿÿ‹t$$‰”$è‹T$ ‹ú‹Þ¤û‰„$䋯Áè Áç3É Ç Ë3Û‹ê¬õ Ý‹l$$3ÃÁî‹úÁç þ3Ï3ÿ‹Ú¬ë û3ÇÁí‹òÁæ õ‹l$3΋t$$#ê‹ú‹T$#Ö÷×#|$H‹Þ3ý÷Ó#\$L‹t$83ÚÇË„$ä‹þŒ$èD$PL$T›O¯Ñ¤‚?’D$(‰L$‰D$L$,‹L$<‹Æ‹Ù¬ßÁëÁà Ã3Û‹é¤õ Ý3Ò ×3Ë\$8Áæ‹ùÁï þ‹é¤Ý3׋ñÁãÁî3ÿ ó ý3Ö3Ç‹|$0‹ß‹t$8‹l$43Þ#\$@3é#l$D#þ‹t$4#ñ‹L$`3ß3îÓÅT$D$ƒÁ(‰T$P‰D$Tèwõÿÿ‹t$,3ɋމ„$쉔$ð‹T$(‹Æ‹ú¤û ËÁç3ÛÁè Ç‹ê¬õ Ý‹l$,3ÃÁî‹úÁç þ3Ï3ÿ‹Ú¬ë ûÁí3Ç‹òÁæ õ‹l$ 3΋t$,#ê‹ú‹T$$#Ö‹Þ‹t$P÷×#|$÷Ó#\$3ý3ÚÇË„$ìŒ$ðD$HL$LmÚÑÕ^«D$@‰D$‰L$L$D‹Æ‹L$T‹þ‹Ù¬ßÁëÁà Ã3Û‹é¤õ Ý3Ë\$P3Ò ×Áæ‹ùÁï þ3׋é¤Ý3ÿ ý‹l$<Áã‹ñÁî ó3Ç‹|$83Ö‹t$P3é#l$4‹ß3Þ#\$0#þ‹t$<#ñ‹L$`3ß3îÓÅT$D$ƒÁ0‰T$H‰D$Lè&ôÿÿ‹t$D‹Þ‰”$ø‹T$@‹ú¤û‰„$ô‹ÆÁçÁè Ç‹ê¬õ3É Ë3ÛÁî‹úÁç Ý‹l$D þ3Ã3Ï‹ò‹Ú3ÿÁæ¬ë ûÁí õ‹l$(3΋t$D3Ç#ê‹ú‹T$,÷×#|$ #Ö3ý‹l$T‹Þ‹t$0÷Ó#\$$3Ú‹T$HÇË„$ô‹\$PŒ$øD$‹|$LL$B£Ñ˜ª؉L$ðL$4‹Ë3ʉŒ$€‹Í3ωŒ$„‹Ë#ʉL$x‹Í#Ï‹ê¬ý‰L$|‹Ê3Û ÝÁïÁá Ï‹|$L‰œ$D‹ß¤×3í ïÁâÁë Ú‹T$L1œ$D3Í‹l$H‹ú¤ê3Û Ú‹”$DÁïÁå ý3׋¼$€3Ë#|$8‹œ$„‰t$0#\$<3|$x3\$|×ËÐL$‰T$‰L$‹L$`ƒÁ8èšòÿÿ‰”$‹T$43ɋډ„$ü‹þ¤û ËÁç3ۋ‹î¬Õ Ý‹l$4Áè Ç3ÃÁê‹þÁç ú3ϋެëÁí3ÿ û‹ÖÁâ Õ‹l$@3Ê‹T$43Ç#î‹þ‹t$D#ò÷×#|$(‹Ú‹T$3ý‹l$÷Ó#\$,3Þ‹t$8ÇË„$ü‹ÚŒ$D$ L$$¾opEÑ[ƒðL$<¬ë‰L$‹Ê3ÿÁáÁí û‰t$8‰¼$<‹|$‹ß¤× ÍÁâÁë Ú1œ$<‹T$‹\$3í ï‹ú¤Ú3ÍÁïÁã û‹œ$<3í ê‹”$€#T$3ß‹¼$„#|$3T$x3|$|3ÍÚÏØL$‰\$ ‰L$$‹L$`ƒÁ@è@ñÿÿ‰”$‹T$<‹Ú‰„$‹Â‹þ¤ûÁç3É Ë3Û‹î¬Õ Ý‹l$<Áè Ç3ÃÁê‹þÁç ú‹Þ¬ë3Ï‹Ö3ÿ ûÁâÁí Õ‹l$03Ç3Ê‹T$<‹þ‹Ú÷×#|$@÷Ó#\$D#î‹t$43ý#ò3ÞÇË„$‹t$ Œ$D$(‹þL$,Œ²äNѾ…1$D$P‰L$‰D$L$T‹L$$‹Ù¬ßÁë‹ÆÁà Ã3Û‹é¤õ Ý3Ë\$ 3Ò ×Áæ‹ùÁï þ3׋é¤Ý3ÿ ýÁã‹ñ3Ç‹|$ Áî ó3Ö‹t$H‹é3l$L#L$L#l$‹ß3Þ#\$#þ3é‹L$`3ßÓÅT$D$ƒÁH‰T$(‰D$,èõïÿÿ‹t$T‰”$‹T$P‹ú‹Þ¤û‰„$ ‹ÆÁè Áç3É Ç Ë3Û‹ê¬õ Ý‹l$T3ÃÁî‹úÁç þ3Ï3ÿ‹Ú¬ë û3ÇÁí‹òÁæ õ‹l$83΋t$T#ê‹ú‹T$<#Ö÷×#|$0‹Þ3ý÷Ó#\$4‹t$(3ÚÇË„$ ‹þŒ$D$@L$Dâ´ÿÕÑÃ} UD$H‰L$‰D$L$L‹L$,‹Æ‹Ù¬ßÁëÁà Ã3Û‹é¤õ Ý3Ò ×3Ë\$(Áæ‹ùÁï þ‹é¤Ý3׋ñÁîÁã ó3ÿ ý3Ö‹t$ 3Ç‹|$(‹Þ‹l$$3ß#\$3é#l$#÷‹|$$#ù‹L$`3Þ3ïÓÅT$D$ƒÁP‰T$@‰D$Dè¤îÿÿ‹t$L3ɋމ„$‰”$‹T$H‹Æ‹ú¤û ËÁç3ÛÁè Ç‹ê¬õ Ý‹l$L3ÃÁî‹úÁç þ3Ï3ÿ‹Ú¬ë ûÁí3Ç‹òÁæ õ‹l$P3΋t$L#ê‹ú‹T$T#Ö‹Þ‹t$@÷×#|$8÷Ó#\$<3ý3ÚÇË„$Œ$D$0L$4o‰{òÑt]¾rD$‰D$‰L$L$‹Æ3É‹T$D‹þ‹Ú¬ßÁëÁà à Ï3Û‹ê¤õ Ý3Ë\$@Áæ‹úÁï þ3Ï‹ê¤ÝÁã‹òÁî ó3ÿ ý‹l$,3΋t$(3Ç‹|$@‹Þ3ß#\$ 3ê#l$$#÷‹|$,#ú3Þ3ïËÅL$D$‰L$0‹L$`ƒÁX‰D$4èSíÿÿ‹t$‹Þ‰”$ ‹T$‰„$‹Æ‹ú¤û3É ËÁç‹ê¬õ3ÛÁè Ç Ý‹l$3ÃÁî‹úÁç þ‹Ú¬ë3Ï‹ò3ÿÁæÁí û õ3Ç3΋t$‹ú#T$H÷×#|$P‹Þ#t$L3ú÷Ó#\$T3ÞÇË„$‹t$0Œ$ D$8‹þL$<±–;Ñþ±Þ€D$ ‰L$‰D$L$$‹L$4‹Æ‹Ù¬ßÁëÁà Ã3Û‹é¤õ Ý3Ë\$03Ò ×Áæ‹ùÁï þ‹é¤Ý3×Áã‹ñÁî ó3ÿ ý‹l$D3Ç‹|$03Ö‹t$@3é#l$,‹Þ3ß#\$(#÷‹|$D#ù‹L$`3Þ3ïÓÅT$D$ƒÁ`‰T$8‰D$<èìÿÿ‹t$$‹Þ‰„$$‰”$(‹T$ 3ɋƋú¤û ËÁç3ÛÁè Ç‹ê¬õ Ý‹l$$3ÃÁî‹úÁç þ3Ï3ÿ‹Ú¬ë û3ÇÁí‹òÁæ õ‹l$3΋t$$#ê‹ú‹T$#Ö÷×#|$H‹Þ‹t$83ý÷Ó#\$L3ÚÇË„$$‹þŒ$(D$PL$T5Ç%ѧÜ›D$(‰L$‰D$L$,‹L$<‹Ù¬ß‹Æ3Ò ×‹é¤õÁëÁà ËùÁæÁï3Û þ Ý3×3Ëñ‹\$8‹é¤ÝÁãÁî ó3ÿ ý‹l$43Ç‹|$83Ö‹t$03é#l$D‹Þ3ß#\$@#÷‹|$4#ù‹L$`3Þ3ïÓÅT$D$ƒÁh‰T$P‰D$Tèµêÿÿ‹t$,‹Þ‰”$0‹T$(‰„$,‹Æ‹ú¤ûÁç3É Ë3Û‹ê¬õ Ý‹l$,Áè Ç3ÃÁî‹úÁç þ‹Ú¬ë3Ï3ÿ û‹òÁíÁæ õ‹l$ 3Ç3΋t$,‹ú#ê‹T$$÷×#|$‹Þ÷Ó#\$#Ö3ý3ÚÇË„$,‹t$PŒ$0D$H‹þL$L”&iÏÑtñ›ÁD$@‰D$‰L$L$D‹L$T‹ÆÁà‹Ù¬ßÁë Ã3Û‹é¤õ Ý3Ë\$P3Ò ×Áæ‹ùÁï þ3׋é¤ÝÁã3ÿ ý‹l$<‹ñÁî ó3Ç‹|$P3Ö‹t$8‹Þ3ß#\$0#÷‹|$<3é#l$4#ù3Þ3ïÓÅT$ÇD$t(- D$‰T$H‰D$L¸‰D$p‹ÈpýxùHƒàƒá”Ì´‹ ‰”$‹R„Ä´‰T$\ƒæ‹”ô´‰„$ ´ô´‹Â‰´$°‹v‹î¬è3Û Ø‰T$d‰¼$Œ‹ú‰t$h‹Æ¤ÖÒÁèÒÒ Â‹T$d3Ø‹D$h¬ÂÁíÁç ý3í îÁè3Ú3ý3ø‹D$\‹è‰\$l‹Ù¬ë3ö ó‹Ñ‹Ù‰L$X¬ÁÁâÁíÑè Õ3í é‹L$XÁã Ø‹D$\¬ÁÁè3õ3Ó3Ћ„$Œ3ñ‹L$lÎúHƒàŒÄ´¼Ä¸‹„$ ‹T$@‹t$Dx‹ú3ɋޤû ËÁç‹ê‹Æ¬õ3Û Ý‹l$DÁè Ç3ËúÁç‹Ú¬ëÁî þ3Ï‹ò3ÿ ûÁæÁí õ‹l$(3Ç3΋t$D#ê‹ú‹T$,#Ö‹Þ‹t$P÷×#|$ ÷Ó#\$$3ý3Ú‹T$tÇËBø‹|$TJü‹”$ JD$‹×L$D$0‰D$‰L$L$4‹L$H‹Æ3Á‰„$€‹D$L3Љ”$„‹Ö#щT$x‹×#ЉT$|‹Ñ3ö‹ùÁâ‹Ø¬ßÁë Ó ÷3Û‹è¤ÍÁá Ý3Ó‹\$H‹øÁï ù3÷‹È¤ØÁéÁã Ë3ñ‹Œ$„#L$<3ÿ3L$| ø‹„$€#D$83×3D$xðÑt$T$3ÿ‰T$‹T$pJƒá‹„Ì´ŒÌ´ƒÂþ‰Œ$”‹Iƒâ‰L$\‹ŒÔ´”Ô´‰”$¬‹R‹Ù‹ê¬ë‰L$d û‰t$‹ñ‰T$h‹Ú¤ÊÉÁíÁæ É õÉÁë3í Ù‹L$h ê‹T$d¬Ê3û3õÁé‰D$X3ú3ñ‹L$\‰|$l3ÿ‹é‹Ø¬ë ûÁí‹Ð‹Ø¬ÈÁâ ÕÁãÑé Ù‹L$X3í è‹D$\3ý¬Á3ù‹L$l3ÓÁè3Ћ„$ŒÏòƒàŒÄ´´Ä¸‹„$p‹D$0‹t$4‹Þ‹Î‹ø¤ûÁç‹è¬õ3Ò Ó3Û Ý‹l$4Áé Ï3ËÁî‹øÁç þ‹Ø¬ë3׋ð3ÿ ûÁíÁæ õ‹l$@3Ï3Ö‹t$4‹ø÷×#|$(#è‹D$D‹Þ÷Ó#\$,#Æ3ý3Ø‹D$tÏÓPL$ ‹„$T$$PL$8‹D$‰T$T$<‹T$‹Ø‹ê¬ë3ÿ û‹ðÁí‹Ú¤ÂÁæ õ3í êÁà3õ‹l$Áë Ø‹D$‹Ð¤è3ûÁê3Û Ø‹„$€#D$Áå3D$x Õ3ú‹”$„#T$3ó3T$|ø‹D$pò‹”$ ùt$Hƒá‹„Ì´ŒÌ´‰L$l‹I‰L$\‹ ‹R‹Ù‹ê¬ë‰t$$‰|$ ‹ñ3ÿÁæ Áí û‰D$X‰L$d‰T$h õ‹Ú¤ÊÉÉÁëÉ Ù‹L$h3û3í ê‹T$d¬Ê3õ3úÁé3ñ‹L$\‹Ø‹é¬ë‰¼$ˆ3ÿ û‹Ð‹Ø¬ÈÁíÁâ ÕÁãÑé Ù‹L$X3í è‹D$\¬Á3ý3ù‹Œ$ˆÁè3Ó3Ћ„$ŒÏò‹T$8@ƒàŒÄ´‹ú´Ä¸‹„$”‹êp‹t$<‹Þ¤û‹Æ¬õ3É ËÁç3ÛÁè Ç Ý‹l$<3ÃÁî‹úÁç þ‹Ú¬ë3Ï‹ò3ÿÁæÁí û õ‹l$03΋t$<#ê3Ç‹ú‹T$4#Ö‹Þ÷Ó#\$D÷×#|$@3Ú‹T$t3ýÇËBJ ‹”$”JD$(L$,D$P‰L$‰D$L$T‹D$$‹L$ ‹Ñ‹ñ‹Ø¬ÚÁëÁæ ó3Û‹è¤Í Ý3ó‹\$ 3ÿ úÁá‹ÐÁê Ñ‹è¤ÝÁã3ú‹ÈÁé Ë3Ò Õ3ù‹L$ 3ò‹T$H‹Ù3Ú#\$‹è3l$L#D$L#l$#Ê3Ù3èûõ|$t$‰|$(‰t$,‹D$p‹”$Hƒá‹„Ì´ŒÌ´‰Œ$Œ‹I‰L$\‹ ‹R‹Ù‹ê¬ë‰L$d‹ñ3ÿ û‰T$h‹Ú¤ÊÉÁíÉÁæ õÉÁë Ù‹L$h3í ê‹T$d¬Ê3õÁé3ñ‹L$\3û3ú‹Ø‹é¬ë‰D$X‹Ð‰¼$ˆ3ÿ û‹Ø¬ÈÁâÁí ÕÑé3í è‹D$\Áã Ù‹L$X¬ÁÁè3ý3Ó3ЋD$p3ù‹Œ$ˆÏòƒÀûƒàŒÄ´´Ä¸‹D$lp‹t$T‹ÆÁè 3É‹T$P‹ú‹Þ¤û ËÁç Ç3Û‹ê¬õ Ý‹l$T3ÃÁî‹úÁç þ3ϋڬë‹ò3ÿ ûÁæÁí õ‹l$83΋t$T#ê3Ç‹ú‹T$<#Ö‹Þ÷Ó#\$4÷×#|$03Ú‹T$t3ýÇËBJ‹T$lJD$@L$DD$H‰L$‰D$L$L‹D$,‹L$(‹Ñ‹ñ‹Ø¬Ú3ÿ ú‹è¤ÍÁëÁæ óÁá‹ÐÁê3Û Ñ Ý‹È3ó‹\$(3úÁé3Ò‹è¤Ý Õ‹l$$3ò‹T$ Áã Ë3ù‹L$(3è#l$‹Ú3Ù#\$#Ñ‹L$$3Ú‹T$p#È3éûõ|$Jt$‹”$”ƒá‹„Ì´ŒÌ´‰Œ$‹I‰L$\‹ ‹R‹Ù‹ê¬ë‰|$@‰L$d3ÿ û‰T$h‹Ú‰t$D‹ñ¤ÊÁíÉÉÁæ õÁë3í ê‹T$dÉ Ù‹L$h¬Ê3õ3ûÁé3ñ‹L$\3ú‹é‹Ø¬ë‰¼$ˆ3ÿ û‹Ð‹Ø‰D$XÁíÁâ¬È Õ3íÁãÑé Ù‹L$X è‹D$\¬Á3ý3ù‹Œ$ˆ3ÓÁè3ЋD$pÏò‹T$HƒÀüƒàŒÄ´‹ú´Ä¸‹„$Œ‹êp‹t$L3ɋޤû ËÁç3ۋƬõ Ý‹l$LÁè Ç3ÃÁî‹úÁç þ3ϋڬë3ÿ ûÁí‹òÁæ õ‹l$P3΋t$L3Ç#ê‹ú‹T$T#Ö÷×#|$8‹Þ÷Ó#\$<3ý3Ú‹T$tÇËBJ‹”$ŒJD$0L$4D$‰L$‰D$L$‹L$@‹D$D‹Ñ‹ñÁæ‹Ø¬ÚÁë ó3Û3ÿ ú‹è¤Í Ý3ó‹\$@Áá‹ÐÁê Ñ3ú3Ò‹è¤Ý Õ‹l$,Áã3ò‹T$(‹ÈÁé Ë3ù‹L$@3è#l$$‹Ú3Ù#\$ #Ñ‹L$,#È3é3Ú‹T$pûõ|$Jt$‹T$lƒá‹„Ì´ŒÌ´‰Œ$”‹I‰L$\‹ ‹R‹Ù‹ê¬ë‰|$03ÿ‰t$4‹ñ‰L$d û‹Ú‰T$h¤ÊÉÁíÁæ É õÁëÉ3í‰D$X Ù‹L$h ê‹T$d3û3õ¬Ê3úÁé3ñ‹L$\‹é‰¼$ˆ3ÿ‹Ø¬ë û‹Ð‹Ø¬ÈÁíÁãÁâ ÕÑé Ù‹L$X3í è‹D$\3ý¬Á3ù‹Œ$ˆ3ÓÁè3Ћ„$°Ïò‹T$p‹„$‹ú‹êp‹t$‹Þ¤û‹Æ¬õÁç3É Ë3Û Ý‹l$Áè Ç3ÃÁî‹úÁç þ‹Ú¬ë3Ï3ÿ û‹òÁæÁí õ3Ç3΋t$‹ú‹Þ÷×÷Ó#T$H#\$T#t$L#|$P3Þ3ú‹T$tÇËB J$‹”$JD$8L$<D$ ‰L$‰D$L$$‹D$4‹L$0‹Ñ‹ñ‹Ø¬ÚÁëÁæ ó3Û‹è¤Í Ý3ó‹\$0Áá3ÿ ú‹ÐÁê Ñ3ú3Ò‹è¤Ý Õ‹l$DÁã3ò‹T$@‹ÈÁé Ë3ù‹L$0‹Ú3Ù#\$(#Ñ‹L$D3è#l$,#È3é3Ú‹T$pûõ|$Jt$‹”$Œƒá‹„Ì´ŒÌ´‰L$l‹I‰|$8‰t$<‰D$X‰L$\‹ ‹R‹Ù3ÿ‹ê¬ë û‰L$d‹ñ‰T$h‹Ú¤ÊÉÉÁíÉÁæ õÁë Ù‹L$h3í ê‹T$d¬Ê3û3õÁé3ú3ñ‹L$\‹é‹Ø¬ë‰¼$°3ÿ û‹Ð‹Ø¬ÈÁâÁí ÕÑéÁã Ù‹L$X3í è‹D$\¬Á3ý3ù‹Œ$°Áè3Ó3Ћ„$¬Ïò‹T$ p‹„$”‹ú‹êp‹t$$‹Þ¤û‹ÆÁçÁè Ç3É Ë‹ú3ÛÁç¬õ Ý‹l$$3ÃÁî þ3ϋڬë‹ò3ÿ ûÁíÁæ õ‹l$3΋t$$#ê3Ç‹ú‹T$#Ö‹Þ÷Ó#\$L÷×#|$H3Ú‹T$t3ýÇËB(J,‹”$”JD$PL$TD$(‰L$‰D$L$,‹D$<‹L$8‹Ñ‹ñ‹Ø¬ÚÁëÁæ ó3Û‹è¤Í Ý3ÿ ú3ó‹\$8Áá‹ÐÁê Ñ3ú‹è¤Ý3ÒÁã Õ‹l$4‹ÈÁé Ë3ò‹T$03ù‹L$8‹Ú3Ù3è#\$@#l$D#Ñ‹L$4#È3é‹L$p3Úûõ|$t$ƒÁƒá‹”̸‹„Ì´‰T$\‹”$‹ ‹R‹Ù‹ê¬ë‰L$d‰|$P3ÿ û‰T$h‹Ú‰t$T‹ñ¤ÊÉÁíÉÉÁæ õÁë Ù‹L$h3í ê‹T$d¬ÊÁé3û3õ3ñ‹L$\3ú‹é‹Ø¬ë‰¼$¬3ÿ û‰D$X‹Ð‹Ø¬ÈÁâÁí ÕÑé3í è‹D$\Áã Ù‹L$X¬Á3ýÁè3Ó3ù‹Œ$¬3Ћ„$ Ïò‹T$(p‹D$l‹ú‹êp‹t$,‹Þ¤ûÁç3É Ë3ۋƬõ Ý‹l$,Áè Ç3ÃÁî‹úÁç þ3ϋڬë3ÿ û‹òÁæÁí õ‹l$ 3΋t$,3Ç#ê‹ú‹T$$#Ö‹Þ÷Ó#\$÷×#|$3Ú‹T$t3ýÇËB0J4‹T$lJD$HL$LD$@‰D$‹D$PL$D‰L$‹L$T‹Ð‹Ù¬Ú‹ð3ÿ‹éÁë úÁæ¤Å ó‹ÑÁê3ÛÁà Ý Ð3ó‹\$P3ú3Ò‹é¤Ý Õ‹l$<Áã3ò‹T$8‹ÁÁè Ã3ø‹D$P‹Ú3Ø#\$0#ЋD$<3é#l$4#Á3è‹D$p3Úûõ|$t$ƒD$t@ƒÀ‹×xÿƒÿP‰T$H‰t$L‰D$pŒŠîÿÿ‹„$X‹T$PpP‹T$<H ‹L$8H‹L$0PH‹T$4‹L$@PH ‹T$D‹L$(P$H(‹T$,‹L$ P,H0‹T$$‹L$P4H8‹T$‹Œ$\P<ƒl$`€…É…»×ÿÿ_^][ÄDÃQRPèÁƒÄ ÄDÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌSV‹t$‹žÐW~PÆ;€Cƒûpv!¸€+ÃPjßSèL›jV‹×3Ûè×ÿÿƒÄ¹p+ËQjßSè+›¶V@ˆW‹F@‹ND¬ÈˆG~‹V@‹FD¬ÂˆW}‹VDÁé‹N@¬ÑˆO|Áè‹F@Áê‹VDƒÄ ± è,›ˆG{‹F@‹VD±(蛈Gz¶FFˆGy¶NGˆOx¶VHˆWw‹FH‹NL¬ÈˆGv‹VH‹FL¬ÂˆWu‹VLÁé‹NH¬ÑˆOtÁè‹FHÁê‹VL± èÇšˆGs‹FH‹VL±(è·šˆGr¶FNˆGq¶NOjV‹×ˆOpè,Öÿÿ‹D$ƒÄ…Àu_^3À[ËŽÔƒù0„aƒù@uæƒÆyÂU‹Nô‹Vð@‹ÙÁëˆXÿ@@‹ÙÁëˆXþ‹ÙÁëˆXÿ@‹ÙˆXÿ‹é‹Ú¬ëˆÁí@‹é‹Ú¬ëˆ@@‹Ú¬ËˆXÿˆ‹Vø@Áé‹Nü‹ÙÁëˆ@‹ÙÁëˆ@‹ÙÁëˆ@Áí‹Ùˆ‹é@‹Ú¬ëˆÁí‹é‹Ú¬ëˆX@‹Ú¬ËˆX@@ˆ‹Áé‹N@‹ÙÁëˆ@‹ÙÁíÁëˆ@@‹ÙÁëˆXÿ@‹ÙˆXÿ‹é‹Ú¬ëˆÁí@‹é‹Ú¬ëˆ@@‹Ú¬ËˆXÿˆ‹V@Áé‹N ‹ÙÁëˆ@‹ÙÁëˆ@‹ÙÁëˆ@Áí‹Ùˆ‹é@‹Ú¬ëˆÁí‹é‹Ú¬ë@ˆ‹Ú¬Ë@ˆ@ˆÁíÁé@ƒÆ ƒï…³þÿÿ]G_^[ËN‹@‹ÙÁëˆXÿ@@‹ÙÁëˆXþ‹ÙÁëˆXÿ@‹ÙˆXÿ‹ù‹Ú¬ûˆÁï@‹ù‹Ú¬ûˆ@@‹Ú¬ËˆXÿˆ‹V@Áé‹N ‹ÙÁëˆ@‹ÙÁëˆ@‹ÙÁëˆ@Áï‹Ùˆ‹ù@‹Ú¬ûˆÁï‹ù‹Ú¬ûˆX@‹Ú¬ËˆX@@ˆ‹VÁé‹N@‹ÙÁëˆ@‹ÙÁïÁëˆ@@‹ÙÁëˆXÿ@‹ÙˆXÿ‹ù‹Ú¬ûˆÁï@‹ù‹Ú¬ûˆ@@‹Ú¬ËˆXÿˆ‹V@Áé‹N@‹ÙÁëˆXÿ@‹ÙÁëˆXÿ@‹ÙÁëˆXÿÁï‹Ùˆ@‹ù‹Ú¬ûˆÁï@‹ù‹Ú¬ûˆ@‹Ú¬ËˆˆP‹V @Áé‹N$@‹ÙÁëˆ@‹ÙÁëˆ@‹ÙÁëˆ@‹ÙˆÁï@‹Ú‹ù¬ûˆ‹ÚÁï@‹ù¬ûˆ‹Ú@¬ËˆˆP@@Áé‹N(‹v,‹ÖÁêˆ@‹ÖÁêˆ@‹ÖÁêˆÁï@‹Öˆ‹þ‹Ñ¬úˆP@Áï‹þ‹Ñ¬úˆP@‹Ñ¬ò@Áï_Áîˆ^ˆH¸[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌé[ûÿÿÌÌÌÌÌÌÌÌÌÌÌ‹D$UV‹t$ W‹|$nP‰D$…ÿ„É‹ND‹Çº÷âS‹^@ÃÑ;Ñwr;ÃsƒFHƒVL‰F@‹†Ð‰VD…ÀtY»€+ØÅ;ûs‹L$WQPèU–ƒÄ ¾Ð[_^¸]ËT$SRPè6–‹D$$j+ûV‹ÕdžÐØèøÑÿÿƒÄë‹\$ÿ€r‹ÏÁéQV‹ÓèÙÑÿÿ߃çƒÄ+ß…ÿtWSUèå•ƒÄ ‰¾Ð[_^¸]Ãé ÿÿÿÌÌÌÌÌÌÌÌÌÌÌ‹D$‹T$jPèÑÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌ̸Üè•¡Àç3ĉ„$Ø‹”$àV‹´$ì…öu¾(ìD$PèöÏÿÿ‹Œ$ìQRT$Rè“þÿÿD$PVèØùÿÿL$hØQè©lÿÿ‹Œ$üƒÄ ‹Æ^3ÌèДÄÜÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸Ü膔¡Àç3ĉ„$Ø‹”$àV‹´$ì…öu¾èëD$PèÐÿÿ‹Œ$ìQRT$RèþÿÿD$PVèHùÿÿL$hØQèlÿÿ‹Œ$üƒÄ ‹Æ^3Ìè@”ÄÜÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸Œèö“¡Àç3ĉ„$ˆ‹„$ ‹Œ$”S‹œ$ UV‹´$œ‰D$ 3ÀW‰L$…Ût ¸‰ë‹…É„¿Sèáõ‹øƒÄÿ€~h`/ jThH/ èc_ÿÿƒÄ ‹¬$¨;ý}.‹L$Q~SWè¦|‹T$ URWè*}n4UF8PWè,}ƒÄ$ë;ý€vh / j^hH/ è_ÿÿƒÄ ‹L$UQV8Rèž“‹„$´n4ƒÄ ‰E‹mý€t¹€+ÍQT.8jRèu“ƒÄ ë…Àtw3À‹ÿŠL8€ñ6ˆL@=€|í‹l$U~SWèþ{SèøôPT$,RWè||ƒÄ3À¤$ŠL8€ñ\ˆL@=€|íU~$SWèÂ{Sè¼ôPT$,RWè@|ƒÄFPƒÆVè}‹Œ$ ƒÄ_^][3Ìèv’ÄŒÃÌÌÌÌ‹T$ƒÂ‰T$é|¸Hè&’¡Àç3ĉD$DS‹\$TU‹l$\VW‹|$\‹PèCôL$QT$RwVèÐ{ƒÇ$WVè}‹D$(PL$0QVè¦{USVè®{‹Œ$„ƒÄ0_^][3Ìè䑃ÄHÃÌÌÌÌÌV‹t$FPèÒyN$QèÉyƒÆVèÀyƒÄ ^ÃÌÌÌÌÌÌÌÌÌÌÌV‹t$FPèÒ{N$QèÉ{VRèÀ{h¸jVèÛ‘ƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$ W‹|$ GVPèÌÏO$VQèÂÏVƒÇWè¸ÏƒÄ_^ÃÌÌS‹\$V‹t$W‹|$…öt"…ÛtGPè yO$QèyWRèyƒÄ ‹D$jSPVWèÌüÿÿƒÄ_^[ÃÌÌÌÌ̸Àè¶¡Àç3ĉ„$¼‹„$ÜS‹œ$ÌU‹¬$ØV‹´$äW‹¼$Ô‰D$…öu¾XìL$(QèšxT$¡ëÙnÁÆt$Áà ‰\$‹ú3þ#û‹\$3ú|$,¼ܼÁÇ |$tÁ ‹Þ3ß#Ú3Þ\$P‰T$‹T$t”ܼÁ T$ÁÆ ‹ß3Ú#Þ3ß\$T‰t$‹t$´3ܼÁÆt$ÁÇ ‹Ú3Þ#ß3Ú\$$‰|$‹|$¼;ܼÁÇ|$Á ‹ß3Þ#Ú3Þ݉T$t‹T$”ܼÁÂT$ÁÆ ‹ß3Ú#Þ3ß\$4‰t$‹t$´3ܼÁÆt$tÁÇ ‹Ú3Þ#߉|$3Ú\$ ‹|$t¼;ܼÁÇ |$Á ‹Þ3ß#Ú3Þ\$(‰T$‹T$”ܼÁÂT$ÁÆ ‹ß3Ú#Þ3ß\$D‰t$‹t$´3ܼÁÆ t$ÁÇ ‹Þ3Ú#ß3Ú\$L‰|$t‹|$¼;ܼÁÇ|$Á ‹Þ3ß#Ú3Þ\$8‰T$‹T$”ܼÁÂT$tÁÆ ‹ß3Ú#Þ3ßÙ‰t$‹t$t´3ܼÁÆt$ÁÇ ‹Ú3Þ#ß3Ú\$H‰|$‹|$¼;ܼÁÇ|$Á ‹Þ3ß#Ú3Þ\$0‰T$‹T$”ܼÁÂT$ÁÆ ‹Ú3ß#Þ3ß\$<‰t$t‹t$´3ܼÁÆt$ÁÇ ‹Ú3Þ#ß3Ú\$@‰|$‹|$¼;ܼÁÇ |$t‹\$tÁ ‰T$÷Ò Ö3×T$(”NýS©‹\$Á ÓÁÆ ‰t$÷Ö ÷3òõ´NýS©‹\$ÁÆt$ÁÇ ‰|$÷× ú3þ|$0¼NýS©‹\$ÁÇ|$Á ‰T$t÷Ò Ö3×T$P”NýS©‹\$Á T$ÁÆ ‰t$÷Ö ÷3òt$8´NýS©‹\$tÁÆt$tÁÇ ‰|$÷× ú3þ|$ ¼NýS©ÁÇ|$Á ‹\$‰T$÷Ò Ö3×T$@”NýS©Á T$ÁÆ ‹\$‰t$÷Ö ÷3òt$$´NýS©ÁÆ t$‹\$ÁÇ ‰|$t÷× ú3þ|$H¼NýS©‹\$ÁÇ|$Á ‰T$÷Ò Ö3×T$,”NýS©‹\$tÁ T$tÁÆ ‰t$÷Ö ÷3òt$L´NýS©‹\$ÁÆ t$ÁÇ ‰|$÷× ú3þ|$4¼NýS©‹\$ÁÇ|$Á ‰T$÷Ò Ö3×T$T”NýS©‹\$Á T$ÁÆ ‰t$t÷Ö ÷3òt$<´NýS©ÁÆ‹\$óÁÇ ‰|$÷× ú3þù¼NýS©‹\$tÁÇûÁ ‰T$÷Ò Ö3×T$D‰|$X”NýS©‹\$ÁÂÓÁÆ ‰T$h‹T$‰T$`‰t$\‹t$p‹V ‰T$‹ú‹V÷× ú‰T$t‹T$0‰\$d‹^3û>‹v”æ‹¢P‹|$tÁÂÖÁÇ ‰|$÷× û3ú|$H´7æ‹¢PÁÆ t$‹û‹\$ÁÇ ‰|$t÷× ú3þ|$8¼æ‹¢P‹\$ÁÇ ûÁ ‰T$÷Ò Ö3×Ք拢P‹\$tÁ ÓÁÆ ‰t$÷Ö ÷3òt$P´æ‹¢P‹\$ÁÆ óÁÇ ‰|$÷× ú3þ|$@¼æ‹¢P‹\$ÁÇûÁ ‰T$÷Ò Ö3×T$T”æ‹¢P‹\$ÁÂÓÁÆ ‰t$t÷Ö ÷3òt$(´æ‹¢P‹\$ÁÆóÁÇ ‰|$÷× ú3þ|$D¼æ‹¢P‹\$tÁÇûÁ ‰T$÷Ò Ö3×T$<”æ‹¢P‹\$ÁÂÓÁÆ ‰t$÷Ö ÷3òñ´æ‹¢P‹\$ÁÆóÁÇ ‰|$÷× ú3þ|$4¼æ‹¢P‹\$ÁÇ ûÁ ‰T$t÷Ò Ö3×T$,œæ‹¢PÁËT$ÚÁÆ ‰t$÷Ö ÷3ót$$´æ‹¢P‹T$tÁÆòÁÇ ‰|$÷× û3þ|$L‰t$”æ‹¢P‹|$Á ×Áà ‰\$÷Ó Þ3Ú\$ ´;æ‹¢P‹|$ÁÆt$ÁÇ ‹Ú3Þ#ß3Ú\$<‰|$‹|$¼;$ÑM\ÁÇ |$Á ‹ß3Þ#Ú3Þ\$T‰T$t‹T$”$ÑM\Á T$ÁÆ ‹ß3Ú#Þ3ß\$L‰t$‹t$´3$ÑM\ÁÆt$tÁÇ ‹Ú3Þ#ß3Ú\$8‰|$‹|$t¼;$ÑM\ÁÇ|$Á ‹Þ3ß#Ú3Þ݉T$‹T$”$ÑM\Á T$ÁÆ ‹ß3Ú#Þ3ß\$D‰t$‹t$´3$ÑM\ÁÆt$ÁÇ ‹Þ3Ú#ß3Ú\$0‰|$t‹|$¼;$ÑM\ÁÇ |$Á ‹Þ3ß#Ú3Þ\$$‰T$‹T$”$ÑM\Á T$tÁÆ ‹ß3Ú#Þ3ß\$H‰t$‹t$t´3$ÑM\ÁÆt$ÁÇ ‹Ú3Þ#ß3ÚÙ‰|$‹|$¼;$ÑM\ÁÇ|$Á ‹Þ3ß#Ú3Þ\$4‰T$‹T$”$ÑM\Á T$ÁÆ ‹Ú3߉t$t#Þ3ß\$ ‹t$´3$ÑM\ÁÆt$ÁÇ ‹Ú3Þ#ß3Ú\$(‰|$‹|$¼;$ÑM\ÁÇ|$tÁ ‹Þ3ß#Ú3Þ\$P‰T$‹T$t”$ÑM\ÁÂT$ÁÆ ‹ß3Ú#Þ3ß\$,‰t$‹t$´3$ÑM\ÁÆ t$ÁÇ ‹Ú3Þ#ß3Ú\$@‰|$‹|$¼;$ÑM\ÁÇ |$Á ‹Þ÷Ó ß3ÚÙ‰T$t‹T$”ó>pmÁ T$ÁÆ ‹ß÷Ó Ú3Þ\$0‰t$‹t$´3ó>pmÁÆt$tÁÇ ‹Ú÷Ó Þ3ß\$,‰|$‹|$t¼;ó>pmÁÇ|$Á ‹Þ÷Ó ß3Ú\$L‰T$‹T$”ó>pmÁ T$ÁÆ ‹ß÷Ó Ú3Þ\$8‰t$‹t$´3ó>pmÁÆt$ÁÇ ‹Ú÷Ó Þ3ß\$H‰|$t‹|$¼;ó>pmÁÇ|$Á ‹Þ÷Ó ß3Ú\$<‰T$‹T$”ó>pmÁÂT$tÁÆ ‹ß÷Ó Ú3Þ\$P‰t$‹t$t´3ó>pmÁÆt$‹Ú÷Ó ÞÁÇ 3ß\$T‰|$‹|$¼;ó>pmÁÇ |$Á ‹Þ÷Ó ß3Ú\$4‰T$‹T$”ó>pmÁ T$ÁÆ ‰t$t‹ß÷Ó Ú3Þ\$ ‹t$´3ó>pmÁÆt$ÁÇ ‹Ú÷Ó Þ3ß\$@‰|$‹|$¼;ó>pmÁÇ|$tÁ ‹Þ÷Ó ß3Ú\$$‰T$‹T$t”ó>pmÁ T$ÁÆ ‹ß÷Ó Ú3Þ݉t$‹t$´3ó>pmÁÆ t$ÁÇ ‹Ú÷Ó Þ3ß\$(‰|$‹|$¼;ó>pmÁÇ|$Á ‹Þ÷Ó ß3Ú\$D‰T$t‹T$”ó>pmÁÂT$ÁÆ ‹ß3Þ#Ú3Þ\$4‰t$‹t$´3évmzÁÆt$tÁÇ ‹ß3Ú#Þ‰|$3ß\$<‹|$t¼;évmzÁÇ|$Á ‹Ú3Þ#ß3Ú\$(‰T$‹T$”évmzÁÂT$ÁÆ ‹Þ3ß#Ú3Þ\$,‰t$‹t$´3évmzÁÆ t$ÁÇ ‹ß3Ú#Þ3ß\$L‰|$t‹|$¼;évmzÁÇ|$Á ‹Þ3Ú#ß3Ú\$T‰T$‹T$”évmzÁÂT$tÁÆ ‹Þ3ß#Ú3ÞÙ‰t$‹t$t´3évmzÁÆt$ÁÇ ‹ß3Ú#Þ3ß݉|$‹|$¼;évmzÁÇ|$Á ‹Ú3Þ#ß3Ú\$0‰T$‹T$”évmzÁÂT$ÁÆ ‹Þ3ß#Ú3Þ\$ ‰t$t‹t$´3évmzÁÆ t$ÁÇ ‹Ú3ß#Þ3ß\$@‰|$‹|$¼;évmzÁÇ |$tÁ ‹Ú3Þ#ß3Ú\$D‰T$‹T$t”évmzÁ T$ÁÆ ‹Þ3ß#Ú3Þ\$P‰t$‹t$´3évmzÁÆ t$ÁÇ ‹ß3Ú#Þ3ß\$8‰|$‹|$¼;évmzÁÇ|$Á ‹Ú3Þ#ß3Ú\$$‰T$t‹T$œévmzÁÃ\$ÁÆ ‹×3Ö#Ó3ÖT$H‰t$‹t$´2évmzÁÆt$tÁÇ ‰t$‹×3Ó3ÖT$ T$tÁÂT$Áà ‰\$‹ó‹\$3ó3òñt$ÁÆ÷Áà ‹Ë3Ê3ÎL$$‰\$ÏÁÁ L$Á ‹ù3ú3þ|$(|$ÁÇ ûÁÆ ‹Ù3ß3Þ\$,\$Áà ÚÁÁ ‰L$3Ï3ËL$0ÊÁÁÎÁÇ ‹×3Ó3ÑT$4ÖÁÂT$Áà ‹ó3ñ3òt$8t$ÁÆ÷ÁÁ ‰L$t‹Î3L$t3ÊL$<ÏÁÁËÁ ‹þ3ù3ú|$@‰T$ûÁÇ |$tÁÆ ‹Þ3Ù3ß\$D‰t$\$tÁÃÚÁÁ ‹Ñ3×3ÓT$H‰L$T$ÁÂÖÁÇ ‹÷3ó3òõt$ÁÆñÁà ‹Î3Ë3ÊL$L‹îL$ÁÁ Ï3éÁ 3êl$PïÁÅ ëÁÆ ‹þ3ù3ý|$Tû‹\$pÁÇ úÁÁ K‹[L$X‰L$‹L$\ÙÞ‹t$p‹N ‰^‹\$`ËÊ‹T$d‰N‹NÊ‹T$hωN ‹Ê̓|$x‰N‹L$‰…Ôçÿÿ_^][ƒÄ\ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹T$UW‹|$‹ê…ÿ„ÁV‹t$‹F ø;ÈsÿF‹ÇÁèF‹F\S‰N…Àtjnƒÿ@s" 8ƒù@sWRèUè?wƒÄ ~\[^_¸]û@+ØSR(RèwjUVè"çÿÿ‹D$0j@ jU‰L$<+ûÇF\èüv‹l$<ƒÄ$‹ßÁë…ÛvSUVèìæÿÿÁãƒÄ ë+û…ÿtW‰~\UƒÆVèÂvƒÄ [^_¸]ÃÌÌÌ‹D$‹L$jPQè¯æÿÿƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌSVW‹|$‹_\wÆ3€Cƒû8v ¸@+ÃPjÞSèovjVW3ÛèlæÿÿƒÄ¹8+ËQjÞSèOv¶WˆV8¶GƒÆ8ˆF¶OFˆN¶WFˆV¶GFˆF¶OFˆN¶WFFˆ¶GFˆjƒî?VWè æÿÿj@jVÇG\èòu‹‹D$4ˆ@‹ÑÁêˆ@‹ÑÁêˆ@Á鈋OˆH@@‹ÑÁêˆ@‹ÑÁêˆ@Á鈋O@ˆ@‹ÑÁêˆ@‹ÑƒÄ$Áêˆ@Á鈋O ˆH@@‹ÑÁêˆ@‹ÑÁêˆ@Á鈋OˆH@‹Ñ@ÁꈋÑ@_ÁêˆÁé^ˆH¸[ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸`è¶tV‹t$p…öu¾˜ìD$PèîäÿÿƒÄ…Àu^ƒÄ`ËL$l‹T$hQRD$ PènýÿÿL$QVècþÿÿT$j`RèWLÿÿƒÄ‹Æ^ƒÄ`ÃÌÌÌÌÌÌÌÌÌÌÌÌ̃= t2h$0 h 0 h0 h0 h0 j h¬ìèòσÄÇ ¸¬ìÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸ÌìÃÌÌÌÌÌÌÌÌÌÌ‹D$¶¶‘00 ¶Hˆ¶‘00 ¶HˆP¶‘00 ¶HˆP¶‘00 ¶HˆP¶‘00 ¶HˆP¶‘00 ¶HˆP¶‘00 ¶HˆP¶‘00 ˆPÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$3ÉVë¤$жð:†00 u Aƒùrì¸^Ã3À^ÃÌSVW‹|$º01 3ö+×¹‹Çƒùr‹;uƒéƒÀëìFƒÂƒþ|Ü_^3À[Ã_^¸[ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸èær‹T$¶ SUVr¶FFFÁâ ʶVþFFÁâ ʶVýW¶~ÿÁâ ʶVþÁç ×¶~¶6Áç þÁç ׋òÁî3ñæ3ÎÁæ3Ö‹ñÁæ3ñæÌÌ‹þÁï3þ‹òÁæ3òæÌÌ3Ï‹þÁï3þ3׋òÑî3ñæUUUU3Îö3Ö‹D$‹ñÁî3òæÿÿ3ÖÁæ3΋òÑî3ñæUUUU3Îö3Ö‹úÁï çð‹ñæð þ¶òÁïÁæâÿ þ úº,áÿÿÿ‰T$ƒzü‹ñ‹ßtÁæÁéÁãÁïë ÁæÑéÁãÑï ß ñæÿÿÿ‹ÖÑê‹Êá‹þçÀ ÏÑé‹þç Ï‹úçÁé‹ °4 ‰T$â‹îåà ýÁï ½°3 ‹þçÀ ×Áê •°2 ãÿÿÿ‹Öƒâ? •°1 ‹ÓÑê‹úç‰T$‹ëåà ý‹êÁïå‹Ó†ꋽ°8 Áí ­°6 ‹ûÁïƒç? ½°7 ‹ûƒç? ½°5 ·ù‹êÁå ýÁéÁÏâÿÿ‰8ƒÀ ÊÁɉ‹L$ƒÀƒ9t‹þ‹ëÁçÁîÁåÁë þ ëëÁæ t$Áã \$‹þ‹ëçÿÿÿ‹×Ñê‹Êá‹÷æÀ ÎÑé‹÷æ ΋òæÁé‹ °4 ‰T$â‹ßãà óÁî µ°3 ‹÷æÀ ÖÁê •°2 åÿÿÿ‹×ƒâ? •°1 ‹ÕÑê‹òæ‰T$‹Ýãà ó‹ÚÁîã‹Õ†ڋµ°8 Áë °6 ‹õÁîƒæ? µ°7 ‹õƒæ? µ°5 ·ñ‹ÚÁã óÁéÁÎâÿÿ‰0ƒÀ ÊÁɉ‹L$ƒÀƒyt‹÷‹ÝÁæÁïÁãÁí ÷ ÝëÁç |$Áå l$‹÷‹Ýæÿÿÿ‹ÖÑê‹Êá‹þçÀ ÏÑé‹þç Ï‹úçÁé‹ °4 ‰T$â‹îåà ýÁï ½°3 ‹þçÀ ×Áê •°2 ãÿÿÿ‹Öƒâ? •°1 ‹ÓÑê‹úç‰T$‹ëåà ý‹êÁïå‹Ó†ꋽ°8 Áí ­°6 ‹ûÁïƒç? ½°7 ‹ûƒç? ½°5 ·ù‹êÁå ýÁéÁÏâÿÿ‰8ƒÀ ÊÁɉ‹L$ƒÀƒyt‹Î‹ûÁáÁîÁçÁë Î ûëÁæ t$Áã \$‹Î‹ûáÿÿÿ‹ñÑî‹Öâ‹ÙãÀ ÓÑê‹Ùã Ó‹ÞãÁê‹•°4 æ‹éåà ÝÁë °3 ‹ÙãÀ óÁî µ°2 çÿÿÿ‹ñƒæ? µ°1 ‹ßÑë‹óæã‹ïåà õÁî‹4µ°8 ‹ïå€ ÝÁë 4°6 ‹ßÁëƒã? 4°7 ‹ßƒã? 4°5 ·Ú‹îÁå ÝÁêÁËæÿÿ Ö‰ƒÀÁʉ‹T$ƒÂƒÀúl‰T$Œ@ûÿÿ_^][YÃÌÌV‹t$Vè¥ùÿÿƒÄ…ÀuƒÈÿ^ÃVèÃùÿÿƒÄ…Àt¸þÿÿÿ^ËD$ PVèúùÿÿƒÄ3À^ÃÌÌ̃=Ììt=V‹t$Vè\ùÿÿƒÄ…ÀuƒÈÿ^ÃVèzùÿÿƒÄ…Àt¸þÿÿÿ^ËD$ PVè±ùÿÿƒÄ3À^ËL$‹T$QRè›ùÿÿƒÄ3ÀÃÌÌÌÌÌé›ÿÿÿÌÌÌÌÌÌÌÌÌÌ̸èfl‹D$ ¶¶P@Áâ ʶP@Áâ ʶP@Áâ Ê@¶P‰ $¶@Áâ ʶP@¶Áâ ÐÁâ Ñ‹L$‰T$‹T$QRD$P诋L$ ‹D$ˆ@‹ÑÁêˆ@‹ÑÁêˆ@Á鈋L$@ˆ‹ÑÁê@ˆ‹Ñ@ÁêÁ鈈HƒÄÃÌÌÌÌ̸ è¶kƒ|$$‹D$ SUVW„â¶¶H@Áá ѶH@Áá ѶH‹\$(@¶h‹t$$‹|$ Áá@ ѶH@Áá é¶H@¶Áá ÈÁá éƒÃøˆÅCÁè‰D$(÷Ø Ã‰L$0¶¶OGÁá Á¶OGÁá Á¶OGÁá Á¶OG¶_GÁã ˶_GÁã ˶_G3‹T$,Áãj ˉD$RD$3ÍPG‰L$$è×­‹D$ ˆF‹ÈÁéˆF‹ÈÁéˆF‹ÐÁ舋D$$FˆF‹ÈÁéˆF‹ÈÁéˆF‹èÁèˆƒÄ Fƒl$(…Rÿÿÿ‹\$0ƒûø„°|ƒÃ3É3ÀƒûwLÿ$<å¶OÿOÁá¶GÿOÁà ȶGÿOÁà ȶGÿO ȶGÿOÁà¶_ÿOÁã ö_ÿOÁã öÿ Ç3͉L$‹L$,3ÂjQT$R‰D$ è­‹D$ ˆF‹ÈÁéˆF‹ÐÁêˆFÁ舋D$$FˆF‹ÈƒÄ ÁéˆF‹ÐÁê_ˆÁèˆF^][ƒÄ ö¶H@¶P@Áá Ù¶H‹|$$‹t$ @¶h@Áâ Ú¶P@Áá Ù¶H@Áâ ê¶‹D$(Áá ÊÁá éƒÀø‰\$4‰l$‰D$0ˆÓHÁé‰L$(÷ÙȉD$0¶.¶NF¶VF¶FF¶^FÁá é¶NFÁâ ê¶VFÁà è¶FFÁá Ù‹L$,Áâ ÚjÁàQT$ ØR‰l$ F‰\$$èí«‹D$@3D$ ‹L$3L$$ˆG‹ÐÁêˆG‹ÐÁêˆGÁèˆGˆG‹ÁÁèˆG‹ÑÁêˆGÁéˆƒÄ Gƒl$(‰l$4‰\$…Jÿÿÿ‹D$0‹Ý‹l$ƒøø„´¶¶NF¶VÁá ÁF¶NFÁáÁâ  ÁF¶V‰D$¶F¶NÁâF ¶Áá ÊÁá È‹D$,j‰L$PL$Qè(«‹D$<3l$$3\$ |ƒÀƒÄ ‹Íƒøw=ÿ$…\åO‹ÑÁêˆO‹ÁÁèˆO‹ÑÁêˆOˆO‹ÃÁèˆO‹ËÁéˆO‹ÓÁꈈ_ÿ_^][ƒÄ ËÿØâÎâÄâ¼âµâ«â¡â™â/å'åååå ååüäÌÌÌ̸èvg‹D$ ¶¶P@Áâ ʶP@Áâ ʶP@Áâ ʶP@@V¶0‰L$¶H@¶ÁáÁæ È ÖÁá ʃ|$$‰L$^t‹L$‹T$‹D$QRPL$ Qè«Çë‹T$‹D$‹L$RPQT$ Rè´È‹L$‹D$ ˆ@‹ÑÁêˆ@‹ÑÁêˆ@Á鈋L$@ˆ‹ÑÁê@ˆ‹Ñ@ÁêƒÄÁ鈈HƒÄÃÌÌÌÌÌÌÌ̸è–fƒ|$$‹D$ SU‹l$V‹0W„æ…í„»‹|$,M…ö…š¶_‹Ã¶Áâ ʶP@Áâ ʶP@Áâ Ê@¶P‰L$¶@Áâ ʶP@¶Áâ ÐÁâ Ñ‹L$(j‰T$QT$Rè ©‹L$ˆ‹ÑÁê‹Ãˆ@‹ÑÁêˆ@Á鈋L$ @ˆ‹ÑÁê@ˆ‹Ñ@ÁêƒÄ Á鈈H‹L$Š2>A‰L$‹L$ ˆˆ>FAƒæ‰L$ …í…5ÿÿÿ‹D$0_‰0^][ƒÄÃ…í„Õ‹|$,M…ö…š¶_‹Ã¶Áâ ʶP@Áâ ʶP@Áâ Ê@¶P‰L$¶@Áâ ʶP@¶Áâ ÐÁâ Ñ‹L$(j‰T$QT$Rè%¨‹L$ˆ‹ÑÁê‹Ãˆ@‹ÑÁêˆ@Á鈋L$ @ˆ‹ÑÁê@ˆ‹Ñ@ÁêƒÄ Á鈈H‹L$ŠA‰L$Š >ˆ>2Á‹L$ FˆAƒæ‰L$ …í…3ÿÿÿ‹D$0_‰0^][ƒÄøè¦dƒ|$,‹D$(‹L$SUV‹0W„ø…Ʉߋ|$4I‰L$4…ö…¨¶_‹Ã¶Áâ ʶP@Áâ ʶP@Áâ ʶP@¶h@‰L$¶H@¶Áá È‹D$(ÁáÁå Õ Ê‹T$,‰L$‹L$0QRPL$Qè±Ä‹L$ ˆ‹ÑÁê‹Ãˆ‹Ñ@Áêˆ@Á鈋L$$ˆH@‹ÑÁê@ˆ‹Ñ@ÁêƒÄÁ鈈H‹L$4Š>‹T$2B‰T$‹T$ ˆˆ>FBƒæ‰T$ …É…#ÿÿÿ‹D$8_‰0^][ƒÄÃ…É„ç‹|$4I‰L$4…ö…¨¶_‹Ã¶Áâ ʶP@Áâ ʶP@Áâ ʶP@¶h@‰L$¶H@¶Áá È‹D$(ÁáÁå Õ Ê‹T$,‰L$‹L$0QRPL$QèºÃ‹L$ ˆ‹ÑÁê‹Ãˆ‹Ñ@Áêˆ@Á鈋L$$ˆH@‹ÑÁê@ˆ‹Ñ@ÁêƒÄÁ鈈H‹L$4‹T$ŠB‰T$Š>ˆ>2‹T$ FˆBƒæ‰T$ …É…!ÿÿÿ‹D$8_‰0^][ƒÄÃÌÌÌÌÌÌÌÌÌÌÌ̸@è†b¡Àç3ĉD$<‹L$X‹D$T‹T$\‰L$‹L$PU‰L$‹L$PV‹t$Li‰D$(‹D$hÁíƒù@W‹|$T‰T$(‰D$4.¶PHÁâ‰L$0AS¶¶ Ú¶QAÁàÁâA ض Ú¶QAÁâ ¶QA¶ Áâ ÑÁâ ƒ|$t‰D$„¾9l$`‚•ëI‹T$,‹L$0)l$R‰D$(‹D$,PQT$,R‰\$0èOÂUÿƒÄõ3É3ÀƒúwMÿ$• ñ¶NÿNÁá¶FÿNÁà ȶVÿNÁâ ʶFÿN ȶFÿNÁà¶VÿNÁâ ¶VÿNÁâ ¶VÿN Â3D$ 3L$$Uÿõýƒúw=ÿ$•,ñO‹ÑÁêˆO‹ÑÁêˆO‹ÑÁêˆOˆO‹ÐÁêˆO‹ÐÁêˆO‹ÐÁêˆOˆ‹T$\ýƒú u ‹\$é°ƒú@u ‹Ø‰L$餋ÓÁêˆT$=‹ÓÁêˆ\$<ˆT$>‹T$Áëˆ\$?‹ÚÁëˆT$@ˆ\$A‹ÚÁêˆT$C‹ÐÁêˆT$E‹ÐˆD$DÁèˆD$G‹ÁÁêÁèÁëˆT$FˆD$I‹D$\ˆ\$B‹ÑˆL$HÁêÁé‹Øã€ˆT$JˆL$KyKƒËøC¹•Á™ƒâÂÁøT<ƒÁQRD$DPÿ! ƒÄ …Û„Ÿ¶T$=ŠËÒd$<°*ÊÈÒêŠËÒd$=ŠÈT$<¶T$>ÒêŠËÒd$>ŠÈT$=¶T$?ÒêŠËÒd$?ŠÈT$>¶T$@ÒêŠËÒd$@ŠÈT$?¶T$AÒêŠËÒd$AŠÈT$@¶T$BÒêŠËÒd$BŠÈT$A¶T$CÒêŠËŠ\$DT$BŠT$CÒâŠÈÒë ÓˆT$C¶D$=¶\$<¶L$>¶T$?Áà Ø¶D$@Áá Ù¶L$AÁâ Ú¶T$CÁá Á¶L$BÁâ ÑÁâ ‰D$‹D$9l$ƒVýÿÿéá9l$`‚פ$‹T$,‹L$0)l$R‰D$(‹D$,PQT$,R‰\$0è¿3É3ÀUÿƒÄõ‰L$‰D$ƒúw_ÿ$•Lñ¶FÿNÁà‰D$‹È¶FÿNÁà ȶVÿNÁâ ʶFÿN ȉL$¶FÿNÁà‰D$¶VÿNÁâ ¶VÿNÁâ ¶VÿN ‰D$‹T$\õƒú u ‹\$‰D$鼃ú@u ‹Ø‰L$鬋ÓÁêˆT$=‹ÓÁêˆ\$<ˆT$>‹T$Áëˆ\$?‹ÚÁëˆT$@ˆ\$A‹ÚÁêˆT$C‹ÐÁêˆT$E‹ÐˆD$DÁèˆD$G‹ÁÁêÁèÁëˆT$FˆD$I‹D$\ˆ\$B‹ÑˆL$HÁêÁé‹Øã€ˆT$JˆL$KyKƒËøC¹•Á™ƒâÂÁøT<ƒÁQRD$DPÿ! ƒÄ …Û„Ÿ¶T$=ŠËÒd$<°*ÊÈÒêŠËÒd$=ŠÈT$<¶T$>ÒêŠËÒd$>ŠÈT$=¶T$?ÒêŠËÒd$?ŠÈT$>¶T$@ÒêŠËÒd$@ŠÈT$?¶T$AÒêŠËÒd$AŠÈT$@¶T$BÒêŠËÒd$BŠÈT$A¶T$CÒêŠËŠ\$DT$BŠT$CÒâŠÈÒë ÓˆT$C¶D$=¶\$<¶L$>¶T$?Áà Ø¶D$@Áá Ù¶L$AÁâ Ú¶T$CÁá Á¶L$BÁâ Ñ‹L$Áâ ‰D$‹D$3D$ 3L$$Uÿýƒúw=ÿ$•lñO‹ÑÁêˆO‹ÑÁêˆO‹ÑÁêˆOˆO‹ÈÁéˆO‹ÐÁêˆO‹ÈÁéˆOˆ‹D$ý9l$ƒ0ýÿÿ‹T$8‹t$4ˆ‹ËÁéˆF‹ÓÁêˆFÁëˆFˆ‹ÈFÁ鈋ÐFÁêÁ興F[‹L$H_^]3Ìè$\ƒÄ@ìë¢ë˜ëë‰ëëuëmëìùëñëéëæëÞëÖëÎë‚îxînîbîWîMîCî5î­ð¥ðð•ð’ðŠð‚ðzðÌÌÌ̸0èf[‹L$<‹Á™ƒâÂÁø‰$A™ƒâÂU‹èV‹t$H‹ÁÁý%€‰t$yHƒÈø@I‰D$ ƒù?‡g‹D$P¶H@¶PS¶Xÿ‰D$ @Áá Ù¶H@Áâ ÚÁá@¶P Ù¶@Áâ ʶP@¶Áâ ÐÁâ ʃ|$XW‰\$‰L$P„O;õ‚Æ‹|$H‹t$D)l$‰L$,‹L$TjQT$0R‰\$4è“UÿƒÄ õ3É3ÀƒúwMÿ$•P÷¶NÿNÁá¶FÿNÁà ȶVÿNÁâ ʶFÿN ȶFÿNÁà¶VÿNÁâ ¶VÿNÁâ ¶VÿN Â3D$(3L$,Uÿõýƒúw=ÿ$•p÷O‹ÑÁêˆO‹ÑÁêˆO‹ÑÁêˆOˆO‹ÐÁêˆO‹ÐÁêˆO‹ÐÁêˆOˆ‹T$Lýƒú u ‹L$P‰D$Pé?ƒú@u ‰D$‰L$Pé1‹T$P‰L$<‹L$‰\$0‰T$4‰D$8…Éu‹D$jL4QT$8Rÿ! ƒÄ éç‹T$¶\1¶T0°*ÁŠÈÒë‹L$Òâ Ú‹T$ˆ\$0¶\1¶T2ÒãŠÈÒê‹L$ Ú‹T$ˆ\$1¶\2¶T3ÒãŠÈÒê Ú‹T$ˆ\$2¶\4¶T3Òë‹L$Òâ Ú‹T$ˆ\$3¶\4¶T5ÒãŠÈÒê‹L$ Ú‹T$ˆ\$4¶\5¶T6ÒãŠÈÒê‹L$ Ú‹T$ˆ\$5¶\6¶T7ÒãŠÈÒê Ú‹T$ˆ\$6¶\8ŠD7Òë‹L$Òà Øˆ\$7‹T$4‹L$0‰T$P‰L$‹\$‹L$P9l$ƒÇýÿÿé;õ‚w‹|$H‹t$D‹ÿ‹D$T)l$j‰L$0PL$0Q‰\$4èC›3ÀMÿƒÄ õ3Û‰D$ ƒùwUÿ$÷¶FÿNÁà‰D$ ¶VÿNÁâ ¶NÿNÁá Á¶VÿN ‰D$ ¶^ÿNÁã¶NÿNÁá Ù¶VÿNÁâ Ú¶NÿN Ù‹L$Lõƒù u‹T$P‰T$‰\$Pégƒù@u ‰\$‰D$PéU‹L$‹T$P‰D$<‹D$‰L$0‰T$4‰\$8…Àu‹D$jL4QT$8Rÿ! ƒÄ é±*È‹D$¶T1¶D0ÒêˆL$P‹L$Òà ЋD$ˆT$0¶T1¶D2Òâ¶L$PÒè‹L$ ЋD$ˆT$1¶T2¶D3Òâ¶L$PÒè¶L$P ЋD$ˆT$2¶T4¶D3Òê‹L$Òà ЋD$ˆT$3¶T4¶D5Òâ¶L$PÒè‹L$ ЋD$ˆT$4¶T5¶D6Òâ¶L$PÒè‹L$ ЋD$ˆT$5¶T6¶D7Òâ¶L$PÒè¶L$P ЋD$ˆT$6¶T8¶D7Òê‹L$Òà ЈT$7‹L$0‹T$4‹D$ ‰L$‰T$P3\$(3D$,Mÿýƒùw=ÿ$°÷O‹ÈÁéˆO‹ÐÁêˆO‹ÈÁéˆOˆO‹ÓÁêˆO‹ÃÁèˆO‹ËÁéˆOˆ‹\$‹L$Pý9l$ƒ“ýÿÿ‹T$X‹D$$ˆ‹ÓÁêˆ@‹ÓÁêˆ@Áëˆ@ˆ‹ÑÁê@ˆ‹Ñ@ÁêÁé_ˆˆH[^]ƒÄ0ÃIÄòºò°ò¨ò¡ò—òò…òóó óóþòöòîòæò õõ õõùôïôåôÙôööîöæöÞöÛöÓöËöÃö¸4è&U¡Àç3ĉD$0‹D$<‹T$H‹L$D‰D$‹D$L‰D$‹D$T‰$SU‰T$(V‹t$\¶VW‹8F‰D$,@@Áâ‰L$4¶ ʶPÿ@¶XÁâ ʶPÿ@Áâ ʶPÿ@Áã Ó¶X¶‹l$PÁã Ø‹ÁÁèˆD$9‹ÁÁèˆD$:Áã Ó‹ÁÁèˆD$;‹ÂÁèˆD$=‹ÂÁèˆD$>‹ÂÁè‰l$ÇD$‰L$‰T$ ˆL$8ˆT$<ˆD$?…í„d$½)l$…ÿuf‹L$(‹T$0‹D$4QRPL$(Qè¾´‹D$,‹T$0‹ØÁëˆ\$I‹Ø‹ÈˆD$HÁëÁèˆ\$JˆD$K‹Â‹ØÁëˆ\$M‹ØˆD$LÁëÁèƒÄl$ˆ\$>ˆD$?ŠD<8‹\$H2‹l$$ÿD$HGˆEEƒçƒ|$‰l$$…dÿÿÿƒ|$tNˆ‹t$,‹ÁÁèˆF‹ÁÁèˆFÁ鈈VFF‹ÊÁ鈋L$F‹ÂÁèˆÁêˆV‰9_^][‹L$03Ìè~SƒÄ4ËT$‰:_^][‹L$03ÌèeSƒÄ4ËD$‹L$@‰8_^][3ÌèLSƒÄ4ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸hÃÌÌÌÌÌÌÌÌÌÌUV3í3ö9-àìu#jjh°A h@è(ÿÿƒÄ £àì;Åu^ƒÈÿ]Ã9-Ðìujoh°A h@èæ'ÿÿƒÄ £Ðì;ÅtÕ¡Ôì;Åujth°A h@èÀ'ÿÿƒÄ £Ôì;Åt¯SW‹=Üì;ýt`‹t$;þ}*‹ Øì‹T$WÈQRèÞRƒÄ ‹Ç_[^‰-Üì‰-Øì]ËØì‹L$VÃPQè´RƒÄ Þ+þ‰=Üì_‰Øì[‹Æ^]Ë\$û@~ ÇD$@‹\$‹= ! ë¤$¡Ðì‹L$º+ÖRÆPQÿ×ƒÄ ƒøÿuÿ! ƒ8t _[^3À]Ã;Å~õðƒþ|Ä‹ Ðì¶Q¶1AÁæÁâ ò¶P@¶@Áâ ò ðþ@‡„ƒþ}½ëF™ƒâ‹èÁýííí3ÿ…í~J‹ ! d$‹D$‹Õ+×RÏQPÿÓƒÄ ƒøÿuÿ! ƒ8…dÿÿÿë …ÀŽZÿÿÿø;ý‹ Ðì|Ä‹\$;Þj}iöht‹T$(‹D$$R‹ÔìPVRQè) ë‹D$(‹T$$P¡ÔìRVPQèåÿÿ‹ Ôì‹T$0ƒÄSQRè=QƒÄ +ó_‰5Üì‹ó‰Øì[‹Æ^]Ã;Ý}Xöht‹D$(‹T$$P¡àìRVPQè½ ë‹T$(‹D$$R‹àìPVRQè£äÿÿ¡àì‹L$0ƒÄVPQèÑPƒÄ _[‹Æ^]Ãöht ‹T$(‹D$$R‹T$ PVRQèf ƒÄ_[‹Æ^]ËD$(‹T$$P‹D$ RVPQèFäÿÿƒÄ_[‹Æ^]Ã_[^ƒÈÿ]ÃÌÌÌ̸èæO¡Àç3ĉD$‹D$,S‹\$(U‹l$0V‰D$ ¡äì3öW‹|$0‰l$;Æu3jbhÈA h@èÓ$ÿÿƒÄ £äì;Æu_^]ƒÈÿ[‹L$3Ìè°OƒÄÃ95lt‰5lû@~]‰t$…Û~>‹l$,‹Ã+Æ=@~¸@‹L$‹T$QRP7PUèJÿÿÿƒÄ…ÀŒD$ð;ó|Æ‹D$_^][‹L$3Ìè=OƒÄËËÁùˆ@‹ÓÁúˆ@‹ËÁùƒûˆˆX}*St$ ‹ÖWRècO¸+ÃPL,QèðƒÄ¿ëC™‹÷ƒâ‹øÁÿÿÿÿèšûÿÿö¸t ;Ø|‹Ã‹T$jRUP¡äìƒÀPVèÂë ƒû|‹Ã‹L$‹äìjQUPƒÂRVè âÿÿƒÇƒÄ3ö…ÿ~8‹l$,‹ äì‹Ç+ÆPÎQUÿ! ƒÄ ƒøÿuÿ! ƒ8…þÿÿ3Àð;÷|̋ËL$$_^][3Ìè6NƒÄÃÌÌÌÌÌÌ̸(èöM¡Àç3ĉD$$‹D$8‹L$4S‰D$‹D$D‰D$UV‹0W‹|$L¶W‰L$¶Áâ ÊG¶P‰D$(@@Áâ ʶ@¶XÁâ ʶ@‹l$@@Áã Ó¶X¶Áã Ø‹ÁÁèÁã ÓˆD$-‹Á‹ÙˆL$,ÁèÁéˆD$.ˆL$/‹Ê‹Â‰T$ ˆT$0ÁéÁèÁêƒ|$DÇD$‰\$ˆL$1ˆD$2ˆT$3„øÿL$…öu\‹L$$jQT$$Rè‹\$(‹ÃÁè‹ËÁé‹ÓÁêˆD$9‹D$,ˆL$:ˆT$;‹È‹ÐˆD$<ÁéÁêÁèƒÄ ÿD$ˆ\$,ˆL$1ˆT$2ˆD$3ŠL4,‹D$<2FˆM@Eƒæƒ|$‰D$<…zÿÿÿƒ|$tR‹D$(ˆ‹ÓÁêˆ@‹ËÁ鈋L$ @Á눈H@@‹ÑÁêˆ@‹ÑÁêˆÁéˆH‹D$_‰0^][‹L$$3ÌèxLƒÄ(ËL$_‰1^][‹L$$3Ìè_LƒÄ(ËT$‹L$4_‰2^][3ÌèFLƒÄ(ÃÌÌÌÌÌÌ̸ èLU‹l$0E™ƒâÂÁøƒý@‰D$‹D$4‰D$oƒý ~#ƒÈÿƒý@‰D$ |‰D$ë3Mà¸ÓàH‰D$ë"u ÇD$ ÿÿÿÿ븋ÍÓàH‰D$ ÇD$‹T$A‰L$‹L$ ˆˆ>FAƒæ‰L$ …í…7ÿÿÿ‹D$0_‰0^][ƒÄÃ…í„Ó‹|$,M…ö…˜¶_‹Ã¶Áâ ʶP@Áâ ʶP@Áâ Ê@¶P‰L$¶@Áâ ʶP@¶Áâ ÐÁâ Ñ‹L$(‰T$QT$Rè ÷ÿÿ‹L$ˆ‹ÑÁê‹Ãˆ@‹ÑÁêˆ@Á鈋L$@ˆ‹ÑÁê@ˆ‹Ñ@ÁêƒÄÁ鈈H‹L$ŠA‰L$Š >ˆ>2Á‹L$ FˆAƒæ‰L$ …í…5ÿÿÿ‹D$0_‰0^][ƒÄÃÌÌÌ̸(è$¡Àç3ĉD$$‹D$8‹L$4S‰D$‹D$D‰D$UV‹0W‹|$L¶W‰L$¶Áâ ÊG¶P‰D$(@@Áâ ʶ@¶XÁâ ʶ@‹l$@@Áã Ó¶X¶Áã Ø‹ÁÁèÁã ÓˆD$-‹Á‹ÙˆL$,ÁèÁéˆD$.ˆL$/‹Ê‹Â‰T$ ˆT$0ÁéÁèÁêƒ|$DÇD$‰\$ˆL$1ˆD$2ˆT$3„òÿL$…öuZ‹L$$QT$ Rè¡õÿÿ‹\$$‹ÃÁè‹ËÁé‹ÓÁêˆD$5‹D$(ˆL$6ˆT$7‹È‹ÐˆD$8ÁéÁêÁèƒÄÿD$ˆ\$,ˆL$1ˆT$2ˆD$3ŠL4,‹D$<2FˆM@Eƒæƒ|$‰D$¶]¶EE¶ME¶U‹|$(‹t$$EÁàEÁã Ø¶EÁá Ù¶MEE Ú¶UÁàÁá Á¶MEÁâ  Á‹L$,ƒíƒÁø‰\$‰D$8‰l$4‰L$ˆÜAÁè‰D$,÷ØÁ‰T$¶.¶FF¶NF¶VF¶^FÁàÁå è¶FFÁá é¶NFÁãÁà ê¶V Ø‹D$0FÁá ÙPL$ ÚQ‰l$ F‰\$$è‚ôÿÿ‹D$3D$ ‹L$@3L$$‹ÐÁêˆG‹ÐÁêˆG‹ÐÁꈈGGG‹ÁÁèˆG‹ÑÁêˆG‹ÁÁèˆGˆƒÄGƒl$,‰l$‰\$8…Gÿÿÿ‹l$4‹\$‹D$8‹L$ƒùø„ζ¶NF¶VÁàFÁá Á¶NFÁâ  Á‰D$‰D$¶FF¶VF¶NÁàÁâF ¶VÁá Ê Á‰D$,‰D$‹D$0PL$Qèªóÿÿ‹L$‹D$@3\$ 3D$$|ƒÁƒÄƒùw9ÿ$X9OˆO‹ÐÁêˆO‹ÈÁéˆOÁèˆOˆO‹ÓÁêˆO‹ÃÁèˆÁëˆ_ÿ‹L$‹T$,‰L$‰T$8‹Ù‹Â‹ËÁéˆME‹ÓÁêˆU‹ËEÁéˆMEˆ]E‹ÐÁêˆUE‹ÈÁéˆME‹Ð_ÁêˆU^ˆE][ƒÄËÿF6<626-6!66 66Ø8Ð8È8Å8¿8·8¯8¬8ÌÌÌÌÌÌÌ̸èvƒ|$$‹D$ SU‹l$V‹0W„ê…í„Ê‹|$,M…ö…ž¶_Áá‹Ã¶Áâ ʶP@Áâ ʶP Ê@@¶P‰L$¶@ÁâÁá ʶP@¶@Áâ Ð Ñ‹L$(‰T$QT$Rèòÿÿ‹L$‹ÁÁ舋ÑÁê‹Ãˆ@‹ÑÁꈈH‹L$@@‹ÑÁêˆ@‹ÑÁêˆ@‹ÑƒÄÁꈈH‹L$Š2>A‰L$‹L$ ˆˆ>FAƒæ‰L$ …í…1ÿÿÿ‹D$0_‰0^][ƒÄÃ…í„à‹|$,¤$M…ö…ž¶_Áá‹Ã¶Áâ ʶP@Áâ ʶP Ê@@¶P‰L$¶@ÁâÁá ʶP@¶@Áâ Ð Ñ‹L$(‰T$QT$Rè+ñÿÿ‹L$‹ÁÁ舋ÑÁê‹Ãˆ@‹ÑÁꈈH‹L$@@‹ÑÁêˆ@‹ÑÁêˆ@‹ÑƒÄÁꈈH‹L$ŠA‰L$Š >ˆ>2Á‹L$ FˆAƒæ‰L$ …í…/ÿÿÿ‹D$0_‰0^][ƒÄÃ̸(èv¡Àç3ĉD$$‹D$8‹L$4‰D$‹D$@‰D$SUV‹0W‹|$L¶W‰L$¶G‰D$(@@ÁâÁá ʶPÿ@¶XÁâ@ ʶPþ ʶPÿ@ÁãÁâ Ó¶¶@Áã Ø‹l$@‹ÁÁèˆD$,‹ÁÁèˆD$- Ó‹ÁÁèˆD$.‹ÂÁèˆD$0‹ÂÁèˆD$1‹ÂÁèƒ|$DÇD$‰L$‰T$ ˆL$/ˆD$2ˆT$3„ð‹\$<ÿL$…öu\‹L$$QT$ Rè¹ïÿÿ‹L$$‹ÁÁèˆD$4‹ÑÁê‹ÁÁèˆD$6ˆT$5‹T$(‹ÂÁèˆD$8‹ÂÁèˆD$9‹ÂÁèƒÄÿD$ˆL$/ˆD$2ˆT$3ŠD4,2FˆEECƒæƒ|$u†ƒ|$tR‹ÁÁ舋D$(‹ÙÁ눋Ù@Á눈H@@‹ÊÁ鈋Ê@Áéˆ@‹ÊÁ鈈P‹T$_‰2^][‹L$$3ÌèüƒÄ(ËD$_‰0^][‹L$$3ÌèãƒÄ(ËL$_‰1‹L$0^][3ÌèʃÄ(ÃÌÌÌÌÌÌÌÌÌÌ̸(C ÃÌÌÌÌÌÌÌÌÌ̸èv‹D$ ¶¶P@ÁâÁá ʶP@Áâ ʶP Ê@@¶P‰ $¶@ÁâÁá ʶP@¶@Áâ Ð Ñ‹L$‰T$QT$RèJîÿÿ‹L$‹D$‹ÑÁêˆ@‹ÑÁêˆ@‹ÑÁꈈH‹L$ @@‹ÑÁêˆ@‹ÑÁêˆ@‹ÑÁꈈHƒÄÃÌÌÌÌSUVW‹T$‹D$¶@@Áበ¶Hÿ ¶@@Áá‰J¶Hÿ J@¶pÿÁæ‰r¶0 r¶p@JÁæ‰r ¶p r @¶p@Áæ‰r¶p r@¶p@Áæ@‰r¶0 r¶p@Áæ@‰r¶0 r¶p@Áæ‰r¶@ ƉBB 3Û‹1‹yü‹ÖÁê‹ïÁå Õâÿÿ‰‹Q‹êÁíÁæ îåÿÿ‰h‹qƒÀÁâ ‹îÁí Õâÿÿ‰P‹Q ƒÀ‹êÁíÁæ îåÿÿ‰h‹qƒÀ‹îÁíÁâ ÕƒÀâÿÿ‰‹Q‹êÁíÁæ îƒÀåÿÿ‰(‹qøƒÀƒû}5‹îÁâ Áí ÕÁæ Áïâÿÿ‰ ÷ƒÀæÿÿ‰0CƒÀƒÁ ƒûŒ,ÿÿÿ_^][ÃÌÌ…Éu3ÀÃSUVW»¾3í‹Ã™÷ù‹Ã‹ú+Ç™÷ù…ÿt¯Æ+è‹Ö‹Ù‹õ‹Ï‹êëÝ…ö}Æ_‹Æ^][ÃÌÌÌÌÌSU‹l$VW‹|$ÇÀ‹õ3Û‹è“ÿÿÿ‰‹G÷؃Æ%ÿÿ‰‹O÷ÙáÿÿƒÆ‰‹O ƒÆègÿÿÿ‰ƒÆƒût‹Wøƒï‰‹GƒÆ‰CƒÆƒû |ª‹E‹M‹•È_‰E‹…Ä^‰M‰•ĉ…È][ÃÌÌÌÌÌÌÌÌÌÌ̸èV S‹\$VhHh8C Sè ‹L$$ƒÄ ƒùH~¹HW‹|$ ‹ÇÏsÇD$U¶@;Ár‹Ç¶(Áâ@ Õ;Ár‹Ç¶(Áâ@ Õ;Ár‹Ç¶(Áâ@ Õ;Ár‹Ç1Vø¶@;Ár‹Ç¶(Áâ@ Õ;Ár‹Ç¶(Áâ@ Õ;Ár‹Ç¶(Áâ@ Õ;Ár‹Ç1Vü¶@;Ár‹Ç¶(Áâ@ Õ;Ár‹Ç¶(Áâ@ Õ;Ár‹Ç¶(Áâ@ Õ;Ár‹Ç1ƒÆ ƒl$…Eÿÿÿ3ÿ‰|$‰|$3ö]‹ÿD$ SPèE‹L$‹T$‰ ³‰T³ƒÆƒÄƒþ|Û3ö_D$SPè‹L$‹T$‰L³H‰T³LƒÆƒÄþ|×^[ƒÄÃÌÌÌÌÌÌÌÌ̸¬S ÃÌÌÌÌÌÌÌÌÌ̸èÖ ‹D$ ¶¶P@ÁâÁá ʶP@Áâ ʶP@ Ê@¶P‰ $¶@ÁâÁá ʶP@¶@Áâ Ру|$‰T$t‹L$QT$Rès€ë‹D$PL$Qè}„‹L$‹D$‹ÑÁêˆ@‹ÑÁêˆ@‹ÑÁꈈH‹L$ @@‹ÑÁêˆ@‹ÑÁêˆ@‹ÑƒÄÁꈈHƒÄÃÌÌÌÌÌÌÌÌ̸è ƒ|$$‹D$ SU‹l$V‹0W„ê…í„Ê‹|$,M…ö…ž¶_Áá‹Ã¶Áâ ʶP@Áâ ʶP Ê@@¶P‰L$¶@ÁâÁá ʶP@¶@Áâ Ð Ñ‹L$(‰T$QT$Rè{‹L$‹ÁÁ舋ÑÁê‹Ãˆ@‹ÑÁꈈH‹L$@@‹ÑÁêˆ@‹ÑÁêˆ@‹ÑƒÄÁꈈH‹L$Š2>A‰L$‹L$ ˆˆ>FAƒæ‰L$ …í…1ÿÿÿ‹D$0_‰0^][ƒÄÃ…í„à‹|$,¤$M…ö…ž¶_Áá‹Ã¶Áâ ʶP@Áâ ʶP Ê@@¶P‰L$¶@ÁâÁá ʶP@¶@Áâ Ð Ñ‹L$(‰T$QT$Rè‹~‹L$‹ÁÁ舋ÑÁê‹Ãˆ@‹ÑÁꈈH‹L$@@‹ÑÁêˆ@‹ÑÁêˆ@‹ÑƒÄÁꈈH‹L$ŠA‰L$Š >ˆ>2Á‹L$ FˆAƒæ‰L$ …í…/ÿÿÿ‹D$0_‰0^][ƒÄÃ̸(è¡Àç3ĉD$$‹D$8‹L$4‰D$‹D$@‰D$SUV‹0W‹|$L¶W‰L$¶G‰D$(@@ÁâÁá ʶPÿ@¶XÁâ@ ʶPþ ʶPÿ@ÁãÁâ Ó¶¶@Áã Ø‹l$@‹ÁÁèˆD$,‹ÁÁèˆD$- Ó‹ÁÁèˆD$.‹ÂÁèˆD$0‹ÂÁèˆD$1‹ÂÁèƒ|$DÇD$‰L$‰T$ ˆL$/ˆD$2ˆT$3„ð‹\$<ÿL$…öu\‹L$$QT$ Rè}‹L$$‹ÁÁèˆD$4‹ÑÁê‹ÁÁèˆD$6ˆT$5‹T$(‹ÂÁèˆD$8‹ÂÁèˆD$9‹ÂÁèƒÄÿD$ˆL$/ˆD$2ˆT$3ŠD4,2FˆEECƒæƒ|$u†ƒ|$tR‹ÁÁ舋D$(‹ÙÁ눋Ù@Á눈H@@‹ÊÁ鈋Ê@Áéˆ@‹ÊÁ鈈P‹T$_‰2^][‹L$$3Ì范Ä(ËD$_‰0^][‹L$$3ÌèsƒÄ(ËL$_‰1‹L$0^][3ÌèZƒÄ(ÃÌÌÌÌÌÌÌÌÌÌ̸<è3ÀSUV‹´$PƒþW‹È‹Ø‹è‹ø‰L$8‰D$<‰D$@‰D$D‰D$H‰D$L‰D$P‰D$T‰D$X‰D$\‰D$`‰D$d‰D$h‰\$l‰l$p‰|$t~¾3Ò…ö~(‹„$X¶ ‰L”8B;Ö|ó‹|$t‹l$p‹\$l‹D$H‹L$83Òƒþ žÂ‹´$PÁà D$LÁá L$<Áà D$P‰–€‹t$hÁà D$TÁá L$@‰D$|‹½Àg 3­Ào Áæ3Àc  ó‹T$XÁá L$DÁæ õÁæ ÷‹|$h3½Àk ‹|$X3½Àk Áâ T$\3Á‹ØÁë¶èãÿ‹ Àk ‰L$‹L$`‹ Ào 3 ­Ào ‹øÁâ T$`Áï‰D$(Áèçÿ3 ½Àg Áâ3 …Àc  T$d3L$‰¬$˜3Ê‹é¶Ñ‰„$Œ‹Á‰L$,ÁéÁ퉔$¨Áèåÿ‰Œ$œ‹ ­Àk %ÿ‹…Àg ‰L$ ‹L$\‰T$‹Àc ‹Œ$¨3Àc 3T$3T$ ‹Œ$œ‹ Ào 3Ñ3Ö‹ò‰T$0‰Œ$ˆ¶Ê‰Œ$¸‹ÊÁꉔ$¬Áéáÿ‹ Àc Áî‰L$$‹Œ$¸æÿ‹µÀg ‰T$‹T$d‹•Àg 3Àk ‹Œ$¬3Ào 3T$$3T$3T$|¶Ê‰T$4‰Œ$È‹ÊÁéáÿ‰Œ$Ä‹ÊÁꉔ$¼‹…Ào ‹„$¬‰T$‹…Àc ‹„$¨3…Àk ‹D$3½Àc ‹<½Ào 3Ð3T$Á鉔$Ì‹”$¸‹•Àg 3T$$áÿ3T$3T$ 3”$ˆ‰”$ЋÀg ‹Œ$¼3Àc 3µÀk ‹´$˜3µÀk ‹´$È3׉”$Ô‹”$Ä‹•Àc 3µÀg ‹´$œ3Ào ‹Œ$Œ3Ào 3T$‰”$Ø‹”$¨‹•Àg 3­Àc 3µÀk 3Àk 3Ð3T$0‹ÂÁè%ÿ‹ …Àg ¶ò‹ê‰T$xÁê‹•Àc Áíåÿ3­Àk ‰L$3µÀo ‰t$D3Á3Ç3D$(‰T$8¶ð‹È‹Ð‰D$|Áè‹ø‹Àc 3½Ào ÁéÁêâÿ3•Àk áÿ3D$,‹ Àg 3Á‰|$H‰t$T‹4µÀc 3ƶø‹ð‰„$€‰L$‹ÈÁè‹Ø‹½Àk Áî‰|$d‹¼$˜æÿ3µÀg Áéáÿ3Àc ‰\$X3½Àg 3Ào 3D$4¶ø‰|$t‹øÁïçÿ‰„$„‰|$p‹øÁè‹…Àk ‰D$‹D$D‹…Àc 3Àc Áïçÿ3½Ào 3D$3D$‹\$p‰„$Ü‹D$8‹…Àg 3­Àc 3½Àg 3Àk ‹\$t3Ào ‹\$T‰„$à‹D$X‹,…Àk ‹D$D‹…Àk 3µÀo 3Å3D$3Àc ‹\$H‰„$ä‹D$d‹…Ào 3Àk 3Àg 3•Àc ‹T$T3•Ào ‹T$p‰„$苽Àc 3•Ào ‹T$t3•Àg 3Å3D$3D$x‹Ð¶Ø‹ø‰D$(Áè‹èÁêâÿ‹•Àg ‰D$‹Ào 3Ào Áïçÿ3½Àk ‰œ$˜3­Àc ‰¬$Œ3D$3„$€‹Ø¶È‹è‰D$,Á艄$œÁëãÿ‹Àg ‰D$‹µÀc ‹´$œÁíåÿ3­Àk ‰Œ$¨3µÀo ‹ Àc 3Á3D$3„$„‰D$0¶ð‹ÈÁéáÿ‰´$¸‰Œ$´‹ÈÁ艄$¬‹D$d‹…Àg 3µÀk ‹´$´3µÀc ‹´$¬Áéáÿ3Àg ‹<½Àc 3µÀo ‹,­Àc 3D$|‹Ào ¶ð‰´$È‹ðÁîæÿ‰D$4‰´$Ä‹ðÁ艄$¼Áîæÿ‹4µÀo 34…Àk ‹„$˜34Àc ‹ Ào 34…Àc ‹„$Ä‹…Àk 3t$‰´$ì‹´$È3µÀo ‹´$¼3µÀg ‹´$Œ3µÀg 3lj„$ð‹„$¬3 …Àk ‹„$¨3 •Àk 3 …Àc 3L$‰Œ$ô‹Œ$¸‹Ào ‹Œ$´3Àk ‹Œ$œ3Àg 3Å3É„$ø‹„$¨‹…Àg 3Àk 3µÀk 3Å3Ã3D$0¶Ø‹ðÁî‰D$x‰\$Dæÿ‹ÈÁè‰D$8‹…Àc 3µÀg Áé3Ào áÿ3•Ào ‹ Àk 3Á3D$(‰L$$‹Ð¶Ø‹È‰D$|Áè‹,…Ào Áêâÿ‹•Àg 3Àc Áé3D$,áÿ‹ Àk 3Å3Á3Ç‹ø‰„$€‰L$ ¶È‰\$T‹ØÁèÁïçÿ‰l$‹è‹½Àc ‰D$‰L$dÁëãÿ‹Àg ‰D$‹Àk ‹Œ$˜3Àg 3­Ào 3D$43D$3D$¶È‰L$t‹ÈÁ鉄$„áÿ‰L$p‹ÈÁè‰D$h‹D$D‹…Àc 3­Àc Áé3•Ào ‹T$T3•Àk ‹•Àg 3D$áÿ‰„$ü‹D$d‹…Àg 3Ð3T$‰„$ˆ3T$‹µÀo 3T$ ‹,­Àk ‹t$p‰”$‹T$D3•Àk ‹T$h3•Àc 3Àg 3ʼn„$‹D$t‹…Àg ‹D$8‹…Ào 3Ào 3µÀc 3D$$3‰„$‹D$h‹…Àk 3Àc 3µÀo 3Å3Â3D$x‹è¶È‹ð‰D$(Áè‹ÐÁíåÿ‹­Àk ‰D$‹½Ào 3Ào Áîæÿ3µÀg ‰Œ$˜3•Àc ‰”$Œ3D$3„$€‹ÈÁéáÿ‰Œ$ ‹ Àk ‹ø‰L$ Áï¶Ðçÿ‹ ½Àg ‰L$‹ Àc 3 •Àc ‰D$,3L$Áè3L$ ‰„$œ‹…Ào 3È3Œ$„‰”$¨‹Ñ¶ÁÁê‹ÙÁëâÿ‰L$0‰„$¸ãÿ‹•Àc Á鉌$¬‹ Àg ‰T$$‹…Àk ‹„$¬3…Ào ‰L$3”$ˆ3T$$3Ñ3T$|¶Ê‰Œ$ȋʋ‰T$4Áꉔ$¼‹½Ào ‹¼$¨‰T$‹”$¬‹•Àc 3½Àk Áè3µÀc ‹4µÀo 3T$%ÿ3T$Á鉔$ ‹”$¸‹<•Àg 3|$$‹”$œ3|$áÿ3|$ ‹ Àc 3<•Ào ‰¼$‹<…Àg ‹„$¼3<…Àc 3<Àk ‹œ$˜3<Àk 3þ‰¼$‹¼$È3 ½Àg ‹¼$ 3 …Ào ‹„$Œ3 …Ào 3L$‰Œ$‹Œ$¨‹ Àg 3 ½Àc 3 •Àk 3 …Àk 3L$3L$0‹ÁÁè‹Ù%ÿ‹…Àg Áë¶ù‰L$xãÿÁé‹Àc ‰|$D‰L$8‰T$3Àk 3½Ào 3Â3Æ3D$(¶ð‹Ð‹È‰D$|Áè‹ø‹­Àc 3½Ào ÁêÁéáÿ3Àk âÿ3D$,‹•Àg 3‰|$H‰t$T‹4µÀc 3ƶø‹ð‰„$€‰T$‹ÐÁè‹è‹½Àk Áî‰|$d‹¼$˜æÿ3µÀg Áêâÿ3•Àc ‰l$X3½Àg 3­Ào 3D$4¶ø‰„$„‰|$t‹øÁïçÿ‰|$p‹øÁè‹…Àk ‰D$‹D$D‹…Àc 3­Àc Áïçÿ3½Ào 3D$3D$‰„$‹D$8‹…Àg 3Àc ‹\$p3½Àg 3Àk ‹\$t3Ào ‰„$ ‹Å‹…Àk ‹D$D‹…Àk 3µÀo 3Ã3D$‹l$T3­Àc ‹l$H‰„$$‹D$d‹…Ào 3•Àk 3­Àg 3Àc ‹L$T3Ào ‹L$p‰„$(‹½Àc 3Ào ‹L$t3Àg 3Ã3D$3D$x‹È¶Ø‹ø‰D$(Áè‹èÁéáÿ‹Àg ‰D$‹•Ào 3Ào Áïçÿ3½Àk ‰œ$˜3­Àc ‰¬$Œ3D$3„$€‹Ø¶Ð‹è‰D$,Á艄$œÁëãÿ‹Àg ‰D$‹µÀc ‹´$œÁ퉔$¨‹•Àc åÿ3­Àk 3µÀo 3Â3D$3„$„‹ÐÁê¶ðâÿ‰D$0‰”$´‹ÐÁ艄$¬‹D$d‹…Àg 3µÀk ‰´$¸‹´$´3µÀc ‹´$¬Áêâÿ3•Àg 3µÀo 3D$|‹<½Àc ¶ð‰´$È‹ð‰D$4Áîæÿ‰´$Ä‹ðÁ艄$¼Áîæÿ‹4µÀo 34…Àk ‹„$˜34•Àc ‹•Ào 34…Àc ‹„$Ä‹…Àk 3t$‹,­Àc ‰´$,‹´$È3µÀo ‹´$¼3µÀg ‹´$Œ3µÀg ‹Ào 3lj„$0‹„$¬3…Àk ‹„$¨3Àk 3…Àc 3T$‰”$4‹”$¸‹•Ào ‹”$´3•Àk ‹”$œ3•Àg 3Å3É„$8‹„$¨‹…Àg 3•Àk 3µÀk 3Å3Ã3D$0‹Ð‹ð¶èÁè‰D$8‹…Àc Áêâÿ3•Àg Áî3­Ào æÿ3Ào ‹4µÀk 3Æ3D$(‰t$$‹È¶ØÁé‹ðáÿ‰\$TÁîÁè‹…Ào ‰D$‹Àg 3Àc æÿ3D$,‹4µÀk 3D$‰t$ 3Æ3Ƕ؋ð‹øÁè‰D$X‹Àk ‰\$d‹œ$˜3Àg ‹\$X3Ào Áî3D$4Áïæÿ‹4µÀc çÿ‹<½Àg 3Ç3Ƌ؉t$¶ð‰t$t‹ðÁè‰D$h‹­Àc ‰|$‹|$X3½Àc Áî3Ào æÿ‹È‹D$T3 …Àk Áë3L$ãÿ‰Œ$<‹L$d‹ Àg 3 …Àg ‹D$h3L$3L$3L$ ‰Œ$@‹ …Àc 3 •Ào ‹T$t3 ­Àk ‹•Àg 3 ½Àk 3Àc 3 µÀg _‰Œ$@‹L$43Ào 3µÀo ^3D$]‰„$<3À[‹”„¼‹Œ$@‰Á‹”„üƒêƒâ‰TÁ@ƒø|ØÄ<Ã̸èVò‹D$ ¶¶P@ÁâÁá ʶP@Áâ ʶP@ Ê@¶P‰ $¶@ÁâÁá ʶP@¶@Áâ Ру|$‰T$t‹L$QT$Rèórë‹D$PL$Qè„w‹L$‹D$‹ÑÁêˆ@‹ÑÁêˆ@‹ÑÁꈈH‹L$ @@‹ÑÁêˆ@‹ÑÁêˆ@‹ÑƒÄÁꈈHƒÄÃÌÌÌÌÌÌÌÌ̸è†ñƒ|$$‹D$ SU‹l$V‹0W„ê…í„Ê‹|$,M…ö…ž¶_Áá‹Ã¶Áâ ʶP@Áâ ʶP Ê@@¶P‰L$¶@ÁâÁá ʶP@¶@Áâ Ð Ñ‹L$(‰T$QT$Rèûq‹L$‹ÁÁ舋ÑÁê‹Ãˆ@‹ÑÁꈈH‹L$@@‹ÑÁêˆ@‹ÑÁêˆ@‹ÑƒÄÁꈈH‹L$Š2>A‰L$‹L$ ˆˆ>FAƒæ‰L$ …í…1ÿÿÿ‹D$0_‰0^][ƒÄÃ…í„à‹|$,¤$M…ö…ž¶_Áá‹Ã¶Áâ ʶP@Áâ ʶP Ê@@¶P‰L$¶@ÁâÁá ʶP@¶@Áâ Ð Ñ‹L$(‰T$QT$Rè q‹L$‹ÁÁ舋ÑÁê‹Ãˆ@‹ÑÁꈈH‹L$@@‹ÑÁêˆ@‹ÑÁêˆ@‹ÑƒÄÁꈈH‹L$ŠA‰L$Š >ˆ>2Á‹L$ FˆAƒæ‰L$ …í…/ÿÿÿ‹D$0_‰0^][ƒÄÃ̸(è†ï¡Àç3ĉD$$‹D$8‹L$4‰D$‹D$@‰D$SUV‹0W‹|$L¶W‰L$¶G‰D$(@@ÁâÁá ʶPÿ@¶XÁâ@ ʶPþ ʶPÿ@ÁãÁâ Ó¶¶@Áã Ø‹l$@‹ÁÁèˆD$,‹ÁÁèˆD$- Ó‹ÁÁèˆD$.‹ÂÁèˆD$0‹ÂÁèˆD$1‹ÂÁèƒ|$DÇD$‰L$‰T$ ˆL$/ˆD$2ˆT$3„ð‹\$<ÿL$…öu\‹L$$QT$ Rè™o‹L$$‹ÁÁèˆD$4‹ÑÁê‹ÁÁèˆD$6ˆT$5‹T$(‹ÂÁèˆD$8‹ÂÁèˆD$9‹ÂÁèƒÄÿD$ˆL$/ˆD$2ˆT$3ŠD4,2FˆEECƒæƒ|$u†ƒ|$tR‹ÁÁ舋D$(‹ÙÁ눋Ù@Á눈H@@‹ÊÁ鈋Ê@Áéˆ@‹ÊÁ鈈P‹T$_‰2^][‹L$$3Ìè îƒÄ(ËD$_‰0^][‹L$$3ÌèóíƒÄ(ËL$_‰1‹L$0^][3ÌèÚíƒÄ(ÃÌÌÌÌÌÌÌÌÌÌ̸t ÃÌÌÌÌÌÌÌÌÌ̃|$‹D$ ‹L$‹T$PQRu èõ„ƒÄ Ãè¬ƒÄ ÃÌÌÌÌÌÌÌ̃|$‹T$SUV‹2W‹|$tI…ÿt>‹\$$‹l$O…öu‹D$ PSS讄‹T$4ƒÄ ‹L$Š2FˆEˆDÿAEƒæ‰L$…ÿuÊ_‰2^][Ã…ÿtõ‹\$$‹l$›O…öu‹L$ QSSè_„ƒÄ ‹L$ŠŠ2ЈUˆFAEƒæ‰L$…ÿuÍ‹D$(_‰0^][ÃÌ̸0è¦ì¡Àç3ĉD$,‹D$8S‹\$@KÿW‹|$L‰D$ ‹D$Hƒù‡…‹‹OUVP‰T$ ‹W‰L$$‹O WW‰T$0‰L$4èÔƒC™ƒâ‹èƒÄ Áýƒ|$Xt1…í~z‹L$D‹\$‹×t$,+Ñ+ñ+Ùd$Š 2AƒíˆDÿˆD ÿuíëI3ö…í~G‹T$DD$,‹È+ЋD$‹ß+Ù+Á‰\$‰D$ë ëI‹\$L4,Š Š 2؈‹D$F;õˆ|â‹\$L‹Ëá€yIƒÉøA‹Ã™ƒâÂÁø‰L$…Éu0‹L‹T D‰‹H‰W‹P ^‰O]‰W _[‹L$,3Ìè›ëƒÄ0ò*шT$Gt½¶VÿŠÒâ¶L$ŠØÒë‹L$Òà¶L$ ÓˆWÿŠVŠÚÒë‹L$Òâ¶L$ ÈŠFŠØÒë¶L$ ÓˆW¶VÒê‹L$ÒàƒÆƒÇ ЃíˆWþuœ^]‹L$4_[3ÌèëƒÄ0ÃÌÌ̸èÖê‹L$ V‹t$WFÁèPjQèEëƒÄ 3ÿ…öv}SU‹ÿ‹T$‹ßƒã‹÷½Áî¶+ë‹ÍºÓâ‹L$("‹T$$öØÀ$€ˆD$‹D$0PQRjD$#PL$&Qè²ýÿÿ¶D$+‹Í‹l$4²Òâ$€ŠËÒèöÒ".G ЃÄˆ.;|$ r‰][_^YÃÌÌÌS‹\$…Ûv:U‹l$$V‹t$W‹|$+þ›‹D$$‹L$ UPQj7RVèIýÿÿƒÄFƒëuà_^][ÃÌÌÌÌÌÌÌÌÌÌÌ‹D$U‹l$V‹0…ítCS‹\$W‹|$›M…öu‹D$ P‹D$(PPè+ƒÄ ‹L$$Š2FˆGCƒæ…íuÓ‹D$(_[‰0^]ÃÌÌÌÌÌÌÌÌ‹Q ‹ÂÁÈ%ÿÿÁÂâÿÿ Â@V‹ÐÁÊâÿÿ‹ðÁÆæÿÿ Ö‰Q …À…Ÿ‹Q‹ÂÁÈ%ÿÿÁÂâÿÿ Â@‹ÐÁÊâÿÿ‹ðÁÆæÿÿ Ö‰Q…Àug‹Q‹ÂÁÈ%ÿÿÁÂâÿÿ Â@‹ÐÁÊâÿÿ‹ðÁÆæÿÿ Ö‰Q…Àu/‹‹ÂÁÈ%ÿÿÁÂâÿÿ Â@‹ÐÁÊâÿÿÁÀ%ÿÿ Љ^ÃÌÌ‹D$U‹l$V‹0…ítUS‹\$W‹|$›M…öu ‹D$ ‹L$(‹T$$PQRèç‹L$0ƒÄ èÛþÿÿ‹D$(Š 2 FˆGCƒæ…íuÆ‹T$,_[‰2^]É0^]ÃÌÌÌÌÌ̸@è&èSU‹l$\V‹t$TW‹|$T…ÿt…öt ƒ|$`t…íuh„t jVhlt èÒ³þÿƒÄ ‹D$hƒøt…Àth@t jWhlt è±³þÿƒÄ ‹\$\öÃth t jXhlt 蔳þÿƒÄ Áëƒ|$h…ù;þ„¹‹Ç Æ Å¨…«M‹Ñ‹Å‰L$T‰T$h…Ûtc‹3‰‹P3W‰V‹H3O‰N‹P ‹D$`3W PVV‰V èÍ~‹D$t‹1‹P1V‹H1N‹P 1V ‹Æ‰|$tKƒÄ ƒÇƒÆ…Ûu¥‹L$T‹T$h‹0‰u‹p‰u‹p‰u‹@ ‰E ‹‰‹B‰A‹B_^‰A‹R ]‰Q [ƒÄ@ËU‹E‹M‰T$H‹U ‰T$L‹U‰T$ ‹U‰T$$‹U‰T$(‹U‰T$,…Û„È‹‰T$03D$0‹W‰T$4‹W‰D$‹D$43Á‰T$8‹W ‹L$83L$H‰T$<3T$L‰D$‹D$`‰L$PL$‰T$ Q‹ÑRè×}‹T$41T$$‹D$3D$,‹T$81T$(‹L$ 3L$0‹T$$‰‰N‰V‹T$(‰V ‹T$$‰T$T‹T$(‰T$X‹T$<‰T$,‹T$@‰T$0‹T$D‰T$4‹T$HKƒÄ ƒÇƒÆ‰T$,…Û…8ÿÿÿ‹T$ ‰E‹D$H‰M‹L$L‰E‹D$$‰U‹T$,‰M ‹L$(_‰E‰M^‰U][ƒÄ@Ã;þ„Ã‹Ç Æ Å¨…µM‹Õ‰T$h‰L$T‹Á…Ûtm‹3‹P3W‰L$@‹H3O‰T$D‹P ‹D$`3W P‰L$LL$DVQ‰T$X芈‹D$t‹1‹H1N‹P1V‹@ 1F ‰|$t‹ÆKƒÄ ƒÇƒÆ…Ûuœ‹L$T‹T$h‹2‰u‹r‰u‹r‰u‹R ‰U ‹‰‹P‰Q‹P_^‰Q‹@ ]‰A [ƒÄ@ËU‹M‹E‰T$$‹U‰L$ ‹M ‰T$8‹U‰D$(‹E‰L$,‹M‰T$<…Û„ܤ$‹‰T$‹W1D$‹D$8‰T$‹W1L$‹L$<‰T$‹W 1D$‰T$‹1L$‰T$@‹W‰T$D‹W‰T$H‹W ‰T$L‹T$`RD$P‹ÈQ耇‹T$41T$$‹D$3D$,‹T$81T$(‹L$ 3L$0‹T$$‰‰N‰V‹T$(‰V ‹T$L‰T$,‹T$P‰T$0‹T$T‰T$4‹T$X‰T$8‹T$$‰T$D‹T$(KƒÄ ƒÇƒÆ‰T$<…Û…+ÿÿÿ‹t$ ‰u‹t$$‰u‹t$(‰u‹t$,‰E‹D$8_‰M‰u ‰E^‰U][ƒÄ@ÃÌÌÌÌÌÌ̸Pè†ã¡Àç3ĉD$L‹D$`S‹\$`UV‹t$dW‹|$d‰\$‰D$…ÿt…öt…Àt ‹l$x…íuë‹l$xh„t hãhlt è¯þÿƒÄ ‹D$|ƒøt…Àth@t hählt èí®þÿƒÄ öÃth t håhlt èÑ®þÿƒÄ ƒ|$|…M‹Å‰L$ƒû‚ôÁë‰\$‹×+ЉT$$‹Ö‹ß+Ð+ÞoN‰\$(ÇD$ 뛋\$$¶2ƒÀˆ\ü‹\$(¶ 2XýƒÁˆYü¶Xþ2]ÿƒÅˆYý¶Xÿ2]üƒl$ ˆYþuÀ‹T$RVVèÔy‹l$ƒÄ M‹Æ+(0¶Yÿ0X¶0X¶Y0XƒÀƒÁƒêuÛ‹‹W‰L$,‹O‰T$0‹W ‹Æ‰L$4L$,ƒÇƒÆƒl$‰T$8‰L$…ÿÿÿ‹\$‹l$xU ƒÅ0‰l$ƒû‚Áë¤$‹Fð‹Nôƒî‰D$<‹F‰L$@‹N ‹ê‰D$D‰L$HJ‹Æ+î¿I¶(0¶Qÿ0P¶0P¶Q0PƒÀƒÁƒïuÛ‹D$PVVèßx‹|$ƒÄ O‹Æ+þ½¶80¶Qÿ0P¶0P¶Q0PƒÀƒÁƒíuÛƒë‹D$<‹L$@‰D$,‹D$D‰L$0‹L$H‰D$4D$,‹Ö‰L$8‰D$…4ÿÿÿ_^][‹L$L3ÌèáƒÄPÃM ƒÅ0ûó‰L$ƒû‚Áë‰\$I‹Wð‹Gô‹Oøƒï‰T$<‹W ‰D$@‹‰T$H‹W‰D$,‹G ‰L$D‹O‰T$4‰D$8‰L$0‹ÕD$<ƒî3É+Ðë¤$D <¶0¶\)0X¶\)0X¶\)0XƒÁƒùrÖ‹L$QT$@VRèvƒ‹l$ƒÄ M‹Æ+îºI¶(0¶Yÿ0X¶0X¶Y0XƒÀƒÁƒêuÛƒl$‹D$,‹L$0‹T$4‰D$L‹D$8‰L$PL$L‰T$T‰D$X‰L$‹î…ÿÿÿ‹\$‹|$x‰|$ƒÇƒû‚çÁë‰\$¤$‹F‹‹N‹‰T$<‹V ‰D$@‰D$0‰L$D‰L$4‹ïD$<3ɉT$H‰T$8+èD <¶(0¶T0P¶T0P¶T0PƒÁƒùrÖ‹D$PL$@VQès‚‹|$ƒÄ O‹Æ+þ½¶0¶Qÿ0P¶0P¶Q0PƒÀƒÁƒíuÛ‹D$0‹L$4‹T$8‰D$P‹þD$LƒÆƒl$‰\$L‰L$T‰T$X‰D$…'ÿÿÿ‹L$\_^][3ÌèãÞƒÄPÃÌÌÌ̸è¦Þ¡Àç3ĉD$‹L$0‹T$,U‹l$$W‹|$0‰|$ öÁ…¼ƒù‚³SVQGRP»èãÞ‹D$@ƒÄ …Àu¸ t ‹‹P‰L$‰T$ÇD$‹D$@w…ÀvGxÿÁïG‹‹NT$U‰D$$R‹ÂP‰L$0èu‹L$,‹T$00\$+‰‰VƒÄ CƒÆƒïuÈ‹D$@‹|$ƒl$u§‹L$‹T$^[‰‰W_ƒÀ]‹L$3Ìèï݃ÄËL$ _]3̃ÈÿèÛ݃ÄÃÌÌÌÌÌÌÌÌÌÌÌ̸$è–Ý¡Àç3ĉD$ ‹D$8‹L$4U‹l$,ƒèW‹|$8‰|$‰D$¨t_ƒÈÿ]‹L$ 3Ìè…݃Ä$Ãørç‹S‰T$‹Q‹ØPƒÁÁëQ[WÛ‰T$,è°Ý‹D$ƒÄ L8ø‰L$ÇD$V›‹t$…ÀvHxÿÁïG‹‹F0\$'L$ U‰T$,Q‹ÑR‰D$8è!€‹D$4‹L$8‰‰NƒÄ KƒîƒïuÈ‹D$‹|$ƒl$u©‹L$<…Éu¹ t t$ º+ñ‹;uƒêƒÁƒúsî^[_]‹L$ 3ÌèªÜƒÄ$ÃPWèd´þÿ‹L$8ƒÄ^[_]3Ì3Àè‹ÜƒÄ$ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹Q‹D$ ;P}‰D$‰L$ ‹Á‹L$SU‹hV‹t$W‹y‹ßG+Ý;F‹ÆëPVè=$‹L$ ƒÄ…Àu_^][ËD$‰~‹‹9‹6UPWVè· ­ƒÄñù…Àt(…Ût‹@‰KƒÇƒÆ…Àu…Ûuì‹D$Çÿ@ë‹D$…Ût;÷t‹K‰ƒÆƒÇ…Ûuñ_^]Ç@ ¸[øèvÛ‹L$U‹l$‹EVW‹y‹ð+÷‰D$ yh¸h¨t jdjsjèfˆƒÄ_^3À]YÃS‹\$;C‹Ãë PSèW#ƒÄ…ÀtT‹T$ ‹E‹*‹ 3Ò‰|$ …ÿte‹]‹8ƒÀƒÅ‰\$…Òt;ßÒƒËÿ+\$Bûë;ûÒ÷Ú+û‰9ƒÁƒl$ uÉ…Òt&…öu [_^3À]YÃd$‹zÿ‰9NƒÀƒÁ…Òu…öuê‹\$;Èt:…öt6‹N‰‹ÖN…Òt*‹P‰Q‹ÖN…Òt‹P‰Q‹ÖN…Òt‹P ‰Q ƒÁƒÀ…öuÊ‹D$‰CÇC …À~‹ Dü‹ƒè…ÒuÿK9Sï[_^¸]YÃÌÌÌÌS‹\$ ƒ{ V‹t$Wt,ƒ~ t‹Ã‹Þ‹ð‹C‹N;Á‹Á‹|$;G8‹Çë>¿ëƒ~ tÚ3ÿV‹t$SVèýÿÿƒÄ …Àu_^3À[É~ _^¸[ÃPWèï!ƒÄ…ÀtàVSèa%ƒÄ…À}SVWè"þÿÿƒÄ …ÀtÃÇG _^¸[ÃVSWèþÿÿƒÄ …Àt¤ÇG _^¸[ÃÌÌÌÌÌÌÌÌÌÌÌÌSV‹t$‹^ W‹|$‹G 3Ãtd…Ût‹Æ‹÷‹øWVèê$ƒÄ…À})V‹t$WVè§ýÿÿƒÄ …Àu_^3À[Ã_ÇF ^¸[ÃWV‹t$Vè~ýÿÿƒÄ …Àt×_ÇF ^¸[ÃWV‹t$Vè‹üÿÿƒÄ _‰^ ^[Ã̸DèÆØ‹D$PƒxW‹ùu"h¶hÀt jghŠjèÁ…ƒÄ3À_ƒÄDÃS‹\$\UVSèŠ+Sè,S‰D$4è ,‹èS‰l$0èþ+ƒÄ‹ð‰t$,…ÿuSèë+ƒÄ‰D$ë‰|$…ö„lƒ|$„a‹L$`Qè!%€yHƒÈà@‹T$d¿ +øWRVèBHƒÄ…À„-‹D$\ƒÇ WPUÇF ‰|$@èHƒÄ …À„‹MÇE ‹FP;ÊNƒÀ;E‹Åë PUèëƒÄ…À„Ö‹N‹EƒÁ;Á}I‹UÇ‚‹N@ƒÁ;Á|ë‹VƒÂ‰Uë.A;E‹Åë PUèƒÄ…À„ˆ‹E‹MÇÿE‹^‹E‹M‹6‹ø+û¹‰T$@‹Tžü‰\$$‰T$ƒûu ÇD$ë‹Tžø‰T$‹t$Dü‹L$`‹Q ‰D$‹D$\3P G;F‰V ‹Æë PVèƒÄ…À„‹D¹ü‹L$(Wÿ‰D$`C‰V;A‰T$0‹ÁëPQèã‹T$8ƒÄ…À„ƃ~u ÇF ëƒl$`…ÒŽ,‰T$0d$‹L$‹‹yü‹L$;ÁuƒÎÿé‰3öVQ3Ò Æ ×PRèF׋L$‹ð¯D$+ø3ÀPQPVèÎÖ‹\$‹[ø‰D$83í3À‹Ï Í Ã;Ñr?w9D$8v7‹D$øN;ør,‹D$)D$8¸‹ÏЋD$‹@ø3í3Û Í Ø;ÑwÑr9\$8wÉ‹l$ ‹\$$‹L$,‹‹|$(‹VSRPèq…‹‹T$8‹|$P‰™CP‹ƒïPWW‰|$`è#‰ƒÄ …Àt‹L$,‹SRWWNè`‡ƒÄ…Àt‹D$ÿ‹D$`‹L$‰0ƒÁüƒèƒl$0‰L$‰D$`…àþÿÿ‹t$‹E…À~‹UD‚ü‹ƒè…ÉuÿM9Mï‹|$X…ÿt‹D$4‹T$\‹Z PUWè’FƒÄ ƒt‰_ ‹F…À~‹Dü‹ƒè…ÒuÿN9Vï‹D$dPè>(ƒÄ^][¸_ƒÄDË\$dSè$(ƒÄ^][3À_ƒÄDÃÌÌÌÌÌÌ̸Dè¶ÔW‹|$T‹G…À~(‹ƒ|üuhÃhÀt jkjkj謃Ä3À_ƒÄDÃöGV‹t$\…ìöF…âƒ~u hÕhÀt jgjkjènƒÄ^3À_ƒÄDÃVWèìƒÄ…À}4‹D$T…ÀtWP薃ąÀtÔ‹D$P…Àt jPèïƒÄ^¸_ƒÄDÃS‹\$dUSèõ&Sè'S‰D$8èu'‹øS‰|$@èi'‹è‹D$hƒÄ‰l$…Àu SèR'ƒÄ‰D$…í„…À„Vè•%€yHƒÈà@‹T$h¾ +ðVRUè¶CƒÄ…À„á‹D$`ƒÆ VPWÇE ‰t$@è‘CƒÄ …À„¼‹GÇG ‹]‹ð+óÇD$L‹ µщT$@‰\$D‹O+ΉL$H‹m‹Tü‰\$(‰T$ ƒûu ÇD$$ë‹Lø‰L$$‹‹L$l‚ü‹D$d‹P ‹D$`3P F;A‰l$‰Q ‹ÁëPQèù‹L$ƒÄ…À„‰q‹ T±ü‹L$,C;A‰T$‹Áë PQèÆƒÄ…À„í‹D$PL$DQè,ƒÄ…À|&‹T$‹SP‹D$HPPèÞ…‹L$(‹D$ ƒÄÇë‹D$ÿHƒxu Ç@ ëƒl$N…öŽ%‰t$¤$‹E‹L$ ‹}ü;ÁuƒÎÿé‰3öVQ3Ò Æ ×PRèéÒ‹L$$‹ð¯D$ +ø3ÀPQPVèqÒ‹]ø‰D$83í3À‹Ï Í Ã;ÑrCw 9D$8v;d$‹D$ øN;ør,‹D$$)D$8¸‹ÏЋD$‹@ø3Û3í Ë è;ÑwÑr9l$8wÉ‹\$(‹l$‹L$‹‹|$,‹VSRP苉™‹D$PƒèKQ‰D$T‹RPPèÊ„ƒÄ …Àt‹D$‹‹D$@SQPPN胃ąÀtÿE‹D$‰0ƒÅüƒèƒl$‰l$‰D$…êþÿÿ‹|$0‹G…À~ ‹D‚üƒÉÿ›‹ƒè…ÒuO9Wï‹t$\…öt‹L$4‹D$`‹X QWVè4BƒÄ ƒ~t‰^ ‹T$hRèþ#ƒÄ][^¸_ƒÄDË\$hSèä#ƒÄ][^3À_ƒÄDËD$`‹L$TPVWQ‹L$`è¢÷ÿÿƒÄ^_ƒÄDÃÌÌÌÌÌÌÌÌ̸èVÐV‹t$öFÇD$th€hØt jBj{jèN}ƒÄƒÈÿ^YÃSUW‹|$$Wè#‹l$ƒÄ;l$t;ît‹Ýë Wè#ƒÄ‹ØWè‚#‹øƒÄ…ÿ„Ÿ‹D$PWèJƒÄ…À„‰V蹃ă~‹è~‹öt ‹T$RSèëjS肃ąÀtQ¾;î~@‹ÿ‹D$$PWWèäkƒÄ …Àt3‹L$ VQèƒÄ…Àt‹T$$RWSSè-ƒÄ…Àt F;õ|ÂÇD$‹l$;ët SU諃ċD$$Pè~"‹D$ƒÄ_][^YÃ̸ÄèÏ‹„$Ðö@ÇD$ t"hûhØt jBj}jè |ƒÄƒÈÿÄÄÃPèɃĉ$…Àu‹„$ÈjPè ƒÄÄÄÃSU‹¬$àWUè¦!Uè0"U‹Øè("ƒÄ ‹ø‰|$P…Û„¨…ÿ„ L$VQè”l‹´$èƒÄƒ~ t"VSè̓ąÀ„rUST$(ÇC RëUVD$(PèölƒÄ …ÀŽK‹Œ$ÜUVQWè{.ƒÄ…À„0ƒu‹”$ØjRèÛƒÄÇD$é ‹D$=Ÿ~ ÇD$ë5=ï~ ÇD$ë$ƒøO~ ÇD$ë3ɃøŸÁL ƒù‰L$~lUD$$PWWSèSoƒÄ…À„¨‹L$I¿Óç¾;þ~:IUèú ƒÄ‰D´T…À„{‹T´PUL$$QSRPè oƒÄ…À„^F;÷|É‹D$‹´$ØxÿjVÇD$‰|$ è÷ƒÄ…À„,ëë¤$‹´$Ø‹|$ëI‹„$àWP肃ąÀu.9D$uUL$$QVVVè‡nƒÄ…À„Ü…ÿ„ÃO‰|$ë½½‹õ3Û9t$~-O…ÿ|(‹”$àWRè+ƒÄ…Àt ‹Î+ËÓå‹ÞƒÍFO;t$|Ôƒ|${u/3ö…ÿ~)‹„$èP‹„$ÜL$$QPPPènƒÄ…ÀtVF;÷|Ø‹”$èRD$$P‹„$àÑý‹L¬\QPPèÖmƒÄ…Àt(‹¬$èƒÊÿ+ÓT$ÇD$‰ñþÿÿÇD$달$è^Uè)D$ Pè_j‹D$ ƒÄ_][ÄÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌU‹l$W‹ù;~‹Æë WVèȃąÀu_]Ã9~¸}d$‹N‹ÇŠF9~|ìÿ3Éÿt‹T$S‹\$Ó‹ŠˆÈÕ;Ïrñ[‹N…É~‹LŠüƒÊÿ‹9ƒé…ÿuV9~ï_]ÃÌÌÌÌÌU‹l$;n‹Æë UVè;ƒÄ…Àu]ÃW<­3À…ÿv‹L$‹T$ÊSŠ‹L$ˆ@;Çrð[‰n…í~‹|8üƒÈÿ‹ƒï…ÉuF9Nï_¸]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸(è–ÊS‹\$<‹V3ööW‹{‰t$,‰t$ ‰t$(‰t$$‰t$‰t$‰t$‰|$u!hRhØt jfj|jènwƒÄ_^3À[ƒÄ(ËL$@UQè'‹èƒÄ‰l$4;îu‹T$d$‹L$L‹T$‹D$$QRPPPèªoƒÄ…À„„‹D$DWPèCƒÄO;\$H4p|Æ‹L$‹T$ UV‹t$ QRè!üÿÿƒÄ…ÀtO‹D$L‹L$P‹D$(Q‹ÖRPPèRoƒÄ…Àt0…ÿuÿÿÿ‹D$L‹L$‹T$$P‹D$@QRPèJlƒÄ…ÀtÇD$0ƒ|$Pu‹D$…Àt PèÆlƒÄ‹D$…Àt‹L$(QPè°žþÿ‹T$4Rè–þÿƒÄ ‹D$…Àt Pè5ƒÄ‹D$…Àt Pè$ƒÄ‹D$LPè׋D$4ƒÄ]_^[ƒÄ(ÃÌÌÌÌÌÌÌ̸èfÆV‹t$$W3ÿöF‰|$‰|$t!hïhØt jBjujè[sƒÄ_ƒÈÿ^ƒÄËL$,‹A;ÇŽ‹ ‹ öÁ„ ƒøu ‹D$$3Ò÷ñ‰T$$Vèì ƒÄ‰D$;Çu‹T$ jRèŃÄ_^ƒÄÃ9|$$u‹D$ WP諃Ä_¸^ƒÄÃSU‹l$8Uè±Uè;U‹øè3U‹ðè+ƒÄ‹Ø‰\$…ÿ„…ö„…Û„ ‹D$<…Àt‰D$ë(èÇn‰D$…À„‹L$4UQPèkƒÄ …À„Ü‹D$‹|$,¹ƒÀþ‰L$‰D$ˆd›‹ß¯ß3Ò‹Ã÷÷;Çt{WV…Ét6èæƒÄ…À„Œ‹D$UPƒÀPVVèmƒÄ…À„pÇD$ë6è0:ƒÄ…À„V‹T$4‹|$URVWjèòïÿÿƒÄ…À„8‹Æ‹÷‰D$‹L$»‹û…Éu‹D$UPVVVè²lƒÄ…À„‹L$‹T$0QRèƒÄ…À„ˆ‹L$,¯Ù3Ò‹Ã÷ñ;Çtuƒ|$WVt6èƒÄ…À„Ä‹D$UPƒÀPVVèRlƒÄ…À„¨ÇD$ë2èh9ƒÄ…À„Ž‹D$4‹|$UPVWjè*ïÿÿƒÄ…Àtt‹Æ‹÷‰D$‹\$,‹ûƒl$‹L$‰¦þÿÿ‹\$ƒÿ„WV…ÉtqèŽ ƒÄ…Àt8‹D$UPƒÀPVVèÆkƒÄ…Àt ‹D$‹L$(UPVQèÎhƒÄ…ÀtÇD$ ƒ|$<u‹D$…Àt PèJiƒÄUè¡‹D$$ƒÄ][_^ƒÄÃè8ƒÄ…ÀtÇ‹L$4UQVSjègîÿÿƒÄ…Àt±‹óë…Ét‰‹T$(jRèì ƒÄëŒhøhØt jfjujèpƒÄ_3À^ƒÄÃÌÌÌÌÌÌ̸èÖ‹„$œö@ÇD$ t"hwhØt jBj~jèÌoƒÄƒÈÿÄÃSP舋؃ĉ\$…Ûu‹„$˜jPè\ ƒÄ[ÄÃUVW‹¼$´WèaWèëW‹èèãƒÄ ‹ð‰t$ …í„]…ö„U‹Œ$°‹”$¨WQRVèƒ"ƒÄ…À„3ƒ~u‹„$¤jPèã ƒÄÇD$éûŸ~ ÇD$ë6ûï~ ÇD$ë$ƒûO~ ÇD$ë3ÀƒûŸÀDƒø‰D$~o‹Œ$°WQVVUèZ#ƒÄ…À„ª‹L$I»Óã¾;Þ~:WèƒÄ‰D´ …À„€‹”$°‹L´WRUQPè#ƒÄ…À„`F;ó|Æ‹\$sÿ‹œ$¤jSÇD$‰t$ èþ ƒÄ…À„.ë‹t$‹”$¬VR螃ąÀu19D$u‹„$°WPSSSè "ƒÄ…À„ð…ö„×N‰t$뺿‹÷3í9t$~:‹\$K‹ÿ…Û|(‹Œ$¬SQè>ƒÄ…Àt ‹Î+ÍÓç‹îƒÏFK;t$|Ô‹œ$¤ƒ|$Eu:3ö…À~4ë ¤$d$‹”$´‹„$°RPSSSè"ƒÄ…ÀtUFE;ð|Ù‹Œ$´‹”$°QRÑÿ‹D¼(PSSèÛ!ƒÄ…Àt(‹¼$´ƒÉÿ+ÍL$ÇD$‰æþÿÿÇD$닼$´Wè/‹D$ ƒÄ_^][ÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸œè¶¿‹„$¨V3öö@‰t$‰t$t^Äœ‰D$ éîôÿÿU‹¬$´9uŽ™‹Mö„Pè[ƒÄ‰D$;Æu‹”$¨jRè1 ƒÄ]^ÄœÃSW‹¼$ÀWè6WèÀ‹ØW‰\$ è´W‰D$0誃ċð‰t$,…Û„òƒ|$ „ç…ö„ß‹„$Ä…Àt‰D$ë$è@h‰D$…À„ØWUPèüdƒÄ …À„´‹œ$´ƒ{ uUSè] ƒÄ…À}‹ÃëWUSVèùƒÄ…À„w‹Æƒxu‹„$°jPèWƒÄÇD$$éP‹L$WQQRPV‰T$<è‚fƒÄ…À„0‹\$ûŸ~ ÇD$ë6ûï~ ÇD$ë$ƒûO~ ÇD$ë3ÀƒûŸÀDƒø‰D$~m‹L$‹l$WQVVUèfƒÄ…À„Ç‹L$I»Óã¾;Þ~7WèSƒÄ‰D´,…À„‹T$‹L´(WRUQPèÒeƒÄ…À„€F;ó|É‹\$‹T$‹D$(WRKPÇD$$‰\$ è‹t$,PVè–eƒÄ…À„Dë ë¤$‹\$‹Œ$¸SQèÞ ƒÄ…Àu.9D$u‹T$WRVVVèSeƒÄ…À„…Û„ÍK‰\$뽿‹÷3í9t$~-K…Û|(‹„$¸SPè‡ ƒÄ…Àt ‹Î+ÍÓç‹îƒÏFK;t$|Ôƒ|$]u83ö…Û~2ë ¤$d$‹Œ$À‹T$‹D$ QRPPPèÇdƒÄ…ÀtrF;ó|Û‹„$À‹L$P‹D$$QÑÿ‹T¼4RPPèœdƒÄ…ÀtG‹¼$À‹t$ ƒÈÿ+ÅD$ÇD$‰óþÿÿ‹L$‹”$°WQVRèaƒÄ…ÀtÇD$$닼$Àƒ¼$Äu‹D$…Àt PèïaƒÄWèF‹D$(ƒÄ_[]^ÄœÃh‰hØt jfjmjèïhƒÄ]3À^ÄœÃÌ‹L$ƒy~X‹ötQ‹D$ƒx‹T$ Vu)ƒx u#öBu‹t$‹‹jVQ‹L$RPQè õÿÿƒÄ^Ët$jVQR‹T$PRè£ûÿÿƒÄ^ÉL$é5ìÿÿÌÌÌÌÌ‹L$…É|ƒù~¹¸Óà‰ øì£p‹L$…É|ƒù~¹ºÓ≠í‰x‹L$ …É|ƒù~¹¸Óà‰ üì£t‹L$…É|ƒù~¹ºÓ≠í‰|ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$…Àu¡øìÃøu¡íÃøu¡üìÃ3Ƀø•ÁI# í‹ÁÃÌÌÌÌÌÌÌÌÌ̸„ÃÌÌÌÌÌÌÌÌÌÌ‹D$©ÿÿt#©ÿtÁè¾€ u ƒÀÃÁè¾€ u ƒÀéÿtÁè¾€ u ƒÀþ€ u ÃÌÌÌÌÌ‹T$‹BHÿ…ÀuË‹ˆRè–ÿÿÿÁáƒÄÁÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$…ötH‹…Àt"‹NÉÉQP賑þÿƒÄöFu ‹Rè’þÿƒÄW‹~jVƒçè‘þÿƒÄ…ÿ_t VèrþÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$…öt5‹…ÀtöFu PèEþÿƒÄ‹F¨t Vè5þÿƒÄ^à €‰FÇ^ËL$3À‰‰A‰A‰A ‰AÃÌÌÌÌÌÌÌÌÌÌÌhh v jè?Žþÿ3ÉƒÄ ;Áuhh v jAjqjèfƒÄ3ÀÃÇ@‰H‰H ‰H‰ÃÌÌÌÌÌÌÌÌ‹D$=ÿÿÿV‹t$~h5h v jrjxjèËeƒÄ3À^ÃöFth:h v jijxjè©eƒÄ3À^Ãh=ÀÀh v PèžþÿƒÄ ‰D$ …Àuh@h v jAjxjèneƒÄ3À^Ë…Ét^‹VÁú…Ò~/SUWd$‹q‹y‹Y ‹)‰(‰p‰x‰X JƒÀƒÁ…Òß‹t$_][‹Vƒâƒêtƒêt ƒêu‹Q‰P‹Q‰P‹ ‰‹D$ ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$ V‹t$ ;^W~(SVèéþÿÿ‹øƒÄ…ÿu_^[Ë…Àt P耎þÿƒÄ‰>‰^_‹Æ^[ÃÌÌV‹t$ W‹|$ ;þ„Š‹F;G‹Çë PWè›ÿÿÿƒÄ…Àu_^ËV‹‹Áú…Ò~.SU‹q‹y‹Y ‹)‰(‰p‰x‰X JƒÀƒÁ…Òß‹t$‹|$][‹Vƒâƒêtƒêt ƒêu‹Q‰P‹Q‰P‹ ‰‹V‰W‹F ‰G ‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‹QS‹XU‹h‰l$ ‹h V‹pW‹8‰l$‹)‰(‹i‰h‹i‰h‹i ‰h ‰9‹|$‰y‹|$‰y ‰Y‹ú‹Þƒçƒã û‰xƒæ_ƒâ Ö^]‰Q[ÃÌÌÌV‹t$‹W3ÿ;Çt‹NÉÉQWPèÛ¶ƒÄ ‰~ ‰~_^ÃÌÌÌÌÌÌÌ‹L$‹Aƒø~ƒÈÿÃu‹‹Ã3ÀÃÌÌÌÌÌÌV‹t$ƒ~W})jVè<ýÿÿ‹øƒÄ…ÿt9‹…Àt Pè׌þÿƒÄ‰>ÇF‹D$‹3Ò…À•ÂÇF ‰_¸‰V^Ã_3À^ÃÌÌÌÌ̸è¶µSV‹t$3Û‰\$;óuèüÿÿ‰D$‹ð;Ãu^3À[YËD$‹È‰L$;Ãu ‰^‹Æ^[YÃUHW‹øÁïGƒà;~‹è‹ÆëWVèŒýÿÿ‹L$(ƒÄ…Àu‹D$…Àt PèÃûÿÿƒÄ_]^3À[YËD$‰~ÿ‰^ ÿ¶Áã Ú‹ÕI@M…Òu ‹ƒï‰3Ûk…ÉuÞ‹F…À~‹DüƒÉÿ‹ƒè…ÒuN9Vï_]‹Æ^[YÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$‹CUVHÿ…Àt‹‹ˆRèTúÿÿÁáƒÄÁƒÀ™ƒâ‹ðÁþ‹î…öt9W‹|$IN‹Æ™ƒâ‹‹ÎÁøá€yIƒÉüA‹‚ÉÉÉÓèGˆGÿ…öuÐ_^‹Å][ÃÌÌÌÌÌÌÌÌÌ‹T$‹JV‹t$ ‹Á+Fu%AÿW‹:‹…À| ‚+ú‹‹1;òu Hƒé…À}ï3À_^ÃÀƒà_H^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌW‹|$…ÿ„€V‹t$…ötq‹G ;F t3É…À”Á^_L ÿ‹ÁÃU…Àu ¸ƒÍÿëƒÈÿh‹O‹V;Ê/}‹Å]^_ÃQÿS…Ò|‹6‹ –+Þ‹4 ‹9;÷w rJƒé…Ò}í3À[]^_Ã[‹Å]^_Ã^ƒÈÿ_Ã3À9D$ _•ÀÃÌÌÌÌÌÌÌÌ‹L$…É}3ÀËÁ™SƒâU‹؋éVÁûå€WyMƒÍàE‹t$9^={;~‹Æë WVèIûÿÿƒÄ…Àu_^][ËF;Ç}›‹Ç@;Ç|ò‰~‹š‹Íº_Óâ^][ ¸ÃÌÌÌÌÌ‹L$…É}3ÀËÁ™ƒâ‹T$Áø9B~éá€V‹2†yIƒÉàA¾Óæ÷Ö!0‹B…À~‹ DüƒÉÿI‹0ƒè…öuJ9rï¸^ÃÌÌÌÌÌÌÌÌ‹L$…É}3ÀËÁ™ƒâ‹T$Áø9B~éဋyIƒÉàA‹‚ÓèƒàÃÌÌÌÌÌÌÌÌÌ‹L$…É}3ÀËÁ™ƒâÂÁøá€yIƒÉàA‹T$;B}Ü…Éu‰BëWx‰z‹:‡ƒÏÿÓç÷×!8_‹B…À~‹ Dü‹ƒè…ÉuÿJ9Jï¸Ã̃|$‹D$tƒxtÇ@ ÃÇ@ ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ ‹T$V‹t‚üW‹|$ ‹L‡ü;ñt Àƒà_H^ÃHþ…É|Š+ú‹‹0;òuáIƒè…É}ï_3À^ÃÌÌÌÌÌÌÌÌÌÌ‹D$S‹\$ U‹l$Vuÿ…À}‹Ö+ЋÈ“ƒ:u?Aƒê…É|óW‹|$…À~ð ·ëIƒ9u&Hƒé…Àó‹D¯ü‹L«ü;Èt_À^ƒà]H[Ã^]ƒÈÿ[Ã_^]¸[ÃMþ…É|‹+û‹‹0;òuÏIƒè…É}ï_^]3À[ÃÌÌÌÌÌÌÌW‹|$…ÿu3À_ÃVè]÷ÿÿ‹ð…ötWVèàøÿÿƒÄ…ÀuVèãöÿÿƒÄ^3À_ËÆ^_ÃÌÌÌÌÌÌU‹l$ VW‹|$3ö;o~DSUWèf÷ÿÿ‹ØƒÄ…Ûtè÷ÿÿ‹ð…öt‹G‰F‰n‹O ‰N ‰[_‹Æ^]ÃSèä†þÿƒÄ[_‹Æ^]ÃèÕöÿÿ‹ð…ötWVèXøÿÿƒÄ…ÀuÑVè[öÿÿƒÄ_^3À]ÃÌÌ‹FSW9Fud…Àt@Ñëë» hRh8v PèÏ„þÿ‹øƒÄ …ÿu_[ËF…Àt‹ …QRWèý¯ƒÄ ƒ~t ‹PèJ†þÿƒÄ‰>‰^‹N‹D$ ‹‰ЏF_[ÃÌÌÌÌÌÌÌÌÌÌ̃?tGSVë¤$‹7»ƒ>t Vè>õÿÿƒÄƒÆƒëuê‹‹ˆDP‰Oèâ…þÿ‹WƒÄ‰…ÒuÆ^[ÃÌÌÌSU‹l$ ‹]…Ût,VW‹ó¿ƒ>t Vè^øÿÿƒÄƒÆƒïuê‹›D…ÛuÙ_^‹E‰EÇE ][ÃÌÌÌÌÌÌÌ‹N ;Nu}Wh™h8v hH賃þÿ‹øƒÄ …ÿu_ÃSU‹ß½Sè)õÿÿƒÄƒÃƒíuï‹F‰¯D‰‡@ƒ>][uƒFÿF ‰>‰~‰~‹Ç_ËN‰¹DƒFÿF ‰~‰~‹Ç_Ã…Éu‹ëöÁu ‹F‹D‰V‹V‹Áƒà€A‚‰N ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹N Aÿ+ʃà‰N …ÒtJ…Àu‹N‹‰@¸‰NëH…ÒuãÃV‹t$Vèµþÿÿ3ÀƒÄ‰F‰F ‰F$‰F(^ÃÌÌhØh8v j,诂þÿ3ÉƒÄ ;ÁuhÛh8v jAjjjèZƒÄ3ÀÉH‰H‰‰H‰H ‰H‰H‰H‰H ‰H$‰H(ÃÌÌÌÌÌÌÌÌÌÌW‹|$…ÿt ƒt ‹GPèøƒþÿƒÄèÐýÿÿWèêƒþÿƒÄ_ÃÌÌÌÌÌW‹|$‹G$…Àu:9G(u5‹G VPwèýÿÿƒÄ^…Àu$hh8v jmhjèâYƒÄÿG$_Ã@‰G$_ÃÌÌÌÌV‹t$‹F$…ÀtH‰F$^ÃÿN‹F‹N‹V W‹<;ús+×è£þÿÿ‰~ _ÇF(^ÃÌÌÌÌÌÌV‹t$ƒ~$uIƒ~(uCWè¹ýÿÿ‹ø…ÿu$h*h8v jmjtjÇF(èWYƒÄ_3À^ÃjWèöÿÿƒÄÿF ‹Ç_^Ã3À^ÃÌÌÌÌÌÌÌÌUV‹t$W‹|$;þ}‹L$‹Ç‹þ‹ð‹D$‰D$‰L$ë‹D$‹l$…öjWPUè{[ƒÄ_^]ËL$‹RWPUèe[NƒÄ‰D½…öް‹D$S\½ƒÅƒÀ‰D$ë¤$‹L$‹Qü‹D$RWPMüQèyXNƒÄ‰Cü…ö~p‹T$‹‹L$PWQUè[XNƒÄ‰…ö~S‹T$‹B‹L$PWQURè:XNƒÄ‰C…ö~1‹D$‹H‹T$QWREPèXƒD$,‰CNƒÄƒÃƒÅ…önÿÿÿ[_^]ÃÌÌÌÌÌÌÌÌ̸èæª‹L$0SUVW‹|$8‹Ç™+‹ð‹D$<Ñþ,ƒÿu'…Àu(…Éu$‹D$4‹L$0‹T$,PQRè¦kƒÄ _^][ƒÄÃÿ}R‹T$4‹t$,ÏQ‹L$4RÇPQVèlþÿÿ‹L$P‹T$TƒÄ…À˜÷ØÀÀPy †jQèתƒÄ _^][ƒÄËL$0‹Æ+ÃP±SRQ‰D$0‰T$(èøøÿÿ‹L$D‹ø3À‰D$,‰D$ ‹Å+ÆPU±QR‰D$D‰T$4èÐøÿÿ‹|$dDƒÄ ƒø‡ßÿ$…<¦‹L$0‹T$‹Ã+ÆPSQRWèô^‹L$(‹T$H‹Æ+Åé¡ÇD$餋T$0‹D$‹Ë+ÎQSRPWèÀ^‹L$8‹T$H‹D$(QURP ·Qè§^ÇD$Dëh‹T$ ‹D$‹L$0RSPQWè‡^‹D$(‹L$H‹Ö+ÕRUPQ·Rèn^ÇD$Dë/‹D$ ‹L$‹T$0PSQRWèN^‹D$8‹L$H‹T$(PUQR·Pè5^ƒÄ(ƒþ…“ƒ|$<… ƒ|$@…þ‹\$8ÛÛƒ|$‰\$uOQßWSènƒÄ ëß3À‰‰C‰C‰C ‰C‰C‰C‰C‹T$4‹D$0‹l$,RPUèåm‹L$‹T$@)‹L$<ƒÂRƒÁQP‰D$(èÄmƒÄéƒþu|ƒ|$<uuƒ|$@un‹\$8ÛÛƒ|$‰\$uW RßWSè;ië j@ßjS赨‹D$@‹L$<‹l$8ƒÄ PQUèi‹T$‹L$@*‹T$<ƒÁ QƒÂ RP‰D$(èõhƒÄ铃|$‹D$8,ljl$$u#Ujj…V·P‰\$$ßWSèÍüÿÿƒÄëÀÀP8jS‰D$è,¨ƒÄ ‹L$4‹T$0U‹l$0jjVQRUè—üÿÿ‹L$@‹T$\‹D$,Q‹L$\R‹T$8Q‹L$@VRÅQP‰D$HèmüÿÿƒÄ8‹T$8‹D$RPUWèYƒÄƒ|$‰D$@t‹L$8QSWSèªZ‹|$PƒÄ+øë‹T$8RWSSèæXƒÄD$@‹|$@‹L$8QDµSPPèÊXƒÄøt%‹T$8ò‹DµlµljE;Çs‹EƒÅƒÀ‰Etò_^][ƒÄËÿ£E£R£E£E£E£‹£E£Ä£¸è–¦S‹\$0ƒû}+‹D$8‹T$, ‹D$4Q‹L$,R‹T$,ØSQRèYúÿÿƒÄ[ƒÄËL$(UV‹t$tF€>uú;|$t1‹ÿ‹WüƒïR‹Å+Æh”v LQVèUõƒÄ€>tF€>uú;|$uÑ‹|$ÇD$ëjzh|v jAjhjèqFƒÄ…ÿt Wè$pþÿƒÄ‹D$…Àt Pè³ßÿÿƒÄƒ|$u…ÛtSèÿoþÿƒÄ_^]3À[ƒÄ Ã_^]‹Ã[ƒÄ ÃÌÌÌÌÌÌÌ̸ èö˜S‹\$ÇD$…Û„nŠ„À„d<-u CÇD$‰\$¶VW‹=! P3öÿ׃Ä…Àt¶LFQÿ׃Ä…Àuð‹T$‹|$‰D$…ÿt‹U…Àuè`ßÿÿ‹è…íu3À]_^[ƒÄ ËèjUèFâÿÿƒÄµ™ƒâÂÁø;E‹Åë PUèsàÿÿƒÄ…Àu9u¾Uè²ÞÿÿƒÄ]_^3À[ƒÄ Ã3À‹Þ‰D$…ö~oë¤$ƒû¿}‹û‹Ã+Ç3ÒD$$¾qЃþ w‹ÎëqŸƒþwƒÁ©ëq¿ƒþwƒÁÉë3ÉÁâO Ñ@…ÿÊ‹D$‹M‰@ƒë‰D$…Ûž‹|$ ‰E…À~‹UD‚üƒÉÿ‹ƒè…ÒuM9Uï‹D$‰E ‹D$‰/]_^[ƒÄ Ã3À[ƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌS‹\$ U3í…Û„@Š„À„6<-u½C¶VW‹=! P3öÿ׃Ä…ÀtëI¶LFQÿ׃Ä…Àuð‹L$.‰D$…Ét‹9…ÿuèÖÝÿÿ‹ø…ÿu3À_^][ÃjWèÁàÿÿƒÄµ™ƒâÂÁø;G‹Çë PWèîÞÿÿƒÄ…Àu‹T$9u¿Wè)ÝÿÿƒÄ_^]3À[ø9Žã8÷îÑú‹ÂÁèTÒ+ƃø u3ÀŠ 3ö„Ét0¾É@¶CtQЃø uhÊš;Wè½ VWè& ƒÄ3ö3ÀŠ „ÉuЋG‰o …À~ ‹D‚üƒÉÿ›‹ƒè…ÒuO9Wï‹D$‰8‹D$_^][Ã]3À[ÃÌÌÌÌÌÌÌÌÌÌÌU‹l$ VW3ö3ÿ9u t‹D$jh¤v Pèï®ƒÄ ƒøur9uu‹L$jh v QèÑ®ƒÄ ƒøuTS‹]ƒëxA¾‹U‹š‹ÎÓèƒà…ÿu…Àt‹L$j€hv PQè“®ƒÄ ƒøu‹øƒîyɃëy¿[_^¸]Ã_‹Æ^]Ã[_^3À]ÃÌÌÌÌÌÌÌÌVèÊÁPè´‹ðƒÄ…öu^ËD$WPjjjVè©°‹L$ QVèÿÿÿV‹øè†¬ƒÄ‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èö”W‹úÇD$…Éu‹D$QPè¼ÞÿÿƒÄ¸_ƒÄÃA™SƒâU‹èYÿÁýã€VyKƒËøCK¸ÿÓàh†h¨v U‰D$$èÀiþÿ‹ðƒÄ …öu$h‰h¨v jAjjè’A‹D$(ƒÄ^][_ƒÄÃL$Qÿð ƒÄ¸èK”ÙîÝ$T$$jRè5ƒÄUV…ÿtEèÜ5ƒÄƒøÿ„µƒÿuT3ÿ…í~NëID$jPè´5ŠD$ƒÄ<€r…ÿ~ŠL7ÿˆ 7ë è75ƒÄ…À~uë<*sÆ7ëjþÿ‹D$ ƒÄ ^][_ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$PQ‹L$R3Òè&þÿÿƒÄ ÃÌÌ‹D$‹L$ ‹T$PQ‹L$RºèþÿÿƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$PQ‹L$RºèÓýÿÿƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̃|$U½à¹u½À¹ƒ ÇD$d…ƒ„ SWè{Øÿÿ‹ØƒÄƒûujVèYÜÿÿƒÄ‹Ã[]ÃCþPWèàÿÿƒÄ…À…ŒKýQWèòßÿÿƒÄ…Àu{CjjÿSVÿՃąÀ„«WVè0ÞÿÿƒÄ…À|0WVVèñ·ÿÿƒÄ …À„ŠWVèÞÿÿƒÄ…À|WVVèзÿÿƒÄ …Àtmƒl$ tWVèëÝÿÿƒÄ…À}š[¸]Ãh ë6ëIjjÿSVÿՃąÀt5ƒl$ tWVè³ÝÿÿƒÄ…À}Ü[¸]Ãhh¨v jqjzjè¯>ƒÄ[3À]Ãhîh¨v jsjzjè’>ƒÄ3À]ÃÌÌÌÌÌÌÌÌÌÌÌV‹t$W‹|$jèþÿÿƒÄ_^ÃÌÌÌÌÌÌÌÌÌV‹t$W‹|$jèoþÿÿƒÄ_^ÃÌÌÌÌÌÌÌÌÌS‹\$V‹t$;Þt.‹F ‰C ‹F@;C‹Ãë PSè(ÙÿÿƒÄ…Àu^3À[ËN‰Kë‹F@;C‹Ãë PSèÙÿÿƒÄ…ÀtØ‹ 3Ò3Û9VW‹>~-U‹, ê‰)ÁèCƒÇƒÁ;^‹Ð|æ]…Òt ‹D$Çÿ@_^¸[ÃÌÌÌÌÌU‹l$ ‹E…ÀuP‹D$ PèIÚÿÿƒÄ¸]ÃW‹|$ ;ït&;G‹Çë PWèvØÿÿƒÄ…Àu_]ËM‰O‹U ‰W ‹M‹S‹]V3öƒéxˆ+Ø‹‹èÑí î‰*ÁàIƒê‹ð…É}è‹G^[…À~‹DüƒÉÿ‹ƒè…ÒuO9Wï_¸]ÃÌÌÌÌÌÌ̸èÆ‹L$‹A U‹l$V‰E ‹IW‹|$ ‹Ç™ƒâ‹ðÁþD1;E‰t$ ‹Åë PUè¹×ÿÿƒÄ…Àu_^]ƒÄÃç€SyOƒÏàG‹D$ ‹‹@‹UÆ» +ßÇ‚‹D$ ‰L$‰T$…ÿu ‹@ƒèxU<0<ºI‹‰Hƒï…À}óë=‹pƒîx1‹D$$ÆT‚ë‹L$‹±‹è‹ËÓí‹ÏÓàN *ƒê‰…ö}ã‹l$‹T$‹t$$ µQjRè\‹T$,‹Bt0ƒÄ ‰u[…ö~‹MD±üƒÉÿd$‹ƒè…ÒuM9Uï_^¸]ƒÄÃÌÌÌSVW‹|$‹Ç™ƒâ‹ð‹ßÁþã€yKƒËàC‹L$¸ +ÉD$‹A;ðÞ…À„ÖU‹l$;ét,‹A ‰E ‹A+Æ@;E‹ÅëPUèVÖÿÿ‹L$ ƒÄ…Àu ]_^[Ã…ÿ„‹‹I‹}+β‰M…Ûu…ÉtR›‹‰ƒÇƒÀƒéuñë;‹0ƒÀƒÁÿ‰L$t'‹Ö‹0‹ËÓê‹L$‹îÓåƒÀƒÇ êƒl$‰oüuÞ‹l$‹ËÓî‰7‹E…À~‹MDüƒÉÿI‹ƒè…ÒuM9Uï]_^¸[ËD$jPèI×ÿÿƒÄ_^¸[ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸èFS3Û3À‰\$9\$uƒÈÿ[ƒÄËL$V‹qƒîx,‹ UW<±‹3Ò Ñ‹L$ S3íQ ÅPRèdŽNƒï‰T$…ö}Ý_]^[ƒÄøèæŒU‹l$ÇD$…íuƒÈÿ]YÃS‹\$ƒ{u[3À]YÃVUèWÒÿÿ¾ +ðV‹ÎSS‰t$(ÓåèÐüÿÿƒÄ…Àu^[ƒÈÿ]YÃW‹{ƒïx6뛋‹4¸‹L$UVQè(>‹ ‹Ð¯Õ+òƒÄ ƒï‰D¹‰t$yÖ‹t$‹C_…À~ ‹ƒ|‚üuH‰C‹D$ ‹Î^[Óè]YÃW‹|$ …ÿuG_ÃV‹t$ ‹F…Àu WVèïÕÿÿƒÄ^_Ã~ t%WVÇF 腃ă~tm3É9N ”Á‰N ^_Ë‹L‚üƒÁu@;F‹Æë PVèòÓÿÿƒÄ…Àu^_Ã3É›;N|‹Çë‹‹ŠÇ‹‰Š;øv¿Aëß‹F;È|@‰F¸^_ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$…Àu¸ÃV‹t$‹NW…Éu PVè.Õÿÿ‹øƒÄ…ÿt jVèÙÿÿƒÄ‹Ç_^Ã~ tPVÇF èñþÿÿƒÄ_ÇF ^Ãùu‹9s+_‰ÇF ¸^Ë3É9s3Ò‹>):׋>A¸9:rå‹)Š‹ƒ<ˆŠu ‹FH;Èu‰F_¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$‹NW…ÉtW‹T$…ÒuRVèdÔÿÿƒÄ_¸^ËRQPPè:‹øƒÄ…ÿt)‹F@;F‹Æë PVèÒÿÿƒÄ…Àu_^ËF‹‰<ÿF_¸^ÃÌÌÌÌV‹t$…ötH‹…Àt Pè›ÐÿÿƒÄ‹F…Àt Pè‹ÐÿÿƒÄ‹F…Àt Pè{ÐÿÿƒÄ‹F …Àt PèkÐÿÿƒÄVèÂ`þÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$ƒ>W¿tD‹F…Àt=‹L$…ÉtPQèÒÿÿƒÄ…Àu3ÿ‹D$‹N ‹P‹D$QRPPèJëÿÿƒÄ…Àu3ÿ‹Ç_^ÃhÞhÀv jkjdjè‡6ƒÄ_3À^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹@ÃÌÌÌÌÌÌÌÌ‹D$‹L$‰AÃÌÌÌÌVhŒhÀv j$èN^þÿ‹ðƒÄ …öuhŽhÀv jAjfjè 6ƒÄ3À^Ã3À‰‰F‰F‰F ‰F‰F‰F‰F‰F ‹D$W…ÀtPè>ØÿÿƒÄ‰…Àt,‹D$…ÀtPè'ØÿÿƒÄ‰F…Àt‹|$WèØÿÿƒÄ‰F …ÀuVècþÿÿƒÄ_3À^ù„Ot H_ÇF ‹Æ^ÃÌÌ‹L$‹V¾…Àt(ƒyt"‹T$‹I RQP‹D$PPèêÿÿƒÄ…Àu3ö‹Æ^ÃhÞhÀv jkjdjèC5ƒÄ3À^ÃÌÌÌÌÌÌÌÌÌÌÌÌSU‹l$ VW» …íuhŒhÀv j$è]þÿ‹ðƒÄ …öuhŽhÀv jAjfjèð4ƒÄ_‹Æ^][Ë|$3À‰‰F‰F‰F ‰F‰F‰F‰FW‰F è×ÿÿƒÄ‰F …À„[¹„Ot H‰^ë‹õ…ö„7ƒ>uèLÎÿÿ‰…À„#ƒ~uè7Îÿÿ‰F…À„ ‹|$…ÿt‹F…Àt Pè·ÍÿÿƒÄWèžÖÿÿƒÄ‰Fƒ~„ß‹D$$…Àt‰F ‹D$(…Àt‰F‹F ‹PQèœõÿÿƒÄ…À„²‹|$ ‹V ‹‹NWRPQèüƒÄ…ÀuQè@;%ÿƒøl…ƒ‹ÓK…ÒtèÆ4‹F ‹PQèJõÿÿƒÄ…Àu¶ëbhMhÀv jqh€jè©3ƒÄëE‹V …Òt%‹N…Ét‹Q‹N WQ‹NQPPÿ҃ąÀt _‹Æ^][ËV ‹N‹WRQPPè†ÊÿÿƒÄ…Àu…íu…öt VèüÿÿƒÄ3ö_‹Æ^][ÃÌÌÌÌÌSV‹t$ ‹3ÛW…Àtf9^taƒFÿu9^töFu‹D$SSPSSVèÜýÿÿƒÄë1öFu/‹|$‹N WQPPPèçÿÿƒÄ…Àt6‹F‹V WRPPPèyçÿÿƒÄ…Àt»ëh¹hÀv jkjgjè¶2ƒÄƒ~‹ÃuÇF _^[ÃV‹t$ƒ>tN‹F…ÀtG‹L$ S‹\$WS…Ét‹F PQë‹N QP‹D$PPè çÿÿ‹øƒÄ…ÿ|SVèÿÿÿƒÄ…Àu_[^ËÇ_[^ÃhøhÀv jkjejè32ƒÄ3À^ÃÌÌÌÌÌÌÌÌÌÌÌÌV‹t$ ƒ>t?‹F…Àt8‹N S‹\$WSQP‹D$PPè˜æÿÿ‹øƒÄ…ÿ|SVè¨þÿÿƒÄ…Àu_[^ËÇ_[^ÃhøhÀv jkjejèÂ1ƒÄ3À^ÃÌÌÌÌÌÌÌÌÌÌ̸膄S‹\$UVWSÇD$þÿÿÿ3öèn×ÿÿSèø×ÿÿS‹øèð×ÿÿ‹è3ÛƒÄ ;ë„‹D$PWè¶ÌÿÿƒÄ‹ð÷ÞöF;ó…ò‹L$QUè™ÌÿÿƒÄ‹ð÷ÞöF;ó…Õ‹E;Ãu!¸9G…¼‹9…²‰D$é­9_~‹öu;ÃŽ•‹Uö„‰jUègÑÿÿƒÄ…ÀuCSUèXÑÿÿƒÄ…ÀtñSUUèõÿÿƒÄ ‹ð÷ÞöƒÆ…UöÃt+9wu3Àƒà‹ …Øv ‰L$ë‹‹ƒà‹ …Øv ‰L$ëÇD$ƒ} tÇE ƒ t ‹T$÷Ú‰T$ƒ„Ô3ÛSWèÏÐÿÿƒÄ…ÀuCSWèÀÐÿÿƒÄ…ÀtñSWWèôÿÿƒÄ ‹ð÷ÞöƒÆ…½öÃt!9uu3Àë‹E‹ƒà‹ …Øv ¯L$‰L$ƒ tƒu3À÷Ðë‹‹÷Ðëƒu3Àë‹‹ƒ}u3Éë‹M‹ #ÈöÁt ‹T$÷Ú‰T$‹D$ PWUUèäâÿÿƒÄ‹ð÷ÞöƒÆu4‹Ç‹ý‰p ‹è9w…,ÿÿÿƒ}u‹Mƒ9uƒ} tÇD$ë‰\$‹T$ RèˆÕÿÿƒÄ_…ö^][¸þÿÿÿu‹$YÃÌÌ̸è‚S‹\$$U‹l$4V‹t$4‹FW‹û‰|$…ÀŽ’‹‹ öÁ„…ƒøu;È„x‹D$4‹H…É„ ƒùu‹9 u ƒx „öUè±ÔÿÿUè;ÕÿÿU‰D$,è1ÕÿÿU‰D$,è'ÕÿÿU‰D$(èÕÿÿU‹øèÕÿÿU‰D$Tè Õÿÿ‹ØƒÄ‰\$(…ۄ݃|$0uè>Èÿÿ‰D$…À„Ü‹D$4‹L$ UVPQè¡áÿÿƒÄ…À„©jVÇD$,èÆÎÿÿƒÄ…Àu ‹D$$@PV‰D$,è¯ÎÿÿƒÄ…Àté‹D$$ƒøuL‹|$jVWèbòÿÿƒÄ …À„ZjWÇG è¨ôÿÿƒÄ…À„@‹T$ ‹D$UVWRPèûÄÿÿƒÄéàVƒø…P‹L$$QWèNãÿÿƒÄ …À„‹T$jVRèöñÿÿƒÄ …À„î‹D$UVPÇ@ ‹D$(WPè¢ÄÿÿƒÄ…À„Ê‹L$UVQSèŠâÿÿƒÄ…À„²UVSWWèõáÿÿƒÄ…À„jWè²ôÿÿƒÄ…À„Š‹T$‹D$ ‹L$8UVRPQèÁáÿÿƒÄ…Àtm‹D$8UVWPPè¬áÿÿƒÄ…ÀtX‹T$8‹D$RPèFÈÿÿƒÄ…ÀtB‹L$UV‹t$@QVèþáÿÿƒÄ…Àt*‹T$ RVè¬ËÿÿƒÄ…Àt7hxhøv jojyjè°,ƒÄ‹D$…Àt;D$0t Pè™ÅÿÿƒÄÇD$Uè¸Òÿÿ‹D$ƒÄ_^][ƒÄËL$Qè¿ÇÿÿƒÄ…Àt»‹T$ÇB ÇD$ëIƒ|$}‹D$PëXjjVèÅÿÿƒÄPSèîëÿÿƒÄ…À„vÿÿÿVSè¬ÊÿÿƒÄ…À| ƒ~ ¸ su¸ÐrVSSÿÐƒÄ …À„Hÿÿÿƒ{u‹L$QSè¤ÈÿÿƒÄ…À„,ÿÿÿ‹T$URSèúÿÿƒÄ ƒøÿŒÿÿÿ…Àt(ƒøu4‹D$@ƒøR‰D$ŒVÿÿÿhùhøv jqéÜþÿÿhìhøv jpéËþÿÿƒøÿthùhøv jqéµþÿÿ‹D$$P‹D$PPè®ïÿÿƒÄ …À„¦þÿÿ‹L$UVQSSèeÂÿÿƒÄ…À„þÿÿƒ{u‹ƒ:uƒ{ uhhøv jpé]þÿÿ‹D$PWèkíÿÿƒÄ…À„Sþÿÿƒ‹L$ UV…QWè)ÞÿÿƒÄ…À„1þÿÿƒu$‹T$jRèŒÇÿÿƒÄUèóÐÿÿ‹D$ƒÄ_^][ƒÄËD$8jPèhÇÿÿƒÄ…À„ðýÿÿ‹T$8‹D$UVRPè¬ßÿÿƒÄ…À„Ôýÿÿ‹L$ ‹D$UVQPPèßÿÿƒÄ…À„·ýÿÿ‹T$ ‹D$8UVRPPèòÞÿÿƒÄ…À„šýÿÿ‹D$ƒxu‹ƒ9u ƒx „'ýÿÿ‹T$UVR»W‰\$(è6ßÿÿƒÄ…À„^ýÿÿƒu ‹ƒ8uƒ tnC‰\$;\$$„þUVWWWèÞÿÿƒÄ…ÀuÍé&ýÿÿ‹T$@WQRèçÀÿÿƒÄ…À„ýÿÿ‹D$8ƒx…ÿÿÿ‹L$jQèbÆÿÿƒÄUèÉÏÿÿ‹D$ƒÄ_^][ƒÄËL$(QWèÏÄÿÿƒÄ…À„Çüÿÿ‹\$$+\$K…Û~ ¤$UVWWèwÞÿÿƒÄ…À„ŸüÿÿK…Ûç‹T$(UVWWRèÙÝÿÿƒÄ…À„üÿÿ‹D$8UVWPPèÀÝÿÿƒÄ…À„hüÿÿ‹D$(UVP‹D$(PPè£ÝÿÿƒÄ…À„Küÿÿ‹L$‰L$$é¤þÿÿhZé!üÿÿ…Ûuè˜Âÿÿ‰D$…À„6üÿÿ‹D$4‹|$ƒxu‹ƒ9u ƒx u¸ë3ÀPWèaÅÿÿƒÄ…ÀuP;ûtkWèðÁÿÿƒÄ_^]3À[ƒÄÃøu>‹ƒ:u7…Ûuè.Âÿÿ‹ø…ÿ„Îûÿÿ‹D$4jPèØÈÿÿPWèÅÿÿƒÄ…Àt°‹Ç_^][ƒÄÃj^høv jpjyjè.(ƒÄ_^]3À[ƒÄÃÌSV‹ñ‹F3ÛW‹ú…À„™ƒ~'‹öt …À~‹ötVWW蜠ÿÿƒÄ …ÀtlëVVë …À~+‹öt$WWè-êÿÿƒÄ…ÀtMVWèŸÆÿÿƒÄ…À}%‹Ç‹þ‹ðëWWè êÿÿƒÄ…Àt)VVèûéÿÿƒÄ…ÀtC‹F…Àu€…ÛtSWWèêÿÿƒÄ …Àu_^3À[ËÇ_^[ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸Dè6zUV3ÀWS‰D$‰D$(è#ÍÿÿSè­ÍÿÿS‹ðè¥ÍÿÿS‹øèÍÿÿS‰D$(è“ÍÿÿS‰D$8è‰ÍÿÿS‰D$4èÍÿÿ‹èS‰l$0èsÍÿÿƒÄ …À„)‹D$T…Àuè«Àÿÿ‰D$ …À„‹D$jPè“ÃÿÿjUè‹Ãÿÿ‹L$hQWèÂÿÿƒÄ…À„æ‹T$\RVèúÁÿÿƒÄ…À„ÐÇF ƒ uVWèÅÿÿƒÄ…À|I‹‰D$(‹O‰L$,‹W‰T$0‹G ‹T$8‰D$4‹OSƒáþƒâVD$0 ÊPƒÉW‰L$Hè†ÙÿÿƒÄ…À„lƒÇD$ÿÿÿÿ„»‹‰L$<‹V‰T$@‹F‰D$D‹N ‹D$L‰L$H‹Vƒâþƒà ЋD$ SƒÊWL$D‰T$T‹T$ QRPè¤ÿÿƒÄ…À„‹L$‹T$ SQ‹îR‹÷‹|$$Uè^ÖÿÿƒÄ…À„ä‹D$PUUè'ŸÿÿƒÄ …À„Í‹D$‹L$‹T$÷؃‰L$‰T$‰l$‰D$…Kÿÿÿ‹ê…À}‹|$\UWUèžÿÿƒÄ …À„ˆë‹|$\ƒ~ua‹ƒ9uZƒ~ uTƒ} uWUèÁÃÿÿƒÄ…À}‹T$ URèoÀÿÿƒÄë‹D$ SWUPèMØÿÿƒÄ…Àt7‹L$ S‰L$(è(Ëÿÿ‹D$(ƒÄ_^]ƒÄDÃh…hw jlh‹jèÒ$ƒÄƒ|$Tu ‹T$ Rè¾ÿÿƒÄSèåÊÿÿ‹D$(ƒÄ_^]ƒÄDÃÌÌÌÌÌÌÌS‹\$UVWS3íèpÊÿÿSèúÊÿÿS‹ðèòÊÿÿƒÄ ‹ø…öth…ÿtd‹D$PV躿ÿÿƒÄ…ÀtR‹L$QW訿ÿÿƒÄ…Àt@3ÀW‰F V‰G è"ÃÿÿƒÄ…À}‹Æ‹÷‹ø‹Ï‹Öè üÿÿ…Àt‹T$PRèm¿ÿÿƒÄ…Àt½Sè;ÊÿÿƒÄ_^‹Å][Ã̸èÖv‹L$(3À‰D$ ‰D$‹D$$ö@S…öA…ƒUV‹t$8WVè¢ÉÿÿVè,ÊÿÿV‰D$è"ÊÿÿV‹øèÊÿÿV‰D$,èÊÿÿV‹ØèÊÿÿV‹èèÊÿÿV‰D$4èöÉÿÿƒÄ ‰D$ …À‹D$0„ú…Àuè*½ÿÿ‰D$…À„å‹D$jPèÀÿÿ‹L$jQèÀÿÿ‹T$DRW苾ÿÿƒÄ…À„·‹D$8‹L$PQèq¾ÿÿƒÄ…À„‹T$ÇB ƒ u‹ÂPWèŒÁÿÿƒÄ…À|‹L$VQWWè(ÖÿÿƒÄ…À„d‹D$8ƒxÇD$4ÿÿÿÿŽ{‹ö„pP膻ÿÿƒÄ=\ƒ„‡‹l$‹t$›3ÛSWèÃÿÿƒÄ…Àu\Cƒ~~‹öt‹L$8QVVèö˜ÿÿƒÄ …À„âVVè´äÿÿƒÄ…À„ÐSWèÂÂÿÿƒÄ…Àt»…Û~SWWèæÿÿƒÄ …À„«‹T$3ÛSRè—ÂÿÿƒÄ…ÀueCƒ}~‹Eöt‹L$8QUUè…˜ÿÿƒÄ …À„qUUèCäÿÿƒÄ…À„_‹T$SRèMÂÿÿƒÄ…Àt¶…Û~‹D$SPPèæÿÿƒÄ …À„2‹\$SWè0ÀÿÿƒÄ…À|UVVè!˜ÿÿƒÄ …À„ SWWëVUUè ˜ÿÿƒÄ …À„õWSSèÆ˜ÿÿƒÄ …À„⃅Áþÿÿé5ƒ„+‹ÿWè ºÿÿ‹ð‹D$Pèþ¹ÿÿƒÄ;Æu'jSèß½ÿÿƒÄ…À„›‹L$WQU踙ÿÿƒÄ éäWèʹÿÿ‹t$@V‰D$0軹ÿÿƒÄ;D$(…±‹T$ WRè“âÿÿƒÄ…À„O‹D$ PVèM¿ÿÿƒÄ…À} jSèn½ÿÿƒÄ…À„*WVUèK™ÿÿƒÄ ëz‹L$ QVUè:™ÿÿƒÄ …À„‹T$ WRSèó™ÿÿƒÄ …À„ïSVèñ¾ÿÿƒÄ…À} jSè½ÿÿƒÄë1jSè½ÿÿƒÄ…À„ÁWUUèâ˜ÿÿƒÄ ë‹D$½ÿÿ‹ø;ý„ÃSWè½½ÿÿƒÄ9n t/Wè?¾ÿÿ‹ØƒÄ;Ý„rVSè ³ÿÿƒÄ‰k ‰\$ë _^3À]ƒÄÉt$Wè ¾ÿÿW‹èè¾ÿÿW‰D$,èú½ÿÿ‹ðƒÄ …ö„-‹T$RUè²ÿÿƒÄ…À„jUèÏÞÿÿƒÄ…À„ƒ}u ÇD$éñ»SU‰\$$è±·ÿÿƒÄ…ÀuCSU袷ÿÿƒÄ…Àtñ‰\$‹D$ SUPè[ÛÿÿƒÄ …À„°è;‰D$…À„Ÿ‹L$WQ‹ÐRèñƒÄ …À„†ƒ|$0ÇD$$~oë ëI‹\$UVèUØÿÿƒÄ…Àt^jVèVÝÿÿƒÄ…ÀtO‹D$‹L$ PS‹\$Uè«øÿÿƒÄ ƒøÿt3…À…-ÿÿÿ‹\$$‹L$«ÿÿƒÄ…À„÷ƒûu‹U‹RPè ,ƒÄ霃ûu‹M‹QRèe)ƒÄ郃û}D$ëgSè`¨ÿÿ‹ÈI¸ÓàƒÄ ;Øu0 ;G‹Çë PWèɪÿÿƒÄ…À„‚‹‹M‹PSQRè>ýÿÿë+‹D$;G‹Çë PW蘪ÿÿƒÄ…ÀtU‹‹M‹PSQRèQüÿÿƒÄÇF ‹E‹\˜ü·Ë;Ùu ‹T$J‰Vë‹D$‰F‹„$œ;ðt VP膪ÿÿƒÄ¾ë‹t$‹Œ$¤QèKµÿÿƒÄ_‹Æ^][ĈÃÌÌÌÌÌÌÌÌÌÌÌV‹t$V蕨ÿÿFP茨ÿÿ3ÀƒÄ‰F(‰F0^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌVjKh‹ j4èÑ6þÿ‹ðƒÄ …öu^ÃVèP¨ÿÿFPèG¨ÿÿƒÄÇF(ÇF0‹Æ^ÃÌÌV‹t$…öt!Vèá§ÿÿFPèØ§ÿÿƒÄöF0t Vè)8þÿƒÄ^ÃÌÌÌÌV‹t$W‹|$WV蟩ÿÿƒÄ…Àu_^ÃFjPèúªÿÿWè§ÿÿƒÄ ‰F(_ÇF,¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌSVW‹|$WƒËÿèà³ÿÿWèj´ÿÿ‹ðƒÄ…öt0U‹l$UVèe­ÿÿƒÄ…Àt‹D$‹L$WPVjQèë‹ÿÿƒÄ…Àt‹Ý]Wèë³ÿÿƒÄ_^‹Ã[ÃÌ̸è†`SUVW‹|$,WÇD$èp³ÿÿWèú³ÿÿ‹ðW‰t$èî³ÿÿ‹è‹D$(ƒÄ …Àu WèÛ³ÿÿƒÄ‹\$ ‰D$…Ûu WèÆ³ÿÿƒÄ‹Ø…ö„ʅ턃|$„·…Û„¯‹t$(‹D$$VP诫ÿÿƒÄ…À}<‹L$jQèÌ©ÿÿ‹T$,RSèQ¨ÿÿƒÄ…Àu_^][ƒÄÃWè³ÿÿƒÄ_^]¸[ƒÄËD$$P袥ÿÿ‹ø‹F(ÀƒÄ;Ç~‹ø;~,t‹L$,QWVVRèþÿÿƒÄ‰F,ƒ~,ÿ„‹F(‹L$$‹T$PQRèÚÐÿÿƒÄ …À„ü‹D$,‹T$PNQRUè ½ÿÿƒÄ…À„Ý+~(W‹|$ UWè¡ÐÿÿƒÄ …À„ËD$,PWVUÇG èÒ¼ÿÿƒÄ…À„¤U‹l$(USè{ƒÿÿƒÄ …À„V3ÿS‰{ 蔪ÿÿƒÄ…À|8‹ÏGƒù:VSSèMƒÿÿƒÄ …Àtc‹T$jRèŠÒÿÿƒÄ…ÀtPVSè\ªÿÿƒÄ…À}ȃ{u!3Àë hÂh‹ jeh‚jè£ ƒÄë‹E ‹L$‰C ‹E 3F ÇD$‰A ‹|$,W話ÿÿ‹D$ƒÄ_^][ƒÄÃÌÌÌÌÌÌÌÌÌÌSV‹t$WV3Ûè1±ÿÿVè»±ÿÿ‹øƒÄ…ÿtJ‹L$…Ét&‹D$V;Áu PWèjúÿÿƒÄ ë QPWè½»ÿÿƒÄ…Àtë‹|$‹D$‹L$VPWQjèMýÿÿƒÄ‹ØVè"±ÿÿƒÄ_^‹Ã[ÃÌÌÌÌÌÌÌÌ̸è¶]S‹\$,‹™ƒâV‹ðW‹{Áþ‰|$ …ö„Ã…ÿ„»U‹l$4D7;E‹Åë PU袥ÿÿƒÄ…À„ ‹C$1E ‹K‹T$‹E‹]‰L$L2;Á<»}ëI‹UÇ‚@;Á|ñ‹D$8‰M‹H@‹D$‰L$…À~Z‰D$8ë ëI‹D$‹¯T$RP‹D$PSèø ƒÇƒÄƒÃ9Güs ƒuƒGuƒGGu d$ƒÀƒtøƒl$8u±‹E…À~‹MDüI‹ƒè…ÒuÿM9Uï‹E;Æ‹D$0Ç@]_^¸[ƒÄË|$0+Æ;w‹Ø‰\$‹Çë VW蔤ÿÿƒÄ…Àu ]_^3À[ƒÄÃ+ÞÁûƒã÷Û‹Ë÷Ñ‹Ó#T$#Î Ê‹T$‰O‹E ‰G ‹‹M‹þ+|$VR,±ÁÿUƒçP‰D$H÷ß臋L$H÷Ø Ã Ç÷×#Ç‹ø÷×#ù#Å øƒîƒÄ3Ò‰|$(…öŽ‹Ý+߉\$‹\$8+ßG‹ýƒÁ+|$8‰\$ ‰|$‹Xü‹xø‰\$‹ÇD•‰\$‹X‰\$$‹\$Ç‹\$ ‰yü‹|$Ç‹|$‰9‹|$ÇD• ‰<‹|$$‰yƒÂƒÁƒÀ;Ö|›‹L$8‹|$(ƒÆ;Ö}+ù+é‘+ò‹ ‰Ç(ƒÀƒîuì‹D$4‹H…É~‹LŠü‹ƒé…ÒuÿH9Pï‹D$0‹H…ÉŽnþÿÿ‹LŠüëI‹ƒé…Ò…VþÿÿÿH9Pë]_^B[ƒÄËD$,_^Ç@¸[ƒÄÃÌÌÌÌÌÌÌÌÌSVW‹|$W3Ûè¡­ÿÿWè+®ÿÿ‹ðƒÄ…öt'‹D$PVè÷¢ÿÿƒÄ…Àt‹L$‹T$QVRè°üÿÿƒÄ ‹ØWèµ­ÿÿƒÄ_^‹Ã[ÃÌÌÌÌÌÌÌÌÌÌÌÌV‹t$FPÇèü ÿÿNQèó ÿÿV,Rèê ÿÿƒÄ ÇF@ÇFD^ÃÌÌÌÌÌÌÌV‹t$…öt-FPè~ ÿÿNQèu ÿÿV,Rèl ÿÿƒÄ öFDt Vè½0þÿƒÄ^ÃÌÌÌÌÌÌÌ̸$èÆYV‹t$4WVÇD$ 責ÿÿVè<­ÿÿ‹øƒÄ…ÿ„LS‹\$4U‹l$F;÷|É‹D$S3öUPÇD$@3ÿ‰t$<‰t$DèÇ•ÿÿ‹L$,PQè\øÿÿƒÄ…À„‹D$$ƒÀÿ‰D$ˆÏ‹L$hÿ‹Á+D$,‰D$¸+Á‰D$$d$ƒ|$4u‹T$‹D$ SRPPPèøÿÿƒÄ…À„®…öuz‹D$‹Œ$HPQèVÿÿƒÄ…Àta‹D$‹T$$‹œ$HÐ4*VSè4ÿÿƒÄ…ÀuFVSè%ÿÿƒÄ…Àtñ‹Æ;è‰D$0¾‹Ý|‹Œ$HSQöèýœÿÿƒÄ…ÀtFK;\$0}á…ÿuy‹T$‹„$PRPèØœÿÿƒÄ…Àt`‹L$$‹œ$P<)WS輜ÿÿƒÄ…ÀuëIGWS訜ÿÿƒÄ…Àtñ‹Ç;è‰D$8¿‹Ý|‹”$PSRÿ耜ÿÿƒÄ…ÀtGK;\$8}á…öt9‹D$;D$0u/‹Œ$X‹T$QRÑþ‹„´ÄP‹D$,PPèÑöÿÿƒÄ…Àt|3ö‰t$4…ÿt6‹L$;L$8u,‹”$X‹D$RP‹D$(Ñÿ‹L¼DQPPè—öÿÿƒÄ…ÀtB3ÿ‰|$4‹D$‹œ$XHM‰D$…ÀQþÿÿ‹T$‹D$ ‹Œ$@SRPQèyóÿÿƒÄÇD$(ƒ¼$\‹œ$Xu‹l$…ít UèïóÿÿƒÄSèF¡ÿÿ‹D$,ƒÄ][^_Ä,ÃÌÌÌ̸ èÖM‹D$(SU‹Ø%ÿÿÿ?V4‹î3è‰l$6‰T$‹ê3Ö‰T$$3ЉT$(3è‰D$‰l$ ‰t$ÇD$ ‹ÁÁèƒà‹t„ õ‹Ñƒâ3D” ‹ÑÁêƒâ‹T” ‹êÁêÁî3òÁå3Å‹ÑÁê ƒâ‹T” ‹êÁê3òÁå 3Å‹ÑÁê ƒâ‹T” ‹êÁê3òÁå ‹ÑÁêƒâ‹T” 3Å‹êÁê3ò‹ÑÁêƒâ‹T” Áå3Å‹êÁêÁå3ò‹ÑÁë3ÅÁêƒâ‹T” ‹êÁê 3òÁå3Å‹ÑÁêƒâ‹T” ‹êÁê3òÁå‹ÑÁêƒâ‹T” 3Å‹êÁê3òÁå‹ÑÁê‹T” 3Å‹êÁåÁê3Å3òöÃt‹ÑÁâ3‹ÑÁê3òöÃt‹ÑÁâÑé3Â3ñ‹L$0‰1^]‰[ƒÄ ËT$0‰2^]‰[ƒÄ ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹HS‹\$;KVW}‹û‹Øë‹ø‹G‹t$;F~ PVèR”ÿÿƒÄ3À9C~‹‹ ‹‚3‹‰@;C|ë;G}‹‹‚‹‰@;G|ð‹‰~…ÿ~‹D¸üƒÉÿ‹ƒè…ÒuN9Vï_^¸[Ã̸ è¶KV‹t$ƒ>u‹D$jP耕ÿÿƒÄ¸^ƒÄ ÃS‹\$W‹|$ ;ût>‹G;C‹Ãë PS袓ÿÿƒÄ…Àu_[^ƒÄ Ã3À9G~‹‹ ‹‰ ‚@;G|ð‹W‰S‹‹;U‹kÁêM;ê‰T$ŽÏ‹Å+ ‡‰L$d$‹¯…Ûu Mƒl$é¢Nǯƒ9ÇD$t^¤$‹+‹ðæ€yNƒÎàF™ƒâÂÁø‹Õ+З‹Ó‹ÎÓê1…öt¹ +΋ÓÓâ1Pü‹D$‹L$(‹t$(@ƒ< ‰D$u©‹‹Ëƒà‰L$‹È‹ÓÓê‹Ê‹T$1 …Àt ¹ +ÈÓã1Zü‹T$;êDÿÿÿ‹\$ …Š‹‹,—ƒà‹Ý‹ÈÓë…Ûtt¹ +È…Àt ÓåÓí‰,—ëÇ—1ƒ~F½tË‹Áƒá‹óÓæ‹ÑÁè¹ 14‡+Ê‹óÓî…Òt …öt1t‡D‡‹T$(Eƒ<ªªuÄ‹T$‹t$(ézÿÿÿ‹\$ ‹C]…À~‹ DüƒÉÿ‹ƒè…ÒuK9Sï_[¸^ƒÄ ÃÌ̸è–IS‹\$UV3íS‰l$胜ÿÿSè ÿÿ‹ðƒÄ…öu^][YÃW‹|$‹GÀ;F‹Æë PVè…‘ÿÿƒÄ…À„÷‹Oƒéˆ£‹‹ˆ‹èÁí‹,­`‹ Áå‹ÐÁêƒâ ,•`‹ ‹ÐÁêƒâÁå ,•`‹ ÁèÁåƒà ,…`‹ ‹‰lÈ‹‹Š‹ÐÁê ƒâ‹•`‹ ‹èÁíÁâƒå ­`‹ ‹èÁâÁíƒå ­`‹ ƒàÁâ …`‹ ƒé‹‰Tȉaÿÿÿ‹l$‹ÿ‰~…ÿ~ ‹D¹üƒÉÿ›‹ƒè…ÒuN9Vï‹D$ ‹L$PVQèŸüÿÿƒÄ …Àt½Sè›ÿÿƒÄ_^‹Å][YÃÌÌS‹\$V3ö9s„äVSèÈ•ÿÿƒÄ…À„Ò‹SƒêˆÁUW‹úÁçë¤$‹ƒ<„–¸€¹‹+…D•t;t$}‹l$‰\µ‹\$F‹+Ñè…D•t;t$}‹l$\ÿ‰\µ‹\$F‹+Ñè…D•t;t$}‹l$\þ‰\µ‹\$F‹+Ñè…D•t;t$}‹l$\ý‰\µ‹\$FÑèƒé‰tÿÿÿJƒï …ÒRÿÿÿ_]‹Æ^[Ã^3À[ÃÌÌÌÌÌÌS‹\$ VWjSè‘ÿÿ‹|$3öƒÄ97t‹Ç‹ÿ‹PSè·“ÿÿƒÄ…ÀtFƒ<··uæjSèž“ÿÿƒÄ_^¸[Ã_^3À[ÃÌÌÌÌÌÌÌÌÌÌÌÌS‹\$UVWS3íèÀŒÿÿ‹øh¬½h ‹ Pèçþÿ‹ðƒÄ…öteWVSèfþÿÿ‹ØƒÄ …Ût);ß%‹L$‹T$VQRèÉúÿÿƒÄ V‹Øè^þÿƒÄ_^]‹Ã[Ãh°h ‹ jjhƒjè|óƒÄVè3þÿƒÄ_^]‹Ã[Ã_^‹Å][ÃÌ̸4è6FS‹\$DV‹t$DÇD$;óu‹D$P‹L$L‹T$@PQVRèküÿÿƒÄ^[ƒÄ4ÃUW‹|$XWèö˜ÿÿW耙ÿÿ‹èƒÄ…í„ã‹F‹Kt;u‹Åë VUèùÿÿƒÄ…À„¾3À‰u…ö~ëI‹UÇ‚@;Æ|ñ‹K3ÿ‰|$ …ÉŽH‹D$L‹@ë¤$‹4½‹2Ö‰\$_;Ùu ÇD$ë‹J‰L$3Ò‰T$…ÀŽê‹L$3L$‰L$(ë‹T$‹L$L‹ ‹<‘ ‘B‰|$;Ðu3Ûë‹Y‹L$T$@SR|$Dè'÷ÿÿ‹D$$PL$DQ‹L$(|$Dè÷ÿÿ3\$,‹L$8T$‹ÿWSVVèWõÿÿƒÄ…ÀtF‹T$ URè…ŒÿÿƒÄ…Àt‹D$WSPVVèøÿÿƒÄ…ÀtƒíyÄ‹L$VQè)‡ÿÿƒÄ…ÀtÇD$[Wèó‘ÿÿ‹D$ƒÄ_^]YÃÌÌÌÌÌÌÌS‹\$UVWS3íèp„ÿÿ‹øhO½h ‹ Pè—þÿ‹ðƒÄ…ötoWVSèöÿÿ‹ØƒÄ …Ût3;ß/‹L$$‹T$‹D$Q‹L$VRPQèþÿÿƒÄV‹ØèþÿƒÄ_^]‹Ã[ÃhSh ‹ jjh„jè"ëƒÄVèÙþÿƒÄ_^]‹Ã[Ã_^‹Å][ÃÌÌÌÌÌÌÌÌS‹\$U3í9+u‹D$ UP詇ÿÿƒÄE][ÃVW‹|$ Wè´ÿÿWè>‘ÿÿ‹ðƒÄ…öt(‹ IQVè;ŠÿÿƒÄ…Àt‹T$‹D$WSVRPèâýÿÿƒÄ‹èWèÇÿÿƒÄ_^‹Å][ÃÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$UVWS3íè@ƒÿÿ‹øh‰½h ‹ Pègþÿ‹ðƒÄ…ötjWVSèæôÿÿ‹ØƒÄ …Ût.;ß*‹L$ ‹T$‹D$QVRPè$ÿÿÿƒÄV‹ØèÙþÿƒÄ_^]‹Ã[Ãhh ‹ jjh‰jè÷éƒÄVè®þÿƒÄ_^]‹Ã[Ã_^‹Å][ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸è¦<3ÀV‹t$(‰D$‰D$9uP‹D$$Pèh†ÿÿƒÄ¸^ƒÄÃSUW‹|$8WènÿÿWèøÿÿ‹èW‰l$$èìÿÿW‹ØèäÿÿƒÄ‰D$4…À„¤‹L$0VQUèyðÿÿƒÄ …À„ƒ}u‹T$,jRèü…ÿÿƒÄékö„ÜUSèt„ÿÿƒÄ…À„X‹Hƒàþ½ƒørIWVSSè@òÿÿƒÄ…À„4WVSSè,òÿÿƒÄ…À„ ‹L$QSSèeïÿÿƒÄ …À„ ‹JEÑê;êv·WV‹t$‰D$\9n …ìhü VèЃÿÿƒÄ…ÀÖVh 躃ÿÿƒÄ;Åu‹L$XUQèØÿÿƒÄ_^¸]ƒÄHÃ~‹D$X;ÆtêVPèH€ÿÿƒÄ÷Ø_À^÷Ø]ƒÄHÃS‹\$\;ÞtAƒ{|‹Ãë jSèÝÿÿƒÄ;Åu [_^3À]ƒÄHË3‹Ï‹Æº+΋,‰(ƒÀƒêuó3íë‹÷‹T$`ƒÇD$(WƒÂúP¹èâþÿÿ‹L$4‹D$0‰L$‰L$$jL$QVV‰D$(‰D$0‰l$8‰l$<èé‹L$LjT$,R‹ø‹D$PVV‰l$8‰l$<‰D$@‰L$D‰D$H‰L$LèÔè‹L$dø‹D$`‰D$8‰D$@‰D$HjD$‰D$T…ohL VèRuÿÿƒÄ…ÀYVhè è‹T$‹D$ jjRPVUèd)ƒÄë'‹L$‹T$ QRVUè~%ë‹D$‹L$ PQVUè;'ƒÄ…ÀŽï‹T$(RVUèÔiÿÿƒÄ …À„Ø‹G‹L$(PQè+kÿÿƒÄ…À|hÞh¤ h„é£öG<t‹WSRG@j Pè ÉÿÿƒÄ…À„Ž‹W@‹G‹O‹IR‹W‹|$SP‹D$4RPWÿуÄ…ÀthWèeÿÿƒÀ™ƒâÂÁø‹Ö+ÐT$(RWè(jÿÿ‹Î+ÈƒÄ …É~‹D$$QjPèhƒÄ ‰t$ë&hÔh¤ jvë h¿h¤ jAjhjèÔ˃ÄSèûqÿÿSèuqÿÿƒÄ…ítVUè‡öýÿUèqõýÿƒÄ ^]‹D$ [_ƒÄËÿ-1-D--SWhh¤ j j3ÿèÙæýÿƒÄ9~PuEhh¤ j jè¾æýÿh h¤ j j è«æýÿƒÄ ƒ~P¿u‹D$PV袃ĉFP‹^P…Ût~USè/ƒÄ‹èèDæýÿ;è]u ‹L$ Çë\‹T$ ǃ~TuI…ÿu.h(h¤ j jè<æýÿh)h¤ j j è)æýÿƒÄ ¿ƒ~Tu‹D$PVè ƒÄ‰FT‹^T…ÿth5h¤ j j èðåýÿƒÄ_‹Ã[Ãh7h¤ j jèÕåýÿƒÄ_‹Ã[ÃÌÌÌÌÌÌÌÌÌÌÌÌ̃|$V‹ñtVSjWè\“ÿÿƒÄ^ÃhCh¤ jjè”åýÿ‹D$VSPWè7“ÿÿhEh¤ jj‹ðèråýÿƒÄ0‹Æ^ÃÌÌÌÌÌÌÌÌÌÌ̃|$V‹ñtVSjWèL—ÿÿƒÄ^ÃhRh¤ jj è4åýÿ‹D$VSPWè'—ÿÿhTh¤ jj ‹ðèåýÿƒÄ0‹Æ^ÃÌÌÌÌÌÌÌÌÌÌ̸8èvUVW3ÿƒÎÿ‰t$‰|$‰|$ èÍnÿÿ‹è;ï„pSUèLoÿÿUèÖoÿÿ‹ØU‰\$8èÊoÿÿU‰D$8èÀoÿÿ‹t$h‰D$ ‹FPèbÿÿƒÀ™ƒâ‹øhjÁÿh¤ W‰|$8è-ñýÿƒÄ ‰D$0…Û„ºƒ|$„¯…À„§‹L$\ƒétMƒét5ƒéth~h¤ jvjfjèÓȃÄé•‹L$L‹T$PQRWPèª3ë$‹L$L‹T$PQRWPè#ë‹L$L‹T$PQRWPè4ƒÄ…ÀŽS‹D$0SWPèeÿÿƒÄ …À„<‹NQSèøfÿÿƒÄ…À| hˆh¤ h„jfjèIȃÄé öF<€u[T$URè üÿÿƒÄ‰D$$…Àuh‘h¤ jDjfjèȃÄéÒ‹L$(‹T$Q‹ûR‹Í‹Øè“ýÿÿƒÄ…À„®‹|$‹\$,‹F<¨ …ă~tƒ~ tƒ~$tƒ~(t ƒ~,…¢©uKD$4PèBaÿÿ‹F‹‰T$8L$8‰L$$‹H‰L$<‹P‰T$@‹H ‰L$D‹P‹D$Hƒâþƒà ЃÄƒÊ‰T$Dë‹N‰L$ öF<t‹VURF@j PèäÃÿÿƒÄ…À„‹V@‹F‹N‹IR‹T$$UP‹D$RSPÿуÄ…Àu éÛ‹V‹D$‹JUVSPÿуÄ…À„À‹D$$…Àt*‹T$(‹L$‹|$RQ‹Í‹Øè×üÿÿƒÄ…À„’‹|$‹\$,ƒ|$\u%‹T$‹FRPSè^?ÿÿ‹t$SVèƒeÿÿƒÄ…Àt‹óë‹t$Vè^_ÿÿ‹\$XƒÀ™ƒâÂÁø‹Ï+ÈËQVèdÿÿ‹Ï+ÈƒÄ …É~ QjSèÅƒÄ ‰|$ëhmh¤ jAjfjè?ƃÄë‹|$Uè`lÿÿUèÚkÿÿ‹t$8ƒÄ[…ötWVèçðýÿVèÑïýÿƒÄ ‹D$_^]ƒÄ8Ã_‹Æ^]ƒÄ8ÃÌÌÌÌÌÌÌÌÌ̸4èÆUVW3ÿƒÎÿ‰t$ ‰|$‰|$èkÿÿ‹è;ï„ASUèœkÿÿUè&lÿÿU‹øèlÿÿU‰D$8èlÿÿ‹t$d‰D$$‹FPèc^ÿÿƒÀ™ƒâ‹ØhïÁûh¤ S‰\$@èíýÿƒÄ ‰D$,…ÿ„ƒ|$„„…À„|‹D$H;Ã~húh¤ jljejè2ŃÄéu‹L$LWPQè>bÿÿƒÄ …À„^‹VRWè™cÿÿƒÄ…À| hh¤ h„jejèêăÄé-öF<€uUD$UPèAùÿÿƒÄ‰D$…Àuh h¤ jDjejè±ÄƒÄéô‹L$(‹T$QR‹Í‹Øè6úÿÿƒÄ…À„Ò‹\$ ‹N<öÁ …·ƒ~tƒ~ tƒ~$tƒ~(t ƒ~,…•÷Áu>D$0‰D$$‹F‹‰T$0‹P‰T$4‹P‰T$8‹P ‰T$<‹@‹T$@ƒàþƒâ ƒÈ‰D$@ë‹F‰D$$öÁt‹NUQV@j Rè—ÀÿÿƒÄ…À„7‹N@‹V‹F‹@Q‹L$(UR‹T$ QWRÿЃÄ…Àu é‹N‹T$‹AUVWRÿЃÄ…À„ôƒ|$t(‹L$(‹T$‹|$‹\$QR‹Íè‰ùÿÿƒÄ…À„Å‹\$ ‹t$,‹D$VPè{aÿÿ‹L$`IƒÄƒùwqÿ$¨7‹L$PSPVSQè ë5‹T$PjjSPVSRèÅ!ƒÄë!SP‹D$XVSPèrë‹L$PSPVSQèâƒÄ‰D$…À}RhPh¤ jrjejèòƒÄë8hLh¤ jvjejèØÂƒÄëhòh¤ jAjejè¾ÂƒÄë‹\$ UèßhÿÿUèYhÿÿ‹t$4ƒÄ…ötSVègíýÿVèQìýÿƒÄ ‹D$[_^]ƒÄ4Ã_‹Æ^]ƒÄ4ÃÉ6ð67Ù6ÌÌÌÌÌÌÌ̸è6W‹|$‹GPÇD$ÿÿÿÿè[ÿÿƒÄ=@~ hlh¤ jijgjè!ƒăÈÿ_ƒÄËO‹WQRè™`ÿÿƒÄ…À hrh¤ jejgjèíÁƒÄƒÈÿ_ƒÄËGPè©ZÿÿƒÄ= ~‹OQè–ZÿÿƒÄƒø@~h{ëºUègÿÿ‹è…í„ïSVUègÿÿUè hÿÿU‹Øèhÿÿ‹WR‰D$$èTZÿÿƒÀ™ƒâ‹ðh…Áþh¤ VèvéýÿƒÄ‰D$(…Û„^ƒ|$„S…À„K‹D$;Æ~hh¤ jlé>SP‹D$(Pè?^ÿÿƒÄ …À„3‹OQSèš_ÿÿƒÄ…À|h˜h¤ h„éöG<t‹WURG@j Pèy½ÿÿƒÄ…À„í‹W@‹G‹OR‹WUP‹ARS‹\$(SÿЃÄ…À„ǃ|$,u‹ ‹ƒâ€ú t‹GSPSè:9ÿÿƒÄ ‹|$(WSèŒ^ÿÿ‹L$4ƒÄƒétDƒét/ƒéthµh¤ jvjgjèQÀƒÄëo‹L$$VPWVQè®+ë‹T$$VPWVRèþëVP‹D$,WVPè.ƒÄ‰D$…À}6h¹h¤ jrjgjèþ¿ƒÄëhˆh¤ jAjgjè促ċ|$(UèfÿÿUèeÿÿƒÄ…ÿtVWè“êýÿWè}éýÿƒÄ ^[‹D$]_ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸ˆèvSUVW‹¼$¨WÇD$è]eÿÿWèçeÿÿW‹ØèßeÿÿW‰D$ èÕeÿÿ‹´$´ƒÄ÷F<‰D$D…D$HPèàXÿÿ‹F‹‰L$L‹P‰T$P‹H‰L$T‹P ‹L$\‰T$X‹@ƒàþƒá ÁT$ ƒÈRl$P‰D$`èžXÿÿD$$‰D$‹F ‹‰L$$‹P‰T$(‹H‰L$,‹P ‹L$4‰T$0‹@ƒàþƒá ÁƒÄƒÈ‰D$,ë ‹V ‹n‰T$öF<t4WUFDj Pè@»ÿÿƒÄ…À„ ‹L$WQVHj Rè$»ÿÿƒÄ…À„íöF<t‹FWPN@j Qè»ÿÿƒÄ…À„Ì÷F<‹¬$ Wu=‹E‹M‹U‰D$8‹E‰L$<‹L$Dƒàþƒá‰T$4‹U ÁƒÈ‰T$@‹V ‰D$DRD$8Pë‹N QUSjè<ÿÿƒÄ…À„f÷F<u:‹F(‹‰T$\‹P‰T$`‹P‰T$d‹P ‰T$h‹@‹T$lƒàþƒâ ƒÈL$\‰D$lë‹N(‹VH‹FR‹V WR‹PQ‹L$ SQÿ҃ąÀ„ý÷F<Wu=‹M‹U‹E‰L$8‹M‰T$<‹T$Dƒáþƒâ‰D$4‹E ʃɉD$@‹F‰L$DPL$8Që‹VRUSjèU;ÿÿƒÄ…À„ž÷F<u@‹F$‹‰T$p‹P‰T$t‹P‰T$x‹P ‰T$|‹@‹”$€ƒàþƒâ ƒÈL$p‰„$€ë‹N$‹VD‹FR‹VWR‹PQ‹Œ$¬SQÿ҃ąÀ„,‹D$P‹„$ PPèU5ÿÿƒÄ …À„‹„$œƒx t‹NQPPè6ÿÿƒÄ …À„ë‹„$œ‹V,WRPSèmÿÿƒÄ…À„Í÷F<uL‹ ‰Œ$„‹S‰”$ˆ‹K‰Œ$Œ‹S ‰”$‹K‹”$”ƒáþƒâ ʃÉ„$„‰Œ$”ë‹Ã‹N‹”$œWQPRjè :ÿÿƒÄ…À„V‹„$œƒx t‹NQPPèJ5ÿÿƒÄ …À„3‹„$œ‹V WRPSèLlÿÿƒÄ…À„‹D$‹Œ$œPSQè5ÿÿƒÄ …À„÷‹N…É„ä‹F…À„Ù‹^@‹VS‹\$HWP‹„$¨Q‹JPSÿуÄ…À„ºUSSèî3ÿÿƒÄ …À„§‹VWRSSjèE9ÿÿƒÄ…À„Žƒ{ t‹FPSSè‰4ÿÿƒÄ …Àtvƒ{th÷F<u:‹F‹‰T$‹P‰T$ ‹P‰T$$‹P ‰T$(‹@‹T$,ƒàþƒâ ƒÈL$‰D$,ë‹N‹V@‹FR‹VWR‹PQ‹Œ$¬UQÿ҃ąÀtÇD$Wè¶`ÿÿ‹D$ƒÄ_^][ĈÃÌÌÌÌ‹D$ƒH<¸ÃÌÌV‹t$‹F@…Àt Pè³ÿÿƒÄ‹FD…Àt Pè³ÿÿƒÄ‹vH…öt Vèþ²ÿÿƒÄ¸^ÃÌÌÌ̸Tèö SU‹l$dVW‹ù‹òÇD$èM_ÿÿ‹Ø‰\$…Û„SèÉ_ÿÿSèS`ÿÿS‰D$0èI`ÿÿS‰D$,è?`ÿÿS‰D$,è5`ÿÿƒÄ…À„hG™+‹ØÑû+ûƒ~‰|$ uè_Sÿÿ‰F…À„>ƒ~uèISÿÿ‰F…À„(ƒ~uè3Sÿÿ‰F…À„ƒ~uèSÿÿ‰F…À„üƒ~ uèSÿÿ‰F …À„æƒ~$uèñRÿÿ‰F$…À„Ѓ~(uèÛRÿÿ‰F(…À„ºƒ~,uèÅRÿÿ‰F,…À„¤‹D$h‹NPQè}ÿÿƒÄÇFP‹F<ƒà÷ €‰F<^ÃÌÌÌ̸èFƒ|$Ç$„µƒ|$ „ªƒ|$„ŸSUWVèZÿÿVèŸZÿÿV‹Øè—ZÿÿV‹èèZÿÿ‹øƒÄ…ÿtcèLÿÿP‹D$PUèµ,ÿÿƒÄ …ÀtKèiLÿÿ‹L$PQWè,ÿÿƒÄ …Àt3VWUSè}dÿÿƒÄ…Àt#‹T$VSRjèÈÿÿƒÄV‹øèíYÿÿƒÄ‹Ç_][YË|$ VèÙYÿÿƒÄ‹Ç_][YÃ3ÀYÃÌÌÌÌÌÌÌÌÌÌ̸èfUV‹t$$3í…öuèÅXÿÿ‹ð…öu^]ƒÄÃSWVèAYÿÿVèËYÿÿ‹|$0‹ØƒÄ…Ûu h¹hÔ jAhˆjè6³ƒÄé ‹_…Ûu=‹G ‹O‹WPQRè¦þÿÿ‹ØƒÄ …Ûu#hÂhÔ hŒhˆjèò²ƒÄéÈèÕ§…Àu/‹G…Àt(9(t$‹È¸èªÙî‹AÝ$‹ ÀÀPQèu¦ƒÄ÷G<u:‹G‹‰T$‹P‰T$‹P‰T$‹P ‰T$‹@‹T$ ƒàþƒâ ƒÈL$‰D$ ë‹O‹G@‹WP‹BPVQSjè'}ÿÿ‹èƒÄ…íuhÞhÔ jhˆjè6²ƒÄëè\ÍýÿPUèeãƒÄVèLXÿÿƒÄƒ|$,u Vè¼WÿÿƒÄƒu Sè]KÿÿƒÄ_[^‹Å]ƒÄÃV‹t$‹FPW3ÿ;ÇtPè‹zÿÿ‹F<ƒà÷ƒÄ €‰~P‰F<‹L$QVè,þÿÿƒÄ‰FP;Çt‹V<âÿÿÿƒÊ_‰V<¸^ËÇ_^ÃÌÌÌÌÌ̸0èfSUW‹|$T3Û3íöG<@ÇD$ t0‹G‹@,;Ãt&‹L$P‹T$LWQ‹L$PR‹T$PQ‹L$PRQÿЃÄ_][ƒÄ0ËD$@Vƒøru6¾$9t$Lt"jWhì hƒjuj豃Ä^_]3À[ƒÄ0Ë\$HéŸT$(P‰T$è׋L$‰‹L$‹ƒÄ;Ãujihì jujujèʰƒÄ^_]3À[ƒÄ0Ã9X ujnhì jtjuj覰ƒÄ^_]3À[ƒÄ0ÃT$ ÇD$ ‰\$$‰Q‹L$H‹T$LD$0‰D$D$SP‰L$@‰T$8èÓ¾ƒÄ‹ðWè˜ûÿÿHõƒÄ;ñ‰D$~j~hì jpjujè8°ƒÄ^_]3À[ƒÄ0Ã|$DrtTh‚@hì Pè#Øýÿ‹èƒÄ …íu"h…hì jAjujèõ¯ƒÄ^_]3À[ƒÄ0ÃT$XRD$P‰l$`èE¾ƒÄ‹Ý‹L$PjWQSVèÑúÿÿƒÄ…À3öë ‹T$T‹t$‰ƒ|$Drt‹D$@PUèiÚýÿUèSÙýÿƒÄ ‹Æ^_][ƒÄ0ÃÌÌÌÌÌ̸ èVV‹t$(VÇD$ è£úÿÿ‹L$(ƒÄ;Èth¢hì jwjwjèC¯ƒÄ3À^ƒÄ ÃöF<@t*‹F‹@0…Àt ‹T$VQ‹L$(Q‹L$$R‹T$$QRÿЃÄ^ƒÄ ÃUh¬hì Qè×ýÿ‹èƒÄ ‰l$…íu"h¯hì jAjwjèÖ®‹D$ ƒÄ]^ƒÄ ÃS‹\$$W‹|$ ƒÿru%ƒû$t h¶hì hƒjwj讃Äé’‹D$,‹L$0jVUPQè²ùÿÿ‹ðƒÄ…öŽrƒÿruLƒþ$u*‹È‹D$$‹Õ+Ћ4;0uƒéƒÀƒùsîÇD$é>hÉhì jhjwjè,®ƒÄé!VT$Rj‰l$$èc¼‹èƒÄ …í„ÿ‹D$ð9t$t hÔéÍ‹M‹A…ÀtPè@€ƒÄƒøt hÝé«‹U‹PècÙƒÄ;Çt=ƒÿuƒøthøhì jdé…ƒÿuêƒøuåhž ÿÐ ƒÀ@Pÿ! ƒÄ‹M9uP‹I‹t$$‹Ãƒûr‹;u<ƒèƒÁƒÆƒøsì…Àt Š:u$ƒøvŠQ:VuƒøvŠA:Fu ÇD$ëhÿhì jhjwjè­ƒÄU誻ƒÄ‹l$‹L$0QUèÈ×ýÿUè²Öýÿ‹D$ ƒÄ _[]^ƒÄ ÃÌÌ̸è¶ÿ‹D$ ‹L$SWT$ jRÇD$ÇD$‰D$‰L$è¨5‹\$ªƒÄ3À[ÃV‹t$ +ÃWÆƒè‹øFWÆFhÿVè~ý‹T$$÷SÆRFVèfýƒÄ_^¸[ÃÌÌÌÌÌÌÌÌ‹T$B9D$…É‹D$ €8H…¹Vrÿ3À…ö~ëI€9ÿu$@A;Æ|õ;ÆuujV賜ƒÄ…À~(€>tìCF;ß|á‹T$UÆRFVèÃûƒÄ [_^¸]Ã[_^3À]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$A9D$…«‹D$ €8P…›Vqÿ3À…ö~ëIŠ B„Ét@;Æ|ô;ÆuhÌhø¥ jqjqjè맃ăÈÿ^Ãø}hÒhø¥ jgjqjèɧƒÄƒÈÿ^ÃÉÿ+Èñ;t$ ~hÙhø¥ jmjqj蟧ƒÄƒÈÿ^ÃVR‹T$RèíúƒÄ ‹Æ^Ãh¾hø¥ jkjqjèo§ƒÄƒÈÿÃÌÌÌÌÌÌÌÌ‹D$U‹l$Hõ;é~jIh¦ jnjnjè>§ƒÄ3À]ËL$V+ÅWqƒè Æ‹øÆFWVèI›ƒÄ…À_^3À]ÃS3Û…ÿ~$ëI€>ujVè#›ƒÄ…À~5€>tìCF;ß|á‹T$¸‰‰FƒÆUÆRFVè&úƒÄ [_^¸]Ã[_^3À]ËD$ƒø }jrh¦ jojrj蕦ƒÄƒÈÿÃH9L$…É‹L$ €9Q…¹Vpÿ3É…ö~¤$ŠB„ÀtA;Î|ô;Ît{ƒù|v¸÷ÿÿÿ›€<u@ƒøÿ|ôƒøÿuh‹h¦ jsjrj覃ăÈÿ^ÃÈÿ+Áð;t$ ~h“h¦ jmjrjèð¥ƒÄƒÈÿ^ËL$VRQè>ùƒÄ ‹Æ^Ãh‚h¦ jqjrjèÀ¥ƒÄƒÈÿ^Ãjwh¦ jkjrj覥ƒÄƒÈÿÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$;Á~jFh(¦ jnjkjèr¥ƒÄ3ÀÃ}jLh(¦ jzjkjèX¥ƒÄ3ÀËL$P‹D$PQè¤øƒÄ ¸ÃÌÌÌÌÌÌÌÌÌS‹\$ W‹|$;û~jZh(¦ jmjoj襃Ä_ƒÈÿ[ÃV‹t$‹Ã+ÇPjVè]ø‹L$$W+÷QóVèGøƒÄ^_‹Ã[ÃÌÌÌÌÌÌÌÌÌÌÌ̸hè¦÷¡Àç3ĉD$d‹D$l‹L$tSUVW‹¼$ŒT$$R‰D$‰L$‰|$$3öè ß‹¬$„‹GƒÄ3Û‰D$…íޏëI‹|$ ‹ËÁùjˆL$‹Ó‹ÃL$(ÁúÁøWQˆT$ˆD$ˆ\$è`à‹”$”‹D$$RPL$8QèÙàjT$,RD$DPèÈà‹L$@ƒÄ$<1;ýj‹T$ÖRD$,Pè·àƒÄ ‹÷ë*L$8QT$,Rè¡à‹T$ ‹Å+ÆPL$DQÖRè-÷ƒÄ‹õC;õŒMÿÿÿD$$Pèóà‹L$xƒÄ_^][3Ì3ÀèªöƒÄhÃÌÌÌÌÌÌÌÌÌÌ̸(èfö¡Àç3ĉD$$‹D$4‹L$hœ¦ W‰D$$è@Áýÿ‹ØƒÄ …Ûuj~hœ¦ jAj~j虃Ä韋L$‹T$‹D$QRPWSè'ôÿÿƒÄ…ÿ~‹Ã+ó‹ÏŠ0@ƒéuõ…ít¹+͸ÿÓø 3ö€;uGÿ;ð}F€<tõŠ F€ùt h‰hœ¦ h‡j~j蔘ƒÄé‹„$Œ…À|(‹×+Ö;Ðt hŽhœ¦ hˆj~jèa˜ƒÄéëD$$Pè_Ó‹L$ jQT$0Rè^ÔjD$8h”¦ PèÝÔ‹l$0‹L$ÿƺF‹L$SQVèèƒÄ ÆÌ^_¸[ÃÌÌÌÌÌV‹t$9t$…½‹L$Љ~‰~‰~‰~‰~‰~ ‰~$‰~(‰~,ÇF8‰~@‰~D‰~H‰~P‰~T‰~L‹Q$Vj‰V<èyÏýÿ‹F‹@ƒÄ ;Çt.VÿЃÄ…Àu$‹F ;Çt Pèµ€ƒÄSVjè ÐýÿVèSµýÿƒÄ3ö[_‹Æ^ÃÌÌÌÌÌÌÌÌV‹t$…ö„ hçht¨ j F8jÿPèì¦ýÿƒÄ…Àè‹N‹A …ÀtVÿЃÄ‹F …Àt PèD€ƒÄV0RVjè•Ïýÿ‹FƒÄ …Àt Pè$ÿÿƒÄ‹F…Àt Pè$ÿÿƒÄ‹F…Àt Pèõ#ÿÿƒÄ‹F…Àt Pèå#ÿÿƒÄ‹F …Àt PèÕ#ÿÿƒÄ‹F$…Àt PèÅ#ÿÿƒÄ‹F(…Àt Pèµ#ÿÿƒÄ‹F,…Àt Pè¥#ÿÿƒÄ‹FP…Àt PèESÿÿƒÄ‹FT…Àt Pè5SÿÿƒÄ‹FL…Àt PèE²ýÿƒÄVè,´ýÿƒÄ^ÃÌÌÌÌÌÌÌ‹D$h ht¨ j ƒÀ8jPèÕ¥ýÿ3ɃăøŸÁ‹ÁÃÌÌÌÌÌÌÌ‹D$‹L$‹T$ P‹D$ Q‹L$ RPQjè`ÍýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ‹T$ƒÂ0‰T$éÀÎýÿ‹L$ƒÁ0‰L$éPÏýÿ‹D$…ÀuË@‹@$øè¦ÜU‹l$$ƒ}Eu ¸]ƒÄÃSVW}(‰|$$‹?‹u$U ‰T$‹‰t$ ‹6~Mz‹‰L$‹ y‰D$‹E,z‹H],DhD…|ht¨ R‰\$4èš°ýÿƒÄ ‰D$…Àu%hFht¨ jAh‚jè'‰ƒÄ_^[3À]ƒÄÃXÇD$0‹ø‹D$0‹D„‹0‰8‹‰‹V‰W‹F‰G‹N ‰O ÇG‰‹F‹ÀÀPQSè3Ü‹VV“èÅ!ÿÿ‹D$@@ƒÄƒÇƒø‰D$0|¤‹D$ƒe<ù_^‰EL[¸]ƒÄÃÌÌÌÌÌÌÌÌÌjè™ûÿÿƒÄÃÌÌÌÌ̸¤èVÛ¡Àç3ĉ„$ ‹„$¨S‰T$H‹”$¸3Û=V‰L$@‹Œ$´‰T$D‹”$ÀW‹¼$¼‰L$0‰T$‰\$$‰\$8ÇD$4}¸ƒÀ?™ƒâ?‹ðÁþÁæ;ût ƒÿ} 3ɉL$0ƒÿ~ ¿‰¼$¼;Ët:ƒÿu5‹‹Q‰„$„‹A‰”$ˆ‹Q ‰„$Œ‹A‰”$‰„$”‰\$0èì,ÿÿ‰D$ ;ćè˃ÿÿ‰D$;Ä6‹|$ WèU-ÿÿWèß-ÿÿW‰D$èÕ-ÿÿW‰D$hèË-ÿÿW‰D$<èÁ-ÿÿW‰D$4è·-ÿÿW‰D$pè­-ÿÿW‰D$`è£-ÿÿW‰D$pè™-ÿÿNƒÄ$‹øV‰|$‰t$@è…ÿÿPWèJÿÿƒÄ …À„ºU»‹t$<‹L$VjQè¼hÿÿóƒÄ ‰t$<…À„‘3í9¬$Àu”$ˆjRèQ{ƒÄ‹ë뉬$À‹„$ˆ‹Œ$Œ‹”$‹´$”‹¼$˜‰D$`‰„$œ‰L$d‰T$h‰t$l‰|$p‰Œ$ ‰”$¤‰´$¨‰¼$¬¸d$\`u\_u\^u\]u \\uƒèyÝjèvëPj„$€PŒ$˜jQèŃÄjèRëPj”$¨RD$pjPèûăÄ3À›¶Œœ0Lt¶”¶Œž0Tu0Lv¶”Ÿ¶Œ 0Tw0LxƒÀƒø|¼‹t$ €L$t€œ$‡VT$xjRèŸ"ÿÿƒÄ …À„*‹|$‹D$$WUPj2Vè‘kÿÿƒÄ…À „WþÿÿéjjWègÿÿƒÄ …À„ðjjWègÿÿƒÄ …À„Û¸gfff÷l$@Áú‹ê3ÉÁí‰L$0êë‹|$…ÉtQjWèÉfÿÿƒÄ …À„¤‹L$,jQè¢!ÿÿƒÄ3ö…팬3ÿI¸\`u\_u\^u\]u \\uƒèyÝjèñéPj”$€RD$pjPèšÃ‹L$(Q”$jRè–!ÿÿƒÄ$…À„!‹D$WPPèoGÿÿƒÄ …À„ ‹D$P‹D$0PPèÄýþÿƒÄ …À„ïóÇ ;õŽYÿÿÿ‹L$@‹t$,QVèÚ$ÿÿƒÄ…À„ÅV‹t$\VèTÿÿƒÄ…À„¯‹T$RVVèmýþÿƒÄ …À„˜‹D$ ‹L$PQè“EÿÿƒÄ…À„~‹|$$‹T$‹D$DWRVPjèÑÿÿƒÄ…À„\èÿÿ‹L$D‹T$PQRèAüþÿƒÄ …À„<‹D$PV‹t$XVè&üþÿƒÄ …À„!‹L$QVè@"ÿÿƒÄ…À|‹T$RSWj2VèziÿÿƒÄ…À!…ó‹L$0Ëù‰L$0Œþÿÿé%üÿÿ‹D$SjPèådÿÿƒÄ …À„Àèuÿÿ‹l$PVUè©ûþÿƒÄ …À„¤‹L$ ‹T$WQUjRèûÿÿƒÄ…À„†jUèˆÿÿƒÄ…À„s‹D$WVPèÁ{ÿÿƒÄ …À„\‹L$‹T$QWVR‹Å‹l$lPUè­ÿÿƒÄ…À„8‹ÿ9]uP‹M9uIƒ} uCèÙÿÿP‹D$PPèÝûþÿƒÄ …À„‹T$‹D$‹L$\$8RWVPQUèWÿÿƒÄ…Àu°éá‹T$SjRèîcÿÿƒÄ …À„É‹|$H‹G ‰\$(…Àt Pè^ÿÿƒÄ‹G…Àt PèNÿÿƒÄ‹G…Àt Pè>ÿÿƒÄVè%$ÿÿ‰G ‹D$$Pè$ÿÿU‰Gè$ÿÿƒÄ ƒ ‰Gt ƒt…Àu ÇD$(ëU‹D$4…Àt1‹Œ$ˆ‹”$Œ‰‹Œ$‰P‹”$”‰H‹Œ$˜‰P ‰H‹D$T…Àt‹T$0‰‹D$L…Àt‹L$8‰]‹t$ Vèo'ÿÿVèé&ÿÿ‹D$ ƒÄ…Àt PèøyÿÿƒÄ‹D$$_^[‹Œ$ 3ÌèÔĤËŒ$¬_^‹Ã[3ÌèÔĤÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹A<‹@(…Àt‰L$ÿà‹D$‹T$P‹D$R‹T$P‹D$R‹T$$Pè*øÿÿƒÄÃÌÌÌÌÌ̸èvÓUV3ö‰t$èÙ%ÿÿ‹è…í„ó‹w…öuè3ÿÿ‹ð…ö„Ê‹GPVèßAÿÿƒÄ…À„¢ƒ~tåS‹_…Ûuèÿÿ‹Ø…Û„„öG(uDL$QèÇÿÿ‹‹N‰T$‹V‰L$‹N ‰T$‹V‰L$ ‹L$$ƒâþƒá уăÊD$‰T$ ë‹Æ‹W URP‹GPSèûÿÿƒÄ…Àt‰w‰_ÇD$ …Ûtƒu SèÿÿƒÄ[…ötƒu VèÿÿƒÄUèI%ÿÿ‹D$ ƒÄ^]ƒÄËÆ^]ƒÄÃÌÌÌÌW‹|$‹G<‹@,…ÀtWÿЃÄ_ÃèÄþÿÿ_ÃÌÌ‹D$£ íÃÌÌÌÌÌÌ¡ í…Àu èò£ íÃÌÌÌÌÌÌÌÌÌÌÌÌV‹t$‹F<‹@…ÀtVÿЃÄ‹F@…ÀtPètƒÄÇF@‹D$ ‰F<‹@…ÀtVÿЃÄ¸^ÃÌÌÌÌÌÌÌÌÌVWh„h´¨ jDèݦýÿ‹ð3ÿƒÄ ;÷uh‡h´¨ jAjgj è­~ƒÄ_3À^á í;Çu èG£ íS‹\$‰F<;ßt6SèsƒÄ…Àu$hh´¨ j&jgj èd~Vè¨ýÿƒÄ[_3À^É^@ëè;‡‰F@‹F@;Çt=Pèû®ƒÄ‰F<;Çu-hžh´¨ j&jgj è~‹F@Pè#sVèͧýÿƒÄ[_3À^ËN<¸^4S‰>‰~‰F‰~ ‰~‰~‰~‰~‰~ ‰~$‰~,‰F0‹Q Vj‰V(èwÁýÿ‹F<‹@ƒÄ ;Çt.VÿЃÄ…Àu$‹F@;Çt Pè³rƒÄSVjèÂýÿVèQ§ýÿƒÄ3ö[_‹Æ^ÃÌÌÌÌÌÌV‹t$…ö„Êh×h´¨ jF0jÿPèì˜ýÿƒÄ…À¨‹N<‹A…ÀtVÿЃÄ‹F@…Àt PèDrƒÄV4RVjè•Áýÿ‹F ƒÄ …Àt PèÿÿƒÄ‹F…Àt PèÿÿƒÄ‹F…Àt PèõÿÿƒÄ‹F…Àt PèåÿÿƒÄ‹F…Àt PèÕÿÿƒÄ‹F …Àt PèÅÿÿƒÄ‹F$…Àt PèµÿÿƒÄVèl¦ýÿƒÄ^ÃÌÌÌÌÌÌÌ‹D$hùh´¨ jƒÀ0jPè˜ýÿ3ɃăøŸÁ‹ÁÃÌÌÌÌÌÌÌ‹D$‹L$‹T$ P‹D$ Q‹L$ RPQjè ¿ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ‹T$ƒÂ4‰T$éÁýÿ‹L$ƒÁ4‰L$éÁýÿVW‹|$ …ÿ„ƒèÝ'‹ð…ötx‹G …ÀtPèJÿÿƒÄ‰F…ÀtX‹G…Àt Pè³ÿÿƒÄ‰F‹G…ÀtPè ÿÿƒÄ‰F …Àt.‹G…ÀtPè ÿÿƒÄ‰F…Àt‹G…ÀtPèòÿÿƒÄ‰F…ÀuVèÒ%ƒÄ_3À^Ã_‹Æ^ÃÌÌÌÌÌjè™üÿÿƒÄÃÌÌÌÌ̃|$u*jKh8« jèk£ýÿ‹L$ÇÇ@‰ƒÄ ¸øÃÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h8© PQRè7ÿƒÄÃÌÌÌ‹D$‹L$h8© PQè|çƒÄ ÃÌÌÌÌÌÌÌÌ‹D$…Àuècÿÿÿ‹L$‰÷ØÀƒàÃøuV‹t$ ‹RèCýÿÿƒÄǸ^øÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hl© PQRè§þƒÄÃÌÌÌ‹D$‹L$hl© PQèìæƒÄ ÃÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hTª PQRègþƒÄÃÌÌÌ‹D$‹L$hTª PQè¬æƒÄ ÃÌÌÌÌÌÌÌ̸Àª ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h« PQRèþƒÄÃÌÌÌ‹D$‹L$h« PQè\æƒÄ ÃÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$VPQRè‹ðƒÄ …öu ‹D$‰03À^Ãh8© L$QVèæ‹T$$V‰è\ ƒÄ¸^ÃÌ̸èVÌ‹D$‹HQè9ÿÿƒÀ™ƒâÂÁø‰D$D$T$jP‰T$ÇD$ÆD$ ÿè¸ÀjPjè,NƒÄ(ÃÌÌÌÌÌÌÌ̸èöËVƒÎÿè­‰D$…Àu Æ^YËD$h8© PL$ QT$RèýƒÄ…Àt‹D$ ‹L$‹T$P‹D$QRPèƒÄ‹ð‹L$Q舃ċÆ^YËD$‹H<‰D$‹A ÿà‹D$ ‹H<‰D$ ‹Iÿá‹D$‹H<‰D$‹Aÿࡸ P赈ƒÄ…Àuh¸ Pèã…hX jè×…ƒÄÃÌÌ̸˜ ÃÌÌÌÌÌÌÌÌÌ̸8èËSUVW3ÛD$ P‰\$‰\$3ÿÇD$ ‰\$è°ÿÿL$8Qè¦ÿÿ‹t$\ƒÄ9^ „C9^„:9^„1èŸÿÿ‹ø;û„*‹VRèœÿÿ‹l$TƒÀ™ƒâÂÁøƒÄ;èôƒý2ëèóÿÿ‹Ø…Û„î‹N 3Ò;Êt‹F$;Ât‰L$‰V ‰D$‰V$ëD$PL$QSVèØþÿÿƒÄ…À„²‹D$LT$ RUPèmÿÿƒÄ …À„—‹N‹T$‹FSQRPL$DQèÊ+ÿÿƒÄ…ÀtxT$ RD$8PWè“ðþÿƒÄ …Àta‹NQWèâÿÿƒÄ…À~‹VRWWè ïþÿƒÄ ‹F‹L$SPQWWè|+ÿÿƒÄ…Àt*èp‰D$…Àt‹T$‰‰xë=ÇD$dëÇD$e‹D$hÀh°¬ Pjpj è“v‹L$$QèéÿÿWèãÿÿƒÄ…Ût Sè&ÿÿƒÄT$ RèiÿÿD$8Pè_ÿÿ‹D$ƒÄ_^][…Àt PèJÿÿƒÄ‹D$ƒÄ8ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸0èÉUV‹t$ÇD$ë6‹l$hh°¬ jjkj è9tƒÄ…ít Uè, ÿÿƒÄ…ÿt Wè ÿÿƒÄƒ|$Hu Sè¿ÿÿƒÄ[…ít Uè ÿÿƒÄT$Rèô ÿÿD$,Pèê ÿÿ‹D$ƒÄ_^]ƒÄ0ÃhÔh°¬ jejkj èÇsƒÄ_^3À]ƒÄ0ÃÌÌÌÌÌÌÌÌÌÌ̸@è†ÆSV‹t$X3ÛÇD$ÿÿÿÿ9^ „l‹F…À„a9^„XPèC ÿÿƒÄ= th7h°¬ jféC‹F Pè ÿÿƒÄ='~h=h°¬ jgéUL$WQèÈ ÿÿT$,Rè¾ ÿÿD$DPè´ ÿÿƒÄ è\ÿÿ‹ø…ÿ„‰‹l$\‹E9X„Ë9X …‹NQPèoÿÿƒÄ…À­‹E9X„¡9X …˜‹VRPèEÿÿƒÄ…Àƒ‹F‹MWPQT$4Rè—NÿÿƒÄ…À„‹L$X‹T$TD$PQRè˜ÿÿƒÄ …À„ô‹FWPL$0QT$ R‹ÂPèö&ÿÿƒÄ…À„Ò‹N‹EWQT$0RP‹ÊQèÕ&ÿÿƒÄ…À„±öF(t‹V WRF,jPè´nÿÿ‹ØƒÄ…Û„Ž‹N<‹A‹V SWR…Àt‹VL$4QR‹VL$(QRL$XQVÿЃÄ$ë‹ND$4P‹FQT$(RPL$XQèŒpÿÿƒÄ …Àt<‹VWRD$DPL$ Qjè¿ïþÿƒÄ…Àt‹URD$PèÿÿƒÄ÷ØÀ@‰D$ƒøthwh°¬ jjqj èdqƒÄ…ÿt WèÿÿƒÄL$Qèª ÿÿT$,Rè  ÿÿD$DPè– ÿÿ‹D$ƒÄ _]^[ƒÄ@É\$ë¨h1h°¬ jejqj è qƒÄ^ƒÈÿ[ƒÄ@ËD$ƒH(¸ÃÌÌ‹D$‹@,…Àt Pè¯iÿÿƒÄ¸ÃÌÌÌÌÌ̸ è¦ÃVè@õÿÿ‹ð…ötS‹D$,‹L$(‰D$‹D$$T$R‹T$ P‹D$ ‰L$‹L$(Q‹L$ RPQVÇD$ èžïÿÿƒÄ…Àt‹Æ^ƒÄ ÃVèêòÿÿƒÄ3À^ƒÄ ÃjLhȬ jèb˜ýÿƒÄ …ÀuÃÇÇ@ÃÌÌÌÌÌÌÌÌÌÌÌÌV‹t$…öt(‹…Àt Pè{ ÿÿƒÄ‹F…Àt Pèk ÿÿƒÄVè™ýÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌ̡РPè%€ƒÄ…ÀuhÐ PèS}hjèG}ƒÄÃÌÌÌ‹D$£$íÃÌÌÌÌÌÌ¡$íÃÌÌÌÌÌÌÌÌÌÌ‹L$‹T$‹‰ÃÌÌ̃=$íu è‚£$íVjghè° j(è~—ýÿ‹ðƒÄ …öujjhè° jAjqj%èSoƒÄ3À^Ã3À‰‰F‰F‰F ‰F‰F‰F‰F‰F ‰F$è¸J‰F…Àujrhè° jAjqj%èoVèɘýÿƒÄ3À^ËD$…Àu¡$í‹È‰ÇF‹A …ÀtVÿЃÄ…Àu V蓘ýÿƒÄ3ö‹Æ^ÃÌÌÌÌÌÌÌÌÌÌV‹t$…öuh‰hè° jCjoj%è¢nƒÄ3À^Ãhhè° jFjÿPèŠýÿƒÄ…À“‹‹A…Àt&VÿЃÄ…Àuhœhè° jkjoj%èQnƒÄ3À^Ë‹B$…Àt&VÿЃÄ…Àuh¢hè° jfjoj%è"nƒÄ3À^ËFPè2H‹F ƒÄ…Àt Pè—ýÿƒÄ‹F$…Àt Pè²—ýÿƒÄVè©—ýÿƒÄ¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$…ÀuË@ ÃÌÌÌ‹D$…Àuhºhè° jCjrj%è£mƒÄ3ÀÃh¾hè° jƒÀjPè‰ýÿƒÄ¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$…ÉtR‹T$…ÒtJ‹‹@ …Àuh hè° jljmj%èBmƒÄ3ÀÃRQÿЃÄ…Àu5hhè° jjjmj%èmƒÄ3ÀÃhhè° jCjmj%èmƒÄ3ÀÃÌÌÌÌÌÌÌÌÌÌÌ‹L$…ÉtR‹T$…ÒtJ‹‹@…Àuh!hè° jljlj%èÂlƒÄ3ÀÃRQÿЃÄ…Àu5h&hè° jjjlj%èœlƒÄ3ÀÃhhè° jCjlj%èlƒÄ3ÀÃÌÌÌÌÌÌÌÌÌÌÌ‹L$…Éuh9hè° jCjnj%èSlƒÄƒÈÿËT$‹Âƒèt[ƒètLƒèt=‹…Àt‹@…ÀtV‹t$V‹t$VRQÿЃÄ^ÃhNhè° jljnj%èlƒÄƒÈÿËD$ A 3ÀËT$ ‰Q 3ÀËA ÃÌÌ‹L$…ÉuhZhè° jCjzj%èÃkƒÄ3ÀËD$ …Àt‹Q‰‹D$‰A¸ÃÌÌÌ‹D$…Àuhghè° jCjj%èƒkƒÄ3ÀË@ ÃÌÌÌÌÌÌÌÌÌS‹\$W…Û„³‹|$…ÿ„§ƒ{$t hxhè° jnhj%è8kƒÄ_3À[ËÇPŠ@„ÉuùV+Âh|@hè° Pè “ýÿ‹ðƒÄ …öu!hhè° jAhj%èïjƒÄ^_3À[ËÇPŠ@„Éuù+Â@PWVè>Ó‹C ƒÄ …Àt Pè~”ýÿƒÄ‰s ^_¸[Ãhshè° jChj%è—jƒÄ_3À[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$3ÀV…Ét,‹t$ …öt$öA u;‹Q…Òu ‹‹R…Òt+‹D$PVQÿÒƒÄ ^Ãhhè° jCh„j%è1jƒÄ3À^ÃÌÌÌÌÌÌÌÌÌÌ‹D$…Àuhªhè° jCj~j%èjƒÄ3ÀÃW‹|$ …ÿu#‹x …ÿuh±hè° joj~j%èØiƒÄ3À_Ãö@ Vu‹H…Éu ‹‹I…Ét WPÿÑ‹ðƒÄ…öub‹ÇPŠ@„Éuù+Âh½@hè° Pèž‘ýÿ‹ðƒÄ …öuhÁhè° jAj~j%èpiƒÄ^3À_ËÇPIŠ@„Éuù+Â@PWVè¾ÑƒÄ ‹Æ^_ÃÌÌÌÌÌÌ‹D$…ÀuhÎhè° jCh€j%è iƒÄ3ÀË@$ÃÌÌÌÌÌÌjèyùÿÿƒÄÃÌÌÌÌÌV‹t$W3ÿ…öu<‹D$PèZùÿÿ‹ðƒÄ…öuhÌhè° jAjpj%èÌhƒÄ_3À^ËL$¿‰N ƒ~ thÜhè° jnëe‹D$…ÀtPVè%ýÿÿƒÄ…Àuhähè° jpëAƒ~ uhêhè° joë-‹‹B…Àuhïhè° jlëVÿЃÄ…Àu*hôhè° jgjpj%è6hƒÄ…ÿt VèiùÿÿƒÄ_3À^Ã_‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌ̸ÃÌÌÌÌÌÌÌÌÌÌé ÌÌÌÌÌÌÌÌÌÌ̸¸ÃÌÌÌÌÌÌÌÌÌÌSU‹l$ VW3öVUè¯ýÿÿ‹øƒÄ…ÿuh¦hT± jojxj%è±gƒÄ_^]3À[ÃWÿH ‹Ø…Ûu,h¬hT± jgjxj%è…ghP± WhD± jèsiƒÄ$ëSh°hT± jèmýÿ‹ðƒÄ …öuh³hT± jA뉋EVPèŠ@ƒÄ…Àu@h¹hT± jijxj%ègƒÄWèÕýÿƒÄ…öt VèÈýÿƒÄ…ÛtSÿL _^]3À[É}$_^]¸[ÃÌÌÌÌÌÌW‹|$…ÿuhÏhT± jCjyj%èÂfƒÄ3À_ËGPèAƒÄƒø}¸_ËOVQèi@‹ðƒÄ…öuh×hT± jhjyj%è{fƒÄ^3À_ËRÿL …Àu'hÜhT± jkjyj%èQf‹GVPè—?ƒÄ^3À_ÃVèùýÿƒÄ^¸_ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$W…ö„¯‹|$…ÿ„£‹FPèM@ƒÄƒø}hõhT± jijwj%èàeƒÄ_3À^ËNQè@‹VHPRè$@ƒÄ …ÀuhûhT± jhjwj%è¨eƒÄ_3À^ËWPÿ¸ …ÀuIhhT± jjjwj%è}ehP± Whp± jèkgƒÄ$_3À^ÃhðhT± jCjwj%èNeƒÄ3À_^ÃÌÌÌÌÌÌV‹t$W…ö„¯‹|$…ÿ„£‹FPèm?ƒÄƒø}hhT± jijvj%èeƒÄ_3À^ËNQè??‹VHPRèD?ƒÄ …ÀuhhT± jhjvj%èÈdƒÄ_3À^ËWPÿ¸ …ÀuIh hT± jjjvj%èdhP± Whp± jè‹fƒÄ$_3À^ÃhhT± jCjvj%èndƒÄ3À_^ÃÌÌÌÌÌÌU‹l$V‹ñW‹þ…öu!h:hT± johˆj%è9dƒÄ_^3À]Ãh?hT± j(è/ŒýÿƒÄ …ÀuhChT± jAëÅ3ɉ‰H‰H‰H ‰H‰H‰H‰H‰H ‰H$й€ú\u8Vt €ú/u8Vu 3ɃÆ‹þ‰0S›Š¾Óƒú\‡›¶’l—ÿ$•\—ƒù…³‹Î+ÏF‰x‰H ¹‹þ‰pën…Éu‹Ö+×F‰P¹‹þ‰pëVF‹Ö+׃ùu‰x¹‰P‹þë=P‹þë6‹Ö+×…Éu‰Pë)…Ò~%…ítƒùu ‰xÇ@‹Ö+×Pë ‰x ‰P$ëF„Û…Nÿÿÿ3É9Hu‰9H u‰H9Hu‰H9H$u‰H [_^]Ãh\hT± jshˆj%èÐbƒÄ[_^3À]ËÿÔ–œ–|– —ÌÌÌÌÌÌÌS‹\$ U‹ÃVPd$Š@„Éuù‹5 ! W+Âh± S‹øÿփąÀu+hŒ± SÿփąÀuhˆ± SÿփąÀu hhvƒÇë3íhyGhT± Wèñ‰ýÿ‹ðƒÄ _…öuh}hT± jmj}j%èÂaƒÄ^]3À[ÃS…íth€± Vÿì! ƒÄ ‹Æ^][Ãh|± Vÿì! ƒÄ ‹Æ^][ÃÌÌÌÌÌÌÌÌÌ̸èV´W3À3ÿ…öu"h²hT± jCh‡j%èUaƒÄ3À_ƒÄÃ9t‹FƒÀ9~u9~u9~ t ë9Ft‹F @F9~t 9~u9~ t@F9~t9~ t@F$uhÍhT± jqë’UhÑ@hT± Pèñˆýÿ‹èƒÄ …íu#hÕhT± jAh‡j%èÀ`ƒÄ]3À_ƒÄÃ9>tEf¡”± f‰EŠ –± ˆM‹V‹RPMQÿ! ‹~ƒÄ ƒÇƒ~u ƒ~uƒ~ t$Æ/\ë‹F…Àt‹V RPUÿ! ‹~ ƒÄ Æ/:G‹N‹VS‹Á‹Ø+Ù;Ó~hʉL$+ÈÇD$ ‹ØtŠ„Òt€ú/„å‹T$ BC‰T$ ;Ñrã‹L$‰L$ ‹\$ +ØSP/Rÿ! ‹D$ûÆ/\‹N‹V@‹Ø+ÙƒÄ G;Ó˜‹N‹V‹Á‹Ø+Ù;Ó~iëIʉL$+ÈÇD$ ‹ØtŠ„Òt€ú/tu‹T$ BC‰T$ ;Ñrç‹L$‰L$ ‹\$ +ØSP/Rÿ! ‹D$ûÆ/\‹N‹V@‹Ø+ÙƒÄ G;Óœ‹N$‹V QR/Pÿ! ‹N$ƒÄ [Í‹Å]Æ9_ƒÄÉ\$ é(ÿÿÿ‰\$ ë›ÌÌÌÌÌÌSVW‹|$…ÿu)‹|$…ÿu{h"hT± jCh†j%èõ^ƒÄ_^3À[Ë\$…Û…ž‹ÇPŠ@„Éuù+Âh'@hT± PèцýÿƒÄ …Àuh+hT± jAë«‹ð‹Ï+÷›ŠˆA„Òuö_^[ËÇPŠ@„Éuù+Âh2@hT± P胆ýÿƒÄ …Àuh6hT± jAéZÿÿÿ‹ð‹Ï+÷ëIŠˆA„Òuö_^[Ãj‹ÏèÙùÿÿ‹ðƒÄ…öuhAhT± jAéÿÿÿj‹Ëè¶ùÿÿƒÄ…Àu'hHhT± jAh†j%è÷]V豇ýÿƒÄ_^3À[Ã>uƒ~u‹‰‹P‰V‹H‰N‹P ‰V ‹N…Éu‹H‰N‹P‰VëŠ €ù\t€ù/t ‹H‰N‹P‰Vƒ~ u ‹H ‰N ‹P$‰V$èüÿÿ_^[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$…Àuè3 ‹L$‰÷ØÀƒàÃøuV‹t$ ‹R胃ÄǸ^øÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hø± PQRè'áƒÄÃÌÌÌ‹D$‹L$hø± PQèlÉƒÄ ÃÌÌÌÌÌÌÌÌSUVWè'ÿÿ‹ð…ötgVè«ÿÿVè5ÿÿV‹èè-ÿÿƒÄ ‹ø…ítJ…ÿtF‹\$ƒ{u èaöþÿ‰C…Àt0ƒ{ u èOöþÿ‰C …Àt‹\$ƒûIj|h² jejjjèm\ƒÄh§h² jjjjèU\ƒÄ3ÿ…ötVèvÿÿVèðÿÿƒÄ‹Ç_^][Ãûu jUèéøþÿƒÄ…Àt¸j WèÚøþÿƒÄ…Àt©ëKƒûu j UèÄøþÿƒÄ…Àt“jWèµøþÿƒÄ…Àt„ë&jUè¤øþÿƒÄ…À„oÿÿÿjWè‘øþÿƒÄ…À„\ÿÿÿ‹D$ ‹L$PW‹|$‹WUjQRè»EÿÿƒÄ…À„6ÿÿÿ‹D$ jjPèb=ÿÿƒÄ …À„ÿÿÿ‹O SQè=øþÿƒÄ…À„ÿÿÿ¿éÿÿÿÌÌÌÌÌÌÌÌ‹L$‹AD‹@ …Àt‰L$ÿà‰L$écþÿÿÌÌÌ‹D$‹HD‰D$‹Qÿâ‹D$ ‹HD‰D$ ‹Iÿá¸àÃÌÌÌÌÌÌÌÌÌ̸ èæ­SUVW3ÿ‰|$3í‰|$3Ûè?ÿÿ‹t$4‰D$;Ç„ÿ‹~…ÿuè“ôþÿ‹ø…ÿ„ék‹^…Ûuèzôþÿ‹Ø…Û„ÐöFt#‹D$‹NPQV jRè6WÿÿƒÄ‰D$…À„§…ít&‹F…Àu ‹FPèCóþÿƒÄHjjPWèÿÿƒÄ…Àt}öFuDL$Qèíóþÿ‹‹O‰T$ ‹W‰L$$‹O ‰T$(‹W‰L$,‹L$0ƒâþƒá уăÊD$‰T$,ë‹Ç‹L$‹VDQ‹L$Q‹NQ‹J P‹F PSVÿуÄ…Àt ‰^‰~½ëh¨h@² jjgjèËY‹l$,ƒÄ…Ûtƒ~u SèóþÿƒÄ…ÿtƒ~u WèóþÿƒÄ‹T$RèDÿþÿƒÄ_^‹Å][ƒÄ ÃÌÌÌÌÌÌ̸èV¬SUV‹t$ ‹FƒÍÿP3Û‰l$è-òþÿƒÄ='~!hºh@² jgjfjè>YƒÄ^‹Å][ƒÄÃWè|þþÿ‹ø…ÿ„èWèüþþÿWè†ÿþÿƒÄ‰D$9^uhÅh@² jdé˜öFt&‹NWQV jRèƒUÿÿƒÄöF‹Øu‹FƒH…Ûtx‹l$ D$$PUVè­ƒÄ …ÀtIƒ|$$uB‹V‹F‹ND‹I S‹\$WRPUSVÿуÄ…ÀuhÞh@² jë ‹T$RSè†öþÿƒÄ‰D$ëhØh@² jfjfjèXXƒÄWèþþÿWèùýþÿ‹D$ƒÄ_^][ƒÄÃ_^‹Å][ƒÄËD$ ƒxu1‹L$öAt'‹‹‹L$‹T$Q‹L$R‹T$QRP‹D$PèiäþÿƒÄËL$‹T$Q‹L$R‹T$QRP‹D$PèöêþÿƒÄÃÌÌ‹D$ƒH¸ÃÌÌ‹D$‹@ …Àt PèPÿÿƒÄ¸ÃÌÌÌÌÌÌ‹D$£(íÃÌÌÌÌÌÌ¡(í…Àu èbüÿÿ£(íÃÌÌÌÌÌÌÌÌÌÌÌÌV‹t$‹FD‹@…ÀtVÿЃÄ‹FH…ÀtPè^LƒÄÇFH‹D$ ‰FD‹@…ÀtVÿЃÄ¸^ÃÌÌÌÌÌÌÌÌÌVWjohŒ² jLè ýÿ‹ð3ÿƒÄ ;÷ujrhŒ² jAjijèóVƒÄ_3À^á(í;Çu è½ûÿÿ£(íS‹\$‰FD;ßt3SèVKƒÄ…Àu!j|hŒ² j&jijè­VVèg€ýÿƒÄ[_3À^É^Hëè„a‰FH‹FH;Çt=P脺ƒÄ‰FD;Çu-h‰hŒ² j&jijèeV‹FHPèlKVè€ýÿƒÄ[_3À^ËND^‰~‰~‰~ ‰~‰~‰~‰~$‰~(‰~,‰~0‰~4‰~ ÇF8‹QVj‰Vè»™ýÿ‹FD‹@ƒÄ ;Çt.VÿЃÄ…Àu$‹FH;Çt Pè÷JƒÄSVjèKšýÿVè•ýÿƒÄ3ö[_‹Æ^ÃÌÌÌÌÌÌÌÌÌÌV‹t$…ö„Úh²hŒ² jF8jÿPè,qýÿƒÄ…À¸‹ND‹A…ÀtVÿЃÄ‹FH…Àt Pè„JƒÄVtF‹T$‹L$ W‹|$ëI‹9Hu 9x u9Pt ‹ðƒ>uè_^ËH‹P ‹8QÿÒ‹Pè2wýÿƒÄ‰>_^ÃÌÌÌÌÌÌÌÌÌÌS‹\$…Ût*V‹3…ötW‹F‹N ‹>PÿÑVèþvýÿƒÄ‹÷…ÿuæ_Ç^[ÃÌÌÌÌÌÌÌÌÌÌÌS‹\$…Ût*V‹3…ötW‹F‹N‹>PÿÑVè¾výÿƒÄ‹÷…ÿuæ_Ç^[ÃÌÌÌÌÌÌÌÌÌÌÌW‹|$…ÿuh»h¸³ jCjyjèÂLƒÄ3À_˃x$uhÀh¸³ jBjyjèžLƒÄ3À_ÃVhÄh¸³ jDè•týÿ‹ðƒÄ …öuhÇh¸³ jAjyjègLƒÄ^3À_ˉ‹H$VÿуÄ…ÀuVèvýÿƒÄ^3À_ËÆ^_ÃÌÌÌÌÌÌÌÌÌÌÌV‹t$…öt‹‹@(…ÀtVÿЃÄVèÒuýÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$…öt0‹‹H,…ÉtVÿÑë…Àt ‹@(…ÀtVÿЃÄjDVè výÿVèŠuýÿƒÄ ^ÃÌÌÌÌÌ‹T$‹V‹p0…öuhòh¸³ jBjrjèKƒÄ3À^ËL$ ;th÷h¸³ jejrjèyKƒÄ3À^Ã;Ñu¸^ÃQRÿÖƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌW‹|$…ÿu3À_ËD$ VPèXþÿÿ‹ðƒÄ…öt&WVèhÿÿÿƒÄ…Àu‹‹A(…ÀtVÿЃÄVèÌtýÿƒÄ^3À_ËÆ^_ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$‹‹H4…Éuhh¸³ jBjjèÍJƒÄ3À^ËT$ ;th"h¸³ jejjè©JƒÄ3À^ÃRVÿуÄ^ÃÌÌÌÌÌÌÌÌÌV‹t$‹‹H8…Éuh.h¸³ jBj~jèmJƒÄ3À^ËT$ ;th3h¸³ jej~jèIJƒÄ3À^ËD$P‹D$P‹D$P‹D$PRVÿуÄ^ÃÌÌÌÌÌV‹t$‹‹H<…Éuh?h¸³ jBjujèýIƒÄ3À^ËT$ ;thDh¸³ jejujèÙIƒÄ3À^ËD$P‹D$P‹D$P‹D$PRVÿуÄ^ÃÌÌÌÌÌV‹t$‹‹H@…ÉuhPh¸³ jBj|jèIƒÄ3À^ËT$ ;thUh¸³ jej|jèiIƒÄ3À^ËD$P‹D$P‹D$PRVÿуÄ^ÃÌÌÌÌÌÌÌÌÌÌV‹t$‹‹H@…Éuhah¸³ jBh¹jèIƒÄ3À^ËT$ ;thfh¸³ jeh¹jèóHƒÄ3À^ËD$P‹D$P‹D$PRVÿуÄ^ÃÌÌÌÌV‹t$‹‹HD…Éuhrh¸³ jBjtjè­HƒÄ3À^ËT$ ;thwh¸³ jejtjè‰HƒÄ3À^ËD$P‹D$P‹D$PRVÿуÄ^ÃÌÌÌÌÌÌÌÌÌÌV‹t$‹‹HD…Éuhƒh¸³ jBh·jè:HƒÄ3À^ËT$ ;thˆh¸³ jeh·jèHƒÄ3À^ËD$P‹D$P‹D$PRVÿуÄ^ÃÌÌÌÌV‹t$‹‹HH…Éuh”h¸³ jBj}jèÍGƒÄ3À^ËT$ ;th™h¸³ jej}jè©GƒÄ3À^ËD$P‹D$P‹D$PRVÿуÄ^ÃÌÌÌÌÌÌÌÌÌÌV‹t$‹‹HH…Éuh¥h¸³ jBhºjèZGƒÄ3À^ËT$ ;thªh¸³ jehºjè3GƒÄ3À^ËD$P‹D$P‹D$PRVÿуÄ^ÃÌÌÌÌV‹t$‹‹HL…Éuh¶h¸³ jBj{jèíFƒÄ3À^ËT$ ;th»h¸³ jej{jèÉFƒÄ3À^ËD$P‹D$P‹D$P‹D$PRVÿуÄ^ÃÌÌÌÌÌV‹t$‹‹HP…ÉuhÇh¸³ jBjzjè}FƒÄ3À^ËT$ ;thÌh¸³ jejzjèYFƒÄ3À^ËD$P‹D$P‹D$PRVÿуÄ^ÃÌÌÌÌÌÌÌÌÌÌS‹\$‹ V‹qT…öuh×h¸³ jBjpjè FƒÄ^3À[ÃW‹|$‹;Èu$‹T$‹ ;Áu‹D$;u‹L$ QPRWSÿÖƒÄ_^[ÃhÜh¸³ jejpjèÀEƒÄ_^3À[ÃÌÌÌÌÌÌÌW‹|$‹‹PX…Òuhçh¸³ jBjsjèEƒÄ3À_ÃV‹t$‹;Áu‹D$;u‹L$QPVWÿÒƒÄ^_Ãhìh¸³ jejsjèNEƒÄ^3À_ÃÌÌÌÌÌÌ‹T$‹ƒxXuh÷h¸³ jBhÒjèEƒÄ3ÀËL$;thüh¸³ jehÒjèöDƒÄ3ÀË@\V‹t$VQRÿÐƒÄ ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$‹‹H`…Éuhh¸³ jBjvjè­DƒÄ3À^ËT$ ;th h¸³ jejvjè‰DƒÄ3À^ÃRVÿуÄ^ÃÌÌÌÌÌÌÌÌÌV‹t$‹‹Hd…Éuhh¸³ jBjwjèMDƒÄ3À^ËT$ ;thh¸³ jejwjè)DƒÄ3À^ËD$PRVÿÑƒÄ ^ÃÌÌÌÌW‹|$‹‹Ph…Òuh'h¸³ jBjqjèíCƒÄ3À_ÃV‹t$‹;Áu‹D$;u‹L$QPVWÿÒƒÄ^_Ãh,h¸³ jejqjè®CƒÄ^3À_ÃÌÌÌÌÌÌV‹t$‹‹Hl…Éuh7h¸³ jBjxjè}CƒÄ3À^ËT$ ;th<h¸³ jejxjèYCƒÄ3À^ËD$PRVÿÑƒÄ ^ÃÌÌÌÌS‹\$‹W‹zp…ÿu hIh¸³ jBhˆjèCƒÄ_3À[ËL$U3ÀV‹t$…Év‹,†;Uu@;Áró‹D$ PVQSÿ׃Ä^]_[ÃhPh¸³ jehˆjèÉBƒÄ^]_3À[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹‹@t…Àu ‰L$éJ;‰L$ÿàÌÌÌ̸èf•‹D$‹L$‰$‰L$…Àt …Étºë3Ò‹D$‹‹It…Éu%‹L$QL$QL$Q‹L$R‹T$ RQPèé:ƒÄYÃV‹t$ Vt$Vt$ VR‹T$$R‹T$$RPÿуÄ^YËL$‹ƒxtu ‰L$é›D‹@x…Àt‰L$ÿà¸ÃÌÌÌÌÌÌÌÌ‹L$‹ƒxtu ‰L$é«H‹@|…Àt‰L$ÿà3ÀÃÌÌÌÌÌÌÌÌÌÌÌV‹t$…ötj‹‹@…ÀtVÿЃÄNDWQè.ôÿÿ‹~ƒÄ…ÿt‹‹B(…ÀtWÿЃÄWè/kýÿƒÄFPèÃÚþÿNQèºÚþÿ‹F<ƒÄ_…Àt Pè kýÿƒÄVèkýÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌV‹t$…öt}‹‹H …ÉtVÿÑë ‹@…ÀtVÿЃÄFDPèãóÿÿ‹FƒÄ…Àt PèóôÿÿƒÄNQèçÙþÿVRèÞÙþÿ‹F<ƒÄ…Àt‹N@QPèškýÿ‹VƒÄ3À_ÃV‹t$ ƒ~uVèŠñÿÿƒÄ‰F…ÀtT‹FWPè–òÿÿƒÄ…ÀtC‹D$…ÀtPNQèÙþÿƒÄ…Àu^_ÃVjRèèÚþÿƒÄ‹D$ƒÆ…ÀtPVècÙþÿƒÄ…Àu^3À_ÃjVè¿ÚþÿƒÄ^¸_ÃÌÌÌ̸èÆS‹\$‹‹U‹l$$‹MW3ÿ‰|$‰|$ ;t G_][ƒÄËK0;Ït‹E0;Çt ;Èu _]3À[ƒÄÃV‹t$0;÷uèãâþÿ‹ð‰t$;÷„¨Vè_ãþÿVèéãþÿV‰D$8èßãþÿV‰D$$èÕãþÿV‰D$4èËãþÿV‰D$@èÁãþÿV‰D$4è·ãþÿƒÄ‹øV…ÿ„D‹L$$‹T$‹Q‹L$4R‹PQSÿ҃ąÀ„ô‹L$‹T$(‹E‹@VWQRUÿЃÄ…À„Ô‹L$(‹T$,QRèÈÛþÿƒÄ…À…º‹D$‹L$PQè®ÛþÿƒÄ…À… ‹T$ WRè˜ÛþÿƒÄ…À…Š‹E‹KVPQSèŽøÿÿƒÄ…Àut‹D$,VPSèkëÿÿƒÄ …À„Š‹L$(VQUèTëÿÿƒÄ …Àtw‹|$VWSèqëÿÿƒÄ …Àtd‹\$VSUè^ëÿÿƒÄ …ÀtQ‹T$(‹D$,RPèÛþÿƒÄ…ÀuSWè ÛþÿƒÄ…ÀtÇD$VèEâþÿƒÄƒ|$t VèµáþÿƒÄ‹D$^_][ƒÄÃVè âþÿƒÄƒ|$t VèáþÿƒÄ^_]ƒÈÿ[ƒÄÃÌÌV‹t$FHPèbÕþÿNpQèYÕþÿ–„RèMÕþÿƒÄ dž˜¸^ÃÌÌÌÌÌÌÌÌÌV‹t$FHPè‚ÔþÿNpQèyÔþÿÆ„VèmÔþÿƒÄ ^ÃÌÌÌÌÌÌÌÌV‹t$ W‹|$ FHPOHQè™ÖþÿƒÄ…Àu_3À^ÃVpRGpPè€ÖþÿƒÄ…Àt玄Q—„RèfÖþÿƒÄ…ÀtÍ‹†˜‰‡˜_¸^ÃÌÌÌÌÌÌÌÌÌÌ̸èÆSV‹t$3ÛV‰\$‰\$ è ÓþÿƒÄƒøŽG9^Ž>‹ö„3W‹|$(;ûuèòßþÿ‰D$ ‹ø;Ãu _^3À[ƒÄÃUWèhàþÿWèòàþÿ‹èƒÄ;ë„Ò‹L$ ‹t$Q^HSè³ÕþÿƒÄ…À„µjSè€Ûþÿ‹T$(‹D$,WRPUèíþÿƒÄ…À„‘‹‹Œ…ÀtWUVpRVÿЃÄë FpUPè`ÕþÿƒÄ…Àtf‹L$ ‹T$(WQRž„Sè2íþÿƒÄ…ÀtH‹‹€Œ…Àt WSSVÿЃÄ…Àt/jUèzÿÿƒÄ…Àt FHPUè™ØþÿƒÄ÷ØÀ@‰†˜ÇD$WèÍßþÿ‹D$ƒÄ]…Àt Pè;ßþÿƒÄ‹D$_^[ƒÄÃh²hh´ jgh¦jèe9ƒÄ^3À[ƒÄÃÌÌÌÌÌÌÌÌÌ̸è&Œ‹D$V‹t$W3ÿ‰|$ ‰|$;ÇtNHQPètÔþÿƒÄ…Àu_^ƒÄÃS‹\$ U‹l$(;ßu;ï„“‹9ºt\‹|$,…ÿuè:Þþÿ‰D$‹ø…Àu][_^ƒÄÃ…Ût‹‹WNpQSVÿ҃ąÀtV…ítJ‹‹WŽ„QUVÿ҃ąÀt7ë-;ßtFpPSèÝÓþÿƒÄ…Àt1;ïtÆ„VUèÅÓþÿƒÄ…ÀtÇD$‹D$…Àt PèÞþÿƒÄ‹D$][_^ƒÄÃÌÌÌÌÌÌÌÌÌ‹D$ƒÀH‰D$éÑþÿ¸ è‹SV‹t$W‹|$3ÛGH‰\$ ‰D$‰\$;óu/èQÝþÿ‰D$‹ð;Ãu h$hh´ jAh¥jèß7ƒÄé`UVè°ÝþÿVè:ÞþÿV‹Øè2ÞþÿV‰D$0è(ÞþÿV‰D$8èÞþÿV‹èèÞþÿƒÄ…À„‹‹…Àt=VWpRSWÿЃÄ…À„ö‹T$ ‹‹€V„QRWÿЃÄ…À„Ó‹|$ ë1OpQSè˜ÒþÿƒÄ…À„¸Ç„W‹|$$Wè|ÒþÿƒÄ…À„œƒ{u ƒ郃t‹|$‹T$$VWSRèìþÿƒÄ…Àto‹D$$VWSPUè†ëþÿƒÄ…ÀtZ‹L$$jUQèâùþÿƒÄ …ÀtF‹T$ VWRUèÞëþÿƒÄ…Àt2jUèïþþÿƒÄ…Àt#‹D$$VWUPSè*êþÿƒÄ…Àtƒ{tÇD$]…öt VèªÜþÿƒÄ‹D$_^[…Àt PèÜþÿƒÄ‹$ƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌV‹t$FPèâÏþÿNQèÙÏþÿV,RèÐÏþÿƒÄ ÇF@¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èæˆV3öW‹|$(‰t$‰t$ ;þuè=Ûþÿ‰D$‹ø;Æu_3À^ƒÄËD$SU‹l$ ;Æ‹t$t7WNHQP]SèúèþÿƒÄ…À„Ò‹‹‚Œ…ÀtWSSVÿЃÄ…À„µ‹D$(…Àt3WNHQP]Sè»èþÿƒÄ…À„“‹‹‚Œ…Àt WSSVÿЃÄ…Àtz‹D$,…ÀtjWNHQP],Sè€èþÿƒÄ…Àt\ƒ}0u‹ƒ:u ƒ}8u½ë3í‹‹ˆŒ…Ét%…ít‹€”…Àt WSVÿÐƒÄ ë WSSVÿуÄ…Àt‹D$ ‰h@ÇD$‹D$][…Àt Pè}ÚþÿƒÄ‹D$ _^ƒÄøè–‡SUV‹t$‹3íW‰l$9¨„…‹|$,…ÿuèÝÙþÿ‹è‹ý…íu_^][YËD$ ‹\$…Àt‹WSRP‹VÿЃÄ…À„™‹D$$…Àt‹WSRP‹VÿЃÄ…Àty‹D$(…Àti‹‹‘WƒÃ,SPVÿ҃ąÀtYëO‹D$ ‹t$…ÀtNQPèOÏþÿƒÄ…ÀtG‹D$$…ÀtVRPè6ÏþÿƒÄ…Àt.‹D$(…ÀtƒÆ,VPèÏþÿƒÄ…ÀtÇD$…ít UèdÙþÿƒÄ‹D$_^][YÃÌÌÌÌÌÌÌVW‹|$…ÿt*‹t$…öt"‹D$PèôËþÿ‹L$‹T$PVWQRèâèÿÿƒÄ_^Ãhhh´ jCh¨jèT3ƒÄ_3À^ÃÌÌÌÌÌÌÌÌÌÌÌ̸膋D$SW‹|$P3ÛW‰\$‰\$èKîÿÿƒÄ…Àt#hhh´ jjh§jèü2ƒÄ_3À[ƒÄÃV‹t$0;óuè3Øþÿ‰D$‹ð;Ãu ^_3À[ƒÄÃUVè©ØþÿVè3ÙþÿV‰D$ è)ÙþÿV‹Øè!ÙþÿV‹èèÙþÿƒÄ‰D$…À„Ô‹‹‹T$(…Àt"‹L$VƒÂ,RQWÿЃÄ…À„¬‹D$‹T$(ëB,ƒx…¥‹ƒ9…šƒx …‹‹€…ÀtE‹L$,…ÉtVƒÂRQWÿЃÄ…À„X‹T$(‹D$0…À„@‹VƒÂR‹‘PWÿÒƒÄé#‹D$,…ÀtƒÂRPè3ÍþÿƒÄ…À„‹T$(‹D$0…À„úƒÂRPèÍþÿƒÄéäVOHQPSèª ÿÿƒÄ…Àu hNhh´ jh§jè‹1ƒÄ齋ƒ¸ŒVu ‹€„SUWÿÐë GHPSUèæþÿƒÄ…À„Ž‹D$,…Àt‹T$(‹VUƒÂRP‹€WÿЃÄ…Àtiƒ|$0tZ‹ƒ¸ŒVu‹L$‹€SUQWÿÒëGHP‹D$SUPèšåþÿƒÄ…Àt-‹T$‹D$(‹VR‹T$8ƒÀP‹€RWÿЃÄ…ÀtÇD$VèðÖþÿ‹D$ƒÄ]…Àt Pè^ÖþÿƒÄ‹D$^_[ƒÄøèvƒS3ÛV‰\$ ‰\$èu1‹t$,;óuèÈÕþÿ‰D$ ‹ð;Ãu^3À[ƒÄÃ3À9\$(W•ÀV‰D$0è2ÖþÿVè¼ÖþÿV‰D$<è²ÖþÿV‹øèªÖþÿV‰D$ è ÖþÿƒÄ‰D$;Äæ‹\$ ‹L$(‹T$ UVkHUQRèHãþÿƒÄ…À„Á‹ƒ¸‹L$,Vu/‹„QWSÿ҃ąÀ„›‹L$,‹T$4‹‹€€VQWRSÿÐë%UQWèÖäþÿƒÄ…À„o‹T$,‹D$4VURWPè9äþÿƒÄ…À„Rƒ»˜t>‹L$UQWè åþÿƒÄ …À„2‹T$URWWè1ãþÿƒÄ…À„‹D$4UWPPè©ãþÿë[‹‹ˆV…Ét#CpPWSÿуÄ…À„ë‹L$VUQWWè¹ãþÿë‹T$R‹€KpQWSÿ҃ąÀ„½‹D$4UWPPè¼âþÿƒÄ…À„¥‹‹€…Àt1V‹„QWSÿЃÄ…À„‚UW‹|$;D$ƒ3ÉöÃt?‹Ë…ÝtD-T>+È;T$rL-ÿÑù#Ë‹Å÷Ø;È~h;Í}döÁt_+Ùt D-;Øt;ÝuHŠD$öé‹L$ÎF>ˆ9‹D$$RPèe¨þÿ¯ÅÑûØD-ƒÄ;ØŽtÿÿÿh,ë';t$vWh3ëh ëhë hïëh×hൠjDhj莋L$ ƒÄQèA1ýÿƒÄ^ÇD$‹D$][ƒÄËT$(‹D$ ‰2^][ƒÄÃÌÌÌÌÌÌÌÌÌ̸\è&Z‹L$dS‹\$d‹VW3ÿ3ö‰|$\‰|$X‰|$D‰|$<‰t$$‰|$T‰|$@‰|$0‰|$‰|$‰|$ ‰|$H‰|$ ‰|$8‰|$4‰|$`;t$hthൠjeh»jèÙƒÄ_^3À[ƒÄ\ÃU‹l$|9|$xu;ïuQSèÇ»ÿÿƒÄ]_^[ƒÄ\Ë”$€3É;ïv‹Š;uXA;Írô‹\$p9¼$ˆuèÑ«þÿ‰D$`‰„$ˆ;Ç„ý9|$x„üSèNj‹ðƒÄ‰t$\;÷u6h’hൠjqéhhൠjeh»jè(ƒÄ]_^3À[ƒÄ\ËD$p‹HDh`ðhðhàïQèÿ·ÿÿ‹ØƒÄ‰\$<;ßty9{tt‹”$ˆ‹C‹R‹T$tQVRèÄÁÿÿƒÄ…ÀuT‹D$x‹sP‰t$D茞þÿ3Ò÷öƒÄ‹ð‹CF‰t$(;ðv‹ð‰D$(‹K IºÓâ¯Â‰T$X9Ct"h«hൠjDéL¾‰|$<‰t$(‰t$8.hº4…hൠV‰D$$èZ-ýÿh»‹ØhൠV‰\$LèD-ýÿh¼NhൠQ‰D$@è--ýÿh½hൠV‰D$Pè-ýÿƒÄ0‰D$;ß„Á9|$„·‹D$ ;Ç„«9|$„¡‹T$8‰8*‰|$0‰|$‰D$,;džý‹Œ$„‹|$ ‹D$+Ë+û+Ëó‰L$P‰|$T‰D$hë뛋|$T‹L$P‹\$x9l$s‹1PëSèBþÿƒÄ=Ðr¸ë0= r¸ë"=,r¸ëƒøFr¸ëƒøÀƒÀHÿºÓâ‰ÇD7T$09l$s ‹D$P‹0ë‹Ã‹L$h‹>1SPè¸úÿÿ‹T$\ƒÄ‰2…À„È‹;\$$v‰\$$‹D$@ƒÆ‰D$;D$,‚4ÿÿÿ‹\$4ƒ|$(„©‹t$<…öuƒ|$8„–háhൠjDédƒ|$8ÇD$thíhൠjDéD‹L$x‹~ D$PQ‰<«èúÿÿ‹ÈƒÄ‰L$P…É„-‹D$;D$$w,U‰T$‹T$ ‰ ª‹L$ÇDª‰©‹V‹D$‰¨é ‹|$@‹T$(¯×;Âs$3ÒD8ÿ÷÷;FvhhൠjDé»ʼnD$‹T$<‹z‰L$8‹Ý;l$ƒ¶‹D$‹l$ ‹Ë4ˆ‹L$+è+ȉL$h‹ÿ‹D$H;Øs‹D$@‰9D$‚»)D$ë‹T$‰h1ÇD.‹hൠPè*ýÿƒÄ ‰.…À„˜‹‹T$8QRPè·U‹ƒÄ ;D$$v‰D$$ƒ?„œ‹D$h‹T$@‹L$XT$8‰<0CƒÆ<;\$‚iÿÿÿ‹L$PQèÏ+ýÿƒÄ‹T$0hN•hൠPè*ýÿƒÄ ‰D$L…ÀuohQé¨h&hൠjDéžh4hൠjAh»j賋D$dPèi+ýÿƒÄéƒh>hൠjDh»j艋L$dQè?+ýÿƒÄéY‹|$L‹L$03í‰D$XÇ9l$,ve‹t$4‹D$+ƉD$h‰<0‹IºÓâ3Û…Òv6ë¤$‹D$pPèF´ÿÿƒÄ‰…À„û‹IºÓâCƒÇ;Úr׋D$hEƒÆ;l$,r­‹D$X;øthdhൠjD鳋D$pPèö³ÿÿƒÄ‰D$H…À„©3í9l$,†Î‹t$‹¼$€‹\$4+þ‰|$h+Þd$‹‹;l$|s‹ 7ë‹L$\QPèÆ´ÿÿƒÄ…À„]ƒ<3vz‹‹Œ$ˆ‹‹T$pQ‹L$LPQR詺ÿÿƒÄ…À„0‹ 3¿I‹ÇÓà;Çv>‹‹”$ˆ¹‹L$HR‹Pü‹Q‹L$xRPQèê¹ÿÿƒÄ…À„ñ‹ 3IºÓâG;úr‹|$hEƒÆ;l$,‚Mÿÿÿ‹„$ˆ‹L$L‹T$0P‹D$tQRP葼ÿÿƒÄ…À„¨‹\$$ƒÃÿ¾‰t$@ˆ4…öu#‹Œ$ˆ‹D$t‹T$pQPPRèä¹ÿÿƒÄ…À„kƒ|$ÇD$†í‹D$ ‹l$‹|$+è+ljD$hë‹D$hÇ9(†®‹¾4…ö„ 3À…öœÀ…Àt÷Þ;D$Dt6ƒ|$@u"‹Œ$ˆ‹T$t‹D$pQRPèÒ¹ÿÿƒÄ …À„é3É9L$D”Á‰L$DÑþƒ|$@t%‹‹²‹L$tPQè!³ÿÿƒÄ…À„¸ÇD$@ë)‹‹”$ˆ‹ °‹D$tR‹T$tQPPRè~¸ÿÿƒÄ…À„…‹D$@ƒÇ‰D$;D$‚-ÿÿÿ‹t$@ƒë‰Ðþÿÿ…öt‹D$t‹L$pPQè}³ÿÿƒÄë!ƒ|$Dt‹”$ˆ‹D$t‹L$pRPQè ¹ÿÿƒÄ …Àt%ÇD$dëhÁhൠjAh»jè!þƒÄ‹D$`…Àt PèÀ£þÿƒÄ‹D$H…Àt PèϱÿÿƒÄ‹D$4…Àt Pè®'ýÿƒÄ‹D$…Àt Pè'ýÿƒÄ‹|$ …ÿt$‹‹÷…ÀtPè„'ýÿ‹FƒÆƒÄ…ÀuíWèq'ýÿƒÄ‹|$L…ÿt$‹‹÷…ÀtP蘱ÿÿ‹FƒÆƒÄ…ÀuíWèE'ýÿƒÄ‹D$…Àt Pè4'ýÿƒÄ‹D$d]_^[ƒÄ\ÃÌÌÌÌ̸(è6PSUVW‹|$ƒ~dt8‹Fh…Àt1ƒ~lu+‹L$ …Ét‰‹D$…Àt‹Nd‰‹D$…Àt‹V`‰¸^Ãjrht' jBhÁjèFïƒÄ3À^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸4$ ÃÌÌÌÌÌÌÌÌÌ̸d$ ÃÌÌÌÌÌÌÌÌÌ̸% ÃÌÌÌÌÌÌÌÌÌ̸d% ÃÌÌÌÌÌÌÌÌÌ̸¨% ÃÌÌÌÌÌÌÌÌÌ̸& ÃÌÌÌÌÌÌÌÌÌ̸& ÃÌÌÌÌÌÌÌÌÌ̸ì& ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹L$hX' PQè[ƒÄ ÃÌÌÌÌÌÌÌ̸èfAU3íW‹ù‰l$;Ý„;ý„•‹;Åt P誃ċG;Åt Pè }ƒÄVSèæþPèàþ‹ðVèXƒÄ ‰…Àu&h=ht' jhšjèî‹D$ ƒÄ^_]ƒÄÃþ–…•踇þÿ‹è…íu hEht' jAhšjèÚíƒÄéÆjjjUSèåÿÿƒÄ…Àu hKht' jhšjè¦íƒÄé’jUè6½ƒÄ‰G…À…thRht' j hšjèpíƒÄé\h% èžJ‹ðƒÄ‰w…öu&h`ht' jAhšjè:í‹D$ ƒÄ^_]ƒÄÃSèžÿÿS‰è®üÿÿ‹øƒÄ…ÿu&hjht' jhšjèýì‹D$ ƒÄ^_]ƒÄÃWè ƒÄ‰F…Àu hpé«þÿÿÿªuVD$PSè¢üÿÿƒÄ…À„¸èRt‰F…Àuh~ht' jAéwþÿÿ‹L$QPèߺƒÄ…Àuth„ht' j éTþÿÿÿ«u{T$RD$PL$QSèšüÿÿƒÄ…ÀtTh4$ è‰IƒÄ‰F…Àuh’ht' jAé þÿÿ‹T$‹L$‰‹F‰H‹V‹D$‰BÇD$ …ít Uèb…þÿƒÄ‹D$ ^_]ƒÄÃèu‰F…ÀuÔh¡ht' jAé´ýÿÿ_3À]ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸è–>U‹l$(V‹t$(W3ÿ‰|$$‰|$‰|$‰|$ÆD$;÷„Þ;ï„Ö9}„Í9}„ÄSè,…þÿ‹Ø‰\$$;ß„è…þÿ‰D$;Ç„VèçûPèáûƒÄW=–u4‹D$PSWVèI›ÿÿƒÄ…Àu;hÇht' jh™jè ëƒÄéÜ‹L$QSWVè•›ÿÿƒÄ…ÀuhÏëÊS豃þÿƒÀ™ƒâ‹T$‹ðRÁþ虃þÿƒÀ™ƒâ‹øƒÄÁÿ…öuD$‰D$^é¬hßht' Vè¤ýÿ‹ðƒÄ ‰t$…öuhâht' jAëVS肈þÿ‹ØƒÄ…Ûumhçht' jh™jèQêƒÄ‹D$…Àt PèýÿƒÄ‹D$ …Àt PèïýÿƒÄ‹\$$3ÿ;ßt Sè|ƒþÿƒÄ‹D$[;Çt PèjƒþÿƒÄ‹D$$_^]ƒÄÉt$…ÿuj|$¾‹T$‹ESRP茿ƒÄ …À„ò‹MVWQèv¿ƒÄ …À„Ü‹t$0ƒ~<„ªƒ}umèBr‰E…Àuahht' jAé-ÿÿÿhõht' WèŠýÿ‹øƒÄ ‰|$ …ÿuhøht' jAéÿþÿÿ‹L$WQèa‡þÿ‹ðƒÄ…ö…YÿÿÿhýéÖþÿÿ‹Eƒ` ð‹EƒH ‹V@‹F<‹MRPQè §ƒÄ …Àu(hht' j é¦þÿÿ‹E…ÀtPè¦qƒÄÇEÇD$(é‘þÿÿhht' j éqþÿÿh¼ht' jAh™jè¶èƒÄéˆþÿÿ_^3À]ƒÄÃÌÌÌÌ̸ èv;SUVW‹ÙÇD$èC‚þÿ‰D$…Àu h@ht' jAh›jècèƒÄéî‹t$ …öu$h& è‰E‹ðƒÄ…öuhIht' jAéš‹NÇè‘ùÿÿ…ÀuhVht' jéw‹FPSèBüÿÿƒÄ…Àuh]ht' jéUSèÔK‹èƒÄ…íuhdht' jqé5SèÄœjjjPUS‰D$4袠ÿÿ‹øƒÄ…ÿuhmht' jéhpht' Wè˜ýÿƒÄ ‰D$…Àuhrht' jAé׋L$jWPQUSèL ÿÿƒÄ…Àuhwht' j鯃~ uèYp‰F …Àuh|ht' jA錋T$‹F WRPè¥ƒÄ …Àuhëh‹|$jWSèוÿÿƒÄ …Àuhˆht' jëM‹NQWèx¶ƒÄ‰F…ÀuhŽë+jWSèΕÿÿƒÄ …ÀtL‹VR‹ÇPèK¶ƒÄ‰F…Àu6h˜ht' j h›jè‰æƒÄ…ötƒ|$ uh& VèPGƒÄ3ö‹D$…Àt Pè½þÿƒÄ‹D$…Àt Pè ýÿƒÄ_‹Æ^][ƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹ñ…öu2hì& è_C‹ðƒÄ…öuQh·ht' jAhœjèþåƒÄ3À^Ë…Éu‹F…Àt P蔡ƒÄëƒùu‹F…Àth& Pè¨FƒÄWè?҃ąÀtWè•ÿÿƒÄ…Àt'PÇè¿ ëj‹ÏÇèîüÿÿƒÄ‰F…Àuhì& VèYFƒÄ3À^ËÆ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸è68SU3í‹Ù‹CVW‰l$‰l$‰l$;Å„J9(„B9h„9‹C;Å„9(„‹9i„û‹@;Å„ð9h„ç‹S‹‹‹PUQRè‚þÿ‹øƒÄ ‰|$;ýu hþht' jhjè½äƒÄ阋C‹@‹‹PUQRèÂþÿ‹ðƒÄ ‰t$…öuh뾋C‹Qè#ƒÄ=—…#‹S‹r‹=•‰D$~#hht' hŠhjèGäƒÄé"èú}þÿ‹è…íu hht' jAhjèäƒÄé÷‹FP諃Ä=ªuw‹F…Àu h'ht' jshjèâãƒÄé½P賋6‹øƒÄ;÷~…ÿ~VUè>ƒþÿƒÄ…À„–Wé¶h/ht' h‰hjè’ãƒÄém=«…æ‹~…ÿu hBht' jshjè`ãƒÄé;‹6‹G;ðŽ‹O;ÁŽ„‹;È~~…À~zVU诂þÿƒÄ…À„‹QU蛂þÿƒÄ…À„ó‹WRU膂þÿƒÄ…À„Þ‹GPUèq‚þÿƒÄ…À„ÉjUè^‚þÿƒÄ…À„¶‹L$‹T$jQRUèÁ×ÿÿé%hHht' h„hjè¡âƒÄé|=©u hUht' j~hjèzâƒÄéUhZht' jshjèZâƒÄé5=–…‹C‹@…Àu hght' jshjè%âƒÄéjP蕲‹èƒÄ…íu hmht' j hjèôáƒÄéσ} …•ƒ}„‹Uè¢zþÿƒÄ=•‰D$~#hzht' hŠhjè©áƒÄé„jVWUèçÕÿÿ‹ðƒÄ…öu h‰ht' jhjèváƒÄéQ‹Kƒytd‹F<…Àt Pè ýÿƒÄ‹S‹B‹h’ht' QèM ýÿƒÄ ‰F<…Àuh•ht' jAéí‹S‹J‹‹IRQPèq4‹S‹B‹ƒÄ ‰N@ƒ{„™‹C …À„Žƒx„„Vèü“ÿÿ‹øƒÄ‰|$…ÿ„¥‹S ‹B¶ƒáþQVè(ÿÿ‹C ‹‹@jRPWVèšÿÿƒÄ…Àuh­ht' jë[‹L$‹SQR豋øƒÄ‰|$…ÿuh´ht' j ë2ƒ …õƒ„ëWèyþÿ‹L$ AƒÄ;Á~sh¾ht' jzhjè)àƒÄVèðžÿÿƒÄ‹|$‹\$3ö…ít UèiyþÿƒÄ…ÿt Wè\yþÿƒÄ…Ût SèOyþÿƒÄƒ|$t ‹T$Rè«“ÿÿƒÄ_‹Æ^][ƒÄË[…Ûu6‹T$RèyþÿƒÄ‰\$‹L$SWQVè ¡ÿÿƒÄ…ÀuhÔht' jé\ÿÿÿ‹D$PS谋؃ĉ\$…ÛuÃhÎht' j é3ÿÿÿh¹é"ÿÿÿhŸht' jséÿÿÿhsht' jghjè5߃Äéÿÿÿhƒht' jghjè߃Äéðþÿÿhøht' jshjèõÞƒÄéÐþÿÿhïht' jshjèÕÞƒÄé°þÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$…Àuhôht' j|hžjè ÞƒÄ3ÀËV…ÉuF‹@Pè* Pèôèÿÿ‹ðƒÄ…öuhþht' jwhžjècÞƒÄ3À^ÃjVè´ÿÿƒÄ‹Æ^Ãùu<‹Hèàøÿÿ‹ð…öuh ht' jhžjè"ÞƒÄ3À^ÃjVèsÿÿƒÄ‹Æ^Ãùthht' jshžjèï݃Ä3À^ÃÌÌÌÌÌÌÌÌ‹D$ ‹L$Whì& PQjèéa‹øƒÄ…ÿu*h$ht' juh‘jè¨Ýhì& Wè}>ƒÄ3À_ÃVWèÏþÿÿ‹ðƒÄ…öu h+ht' jh‘jèn݃Ä^3À_ÃS‹\$…Ût‹…Àt Pè!œÿÿƒÄ‰3hì& Wè!>ƒÄ[‹Æ^_ÃÌÌÌÌÌÌÌÌVW‹|$ 3Éèóöÿÿ‹ð…öu h?ht' jxh¿jè݃Ä_3À^ËD$hì& PVèmI‹øƒÄ …ÿu+hDht' jyh¿jèÌÜhì& Vè¡=ƒÄ_3À^Ãhì& VèŽ=ƒÄ‹Ç_^ÃÌÌÌÌÌ̸èv/hX' ÇD$èÄ9ƒÄ‰$…ÀuhVht' jAh’jèb܃Ä3ÀYËD$‹L$ hX' PQT$ Rèb`ƒÄ‰$…Àu.h\ht' jh’jè Ü‹D$hX' Pèñ<ƒÄ3ÀYÃVW‹|$…ÿt‹7…öu1èÕ‹ð…öu hfht' jAh’jè×ÛƒÄé)…ÿt‰7‹L$ƒyt#‹F…Àt P肚ÿÿƒÄ‹T$‹BPèâüÿÿƒÄ‰Fƒ~uhxht' jéÇ‹L$‹‰‹D$ƒx„¥‹@‹N ‹‹@QRPè|xþÿƒÄ ‰F …Àuh‡ht' j郋L$ƒy „‹F…Àt Pè&ÿÿƒÄ‹VRè:ŽÿÿƒÄ‰F…Àuhœht' jëD‹L$‹I ‹Q‹ ¶:jQR‹VPƒçþR‰~è?”ÿÿƒÄ…Àu4h¦ht' jë hŽht' j}h’jè²ÚƒÄVèéƒÄ3ö‹D$…ÀthX' Pèq;ƒÄ_‹Æ^YÃÌÌÌÌÌÌÌ̸ èV-V‹t$W3ÿ‰|$ ‰|$;÷„S9~„J9~ „AUhX' è7‹èƒÄ;ïu hËht' jAhÀjè ÚƒÄ鋉E‹N SQèÙrþÿƒÀ™ƒâ‹ØhÒÁûht' Sèûýÿ‹øƒÄ‰|$ …ÿuhÖht' jAé%‹V WRèÓwþÿƒÄ…ÀuhÜht' jé‹ESWPèP¯ƒÄ …Àuhâht' j éàöFu7‹M‹~èGóÿÿ‰E…Àu!hëht' jhÀjèXÙ‹|$4鳋|$ öF… jèꯃĉE …Àuhöht' jAëz‹N‹V‹FjjjQRPèû‘ÿÿƒÄ‰D$;Ãv0hÿht' PWèýÿƒÄ…Àuhht' jAë2‹\$‰D$ ‹ø‹N‹V‹FjSWQRPè«‘ÿÿƒÄ…ÀuNh ht' jhÀjèœØƒÄ[…ÿt WèNýÿƒÄ…íthX' Uè\9ƒÄ‹D$ ]÷ØÀ#D$ _^ƒÄ ËE ƒ` ð‹E ƒH ‹M SWQèý­ƒÄ …Àuhht' j ë‹T$$RUè}éÿÿƒÄ‰D$…Àu héiÿÿÿÇD$érÿÿÿhÄht' jChÀjèó׋D$ƒÄ÷ØÀ#D$ _^ƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$…Àuh,ht' jCh¾jè°×ƒÄ3ÀËP‰T$énúÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$ …Ûtqƒ;tlVW‹|$…ÿt‹7…öuèM‹ð…öuh@ht' jAë(…ÿt‰7‹D$PNSQèdùÿÿƒÄ …Àu!hKht' jhjè%׃Ä_^3À[Ã_‹Æ^[Ãh8ht' jChjèþÖƒÄ3À[ÃÌÌÌÌÌÌÌ‹D$V…À„¤‹0…ö„šƒ~„ƒ~u2‹FPèà‰ÿÿƒÄ‰F…Àuhaht' jAh˜jèžÖƒÄ3À^ËV‹FS‹\$W‹|$‹jSQRPèÚÿÿƒÄ…Àu!hfht' jh˜jè[ÖƒÄ_[3À^˶ƒâþ‰V_[‹Æ^ÃhZht' jCh˜jè'ÖƒÄ3À^ÃUW‹|$ 3í…ÿu hvht' jCh—jèüÕƒÄ_3À]ËG‹O‹WSVjjjPQRèËŽÿÿ‹t$0ƒÄ‹Ø…ö„¢…Û„š9.u@hƒht' Sè¾ýüÿƒÄ ‰…Àu"h…ht' jAh—jèÕƒÄ^[_3À]ý‹‹O‹WjSP‹GQRPèWŽÿÿƒÄ…Àu0hht' jh—jèHÕ‹QèÿüÿƒÄÇ^[_3À]Ã…íu‹Ã^[_]ÃÌÌÌjIhŒ' j è"ýüÿ3ÉƒÄ ;ÁujLhŒ' jAh¶jèôÔƒÄ3ÀÃljH‰H‰H ‰HÇ@Ç@‰HÃÌÌÌÌÌÌÌÌÌÌV‹t$…ötejohŒ' j!FjÿPè3ðüÿƒÄ…ÀJ‹F…Àt Pèß’ÿÿƒÄ‹F…Àt PèOˆÿÿƒÄ‹F …Àt PèomþÿƒÄNQè‡ÿÿj Vè+ÿüÿVèþüÿƒÄ^ÃSW‹|$ …ÿ„$‹\$…Û„‹CV…ÀtwþÿƒÄ‹D$]_^[YÃhòhŒ' jCh³jèiуÄ_^3À[YÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸è&$V‹t$ ÇD$…ö„ƒ~„“ƒ~„‰Uègvþÿ‹è…í„q‹FWPè#„ÿÿ‹øƒÄ…ÿ„C‹N‹VUQRèxŒÿÿƒÄ …Àu h<hŒ' jkh±jèÉЃÄé‹Fƒx SXu hChŒ' jzh±jèœÐƒÄéà‹NUSQjWPèõÿÿƒÄ…ÀuhHëp‹VWRè‹ÿÿƒÄ…ÀuhMë‹F …À„˜SPè-oþÿƒÄ…À| hWhŒ' h‚h±jè+ЃÄër‹F ‹NUjjPWQèƒÿÿƒÄ…Àuh]hŒ' jh±jèôσÄë;‹V‹FURWPèЋÿÿƒÄ…ÀthchŒ' j{h±jèÁσÄëÇD$[Uè]uþÿƒÄ…ÿt WèpƒÿÿƒÄ_‹D$]^YÃh0hŒ' jCh±jè|σÄ3À^YÃÌÌÌÌV‹t$‹F…Àt Pè®ÿÿƒÄ‹D$ Pèqÿÿ3ɃÄ…À•Á‰F^‹ÁËD$‹@ ÃÌÌÌÌÌÌÌÌV‹t$‹F …Àt PèhþÿƒÄ‹D$ Pèaqþÿ3ɃÄ…À•Á‰F ^‹ÁÃV‹t$‹F…Àt P辂ÿÿƒÄ‹F‹L$ PQèƒÿÿ3҃ąÀ•‰F^‹ÂÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‰AÃÌÌÌÌ‹D$‹L$‰H‹@…Àt ‰L$‰D$é~ÿÿËD$‹H‰L$退ÿÿSUVWh·hŒ' j!j èÉéüÿ‹|$4‹t$$‹\$0‹l$,‹FWSƒÆUPèJ€ÿÿƒÄ …Àu‹L$WSUQVè•ÿÿƒÄh»hŒ' j!j èéüÿƒÄ_^][ÃÌÌÌÌÌÌÌ‹D$‹@…Àt ‰D$é\}ÿÿÃÌÌÌÌÌÌÌÌÌÌÌ‹D$‹@…ÀuÉD$éË‹ÿÿÌÌÌÌÌÌÌÌÌÌÌVèªøÿÿ‹ð…öt‹D$Pè*ØÿÿƒÄ‰F…Àu VèêøÿÿƒÄ3À^ËÆ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$FHPè"gþÿNpQègþÿÆ„Vè gþÿƒÄ ¸^ÃÌÌÌV‹t$FHPè²fþÿNpQè©fþÿÆ„VèfþÿƒÄ ^ÃÌÌÌÌÌÌÌÌV‹t$FHPè"fþÿNpQèfþÿ–„Rè fþÿ3ÀƒÄ ‰F\‰F`‰Fd‰Fh‰Fl^ÃÌÌÌÌÌÌÌV‹t$W‹|$GHPNHQè)hþÿƒÄ…Àu_^ÃSWpR^pSèhþÿƒÄ…Àu[_^ÃU‡„P®„UèògþÿƒÄ…Àu][_^ËO\‰N\‹W`‰V`‹Gd‰Fd‹Oh‹F\ƒÀ‰Nh‹Wl‰Vl™ƒâÂÁø;Fx~ PSèmgþÿƒÄ‹F\ƒÀ™ƒâÂÁø;†Œ~ PUèLgþÿƒÄ‹Ft;Fx}‹ Ç@;Fx|ñ‹†ˆ;†Œ}I‹UÇ‚@;†Œ|í][_¸^ÃÌÌÌ‹D$SUV‹t$P^HS3íè)gþÿƒÄ…À„èWj~\WSèaÖþÿƒÄ ƒøt*ƒøt%hÄh@( hƒhÃjè™ËƒÄ_^‹Å][ËL$WQ^pSè ÒþÿƒÄ …Àt㋃À™ƒâÂÁø;Fx~ PSèofþÿƒÄ‹Ft;Fx}d$‹‰,‚@;Fx|õ‹D$ WPž„SèSÒþÿƒÄ …Àt–‹ƒÀ™ƒâÂÁø;†Œ~ PSèfþÿƒÄ‹†ˆ;†Œ}‹ ‰,@;†Œ|ò_^]¸[Ã^‹Å][ËD$V‹t$W3ÿ…ÀtNHQPèfþÿƒÄ…Àu_^ËD$…ÀtVpRPèúeþÿƒÄ…Àt!‹D$…ÀtÆ„VPèÞeþÿƒÄ…Àt¿‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ƒÀHPè3cþÿƒÄHÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌUV‹t$W3í3ÿ…öu*èŒoþÿ‹ø‹÷…ÿuh h@( jAhŸjèʃÄëISVèðoþÿVèzpþÿ‹ØƒÄ…Ût%‹D$H\Q„PSè ÑþÿƒÄ …Àt 9kt½[…öt VèpþÿƒÄ…ÿt WètoþÿƒÄ_^‹Å]ÃÌÌÌÌÌÌÌÌÌÌÌV‹t$FPèBcþÿNQè9cþÿƒÆ,Vè0cþÿƒÄ ¸^ÃÌÌÌÌÌÌV‹t$FPèÒbþÿNQèÉbþÿƒÆ,VèÀbþÿƒÄ ^ÃÌÌÌÌÌÌÌÌÌÌÌV‹t$FPèBbþÿNQè9bþÿV,Rè0bþÿƒÄ ÇF@^ÃÌÌÌÌV‹t$ W‹|$ FPOQèYdþÿƒÄ…Àu_3À^ÃVRGPè@dþÿƒÄ…ÀtçN,QW,Rè,dþÿƒÄ…ÀtÓ‹F@‰G@_¸^ÃÌÌÌÌÌÌÌ‹D$Ç@@ƒÀ,jPèjeþÿƒÄ¸ÃÌ‹D$ SU3í…Àtm‹\$…ÛteV‹t$WP~WèÌcþÿƒÄ…ÀtGUWèžiþÿ~SWè´cþÿƒÄ…Àt/UWè†iþÿ~,è¾`þÿPWè—cþÿƒÄ…ÀtUWèiiþÿ½ƒÄ‰n@_^‹Å][Ãhah@( jCh£jèȃÄ]3À[ÃÌÌÌÌÌÌÌ‹D$SW‹|$WP3ÛèƒÿÿƒÄ…Àt h}h@( jjh¢jèÎǃÄ_3À[Ãè1`þÿPO,Qè—fþÿƒÄ…Àt hƒh@( jBh¢jè˜ÇƒÄ_3À[ÃV‹t$…ötWRVèÍbþÿƒÄ…Àt4jVèžhþÿƒÄ‹t$…ötƒÇWVè©bþÿƒÄ…ÀtjVèzhþÿƒÄ»^_‹Ã[ÃÌÌÌÌÌÌÌÌÌÌÌÌjIhX( jEh¤jèǃÄ3ÀÃÌÌÌÌ̸ èæ‹D$SUVWÇD$ƒø„Wƒø„Nƒøt%h¹h@( jhh¡jèÇÆƒÄ_^]3À[ƒÄ ËD$$‹t$ PVèÛÿÿƒÄ…Àt&‹D$,…Àtƒ|$0shÄëFÆ_^]¸[ƒÄ ÃVèXwÿÿ‹l$0ƒÀ™ƒâ‹ØÁûƒÄD‰D$…턱9D$0s%hÖh@( jdh¡jè5ƃÄ_^]3À[ƒÄ Ët$4…öuèkkþÿ‰D$‰D$4…À„§‹ðVèãkþÿVèmlþÿ‹øV‰|$$èalþÿV‰D$8èWlþÿƒÄ…Àtb‹L$(‹T$$‹D$ VQWRPèj}ÿÿƒÄ…ÀtEWÆE¾è„^þÿƒÀ™ƒâÂÁø‹û+øƒÄ;ûvChøh@( jDh¡jè…Å‹t$HƒÄVè¨kþÿ‹D$ƒÄ…Àt PèkþÿƒÄ_^]3À[ƒÄ Ã…ÿvWEjPè²ƒÄ w‹T$ .QRèFcþÿðCƒÄ;ðthë‹‹L$(Qèé]þÿƒÀ™ƒâÂÁø‹û+øƒÄ;ûv h é`ÿÿÿ…ÿvW.jPèPƒÄ ÷‹D$(.RPèåbþÿðƒÄ;t$t hé(ÿÿÿ‹L$4Qèæjþÿ‹D$ƒÄ…Àt PèUjþÿƒÄ‹D$_^][ƒÄ Ãh°h@( jEh¡jè~ăÄ_^]3À[ƒÄ Ã̸èFU3íV‹t$(‰l$ ‰l$;õu#h>h@( jdh jè:ăÄ^3À]ƒÄËD$$W¶8‹Çƒàƒçþ‰D$ tƒÿtƒÿtƒÿthHëƒÿu ;ÅthMë;ýuBƒþt$hUh@( jfh jèÒÃÄ_^3À]ƒÄËL$$‹T$ QRèÇxÿÿƒÄ_^]ƒÄËD$ SPè‚tÿÿƒÀ™ƒâ‹ØÁûƒÄCƒÿtD;ðt%hah@( jfh jèiÃÄ[_^3À]ƒÄËt$4;õuèŸhþÿ‰D$‹ð;ÅtßVèiþÿVè©iþÿV‹èè¡iþÿV‰D$@è—iþÿƒÄ‰D$…À„J‹L$,UASQè+`þÿƒÄ …À„2‹D$$ƒÀHPUè‚aþÿƒÄ…À| huh@( jfh jèÓƒÄéýƒÿu‹T$‹|$(‹D$$VRUWPè0{ÿÿéž‹L$0‹T$,QDSPè·_þÿƒÄ …À„¾‹D$$‹L$0ƒÀHPQè aþÿƒÄ…À|h‚놋\$$ƒÿuD‹D$0‹|$‹‹ŠˆVUPWSÿуÄ…Àtwƒ~‹öt¸ë3À9D$t hŠé9ÿÿÿ‹D$0‹|$(VPUWSèÍxÿÿƒÄ…Àt8‹L$$VWQèŠ}ÿÿƒÄ …Àuh”h@( jkh jèÛÁƒÄëÇD$Vèøgþÿ‹D$ƒÄ…Àt PèggþÿƒÄ‹D$[_^]ƒÄÃÌÌÌÌÌÌÌ̸ èvSV‹t$4W‹|$03ÛVW‰\$0‰\$(èª|ÿÿƒÄ…Àt‹D$<‹L$4PQè¤uÿÿƒÄ÷Ø_À^÷Ø[ƒÄ ËT$sÿÿƒÄ…ÀtÇD$$VèIdþÿ‹D$0ƒÄ]…Àt Pè·cþÿƒÄ‹D$ _^[ƒÄ ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$‹T$P‹D$PPQRè6üÿÿƒÄÃÌÌV‹t$ W‹|$ VWèïxÿÿƒÄ…Àu/9Ft*‹D$PVWèzÿÿƒÄ …Àu_^ÃFPƒÆVPèÄþÿƒÄ _^Ã_¸^ÃÌ‹L$3À9A0”ÀÃÌÌ̸èFS‹\$ U‹l$(USÇD$ÿÿÿÿÇD$èuxÿÿƒÄ…Àt ]¸[ƒÄÃ}@‹‹ˆ€‹„VW‹|$4‰L$‰T$$„Û…ÿuèTbþÿ‰D$‹ø…Àu _^]ƒÈÿ[ƒÄÃWèÉbþÿWèScþÿW‰D$,èIcþÿ‹ðƒÄ …ö„šCpPƒÅUVèNÃþÿƒÄ …À„WUVVSÿT$$ƒÄ…Àtq‹D$0ƒÀPVV‰D$(è ÃþÿƒÄ …ÀtWWUVVSÿT$$ƒÄ…ÀtG‹„QVVèûÂþÿƒÄ …Àt2‹T$‹l$ WRUSÿT$4ƒÄ…ÀtUVVèÕÂþÿƒÄ …Àt 3À9F”À‰D$…ÿt WèXbþÿƒÄ‹D$…Àt PèÇaþÿƒÄ‹D$_^][ƒÄÃÌÌÌÌÌÌÌ̸èÖS‹\$V‹t$SVÇD$ÇD$ÿÿÿÿèwÿÿƒÄ…Àt‹D$$PVèóvÿÿƒÄ÷ØÀ^@[ƒÄÃ{@tC‹t$$ƒ~@t9NQSRèxZþÿƒÄ…ÀuƒÆVƒÃSèdZþÿƒÄ…Àu^[ƒÄÃ^¸[ƒÄËt$(…öuè¯`þÿ‰D$‹ð…Àu ^ƒÈÿ[ƒÄÃUWVè$aþÿVè®aþÿV‹èè¦aþÿV‰D$(èœaþÿV‰D$(è’aþÿ‹øƒÄ…ÿtf‹D$VPUS‹\$4Sè§rÿÿƒÄ…ÀtM‹L$‹T$,VWQRSèŽrÿÿƒÄ…Àt4‹D$PUè¼YþÿƒÄ…Àu‹L$WQèªYþÿƒÄÇD$…ÀtÇD$_]…öt Vè×`þÿƒÄ‹D$…Àt PèF`þÿƒÄ‹D$^[ƒÄÃÌÌÌÌÌÌÌÌ̸èV S‹\$W3ÿ‰|$‰|$ 9{@…ЋD$SPè‚uÿÿƒÄ…À…ºV‹t$ ;÷uè‰_þÿ‰D$ ‹ð;Çu ^_3À[ƒÄÃUVèÿ_þÿVè‰`þÿV‹èè`þÿ‹øƒÄ …ÿtQ‹L$VWUSQèšqÿÿƒÄ…ÀtýƒÄ ‰|$‹\$…Ût Sè—]ÿÿƒÄ[UèíOþÿUègOþÿ‹D$ƒÄ_^…Àt PèdÓüÿƒÄ‹D$ ]ƒÄÃÌÌÌÌÌÌÌÌV‹t$VèüÿÿƒÄ…Àu^ËL$‹T$‹@ ‹@Q‹L$VR‹T$QRÿЃÄ^ÃÌÌÌÌÌÌÌÌÌÌ¡PPè…¹ƒÄ…ÀuhPPè³¶hhjè§¶ƒÄÃÌÌÌ‹D$£0íÃÌÌÌÌÌÌ¡0í…Àu èb£0íÃÌÌÌÌÌÌÌÌÌÌÌÌVjohˆ) jèñÐüÿ‹ðƒÄ …öujrhˆ) jAjdj*èÆ¨ƒÄ3À^á0íÇ…Àu è £0í‰F ‰~…ÿuèw²‰F‹F…Àt;PèrþÿƒÄ‰F …Àu+h‚hˆ) j&jdj*èh¨‹FPèoVèÒüÿƒÄ3À^ËN ‹QFPVj ‰VèíëüÿƒÄ ‹Æ^ÃÌÌÌÌÌ̃|$u3ÀÃW3ÿè.ÿÿÿ_ÃÌÌÌÌÌÌÌÌÌÌÌÌV‹t$‹F…Àt PèƒÄFPVj è_ìüÿjVè·ÒüÿVè¡ÑüÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌS‹\$VhRhRhðQSè%ÙÿÿƒÄ…Àu2W3ÿè¶þÿÿ‹ð_…öu^3À[ÃhRhRhðQVSèÙÿÿƒÄ‹Æ^[Ëð^[ÃÌÌÌÌÌÌ̸èFú‹D$…ÀuƒÄÃWPèC ‹øƒÄ…ÿu_ƒÄÃVèÿ@þÿ‹ð…ötjVWèVÿÿƒÄ V…Àuè#@þÿƒÄ^3À_ƒÄÃèã?þÿƒÀ™ƒâÂÁø‰D$ L$ D$ jQ‰D$ÇD$ÆD$(ÿèb.ÀjPjèÖ{V‹øèÎ?þÿƒÄ^‹Ç_ƒÄÃÌÌÌ‹D$‹L$‹T$ P‹D$ Q‹L$ RPQj èðéüÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$Pè¶þÿÿƒÄ…ÀuÃÀ‰D$éBëüÿÌÌ‹D$Pè–þÿÿƒÄ…ÀuÃÀ‰D$éÂëüÿÌÌ‹D$VPèuþÿÿ‹ðƒÄ…öu^ËF…ÀtPè=›ƒÄÇF‹L$ ‰N ¸^ÃÌÌÌÌÌ‹D$ ‹L$‹T$hØ) PQRè*ƒÄÃÌÌÌ‹D$‹L$hØ) PQè\ƒÄ ÃÌÌÌÌÌÌÌÌhØ) èƒÄÃÌÌ‹D$hØ) P葃ÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ˆÃÌÌÌÌÌÌÌÌÌ̸èfø‹D$VW3ÿ‰|$‰|$;Ç„–PèX ‹ðƒÄ;÷„ƒS‹\$$;ßu)èJþÿ‹Ø;ßujlh * jAjgj*è5¥ƒÄ[_3À^ƒÄÃUèã>þÿ‹øèÜ>þÿ‹è‰l$èÑ>þÿ‰D$$èÈ>þÿ‰D$…ÿ„¢…턚ƒ|$$„…À„‡VèûWÿÿ‹èƒÄ‰l$…íuj~h * jéo‹D$$SPVè”SÿÿƒÄ …Àuhƒh * jéK‹L$$QWèfþÿƒÄ…À„ºƒtäSjjWUVèãaÿÿƒÄ…À„ªVèµPèü´ƒÄSj=–u$‹T$RUVès[ÿÿƒÄ…Àu$hžh * jéÚ‹D$PUVè¿[ÿÿƒÄ…Àth‹L$$‹T$‹D$SQRPèCWþÿƒÄ…ÀtZ‹L$ƒy„Rÿÿÿ‹T$$SRWWèáþÿƒÄ…ÀuFh¶h * jë{hŽh * jhëmh–h * jë_h§h * jëQh­h * jëC‹l$0‹E…Àt Pèƒ<þÿƒÄ‹t$,‹…Àt Pèp<þÿƒÄ‹D$‰E‰>ÇD$ë3jyh * jAjgj*èH£ƒÄ…ÿt Wè;<þÿƒÄ‹D$…Àt Pè*<þÿƒÄƒ|$(]u SèÉHþÿƒÄ‹D$ …Àt Pèh<þÿƒÄ‹D$…Àt PèÇVÿÿƒÄ‹D$…Àt Pèæ;þÿƒÄ‹D$[_^ƒÄÃjdh * jCjgj*èÆ¢ƒÄ_3À^ƒÄÃÌÌÌÌÌÌÌÌÌÌ̸è†õSU‹l$0V3öWU‰t$ ‰t$‰t$èºúÿÿU‹øèrU‹Øè:ÓÿÿƒÄ ‰D$ ;Þ„b;Æ„Z;þ„Rè†üÿÿ‰D$;Æuhíh * jAé@‹hè…Gþÿ‹ø…ÿ„žèæ;þÿ‹ð…ö„è×;þÿ‰D$…À„~èÆ;þÿ‰D$…À„mWVSèÒPÿÿƒÄ …Àuhûh * jéYVè¤:þÿ‹L$0̓Ä;Ð~h h * jeé0‹D$PQ‹L$0QèÁ>þÿƒÄ …Àuhh * jé‹\$0…Ût&‹D$4…Àt‹T$P‹Pè¼<þÿƒÄ…Àu*h"éÓ‹L$‹D$8QT$ RWP薃ąÀtz‹\$‹L$‹‹D$ ‹L$WVRPQèÃUþÿƒÄ…Àte‹T$‹D$VRPUèÛTþÿƒÄ…Àt[WVSUUèšUþÿƒÄ…ÀtXƒ}……ƒ|$0„Uÿÿÿƒ|$4„Jÿÿÿh<h * jjëDhh * j*ë6h)h * jë(h.h * jëh3h * jë hõh * jAjej*èx ‹L$$ƒÄQè«úÿÿƒÄ3Ûë‹\$…ÿt WèFþÿƒÄ‹D$…Àt PèE9þÿƒÄ‹D$…Àt Pè49þÿƒÄ…öt Vè‡9þÿƒÄ‹D$…Àt Pè9þÿƒÄ_^]‹Ã[ƒÄÃhæh * jCjej*èôŸƒÄ_^]3À[ƒÄÃÌÌÌÌÌÌ̸è¶òUV‹t$,ÇD$ ÿÿÿÿÇD$…ö„7V袋èƒÄ…í„$VèÏwƒÄ‰D$…À„ƒ|$(„èÐDþÿ‹ð…öuhoh * jAéôSWVèAEþÿVèËEþÿV‹ØèÃEþÿV‰D$,è¹EþÿV‹øè±EþÿV‰D$0è§EþÿƒÄ‰D$4…Àuhzh * jjfj*èŸébVSUèêMÿÿƒÄ …Àuh€h * jjfj*èîžé9Sè³7þÿ‹L$0̓Ä;Ð~hŽh * jeéÿ‹D$0‹ƒx„ãƒx …ÙSPè/=þÿƒÄ…ÀÇ‹L$0‹Aƒx„¶ƒx …¬SPè=þÿƒÄ…Àš‹T$0‹BVSPWèWzþÿƒÄ…Àu hžéÿÿÿ‹L$‹T$,‹D$(QRPèR;þÿƒÄ …Àu h¤éúþÿÿ‹L$‹T$VSWQRè¯RþÿƒÄ…Àu hªé×þÿÿ‹D$0‹VSWQWèŽRþÿƒÄ…Àu h°é¶þÿÿUè÷PÿÿƒÄ‰D$…Àuh¶h * jAjfj*è·é‹T$ VW‹|$$RWPUè[ÿÿƒÄ…Àuh»h * jjfj*èƒéÎUè®P讃ÄVj=–u1‹D$<‹L$PQUè…TÿÿƒÄ…ÀuHhÃh * jjfj*è9é„‹T$<‹D$RPUèÄTÿÿƒÄ…ÀuhÌh * jjfj*èëV‹L$4VSQWè9PþÿƒÄ…Àu hÓéÁýÿÿ‹T$0‹PWèk;þÿƒÄ÷ØÀ@‰D$ë h—h * jdjfj*踜ÇD$(ƒÄVè×BþÿVèQBþÿ‹D$ƒÄ_[…Àt Pè^PÿÿƒÄ‹D$ ^]ƒÄÃhhh * jgjfj*èlœƒÄ^ƒÈÿ]ƒÄÃV‹t$Vè…ôÿÿƒÄ…Àu^ËL$‹T$‹@ ‹@VQ‹L$R‹T$QRÿЃÄ^ÃÌÌÌÌÌÌÌÌÌÌV‹t$$VèEôÿÿƒÄ…Àt&‹L$ ‹T$‹@ ‹@VQ‹L$R‹T$QRÿЋðƒÄ…öu‹L$Ç3À^ÃT$RVèßõÿÿ‹L$ V‰èöÿÿƒÄ ¸^ÃÌÌÌÌÌÌÌÌÌV‹t$VèÕóÿÿƒÄ…Àu^ËL$‹T$‹@ Q‹L$R‹PQVÿÒƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$Vè•óÿÿƒÄ…Àu^ËL$ ‹@ ‹T$‹@VjjQRÿЃÄ^ËD$‹L$‹T$P‹D$jjQ‹L$R‹T$PQRèùþÿÿƒÄ ÃÌÌÌÌÌV‹t$Vè5óÿÿƒÄ…Àu^ËL$‹T$ ‹@ VQ‹L$R‹P QÿÒƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸è¦íVƒÎÿèíôÿÿ‰D$…Àu Æ^YËD$PL$QT$ RèŒôÿÿƒÄ …ÀtE‹t$W‹|$$Wè¶òÿÿƒÄ…Àu‹L$_Q3öè²ôÿÿƒÄ‹Æ^YËL$‹@ ‹T$‹@ WVQRÿЃÄ‹ð_‹L$Qè†ôÿÿƒÄ‹Æ^YÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¡ PèeªƒÄ…Àuh Pè“§hÈj臧ƒÄÃÌÌÌjChÐ* j èÂüÿ3ÉƒÄ ;ÁujFhÐ* jAjejè×™ƒÄ3ÀɉH‰HÃÌÌÌÌÌÌÌÌV‹t$…öt(‹F…Àt‹NQjPè í‹VRè[ÃüÿƒÄVèRÃüÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$ W‹|$ ‹;Ã}9_|‹W‹Ë+ÈQÐjRèÁìƒÄ ‰_‹Ã[ÃK¸VUUU÷é‹GV‹òÁîòöö…ÀujnhÐ* Vè5ÁüÿƒÄ ëjphÐ* VPè¢ÁüÿƒÄ…ÀujshÐ* jAjdjèù˜ƒÄ^3Û_‹Ã[Ë‹Ó+ÑRÈjQ‰G‰wè?ìƒÄ ^‰_‹Ã[ÃÌÌÌÌÌÌÌÌÌÌÌÌS‹\$‹W‹|$;Ç|+ÇP‹CÇjPèìƒÄ ‰;‹Ç_[ÃU‹k;ï|‹S‹Ï+ÈQÐjRèäëƒÄ ]‰;‹Ç_[ÃO¸VUUU÷é‹CV‹òÁîòöö…Àuh“hÐ* VèTÀüÿƒÄ ëh•hÐ* VUPè=ÁüÿƒÄ…Àu!h˜hÐ* jAjij蘃Ä^3ÿ]‹Ç_[Ë ‹×+ÑRÈjQ‰C‰sèVëƒÄ ^]‰;‹Ç_[ÃÌÌW‹|$…ÿu3À_ÃV‹t$jXhì* VèÑ¿üÿƒÄ …Àuj[hì* jAjgj託ƒÄ^3À_ÃVWPèúêƒÄ ^_ÃÌÌ‹L$ ‹D$V‹t$W3ÿƒùvŠ„Òt ˆIF@Gƒùwï…ÉtÆPŠ@„Éuù+ÂÇ_^ÃÌÌ‹D$ ‹L$S3ÛW…Àv €9tHCA…Àwô3ÿV‹t$ƒøvŠ„Òt ˆHAFGƒøwï…ÀtÆ‹ÆP^Š@„Éuù+ÂÇ_Ã[ÃÌÌÌÌÌÌÌÌÌÌS‹\$…Ûu3À[ÃVW‹|$jHGhì* Wèß¾üÿ‹ðƒÄ …öujKhì* jAjhjè´–ƒÄ_^3À[ÃWSVèÿÿÿƒÄ _‹Æ^[ÃÌÌÌÌÌÌÌÌÌÌ‹T$…Òu3ÀËÂVpŠ@„Éuù+ÆPRèÿÿÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌ¡P蕦ƒÄ…ÀuhPèãh4íjè·£ƒÄÃÌÌÌSU‹l$V‹t$W3ÿ^8S¸VW‰.‰~‰~‰~ ‰F‰~‰~‰~‰~ ‰~(‰~$‰F,‰~0‰~4è™Ùüÿ‹EƒÄ ;ÇtVÿЃÄ…ÀuSVWè=ÚüÿƒÄ _^]3À[Ã_^]¸[ÃÌÌÌÌÌÌÌÌÌV‹t$…öu3À^Ãjuh\+ jF,jÿPè±üÿƒÄ…ÀC‹F…ÀtjjjjjVÿЃÄ…À~-N8QVjèÑÙüÿ‹ƒÄ …Àt‹@ …Àt VÿÐVè¿üÿƒÄ¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌé{ÿÿÿÌÌÌÌÌÌÌÌÌÌÌ‹L$‹D$÷Ñ!HÃÌÌ‹D$‹@#D$ÃÌÌÌÌ‹D$‹L$ HÃÌÌÌÌ‹D$‹L$‰AÃÌÌÌÌ‹D$‹L$‰AÃÌÌÌÌV‹t$…ö„…‹…Àtƒx tyS‹\$U‹l$W‹~…ÿtjjSUjVÿ׃Ä…À~#ƒ~ u"hÐh\+ jxjoj èx”ƒÄ¸þÿÿÿ_][^Ë‹H SUVÿÑƒÄ …À~F0…ÿtãPjSUh‚Vÿ׃Ä_][^ÃhÅh\+ jyjoj è)”ƒÄ¸þÿÿÿ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$…öu3À^ËW‹~…Àt{ƒxtuS‹\$U‹l$…ÿtjjSUjVÿ׃Ä…À~#ƒ~ u"hóh\+ jxjqj 踓ƒÄ¸þÿÿÿ][_^Ë‹HSUVÿÑƒÄ …À~F4…ÿtãPjSUhƒVÿ׃Ä][_^Ãhéh\+ jyjqj èi“ƒÄ_¸þÿÿÿ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$…öt‹…ÀtyƒxtsS‹\$W‹~…ÿtjjjSjVÿ׃Ä…À~#ƒ~ u!hh\+ jxjnj 蓃ĸþÿÿÿ_[^Ë‹HSVÿуÄ…À~F4…ÿtåPjjSh„Vÿ׃Ä_[^Ãhh\+ jyjnj è³’ƒÄ¸þÿÿÿ^ÃÌÌÌÌÌÌÌÌÌV‹t$…öt~‹…ÀtxƒxtrS‹\$U‹l$W‹~…ÿtjjSUjVÿ׃Ä…À~#ƒ~ u"h5h\+ jxjhj èL’ƒÄ¸þÿÿÿ_][^Ë‹HSUVÿÑƒÄ …ÿtêPjSUh…Vÿ׃Ä_][^Ãh)h\+ jyjhj 蒃ĸþÿÿÿ^ÃÌÌÌÌÌÌÌÌÌÌV‹t$ W…ö}3ö‹D$;ð~‹ð…öt‹|$ ‹ÿht+ WNètþÿÿƒÄƒøu …öuè_¸^Ã_3À^ÃÌÌÌÌÌÌÌÌÌÌÌV‹t$…öu3À^Ë…Àt[ƒxtUS‹\$U‹l$W‹~…ÿt‹D$jUPSjVÿ׃Ä…À~)‹T$‹‹ASURVÿЃÄ…ÿt‹L$PUQSh†Vÿ׃Ä_][^Ãhhh\+ jyjgj 葃ĸþÿÿÿ^ÃÌÌÌV‹t$…öu3À^Ë…ÀtVƒx$tPS‹\$W‹~…ÿtjjSD$$PjVÿ׃Ä…À~)‹T$‹‹A$RSVÿÐƒÄ …ÿtPjSL$$Qh†Vÿ׃Ä_[^Ãhƒh\+ jyhƒj èƒÄ¸þÿÿÿ^ÃÌÌÌÌÌ‹D$jjj PèÐþÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$jjj Pè°þÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌV‹t$…öu‹D$ ^Ã~$N$‹Æt›‹ƒx$H$uõ‹L$ ‰H$…Ét‰A(jjjVè[þÿÿƒÄ‹Æ^ÃÌÌÌÌV‹t$…öu3À^ÃW‹~$jjjVè3þÿÿ‹F(ƒÄ…Àt‹N$‰H$‹F$…Àt‹V(‰P(‹Ç_ÇF$ÇF(^ÃÌÌÌ‹L$²‹Á„QtI‹Á‹I$…Ét„Quò‹L$…Ét‹P‰ÃÌÌÌÌ‹D$…ÀuÃV‹t$ ‹Öâÿ‹…Ét‹ …Òu…Îu ë;Ît‹@$…Àuã^ÃÌÌÌÌÌÌÌÌÌÌÌ‹D$…ÀuË@$ÃÌÌÌV‹t$…öt"W›‹~,‹Æ‹v$PèRùÿÿƒÄƒÿ…öuæ_^ÃÌÌÌ‹D$‹H$‹Qƒâ P‹I‰HÃÌÌÌÌÌÌÌÌÌ‹D$‹L$‹T$ P‹D$ Q‹L$ RPQjèÒüÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ‹T$ƒÂ8‰T$é`Óüÿ‹L$ƒÁ8‰L$éðÓüÿ‹D$…Àt‹@0Ã3ÀÃÌ‹D$…Àt‹@4Ã3ÀÃÌVjFh\+ j@èa¶üÿ‹ðƒÄ …öujIh\+ jAjlj è6ŽƒÄ3À^ËD$PVèô÷ÿÿƒÄ…Àu Vè×·üÿƒÄ3ö‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹T$ L$Q‹L$‰D$‹D$ RPQè?üÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌ̸è¦à‹L$‹T$ $P‹D$ QRPÇD$èüÿÿ3É…ÀžÁI#L$‹ÁƒÄÃÌÌÌ̸èfàSUVW‹|$3í‰l$;ý„›‹jFh\+ j@èpµüÿ‹ðƒÄ …ö„SVè÷ÿÿƒÄV…Àty‹G‰F‹O‰N‹W ‰V ‹G‰F‹Oj‰N‹Wj W‰VèvûÿÿƒÄ…ÀtbG8PN8QjèÑüÿƒÄ …ÀtUƒ|$u‰t$ë VUè¥üÿÿƒÄ‹$‹î…ÿ…eÿÿÿ‹D$_^][YÃ膶üÿëjIh\+ jAjlj 貌ƒÄë Vè÷öÿÿƒÄ‹D$…Àt PèæöÿÿƒÄ_^]3À[YÃÌÌÌÌÌÌÌÌÌÌ̸èVß¡Àç3ĉ„$S‹œ$UV‹´$W‹¼$,½„Ûy‹ïVh˜, D$hPèß:CÿƒÄ=…‡•¶ˆ@pÿ$p‹‹BPhŒ, hòL$*Qé}‹‹P÷‹N‹„$$t QRPQht, L$2hòQèw:ƒÄéNRPQh`, T$.hòRèX:ƒÄé/‹÷‹”$$t&‹N‹@QPRQhD, D$2hòPè!:ƒÄéø‹H‹FQRPh0, L$.hòQèü9ƒÄéÓ‹‹BPh , hòL$*Q鱋‹B‹Œ$$PQh, T$*hòRè¸9ƒÄé‹‹H‹”$$QRh, D$*hòPèŽ9ƒÄëhWhì+ hòL$*QëNWhØ+ hòT$*Rë‹ƒÄ ÷Ct ~‹Ç_^[ËF3ÉU,8…Ò~ +èŠ(ˆA@;|õ]‹Ç_^[Ã>uõ‹s…öt j SèšòÿÿƒÄ_‹Æ^[ÃÌ‹D$V‹p WƒÏÿƒ|$uh¶h¨0 jsjuj èh‡ƒÄ‹Ç_^Ã÷@th»h¨0 j~juj èB‡ƒÄ‹Ç_^ÃSUjPèòÿÿ‹‹l$$<+WVè`îÿÿƒÄ;Çu‹D$‹NUPËQèjÚƒÄ ‹Å][_^Ã][_ƒÈÿ^ÃÌÌÌÌÌÌ‹D$SVW‹|$‹w H»=‡È¶€Ptÿ$… t‹F…À„±÷G‹Nt‹+ÑÐ_‰V‰^‹Ã[ÃQjPèúÙƒÄ _Ç^‹Ã[Ã3Û9_”Ã^‹Ã[ËT$‰W_^‹Ã[ËD$‹…ÀtX‹N_‰^‹Ã[ÃWèÞýÿÿ‹D$ ‹T$ƒÄ‰G ‰W_^‹Ã[ËD$…Àt(_‰0^‹Ã[Ë__^‹Ã[ËL$‰O_^‹Ã[Ë_^‹Ã[Ã3Û_^‹Ã[Ã]ss·sùsttttÌsésªst   ÌÌÌÌÌÌÌÌÌÌÌÌÌÌVW‹|$ ‹w jWèðÿÿ‹D$‹HƒÄ;Á}‹È…É ‹D$_Æ3À^Ëv3À…É~›€<0 t@;Á|õë@‹t$PVWèÆüÿÿƒÄ …À~Æ0_^ÃÌÌÌÌÌÌÌÌ‹T$‹ÂVp›Š@„Éuù+ÆP‹D$ RPèýÿÿƒÄ ^ÃÌÌÌÌÌ̸`ÃÌÌÌÌÌÌÌÌÌÌ‹D$3ÉÇ@ ‰H‰H AÃÌÌÌÌÌÌÌÌÌ‹D$ ÃÌÌÌÌÌÌÌÌÌÌÌ‹D$Hƒø w¶€ìuÿ$…äu¸Ã3ÀÃIØuÞuÌÌÌÌÌÌÌÌ‹D$…ÀuÃPd$Š@„Éuù+ÂÃÌÌÌÌÌ̸ˆÃÌÌÌÌÌÌÌÌÌÌVhˆè…õÿÿ‹ðƒÄ…öu^ËD$‹L$ PQjhVèÈõÿÿƒÄ‹Æ^ÃÌ‹D$3ɉH Ç@ÿÿÿÿ‰H Ç@€AÃÌÌV‹t$…öu3À^Ã~t!ƒ~ t ‹FPÿXƒÄÇF ÇF€¸^ÃÌÌÌÌÌ‹D$HV¾=„‡«¶€°wÿ$…ˆw3Àë‹D$‹L$‹QjPRÿTƒÄ ‹ð^ËD$‹HVjQÿTƒÄ ‹ð^ÃW‹|$ WèYÿÿÿ‹T$‹‹L$ƒÄ‰G‰w ‰O_‹Æ^ËD$ƒx t‹L$…Ét‹P‰‹p‹Æ^ÃÎÿ‹Æ^ËD$‹p‹Æ^ËL$‹T$‹Æ‰J^Ã3ö‹Æ^ÃävwgwrwwƒwwBwèvw     ÌÌÌÌÌÌÌÌÌÌÌ‹D$ƒøtƒø t3ÀøÃÌÌÌÌÌÌÌÌÌ‹D$…Àtƒøÿt3ÀÃÿ¨ ƒøtƒø uí¸ÃÌÌÌÌÌÌÌÌÌÌV‹t$ 3À…ötRWPÿD ‹D$‹|$ ‹OPVQÿLjW‹ðè?ìÿÿƒÄ…ö"tƒþÿuÿ¨ ƒøtƒø u j Wè9ìÿÿƒÄ‹Æ_^ÃÌVWjÿD ‹D$‹L$‹|$ ‹WPQRÿPjW‹ðèäëÿÿƒÄ…ö"tƒþÿuÿ¨ ƒøtƒø u j WèÞëÿÿƒÄ_‹Æ^ÃÌÌÌÌÌÌ‹T$‹ÂVp›Š@„Éuù+ÆP‹D$ RPè{ÿÿÿƒÄ ^ÃÌÌÌÌÌ̸°ÃÌÌÌÌÌÌÌÌÌÌ‹D$3ɉH ‰H‰H Ç@€AÃÌÌÌÌÌÌV‹t$…öu3À^Ã~t=ƒ~ t0‹F …Àt)÷F€Ptÿ(ëÿ(! ƒÄÇF ÇF€ÇF ¸^ÃÌÌÌÌÌÌÌÌÌV‹t$3À9F „‹L$ …É„‘÷F€‹F ‹T$WPRjQtÿëÿ0! ‹øƒÄ…ÿu÷F€t ‹F Pÿ<ë ‹N Qÿ,! ƒÄ…Àt;hÊhè0 ÿ¨ Pj jè‡hËhè0 jh‚j èoƒÄ(_ƒÈÿ^ËÇ_^ÃÌ‹L$3À9A t>‹T$…Òt6÷A€V‹t$t‹A PjVRÿë‹I QjVRÿ4! ƒÄ…Àt‹Æ^ÃÌÌÌÌÌÌ‹L$SUV‹t$‹F IW½ù„‡(¶‰ ~ÿ$ô}÷F€jt‹T$ RPÿ0ƒÄ _^‹è][ËL$ QPÿP! ƒÄ _^‹è][Ã÷F€Ptÿ$ƒÄ_^‹è][ÃÿL! ƒÄ_^‹è][Ã÷F€Ptÿ4ƒÄ_^‹è][ÃÿH! ƒÄ_^‹è][ÃVèàýÿÿ‹T$ ‹|$$‹Ð #ՃĉV‰~ ‰n ÿÓ;ørÿÓ€;øsh€VèøèÿÿƒÄWÿD! ƒÄöD$th@Pÿ@! ƒÄ_^‹Å][Ãh€Pÿ@! ƒÄ_^‹Å][ÃVèbýÿÿ‹\$ ‹Ã#ŃĉFöÃtjöÃt h1 L$QëHhP# ë<‹ÃƒàtöÃt!jh1 D$Pë'öÃtjh1 L$Që…À„Íjhô¨ T$RèÏåÿÿ|$ ƒÄ OöÃu‹ÿŠGG„Àuøf¡L# f‰ëŠGG„Àuøf‹ 1 f‰‹|$ T$RWÿt‹ÆPŠ@„Éuù_+Â^ËÇ_^ÃÌÌÌÌÌÌÌÌ‹T$‹ÂVp›Š@„Éuù‹L$+Æ‹ð3À9A t4…Òt0÷A€t‹A PjVRÿë‹I QjVRÿ4! ƒÄ…Àt‹Æ^ÃÌÌÌÌS‹\$V‹t$WVSÿËFPè/ÃÇFÿÿÿÿ…ÿt)‹G…Àt P蓚üÿƒÄ‹G…Àt P胚üÿƒÄWèzšüÿƒÄÇF ÇFÇF _¸^ÃÌÌÌÌÌÌÌÌÌÌS‹\$V‹s W3ÿƒ>t èúÿÿ‹ø…ÿ~K‹t$…ötAjèÁ‹D$‹KjPVQèªÂjS‹øè*ÛÿÿƒÄ…ÿWè­øÿÿƒÄ…Àt j Sè.ÛÿÿƒÄ‹Ç_^[ÃÌÌÌÌÌS‹\$V‹s ƒ>t è­ùÿÿ…À~Gjè^‹D$‹L$‹SjPQRèOÂjS‹ðèÃÚÿÿƒÄ…öVèFøÿÿƒÄ…Àt j SèÇÚÿÿƒÄ‹Æ^[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸è†Â¡Àç3ĉD$‹D$S‹\$UV‹s HW‹|$4½ƒøz‡ø¶€ìÿ$…¸Ç‹ó3íè þÿÿ_^‰k‹Å][‹L$3ÌèSƒÄÃ>„¼èÖøÿÿ_^‹è][‹L$3Ìè0ƒÄÃ…ÿ„š‹D$0…Àu‹N‰ë#ƒøu‹V‰ëƒøuƒÆ‰7ë ƒøu·F‰ƒ{ …^Ç„‡ _^‹Å][‹L$3ÌèÑÁƒÄÃ…ÿ„;‹D$0‰k …Àu1‹F…Àt Pèb˜üÿƒÄWè ØÿÿƒÄ_‰F^‹Å][‹L$3ÌèÁƒÄÃøu1‹F…Àt Pè,˜üÿƒÄWèÓ×ÿÿƒÄ_‰F^‹Å][‹L$3ÌèWÁƒÄÃøua¶O¶W¶GQ¶RPQh\1 T$$jRèÏ‹FƒÄ…Àt PèÏ—üÿƒÄD$Pèr×ÿÿƒÄ‰F‹_‰N^‹Å][‹L$3ÌèñÀƒÄÃø…Z‹RhX1 D$j Pèu‹FƒÄ…Àt Pèu—üÿƒÄL$Qè×ÿÿƒÄ‰Ff‹_f‰V^‹Å][‹L$3Ìè•ÀƒÄËD$0_‰F ^‹Å][‹L$3ÌèyÀƒÄÃ{ t!…ÿt‹K‰‹k_^‹Å][‹L$3ÌèRÀƒÄÃ_ƒÍÿ^‹Å][‹L$3Ìè:ÀƒÄËk_^‹Å][‹L$3Ìè"ÀƒÄËT$0_^‹Å]‰S[‹L$3ÌèÀƒÄËF…ÀtPjjdWèEÛÿÿƒÄ‹F…ÀtPjjdWè0ÛÿÿƒÄ‹F jPjfWèÛÿÿ‹N(QjWè£ÛÿÿƒÄ_^‹Å][‹L$3Ì調ƒÄËV(‰_^‹Å][‹L$3Ì迃ÄÃ3í‹L$ _^‹Å][3Ìèy¿ƒÄËÿµŠõŒ Ÿ¡)…^‹ÜŠšŒ¶ŒÿŠŸ   ÌÌÌÌÌÌÌÌ̃|$¸t3ÀËL$‹Q ‹L$ ‰J(ÃÌÌ‹T$‹ÂVp›Š@„Éuù+ÆP‹D$ RPèKûÿÿƒÄ ^ÃÌÌÌÌÌÌVhèõÜÿÿ‹ðƒÄ…öt#‹D$PjjdVèÙÿÿƒÄ…Àt‹Æ^ÃVè|ÕÿÿƒÄ3À^ÃÌÌÌÌ̸(ÃÌÌÌÌÌÌÌÌÌÌ‹D$3ÉÇ@ ‰H ‰HAÃÌÌÌÌÌÌÌÌÌ3À9D$•ÀÃÌÌÌÌÌÌ‹L$…Éu3ÀÃV‹t$‹F$…Àu^ËT$WRQPèêÕÿÿjV‹øèÕÿÿVèºÛÿÿƒÄ‹Ç_^ÃÌÌ‹T$…Òt7‹L$ …É~/V‹t$‹F$…Àu^ÃWQRPèiÖÿÿjV‹øèOÕÿÿVèyÛÿÿƒÄ‹Ç_^Ã3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$‹F$…Àu^ËL$ Wƒù tKƒùet‹T$R‹T$RQPè‚ØÿÿƒÄ‹ø_^ÃjVèòÔÿÿ‹D$ ‹L$‹V$PQjeRè]ØÿÿV‹øèÛÿÿƒÄ‹Ç_^Ã3ÿ‹Ç_^ÃÌÌÌÌÌ̸PÃÌÌÌÌÌÌÌÌÌÌVWjah|1 j èБüÿ‹ð3ÿƒÄ ;÷t$jch|1 hè´‘üÿƒÄ ‰F;ÇuVèT“üÿƒÄ_3À^Ãjeh|1 hè‹‘üÿƒÄ ‰F;Çu‹FPè(“üÿVè"“üÿƒÄ_3À^ËD$ ‰~ ‰~‰~‰~ÇÇF‰x‰p _Ç@ ¸^ÃÌÌÌÌÌÌÌÌV‹t$…öu3À^ÃW‹~ ‹G…Àt PèÂ’üÿƒÄ‹…ÿt Wè²’üÿƒÄ‹F P覒üÿƒÄ_ÇF ÇF ÇF¸^ÃÌÌÌÌÌ̸è–»ƒ|$ u3ÀYÃU‹l$ V‹u …ö„ýƒ}$„óSjUÇD$è_Óÿÿ‹\$$ƒÄW¤$‹~ …ÿt3;û~‹û‹FF‹L$WPQè³»~)~ |$ƒÄ ;ß„•+ß|$‹;Ø2‹VP‹E$RPèRÓÿÿ‹øƒÄ …ÿUè#ÙÿÿƒÄ…ÿ|UtcÇF‰~ 뎋L$‹U$SQRèÓÿÿ‹ðƒÄ …öUèðØÿÿƒÄ…ö|t0t$;Þt(t$+ÞëÉ‹D$…À‹Æ_[^]YËD$…Àò‹Ç_[^]YËD$_[^]YÃ^3À]YÃÌÌÌÌÌÌ̸èfºƒ|$ SÇD$„I‹\$…ÛŽ=U‹l$V‹u …ö„%ƒ}$„WjUè"Òÿÿ‹~+~ƒÄ+~;û¿‹F…Àtc…ÿ~#‹L$‹VWQÐRètº|$(|$ƒÄ +ß~‹ÿ‹N‹FN‹U$PQRèÜÒÿÿ‹øƒÄ …ÿUèí×ÿÿƒÄ…ÿŒˆ„’~)~uÄ;^ÇF|8‹D$‹M$SPQè™Òÿÿ‹øƒÄ …ÿUèª×ÿÿƒÄ…ÿ|ItW|$|$+ßtK;^}È‹~+~+~;ûŒAÿÿÿ‹F‹T$FSRP迹‹L$ƒÄ ^_^][YËD$…Àò‹Ç_^][YËD$_^][YÃ^]3À[YÃ3À[YÃÌÌÌÌSU‹l$VW‹|$‹w Eÿ»ƒøy‡=¶€´—ÿ$…ˆ—3À‰F‰F ‰F‰F‹$;øé‹^_^]‹Ã[ËF‹N3Û;F ‹v €< uC@;Æ|ô_^]‹Ã[Ë^…Û…ü‹$…ÿ„b‹D$ ‹L$PQUWèâÓÿÿƒÄ_^]‹Ø[Ë^ …Û…Ë‹$…ÿ„1‹T$ ‹D$RPUWè±ÓÿÿƒÄ_^]‹Ø[Ë|$;>~0hAh|1 Wè?üÿ‹ØƒÄ …Û„Ù‹F…Àt PèÕŽüÿƒÄ‰^‹L$ ‹VWQRÇF‰~ èX¸ƒÄ _^»]‹Ã[ËD$ …Àtƒ8u ‹F‹l$‰D$ë‹L$‹.‰L$ë‹l$‰l$ý‹V‹~‰T$~!;.t‹D$hch|1 P蟌üÿ‹øƒÄ …ÿt=‹D$=~Q;FtL‹L$hhh|1 QèrŒüÿƒÄ ‰D$…Àu-;~t Wè ŽüÿƒÄhµh|1 jAjrj è4dƒÄ_^]3À[ËF;ÇtPèÝüÿƒÄ3À‰~‰F‰F ‰.‹F;D$„^Pèºüÿ‹T$ƒÄ3À‰F‰F‹D$_‰F‰V^]‹Ã[Ã$t£jWè¬Îÿÿ‹L$(‹T$$‹G$QRUPèÒÿÿW‹ØèÀÔÿÿƒÄ_^]‹Ã[ËG$…À„jÿÿÿƒ~‹L$ ‹T$QRUPèäÑÿÿƒÄ_^]‹Ø[ÃjWèRÎÿÿ‹FƒÄ;F~H¤$‹F‹N‹V+ÈQЋG$RPè8ÏÿÿW‹ØèPÔÿÿƒÄ…ÛŽ“^jWè Îÿÿ‹NƒÄ;N¿‹T$ 3À‰F‰F‹D$‹O$RPUQècÑÿÿƒÄ_^]‹Ø[Ë‹|$ jRjuWèèÔÿÿƒÄ…Àt‹FjPjuWèÓÔÿÿƒÄ…Àu*_^3Û]‹Ã[Ë$…ÿ„‡þÿÿ‹L$ ‹T$QRUWèÑÿÿ‹ØƒÄ_^]‹Ã[ÃI.”F”¨”z–'—w”F–P”9•Ù”]—     Ì̸èÆ´‹D$S‹\$UV‹p WjPÇD$Kè¦Ìÿÿ‹l$$ƒÄ‹V ‹N…Ò~LN3ÿ3À…Ò~;Ã}ŠˆUE€< t@;F |éë¿@D$)F F+Ø…ÿu…Ûu¸ÆE‹D$_^][YË‹T$P‹B$QPèˆÌÿÿ‹øƒÄ …ÿ‹L$QèUÒÿÿƒÄÆE…ÿ|tʼn~ ÇFéjÿÿÿ‹D$…À²‹Ç_^][YÃÌÌÌÌÌÌÌÌÌ‹T$‹ÂVp›Š@„Éuù+ÆP‹D$ RPè[ùÿÿƒÄ ^ÃÌÌÌÌÌÌU‹l$…ÿtq‹E;rjƒ?u>ƒ>uÇ‹håh¨1 Q辈üÿ‰‹MƒÄ …Év ‹QRPèú³ƒÄ Çë ‹híh¨1 P‹Pè‰üÿƒÄ‰‹M;s–‹E;s‹ ŠT$ …ÉtˆÿE]ˈÿE]ÃÌÌ̃|$ S‹\$U‹l$VW‹ñ‹úÇD$$uÇD$À1 ‹L$3À8t@€<uù+èy3íöD$ t÷Ý…í~'ëI‹D$$;D$(}‹L$j QèúþÿÿÿD$,MƒÄ…íÞ‹T$Š„Àt2d$‹L$(9L$$}$‹T$¾ÀPRèÈþÿÿ‹D$$ÿD$,@‰D$$ŠƒÄ„ÀuÒ…í}"‹D$(9D$$}‹L$j Qè˜þÿÿÿD$,EƒÄ…í|Þ_^][ÃÌÌÌÌÌÌ̸@è6²¡Àç3ĉD$<‹D$DSU3í9l$dVW‹|$X‰D$ ‰L$‰T$(‰l$,ÇD$$ß1 ‰l$}‰l$lŠT$p‹t$`‹D$\‹ÎöÂ@u8…ö|…Às÷Øõ÷ÞÇD$,-‹ÎëöÂt ÇD$,+ë öÂtÇD$, öÂt ‹t$dƒþu ÇD$$ v ë ƒþuÇD$$Ü1 ö tÇD$ë¤$ƒ|$¾P" u¾È1 3ÒR‹T$hRQPèೊ 1ˆL,0‹Ê‹ÐE щ\$tƒý|ǃýu½‹D$l‹È+Í;ÅÆD,0‰L$‹Ø}‹Ý‹D$$PŠ@„Éuù‹t$,‹L$h+Â3Ò…ö•Â+Ê+È+Ë3Ò9T$‰L$}‰T$;Ê}‰T$‹ÊŠD$p¨t9L$}‰L$‰T$‹Ê¨t÷Ù‰L$;Ê~*‹D$‹t$(‹\$ j PèÛüÿÿ‹D$HƒÄ‰D$…ÀÜ‹t$,‹È…öt‹L$‹\$ V‹t$,Qè®üÿÿ‹L$ƒÄ‹T$$Š„Àt,‹L$‹t$(‹\$ ¾ÀPQè‡üÿÿ‹D$,@‰D$,ŠƒÄ„ÀuØ‹L$ƒ|$~2ë¤$‹T$‹t$(‹\$ j0RèLüÿÿ‹D$HƒÄ‰D$…ÀÜ‹L$…í~(d$¾D,/‹L$‹t$(‹\$ MPQèüÿÿƒÄ…íà‹L$…É}$÷Ù‹éd$‹T$‹t$(‹\$ j RèìûÿÿƒÄƒíuä‹L$L_^][3ÌèÀ¯ƒÄ@Ã̸D膯¡Àç3ĉD$@‹D$HSUV‹t$X‰D$3À9D$hW‹Ù‹ú‰D$ ‰D$‰D$}ÇD$lÝD$`ÙÀÙîØÚßàöÄAuÝØÇD$ -Ùàë ŠD$pÝÙ¨t ÇD$ +ë ¨tÇD$ ÙÀèå°‹è‹D$lƒø ‰l$$~ ÇD$l ‹D$lÙèÙÀݘ1 …ÀtƒèÜÉuùÙÁè®°‰D$ÛD$ÞêÝ 1 ØÒßàÝÚöÄAzÿD$‹D$l…ÀtƒèÜÊuùÝØÛD$$ÞëÙÊÞÉÙÀèm°‹È‰L$$Úd$$ÞÙßàöÄuA‹D$;È|E+ȸgfff÷íÁú‹ÂÁè€Ò+ꊕÈ1 ‹l$ˆT,(‹ÕB‹è‰T$…ítƒú|ȃúu ÇD$‹T$ÆD(‹l$¸gfff÷éÁú‹ÂÁè€Ò+ÊŠ‰È1 ˆL,ÿ$…l¦€û%u ÇD$$ë!¾Ã‹\$8PD$P‹ñ‹úèøÿÿ‹t$‹|$TƒÄŠG‰|$Lƒ|$$uš‹L$@‹T$<‹‹t$HH;D$À÷؉t‹H‰D$‹\$8D$jP‹ñ‹úè±÷ÿÿ‹L$ ‹T$LƒÄ_^I]‰ [ƒÄ$þÃÀàƒøwO¶ˆ ¦ÿ$ˆ¦ƒL$ŠGé$ÿÿÿƒL$ŠGéÿÿÿƒL$ŠGé ÿÿÿƒL$ŠGéýþÿÿƒL$ŠGéðþÿÿÇD$$éçþÿÿ¶ÓRÿ! ƒÄ…Àt‹D$(¾ËŠ€TAЉT$(Gé¸þÿÿ€û*uŠ‹EƒÅƒÆG‰t$‰D$(‰|$LÇD$$é’þÿÿ€û.uhŠÇD$$Géyþÿÿ¶ËQÿ! ƒÄ…Àt*‹D$…À} ÇD$‹D$€¾ÃŠLPЉL$Gé>þÿÿ€û*uŠ‹UƒÅƒÆG‰t$‰T$‰|$LÇD$$éþÿÿ¾ÃƒÀ´ƒø%‡”¶€È¦ÿ$…´¦ŠGÇD$ ‰|$LÇD$$éßýÿÿ€?luŠ_GGÇD$ ‰|$LÇD$$é¼ýÿÿŠGÇD$ ‰|$LÇD$$é ýÿÿŠGÇD$ ‰|$LÇD$$é„ýÿÿŠGÇD$ ‰|$LÇD$$éhýÿÿ¾Ã‰D$$ƒÀÛƒøS‡Ä¶€ §ÿ$…ð¦‹D$ ƒèt'ƒètƒèt ‹EƒÆƒÅë‹^ ‹FƒÆƒÅ‰\$0ë¿EƒÆƒÅ™‰T$0‹T$<‹\$S‹\$ S‹\$0S‹\$·øu:hãh`2 jèžoüÿƒÄ …Àu håh`2 jAjej èrGƒÄ_[^‹Å]YÉ·ÏQ¶ÓR‹ÃÁè¶È‹ÓQ‹Áê¶ÂPÁëShx2 jQèèõÿÿƒÄ _[^‹Å]YÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$jD$ PjjQèy™÷ØÀ@ÃÌÌÌÌÌ‹T$‹D$VL$ Qh~f€R‰D$è“™‹ð…ö}hh`2 è™PjjèÄFƒÄ3À…ö”À^ÃÌÌÌÌÌÌÌÌSU‹l$ V‹t$WV‹Í»èwýÿÿ‹øƒÄ…ÿ}jyh`2 jljjj è|FƒÄé½èoüÿÿƒø…¿…ÿ~_^]‹Ã[Ãh‡h`2 jj è¨aüÿƒÄUèט…ÀuhŒh`2 jfjjj è&FƒÄëPfƒxth“h`2 jkjjj èFƒÄë/‹H ‹¶ ˆ‹P ‹ ŠQˆV‹H ‹¶JˆN‹P ‹¶HˆN3Ûhœh`2 jj èaüÿƒÄ…ÛtUh81 jèªGƒÄ _^]3À[Ã_^]¸[ÃÌÌÌÌÌ̸8èf˜¡Àç3ĉD$4SV‹t$D‰t$ÇD$ƒËÿèaûÿÿƒøt^ Ã[‹L$43ÌèX˜ƒÄ8ÃUVè²®ÿÿ‹èƒÄ‰l$…íu]^ƒÈÿ[‹L$43Ìè/˜ƒÄ8ÃW3Ò‹ý‰|$ 8Ut%‹ÿŠ€ù:uPÆë€ù/t@€8uæëÆ…ÒuÇD$ 2 ‹|$ ‹ÕD$PRèô÷ÿÿƒÄ…À„É‹T$3À¹‰D$$R‰D$,‰D$0‰D$4f‰L$(è#—f‰D$&¹2 ‹Ç¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu‰D$(ëCD$PWè¦ýÿÿƒÄ…À„K‹D$¶ÈÁá¶Ô¶D$ ʶT$Áá ÈÁá ÊQ蜖‰D$(jjj臖‹Øƒûÿ„‹t$Pë‹ÿ‹|$ ƒþu"jD$PjhÿÿSÇD$$èI–‰D$3öjL$(QSè–ƒøÿ…aè –‹èƒþ… ý@'…ý‹T$$‹D$(‹L$,‰T$4‹T$0‰D$8‰L$<‰T$@¹2 ‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuhèÕ‰D$8jjj讕‹ðƒþÿ„‰jD$8PV芕V‹øè^•ƒÿÿuoS¾èN•jjVèt•‹l$‹Ø;ß…òþÿÿ‹t$h‚h`2 è/•PjjèÕBh,2 Vhˆ2 jèÃDh„h`2 jvjij è®BƒÄ8é¦h­h`2 Ujjè’B‹L$,h,2 Qhˆ2 jè|Dh¯h`2 jujij ègB‹l$TƒÄ8ë^jS蕃øÿuIh´h`2 è’”Pjjè8B‹T$,h,2 Rhˆ2 jè"Dh¶h`2 jwjij è BƒÄ8ëÇD$UèºküÿƒÄƒ|$_uƒûÿt Sè(”ƒËÿ‹L$@]^‹Ã[3ÌèÜ”ƒÄ8ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸xÃÌÌÌÌÌÌÌÌÌÌV‹t$…öt9‹F…Àt PèZküÿƒÄ‹F…Àt PèJküÿƒÄ‹F…Àt PèÊ«ÿÿƒÄVè1küÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌV‹w ‹FƒøÿtjPè–“‹FP臓ÇFÿÿÿÿÇGÿÿÿÿ^ÃÌÌÌV‹t$…öu3À^Ã~W‹~ tE‹GƒøÿtjPèS“‹GPèD“ÇGÿÿÿÿÇFÿÿÿÿWè<ÿÿÿƒÄÇF ÇFÇF _¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌU‹l$Wë¤$‹ƒè„)ƒètƒèu9E$…”ÇëÚƒ}$t ÇëÌ_3À]ÃSjUèN«ÿÿFÇE‹NPQèú÷ÿÿ‹ØƒÄƒûþuj UèH«ÿÿƒÄÇEƒÈÿ[_]Ã…Û|øjSè«Æÿÿ‹øƒÄ…ÿ„Uè¤PWè!«ÿÿUè;PWè$«ÿÿƒÄƒ~t)jSèóøÿÿƒÄ…Àuhh¤2 jijdj è×?ƒÄë4‹F…ÀtPè5²ÿÿ‹ØƒÄ…ÛtWSèu¯ÿÿƒÄ…Àt‹ûWUèe¯ÿÿƒÄ…Àu…ÿt Wèä©ÿÿƒÄ[_3À]Ã[_Ǹ]ËF…ÀuhÔh¤2 jojdj è`?ƒÄ_ƒÈÿ]ËVRPè½ùÿÿ‹øƒÄƒÿÿtæƒ~ t3jWè5øÿÿƒÄ…Àu$Wèl‘hàh¤2 jjjdj è?ƒÄ_ƒÈÿ]É~‰}Ç_¸]ÃÌÌÌÌÌÌVW‹|$ jWè©ÿÿ‹w ƒÄƒ$u›Wè þÿÿƒÄ…À~&ƒ$tí‹D$‹L$‹W$PQRèÚ©ÿÿW‹ð貯ÿÿƒÄ‹Æ_^ÃÌÌÌÌÌÌÌÌÌÌVW‹|$ jWèb©ÿÿ‹w ƒÄƒ$u›WèªýÿÿƒÄ…À~&ƒ$tí‹D$‹L$‹W$PQRè:ªÿÿW‹ðèR¯ÿÿƒÄ‹Æ_^ÃÌÌÌÌÌÌÌÌÌÌ‹D$SUVW‹|$‹w H¹‹Ù=ƒ‡A¶€”½ÿ$…\½3Û‰è—üÿÿ‰__^]‹Ã[ÃWè'ýÿÿƒÄ_^]‹Ø[Ël$ …í„‹D$…Àu&‰O ‹F…Àt PèygüÿƒÄUè §ÿÿƒÄ_‰F^]‹Ã[Ã;Áu _‰N ^]‹Ã[Ãø…Á‹F…Àt PèϧÿÿƒÄ_‰n^]‹Ã[ËL$_‰N^]‹Ã[ËT$ ‰O ‹‰G‰F‹D$ljG‰O _^]‹Ã[à t‹D$ …Àt‹N‰‹^_^]‹Ã[Ã_^ƒËÿ]‹Ã[à tð‹D$ …Àtè‹V_^‰]‹Ã[Ë__^]‹Ã[ËD$‰G_^]‹Ã[ËL$_‰N^]‹Ã[Ë^_^]‹Ã[Ã3Û_^]‹Ã[à ¼#½-½S½U½3¼®¼¼¼â¼C¼ ½;½I½S½    ÌÌÌÌÌÌÌÌ‹T$‹ÂVp›Š@„Éuù+ÆP‹D$ RPèKýÿÿƒÄ ^ÃÌÌÌÌÌÌVhxèe­ÿÿ‹ðƒÄ…öt#‹D$PjjvVè ªÿÿƒÄ…Àt‹Æ^ÃVèì¥ÿÿƒÄ3À^ÃÌÌÌÌÌV‹t$h”h¤2 j ÇF ÇFÿÿÿÿÇFèucüÿƒÄ …Àt43ɉ‰H‰H ‰H‰H‰HÇ@ÿÿÿÿ‰H‰F ÇÇF¸^Ã3À^ÃÌÌÌÌÌ̸ ÃÌÌÌÌÌÌÌÌÌÌjjhØ2 jècüÿƒÄ …ÀuËL$ÇÿÿÿÿÇ@ÿÿÿÿ‰A ¸‰A ÇAÃÌÌÌÌÌÌV‹t$…öu3À^ËF …Àt PèvdüÿƒÄÇF ÇF ÇF¸^ÃÌÌÌÌÌÌÌV‹t$ …öu3À^ÃW‹|$ ƒ$u_3À^ÃjWèK¥ÿÿD$jPèï.¶D$ ‹L$$ƒàƒÄ;È~‹È…Àuj WƒÎÿè;¥ÿÿƒÄ_‹Æ^ÃQ‹O$VQèX¥ÿÿ‹ðƒÄ …ö} Wè)«ÿÿƒÄ_‹Æ^ÃÌUW‹|$…ÿ„™‹l$…íŽV‹t$ƒ~$u^_3À]ÃS‹^ jV蹤ÿÿ‹CƒÄ…À~ ÇCëD$jPèJ.¶D$ ƒÄƒà;è~‹è…Àuj VƒÏÿ蚤ÿÿƒÄ[^‹Ç_]ËN$UWQèu¥ÿÿ‹øƒÄ …ÿ} V膪ÿÿƒÄ‰k[^‹Ç_]Ã_3À]ÃÌÌÌÌ‹D$‹@$…ÀuÉD$é;¨ÿÿÌÌÌÌÌÌÌÌÌÌÌ‹D$‹@$…ÀuÉD$鋦ÿÿÌÌÌÌÌÌÌÌÌÌÌ‹D$‹@$…ÀuÉD$黥ÿÿÌÌÌÌÌÌÌÌÌÌ̸ÈÃÌÌÌÌÌÌÌÌÌÌh•hü2 jèï`üÿƒÄ …ÀuËL$ÇÇ@DÇ@‰A ¸ÃÌÌÌÌÌÌS‹\$W‹|$ jW‰\$èz£ÿÿƒÄƒ u_3À[ËG ‹U‹l$V‹q ÇF…í„£…Û„›‹F…Àu19F…‹j WèO£ÿÿ‹FƒÄ;Øw ‰^^]_ƒÈÿ[ÉF^]_ƒÈÿ[Ã;Ãs‰D$‹\$I‹N ‹F;Ðw‹ûë+Á‹ø‹FWÁPUè`‹ƒÄ )~t~ ‹F ;FuÇF ïëÇF +ßuµ‹D$^]_[Ã^]_3À[ÃÌÌÌÌ̸è–ŠV‹ñjVè‹¢ÿÿƒÄƒ~ u3À^YËF ‹‹I ‹AÇA…ÀujT$ RVèÊþÿÿƒÄ ^YËq ‹QS;Ó[s+Ö‹Â…ÿt‹IΉ^YÃÌÌÌV‹ñþÿÿÿv¾ÿÿÿ‹Ëèyÿÿÿ;ð~‹ð3Ò;ò~‹C ‹‹A )pt p ‹H ;Hu‰P ‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$UV‹t$jV‰\$ èÉ¡ÿÿƒÄƒ~ „°‹l$…턤…Û„œW‹~ ƒÇGt hthü2 j|jqj è¢6ƒÄ_^]ƒÈÿ[ËO‹G;Èuj Vè…¡ÿÿƒÄ_^]ƒÈÿ[Ã+Á;Øv‰D$‹\$‹G G‹w;Ær+Æ ;Îw‹óë+ð‹WVÐUR襉w+ÞƒÄ î…ÛuÉ‹D$_^][Ã^]3À[ÃÌÌÌÌÌÌU‹l$jSèó ÿÿƒÄƒ{ u3À]ÃV‹s ƒ~ÇFthÂhü2 j|jzj èà5ƒÄ^ƒÈÿ]ËVW‹~;úuj SèÄ ÿÿƒÄ_^ƒÈÿ]ËN ‹ÂÏ+Ç;Êr+Ê<;úv+ы…ít‹VщU_^]ÃSV‹ñ‹Úþÿÿÿv¾ÿÿÿ‹D$ PèSÿÿÿƒÄ;ð~‹ð…ö~‹C p‹Æ^[ÃÌÌÌÌÌÌÌÌÌÌÌ‹T$‹ÂVp›Š@„Éuù+ÆP‹D$ RPè+þÿÿƒÄ ^ÃÌÌÌÌÌÌ‹D$SU‹l$V‹p 3ÛW‹} 9…º9…²9^uB‹NhÒhü2 Qèô\üÿƒÄ ‰F;ÃuhÕhü2 jAjyj èÅ4ƒÄ_^]3À[É^‰^ 9_uB‹WhÞhü2 Rè­\üÿƒÄ ‰G;Ãuháhü2 jAjyj è~4ƒÄ_^]3À[É_‰_ ‹L$‰.‰^‰^‰_‰_‰_¸^‰A ‰E ][ÃhÌhü2 j{jyj è54ƒÄ_^]3À[ÃÌÌÌÌÌÌÌÌÌÌÌ‹G V3ö;Æt‹;Öt‹J ‰1‰r ‰q‰q ‰0‰w ‰p‰p ^ÃÌÌÌÌÌSVWhÈ3ö3Ûè¥ÿÿ‹øƒÄ…ÿ„’hÈèh¥ÿÿ‹ðƒÄ…öte‹D$…ÀtSPhˆWè ¢ÿÿƒÄ…ÀtI‹D$…ÀtjPhˆVèí¡ÿÿƒÄ…Àt,VjhŠWèØ¡ÿÿƒÄ…Àt‹D$‹L$‰8_»‰1^‹Ã[ÃWè¤ÿÿƒÄ3ÿ…öt Vè•ÿÿƒÄ3ö‹D$‹L$‰8_‰1^‹Ã[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$jjhŒPèm¡ÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$jjhPèM¡ÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$jjh“Pè-¡ÿÿƒÄ÷ØÀ÷ØÃÌÌÌ‹D$ƒx uhbhü2 jxj|j è¡2ƒÄ¸þÿÿÿËL$QjhPèæ ÿÿƒÄ=ÿÿÿ~¸ÿÿÿÃÌÌÌÌÌÌV‹t$ƒ~ uhshü2 jxj{j èP2ƒÄ¸þÿÿÿ^ËD$ ‹L$PQhVè‘ ÿÿƒÄ…À~F0^ÃÌÌÌÌÌ‹D$ƒx uhƒhü2 jxjzj è2ƒÄ¸þÿÿÿËL$Qjh‘PèF ÿÿƒÄ=ÿÿÿ~¸ÿÿÿÃÌÌÌÌÌÌV‹t$ƒ~ uh”hü2 jxj}j è°1ƒÄ¸þÿÿÿ^ËD$ ‹L$PQh’VèñŸÿÿƒÄ…À~F4^ÃÌÌÌÌÌW‹|$3Ò;úu3À_ÃV‹w 9t#;òt‹;Êt‹A ‰‰Q ‰P‰P ‰‰W ‰V‰V ‹F;Ât PèùZüÿƒÄVèðZüÿƒÄ^¸_ÃÌÌÌÌÌ‹D$S‹\$V‹s HW=’w+¶€8Ëÿ$…äʃ>thhü2 j{jgj èâ0ƒÄ_^3À[Ë|$…ÿuh hü2 j}jgj è¼0ƒÄ_^3À[Ã9~t‹F…ÀtPèaZüÿƒÄÇF‰~_^¸[ËF_^[ËL$QSèYûÿÿƒÄ÷Ø_À^÷Ø[ËûèEüÿÿ_^¸[Ã>„tÿÿÿƒ~…jÿÿÿ‹F+F_^[ËF_^[Ã_ÇF^¸[ø_‰F^[Ë|$‹ËèQøÿÿ_^[ËL$‹|$è°øÿÿ_^[ËT$RèÒùÿÿƒÄ_^[ËD$‹L$P‹ÓèKúÿÿƒÄ_^[Ã~„ëþÿÿ_ÇFÇF ^3À[ËC_^[ËL$_^‰K¸[Ë6…ö„¶þÿÿ‹V ‹B_^[Ã~„¢þÿÿ‹F_^[ËD$‹V‹H _^‰Q¸[ËD$…Àt‹@ ƒx…pþÿÿƒx„fþÿÿ_^¸[ÃLʼÊjÊqÊʌɦʕÊ$ɕɜɴÉÄÉáÉøÉÊÊ$Ê5ÊèÉAÉ ÌÌÌÌ̸ðÃÌÌÌÌÌÌÌÌÌÌVhðèÕŸÿÿ‹ðƒÄ…öu^ËD$‹L$ PQjhVè ÿÿƒÄ‹Æ^ÃÌV‹t$h‚h$3 jÇF ÇFèüUüÿƒÄ …Àu^Ã3ɉ‰H‰H‰H ‰H‰H‰H‰F ‰NA^ÃÌÌ…öu3ÀÃ~t(ƒ~ t‹FjPèì‹NQèÝÇF ÇF¸ÃÌÌÌÌÌSVW‹|$‹_ jè˃{‹D$‹L$‹Wt jPQRè¶ë jSjPQRè€jW‹ðè˜ÿÿƒÄ…ö VèžµÿÿƒÄ…Àtj Wè˜ÿÿƒÄèg‰C_‹Æ^[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èÖ‹D$SUV‹t$3íHW‹~ »‰l$‰l$=„‡?¶€äÏÿ$… Ïèùþÿÿ‹L$(‹‹D$$_‰F‰^ ‰V^]‹Ã[ƒÄÃ9n „;‹D$(;Åt‹N‰‹^_^]‹Ã[ƒÄË^_^]‹Ã[ƒÄËT$$_‰V^]‹Ã[ƒÄËD$(‹‰‹P‰W‹H‰O‹P ‰W _^]‹Ã[ƒÄËVD$PL$QjURÇD$(è«~…ÀŒ„‹D$;ÅŒx‰G‹\$_^]‹Ã[ƒÄËG_^][ƒÄË\$$‰__^]‹Ã[ƒÄËD$(;Åt‰_éqÿÿÿ‰o3À‰‰G‰G‰G _^]‹Ã[ƒÄËL$(‹Q¸ÓMb÷êÁú‹ÂÁèÂjT$ Rh‹ iÉèÁ‰D$(‹FhÿÿPèÜ}…ÀÛhL3 ÿ\! ƒÄ_^ƒËÿ]‹Ã[ƒÄÃL$QT$$Rh‹FhÿÿPÇD$0è¸}…À}h@3 뺋L$ ¸ÓMb÷éÁú‹ÂÁè‹T$(‰iÀè+ÈiÉè_^»]‹Ã‰J[ƒÄËL$(‹Q¸ÓMb÷êÁú‹ÂÁèÂjT$ Rhé-ÿÿÿL$QT$$RhégÿÿÿL'u ‰o_^]‹Ã[ƒÄÃ3Û_^]‹Ã[ƒÄÓϧʹ͕ÏÅÍHÎrÎÕÎ@ÏiÏ}ÏéÍ,Î7ÎbÍ„Í“Ï  ÌÌÌÌÌÌÌ‹T$‹ÂVp›Š@„Éuù+ÆP‹D$ RPè üÿÿƒÄ ^ÃÌÌÌÌÌÌV‹t$…öu3À^Ã~t(ƒ~ t‹FjPè¦{‹NQè—{ÇF ÇF‹v …öt VèøRüÿƒÄ¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èö{¡Àç3ĉD$SV‹t$$‹^ W‹|$,3ÀÇD$ …ÿ„”PèA{‹D$ PL$jQè<|‹L$<ƒÄ T$ R‹VD$PjQWRèŠ{ƒ{‹øu…ÿ~D$PjjVèû–ÿÿƒÄjVèp“ÿÿƒÄ…ÿ0tƒÿÿu)èÍzƒøt ƒø t=3'uj Vèd“ÿÿƒÄè¬z‰C‹Ç‹L$ _^[3ÌèT{ƒÄÃÌÌÌÌÌ‹L$‹A‹T$‰Q;ÂtÇAÃÌÌÌÌÌÌVWj}h€3 jè Püÿ‹ð3ÿƒÄ ;÷t!jh€3 jèPüÿƒÄ ‰F;ÇuVè§QüÿƒÄ_3À^É8‹N‰y‹V‹L$ ‰z‹F‰x ‰>‰~_‰NÇF ‹Æ^ÃÌÌÌV‹t$…öu3À^Ë‹F A;Á-h–Å‹Fh€3 RPèPüÿƒÄ…ÀtЋN ɉF‰N ‹S‹\$;Ø}=…Û|9;ËVWz| ‡+Ã+×@‹< ‰9ƒéƒèuó‹V‹D$‰šÿ‹_[ÇF^ËN‹T$‰ÿ‹[ÇF^ÃÌÌÌÌÌÌÌÌÌÌÌÌW‹|$…ÿt4‹L$ …É|,‹;Ê}&‹G‹ˆVrÿ;Î}S‹W‹\ŠŠA;Ή|ï[ÿ^_Ã3À_ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‹T$QRPèîþÿÿƒÄ ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹L$jPQèÏþÿÿƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌ‹T$…Òt4‹…À~.‹JVpÿW‹9…öt3À…ö~S‹J‹\ @;Ɖ|ï[ÿ ‹Ç_^Ã3ÀÃÌ‹L$…Éu3ÀË…À~÷HPQèÿÿÿƒÄÃÌÌÌV‹t$…öt‹…À~‹NÀÀPjQèYyƒÄ Ç^ÃÌÌÌÌÌÌV‹t$…öt‹F…Àt PèŠOüÿƒÄVèOüÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$…ÀuƒÈÿËÃÌ‹L$…Ét‹D$…À| ;}‹I‹Ã3ÀÃÌÌ‹D$…Àt‹L$…É|;} ‹P‹D$ ‰ŠÃ3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$…öt#ƒ~u‹F‹‹VPjQRÿ`! ƒÄÇF^ÃÌÌ‹D$…Àu¸Ë@ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌVW‹|$ ‹GPèÑüÿÿ‹ðƒÄ…öt8‹O ‹VjcÉh€3 ÉQRè`MüÿƒÄ…Àu‹F…Àt Pè|NüÿƒÄVèsNüÿƒÄ_3À^ÉF‹‰‹‹OÒÒRQPèõw‹W‰V‹G ‰F ‹OƒÄ _‰N‹Æ^ÃÌÌÌÌÌÌÌÌÌjèIüÿÿƒÄÃÌÌÌÌÌ‹T$SV‹23ÀW…ö~‹z‹\$‹Ï9t@ƒÁ;Æ|ô_^3À[Ã…À|ö;Æ}ò‹<‡N;Æ}›‹J‹\ @;Ɖ|ïÿ ‹Ç_^[ÃÌÌÌÌÌÌÌ‹T$…öt‹F…Àu9~‹N9t]@ƒÁ;|ôƒÈÿÃ~u‹NP‹jPQÿ`! ‹T$ƒÄÇF…ÒtÔ‹T$‹F‹NRP‹jPQT$RèLƒÄ…Àt±+FÁøÃÌÌÌÌÌÌÌÌ‹D$V‹t$jPèoÿÿÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌ‹D$V‹t$jPèOÿÿÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌW‹|$…ÿt@V3ö97~S‹\$‹Gƒ<°°t‹QÿÓƒÄF;7|ç[‹G^…Àt PèÃLüÿƒÄWèºLüÿƒÄ_ÃÌÌÌÌÌS‹\$…ÛtBW3ÿ9{ v(V‹‹¸…ÀtëI‹pPè‡LüÿƒÄ‹Æ…öuîG;{ rÚ^‹ QèoLüÿSèiLüÿƒÄ_[ÃÌÌÌU‹l$W‹} ƒïx@V‹E‹¸…Àt.›‹p…Ût‹L$‹QRÿT$ ƒÄë ‹PÿT$ƒÄ‹Æ…öu؃ïyÃ^_]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌU‹l$W‹} ƒïx*S‹\$V‹E‹¸…Àt‹ÿ‹‹pQÿӃċƅöuïƒïyÞ^[_]ÃÌÌÌÌÌ‹D$ ‹L$‹T$SPQjR»èDÿÿÿƒÄ[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸è¦t‹NS‹^¸F F(C‰F‹ËU,ˆW<˜ÇE‹‹V‰T$ …Ét*‹A3Ò÷t$ ;Ót‹‹P‰‹E‰A‰Më‹?ƒÇ‹…ÉuÖ‹N;NrX‹^‹hVÛhÀ3 RPèÍIüÿ‹Ð3íƒÄ;Õu ÿF\_‰n][YËF;Ãs ‹Ë<‚+È3Àó«‹NÿF,‰N‰^‰‰n_][YÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹FF‹DüS‹Ç‹F…Àu:‹V‹hrÒhÀ3 ÒRPèJIüÿƒÄ…ÀuÿF\[ÃÑn‹NÿF4ÑnI‰N‰ëH‰F‹N‹ÿN ÿF0‹Š Š…Àu‰[Ãxt¤$‹@ƒxu÷‰X[ÃÌÌ‹D$‹NSUWPÿÑ‹T$‹è¹N8‰*3Ò÷vƒÄ;Vs‹Å3Ò÷v‹F‰D$‹‹<…ÿt.NX9ouN<‹L$‹QRÿT$ƒÄ…Àt¹G‹8‹Ø…ÿuÒ_]‹Ã[ÃÌÌÌÌÌÌÌÌ‹T$V3ö…Òt<Š„Àt6W¿¾À Ç‹ÈÁé3ȃáÇÓÆ‹È¯ÈŠBB3ñ„ÀuÚ‹ÆÁè_3Æ^Ã3À^ÃÌÌÌÌÌ‹D$…Àt‹@$Ã3ÀÃÌVWjwhÀ3 j`è€Güÿ‹ð3ÿƒÄ ;÷t jyhÀ3 j@ègGüÿƒÄ ‰;ÇuVèIüÿƒÄ_3À^Ã3À‹‰<ƒÀƒø@|ó‹D$;Çu¸&P ‰F‹D$ ;Çu¸@Ú‰F¸‰~‰~$‰~(‰~,‰~0‰~4‰~8‰~<‰~@‰~D‰~H‰~L‰~P‰~T‰~X‰~\‰F ‰F_ÇFÇFÇF ‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌSV‹t$ ‹F$Áà3Ò÷v WÇF\9Fwè½üÿÿ‹\$D$PSèþÿÿ‹ø‹ƒÄ…ÉuBhÁhÀ3 j èrFüÿƒÄ …ÀuÿF\_^[ËL$‰H‰Ç@‰¹N@_3ÀN$^[ˉÿFD_^[ÃÌÌÌÌÌÌ‹L$V‹t$D$PQÇF\è¥ýÿÿ‹ƒÄ…ÉuÿFL3À^ËQW‰‹9Qè§GüÿÿN$‹N ÿFH‹F$ƒÄƒùvÁà3Ò÷ñ9F rèÒüÿÿ‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$V‹t$D$PQÇF\è5ýÿÿ‹ƒÄ…ÀuÿFT^ËÿFP^ÃV‹t$‹F$W‹|$Ph°5 Wè÷Ëÿÿ‹N Qh”5 WèèËÿÿ‹VRhx5 WèÙËÿÿ‹F(PhX5 WèÊËÿÿ‹N,Qh85 Wè»Ëÿÿ‹V0Rh5 Wè¬Ëÿÿ‹F4ƒÄHPhø4 WèšËÿÿ‹N8QhØ4 Wè‹Ëÿÿ‹V¸ý÷ß÷é+ÑÁú ‹ÂÁèÂiÀÿȉ óÇóÿë'ÇD$‹\$éKÿÿÿ¡ó=ÿ} ;È~‰ ó¸gfff÷îÁú‹ÂÁè €ÉÉ‹Ö+Ñ3É…ÒŸÁÈ ó…Ûuhh`6 jj è'4üÿƒÄT$ RèÊSƒÄ…öŽþU‹îN¸ÍÌÌÌ÷æÁêB‰T$ƒý‹õ~¾jèÙ}PD$,PèžTjL$DQT$8RèUœ>üÿÿƒÄèîT$$…Û~!‹Æ+ÃPQRèùTSD$4hèîPèéTƒÄë VQRèÜTƒÄ ‹\$VD$(SPèÉTjL$,QT$8Rè¸TjD$PPL$DQè·T¹L$DÞƒÄ$3À‰\$…ö~ŠT40—èîùÿÿ|3ÿÁ;Æ|äƒí)L$…ÿÿÿ‹\$]D$ PèçTƒÄ_^…Ûuh.h`6 jj èë2üÿƒÄ3À›¶L(0ˆüò¶T)¶L*0ýò0ˆþò¶T+¶L,0ÿò0ˆóƒÀƒø|ÁÝX6 Ý óØÑßàÝÙöÄz ÜD$LÝ óëÝØ…Û[uh9h`6 jj èd2üÿƒÄ‹L$83ÌèjƒÄ<ÃÌÌÛD$¸èÂi‹D$‹L$ Ý$PQèüÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌ̸8è–i¡Àç3ĉD$4S‹\$@V‹t$HÇD$…ö^¸[‹L$43ÌèŽiƒÄ8ÃUD$WPèƒQNÿ¸gfff÷éÁú‹ÊhÁéh`6 D <€jj ÿè¥1üÿh‚h`6 jj è’1üÿè]1üÿh„h`6 jj £0óèu1üÿƒÄ4ƒ=(ó½‰-,óu è© ‰-(ó‹4ó‹Í…Òt‹L$ÝX6 Ý óØÑßàÝÙÙîöÄuÝÙ‰l$ë%ÛD$PÇD$ÞêÙÉÝ óØÙßàöÄzÝ ó…Ét9¾4ë‹ÿÙî¸èdhÝ$jhÄ6 è5ûÿÿƒÄ+õuÞ9t$t ‰-4óëÝØ‹ó¡ó‹ ó‰T$(‹ó‰T$,‹üò‰T$0‹ó‰T$4‹ó‰T$8‹ó‹ðÇ;Á‰T$<‹ ó‹é‰T$@£ó~ ™÷ù‰óÿóhÎh`6 jj Ç,óè20üÿƒÄ‹D$Pƒø | ¿ ‰|$ë‰D$‹ø+Çj‰D$TèøyPD$ Pè½PjL$@QT$,RèˆCƒÀƒÁƒø ŒXÿÿÿƒ|$PŒþÿÿjè¤xPD$ PèiOjL$8QT$,RèèOjD$LPL$8Qè×Ohùh`6 jj èt.üÿjT$PhüòRè³OƒÄ@jD$hüòPè¯Ohüh`6 jj è<.üÿL$4QèPƒÄ ƒ|$_]…-üÿÿhh`6 jdjdj$è­hx6 jè¡‹L$XƒÄ^[3Ì3ÀèšeƒÄ8ÃÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$VPQè ‹ðƒÄ…öu&èr‹Ðâÿú$u%ÿƒøduè3‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̃=,óVW¾„Ùh%h`6 jjèi-üÿè4-üÿ3É90óh'”Áh`6 jj‹ùèD-üÿƒÄ …ÿuLh.h`6 jj è*-üÿh1h`6 jj è-üÿèâ,üÿh3h`6 jj £0óèú,üÿƒÄ0‰5,óƒ=(óu è3 ‰5(óÝX6 Ü óßàöÄA{3ö…ÿuhDh`6 jj ‰=,óè«,üÿƒÄ_‹Æ^Ã3ÿé_ÿÿÿÌÌÌÌÌÌÌÌÌÌÌÌU‹ìƒäÀ¸tèd¡Àç3ĉ„$pSV‹uWÇD$<…öu3À_^[‹Œ$p3Ìèøc‹å]ÃD$HPVÿh! ƒÄ…À|Ö¸è¬cÙîÝ$L$Pj0Qè{‹] ƒÄ…Ût±hÜ6 Vÿt*PŠ@„Éuù+Â@;ÇsWV‹t$VèövÿÿƒÄ ;Çrt_^3À[Ãè¤)…Àu hð6 ÿӃċð…öu¾ì6 ë€>tB‹ÆPŠ@„Éuù+ƒÀ;Çs-WV‹t$Vè£vÿÿWh± Vè×vÿÿWhä6 VèËvÿÿƒÄ$_‹Æ^[Ët$Æ_‹Æ^[ÃÌÌÌÌÌ¡<ó…Àt"Pè‹D$£8óƒÄÇ<ó¸ËL$‰ 8ó¸ÃÌÌÌÌÌ¡8ó…Àu2Vè‹ð…ötVèuƒģ8ó…ÀuV裃Äèëòÿÿ£8ó^É5<ó^ÃÌÌÌÌÌÌÌÌÌÌÌÌVW‹|$ 3ö…ÿt*WèîƒÄ…ÀtWè!‹ðƒÄ…öuWèRƒÄ_3À^á<ó…Àt Pè;ƒÄ‰=<ó_‰58ó¸^ÃÌÌÌÌ¡8ó…Àu6VèÑ‹ð…ötVèÅÁƒÄ£8ó…ÀuHVèóƒÄè;òÿÿ£8ó^…Àt ‹@…ÀtÿС<ó…ÀtPèɃÄÇ<óÇ8óÉ5<óëÃÌÌÌÌÌÌÌÌÌ¡8ó…Àu6VèQ‹ð…ötVèEÁƒÄ£8ó…Àu VèsƒÄè»ñÿÿ£8ó^…Àt‹…Àt ÿà‰5<óëëá8ó…Àu6Vè‹ð…ötVèõÀƒÄ£8ó…Àu@Vè#ƒÄèkñÿÿ£8ó^…Àt'‹H …Ét ¸èÐ^ÝD$‹D$Ý$‹T$ PRÿуÄÉ5<óëËÌ¡8ó…Àu6Vè‘‹ð…ötVè…ÀƒÄ£8ó…Àu!V賃Äèûðÿÿ£8ó^…Àt‹@…Àt ÿà‰5<óëêƒÈÿÃÌÌÌÌÌÌÌÌÌÌÌÌ¡8ó…Àu6Vè1‹ð…ötVè%ÀƒÄ£8ó…Àu!VèSƒÄè›ðÿÿ£8ó^…Àt‹@…Àt ÿà‰5<óëêƒÈÿÃÌÌÌÌÌÌÌÌÌÌÌÌ¡8ó…Àu6VèÑ‹ð…ötVèÅ¿ƒÄ£8ó…Àu!VèóÿƒÄè;ðÿÿ£8ó^…Àt‹@…Àt ÿà‰5<óëê3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌ¡0PèåƒÄ…Àuh0PèhˆjèƒÄÃÌÌ̃ÈÿÃÌÌÌÌÌÌÌÌÌÌÌ̸ èF]ƒ=èt=D$Pÿ< …Àu£èë'¸è]ÙîÝ$L$ jQèìýÿÿƒÄƒ=èu'ÿ@ ‰$¸èí\ÙîÝ$T$jRè¼ýÿÿƒÄƒÄ ÃÌÌÌÌÌU‹ìƒäÀ¸tèÀ\¡Àç3ĉD$pSVWÿ¤ =€ƒVè|&üÿ…À„Ijjjh 8 ÿ4 ‹øWÿ ‹5 j‹ØW‰\$HÿÖj W‰D$LÿÖ‰D$8‹D$DjPWÿ ‹ðVS‰t$Pÿ L$PQjV‰D$Xÿ ·t$`¯t$X¯t$\hÕh„8 Vè?1üÿƒÄ ‰D$<…À„–‹L$8ƒÁð3Û‰L$8…É~x‹T$D‹D$@h ÌSjWjRjjPÿ$ ‹L$<‹T$HQVRÿ( jè(n‹L$@PjD$tPVQèÕGƒÄ¸è˜[ÙîÝ$T$pjRègüÿÿƒÃƒÄ;\$8|Œ‹D$‰~@‰¾€Ç†ÀÿÿÿÿƒÆƒíuĉ¹ˆ‰¹„_^]YÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌVWè鋸‹·„…öu¾‹„·„…Àt7ö„·ÄtFPè(üÿ‹D$‹L$Ç„·„ƒÄ‰„·„‰Œ·Ä_^ËT$ ‹D$‰”·„‰„·Ä_^ËL$ ‹T$‰Œ·„‰”·Ä_^ÃÌÌÌ̸èÖPSVWhChD; jQ¾Pèí%üÿ‹ø3ÛƒÄ ;û„€9\$Uˆ‰\$~gD$‹hƒÀ‰D$…ítF‹ÅPŠ@„Éuù+ÂØ;Þ~ hSshD; FPWè&üÿƒÄ…Àt6‹øNQUWè fÿÿ‹D$ ƒÄ ‹L$A;L$‰L$|jWèÂþÿÿƒÄ]_^[ƒÄÃWè'üÿƒÄ]_^[ƒÄÃÌÌÌÌÌÌè‹‹ˆˆ;ˆ„u3ÀË„ƒLD¸ÃÌÌÌÌÌVèZ‹ð‹†ˆ;†„„±UW3ÿƒÍÿ‹Ž„öDŽDŽ…“‰8‹–„‰|–D‹†„9¼†„t'ö„†Ät‹„†„PèX&üÿ‹Ž„ƒÄ‰¼Ž„‹–„‰¼–Ä‹†„‰¼†‹Ž„‰¬ŽD®„9®„u dž„‹–ˆ;–„…Xÿÿÿ_]‹†„9†ˆu3À^Ãd†þ¸^ÃÌÌÌÌÌÌÌWèj‹ø‹‡ˆ;‡„u3À_ÃSVpæ€yNƒÎðF‹\·D‰·ˆ‹„·„ÇD·D…Àtö„·ÄtPèw%üÿƒÄÇ„·„Ç„·Ä^‹Ã[_ÃÌÌÌÌÌÌÌÌWèê ‹ø‹‡ˆ;‡„u3À_ÃUVpæ€yNƒÎðF‹l·D‹L$‰·ˆÇD·D…Ét(‹T$…Òt ‹„·…Àu Ç@; ‰ë ‰‹„·D‰‹„·„…Àtö„·ÄtPèÇ$üÿƒÄÇ„·„Ç„·Ä^‹Å]_ÃÌÌÌÌÌÌÌÌWè: ‹ø‹‡ˆ;‡„u3À_ÃUVpæ€yNƒÎðF‹l·D‹L$‰·ˆÇD·D…Ét(‹T$…Òt ‹„·…Àu Ç@; ‰ë ‰‹„·D‰‹L$‹„·„…Éu3…Àtö„·ÄtPè$üÿƒÄÇ„·„Ç„·Ä^‹Å]_Ã…Àu‹D$Çß1 …Àt^Ç‹Å]_É‹D$…Àt ‹Œ·Ä‰^‹Å]_ÃÌÌÌÌÌÌÌÌÌèK ‹ˆˆ;ˆ„u3ÀÃAá€yIƒÉðA‹DˆDÃÌÌÌÌÌÌÌè ‹ˆˆ;ˆ„u3ÀÃAá€SVyIƒÉðA‹t$ ‹\ˆD…öt.W‹|$…ÿt$‹”ˆ…ÒuÇ@; ‰_^‹Ã[É‹„ˆD‰_^‹Ã[ÃÌÌÌÌÌÌÌÌÌÌÌè« ‹ˆˆ;ˆ„u3ÀÃAá€SVyIƒÉðA‹t$ ‹\ˆD…öt*W‹|$…ÿt ‹”ˆ…Òu Ç@; ‰ë ‰‹”ˆD‰_‹t$…öt3‹”ˆ„…Òu‹D$Çß1 …Àt‰^‹Ã[É‹T$…Òt ‹„ˆÄ‰^‹Ã[ÃÌÌÌÌè ‹ˆ„9ˆˆu3ÀËDˆDÃÌÌÌÌÌèë ‹ˆ„9ˆˆu3ÀÃS‹\ˆDV‹t$ …öt.W‹|$…ÿt$‹”ˆ…ÒuÇ@; ‰_^‹Ã[É‹„ˆD‰_^‹Ã[ÃÌÌÌÌÌÌÌÌÌè‹ ‹ˆ„9ˆˆu3ÀÃS‹\ˆDV‹t$ …öt*W‹|$…ÿt ‹”ˆ…Òu Ç@; ‰ë ‰‹”ˆD‰_‹t$…öt3‹”ˆ„…Òu‹D$Çß1 …Àt‰^‹Ã[É‹T$…Òt ‹„ˆÄ‰^‹Ã[ÃÌÌ¡äô…ÀuDh×h„; jj èäüÿƒÄƒ=äôu ÇäôX; hÚh„; jj è»üÿ¡äôƒÄÃÌÌVhéh„; jj 3öèšüÿƒÄ95äôu‹D$£äô¾hñh„; jj ènüÿƒÄ‹Æ^ÃÌÌÌÌÌÌÌhh„; jj èMüÿ¡èôƒÄ…ÀtPèëÓÿÿƒÄÇèôhh„; jj èüÿƒÄÃÌÌÌÌÌÌ̃=äôu?h×h„; jj èôüÿƒÄƒ=äôu ÇäôX; hÚh„; jj èËüÿƒÄ¡äô‹VjÿÑ‹ðƒÄ…öu^Ãh*h„; jjèžüÿ‹T$RVèƒØÿÿh,h„; jj‹ðè~üÿƒÄ(‹Æ^ÃÌÌÌÌÌÌ̃=äôu?h×h„; jj èTüÿƒÄƒ=äôu ÇäôX; hÚh„; jj è+üÿƒÄ¡äô‹VjÿÑ‹ðƒÄ…öu^Ãh;h„; jj èþüÿ‹T$RVèãÖÿÿh=h„; jj ‹ðèÞüÿƒÄ(‹Æ^ÃÌÌÌÌÌÌ̃=äôu?h×h„; jj è´üÿƒÄƒ=äôu ÇäôX; hÚh„; jj è‹üÿƒÄ¡äô‹VjÿÑ‹ðƒÄ…öu^ÃhLh„; jj è^üÿ‹T$RVèÓÖÿÿhNh„; jj ‹ðè>üÿƒÄ(‹Æ^ÃÌÌÌÌÌÌÌV‹t$…öt*ƒ>t%hnh„; jjÿhðôè:üÿƒÄ…ÀÇ^ÃÌÌÌÌÌÌÌÌÌÌ̸èfGƒ=äôu?h×h„; jj èÊüÿƒÄƒ=äôu ÇäôX; hÚh„; jj è¡üÿƒÄ¡äô‹Hjÿуĉ$…ÀuYÃVhˆh„; jjèrüÿ‹T$‹D$RPèSÖÿÿhŠh„; jj‹ðèNüÿ‹äô‹BL$,QÿЃÄ,‹Æ^YÃÌÌÌÌÌ̸è¦Fƒ=äôu?h×h„; jj è üÿƒÄƒ=äôu ÇäôX; hÚh„; jj èáüÿƒÄ¡äô‹Hjÿуĉ$…ÀuYÃVhšh„; jj è²üÿ‹T$‹D$RPè“Ôÿÿhœh„; jj ‹ðèŽüÿ‹äô‹BL$,QÿЃÄ,‹Æ^YÃÌÌÌÌÌÌVhÀh„; jj è\üÿ¡ìhÂh„; ‹ð@jj £ìè<üÿƒÄ ‹Æ^ÃÌÌÌÌÌV‹t$…öt=WÆ„¿‹…ÀtöF@tPèiüÿƒÄÇÇF@ƒÆƒïuÖ_^éJüÿ^ÃÌÌÌÌÌÌÌ̃=äôu?h×h„; jj èÄ üÿƒÄƒ=äôu ÇäôX; hÚh„; jj è› üÿƒÄV‹t$ ƒ>t)S‹\$ …Ût¶ÃÁà ‹ äô‹Q Vÿ҃ƃă>uÝ[^ÃÌÌÌV‹t$ ƒ>t*S‹\$ …Ût¶ÃÁà ‹ äô‹QVÿ҃ƃă>uÝ[^ÃÌÌÌÌÌÌÌÌÌ̃=äôu?h×h„; jj è üÿƒÄƒ=äôu ÇäôX; hÚh„; jj èÛ üÿƒÄ¡äô‹HÿáÌÌÌÌÌÌÌÌÌÌÌÌÌ̃=äôu?h×h„; jj è¤ üÿƒÄƒ=äôu ÇäôX; hÚh„; jj è{ üÿƒÄ¡äô‹jÿуÄÃÌÌÌÌÌÌÌÌ̃=äôu?h×h„; jj èD üÿƒÄƒ=äôu ÇäôX; hÚh„; jj è üÿƒÄ¡äô‹HjÿуÄÃÌÌÌÌÌÌÌ̃=äôu?h×h„; jj èä üÿƒÄƒ=äôu ÇäôX; hÚh„; jj è» üÿƒÄ‹ äô‹QÿâÌÌÌÌÌÌÌÌÌÌÌÌ̸èCƒ=äôu?h×h„; jj èz üÿƒÄƒ=äôu ÇäôX; hÚh„; jj èQ üÿƒÄ‹D$ ‹äôÁèÁà $‰$‹BQÿЃÄ…ÀuƒÄË@ƒÄøè–Bƒ=äôu?h×h„; jj èú üÿƒÄƒ=äôu ÇäôX; hÚh„; jj èÑ üÿƒÄ‹D$ ‹ÈÁé áÿÁèÁá Áà È¡äô$‰ $‹HRÿуÄ…ÀuƒÄË@ƒÄÃ̸èBƒ=äôu?h×h„; jj èj üÿƒÄƒ=äôu ÇäôX; hÚh„; jj èA üÿƒÄ‹D$ ‹ äôV‹ðÁèÁàæÿ ƉD$‹QD$Pÿ҃ąÀu ‹ äôD$‰t$‹QPÿ҃ąÀu^ƒÄË@^ƒÄÃÌÌÌÌÌÌ‹D$‹‹ÈÁé 3ÈÁé áÿ3ȸËk(¯÷á‹Á+ÂÑèÂÁè‹ÐkÒ‹Á+ÂkÀ 3ÁÃÌÌÌÌÌÌÌ‹D$‹kÀ ÃÌÌÌÌÌÌ‹D$‹‹L$+ÃÌÌ̸Œèö@ƒ=äôu?h×h„; jj èZ üÿƒÄƒ=äôu ÇäôX; hÚh„; jj è1 üÿƒÄ‹„$…Àuèîüÿ‹ äô‰$‹Q$$PÿÒÄÃÌÌÌÌ̸Œèv@S3ÛVW9äôu>h×h„; jj èÖüÿƒÄ9äôu ÇäôX; hÚh„; jj è®üÿƒÄèvüÿ‹ äô‹øD$ ‰|$ ‹QPÿÒ‹ðƒÄ;ó…ˆhuh„; hŒèüÿ‹ðƒÄ ;ótO‰>‰ž„‰žˆ†Ä¹‰XÀ‰ƒÀƒéuó¡äô‹H VÿÑ‹äô‹ø‹BVÿЃÄ;ÆtVèêùÿÿƒÄ_^¸Xó[ÄŒÃ;ût WèÎùÿÿƒÄ_‹Æ^[ÄŒÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̃=äôu?h×h„; jj èÄüÿƒÄƒ=äôu ÇäôX; hÚh„; jj è›üÿƒÄ¡äô‹H(ÿáÌÌÌÌÌÌÌÌÌÌÌÌÌÌVhh„; jj 3öèjüÿ¡èôƒÄ…Àu?9t$t;h h„; hœ; èTüÿhð h  èUÌÿÿƒÄ£èôèXüÿ¡èô…Àt‹ðhh„; jj è üÿƒÄ‹Æ^ÃÌÌÌVhWh„; jj 3öèêüÿ¡ìôƒÄ…Àu?9t$tAhZh„; h°; èÔüÿhð hà èÕËÿÿƒÄ£ìôèØüÿ¡ìô…Àtÿðô‹ðhch„; jj è„üÿƒÄ‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸èæ=ƒ=äôu?h×h„; jj èJüÿƒÄƒ=äôu ÇäôX; hÚh„; jj è!üÿƒÄ¡äô‹Hjÿуĉ$…À„“Vh¬h„; jj èðüÿ‹T$‹D$RPèaÌÿÿƒÄƒ=ðô‹ðu/¡ìô…Àt&PèÔÊÿÿƒÄ…Àu‹ ìôQèaÇÿÿƒÄÇìôhµh„; jj è‘üÿ¡äô‹HT$RÿуÄ…öt VèE÷ÿÿƒÄ^YÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌè[è¦Öýÿèa?þÿè\—þÿèrè‚SÿÿèèèSqþÿè¾VèIÅè2èï4üÿèÊðþÿè…Oÿÿè`@ÿÿè[`ÿÿèVlèQÈè ÏèçÞÿÿè¢yþÿèíÑè¨NéÓNÌÌÌ‹D$ ‹L$‹T$PQjRÿ4! ƒÄÃÌÌÌÌ̸Ðè6<¡Àç3ĉ„$ÌSU‹¬$àV‹´$àW‹þÁï ‹ÞVçÿãÿèÝøÿÿV‰D$èSùÿÿV‰D$èÙùÿÿƒÄ ƒ|$‰D$u‹ÆÁèPhø; Œ$¤j@Qè‘—ÿÿƒÄƒ|$uWhì; T$$j@Rèu—ÿÿƒÄ‹T$…ÒuShà; D$dj@PèX—ÿÿƒÄT$\‹L$…ÉuL$‹D$…Àu„$œ‹¼$ìRQPVhÈ; WUè—ÿÿ‹ÅƒÄP¤$Š@„Éuù+ÂOÿ;Áu3ƒÿv.‹Å3öï‹=p! j:Pÿ׃Ä…ÀtT.û;ÂvD.ûÆ:F@ƒþ|Þ‹Œ$Ü_^][3Ìè;ÄÐÃÌÌÌÌV‹t$ …öu¾øô‹D$hVPè‚þÿÿƒÄ ‹Æ^ÃÌÌÌÌÌÌÌÌÌÌ̸è¦:¡Àç3ĉ„$UV‹´$ W‹¼$(èÒüÿ‹èD$PL$QT$RD$Pè§ìÿÿƒÄ…À„•hL$ QPè þÿÿ‹D$ ƒÄ öD$u¸ß1 ‹T$ P‹D$RPL$(QUh< ”$4hRèá•ÿÿ„$<ƒÄ Pd$Š@„Éuù+ÂWP„$$PÿÖL$$QT$$RD$ PL$(QèìÿÿƒÄ…À…kÿÿÿ‹Œ$_^]3Ìèá9ÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$Ph èáþÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌhîh @ jjèíüÿƒÄƒ=Puhñh @ jjèÎüÿƒÄÃhõh @ jjè·üÿhöh @ jj è¤üÿƒÄ ƒ=Puhùh @ jj è…üÿƒÄÃS‹! UVW½¿øõ¾Üƒ>‰nüu(Uÿt! ƒÄ…Àtj PWÿÓƒÄ ÆG‰>ƒ>uǘ@ ƒÆEƒÇ þÌ ~Áhh @ jj ÇPè üÿƒÄ_^][ÃÌÌÌÌ¡ÐPèÕõÿÿƒÄ…Àu7hðPèóÿÿh0jè÷òÿÿhÐjèëòÿÿèÆþÿÿhØjèÚòÿÿƒÄ ÃÌÌÌÌÌÌ‹D$Ph¬èqýÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸è8¡Ø …Àu&jèvüÿè¡Àÿÿj£Ø èeüÿ¡Ø ƒÄ…ÀuYË TV‹ñWAP‰t$ ‰ Tè,¿ÿÿ‹øƒÄ;=T}cjè(üÿjRh¸@ j èÊ üÿj‹ðèüÿƒÄ…öttjÇ@ÚÇF&P ÇFèïüÿ¡Ø VPèÓ½ÿÿjèÜüÿGƒÄ;=T|¡‹t$‹ Ø VQ迾ÿÿ‹L$ƒÄ…Ét‰‹L$…Ét‰H‹L$…Ét‰H_‹Æ^YÃjVh¸@ jAjjjè$äÿÿƒÄ_3À^YÃÌÌÌÌÌÌÌÌÌÌÌS‹\$ V‹t$ ‹+uh¡Ø W…Àt/‹>Pè>¾ÿÿƒÄ;Ç~ ¡Ø WPè;¾ÿÿ‹K‹V‹@QRÿЃÄ_^[ËK‹FŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä_^3À[ÃÀƒØÿ_^[ÃÌÌÌÌÌ¡Ø V‹t$W…Àt/‹>PèɽÿÿƒÄ;Ç~ ¡Ø WPèÆ½ÿÿ‹N‹QÿÒƒÄ ‹È‹_3Á^ËFPèiÃÿÿƒÄ‹È‹_3Á^ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸è6¡à …ÀuƒÄËL$‹T$‰L$VL$QâÿÿÿP‰T$ è×Äÿÿ‹ðƒÄ…ötM¡Ø …Àt1W‹>Pè,½ÿÿƒÄ;Ç~ ‹Ø WRè(½ÿÿ‹N ‹Q‹NR‹PQÿÒƒÄ_Vèn üÿƒÄ¸^ƒÄÃ3À^ƒÄÃÌÌÌÌÌÌÌÌÌÌ‹L$‹‹D$;u‹P‹@‰T$‰L$ÿàÃ̸ èF5‹D$‹L$‹T$‰$$P‰L$‹ à hQ‰T$è:ÀÿÿƒÄÃÌÌÌÌÌÌ‹L$‹‹D$;u‹PV‹p‰ –ÿ@^ÃÌÌÌ‹D$‹‹Q‹D$‹‹IŠ:u„ÀtŠA:Bu ƒÁƒÂ„Àuä3ÀÃÀƒØÿÃÌÌÌÌÌÌÌÌ̸è¦4¡à V‹t$ h<h¸@ P‰t$èÂÿÿÀÀƒÄPè« üÿT$R‰D$¡à L$hPÇD$ ‰t$(ÇD$,ð‰L$0èf¿ÿÿ‹L$ ‹T$$hjQRÿ`! 3öƒÄ(9t$~!S‹\$(W‹|$0‹D$‹ °WQÿÓFƒÄ;t$|ë_[‹T$ RèÙ üÿƒÄ^ƒÄÃÌ‹D$…Àt‹ Ü …É|;u‹‹PQRè¾ýÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌ¡à …ÀtiV‹t$W‹x hP‰5Ü Ç@ èv¾ÿÿƒÄ…ö}6¡à Pè´½ÿÿ‹ Ø hQèS½ÿÿƒÄ _Çà ÇØ ^Ëà ‰z _^ÃÌÌÌÌÌÌÌÌÌÌÌÌ̃=à t¸Ãjèª üÿhhè»Àÿÿj£à è üÿ3ÀƒÄ9à •Àøèö2SW‹|$3Û…ÿu_3À[ƒÄÃ9à u è•ÿÿÿ…Àtç‹D$ ‹ à V‹ð%ÿÿÿ‰D$ D$ PQ怉|$èÂÿÿƒÄ…Àt/ƒxt2…öu.Cƒû ‹P ‹ à D$ PQ‰T$èçÁÿÿƒÄ…ÀuÑ^_3À[ƒÄË@ ^_[ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̃=à u7jèÀ üÿhhèÑ¿ÿÿj£à è¥ üÿ3ÀƒÄ9à •À…Àu3ÀÃh¿h¸@ jè/üÿƒÄ …Àtå‹L$‰H‹L$‹Ñâ€áÿÿÿV‰P‹à ‰‹L$PR‰H è5Àÿÿ‹ðƒÄ…ötI¡Ø …Àt0W‹>Pè¹ÿÿƒÄ;Ç~¡Ø WPè¹ÿÿ‹N ‹Q‹NR‹PQÿÒƒÄ_Vè]üÿƒÄ¸^áà ƒx\tî3À^ÃÌÌÌ̸èV1S‹\$‹ ‹CVWƒù‡¼ÿ$„‹H ‹@‹ùÁç3ö‰L$‰D$ …ÉŽƒ3ÛU‹L$¶,‹Ã™¹÷ùFƒÃ‹ÊÓå3ý;t$|Þ‹\$‹ ]‹Ç_%ÿÿÿ?Áá^ Á[ƒÄËRè¾ÿÿ‹ ƒÄ‹ø_%ÿÿÿ?Áá^ Á[ƒÄË@Pèõ½ÿÿ‹ ƒÄ‹ø_%ÿÿÿ?Áá^ Á[ƒÄËx‹ ‹Ç_%ÿÿÿ?Áá^ Á[ƒÄÃ_^3À[ƒÄÃÆ"BcÌÌÌÌÌÌÌÌÌÌÌÌ‹T$‹ W‹|$ ‹Á+…ºV‹r‹Wƒù‡§ÿ$Ä‹N ‹Á+B …”‹R‹vƒùr‹;uƒéƒÂƒÆƒùsì…Éto¶¶:+Çu1ƒùv`¶F¶z+Çu ƒùvO¶F¶z+Çuƒùv>¶F¶J+ÁÁø^ƒÈ_Ë…Àt1‹ …Ét8IŠ:u[„ÒtŠP:QuOƒÀƒÁ„Òuä3À^_ËF…Àu^ƒÈÿ_ËJ…Éu ^¸_ÃIŠ:u„ÒtÒŠP:QuƒÀƒÁ„Òuä^3À_ÃÀ^ƒØÿ_ËF+B^_ËÿÌAq¹ÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹HÇA‹@ƒH ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹@ÿ@ÃÌÌÌÌÌV‹t$‹FÿH‹Fƒxu ‹ÈQ褗ƒÄVè«üÿƒÄ^ÃÌÌÌÌÌÌ¡ä …ÀtLhàPÇ@ è…¹ÿÿ¡ä hPèu¹ÿÿ‹ ä hQèd¹ÿÿ‹ä R訸ÿÿƒÄÇä ÃÌÌÌÌÌÌÌÌÌÌ‹ xª‹ÁL$‰ xªÃÌÌÌÌÌÌÌÌÌÌÌÌ̸è6.S3Û‰\$‰\$‰\$ ‰\$9ä u+h h 謻ÿÿ3ɃÄ;ÕÁ£ä ‹Á;Ãu3À[ƒÄÃV‹t$WVèÔ ‹øƒÄ;û„›hñhX jèöüÿƒÄ ‰D$;Ãtg9_ t!9^thóhX jèÐüÿƒÄ ‰D$ ;ÃtA9thõhX jè°üÿƒÄ ‰D$;Ãt!9_tch÷hX jèüÿƒÄ ‰D$;ÃuGh hX jAjijè_ÚÿÿƒÄ3ö‹D´ ;Ãt Pè üÿƒÄFƒþ~é;ût WèùüÿƒÄ_^3À[ƒÄÃ3ö‹D´ ;Ãt"‹ä PR‰0‰xèa»ÿÿƒÄ;Ãt PèÄüÿƒÄFƒþ~Ѓgò‹G_^[ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ è¶,‹D$$=Zw&…Àt @ƒ<ÍÀ2uhëI@Ÿ2ƒÄ Ë ä …ÉtD‰D$$PT$ QÇD$‰T$ èÍ»ÿÿƒÄ…Àt‹@ƒÄ Ãh,hX jejgjèZÙÿÿƒÄ3ÀƒÄ Ã̸ è&,‹D$$=Zw&…Àt @ƒ<ÍÀ2uh;ëK@‹Õ¸2ƒÄ Ë ä …ÉtF‰D$$PT$ QÇD$‰T$ è=»ÿÿƒÄ…Àt ‹H‹ƒÄ ÃhLhX jejhjèÈØÿÿƒÄ3ÀƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸ è†+‹D$$=Zw&…Àt @ƒ<ÍÀ2uh[ëL@‹Õ¼2ƒÄ Ë ä …ÉtG‰D$$PT$ QÇD$‰T$ èºÿÿƒÄ…Àt ‹H‹AƒÄ ÃhlhX jejfjè'ØÿÿƒÄ3ÀƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‹V‹0‹N ‹Á+B uk‹R‹vWƒùr‹;uƒéƒÂƒÆƒùsì…ÉtD¶¶:+Çu1ƒùv5¶F¶z+Çu ƒùv$¶F¶z+Çuƒùv¶F¶J+ÁÁø_ƒÈ^Ã3À_^ÃÌÌÌÌÌÌÌÌÌÌÌÌU‹l$VW3ö3ÿ…íu_^3À]ÃS3Û…í~Kd$+™+‹ð‹D$Ñþ‹þ¯|$ |$WPÿT$,ƒÄ…À}‹îë~^;Ý|Í…ÀtöD$(uG3ÿ[‹Ç_^]ÃöD$(t7‹l$ …ö~&~ÿ¯ý‹Ý÷Û|$‹L$WQÿT$,ƒÄ…ÀuNû…öè¯õt$‹þ[‹Ç_^]ÃÌÌÌ̸è¦)SU‹l$Wjÿ3ÛUSS‰\$è‹øƒÄ;û_]3À[YÃVhhX Wèžþûÿ‹ðƒÄ …öu hhX jAjdjèpÖÿÿƒÄ^_]3À[YÃjÿUWV軌ƒÄ…Àt7‹ xª‹ÑA‰ xª‹L$ Q‹L$ QPVRèS’‹ØƒÄ…Ût SèÄúÿÿƒÄ‹øë‹|$SèÑVèÍÿûÿƒÄ^‹Ç_][YÃÌÌ‹D$‹L$‹T$ jP‹D$Q‹L$RPQè`þÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌ̸ è¦(¡Àç3ĉ„$SU‹¬$VWhD$P3ÿU‰|$è÷BÿÿƒÄ ;ÇŽ‹|! L$I‰L$ëë ¤$‹ÿ‹L$ƶL$Qÿx! ƒÄ…À„Ôt$¶Rÿ! ƒÄ…Àu€>.uFëç€>twƶFFPÿӃąÀt¶NFQÿӃąÀuñ€>tQ‹þ¤$¶RÿӃąÀuG8uî€?t-ƶGGPÿӃąÀt¤$¶OGQÿӃąÀuñ€?u3ÿë3ö€|$t2WT$VRèÓýÿÿƒÄ …ÀtÿD$hD$PUèèAÿÿƒÄ …À ÿÿÿ‹Œ$‹D$_^][3Ìèr'Ä øè6'‹L$ W3ÿ;Ïu3À_ƒÄËA;Ç…„¡ä ;Çt%‰L$L$QP‰|$ èm¶ÿÿƒÄ;Çt ‹P‹B_ƒÄÃSUV»&I;™+‹ðÑþ,µàD$UPèÔûÿÿƒÄ…À}‹Þë~~;û|Ð…Àu…íu ^][3À_ƒÄËM‹A^][_ƒÄø8è†&¡Àç3ĉD$4S‹\$DU‹l$DV‹t$P‰\$ÇD$…ö„܃~„Òƒ|$TWuYVèÿÿÿ‹øƒÄ…ÿtJWè¡úÿÿ‹ðƒÄ…öu WèòùÿÿƒÄ‹ð…ít SVUè¡;ÿÿƒÄ ‹ÆPŠ@„Éuù_^]+Â[‹L$43Ìè&ƒÄ8ËN‹F ‰L$$3ɉD$ÇD$ ‰L$…ÀŽë ¤$‹L$3ÿ3ö‹D$$Š@ƒl$‰D$$u„Ûˆÿ…öt¶ÓƒâRQè]™ýÿƒÄ…À„ß‹L$ë¶Ãƒà ø„Ûyc…öu:ÿÿÿÿvO…Éuè;lýÿ‰D$…À„½‹ÈWQè&oýÿƒÄ…À„˜‹L$¾jQQèY•ýÿƒÄ …À„{‹L$é]ÿÿÿÁçéUÿÿÿƒ|$ taÇD$ ƒÿPr'»…ötjPQèx™ýÿƒÄ…À„:‹L$ëƒïPë¸ÍÌÌÌ÷ç‹ÚÁë‹ÓkÒØú…ítƒ|$~ €Ã0ˆ]EÿL$ÿD$…ötmQèˉýÿ‹ØƒÄ…Û„ëPŠ@„Éuù+‹ø…ít1‹t$…ö~ÆE.ENVSUèö9ÿÿƒÄ ;þ~ îÇD$ëï+÷‰t$‹D$L8S‰L$èûûÿƒÄë^Wht T$0jRèòÿÿD$8ƒÄPŠ@„Éuù+‹ø…ít/‹t$…ö~'VD$,PUè…9ÿÿƒÄ ;þ~ îÇD$ëï+÷‰t$|$ƒ|$ þÿÿ‹D$…Àt Pè=jýÿƒÄ‹D$_^][‹L$43ÌèÒ#ƒÄ8ËL$…Ét QèjýÿƒÄ_^]ƒÈÿ[‹L$43Ìè«#ƒÄ8ËL$@^ÆE][3Ì3Àè“#ƒÄ8ÃÌÌÌ̸ èV#‹D$$‰D$ ¡ä …Àt+$RL$ PÇD$‰L$ 蛲ÿÿƒÄ…Àt ‹@‹@ƒÄ ÃSUVW3ö½T.™+ÂÑø‹ …‹Q‹L$<…‹ÿŠ:u„ÛtŠY:ZuƒÁƒÂ„Ûuä3ÉëɃÙÿ…É}‹èë~p;õ|«…Éu…ÿu _^]3À[ƒÄ Ë‹B_^][ƒÄ ÃÌÌÌÌÌÌÌÌÌÌ̸ è†"‹D$$‰D$¡ä …Àt+$RL$ PÇD$‰L$ è˱ÿÿƒÄ…Àt ‹@‹@ƒÄ ÃSUVW3ö½T.™+ÂÑø‹ …@ƒ‹‹L$<…@ƒIŠ:u„ÛtŠY:ZuƒÁƒÂ„Ûuä3ÉëɃÙÿ…É}‹èë~p;õ|«…Éu…ÿu _^]3À[ƒÄ Ë‹B_^][ƒÄ ÃÌÌÌÌÌÌÌÌÌÌ̸è¶!ƒ|$ U‹l$ u&UèÿÿÿƒÄ…Àu Uè7þÿÿƒÄ…Àt PèÊôÿÿƒÄ]YÃWjÿUjjè÷„‹øƒÄ…ÿ_3À]YÃSVjWjè|£h©‹ØhX Sèzöûÿ‹ðƒÄ…öu^[_]YÃjjWD$(jP‰t$0覧‹L$0jÿUWQ蘄ST$8Rj‰t$@èw‹V‹øèß÷ûÿƒÄ4^[‹Ç_]YÃÌÌÌ̸èæ SU‹l$VWUèHþÿÿƒÄ…À…ŒUègýÿÿƒÄ…ÀujÿUPPè6„‹øƒÄ…ÿ3öësjWjè¿¢h©‹ØhX Sè½õûÿ‹ðƒÄ…öt×jjWD$jP‰t$$è曆L$$jÿUWQèáƒST$ÿÿÿ^_‹ÅÆ]ÃÌÌÌÌÌ‹D$3ÉÇ@‰‰HX‰H\ÃÌÌÌÌÌÌÌÌÌ̸è¶‹T$ ¶ U3íƒá°àW‹|$‰l$8 «u›;ý~¶JBƒáO8 «tëƒÿ~"›¶D:ÿƒàŠˆ «€É€ùóuOƒÿä‹Ç%€yHƒÈü@t_ƒÈÿ]YÃ;ýSVŽŽ‹t$¶ ¶BB¶ZBƒã¶› «B‰\$ ¶ƒá¶‰ «ƒã¶› «ƒà¶€ «B‰\$„ÉxN„ÀxJöD$ €uC„Ûx?ƒD$Áá ÈÁá L$ FÁá Ë‹ÁÁèˆFÿ‹ÁÁèˆFˆƒÅF;ïŒvÿÿÿ‹D$^[_]YÃ^[_ƒÈÿ]YÃÌÌV‹t$W‹|$Ç‹…Àt$‹L$PFPQè«þÿÿƒÄ …À}_ƒÈÿ^Ãlj_¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸è6‹D$S‹\$ÇD$Ç…Û„èW‹|$ƒP~h‘ h‹h‘ èØæûÿƒÄ ‹V‹w ;Î}‹T$ SRD8PèZƒÄ ^_[YÃU‹l$$…Àt=+ðVL8UQè9‹WRGî+Þ‹t$,PVèÑüÿÿðÇÆ FƒÄ@ƉD$ë‹t$;_|/‹OQUVè¤üÿÿ‹O‹T$ðÆ F+ÙƒÄ éÆ;_D‰D$}Ñ…ÛtSOUQèÃƒÄ ‹T$ ‹D$]‰^‰_[YÃÌÌÌÌÌÌÌÌÌÌÌÌW‹|$‹3É…Àt+V‹t$PGPVè3üÿÿ‹L$ Æ0 ƒÄ @Æ0Ç^‰_ËT$‰ _øèÖSU‹l$ ‹EX‹M‰D$ ‹E\V3Ò‰D$ ‹D$4W3ÿÇD$ÿÿÿÿ‰T$ ‰L$;„;Êu‹t$4¶6ƒæ€¾ «ò„‚;‰T$Žj›ƒ|$(P`‹D$4¶@‰D$4‹Ãƒà¶° «‹ÆƒÈ=ót1ƒùP|hD‘ hh‘ èåûÿ‹L$ ƒÄ 3Òˆ\)AÿD$(‰L$ë þÿ„ÿƒû=u ƒ|$ÿu‰L$GþñuC‰T$(9T$…¾‹D$@‰T$;D$8u>öÁt;út53ÿ€|)=¾òu¿€|)=u#Gë þðuÉT$(9T$t¹‰T$ëqþòuöÁtƒù@|_þòtÇD$;Ê~.Q‹L$0EPQè›ûÿÿƒÄ ÇD$‹L$…À|H‹Ð+×T$ 3Òë¿3À;E};úu,9T$‰E}#D$,‹D$@;D$8‰D$Œœþÿÿ¸ëƒÈÿë3À‹T$0‹t$ ‰2‹T$_‰M‹L$$^‰MX‰U\][ƒÄÃÌÌÌÌÌÌÌÌÌÌÌ‹L$3À‰‰A‰A‰A ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌh€hd‘ jèÏìûÿ3ɉ‰H‰HƒÄ ‰H ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̃?V‹ñ„‰‹C…Àt Pè—¹ƒÄ…öt/Vè ¹ƒÄ…Àu1hÞhd‘ h†h‹jèXÄÿÿƒÄ3À^Ë‹Qè×ԃċð…öt%‹‹PVèՃąÀuhìë·‰‰s¸^ÃÇC¸^Ã;uæhühd‘ h‹h‹jèëÃÿÿƒÄ3À^ÃÌÌÌÌS‹\$ƒcýƒ{t‹…Àt‹L$ …Ét\‹ ;tV‹L$W|$èÿÿÿ_…Àu[ËV‹t$;Æt5…ÀtƒxDt ‹S RèJíûÿƒÄ‰3‹FD…Àth.hd‘ Pè~ëûÿƒÄ ‰C ^‹‹HSÿуÄ[ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹‰D$‹AÿàÌV‹t$‹ƒx@W~h|‘ hPhd‘ èÞáûÿƒÄ ‹T$‹‹ARVÿЋø‹D$ƒÄ…Àt‹‹Q‰‹‹@ …Àt VÿЃÄƒN‹‹QD‹F RjPè>ƒÄ ‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$‹…Àt@‹@ …Àt öFuVÿЃÄ‹…Àt'‹@D…Àt ‹N …ÉtöFuPQèQíûÿ‹F Pè8ìûÿƒÄ ‹F…Àt Pèx·ƒÄ3À‰‰F‰F‰F ¸^ÃÌ‹L$3À‰‰A‰AP‰A ‹D$ PQèSþÿÿƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$V‹t$WPQVèÊþÿÿV‹øèBÿÿÿƒÄ‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌW‹|$ …ÿ„ʃ?„Á‹G…Àt)Pè]¶ƒÄ…Àuhohd‘ j&jnjè±ÁÿÿƒÄ3À_ÃSV‹t$‹;u ‹^ ƒNë3ÛVèÍþÿÿ‹‰‹W‰V‹G‰F‹O ‰N ‹‹BDƒÄ…Àt5…Ût‰^ ëh€hd‘ PèbéûÿƒÄ ‰F ‹‹HD‹W ‹F QRPè›ƒÄ ‹‹A…Àt WVÿЃÄ^[_Ã^[¸_Ãhhhd‘ jojnjèÁÿÿƒÄ3À_ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸èÆ‹L$$3À‰$‰D$‰D$ ƒÈV‰D$ ‹D$,PQT$ RèÝüÿÿƒÄ …ÀtS‹D$‹L$P‹D$Q‹HT$ RÿÑƒÄ …Àt4‹T$$‹D$ RPL$ QèCýÿÿƒÄ …ÀtT$R¾è­ýÿÿƒÄ‹Æ^ƒÄÃT$R3öè—ýÿÿƒÄ‹Æ^ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$VèuýÿÿVèïéûÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌ‹L$3À‰‰A‰A‰A ‰L$éþÿÿÌÌÌÌÌÌVjQhÌ‘ hŒèþçûÿ‹ðƒÄ …öt VèïƒÄ‹Æ^ÃÌÌÌÌÌÌÌÌV‹t$ W‹|$ …öt Wè̃ċD$‹L$‹T$PQRjVWè!ƒÄ_^ÃÌÌÌÌÌÌÌÌÌÌÌV‹t$ W‹|$ …öt W范ċD$‹L$jPQjVWèD!ƒÄ_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‹T$ jP‹D$Q‹L$RPQè!ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌV‹t$ W‹|$ …öt WèƒÄ‹D$‹L$jPQjVWèÔ ƒÄ_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‹T$ jP‹D$Q‹L$RPQè  ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌW‹|$…ÿ‹D$Ç3À…ÿ”À_ÃSV‹t$‹^ ‰\$ …Ûu<…~hu7‹T$‹D$‹‹IWRPVÿуÄ…Àt ‹T$^C[‰:_ËD$^[Ç3À_ËU‹iƒý ~hä‘ h§hÌ‘ èèÜûÿƒÄ …Ûtt;;Õ}*‹D$ WPL30Qèl‹T$(ƒÄ ~ ]^[Ǹ_ËD$$‹L$ ‹Ý+ØSQT00Rè:‹T$$‹‹@UN0QRVÿЃÄ…Àt?\$ +û‹\$l$‰+ë ‹\$ÇM#ï+ý…ÿ~#‹T$ ‹D$‹‹IWRPVÿуÄ…Àu]^[3À_Ã;…ít‹T$ U×RF0PèÄƒÄ ‰n ]^[¸_ÃÌÌV‹t$‹W‹xƒÿ vh’ hÙhÌ‘ èìÛûÿƒÄ ƒÿu‹L$‹Ç_Ç^Ã÷F\‹N t6…Ét hähÌ‘ hŠjjèí¼ÿÿƒÄ_3À^ËT$_Ǹ^ËÇ+Á;ÏsPL10PQè'ƒÄ ‹T$‹‹@WN0QRVÿЃÄ…Àt‹L$‰9_^ÃÌÌÌÌÌÌÌÌÌÌS‹\$…Û‹D$Ç3À…Û”À[ÃV‹t$ ÷F\t‹L$‹T$‹D$SQRPVè ýÿÿƒÄ^[ËW‹yƒÿ vh’ hhÌ‘ èëÚûÿƒÄ ƒ~dU‹l$tWVlRUètƒÄ ïÇD$$ëÇD$$‹D$ S‹\$ PSUVè9ýÿÿƒÄ…Àu]_^[Ãÿv#ƒ~ u);ÇFd‹ WÍQƒÆlVèƒÄ ëÇFdƒ|$$t;]_^¸[ÃÌÌÌÌÌÌÌÌÌÌÌU‹l$V‹t$ ÇE÷F\‹W‹xt+ƒ~ „ñh9hÌ‘ hŠjejèN»ÿÿƒÄ_^3À]Ãÿ†Çƒ~ …Ÿƒ~d„•ƒÿ vh’ hFhÌ‘ èÏÙûÿƒÄ ¶D7k…ÀtR;ÇN3Ò…À~L7lëI¶yÿI;øu/B;Ð|ò‹‹I+È3À…É~‹|$ŠTlˆ8@;Á|ô_^‰M¸]ÃhQëhJhÌ‘ jdjej蜺ÿÿƒÄ_^3À]ÃhChÌ‘ jmjejè~ºÿÿƒÄ_^3À]Ã_^ÇE¸]ÃÌÌÌÌÌV‹t$…ötVèVè äûÿƒÄ^ÃÌÌÌÌÌÌ‹D$‹‹Q„Òy‹T$jRjPèTƒÄËL$9HXt …É~öÂt ‰HX¸ÃhrhÌ‘ h‚jzjèí¹ÿÿƒÄ3ÀÃÌÌÌÌÌÌ̃|$‹D$t `\ÿþÿÿ¸ÃH\¸ÃÌÌÌÌÌÌÌÌÌÌÌ‹D$‹÷At‹T$RjjPèƒÄË@X‹L$PQè°­ÿÿ3҃ąÀŸÂ‹ÂÃÌÌÌ‹D$ƒxt ‰D$é­úÿÿ‰D$éÄüÿÿÌÌÌÌéûûÿÿÌÌÌÌÌÌÌÌÌÌÌé«ýÿÿÌÌÌÌÌÌÌÌÌÌÌ‹D$ƒxt ‰D$éÍûÿÿ‰D$é„ýÿÿÌÌÌÌ‹D$…Àu¢è ÃjOPhè ÿ! ƒÄ Æ7 ÃÌÌÌÌÌÌÌÌ̾è ÷ØÀ%è ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸è– ¡Àç3ĉ„$SU‹¬$VW‹¼$ …ÿu€=è t¿è èÿ-‹œ$û‹ð¸ÿ}‹ÃPjUjWVèZ ƒÄƒ¼$$t$û¸ÿ}‹ÃUPjD$PjWVèÌ ƒÄVèS&V‹øèëL$hQèÜâûÿ‹Œ$ ƒÄ‹Ç_^][3Ìè ÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸lè¶ ¡Àç3ĉD$h‹D$t‹L$x‹”$ˆS‹œ$U‰D$3ÀV‹´$ˆ‰D$‰D$ ‹D$|‹h W‹xƒÿ ‰L$0‰t$4‰T$~hd’ jyhL’ è0ÖûÿƒÄ ƒý~h0’ jzhL’ èÖûÿƒÄ …öu‹Ç_^][‹L$h3ÌèJ ƒÄlÃD$ PèAòÿÿ‹L$jQT$,Rè@óÿÿƒÄ…À„5ëI‹t$4‹D$‹È@‰D$…Ét‹T$RD$jè„YÃÌ̸èV‹D$SP蛋L$PQèðþ‹ØƒÄ …Ûu jSh ’ h‘hŠjè?µÿÿƒÄ3À[YÃVWS3ÿè}ÿÿƒÄ…ÀŽÀ‹ÿWSèyÿÿ‹ð‹FƒÄ¹”’ Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu;T$ RVèHƒƒÄ…Àtyƒ|$ ~Vjjh ’ h“hŠjè²´ÿÿƒÄ_^3À[YÃjqh ’ h•hŠjè´ÿÿ‹F‹NPhˆ’ Qh€’ jèw¶ÿÿƒÄ(SG轎ÿÿƒÄ;øŒBÿÿÿ_^¸[YÃj^h ’ h”ëŒÌÌÌÌÌÌÌÌÌÌjh Dh¸’ èÿƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌ‹D$‹W‹y9|$r;)|$SU‹l$V‹t$3Û+îë‹D$‹P‹@`RP .QVèUšüÿ߃Ä÷;\$ vÝ^][¸_ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$HPQ‹L$P ‹@`R‹T$P‹D$QRPè|¸üÿƒÄ¸ÃÌÌÌ‹D$‹HQ‹L$P ‹@`R‹T$P‹D$QRPè8iƒÄ¸ÃÌÌÌ‹D$‹HQPPR‹P`H ‹D$Q‹L$R‹T$PQRèxŸüÿƒÄ¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èöW3ÿ9|$†ƒSU‹l$V‹ÿ‹D$‹ßƒã¹+˺Óâ‹L$ ‹÷ÁîŠ "ÑöÚҀ T$‹PRH ‹@`QPjjL$'QT$*Rè!ªüÿŠT$/‹Ë¸€Óø€â€ŠËÒêöÐ".G ƒÄˆ.;|$$r‰^][¸_YÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹HQ‹L$P ‹@`R‹T$P‹D$QjRP躩üÿƒÄ¸Ã̸Ē ÃÌÌÌÌÌÌÌÌÌ̸ø’ ÃÌÌÌÌÌÌÌÌÌ̸,“ ÃÌÌÌÌÌÌÌÌÌ̸`“ ÃÌÌÌÌÌÌÌÌÌ̸”“ ÃÌÌÌÌÌÌÌÌÌ̸ȓ ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹H`‹T$QR辑üÿƒÄ¸ÃÌÌÌÌ̃|$tƒÈÿÃV‹t$jVèØ¥ÿÿƒÄ…À3À^ÃVè‡üÿƒÄ¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹HQ‹L$P ‹@`R‹T$P‹D$QRPèr‚ƒÄ¸ÃÌÌÌ‹D$‹HQPPR‹P`H ‹D$Q‹L$R‹T$PQRèøùüÿƒÄ¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹W‹y9|$r;)|$SU‹l$V‹t$3Û+îë‹D$‹P‹@`RP .QVèÕøüÿ߃Ä÷;\$ vÝ^][¸_ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$HPQ‹L$P ‹@`R‹T$P‹D$QRPè\ûüÿƒÄ¸ÃÌÌ̸ü“ ÃÌÌÌÌÌÌÌÌÌ̸0” ÃÌÌÌÌÌÌÌÌÌ̸d” ÃÌÌÌÌÌÌÌÌÌ̸˜” ÃÌÌÌÌÌÌÌÌÌÌ‹D$V‹t$PVèA‹N`ƒÄPQè£öüÿƒÄ ¸^ÃÌÌÌÌÌÌÌÌÌ‹D$‹W‹y9|$r5)|$SU‹l$V‹t$3Û+î‹T$‹B`P .QVè;óüÿ៎ ÷;\$ vá^][¸_ÃÌÌÌÌ‹D$‹HQ‹L$P ‹@`R‹T$P‹D$QRPè êüÿƒÄ¸ÃÌÌÌ‹D$HPQ‹L$P ‹@`R‹T$P‹D$QRPèÌðüÿƒÄ¸ÃÌÌÌ‹D$‹HQPPR‹P`H ‹D$Q‹L$R‹T$PQRè˜îüÿƒÄ¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸̔ ÃÌÌÌÌÌÌÌÌÌ̸• ÃÌÌÌÌÌÌÌÌÌ̸4• ÃÌÌÌÌÌÌÌÌÌ̸h• ÃÌÌÌÌÌÌÌÌÌ̸Øè¶ƒ¼$èV‹´$àuVè~$ƒÄ<tVèoƒàƒÄ<u!‹F`‹Œ$äPQè¤òüÿƒÄ¸^ÄØÃ‹„$äT$RPè‚òüÿ‹N`QT$RèDôüÿD$hØPè%ÙûÿƒÄ¸^ÄØÃÌÌÌÌÌU‹l$‹EW‹x9|$rP‹L$)|$SV‹t$3Û+ΉL$ë ›‹L$‹E`‹URR€RPÎQVèM™üÿ߃Ä÷;\$ vÐ^[_¸]ÃÌÌÌÌÌÌ‹L$‹A`QPRƒÁ QˆQ‹L$€R‹T$P‹D$$PQRèN«üÿƒÄ ¸ÃÌÌÌÌÌ‹L$‹A`‹QRƒÁ QˆQ‹L$€R‹T$P‹D$$PQRèþdƒÄ ¸ÃÌÌÌÌÌ‹D$‹P‹H`RPPRƒÀ PP‹D$ ‘€R‹T$ Q‹L$ PQRèJ›üÿƒÄ$¸Ã̸èæÿW3ÿ9|$†“SU‹l$V‹ÿ‹T$‹ßƒã¹+˸Óà‹L$ ‹÷ÁîŠ "Á‹JöØÀQ$€ˆD$‹B`ƒÂ RRˆ€QPjjT$/RD$2PèäœüÿŠD$7‹Ëº€Óú$€ŠËÒèöÒ".G ЃÄ$ˆ.;|$$‚yÿÿÿ^][¸_YÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹A`‹QRƒÁ QˆQ‹L$€R‹T$P‹D$$PjQRèlœüÿƒÄ$¸ÃÌÌ̸œ• ÃÌÌÌÌÌÌÌÌÌ̸Е ÃÌÌÌÌÌÌÌÌÌ̸– ÃÌÌÌÌÌÌÌÌÌ̸8– ÃÌÌÌÌÌÌÌÌÌ̸l– ÃÌÌÌÌÌÌÌÌÌ̸ – ÃÌÌÌÌÌÌÌÌÌ̸Ԗ ÃÌÌÌÌÌÌÌÌÌ̸<— ÃÌÌÌÌÌÌÌÌÌ̸p— ÃÌÌÌÌÌÌÌÌÌÌV‹t$‹F`W‹|$PWè\‹üÿ‹N`ƒé€QƒÇWèL‹üÿ‹v`¾ƒÄ¹ ó¥_¸^ÃÌV‹t$‹F`W‹|$PWè‹üÿ‹N`ƒé€QWRè ‹üÿ‹F`PƒÇWèúŠüÿƒÄ_¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̃|$tƒÈÿÃV‹t$W‹|$ ‹GXPVèŸÿÿƒÄ…À_3À^ÃV诉üÿƒÄƒX| NQè‰üÿƒÄƒX| ƒÆV苉üÿƒÄ_¸^ø— ÃÌÌÌÌÌÌÌÌÌ̸¤— ÃÌÌÌÌÌÌÌÌÌ̸ؗ ÃÌÌÌÌÌÌÌÌÌÌ‹D$V‹t$PVè°;‹N`ƒÄPQèÛüÿƒÄ ¸^ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$Q‹H`RQèônƒÄ¸ÃÌÌÌÌÌÌÌÌÌÌÌ‹D$‹HQPPR‹P`H ‹D$Q‹L$R‹T$PQRèXýÿƒÄ¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$HPQ‹L$P ‹@`R‹T$P‹D$QRPèœýÿƒÄ¸ÃÌÌ̸ ˜ ÃÌÌÌÌÌÌÌÌÌ̸@˜ ÃÌÌÌÌÌÌÌÌÌ̸t˜ ÃÌÌÌÌÌÌÌÌÌ̸¨˜ ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹HQ‹L$P ‹@`R‹T$P‹D$QRP迟ƒÄ¸ÃÌÌÌ‹D$‹W‹y9|$r;)|$SU‹l$V‹t$3Û+îë‹D$‹P‹@`RP .QVè5ýÿ߃Ä÷;\$ vÝ^][¸_ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸ܘ ÃÌÌÌÌÌÌÌÌÌ̸™ ÃÌÌÌÌÌÌÌÌÌ̸D™ ÃÌÌÌÌÌÌÌÌÌ̸x™ ÃÌÌÌÌÌÌÌÌÌ̸¬™ ÃÌÌÌÌÌÌÌÌÌÌ¸à™ ÃÌÌÌÌÌÌÌÌÌ̸š ÃÌÌÌÌÌÌÌÌÌ̸Hš ÃÌÌÌÌÌÌÌÌÌ̸|š ÃÌÌÌÌÌÌÌÌÌÌ‹D$÷@\ ‹L$uÉÉÉ‹PRPPRP ‹@`R‹T$PQ‹L$QRèùýÿƒÄ¸ø°š ÃÌÌÌÌÌÌÌÌÌÌ¸äš ÃÌÌÌÌÌÌÌÌÌ̸› ÃÌÌÌÌÌÌÌÌÌ̸L› ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹HQPPR‹P`H ‹D$Q‹L$R‹T$PQRè8ýÿƒÄ¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸€› ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹‹Iƒáƒùt&ƒùt!ƒ|$u‹P`‹@X‹L$ÀÀRÀPQè¤ë‹P`‹@X‹L$ÀÀRÀPQèÇ¡ƒÄ …À}jnh´› hh…jèò¦ÿÿƒÄ3ÀøÃÌÌÌÌÌÌV‹t$‹VjPè€ÍÿÿƒÄPèWÇÿÿƒÄ …Àu^ËVjQèÎÿÿƒÄPè:ÇÿÿƒÄ ^ÃÌÌÌÌÌV‹t$‹WPèBÍÿÿV‹øjWèÇÿÿƒÄ…Àu_3À^ËVjQèÀÍÿÿƒÄPè÷ÆÿÿƒÄ …Àtà‹N9t7Wh€QèýÌÿÿƒÄPèÔÆÿÿƒÄ …Àt½‹VWh€Rè~ÍÿÿƒÄPèµÆÿÿƒÄ _^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$jPèäÅÿÿƒÄËD$jPèÔÅÿÿƒÄÃjè ÅÿÿjèÅÿÿjÿèûÄÿÿƒÄ éSSÌÌ̸̛ ÃÌÌÌÌÌÌÌÌÌÌV‹t$ W‹|$ ‹G`PV蜅üÿ‹G`‹N‰ˆ€‹V ‰„‹F‹`‰‡ˆ‹NƒÄ‰Œ_¸^ÃÌÌÌÌÌÌÌ‹L$‹A`‹QRˆR€R‹T$ƒÁ Q‹L$P‹D$$PQRèþ·üÿƒÄ ¸ÃÌÌÌÌÌ‹D$‹HQ‹L$P ‹@`R‹T$ƒÀP‹D$QRPè ÍüÿƒÄ¸ËD$‹HQPPR‹P`H ‹D$Q‹L$ƒÂR‹T$PQRèµÑüÿƒÄ¸ÃÌÌÌÌÌÌÌÌÌÌÌÌU‹l$‹EW‹x9|$rE‹D$)|$SV‹t$3Û+ƉD$ë ›‹D$‹M‹U`QƒÂRÆPVèÈüÿ߃Ä÷;\$ vÛ^[_¸]ÃÌ‹D$HPQ‹L$P ‹@`R‹T$ƒÀP‹D$QRPè ÓüÿƒÄ¸øœ ÃÌÌÌÌÌÌÌÌÌ̸4œ ÃÌÌÌÌÌÌÌÌÌ̸hœ ÃÌÌÌÌÌÌÌÌÌ̸œœ ÃÌÌÌÌÌÌÌÌÌ̸М ÃÌÌÌÌÌÌÌÌÌ̸ ÃÌÌÌÌÌÌÌÌÌÌ‹T$V‹t$‹F`‹QRVè5ƒÄP‹F`ƒÀPè ÈüÿƒÄ¸^øèvö$PjjQ踋D$ƒÄ=€u¸:YÃø@u¸xYÃ3Òƒø(•ÂJâ ‹ÂYÃÌÌÌÌ‹D$ƒø:u¸€Ãƒøxu¸@Ã= u¸(Ãh£h8 jljmjè£ÿÿƒÄ3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èÖõ¡Àç3ĉD$S‹\$$U3íV‹t$(W‰l$;Ý„¤V蛋øƒÄƒÿvhP h³h8 èmÁûÿƒÄ WD$PL$QSèi‰‹èƒÄ;ït_^]ƒÈÿ[‹L$3Ìè‰õƒÄËT$Rè ÿÿÿ‹øƒÄ…ÿt×…í~jÿD$PjjjVè0ƒÄjWjVèr‹Ç™ƒâÂÁøPVèðçÿÿƒÄ‹L$$_^‹Å][3Ìè'õƒÄÃÌÌÌÌÌÌÌÌS‹\$ 3À…Ût&V‹t$ W‹ÎèXþÿÿV‹øèÀPƒÆVWS蔇ƒÄ_^[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ƒèt=ƒèt#ƒètƒÈÿËD$ …À~‹L$‹Q`‰¸Ã3ÀËD$‹H`‹D$‹‰¸ÃV‹t$Vèß2‹N`ÀÀÀƒÄ‰^¸ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹HQ‹L$P ‹@`R‹T$P‹D$QRPè^~ƒÄ¸ÃÌÌÌ‹D$‹HQPPR‹P`H ‹D$Q‹L$R‹T$PQRèXýÿƒÄ¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹W‹y9|$r;)|$SU‹l$V‹t$3Û+îë‹D$‹P‹@`RP .QVè5ýÿ߃Ä÷;\$ vÝ^][¸_ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$HPQ‹L$P ‹@`R‹T$P‹D$QRPè¼ýÿƒÄ¸ÃÌÌ̸` ÃÌÌÌÌÌÌÌÌÌ̸” ÃÌÌÌÌÌÌÌÌÌÌ¸È ÃÌÌÌÌÌÌÌÌÌ̸ü ÃÌÌÌÌÌÌÌÌÌÌ‹D$V‹t$PVèp1‹N`ƒÄPQèÃìüÿƒÄ ¸^ÃÌÌÌÌÌÌÌÌÌ‹D$hŒjPèGóƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌV‹ñ…öt/VèS”ƒÄ…Àu1h›h0ž h†hŒj衟ÿÿƒÄ3À^Ë‹Qèp®ƒÄ‹ð…öt%‹‹PV茮ƒÄ…Àuh¬ë·‰‰s¸^ÃÇC¸^ÃÌÌÌÌV‹t$‹…Àt)‹@…Àt VÿЃÄ…Àu^ËF`…Àt‹‹Q RPèïÉûÿƒÄ‹F`…Àt PèÏÈûÿƒÄ‹F…Àt P蔃ÄhŒjVèWòƒÄ ¸^ÃÌÌÌÌÌ‹D$‹‰D$‹AÿàÌ‹L$‹…Àuhhh0ž hƒj|j讞ÿÿƒÄ3ÀË@,…Àuhmh0ž h„j|j艞ÿÿƒÄ3ÀËT$R‹T$R‹T$RQÿЃÄƒøÿuhsh0ž h…j|jèQžÿÿƒÄ3ÀÃÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‹AÃÌÌÌÌÌÌ‹D$‹‹A ÃÌÌÌÌÌÌSUV‹t$$3íƒþÿu‹\$‹C‰D$$‹ðë;õt ÇD$$‹t$$‹\$‰s‹L$9kt‹;Åt;Í„à‹;„Ö;Í„©WSèlþÿÿ‹L$ ƒÄ|$‰sèÙýÿÿ_…Àt?‹t$‰3‹F ;Åt8hìh0ž Pè—ÅûÿƒÄ ‰C`;Åu!hïh0ž jAj{jèhÿÿƒÄ^]3À[Ék`‹F‹ ‰CX‰k\öA@tVUUUSèrþÿÿƒÄ…ÀuFhýh0ž h†j{jè#ÿÿƒÄ^]3À[Ã9+u!hh0ž hƒj{jèþœÿÿƒÄ^]3À[Ë‹Bƒøt!ƒøtƒøth€ž h h0ž è»ûÿƒÄ ‹ ‹A‹t$ ¨u`ƒàƒø‡Lÿÿÿÿ$…^‰kPƒy ~hHž hh0ž èM»ûÿƒÄ ;õt‹‹H QSVRèØïƒÄ ‹‹H QSRC PèÂïƒÄ ‹D$;Åu‹ öA t‹L$$‹‹RQVPSÿ҃ąÀ„Îþÿÿ‹‰k ‰kd‹H^I]‰Kh¸[ÃIÃ]Ã]y]v]v]ÌÌÌÌ¸àž ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹H ‰L$éÀèûÿ‹T$‹B ‰D$é°êûÿ‹D$‹H ‹T$QRèêûÿƒÄÃÌÌÌÌÌÌÌÌÌ̸(Ÿ ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹H ‰L$é€÷ûÿ‹T$‹B ‰D$é òûÿ‹D$‹H ‹T$QRèŽóûÿƒÄÃÌÌÌÌÌÌÌÌÌ̸pŸ ÃÌÌÌÌÌÌÌÌÌÌ‹T$‹B ‰D$éõûÿ‹D$‹H ‹T$QRèîõûÿƒÄÃÌÌÌÌÌÌÌÌÌ̸¸Ÿ ÃÌÌÌÌÌÌÌÌÌÌ‹T$‹B ‰D$é  üÿ‹D$‹H ‹T$QRèŽ üÿƒÄÃÌÌÌÌÌÌÌÌÌ̸  ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹H ‹T$QRè®üÿƒÄÃÌÌÌÌÌÌÌÌÌ̸H  ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹H ‰L$é°üÿ‹D$‹H ‰L$éüÿ‹T$‹B ‰D$é#üÿ‹D$‹H ‹T$QRèî#üÿƒÄÃÌÌÌÌÌÌÌÌÌ̸  ÃÌÌÌÌÌÌÌÌÌ̸ؠ ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹H ‰L$é(üÿ‹D$‹H ‰L$é (üÿ‹T$‹B ‰D$é Vüÿ‹D$‹H ‹T$QRèÞQüÿƒÄÃÌÌÌÌÌÌÌÌÌ̸ ¡ ÃÌÌÌÌÌÌÌÌÌ̸h¡ ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹H ‰L$éà\üÿ¸°¡ ÃÌÌÌÌÌÌÌÌÌ̸ø¡ ÃÌÌÌÌÌÌÌÌÌÌ‹T$‹B ‰D$éPuüÿ‹D$‹H ‹T$QRè>vüÿƒÄÃÌÌÌÌÌÌÌÌÌ̸@¢ ÃÌÌÌÌÌÌÌÌÌÌ‹T$‹B ‰D$é0 üÿ¸ˆ¢ ÃÌÌÌÌÌÌÌÌÌ̸èìU‹l$ VW‹|$3ö‰t$ ;þtUèùÿÿVVVWUè!ÚÿÿƒÄ…Àu_^]YË|$(;þu _^¸]YÃ?t'jUhТ jjjfjè̘ÿÿƒÄVèƒÂûÿ‹D$ƒÄ_^]YËG SPèíãýÿ‹ØjZKhТ Qè«Àûÿ‹ðƒÄ…öuj^hТ jAjfj耘ÿÿƒÄëE‹T$$‹D$ WRPVèº ƒÄ…À~-PUèÞÿÿƒÄ…Àt‹L$(QVjjUèeÙÿÿƒÄ…ÀtÇD$…öt SVèûÂûÿƒÄ[VèáÁûÿ‹D$ƒÄ_^]YÃÌÌÌÌÌ‹D$ ‹L$V‹t$WPQVèjÜÿÿjjjjV‹øè ÙÿÿƒÄ ‹Ç_^ÃÌ̸0è¶ê¡Àç3ĉD$,‹D$@‹L$HS‹\$tu[‹F ‹H ‹W ‹B QPè1ýÿƒÄ…Àu<‹N ‹Q‹G ‹HRQèý0ýÿƒÄ…Àu"‹V ‹B‹O ‹QPRèã0ýÿƒÄ…Àu_¸^Ã_3À^Ã=˜u,9u(‹G PèËõ‹N Q‹øèÀõjPWè×SþÿƒÄ÷ØÀ_@^Ã_ƒÈÿ^ÃÌÌÌÌÌÌV‹t$ W‹|$ ‹;t_ƒÈÿ^ÃVWè3ÿÿÿƒÄ…ÀtJ‹ƒøtXtFƒøt_¸þÿÿÿ^ËO ‹Q‹F ‹HRQèC0ýÿƒÄ…Àu‹W ‹B‹N ‹QPRè)0ýÿƒÄ…ÀtY_3À^ËG ‹H‹V ‹BQPëß=˜u¨‹N SQè õ‹W R‹ØèAi‹ø‹F Pè6ijPWSèìLþÿƒÄ[…Àt H÷ØÀ_ƒàþ^Ã_¸^ÃÌh=h£ jè߸ûÿ3ÒƒÄ ;Âuh@h£ jAjjjè±ÿÿƒÄ3Àù‰‰H‰P ‰P‰HÃÌÌÌÌÌÌÌV‹t$ƒ>thbh£ jjyjèqÿÿƒÄ3À^ËF Pèþÿ‹F ƒÄ^ÃÌÌÌÌÌÌÌÌÌV‹t$ƒ>tthvh£ hjxjè.ÿÿƒÄ3À^ËF Pè~þÿ‹F ƒÄ^ÃÌÌÌÌÌÌV‹t$>˜t"hŒh£ hŽhƒjèèÿÿƒÄ3À^ËF Pè½þÿ‹F ƒÄ^ÃV‹t$ƒ>th¢h£ h€jwjè®ÿÿƒÄ3À^ËF PèÎ:þÿ‹F ƒÄ^ÃÌÌÌÌÌÌ‹D$ƒøF$t<ƒÀúƒø=w+¶€ðjÿ$…àj¸øÃøqtƒøtt=˜t3Àø˜øtÃI±j·j×jÎjÌÌ‹ƒøF2tNƒèƒøt…Ž‹K ‹Q Rèì/ýÿ‹øƒÄ…ÿ„¦‹F ‹@ …Àt Pèß&ýÿƒÄ‹N ‰y ‹S ‹BPèº/ýÿ‹øƒÄ…ÿtx‹N ‹A…Àt Pè±&ýÿƒÄ‹V ‰z‹C ‹HQèŒ/ýÿ‹øƒÄ…ÿtJ‹V ‹B…Àt Pèƒ&ýÿƒÄ‹F ‰x>˜u8‹K QèùðPè#Nþÿ‹øƒÄ…ÿt‹V WR耽þÿƒÄ…Àu_^3À[ÃWè-KþÿƒÄ_^¸[ÃÌV‹t$…öu3À^Ã~ t‹ÎèÆýÿÿ‹L$ Qèýÿÿ‰‹D$‰N3ɃÄ…À•Á‰F ^‹ÁÃÌÌV‹t$…öu3À^Ã~ t‹Îè†ýÿÿ‹D$ 3É…À•ÁÇÇF‰F ‹ñ…öt PèïþÿƒÄ‹Æ^ÃÌÌÌÌÌÌÌÌV‹t$…öu3À^Ã~ t‹Îè6ýÿÿ‹D$ 3É…À•ÁÇtÇFt‰F ‹ñ…öt Pè_þÿƒÄ‹Æ^ÃÌÌÌÌÌÌÌÌV‹t$…öu3À^Ã~ t‹Îèæüÿÿ‹D$ 3É…À•ÁǘÇF˜‰F ‹ñ…öt Pèï¸þÿƒÄ‹Æ^ÃÌÌÌÌÌÌÌÌV‹t$…öu3À^Ã~ t‹Îè–üÿÿ‹D$ 3É…À•ÁÇÇF‰F ‹ñ…öt Pè6þÿƒÄ‹Æ^ÃÌÌÌÌÌÌÌÌV‹t$…ötChÆh£ j FjÿPèÀ¦ûÿƒÄ…À%‹Îè2üÿÿ‹F…Àth  PèÐgÿÿƒÄVèÇ´ûÿƒÄ^ÃÌÌ‹D$V3öƒ8tjNh0£ jjjijèâŠÿÿƒÄ‹Æ^Ë@ ‹L$‹T$ jP‹D$QRPèÁÕýÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$VƒÎÿƒ8tjNhH£ jjjhj葊ÿÿƒÄ‹Æ^Ë@ ‹L$‹T$ jP‹D$QRPèÕýÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌ̸ «ÃÌÌÌÌÌÌÌÌÌÌè{Åÿÿ3Ò;Âu3ÀËL$‰A ‰Q ‰Q¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$…öu3À^ËF PèÊÉÿÿƒÄÇF ÇF ÇF¸^ÃÌÌÌÌÌÌÌÌÌÌÌS‹\$ …Ûu3À[ÃUV‹t$‹n …ítF‹F$…Àt?‹L$WQSPèâôþÿƒÄ ƒ~ ‹øt…ÿ~ WSUèKÆÿÿƒÄ jVèpôþÿVèšúþÿƒÄ ‹Ç_^][Ã^]3À[ÃÌÌÌÌÌÌÌÌÌÌS‹\$ V3ö…ÛtV‹L$…É~NUW‹|$‹o …ít‹G$…Àt QSPè0õþÿƒÄ ‹ðƒ t…ö~ VSUèÙÅÿÿƒÄ jWèþóþÿWè(úþÿƒÄ _]‹Æ^[Ã^3À[ÃÌÌÌÌÌÌÌÌÌS‹\$ V‹t$ ‹F KÿW¿ù“‡ì¶‰prÿ$Prƒ~ tI‹jRPèßÄÿÿ‹øƒÄ …ÿŽÙ‹D$‹L$‹V$PQSRèþöþÿƒÄ‹ø_^[Ã~ t‹‹L$‰‹Ç_^[Ã3ÿ‹Ç_^[ËT$‰‹Ç_^[Ã~ tæ‹D$‰F ‹Ç_^[ÃjVè2óþÿ‹L$$‹T$ ‹F$QRSPèžöþÿV‹øèFùþÿƒÄ‹Ç_^[ËL$jQPè@Äÿÿ‹øƒÄ …ÿ~>_ÇF ^[ËT$P‹B PèÆÿÿƒÄ‰~ ‹Ç_^[ËL$‹T$‹F$QRSPè>öþÿ‹øƒÄ‹Ç_^[ÃIPqrÆqóq‹q§q³q.rÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹@ ‹‹T$ ;Q}3ÀËT$L$QRPè«Ãÿÿ‹D$ƒÄ ÃÌÌ̸ȫÃÌÌÌÌÌÌÌÌÌÌjth€£ h\ èÏ®ûÿ3ÒƒÄ ;Âu3ÀËL$‰‰P‰P ‰PÇ@Ç@‰P‰A ÇA ‰Q¸ÃV‹t$…öu3À^ËF Pè*°ûÿƒÄÇF ÇF ÇF¸^ÃÌÌÌÌÌÌÌÌÌÌ̸èÙS3Û‰\$9\$u3À[ƒÄÃU‹l$V‹u ;ó„ƒ9]$„z¸9Ft‰FFP‰‰^‰^èê»ÿÿƒÄW‹>;û~l+~‹\$,;û~‹û‹NÏùÞ|h˜£ h¨h€£ èr¤ûÿƒÄ ‹V‹L$(WD2|PQèþØ~‹F|$4+៎ ‰|$‰\$,9u ÇÇFƒ|$,ÇD$Ž®ƒ~Ž£‹F‹M$º+ÐR„0ZPQèjðþÿ‹øƒÄ …ÿ(‹U$jR‰|$ èðþÿƒÄ…À…d‰~9F„X3ÿ~ƒ~‹^„/jÿUèáïþÿƒÄ©t ÇFé#ƒ~„¾Z‹ïÇD$…ÛŽ™ŠEE< uIƒ~ t ÇF ë8‹Í+ÏQWT$$RN|FQP芽ÿÿƒÄ…À*ƒ|$u#ƒ~tFPèmºÿÿƒÄ‹ý‹D$@;ÉD$|¢ë9ŽZ;ùt‹Ö+לZ3À…Û~ Š8ˆ@;Ã|õFPè*ºÿÿƒÄÇF9\$…/ÿÿÿŽZ;ùuû…2ÇF ÇFé;ý„+ï3À…í~ Š8ˆ@;Å|õ‰néüû} ƒ~ê‹D$$jÿPèœîþÿƒÄ©F|tk‹ûƒçüW®ZUP謹ÿÿƒÄ ƒÿ‰D$~€¼7Y=uH€¼7X=‰D$uH‰D$;ût+ßS /QUè³Ö‹D$ ƒÄ ‰^Ç…À~&‰¸ëS–ZRVPFPè!¼ÿÿƒÄÇF3É;Á‰N|Q‹>‹\$,;û~‹û‹L$(WF|PQèUÖ|$ƒÄ ‰~;>u ÇÇF+ß|$(‰\$,ƒ|$,‹l$$_ýÿÿë ‹l$$‰L$‰jUè‹íþÿUèµóþÿ‹D$ƒÄ _…Àu ‹D$^][ƒÄÃ3À^][ƒÄÃÌÌÌÌ̸èVÕ‹D$SU‹l$V‹u WjU‰D$è;íþÿ¸ƒÄ9Ft‰F3ÀNQ‰‰F‰Fè(·ÿÿƒÄ‹>+~…ÿ~$‹V‹M$WD|PQè îþÿ‹ØƒÄ …Û~.^+û…ÿÜ‹\$ÇFÇ…Ût‹|$ …ÿ_^]3À[YÃUèíòþÿƒÄ_^]‹Ã[YËÿ‹|$ ÿ~¿jÿUè§ìþÿƒÄ©„‡‹F…À~T¿+ø‹D$ ;ø~‹ø‹VW„2ZSPèáÔ~‹FƒÄ ƒøŒÜPŽZQV|Rèl¶ÿÿƒÄ ‰ÇFë?ƒÿŒ¸VUUU÷ï‹ÂÁèÂ<@WF|SPè9¶ÿÿƒÄ ‰ëWSVN|QVR貸ÿÿƒÄ)|$ ß‹>ÇF…ÿ~"‹F‹U$WL|QRèÚìþÿƒÄ …À~IF+ø…ÿÞƒ|$ ÇÇFòþÿÿ‹D$_^][YÃW†ZSPè Ô‹D$ƒÄ ‰~_^][YÃUè¤ñþÿƒÄ‹D$_^][YÃÌÌÌÌÌÌÌS‹\$U‹l$V‹s Eÿ¹W‹ùƒød‡T¶€X{ÿ$…8{‹T$‰N‰N‹L$ QRÇF‹C$UPèîþÿƒÄ‹ø_^][Ã~Ž*‹L$ ‹T$‹C$QRUPègîþÿƒÄ‹ø_^][Ë>+~u9~t9~t‹ù‹Ç_^][Ë>+~…ÿå‹L$ ‹T$‹C$QRUPè"îþÿƒÄ‹ø_^][Ã3ÿ›‹;NtWWSè!ýÿÿƒÄ ;ÇŒ§‹;VuæjÿSèwêþÿƒÄ©t%‹F;ÇtlP†ZPN|Qèu´ÿÿƒÄ ‰‰~‰~ë¨9~tI9~FtAVV|RP‰~èý·ÿÿƒÄ ëˆjSèêþÿ‹D$(‹L$$‹S$PQURè|íþÿS‹øè$ðþÿƒÄ‹Ç_^][ËD$ ‹L$‹S$PQURèVíþÿ‹øƒÄ‹Ç_^][ËÿÐyûy=zhz/{#zèz{ÌÌ̸ð«ÃÌÌÌÌÌÌÌÌÌÌVWjphÈ£ häèM¦ûÿ‹ð3ÿƒÄ ;÷u_3À^ÃFPè4Þÿÿ‹L$‰>‰~‰~ ¸‰F‰FƒÄ‰y ‰y_‰q ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$…öu3À^ËF ƒÀPè‡Þÿÿ‹N häQ虨ûÿ‹V R耧ûÿƒÄÇF ÇF ÇF¸^Ã̸èvЋD$ Ç$…ÀuYÃS‹\$ V‹s …ö„`ƒ{$„VU‹l$W‹>…ÿ~C+~;ý~‹ý‹NW” RPè¥Ð~‹F|$(+ïƒÄ ‰|$‰l$ 9u ÇÇF…íŽÝIƒ~ŽÐ‹C$h®àUPè!èþÿ‹øƒÄ …ÿ9‹K$jQèÍçþÿƒÄ…À…‹Vž VSR‰~èŽÃÿÿƒÄ ‰FÇFë"WUVž FSPè,ÃÿÿƒÄƒ>ÇFt4‹>‹l$ ;ý~‹ý…ÿ~CWS‹\$$SèÓÏ|$+ïƒÄ ߉~‰l$ ‰\$ë‹l$ ‹\$…í9ÿÿÿëƒ|$u ‰|$ë‹\$jSèçþÿSè8íþÿ‹D$ƒÄ _]…Àu ‹F^[YÃ3À^[YÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$U‹l$ V‹u WjU‰\$èÅæþÿ‹>+~ƒÄ…ÿ~/‹F‹U$WŒ0 QRè´çþÿ‹ØƒÄ …Û޵^+û…ÿÕ‹\$ƒ|$„É…ÛŽÁÇFû¿‹û‹D$WPV† PFPèúÁÿÿ|$,+ß‹>ƒÄ‰\$ÇF…ÿ~+‹N‹E$W”1 RPè+çþÿ‹ØƒÄ …Û~@^+û…ÿÙ‹\$ÇÇF…Û„Uèìþÿ‹D$ƒÄ_^][ÃUè ìþÿƒÄ_^]‹Ã[ÃUèüëþÿ‹D$‹L$ ƒÄ;Átä_^]+Á[Ã_^]3À[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌSU‹l$VW‹|$‹w Eÿ»=€‡~¶€Dÿ$… ‹NQjjj‰^ÇF jƒÆVèQÜÿÿ‹T$8‹D$4‹O$RPUQè½èþÿƒÄ(_^]‹Ø[Ã~ŽB‹T$ ‹D$‹O$RPUQè•èþÿƒÄ_^]‹Ø[Ë+^…Û‹T$ ‹D$‹O$RPUQèjèþÿƒÄ_^]‹Ø[Ë;VtjjWèïýÿÿƒÄ …ÀŒß‹;Fuäƒ~ u0VŽ QVRÇF ÇFèˆÀÿÿ‹ØƒÄ ‰^…Û¬_^][ËD$ ‹L$‹W$PQURèóçþÿƒÄ_^]‹Ø[Ë^_^]‹Ã[ÃjWèWäþÿ‹D$(‹L$$‹W$PQURèÃçþÿW‹ØèkêþÿƒÄ_^]‹Ã[ËD$ ƒÆ‰0‰_ _^]‹Ã[ËD$ ‹x ƒÆƒÇ¹#ó¥_^‰X ]‹Ã[ËL$ ‹T$‹G$QRUPèlçþÿƒÄ‹Ø‹Ã_^][ÃÍõ €â€¡€—€Ï€ÌÌÌÌÌÌÌÌÌÌÌV‹t$…öt^‹FS‹\$W‹|$ …ÀtjWjSjVÿЃÄ…À~9‹D$‹L$‹V WPQjƒÂSRÇF èãÙÿÿ‹FƒÄ…ÀtjWjSjVÿЃÄ_[^ÃÌÌÌÌÌÌÌ¡¬PèˆÿÿƒÄ…Àuh¬PèC…ÿÿhx­jè7…ÿÿƒÄÃÌÌ̸˜« ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$;Át‹T$RPQèêÊƒÄ ¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌè{“ûÿèéAÌè+ÅÿÿPèuÐÿÿèPÅÿÿPèjÐÿÿèUÅÿÿPè_Ðÿÿè:ËÿÿPèTÐÿÿèoËÿÿPèIÐÿÿèÅÿÿPè>Ðÿÿè)ËÿÿPè3Ðÿÿè^ËÿÿPè(Ðÿÿè3ÑÿÿPèÐÿÿhàˆ h€hp¬ èy—ÿÿhàˆ h€hh¬ èe—ÿÿèÄÿÿPèêÏÿÿƒÄ@hÜ h€hd¬ èC—ÿÿhÜ h€h`¬ è/—ÿÿèŠÊÿÿPè´Ïÿÿè¿ÊÿÿPè©ÏÿÿhÔŒ h€hX¬ è—ÿÿhÔŒ h€hP¬ èñ–ÿÿèLÄÿÿPèvÏÿÿèqÊÿÿPèkÏÿÿƒÄ@è³ËÿÿPè]Ïÿÿè¸ËÿÿPèRÏÿÿè½ËÿÿPèGÏÿÿè2ÇÿÿPè<ÏÿÿèÇÿÿPè1Ïÿÿè ÇÿÿPè&ÏÿÿèáÆÿÿPèÏÿÿh  h€hH¬ èw–ÿÿh  h€h@¬ èc–ÿÿèÎÑÿÿPèèÎÿÿè£ÑÿÿPèÝÎÿÿè¨ÑÿÿPèÒÎÿÿƒÄ@èzÑÿÿPèÄÎÿÿè¿ÑÿÿPè¹Îÿÿè¤ÑÿÿPè®Îÿÿh\ h€h<¬ è –ÿÿh\ h€h8¬ èö•ÿÿèÅÿÿPè{ÎÿÿèæÄÿÿPèpÎÿÿèëÄÿÿPèeÎÿÿèÀÄÿÿPèZÎÿÿh‡ h€h4¬ è¶•ÿÿƒÄ@h‡ h€h0¬ 蟕ÿÿh‡ h€h$¬ è‹•ÿÿèÆÔÿÿPèÎÿÿè›ÔÿÿPèÎÿÿè ÔÿÿPèúÍÿÿèuÔÿÿPèïÍÿÿhì… h€h¬ èK•ÿÿhì… h€h¬ è7•ÿÿƒÄ@hì… h€h¬ è •ÿÿhì… h€hü« è •ÿÿèËÿÿPè‘ÍÿÿèÜÊÿÿPè†ÍÿÿèáÊÿÿPè{ÍÿÿèÌÿÿPèpÍÿÿè{ÌÿÿPèeÍÿÿèÐÊÿÿPèZÍÿÿhxi h€hô« è¶”ÿÿhxi h€hì« 袔ÿÿƒÄHèzËÿÿPè$Íÿÿè?ËÿÿPèÍÿÿèDËÿÿPèÍÿÿèùËÿÿPèÍÿÿèÌÿÿPèøÌÿÿè3ËÿÿPèíÌÿÿhi h€hä« èI”ÿÿhi h€hÜ« è5”ÿÿèPËÿÿPèºÌÿÿèËÿÿPè¯ÌÿÿèËÿÿPè¤ÌÿÿèŸËÿÿPè™ÌÿÿƒÄ@èÌÿÿPè‹ÌÿÿèËÿÿPè€Ìÿÿh¸h h€hÔ« èÜ“ÿÿh¸h h€hÌ« èÈ“ÿÿƒÄ èÐ7é«#ÌÌÌÌÌÌÌÌÌÌÌèk×ÿÿPèuÌÿÿè°×ÿÿPèjÌÿÿèå×ÿÿPè_Ìÿÿhð h€h°¬ è{“ÿÿhð h€h¤¬ èg“ÿÿèò×ÿÿPè,ÌÿÿèÙÿÿPè!Ìÿÿè ØÿÿPèÌÿÿhüŠ h€h˜¬ è2“ÿÿhèŠ h€hD… è“ÿÿƒÄHèæØÿÿPèàËÿÿht… h€h`Š èü’ÿÿht… h€h¬ èè’ÿÿht… h€hˆ¬ èÔ’ÿÿèÿØÿÿPè™ËÿÿèÔØÿÿPèŽËÿÿh… h€h€¬ 誒ÿÿh… h€hx¬ è–’ÿÿƒÄHè®×ÿÿPèXËÿÿè³×ÿÿPèMËÿÿèØÿÿPèBËÿÿè ØÿÿPè7ËÿÿƒÄÃÌÌÌSUVW3ÿ9|$tZ‹l$UèŠÓÿÿ‹ðƒÄƒþvhÔ¬ jbh¼¬ è_ûÿƒÄ ‹D$V]SPèÝV‹øƒÄ ;þt_^]ƒÈÿ[Ã…ÿ~VSƒÅ UèÏÄƒÄ ‹Ç_^][ÃÌÌÌS‹\$ 3À…Ût:VW‹|$WèÓÿÿ‹ðƒÄƒþvhè¬ jth¼¬ èîûÿƒÄ VƒÇWSè VƒÄ _^[ÃÌÌÌÌÌÌÌÌÌ‹D$VP襋ðƒÄþ¥(tAFû=¡wS¶ˆ¼‰ÿ$¬‰¸%^ø^ÆWþÿÿ=èw*¶tŠÿ$•`Џ¥^ø©^ø­^ø^ÃVè³–ÿÿƒÄ…Àtƒxu3öPè.,ƒÄ‹Æ^ÃII‰€‰B‰‡‰‹ÿr‰y‰k‰€‰‡‰ÌÌÌ‹D$‹‹AÃÌÌÌÌÌÌ‹D$‹L$‰ATÃÌÌÌÌ‹D$‹@XÃÌÌÌÌÌÌÌÌ‹D$‹‹ÃÌÌÌÌÌÌÌ‹D$‹L$ HÃÌÌÌÌ‹L$‹D$÷Ñ!HÃÌÌ‹D$‹@#D$ÃÌÌÌÌ‹D$‹L$ H\ÃÌÌÌÌ‹L$‹D$÷Ñ!H\ÃÌÌ‹D$‹@\#D$ÃÌÌÌÌ‹L$‹‹B$…Àt‰L$ÿà÷Bt ‰L$é›üÿÿƒÈÿÃÌÌÌÌÌÌÌ‹L$‹‹B(…Àt‰L$ÿà÷Bt ‰L$éûûÿÿƒÈÿÃÌÌÌÌÌÌ̸ ¯ÃÌÌÌÌÌÌÌÌÌÌVWhµh­ hô誕ûÿ‹ð3ÿƒÄ ;÷u_3À^ÃFP‰>‰~‰~‰~ ÇF‰~‰~(ÇF,èr¨ÿÿ‹D$ƒÄ‰x ‰x‰p _¸^ÃÌÌÌÌÌÌÌÌÌÌV‹t$…öu3À^ËF ƒÀPègªÿÿ‹N hôQèé—ûÿ‹V RèЖûÿƒÄÇF ÇF ÇF¸^Ã̸èÆ¿…ÿv\¶FŠŠVˆD$¶FˆD$GÿÁè@SëIƒèŠÙŠÊŠÓ¶\$ˆ\$¶\$ˆ\$¶\$ˆ\$uÚˆŠL$ˆVŠT$ˆNˆV[YÃÌÌÌÌ‹D$S‹X ‹C‹H‹Uk Jù‡‚VWjPUèr¨ÿÿ‹U‹B‹M PQèÒ`ÿÿ‹U‹B‹M ‹PQD0Pè¿‹M‹‹yt0è*ÿÿÿ‹E‹H j4h ­ U赨ÿÿ‹jD0PU趨ÿÿ‹M‹QƒÄ8_ÇC(ÇC,^][ÃÌÌÌÌÌÌÌ̸D覾¡Àç3ĉD$@‹D$HSU‹h ‹E‹M‹P+M]Ò;ÊŒVWjPSè®§ÿÿ‹‹H‹UQ‹K D*0PQèÙ¾‹‹z‹s èzþÿÿ‹‹HMj4h ­ Sè¨ÿÿjT$8RSè¨ÿÿ‹‹X‹u‹ËƒÄ0T$t.0ƒùr‹;uƒéƒÂƒÆƒùsì…ÉtC¶¶:+Çu1ƒùv4¶F¶z+Çu ƒùv#¶F¶z+Çuƒùv¶F¶J+ÁÁøƒÈë3À‹MÙ3ö‰];Æu=‹E‹Ë‰u,;Át+ÁPT)0RE0Pÿ! ƒÄ ‹M)M_‰u^][‹L$@3Ì蕽ƒÄDÃ_‰u^‹L$H][3Ì轃ÄDËD$V‹p ‹ƒè‹ÐW‹ÈÁéÁêˆN0ˆV1PV4‹ÈR~ÁéWˆN2ˆF3èé¦ÿÿ‹jL00QWèê¦ÿÿ‹‹BƒÄ_ÇF(^ÃÌÌÌÌÌ̸Dèæ¼¡Àç3ĉD$@‹D$HSV‹p ¶F1¶N2¶V3W¶~0Áç ø‹FÁç ù‹H^Áç úT99‚¤UWF4PSèa¦ÿÿjL$ QSèd¦ÿÿ‹‹R‹ÂƒÄL$l>4ƒør‹];u3ƒèƒÁƒÅƒøsë…Àt;Š:]uƒøv/ŠY:]u ƒøv"ŠA:Et]_ÇF^[‹L$@3ÌèH¼ƒÄDÃL:‹ƒÇ‰N ‰VÇF‰>ÇF(]‹L$L_^[3Ì較ÄDÃÌÌÌÌÌÌ̸èÖ»ƒ|$ Ç$u3ÀYÃU‹l$ V‹u …ö„õƒ}$„ëƒ} „áS‹\$…ÛŽºWƒ~(t`‹>+~;û~‹û‹F‹T$WL00QRèî»~‹F|$|$(ƒÄ +ß9u+‹N ‹F3ÿ+Á‰~tP‰D10PN0Qÿ! ƒÄ ë‰>‰~(…ÛtM‹¸Ä+ÁP‹E$T10RPè^ÓþÿƒÄ …À~.ƒ~,u UèIüÿÿƒÄƒ~,u UèúýÿÿƒÄƒ~~…ÛIÿÿÿ_jUèÐÒþÿUèúØþÿ‹D$ƒÄ [^]YÃ^3À]YÃÌÌÌÌÌÌÌ̸覺‹D$…ÀŽU‹l$ V‹u ‰D$…ö„ƒ}$„ƒ} „ ƒ~,t UèûÿÿƒÄSWjUèXÒþÿ‹>+~ƒÄƒ~(t.…ÿ~*‹F‹U$WL00QRèDÓþÿ‹ØƒÄ …ÛŽ—^+ûƒ~(uÒ‹3À‰F(;Nu ljF‹\$…Û„‹‹‹|$ 8úv¿+øWL00SQèYº>‹)|$,៎ ‰\$=r UèiüÿÿƒÄƒ|$ KÿÿÿjUè£ÑþÿUèÍ×þÿ‹D$ƒÄ _[^]YÃUèº×þÿjUè’ÑþÿƒÄ …Àu‰F_‹Ã[^]YÃ_[^3À]YÃ^3À]YÃÌÌS‹\$U‹l$V‹s EÿW¿ƒøow'¶€è”ÿ$…Ä”3À‰‰F‰F‰F ‰~‰F‰F(‰~,‹L$ ‹T$‹C$QRUPè‰ÔþÿƒÄ‹ø‹Ç_^][Ã~~óëØƒ~(tÒ‹>+~…ÿâëǃ~(uSèˆûÿÿƒÄƒ~(t‹F(…Àuü‰~ÇÇF‰~ë–jSè«Ðþÿ‹L$(‹T$$‹C$QRUPèÔþÿS‹øè¿ÖþÿƒÄ‹Ç_^][Ë~‹Ç_^][ËL$ jQƒÆVè«¡ÿÿƒÄ ‰{ ‹Ç_^][Ã{ t‹V‹D$ ‰‹Ç_^][Ã3ÿ‹Ç_^][ÃIÊ“”{” ””M”…”¢”ã“ÌÌÌÌÌÌÌ̸tè–·¡Àç3ĉD$pSUV‹´$„‹F 3Û3í‰\$ ƒ8‰\$ u‰‹H‹Q‰T$‹@‹‰L$ëÇ‹P‹J‰L$‹P‹‰D$èxÓÿÿ‰D$;Ãu)jwh`­ jAjojè>dÿÿƒÄ^]3À[‹L$p3Ìè6·ƒÄtÃW‹~‹Q‰|$0è·ÿÿƒÄƒø„ƃøt„“=˜tthQh`­ jvjojèæcÿÿ‹ƒÄ…ÀujPT$4hÀ0 Rè<Ìþÿë PD$4jPPèíƒÄ L$0QhX­ jè©eÿÿ‹T$$RèOØÿÿƒÄ_^]3À[‹L$p3Ìè–¶ƒÄtËD$‹N‰D$(‹A…À„·‹ƒùt5ƒù…§‹P‹B‰D$‰D$è.Žþÿ‰D$…ÀuFh h`­ jA釋P‹J‰L$‰L$‹@‹PL$ Qjè…‹þÿƒÄ ‰D$…ÀuPhûéK‹G‹HQ蔎ÿÿPè^mþÿ‹ðƒÄ…ö„?jVè9þÿ‹T$VRè^“þÿƒÄ…À„!Vè !þÿƒÄ‹D$ PL$,QT$Rè†þÿƒÄ …Àu héà‹D$Pè»:ƒÄ…À…²‹L$QèfÆ‹øWèŽþÿ‹ðƒÄ…öuh*h`­ jé¦Wè>ÆPVè‡þÿƒÄ …Àu Vè þÿh0h`­ jjojè%bÿÿƒÄë~‹T$RèÖ’þÿjjjPVWèxþÿƒÄV…Àu èËþÿh7ë¿‹D$Pèê’þÿƒÄV…Àu è­þÿh=ë¡è¡þÿƒÄ‹L$‹T$Qh˜RéÊhïh`­ jrjojè¥aÿÿƒÄ‹D$…Àt PèÔŒþÿƒÄ‹D$Pè7ÖÿÿƒÄ_^]3À[‹L$p3Ìè~´ƒÄtËD$€80…—‹L$ hp‰h ‰QPèI‹ØƒÄ…Ûu h”é¥Sè„;ÿÿƒÄƒøt h˜éjSèz;ÿÿjS‹øèp;ÿÿƒÄƒ?u Ç‹Ïë‹L$,‹Qƒ:uÇ‹Iƒ8t h®éE‹xë4h©é6‹D$ PL$Qjèè‹øƒÄ …ÿu h´é‹V‹J…É„ÿƒ9…ö‹A‹@‰D$‰D$‹I‹PT$ Rjèæýÿ‹èƒÄ …íu hÀéÈjWèÕ0ƒÄ‰E…ÀuhÅh`­ jpé¬èõùüÿ‰E…ÀuhÊh`­ jAéèhýÿ‹ð‰t$$…öuhÎh`­ jAër‹E ‹M‹UVP‹EQRPè ÷üÿƒÄ…ÀuhÕh`­ jqëG‹L$UjtQèøÒÿÿVèrýÿƒÄ…Ûthp‰Sèp<ÿÿƒÄéÀWèRçƒÄé²hºh`­ jrjojè…_ÿÿ‹T$8ƒÄRè(ýÿhp‰Sè-<ÿÿUèçáýÿ‹D$(Pè ÔÿÿƒÄ_^]3À[‹L$p3ÌèT²ƒÄtËT$ ‹L$RD$ Pj‰L$(è<ÐýÿƒÄ …Àu-h‚h`­ jrjojè_ÿÿƒÄ_^]3À[‹L$p3Ì貃ÄtËL$PjQèÒÿÿƒÄ ‹Œ$€‹D$_^][3ÌèݱƒÄtÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ƒèt4ƒèth²h`­ jujpjè^ÿÿƒÄ3ÀËD$‹H ÇÇËD$ÇÃÌÌÌÌÌÌÌ̸èF±UVW3öjt‰t$èv„ÿÿ‹K‹T$$‰‹B VPèäýÿhËèh`­ UèA†ûÿ‹øƒÄ…ÿu$hÄh`­ jAh‡jè^ÿÿƒÄ_^3À]ƒÄËT$ ‹B L$QP‰|$è®ãýÿƒÄè9‰D$…ÀuphÊh`­ jAh‡jèÆ]ÿÿƒÄWè}‡ûÿƒÄ‹î‹D$…Àt Pèª4ƒÄ‹|$ …ít Uè™4ƒÄ…öt VèÜìƒÄ…ÿthp‰Wè::ÿÿƒÄ_^3À]ƒÄÃUWPè3ƒÄ …Àu hÎé|ÿÿÿWè‡ûÿ‹L$$‹Q ‹BjPèÝ,‹èƒÄ …íu hÕh`­ jsh‡jè]ÿÿƒÄé\ÿÿÿ‹ƒø‡¬ÿ$…П‹K ƒÁQh UèFƒÄ …Àu hàh`­ jAh‡jèÑ\ÿÿƒÄéÿÿÿUèÃ3‹S‹B‹L$‰H‹S‹BƒÄ_^Ǹ]ƒÄËK‹Q‹D$‰B‹K‹QÇè 8ÿÿ‹ø…ÿu hòh`­ jAh‡jè_\ÿÿƒÄé´þÿÿè’ë‹ð…öuhöëÓ‹D$ ‹H ‹QjRèÓ+ƒÄ‰F…Àu hûh`­ jsh‡jè\ÿÿƒÄéfþÿÿVWÇèL5ÿÿƒÄ…Àu héyÿÿÿè&ë‹ð…öu hédÿÿÿVW‰nÇè5ÿÿƒÄ…Àu h h`­ jAh‡jè§[ÿÿƒÄé þÿÿèºä‹K ‰A‹S ƒzu hh`­ jAh‡jès[ÿÿƒÄéâýÿÿ‹Â‹@PƒÀPh@‰WèöCƒÄ…À…àh뾋K‹QÇèÃ6ÿÿ‹ø‰|$ …ÿu h$é;þÿÿèZê‹ð…öu h(é&þÿÿ‹D$VW‰FÇèF4ÿÿƒÄ…Àu h/ésþÿÿè ê‹ð…öu h4é^þÿÿVW‰nÇè4ÿÿƒÄ…Àu h;éõþÿÿèÊã‹K ‰A‹S ƒzu hAé ÿÿÿ‹Â‹@PƒÀPh@‰WèCƒÄ…Àu hIéåþÿÿhp‰Wè 7ÿÿƒÄ_^¸]ƒÄÃÜž…¸ è­UW‹{ ÇD$‰|$ …ÿ„W辋èƒÄ…í„ÿ‹Fƒ8t ‹P誃Äh˜è €ÿÿ‹N‰‹VƒÄƒzt‹Â‹HQè!é‹VƒÄÇBèÿè‹N‰A‹Vƒzuhzh`­ jAé UèFƒÄ…Àt0UèÜþÿƒÄ…Àt#‹N‹QPÇè“ÿÿ‹N‹QƒÄ‰BéÜjWèŠþÿ‹èƒÄ…íuh‰h`­ jéAhŒh`­ Uè@ûÿ‹øƒÄ …ÿuhŽh`­ jAé‹L$ D$PQ‰|$è3þÿƒÄ…Àu)h”h`­ jh„jèäXÿÿWèž‚ûÿƒÄ_3À]ƒÄ ËV‹BÇèâ3‹N‹Q‰B‹F‹Hƒyuhœh`­ j 믋ЋB‹HUWQè?.WèI‚ûÿƒÄ‹S Rè}¼‹K ‹øƒÈPQ讉þÿ‹S jRèã}þÿƒÄ‰D$ …Àu-‹C WP莉þÿh¯h`­ jh„jè6XÿÿƒÄ_3À]ƒÄ Ãh²h`­ Pè+€ûÿ‹èƒÄ …íu-‹K WQèH‰þÿh¶h`­ jAh„jèðWÿÿƒÄ_3À]ƒÄ ËC T$RP‰l$èS}þÿƒÄW…Àu2‹K Qè‰þÿh½h`­ jh„jèªWÿÿUèdûÿƒÄ _3À]ƒÄ ËS RèЈþÿƒÄƒ>thÖh`­ jsëBè•à‹N ‰A‹V ƒzt"‹D$ P‹Ê‹QURè-ƒÄ …Àt ÇD$ëhÍh`­ jAh„jè,WÿÿƒÄ‹D$ PUèîûÿUèØ€ûÿ‹D$ƒÄ _]ƒÄ Ãhfh`­ jgh„jèóVÿÿƒÄ_3À]ƒÄ ÃÌÌÌÌÌÌÌÌ‹D$‹H‰L$éàЋT$‹B‰D$éðÌ‹T$‹B‰D$é°Ê‹L$‹Q‰T$éÀЋL$‹Q‰T$éàЋD$‹L$PƒÁQèþЃÄ÷ØÀ÷ØÃÌÌÌÌ‹D$‹L$‹T$ P‹D$ Q‹L$ RPƒÁQèÕƒÄ÷ØÀ÷ØÃÌÌÌÌÌ‹D$‹L$‹T$ P‹D$ Q‹L$ RPƒÁQèßÖƒÄ÷ØÀ÷ØÃÌÌÌÌÌ‹D$‹L$‹T$ P‹D$ Q‹L$ RPƒÁQè?ÕƒÄ÷ØÀ÷ØÃÌÌÌÌÌVèêG‹ð…öuhgh`­ jAjqjè¿UÿÿƒÄ3À^ËN‹D$ jQ‰è÷#ƒÄ…Àu"hlh`­ jAjqjè‹UÿÿVè¥GƒÄ3À^Ãè¹ä‹V‰B‹FƒxuhqëÈ‹N S‹\$ Ç‹Rè½ÅÿÿƒÄƒøtSƒøtt1=˜t#h™h`­ jvjqjè$UÿÿVè>GƒÄ[3À^ÃèÑúÿÿë S‹Þè—öÿÿƒÄ…ÀupVèGƒÄ[3À^Ã>u ‹F Çjèýzÿÿ‹N‰‹V‹BÇ‹N ƒÁQh "SèZ>ƒÄ…Àu#h€h`­ jAjqjèžTÿÿVè¸FƒÄ[3À^ËV ‹J¸è`§Ùî‹Ý$‹IPQè/HÿÿƒÄ[‹Æ^ÃÌÌÌÌÌÌÌ‹D$jPètþÿÿƒÄødè&§¡Àç3ĉD$`S‹\$xU‹¬$€V‹t$tW‹|$|Vè¾ÿÿƒÄ‰D$…Àt‹ 8 D$PQè‚0ÿÿƒÄƒøÿuejYhx­ jyjtjèèSÿÿƒÄ…öujPT$$hÀ0 Rè@¼þÿë VD$$jPPèñ ƒÄ L$ QhX­ jè­UÿÿƒÄ _^]3À[‹L$`3Ì褦ƒÄdÃ…ÿu3öë‹´$€ƒþÿu‹ÏqŠA„Òuù+΋ñ‹8 PRèÄ-ÿÿ‹Œ$”‹PQ‹HR‹P QSVWUÿÒƒÄ$…Àu*jehx­ jxjtjè2SÿÿƒÄ_^]3À[‹L$`3Ìè)¦ƒÄdËL$p_^][3̸覃ÄdÃÌ̃=8 uh»èÍ*ÿÿƒÄ£8 jyhx­ jèçzûÿƒÄ …Àujzhx­ jAjsjè¾RÿÿƒÄ3ÀËL$‹T$‰‹L$ ‰P‹T$P‰H‰P ¡8 Pèá+ÿÿƒÄ¸ÃÌÌÌÌÌÌÌÌ¡8 hà#Pè0/ÿÿƒÄÇ8 ÃÌ̸œè6¥¡Àç3ĉ„$˜‹„$ ‹Œ$°S‹œ$¸‰D$$‹„$°U‹¬$¬‰L$…À„Zƒ8…Qƒx„G‹@‹PV‰T$0‹PL$4QjèV=‹ðƒÄ …öu/j}hì­ jrjujèËQÿÿƒÄ^]3À[‹Œ$˜3ÌèÀ¤ĜËF…Àu ÇD$ ë Pè× ƒÄ‰D$ ‹‹P‹W‰T$,‰D$(…íu3ÿë#‹¼$¸ƒÿÿu‹ÅP¤$Š@„Éuù+‹øL$Qè[ŒÿÿjT$SRè^ÿÿWD$(UPèâÿÿ‹L$D‹T$HQRD$8PèÎÿÿVèØ<jŒ$˜QT$HRèÄÿÿ‹t$HƒÄ8ƒþ_~FN›jD$SPèÿÿSè )PL$xQT$(Rè}ÿÿj„$„PL$4QèyÿÿƒÄ(ƒîuÁT$Rèçÿÿ‹t$$VèÍ(ƒÄƒø@~h´­ h•hì­ èAoûÿƒÄ Vè¨(PD$lPL$PQèÊ£Vè"þÿƒÄƒø~h­ h—hì­ èoûÿƒÄ Vèý€þÿƒÄPVèó€þÿT$|+ЃÄRD$ƒù} ƒû(ƒ³ ‰…ÿt&‹T$ÉÉÉQRèjýÿƒÄ…À„H‹D$‹T$XëË3ö…ÿ„À‹T$Rè^àüÿ‹ÈƒÁ¸“$I’÷éÑÁú‹úÁïúƒÄ;|$ ~5D$,;èt UèqûÿƒÄh¹G h4® P‰D$,èUoûÿ‹èƒÄ …í„Ñ…ÿtd$‹L$h€QOè ýÿˆ.ƒÄF…ÿuå‹T$X‹D$‹L$(…Ét?<;|$PêN…ö~IŠ.€Ë€ˆN@…öñŠ]ˆ@ëŠË€áˆ .ÁëF…Ûuðë¹ƉD$…ÒëýÿÿT$,;êt UèjpûÿƒÄ‹D$…Àt PèùßüÿƒÄ‹D$[^_]‹L$43Ì莙ƒÄ8Ãj}h4® hƒjdj èjFÿÿƒÄD$,;èt UèpûÿƒÄ‹D$…Àt Pè¨ßüÿƒÄ[^_3À]‹L$43Ìè?™ƒÄ8Ãh‹h4® h‚ë¬h£h4® h“ë›hÏh4® jkëjmh4® jzjdj èîEÿÿ‹L$XƒÄ[^_]3Ì3Àè嘃Ä8ÃÌÌÌÌÌÌ‹D$ ‹L$‹T$jPQRè rÿÿƒÄÃÌÌÌÌÌ̸X膘¡Àç3ĉD$TU‹l$`VW‹|$l‰l$ t$…ÿ„½ƒ„³SjW‹ÆjPPè¸qÿÿ‹ØƒÄƒûO~Chõkh4® Uè[mûÿ‹ðƒÄ …öu[_^ƒÈÿ]‹L$T3Ìè;˜ƒÄXÃjWUVèrqÿÿ‹l$ ƒÄ…Û#j hP® Uèú°þÿƒÄ [_^]‹L$T3Ì蘃ÄXÃSVUèܰþÿL$ ƒÄ ;ñt Vè›nûÿƒÄ‹Ã[_^]‹L$T3ÌèÒ—ƒÄXÃjhÀ0 U覰þÿ‹L$lƒÄ _^]3Ìè°—ƒÄXÃÌhNh4® jèŸlûÿ3ÉƒÄ ;ÁuhQh4® jAj{j èqDÿÿƒÄ3ÀÉH ‰H‰H‰‰HÇ@ÃÌÌÌÌÌV‹t$…öteöFt,‹…Àt PèõmûÿƒÄ‹F…Àt PèåmûÿƒÄÇFÇöFt‹F…Àt PèÂmûÿƒÄÇFÇF öFt Vè¥mûÿƒÄ^øè¶–‹T$ ‹D$(‹L$,‰T$‰$‹D$‰L$‹L$$$R‰D$ ‰L$ÇD$ ènvÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌU‹l$V…ít ‹u…ötöFuèÔþÿÿ‹ð…öu^]ËD$S‹‹FW‹|$…Àt9~ }j…Àt Pè mûÿƒÄ‹Ç…ÿu¸h4h4® Pè;kûÿƒNƒÄ ‰F…Àu4hDh4® jAhÄj èCÿÿƒÄ…ít9ut Vè£þÿÿƒÄ_[^3À]ËNWSQè@–ƒÄ ߉~ ÇÇF…ít‰u‹T$_‰[‹Æ^]ÃÌÌÌÌ̸ 膕‹L$V‹t$‹QT$R‰D$ D$ PL$QT$(R轃ĄÀy¸fë ƒ|$t&¸thh4® Ph“j èLBÿÿƒÄ3À^ƒÄ ËD$‹T$PL$QRèžþÿÿƒÄ …Àt‹L$‰^ƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌé»ÌÌÌÌÌÌÌÌÌÌÌ‹T$…Òu3ÀÃSW‹:…ÿ~x‹Z öÃtƒãëm‹JD9ÿ€8uOH…ÿõ¶D9ÿ¨uP¨t»ëG¨t»ë<¨t»ë1¨t»ë&¨ t»ë¨@t»ë$€¾Ø÷ÛÛƒãë3ÛU‹l$G‰D$…ít-V‹uˆ‹BWPFVè³”ƒÄ ÷…ÿ~ €Êÿ‹ËÒâ Vÿ‹D$‰u^]_[ÃÌÌSUVW‹|$3öƒÿ}¸˜ëd‹D$…Àt‹0…öuj赋ðƒÄ…öty‹D$‹(¶E‹N ‰D$ƒàƒáø Á‹×ƒÈEOƒú‰F ~sh“h\® WèÔhûÿ‹ØƒÄ …Ûu?¸Ah¨h\® Ph½j èŸ@ÿÿƒÄ…öt‹D$…Àt90t V膃Ä_^]3À[ÃWUSèÖ“‹L$( ÿÒàƒÄ D;ÿïë3Û‹F‰>…Àt PèjûÿƒÄ‹D$‰^ÇF…Àt‰0‹L$_‹Æ^‰)][ÃÌÌÌÌÌÌÌÌÌÌÌÌSU‹l$V‹t$‹Æ™ƒâÂW‹øƒæ¹+θÓàÁÿ‹Ø‰D$÷Ó…íu‰l$‹Å‹t$…ötq‹ƒf ðO;Ñ| ƒ~…†…í„£‹F…ÀuhÃh\® Qè¶gûÿƒÄ ëhÇh\® QRPèŸhûÿƒÄ‹è…íu"hÊh\® jAh·j èn?ÿÿƒÄ_^]3À[Ë‹Ï+ÈA…É~QÅjPè¶’ƒÄ G‰‹D$‰n‹V": : ؈ƒ>~‹N‹€|ÿuH‰…Àð_^]¸[ËL$V‹t$ ‹Æ™ƒâÂÁøW…Ét/P9|(‹y…ÿt!Šƒæ¹+κÓâ_^„и•ÀÃ_3À^ÃÌÌÌ‹D$ƒxt3ÀÃS‹VW‹x3Àƒû Œ3öƒþuŠ 8€ùZtz€ù+tu€ù-tpŠ 8€ù0Œà€ù9×¾É@ƒé0;ÃÈŠ8€ú0Œ¼€ú9³¾Ò@;à ‰LJР; µH¯Œ“; µh¯†FƒþŒyÿÿÿŠ 8€ùZu@3É;ÔÁ_^[‹ÁÀù+t€ù-ué@H;ËT3öŠ 8€ù0|J€ù9EŠT8¾É@ƒé0€ú0|5€ú90¾Ò ‰LJÐ;Ž`¯|;Ž€¯ƒÆ@ƒþ|»3É;ÔÁ_^[‹ÁÃ_^3À[ÃÌÌÌÌ̸èfSW‹|$ ‹ÇÇD$ PIŠ@„Éuù+‹ØD$P‰\$ ‰|$è“þÿÿƒÄ…Àt2V‹t$ …ötSWVèëƒÄ …Àu^_[ƒÄÃÇF^_¸[ƒÄÃ_3À[ƒÄÃÌ̸$èæW‹|$,…ÿuj見øƒÄ…ÿu_ƒÄ$ÃVD$PL$8Qè8ˆûÿ‹ðƒÄ…öu^_ƒÄ$ÃS‹_…Ûtƒ?sQhÎh”® jè»dûÿ‹ØƒÄ …Ûu$hÑh”® jAh»j èŠ<ÿÿƒÄ[^3À_ƒÄ$ËG…Àt Pè1fûÿƒÄ‰_‹‹F‹NR‹V P‹FQR@P‹F™¹d÷ùRhx® jSèîêþÿ‹ÃƒÄ$P›Š@„Éuù+Â[‰^ÇG‹Ç_ƒÄ$ÃÌÌÌÌ̸$èæŽV‹t$,‹FŠP €úZu3Éë/¶H W¶x ‰ O¶x¶@ I O ‰ŒH0‚ÿÿ_€ú-u÷Ù‹ÁÁà+ÁÀÀ™)D$0L$QT$8T$4Rè‡ûÿ‹N¶¶q’”VðýÿÿƒÄƒú2}ƒÂd‹p;Ö}ƒÈÿ^ƒÄ$Ã~ ¸^ƒÄ$öQ¶q’”Vïýÿÿ‹p;Ö|ÓÛ¶Q¶q’”Vðýÿÿ‹p ;Ö|¸À¶Q¶q’”Vðýÿÿ‹p;Ö|¥¶Q¶q ’”Vðýÿÿ‹p;Ö|‚жQ ¶I ‹’ŒQðýÿÿ;ÈŒdÿÿÿ3Ò;ÈŸÂ^‹ÂƒÄ$ËD$ƒxt3ÀÃS‹VW‹x3Àƒû ŒB3öƒþuŠ 8€ùZtz€ù+tu€ù-tpŠ 8€ù0Œ€ù9¾É@ƒé0;Ê8€ú0Œù€ú9ð¾Ò@;à ‰LJÐÝ; µˆ¯ŒÐ; µ¬¯ÃFƒþŒyÿÿÿ€<8.u2@;ÃªŠ 8€ù0‹ÐŒœ€ù9;à ŠL8@€ù0}í;Ð„Š 8€ùZu@3É;ÔÁ_^[‹ÁÀù+t€ù-ué@H;ËY3öëIŠ 8€ù0|J€ù9EŠT8¾É@ƒé0€ú0|5€ú90¾Ò ‰LJÐ;ޤ¯|;ŽÈ¯ƒÆ@ƒþ|»3É;ÔÁ_^[‹ÁÃ_^3À[ÃÌÌÌÌÌÌÌ̸è6ŒSW‹|$ ‹ÇÇD$ PIŠ@„Éuù+‹ØD$P‰\$ ‰|$èSþÿÿƒÄ…Àt2V‹t$ …ötSWVè»ƒÄ …Àu^_[ƒÄÃÇF^_¸[ƒÄÃ_3À[ƒÄÃÌ̸$è¶‹W‹|$,…ÿujèv‹øƒÄ…ÿu_ƒÄ$ÃVD$PL$8Qè„ûÿ‹ðƒÄ…öu^_ƒÄ$ÃS‹_…Ûtƒ?sQhâhÈ® jè‹`ûÿ‹ØƒÄ …Ûu$hæhÈ® jAh¹j èZ8ÿÿƒÄ[^3À_ƒÄ$ËG…Àt PèbûÿƒÄ‰_‹‹F‹NR‹V P‹FQ‹NR@PÁlQh¬® jSèÀæþÿ‹ÃƒÄ$PŠ@„Éuù+Â[‰^ÇG‹Ç_ƒÄ$ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ¸ì® ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hì® PQRè×»ƒÄÃÌÌÌ‹D$‹L$hì® PQè¤ƒÄ ÃÌÌÌÌÌÌÌÌhì® èÆ”ƒÄÃÌÌ‹D$hì® PèQ˜ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸$è6Š$PL$0Q訂ûÿƒÄ…Àu!jmh¯ h­h¯j è)7ÿÿƒÄ3ÀƒÄ$Ë@ƒø2|"=–}‹T$0‹D$,‹L$(RPQèíùÿÿƒÄ ƒÄ$ËT$0‹D$,‹L$(RPQèþÿÿƒÄ ƒÄ$ÃÌÌÌÌÌÌÌÌÌÌÌ‹L$‹Aƒøu ‰L$éëûÿÿƒøu ‰L$éí÷ÿÿ3ÀÃÌÌÌÌÌÌÌÌÌÌS‹\$‹CƒøuSè½ûÿÿë ƒøu SèÀ÷ÿÿƒÄ…Àu3À[ÃV‹t$W…öt‹>…ÿuèËø…ÿt;…öt‰>ƒ{u‹‹KPQWèñ ƒÄ ÷ØÀ#Ç_^[˃ÂRjWèÖ ƒÄ …Àu_^3À[Ë3‹CU‹oƒÆ€85Vrh$¯ ëh ¯ Uèežþÿ‹KƒÄ VQUè—žþÿƒÄ ]‹Ç_^[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‹QV‹pæâ;òt 3À…ö”À^DÿÃQPèÍ ƒÄ…öt÷Ø^ÃÌÌSVW‹|$3ö2Û…ÿ„ö‹W…Ò„ë‹U‹oå…Éu ÇD$ëA¶‰L$…íu ƒø~-2Ûë$=€u ¸;È~‹ÿ€<u@;Á|õë€Ëÿ¾t$‹T$…Òu ‹D$]_^[Ë …ötˆA‹7…öu‹D$]_^Æ[ËG…íuVPQè<ˆ‹T$$‹D$ ƒÄ ]_^[À|0ÿD0ÿL1ÿu ÆHIN€8tõŠöÓþÈNIH…ö~ ŠöÓˆNIH…öó‹D$]_^[Ã_^3À[Ã̸èV‡UV‹t$…öt‹.…íujè ‹èƒÄ…íu^]ƒÄÃÇE‹D$S‹W‹|$$hÇW ;h(¯ R‰L$ è3\ûÿƒÄ ‰D$…Àu:hh(¯ jAhÂj è4ÿÿƒÄ…ít…öt9.t Uèë ƒÄ_[^3À]ƒÄÃ…ÿu ÇEëPö€„™ÇE€;ÿuƒÿtCO€|;ÿ‹T$D;ÿ‹÷L:ÿu…ötÆHIN€8tñ…öu@ÆÆ:G‹t$‹E…Àt Pè4]ûÿƒÄ‹D$‰E‰}…öt‰.‹L$‹T$ _[^‹Å‰ ]ƒÄÊöÒþˆNIH…ö~¹ŠöÒˆNIH…öóëªÇE€;uƒÿtCOWSPèv†ƒÄ ëŽÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸ èÖ…U‹l$V…ít‹u…öujèŽ ‹ðƒÄ…öu^]ƒÄ ÃÇF‹D$‹‹T$ WRD$P‰L$$L$QT$RD$,Pèß ƒÄ„Ày¸fë1ƒ|$t¸së#‹L$ h1Ah(¯ Qè~Zûÿ‹øƒÄ …ÿu>¸AhJh(¯ Ph–j èI2ÿÿƒÄ…öt…ít9ut Vè3 ƒÄ_^3À]ƒÄ ÃÇF‹D$ …Àt+‹L$€9uƒøt AH‰L$‰D$ PQWèZ…‹T$ƒÄ T$‹F…Àt Pè [ûÿƒÄ‰~‹D$ ‰…ít‰u‹L$‹T$ _‹Æ^‰ ]ƒÄ ÃÌÌÌÌÌÌÌÌÌ̸ 膄¡Àç3ĉD$V‹t$ƒ>ÇF}2‹F…Àt Pè=[ûÿƒÄh\h(¯ jèyYûÿƒÄ ‰F…Àt3ɉˆHƒ~u*hah(¯ jAjvj è=1ÿÿƒÄ3À^‹L$3Ìè7„ƒÄ ËL$…É} ÷ÙÇF3ÀëI…Ét ˆL@Áùƒørï3ɃÀÿxS¤$Š\‹VˆAƒèyð[‰‹L$ ^3̸è׃ƒÄ ÃÌÌÌÌÌÌÌÌ‹L$W3ÿ3À…Éu_ËQúu¿‹ƒúV‹q…öu^3À_ÃútçƒÈÿ_Ã3É…Ò~S¶ÁàA Ã;Ê|ò[…ÿt÷Ø^_ÃÌÌÌÌS‹\$ VW…ÛujèþƒÄ‹ðë‹ó…öuh h(¯ j:ë[‹|$‹G ÷ØÀ%ƒÀW‰FèçÈüÿƒÄ…Àt ™ƒâÂÁø@ƒÀ9}L‹Nhªh(¯ PQè{XûÿƒÄ…Àu.h­h(¯ jAh‹j èÌ/ÿÿƒÄ;ót V迃Ä_^3À[ÉF‹VRWè¹ÍüÿƒÄ‰…Àu ‹FÆÇ_‹Æ^[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$VW‹|$ ‹‹WPQRè‰Ìüÿ‹ðƒÄ …öuhÄh(¯ jijwj èK/ÿÿƒÄ_‹Æ^Ãu jVèbÐüÿƒÄ‹Æ_^ÃÌÌÌÌÌÌÌÌÌÌéÛ ÌÌÌÌÌÌÌÌÌÌÌé;ÌÌÌÌÌÌÌÌÌÌÌ‹T$VW3ÿ3ö…ÒƒÊÿ‹L$ …É„šŠ„À„S‹ÚJ…Ûtr¶ÀAƒøa|ƒøz~UƒøA|ƒøZ~Kƒø tFƒø0|ƒø9~<ƒø't7ƒø(t2ƒø)t-ƒø+t(ƒø,t#ƒø-tƒø.tƒø/tƒø:tƒø=t ƒø?t¿„Ày¾Š„Àu‡[…öt_¸^ø…ÿu¸_^ÃÌV‹t$ƒ~t3À^ÃW‹>‹Ç%€yHƒÈü@u-‹N3À…ÿ~ Q‹ÿ€<u€zÿu€:u ƒÀƒÂ;Ç|å;Ç}_3À^ø;ø~I‹VŠˆƒÀA;|ðÆ‹™ƒâÂÁøP‰‹FPè¶þÿÿƒÄ‰F_¸^ÃÌÌÌÌÌÌÌÌ‹D$ƒxuƒ8t3ÀËÃÌÌÌÌÌÌÌÌÌÌÌ‹D$ƒxt%D$jPèꊋL$ ‹T$‹D$‰‹L$ ƒÄ‰AËT$‰‹L$‹D$ ‰AÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$W‹|$…ötWƒÿtRVƒÿu)èâ_ÿÿƒÄ…Àu_3À^ÃP‹D$jPèyÿÿÿƒÄ _¸^Ã詃ąÀt׋L$ PWQèVÿÿÿƒÄ _¸^ËD$ ‰D$ƒxtT$jRè1ŠƒÄ‹D$‰8‹L$_‰q¸^ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$S‹YVW‹x;û‹÷|‹ó‹ ‹Uƒþr‹;uƒîƒÁƒÂƒþsì…ötC¶¶)+Åu1ƒþv4¶B¶i+Åu ƒþv#¶B¶i+Åuƒþv¶B¶I+ÁÁøƒÈë3À]…Àu‹Ç+Ã_^[ÃÌÌ̸èÖ~SV‹t$3Û…öu^3À[ƒÄÃUWVè*ÿÿ‹l$0‹øƒÄƒïxjWVè#ÿÿƒÄPÿÕƒÄ؃ïyç‹|$0WSj見L$4ƒÄ ‰D$…Ʉы‹L$4QWST$0jR‰D$8èڃă|$8„iVè¶ÿÿƒÄƒøŒW‹D$$jzh@¯ V‰D$è•ÿÿÀÀÀƒÄPèFSûÿ‹ØƒÄ …Ûuj}é–V3ÿènÿÿƒÄ…À~9¤$‹L$$T$$RWV‰ ûè]ÿÿƒÄPÿÕ‹D$,+ûV‰DûGè5ÿÿƒÄ ;ø|΋D$$‹L$(‰+D$hÍ‹øjV‰|$(è ÿÿƒÄPSÿ`! hh@¯ Wè²Rûÿ‹øƒÄ‰|$…ÿu%h‘h@¯ jAh¼j è}*ÿÿƒÄ_]^3À[ƒÄÃV‰|$(3íè´ÿÿƒÄ…À~/{‹‹Gü‹L$$RPQè«}‹T$0VEƒÇè‰ÿÿƒÄ;è|Ø‹|$‹D$‹L$PWQè€}WèØSûÿSèÒSûÿ‹D$(ƒÄ_]^[ƒÄÃV3ÿèKÿÿƒÄ…À~$d$T$$RWVèDÿÿƒÄPÿÕVGè'ÿÿƒÄ ;ø|à‹D$$‹L$(‰‹D$_]^[ƒÄÃÌÌÌÌÌÌÌÌÌ̸,è†|‹D$0SUVW…Àt‹…Àt‹Ø‹l$D‹t$H‹M‰L$…öu43Àë3èÿÿ‹Ø…ÛuÞh°h@¯ jAh”j èX)ÿÿƒÄ_^]3À[ƒÄ,Ã1‰D$,+ÁPD$(PL$(QT$4RD$ PèhƒÄ‰D$„ÀˆF‹L$X;L$$t h¾h@¯ jeh”j è÷(ÿÿƒÄé‹T$T;T$ t hÃh@¯ jhh”j èÍ(ÿÿƒÄéò‹L$(‹|$9;T$,v#hÈh@¯ hˆh”j è™(ÿÿƒÄ龃ø!u ‹M+ÏΉL$(9‰T$,;úsa‹t$Lë‹L$(‹D$¨u 3À…ÉžÀëQD$Pèpü‹L$0‹|$ƒÄ‰D$…Àu(QL$QPÿÖƒÄ …Àt/PSèvÿÿƒÄ…ÀtL‹|$;|$,r¥‹D$@…Àt‰‰}_^]‹Ã[ƒÄ,ÃhÚh@¯ jqh”j èæ'ÿÿ‹E‹T$D+ÐRPè–ÿƒÄ…Ût1‹D$@…Àt9t%‹D$P…ÀtPSètÿÿƒÄ_^]3À[ƒÄ,ÃSèÁÿÿƒÄ_^]3À[ƒÄ,ÃÌÌÌ̸èfzW‹|$…ÿu3À_YÃS‹\$VjWÿÓjKƒÀ hX¯ PèmOûÿ‹ðƒÄ…öujMhX¯ jAjoj èB'ÿÿƒÄ^[3À_YÃD$PW‰t$$ÿÓPL$Qj‰t$ ÿT$,V‹øèÔPûÿƒÄ^[‹Ç_YÃÌÌÌÌÌÌÌÌÌ̸èÖy‹D$ Ç$…ÀuYÃV‹t$ VL$QPèT“‹L$ƒÄ …ÉujhhX¯ jAh¿j è´&ÿÿƒÄ3À^YÃVPT$Rj‰L$ 躪‹ð‹D$PèNPûÿƒÄ‹Æ^YÃÌÌÌÌÌ̸4èVySUV3ö‰t$ 3íèfŒþÿ‹Ø;Þu"h¡hp¯ jAjkj èK&ÿÿƒÄ^]ƒÈÿ[ƒÄ4Ãè)'ÿÿW‹Æ+Ńø‰D$E‹ý+þƒÇ>PSèZþÿƒÄ…À„‹K‹T$HWÎQRè.‘þÿƒÄ …À} ƒ|$„ù…À~ð‹{‹Æ+ÅPL$0QT$0RD$RSèxŒþÿƒÄ…ÀtE…ÿ~ ‹C‹L$HWÆPQèLþÿƒÄ …À~7+øð…ÿà‹|$0‹D$ïë›h®hp¯ jAë$h´ëhåhp¯ jAëhîhp¯ hŽjkj èÆ$ÿÿƒÄSèýŠþÿƒÄ_^]ƒÈÿ[ƒÄ4ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èvw‹L$VWD$PQÇD$3öèûýÿÿ‹|$ƒÄ…À|‹L$ ‹WPD$PQ‰T$ÿT$$ƒÄ ‹ð…ÿt W苊þÿƒÄ_‹Æ^ƒÄøèw‹L$VWD$PQÇD$3öè›ýÿÿ‹|$ƒÄ…À|!‹W‹L$QP‹D$$‰T$T$RP訃ċð…ÿt Wè%ŠþÿƒÄ_‹Æ^ƒÄÃÌÌÌÌÌÌÌÌÌÌVè*£þÿPèd•þÿ‹ðƒÄ…öuh‚hp¯ jhÎj è£#ÿÿƒÄ3À^ËD$ WPjjjVèì‘þÿ‹L$$‹T$QVRè<ÿÿÿV‹øèÄþÿƒÄ ‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌÌV躢þÿPèô”þÿ‹ðƒÄ…öujLhp¯ jjmj è9#ÿÿƒÄ3À^ËD$WPjjjVè‚‘þÿ‹L$(‹T$ ‹D$QVRPèmþÿÿV‹øèUþÿƒÄ$‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸èÆuSU‹l$VW3ÛSUÇD$ÿT$$j[‹ðhŒ¯ VèÏJûÿ‹øƒÄ…ÿuj^hŒ¯ jAjtj è¤"ÿÿƒÄ_^]3À[ƒÄÃD$PU‰|$ÿT$$‹l$(VWUèmŽþÿƒÄ;Æt=›…À~+Ø+ðV QUèMŽþÿƒÄ ;ÆuæWèLûÿ‹D$ƒÄ_^][ƒÄÃÇD$WèóKûÿ‹D$ƒÄ_^][ƒÄÃÌÌÌ̸èöt‹D$‹T$UVWPL$Q3ÿR‰|$oèvŽ‹ð‹D$ƒÄ ;Çu"h‘hŒ¯ jAhÀj èÑ!ÿÿƒÄ_^3À]YÃS‹\$VPSèªþÿƒÄ ;Æt8I…À~/ø+ð‹D$V QSè‰þÿƒÄ ;Æuâ‹T$RèHKûÿƒÄ[_^‹Å]YÃ3í‹T$Rè1KûÿƒÄ[_^‹Å]YÃÌÌÌÌÌÌV躠þÿPèô’þÿ‹ðƒÄ…öujJhŒ¯ jjuj è9!ÿÿƒÄ3À^ËD$ WPjjjVè‚þÿ‹L$$‹T$QVRè"þÿÿV‹øèZ‹þÿƒÄ ‹Ç_^ÃÌÌVèZ þÿPè”’þÿ‹ðƒÄ…öujhŒ¯ jhÁj èÖ ÿÿƒÄ3À^ËD$ WPjjjVèþÿ‹L$$‹T$QVRèþÿÿV‹øè÷ŠþÿƒÄ ‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸ èfs¡Àç3ĉD$V‹t$ƒ>ÇF }/‹F…Àt PèJûÿƒÄjQh¨¯ jè\HûÿƒÄ ‰F…Àt3ɉˆHƒ~u'jVh¨¯ jAjpj è# ÿÿƒÄ3À^‹L$3ÌèsƒÄ ËL$…É} ÷ÙÇF 3À…Ét ˆL@Áùƒørï3ɃÀÿxS‹ÿŠ\‹VˆAƒèyð[‰‹L$ ^3̸èÇrƒÄ ÃÌÌÌÌÌÌÌÌ‹L$W3ÿ3À…Éu_ËQú u¿‹ƒúV‹q…öu^3À_Ãú tçƒÈÿ_Ã3É…Ò~S¶ÁàA Ã;Ê|ò[…ÿt÷Ø^_ÃÌÌÌÌS‹\$ VW…Ûuj èîõƒÄ‹ðë‹ó…öuh•h¨¯ j:ë[‹|$‹G ÷ØÀ%ƒÀ W‰Fè×·üÿƒÄ…Àt ™ƒâÂÁø@ƒÀ9}L‹Nhžh¨¯ PQèkGûÿƒÄ…Àu.h¡h¨¯ jAhŠj è¼ÿÿƒÄ;ót Vè¯õƒÄ_^3À[ÉF‹VRW詼üÿƒÄ‰_‹Æ^[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$VW‹|$ ‹‹WPQR艻üÿ‹ðƒÄ …öuh³h¨¯ jijqj èKÿÿƒÄ_‹Æ^à u jVèb¿üÿƒÄ‹Æ_^ÃÌÌÌÌÌÌÌÌÌÌV‹t$ …ö3À^ËT$Š „Éx‹T$¶Éƒá¸‰ ^ÊÁ$à<ÀuKƒþ}¸ÿÿÿÿ^ÊRŠÂ$À<€t¸ýÿÿÿ^öɃá¶ÒÁáƒâ? Êù€s¸üÿÿÿ^ËT$¸‰ ^ÊÁ$ð<àuJƒþ|­ŠB$À<€u¶ŠB$À<€u­¶B¶R¶Éƒà?ƒáÁàƒâ?Áá  Èùr§‹T$¸‰ ^ÊÁ$ø<ðuyƒþŒWÿÿÿŠBr$À<€…YÿÿÿŠB$À<€…LÿÿÿŠR€âÀ:Ð…>ÿÿÿ¶É‹Æ¶ƒâ?ƒáÁâ Áá ʶP@¶@ƒâ?Áâƒà? Ð Êù‚&ÿÿÿ‹T$¸‰ ^ÊÁ$ü<ø…“ƒþŒÒþÿÿŠBr$À<€…ÔþÿÿŠB$À<€…ÇþÿÿŠB$À<€…ºþÿÿŠR€âÀ:Ð…¬þÿÿ¶É‹Æ¶ƒâ?ÁâƒáÁá ʶP@ƒâ?Áâ ʶP@¶@ƒâ?Áâƒà? Ð Êù ‚‡þÿÿ‹T$¸‰ ^ÊÁ$þ<ü…­ƒþŒ3þÿÿŠBr$À<€…5þÿÿŠB$À<€…(þÿÿŠB$À<€…þÿÿŠB$À<€…þÿÿŠR€âÀ:Ð…þÿÿ¶É‹Æ¶ƒâ?ÁâƒáÁá ʶP@ƒâ?Áâ ʶP@ƒâ?Áâ ʶP@¶@ƒâ?Áâƒà? Ð Êù‚Îýÿÿ‹T$¸‰ ^øþÿÿÿ^ÃÌ‹L$…ÉuQ‹D$ =€s…Étˆ¸ËT$…ÒáƒÈÿÃ=s#ƒú|ð…Ét‹ÐÁê€â€ÊÀ$? €ˆˆA¸Ã=s1ƒú|Æ…Ét"‹ÐÁê €â€Êàˆ‹ÐÁê€â?A€Ê€$? €ˆˆA¸Ã= s@ƒú|Ž…Ét1‹ÐÁê€â€Êðˆ‹ÐÁê €â?€Ê€ˆQA‹ÐÁê€â?A€Ê€$? €ˆˆA¸Ã=sSƒúŒCÿÿÿ…Ét@‹ÐÁê€â€Êøˆ‹ÐÁê€â?€Ê€ˆQA‹ÐÁê €â?€Ê€ˆQA‹ÐÁê€â?A€Ê€$? €ˆˆA¸ÃúŒðþÿÿ…ÉtO‹ÐÁê€â€Êüˆ‹ÐÁê€â?€Ê€ˆQA‹ÐÁê€â?€Ê€ˆQA‹ÐÁê €â?€Ê€ˆQA‹ÐÁê€â?A€Ê€$? €ˆˆA¸ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸$è¦lSUVW3ÿD$$P3í‰|$‰|$‰|$‰|$ è´TÿÿƒÄ3Û‹t$<;ßt‹t$@;÷to‹|$Pƒqu‹NQę̀ƒÄ‰në+‹F…Àtƒ8tP貨ƒÄ蚨‰F…À„dÇ‹RèñÔÿÿ‹GPèX?ÿÿƒÄ‰…À„Ì9h „Ô3ÿCƒûŒwÿÿÿ‹t$HW‹|$ûÿƒÄ‹ø9\$„&;û„SL$(UQè”RÿÿƒÄ …À…£hhÀ¯ jhÃj ‰\$$èMÿÿƒÄë hûhÀ¯ h¢hÃj è-ÿÿƒÄ‹ûD$$Pè^Sÿÿ‹D$ƒÄ^;Ãt‹L$QPè×@ûÿ‹T$Rè½?ûÿƒÄ ;ût‹D$PWè»@ûÿWè¥?ûÿƒÄ ‹D$ _][ƒÄ$ÃhhÀ¯ hšë‹T$‹D$RPL$,QèbRÿÿVT$ RD$8WPèQÿÿƒÄ…Àu hé,ÿÿÿ‹t$D‹F;Ãt Pè??ûÿƒÄ‹V ‹L$ƒâøƒÊ‰~‰‰V é8ÿÿÿh hÀ¯ jAéôþÿÿÌS‹\$U‹l$ VWjSÿÕjR‹øhد Wè@=ûÿ‹ðƒÄ…öujThد jAh¸j èÿÿƒÄ_^]3À[ÃD$PS‰t$ÿÕ‹L$ ‹T$,‹D$(jQRPWVèôSÿÿVèž>ûÿƒÄ$_^]¸[Ã̸è¦g‹D$‹T$PL$QRÇD$ è*‹L$ ƒÄ …Éu3ÀYËT$ jR‹T$ R‹T$ RPQè“Sÿÿ‹D$Pè9>ûÿƒÄ¸YÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸è6gD$ PÇD$ÿÿÿÿèTOÿÿ‹L$(‹RèØ?ÿÿPèâ:ÿÿPè,nÿÿƒÄ‰D$…Àu-jYhô¯ h¡h‰j è ÿÿƒÄT$ RèûÿVè=ûÿ‹L$X‹D$P‹‹@QRPL$@Qè1~ÿÿƒÄ(…À2juhô¯ jh‰j è%ÿÿƒÄ_^]‰\$T$[RèPPÿÿ‹D$ƒÄ Ã_^]T$[RÇD$è2Pÿÿ‹D$ƒÄ ÃÌÌÌÌÌÌÌÌÌ̸è¶eWD$PÇD$ƒÏÿèÐMÿÿ‹L$$‹RèT>ÿÿPè^9ÿÿPè¨lÿÿƒÄ…Àu2h’hô¯ h¡hÅj è†ÿÿT$ƒÄRè¹OÿÿƒÄ‹Ç_ƒÄÃjPD$Pè‚NÿÿƒÄ …Àu1h˜hô¯ jhÅj èCÿÿT$ƒÄR3ÿètOÿÿƒÄ‹Ç_ƒÄËL$‹D$(VQT$ RPè•~‹ð‹D$ƒÄ …Àu0h¡hô¯ jAhÅj èðÿÿƒÄT$ ^Rè"OÿÿƒÄ‹Ç_ƒÄÃVPL$Qè|Nÿÿ‹T$VRè‘<ûÿ‹D$Pèw;ûÿ‹L$H‹D$@‹‹@QRPL$0Qè|ÿÿƒÄ(…À2h­hô¯ jhÅj è~ÿÿƒÄT$ ^R3ÿè®NÿÿƒÄ‹Ç_ƒÄÃT$ ^R¿è”NÿÿƒÄ‹Ç_ƒÄÃÌÌÌÌÌÌÌÌÌ̸èdU‹l$ VW‹ù‹ò…ÿ„¬Iýu ¶F‰D$ Oë{ýu¶ÁàF‰D$ ¶ ÁF‰D$ ƒïëYýu6¶Áà‰D$ ¶VFÁâ ‰D$ ¶NFÁá ÁF‰D$ ¶ ÂF‰D$ ƒïëD$ PWVèòÿÿƒÄ …À|-+øð‹D$ …Ût‹L$QPÿӃąÀ~ …ÿ…Wÿÿÿ¸_^]YÃ_^ƒÈÿ]YÃÌÌÌÌÌ‹D$ÿ¸ÃÌÌÌÌ‹D$PjÿjèÒôÿÿ‹L$ƒÄ ¸ÃÌÌÌ‹D$‹ŠT$ˆÿ¸ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹T$‹D$‹S‹ÚÁ눈Qƒ¸[ÃÌ‹L$V‹t$ ‹‹ÑÁêˆ@‹ÑÁêˆ@‹ÑÁꈈHƒ¸^ÃÌ‹D$V‹t$ ‹PhÿQè9ôÿÿƒÄ ¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ƒøv3ÀÃøa|ƒøz~,ƒøA|ƒøZ~"ƒø0|ƒø9~ƒø tPh° ÿp! ƒÄ…ÀtǸÃÌÌÌÌÌÌÌÌSV‹t$ W‹|$‹öÃtVè˜ÿÿÿƒÄ…ÀuƒãýöÃtƒþvƒãïöÃt þÿvƒãû÷Ãtþÿÿvãÿ÷ÿÿ…Ûu_^ƒÈÿ[É_^¸[ÃÌÌÌÌ̸@è¦a¡Àç3ĉD$<‹D$DSUV‰D$$‹D$XW‹|$X3í‰|$ ‰l$ƒøÿu‹ÇPIŠ@„Éuù+‰D$\9l$duÇD$d(‹\$`‹ðÿÿƒù‡Gÿ$8ï¨tjoh8° hé:‹èÑýë_¨tjxh8° h…é‹èÁýëC‹ð…Àt=L$QVWèòïÿÿƒÄ …À|ºÀé+ðø…ÒtE…öuÛëh„h8° h†é׋è‹t$h…ö~G;î}Ch“h8° h˜jzj è½ ÿÿVh4° D$Hj Pè[¼þÿL$PQh(° jèšÿÿƒÄ0é’‹t$l…ö~G;î~Chšh8° h—jzj èn ÿÿVh4° T$Hj Rè ¼þÿD$PPh° jèKÿÿƒÄ0éC‹T$ L$dQ‹L$`S»àêèëûÿÿƒÄ…À}h¢h8° j|é‹D$dÇD$¨t¿ëO¨t¿ëD¨t¿ë9©t¿ÇD$ë#©t¿ÇD$ë ¿ ÇD$‹\$(…Û„q‹3…öt'‹FÆD$…ÀtPÇèC6ûÿƒÄÇF‰~ë'WÆD$èã‹ðƒÄ…öuhÅh8° jAéC‰3‹\$`‹D$;Øu,‹T$\‹D$ RPVèááƒÄ …À…öhÍh8° jAé ðÿÿƒøwkÿ$…Lï‰l$ÇD$ðéëVL-‰L$ÇD$êëD­‰T$ÇD$0êë/‹L$\‹T$ D$PS»ÐéÇD$èoúÿÿ‹\$hƒÄÇD$`ê‹L$hêAh8° Qè›3ûÿƒÄ ‰D$$…Àu8D$t VètâƒÄhìh8° jAëW‹T$‰‹D$$‰F‹L$‹T$$D$$PÆ ‹L$`‹T$$S‹\$$èóùÿÿƒÄ‹Ç_^][‹L$<3Ìè*^ƒÄ@ÃhŽh8° h jzj è ÿÿƒÄ‹L$L_^][3̃Èÿèù]ƒÄ@Ëÿüë=ìÅëïàëQîî*î€î<î‹D$‹L$‹T$ jjP‹D$Q‹L$RPQèÎûÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌ‹D$…Àu¸ËL$V‹t$VQPèavþÿ3ÒƒÄ ;Æ”Â^‹ÂÃÌÌÌ‹D$…Àu¸ÃV‹t$P‹D$VjPÿ4! 3ɃÄ;Æ”Á^‹Áøè]¡Àç3ĉD$‹D$ƒøÿvƒÈÿ‹L$3Ìè]ƒÄÃ=ÿÿv6Ph”° D$ j Pè—¸þÿj L$QWÿÖƒÄ÷ØÀƒà H‹L$3ÌèÒ\ƒÄÃ=ÿv6PhŒ° T$ j RèZ¸þÿjD$PWÿÖƒÄ÷ØÀƒàH‹L$3Ìè•\ƒÄÈD$<v€âŠÊë ¶ÈŠ‰Ð¯"ÊöÁatNöÁt…ÛtÆjT$Rë~jhŒ± WÿÖƒÄ …À„+ÿÿÿjD$PWÿÖƒÄ ÷ØÀƒàH‹L$3Ìè(\ƒÄÃöÁt9¶ÈQh„° T$ j R请þÿjD$PWÿÖƒÄ÷ØÀƒàH‹L$3Ìèê[ƒÄÃjL$QWÿÖ‹L$ƒÄ ÷ØÀƒà3ÌHèÆ[ƒÄÃÌÌÌÌÌÌ̸<è†[¡Àç3ĉD$8‹D$DSUVW‹|$P,8‰L$ ‹L$`‰|$(‰D$4‰T$0‰L$,‹÷‰l$$ÇD$;ý„Q‹L$Xƒá‰L$<ë ‹l$$‹D$4‹L$<;÷u öD$\t³ ë2Ûƒù‡4ÿ$@ó¶Áà‰D$¶VFÁâ ‰D$¶NFÁá Á‰D$¶VF ‰D$Fë?¶Áà‰D$¶NF Á‰D$Fë'¶‰D$FëT$RPVè¡éÿÿƒÄ …ÀŒÀð‹D$‰t$;õu öD$\t³@öD$XPtVD$DjPèìÿÿƒÄ 3í‰D$8…À~gŠÓ T$\ˆT$ë‹ÿŠT$¶L,@‹|$,‹t$0‹\$ Qè%ýÿÿƒÄ…À|XD$E;l$8|Óë"‹|$0‹t$4ŠÓ T$`‹\$$èúüÿÿƒÄ…À|-D$‹t$‹|$(;t$$…½þÿÿ‹D$_^][‹L$83ÌèZƒÄ<ËL$H_^][3̃ÈÿèïYƒÄ<ÃSòIò1ò*óýñÌÌÌÌÌÌÌÌÌÌÌ̸è–YSU‹l$V‹ñ…ÿt@‹D$;ót5¶‹ÈÁ銑P° jL$ƒàŠ€P° QWˆT$ˆD$ÿÕƒÄ …ÀtF;óuË‹D$^]À[YÃ^]ƒÈÿ[YÃÌÌÌÌÌ̸è&YU‹l$VWj‹úh´° W‹ñÿÕƒÄ …Àu _^ƒÈÿ]ƒÄÃ÷D$u‹‹NPUèJÿÿÿƒÄ…À|Ù_^@]ƒÄËNST$jR‰L$‰t$è•h ‹Øhœ° Sèá-ûÿ‹ðƒÄ…öt+D$ PL$Q‰t$(èÕ”SU‹ÎèìþÿÿV‹øèd/ûÿƒÄ…ÿ} [_^ƒÈÿ]ƒÄÃ[G_^]ƒÄÃÌÌÌÌÌÌ̸ èVXS‹ÙŠÃ$U‹l$ˆD$ ‹EVÆD$ ‰D$ÇD$ öÃ@tGPèЋȃÄqŠA„Òuù+΋ñ‹L$VPQÿ×ƒÄ …Àtd‹T$jhˆ± Rÿ×ƒÄ …ÀtO‹D$F‰t$ „Ûx!öà uGHÿƒùw ¾°d° ƒþÿu8÷Ãt+‹T$WS‹ÍèƒþÿÿƒÄ…À| ‹T$ ^]Â[ƒÄ Ã^]ƒÈÿ[ƒÄ þöÃt…öu¾ëƒÎ‹D$‹M‹UjPVQR‹×L$4èÒûÿÿƒÄ…À|¼D$ ŠD$ „ÀtƒD$ ‹\$…ÛtT„Àtjh¸° Sÿ×ƒÄ …ÀtŽ‹D$‹M‹USPVQR‹×3Éè…ûÿÿƒÄ…ÀŒkÿÿÿ€|$ tjh¸° Sÿ×ƒÄ …À„Oÿÿÿ‹D$ ^][ƒÄ ÃÌÌÌU‹l$V3ö…ÿ~d$jht+ SÿÕƒÄ …Àt F;÷|ê^¸]Ã^3À]ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸˜è–V¡Àç3ĉ„$”‹„$œSU‹¬$¨W‹¼$°‹Ù‰D$‰\$‰l$@ÇD$8ÿÿÿÿ…ÿ}Ç„$°‹¼$°P‰|$èZÿÿÿƒÄ…Àu_]ƒÈÿ[‹Œ$”3ÌèJVĘÃV‹´$¸‹Æ%¹=wxtY=t(=…ÇD$(Ô° ÇD$Ç„$´ëb¸ÇD$(а ‰D$ÇD$$̰ ‰D$ Ç„$´ëDÇD$(Ȱ ÇD$Ç„$´ë=…–ÇD$(2 ÇD$ÇD$$İ ‰L$ ÷Æ€tÇD$4À° ‰L$8ëÇD$4¼° ÇD$8‹Þã`U‰\$DèfoƒÄ‰D$LÇD$0…ÀŽ‹ÎáH‰L$P‰D$,ë ‹l$D‹L$P‹\$@…Ét‹D$,Pë‹L$0QUèšo‹ð‹D$DƒÄƒøÿto;Fu$‹|$ ‹T$$‹D$WRPÿT$$ƒÄ …À„Å|$ëF‹L$‹T$(‹\$‹|$QRSÿ×ƒÄ …À„ŸW‹¼$¸è–ýÿÿƒÄ…À„‡‹D$‹\$@ÇD$‹NV‰L$@èpwV‹øè8sW‰D$Tèþ,ÿÿƒÄ ‹èû`„Ôû@t5…ít1…ÛuU{ èä'ÿÿƒÄë7û uU¿èl(ÿÿƒÄë¸ß1 ëjWT$\jPRèQ-ÿÿƒÄD$T3ÿ‹ÈqIŠA„Òuù‹\$+΋ñVP‹D$PÿÓƒÄ …À„É;÷},÷„$¸tS‹\$+þè°üÿÿƒÄ…À„¡|$‹\$‹|$8‹L$4‹T$WQRÿÓƒÄ …À„}÷t$ë‹\$…íu÷„$¸t¹€ë3É‹D$H‹T$ Œ$¸PR‹ûèÃúÿÿƒÄ…À|8D$‹D$0ÿL$,@;D$L‰D$0Œþÿÿ‹D$‹Œ$¤^_][3ÌèSĘÃÈÿëâÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$…Àu‹D$ ‹T$PQRèT4ƒÄ ÃP‹D$PQ‹L$hïèûûÿÿƒÄÃÌÌÌÌÌÌÌ‹D$…Àu;VP‹D$ PèÌ…þÿ‹ðƒÄ…öuƒÈÿ^ËL$‹T$ WQRVèý3V‹øèÅiþÿƒÄ‹Ç_^ËL$P‹D$PQ‹L$hÀïè”ûÿÿƒÄËD$‹L$WPQ‹L$¿ïè·ùÿÿƒÄ_ÃÌÌ‹D$‹L$WPQ‹L$¿Àïè—ùÿÿƒÄ_ÃÌ̸èæQ‹L$D$‰$…ÉtQ‹AƒøwI¾€d° ƒøÿt=‹h P‹ARPL$QÇD$ èÿóÿÿƒÄ…À|‹D$ ‹T$‰‹D$ƒÄÃÈÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸0± ÃÌÌÌÌÌÌÌÌÌ̸`± ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h0± PQRèw‚ƒÄÃÌÌÌ‹D$‹L$h0± PQè¼jƒÄ ÃÌÌÌÌÌÌÌÌh0± èf[ƒÄÃÌÌ‹D$h0± Pèñ^ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h`± PQR肃ÄÃÌÌÌ‹D$‹L$h`± PQèLjƒÄ ÃÌÌÌÌÌÌÌÌ‹D$Ph0± è±ÖÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$…öu3À^ÃW‹|$ƒÿÿtƒ~u辌‰F…Àu_^Ë…Àt Pè¹ÿÿƒÄ‹D$‰…ÿt4ƒÿÿu‹F…Àt(P虌ƒÄG_ÇF^ËL$‹VQWRèªÏÿÿƒÄ _¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹T$…Àt‹ ‰‹L$…Ét"‹B…ÀuÇÿÿÿÿˉ‹D$ …Àt‹J‹Q‰ÃÌÌÌÌ̸ȱ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hȱ PQRèÇ€ƒÄÃÌÌÌ‹D$‹L$hȱ PQè iƒÄ ÃÌÌÌÌÌÌÌÌhȱ è¶YƒÄÃÌÌ‹D$hȱ PèA]ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̃|$u‹D$‹‹QRèêpÿÿƒÄ¸Ã̸D² ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hD² PQRè'€ƒÄÃÌÌÌ‹D$‹L$hD² PQèlhƒÄ ÃÌÌÌÌÌÌÌÌhD² èYƒÄÃÌÌ‹D$hD² Pè¡\ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ è†NS3Û‰\$9\$u3À[ƒÄ ÃUVWhD² èÅXƒÄ‰D$;ÄO‹0‹l$$‹EPè‡!ÿÿ‹øƒÄ;û„!‹Qè·ÿÿƒÄ‰>9]„o‹Eƒø„cƒøt…ï‹} ‰_‹VRèpŠSWèÙ€ýÿ‹ØƒÄ …ÛŽÓh„h`² Sè #ûÿƒÄ ‰D$…Àu h†é›‰D$D$PW蘀ýÿƒÄèЉF…Àu'‹L$Qè$ûÿhŽh`² jAjxj èªúþÿƒÄéiÇè·Õ‹V‰B‹F‹@…Àu‹L$Qè=$ûÿh•뼋T$SRPèÐƒÄ …Àu‹D$Pè$ûÿh›ë˜‹L$Qè$ûÿƒÄé–=˜…O‹V‹] Rèy‰ƒÄèa‰‰F…Àuh®h`² j éÄSèó]‹øWè{æƒÄ…Àt*Wè>©ýÿƒÄ…Àt‹NPÇèøÿÿ‹VƒÄ‰Bé jSèò!þÿ‹øƒÄ…ÿuh¾h`² jéchÁh`² Wè¨!ûÿƒÄ ‰D$…Àu hÃé7‰D$D$PSè¤!þÿƒÄ…Àu'hÉh`² jjxj èXùþÿ‹L$$Qè#ûÿƒÄé ‹VÇèXÔ‹N‰A‹V‹B…Àu'hÐh`² j jxj èùþÿ‹D$$PèÉ"ûÿƒÄéÈ‹L$WQPè¥Î‹T$Rè«"ûÿƒÄë_^]¸[ƒÄ ÃÌÌÌ̸è¶JS‹\$UVW3ÿ‰|$;ß„8‹C;Çt%hh`² j ƒÀjPè2ûÿ‹CƒÄ_^][ƒÄÃ9{„‹‹Qè!#ÿÿƒÄ‹èè—fÿÿ‰D$;Çuhh`² jAé¹UèÈgÿÿ‹T$‰‹L$‹‹3ƒÄƒøtu‹F;Çthƒ8ucè±{ýÿ‹L$‰A ‹D$9x uh.h`² jAék‹P ‰z‹F‹H‹A‰D$‰D$‹V‹B‹‹T$PL$ QƒÂ Rè~|ýÿƒÄ …À„:‹D$Ç@éî=˜…ã‹F;Ç„̓8ueèƒ!þÿ‹L$‰A ‹D$ƒÀ 98uhEh`² jAéÛ‹V‹J‹I‰L$‰L$‹V‹J‹ QT$ RPèËþÿƒÄ …ÀuthLh`² jéž;Çt_ƒ8uZ9y u è!þÿ‹L$‰A ‹T$‹z …ÿ„‹F‹HQè®!ÿÿPèxþÿ‹ðƒÄ…ötfjVèW¥ýÿVWè€&þÿƒÄ…ÀtPVè3´ýÿƒÄ‹T$ÇB‹C‹H‰L$‹PT$RD$PUèØƒÄ…Àu3hnh`² jfjwj èœõþÿƒÄ‹D$…Àt Pè;jÿÿƒÄ_^]3À[ƒÄËD$hsh`² j ‰CƒÀjPèðûÿ‹D$$ƒÄ_^][ƒÄÃÌ‹D$ ‹L$VhD² PQjèYy‹ðƒÄ…öu^ÃWVèGýÿÿhD² V‹øèúUƒÄ …ÿu_3À^Ët$ …öt ‹Rè®iÿÿƒÄ‰>‹Ç_^ÃÌÌÌ̸èÆG‹D$Ç$…Àu3ÀYÃPD$PèùÿÿƒÄ…Àtê‹L$ V‹t$WhD² QVè+ahD² V‹øè~UƒÄ‹Ç_^YÃÌÌÌÌÌ‹L$ S‹\$ ‹VWhD² QT$Rj‰D$$èx‹ðƒÄ…ötVè~üÿÿhD² V‹øè1UƒÄ …ÿu_^3À[ÃWè®cÿÿW‹ðèæhÿÿƒÄ…ötå‹|$‹D$‰…ÿt ‹Qè™hýÿƒÄ‰7_‹Æ^[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌW‹|$…ÿu3À_ÃVè cÿÿ‹ð…öu h½h`² jAh¥j èÏóþÿƒÄ^3À_ÃWVè0gÿÿ‹D$PVèÅþÿÿV‹øè]hÿÿƒÄ^‹Ç_ÃÌÌÌÌÌ‹L$ S‹\$ ‹VWhD² QT$Rj‰D$$èw‹ðƒÄ…ötVèŽûÿÿhD² V‹øèATƒÄ …ÿu_^3À[ÃWèþbÿÿW‹ðèögÿÿƒÄ…ötå‹|$‹D$‰…ÿt ‹Qè©uýÿƒÄ‰7_‹Æ^[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌW‹|$…ÿu3À_ÃVèbÿÿ‹ð…öu håh`² jAh¡j èßòþÿƒÄ^3À_ÃWVèfÿÿ‹D$PVèÕýÿÿV‹øèmgÿÿƒÄ^‹Ç_ÃÌÌÌÌÌ‹L$ S‹\$ ‹VWhD² QT$Rj‰D$$è­v‹ðƒÄ…ötVèžúÿÿhD² V‹øèQSƒÄ …ÿu_^3À[ÃWèNbÿÿW‹ðègÿÿƒÄ…ötå‹|$‹D$‰…ÿt ‹QèyþÿƒÄ‰7_‹Æ^[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌW‹|$…ÿu3À_ÃVè-aÿÿ‹ð…öu h h`² jAhµj èïñþÿƒÄ^3À_ÃWVèðeÿÿ‹D$PVèåüÿÿV‹øè}fÿÿƒÄ^‹Ç_ÃÌÌÌÌ̸¸² ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h¸² PQRè·uƒÄÃÌÌÌ‹D$‹L$h¸² PQèü]ƒÄ ÃÌÌÌÌÌÌÌÌh¸² è¦NƒÄÃÌÌ‹D$h¸² Pè1RƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̃|$‹D$V‹0uè½Ìþÿ‰F…Àu^ø^ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸˜³ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h˜³ PQRèuƒÄÃÌÌÌ‹D$‹L$h˜³ PQèL]ƒÄ ÃÌÌÌÌÌÌÌÌh˜³ èöMƒÄÃÌÌ‹D$h˜³ PèQƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸´ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h´ PQRè‡tƒÄÃÌÌÌ‹D$‹L$h´ PQèÌ\ƒÄ ÃÌÌÌÌÌÌÌÌh´ èvMƒÄÃÌÌ‹D$h´ PèQƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$Ph´ èÉÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸€´ ÃÌÌÌÌÌÌÌÌÌ̸Ĵ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hÄ´ PQRè×sƒÄÃÌÌÌ‹D$‹L$hÄ´ PQè\ƒÄ ÃÌÌÌÌÌÌÌÌhÄ´ èÆLƒÄÃÌÌ‹D$hÄ´ PèQPƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$PhÄ´ èQÈÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌVWhÄ´ 3ÿèrL‹ðƒÄ…ötU‹D$ Pè?ÿÿƒÄ‰‰~è¢Êþÿ‰F…ÀtèF~‹ø…ÿt‹NWQèFÈþÿƒÄ…Àu hÄ´ VèÄOƒÄ…ÿt Wè'~ƒÄ_3À^ËT$‹D$RPWè?ÁÿÿƒÄ _‹Æ^ÃÌÌÌÌÌÌÌ¸è´ ÃÌÌÌÌÌÌÌÌÌ̸µ ÃÌÌÌÌÌÌÌÌÌÌèKˆüÿ‹L$3Ò…À•‰‹ÂÃÌÌÌÌÌÌÌÌÌÌÌV‹t$‹…Àt)‹L$ öAPtèU‡üÿƒÄÇ^Ã襇üÿƒÄÇ^ÃÌÌÌÌÌÌÌÌÌÌ‹D$V‹0…öuƒÈÿ^ÃWVèé†üÿƒÄ¨‹D$¹”Á‹ù…Àt…ÿtÆ@PVèŒüÿƒÄV躆üÿƒÀ™ƒâƒÄÁøÇ_^ÃÌÌÌÌÌÌV‹t$ƒ>uè‡üÿ‰‹‹L$ P‹D$PQèÍŠüÿƒÄ …Àu5‹…Àt+‹T$öBPtè†üÿƒÄÇ3À^ÃèÞ†üÿƒÄÇ3À^ø^ÃÌÌÌÌÌÌÌÌÌ̸0µ ÃÌÌÌÌÌÌÌÌÌ̸Lµ ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹H‹T$‰ ¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹H‹T$‰ ÃÌÌ‹D$‹L$W‹8;yuƒÈÿ_ÃSUV…ÿ}ƒËÿ+ßë‹ßSèe…üÿ‹t$ƒÄ¨¹”ÁhÁý…öt0…Ét …ÿÂþʈFEÿ…À|ëIˆ0…ÿ}ŠÓöÒˆ0Áëƒèyê^)][_ÃÌÌW‹|$ƒÿ~"h”hhµ h€h¦j èkìþÿƒÄ3À_ÃUV‹t$…ÿt ö€t½ë3í3É3À…ÿ~ d$Áá…ít Š0öÒ¶Òë¶0@ Ê;Ç|ä^…í‹Á]tƒÈÿ+Á‹L$;Auh¦ë†‹T$‰¸_ÃÌÌÌÌÌÌÌÌÌ̸¶ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h¶ PQRèçoƒÄÃÌÌÌ‹D$‹L$h¶ PQè,XƒÄ ÃÌÌÌÌÌÌÌÌh¶ èÖHƒÄÃÌÌ‹D$h¶ PèaLƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$Ph¶ èaÄÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸4¶ ÃÌÌÌÌÌÌÌÌÌ̸˜¶ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h˜¶ PQRè7oƒÄÃÌÌÌ‹D$‹L$h˜¶ PQè|WƒÄ ÃÌÌÌÌÌÌÌÌh˜¶ è&HƒÄÃÌÌ‹D$h˜¶ Pè±KƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$Ph˜¶ è±ÃÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌVjth´¶ jè¡ûÿ‹ðƒÄ …ötèÆþÿ‰…Àt èxPþÿ‰F…Àu8j~h´¶ jAh«j è\êþÿƒÄ…öt‹…Àt PèiÄþÿƒÄVèûÿƒÄ3À^ËL$¸‰F‰1^ÃÌÌÌÌÌÌÌÌÌW‹|$…ÿt-V‹7…öt%‹FPèGPþÿ‹hQèºÆþÿVè´ûÿƒÄÇ^_ÃÌÌÌÌÌÌÌÌéûÃþÿÌÌÌÌÌÌÌÌÌÌ̸è¦<‹L$0‹D$‹T$,S‹‹D$,VWQ‹L$4R‹T$0PQhd¶ RD$(PL$(3öQ‰\$0‰t$,‰t$4èrc‹øƒÄ ;þ‰|$ŽU‹l$$‹u…öt&‹VRèœOþÿ‹hPèÆþÿVè ûÿƒÄÇEL$jQè“þÿÿƒÄ…À„Û‹T$‹l$‹E+ÓRPè”OþÿƒÄ…À„¼‹L$‹U‹B+ËQSPèW<‹L$Q3Ûè9ÃþÿƒÄ…À~g‹ÿ‹T$SRè5Ãþÿ‹ðV3ÿèÃþÿƒÄ …À~-d$WVèÃþÿP‰X‹EPèüÁþÿƒÄ…ÀtXVGèîÂþÿƒÄ;ø|×Vè±Âþÿ‹L$QCèÖÂþÿƒÄ;Ø|Ÿ‹|$‹T$Rè‘Âþÿ‹D$(‹T$,ÇE‹L$‰(ƒÄ‰ ‹Ç]_^[ƒÄÃhÈh´¶ j:hžj è5èþÿƒÄ]_^3À[ƒÄÃÌÌÌÌÌÌÌ̸ èö:SU3ÛW‰\$ ‰\$ƒÍÿè‘Ãþÿ‰D$ ;Ę‹Pè=ÂþÿƒÄ…À~]›‹SQè7Âþÿ‹øƒÄ9ot"èXÃþÿ‰D$…Àt_‹T$ PRèÁþÿƒÄ…ÀtM‹o‹D$WPèðÀþÿƒÄ…Àt8‹QCèàÁþÿƒÄ;Ø|©jÿjÿhd¶ T$jRèôM‹ø‹FWPèèMþÿƒÄ…Àu4‹D$ h@PèÄþÿhûh´¶ jAhËj è:çþÿƒÄ_]ƒÈÿ[ƒÄ ËN‹Qjÿjÿhd¶ D$ PL$Q‰T$(è‹M‹T$ h@Rè¼ÃþÿƒÄ‹Ç_]ÇF[ƒÄ ÃÌÌÌÌÌÌÌÌÌW‹|$…ÿt=‹D$ …Àt59t(VPh˜¶ è¿¿ÿÿ‹ðƒÄ…öt‹h˜¶ Pè‰GƒÄ‰7^3À9_•ÀÃ3À_ÃÌÌÌÌÌÌ‹D$V‹0ƒ~t è^þÿÿ…À|#‹F‹t$ W‹8…öt‹H‹WQRèÁ9ƒÄ >‹Ç_^ÃÌÌÌÌÌ¸è· ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hè· PQRèGjƒÄÃÌÌÌ‹D$‹L$hè· PQèŒRƒÄ ÃÌÌÌÌÌÌÌÌhè· è6CƒÄÃÌÌ‹D$hè· PèÁFƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$V‹0‹D$ƒèW„†ƒèt6ƒè…¢‹F3ÿ;Çt Pè^ûÿƒÄ‹‹QWWRè¾)ƒÄ ‰F_¸^ÃFPVj èä)ûÿ‹NXQèk‹V8Rè’n‹FƒÄ‰FX…Àt‹vX…ötƒ>u覼þÿ‰…Àu^3À_ËWQèRºþÿƒÄ^_ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$WPèµÿÿ‹øƒÄ…ÿu_ÃV‹t$ …öt3ƒ~Xuh4¹ è>ƒÄ‰FX…Àt‹vX…ötƒ~uè5¼þÿ‰F…Àu^3À_ËNWQèß¹þÿƒÄ^_ÃÌÌÌÌÌÌÌÌÌV‹t$‹FX…Àtƒ8t‹hеPè"½þÿ‹NXƒÄÇ^ÃÌÌÌÌV‹t$‹FX…Àt‹@…ÀthеPèò¼þÿ‹FXƒÄÇ@^ÃÌÌ̸x¹ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hx¹ PQRèdƒÄÃÌÌÌ‹D$‹L$hx¹ PQè\LƒÄ ÃÌÌÌÌÌÌÌÌhx¹ è=ƒÄÃÌÌ‹D$hx¹ Pè‘@ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸4º ÃÌÌÌÌÌÌÌÌÌ̸ôº ÃÌÌÌÌÌÌÌÌÌ̸d» ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h4º PQRèwcƒÄÃÌÌÌ‹D$‹L$h4º PQè¼KƒÄ ÃÌÌÌÌÌÌÌÌh4º èf<ƒÄÃÌÌ‹D$h4º Pèñ?ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hôº PQRècƒÄÃÌÌÌ‹D$‹L$hôº PQèLKƒÄ ÃÌÌÌÌÌÌÌÌhôº èö;ƒÄÃÌÌ‹D$hôº Pè?ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hd» PQRè—bƒÄÃÌÌÌ‹D$‹L$hd» PQèÜJƒÄ ÃÌÌÌÌÌÌÌÌhd» è†;ƒÄÃÌÌ‹D$hd» Pè?ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$Phd» è·ÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‹‰T$‹D$‹‹‰T$éµÌÌÌ‹D$V‹0ƒ~uh 詵þÿƒÄ‰F‹F…Àt‹L$ QPè·þÿƒÄ…Àt ¸‰F$^Ãh‚h€» jAh©j èˆÝþÿƒÄ3À^ÃÌ‹D$‹…Àt‹@…Àtƒ|$uh PèµþÿƒÄ¸ÃÌÌÌÌjEh˜» j,èRûÿ3ÉƒÄ ;ÁujHh˜» jAhªj è$ÝþÿƒÄ3ÀÉH ‰H ‰H$Ç@(‰‰H‰HÃÌÌÌÌÌV‹t$…ötcj]h˜» jF(jÿPèsøúÿƒÄ…ÀH‹…Àt Pè0øÿÿƒÄ‹F…Àt Pè€þÿÿƒÄ‹F…Àt Pè0ƒƒÄ‹F$…Àt Pè`ûÿƒÄVèWûÿƒÄ^ÃÌ̸¼ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h¼ PQRè‡`ƒÄÃÌÌÌ‹D$‹L$h¼ PQèÌHƒÄ ÃÌÌÌÌÌÌÌÌh¼ èv9ƒÄÃÌÌ‹D$h¼ Pè=ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸p¼ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hp¼ PQRè`ƒÄÃÌÌÌ‹D$‹L$hp¼ PQèLHƒÄ ÃÌÌÌÌÌÌÌÌhp¼ èö8ƒÄÃÌÌ‹D$hp¼ Pè<ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̃|$u‹D$V‹0jOè›ÿÿƒÄ‰^¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¸ì¼ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hì¼ PQRèW_ƒÄÃÌÌÌ‹D$‹L$hì¼ PQèœGƒÄ ÃÌÌÌÌÌÌÌÌhì¼ èF8ƒÄÃÌÌ‹D$hì¼ PèÑ;ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌVW‹|$…ÿt‹7…öu(èëIÿÿ‹ð…öujTh½ jh›j è°ÚþÿƒÄ_3À^ËD$ P‰Fè KÿÿƒÄ‰ƒøtVƒøtt3=˜tj}h½ h£ë`‹D$‹L$PQV RètþÿƒÄ …Àukjwë;‹D$‹L$PQV Rè6`ýÿƒÄ …ÀuMjmë‹D$‹L$PQjèzKýÿƒÄ ‰F …Àu.jch½ j h›j è ÚþÿƒÄ…ÿt97t VèªNÿÿƒÄ_3À^Ã…ÿt‰7_‹Æ^ÃÌÌÌÌÌÌÌVW‹|$…ÿt‹7…öu(èëHÿÿ‹ð…öujTh ½ jhšj è°ÙþÿƒÄ_3À^ËD$ P‰Fè JÿÿƒÄ‰ƒøtXƒøtt4=˜tj}h ½ h£ëb‹D$‹L$PQjèÆüýÿƒÄ ‰F …Àuljwë<‹T$‹D$RPjè§^ýÿƒÄ ‰F …ÀuMjmë‹L$‹T$QRjè8JýÿƒÄ ‰F …Àu.jch ½ j hšj è ÙþÿƒÄ…ÿt97t Vè¨MÿÿƒÄ_3À^Ã…ÿt‰7_‹Æ^ÃÌÌÌÌÌS‹\$ ‹U‹l$VWjjhp‰h ‰UL$,Qj‰D$4è¯ÿÿ‹øWèû²þÿƒÄ ƒøupnëWèè²þÿ‹ðƒîƒÄ÷ÞöænþÿÿƘhp‰Wè5µþÿ‹T$USRVèˆþÿÿƒÄ_^][ËL$‹ƒøtCƒøtt2=˜tj[h8½ h§h¤j è1ØþÿƒÄƒÈÿËI ‰L$éþþÿ‹A ‰D$é"^ýÿ‹A ‰D$évIýÿÌÌÌÌÌÌ‹L$‹ƒøu ‹I ‰L$éIýÿƒøtu ‹A ‰D$éX]ýÿ=˜u ‹A ‰D$éEýýÿj`hP½ h§h£j è­×þÿƒÄƒÈÿÃÌÌÌÌÌ̸èv*SUVW‹|$0‹Ç%ÆD$ ÇD$=u ÆD$ ÇD$ …ÿuÇD$öD$4‹L$,‹‹t$(‰\$ u0jh¿ Vè(CþÿƒÄ …ÀŽj hø¾ VèCþÿƒÄ …ÀŽ…öD$4uX‹{ ½¤v t½ß1 ‹3É3À…Ò~‹¶Áá@Ë;Â|ò‹\$ QUQUhß1 hؾ VèU…þÿƒÄ…ÀŽ*‹|$0öD$4@uO¾T$Rhľ Vè.…þÿƒÄ …ÀŽ‹D$‹KWPQVè“ÖÿÿƒÄ…ÀŒèjh2 Vè[BþÿƒÄ …ÀŽÐöD$4€…(j!h ¾ Vè8BþÿƒÄ …ÀŽ­hß1 h„¾ V轄þÿƒÄ …ÀŽ’‹S‹‹QVèdÿÿƒÄ…ÀŽyh2 Vè®BþÿƒÄ…ÀŽc‹T$,RèI‹øƒÄ…ÿuhß1 hd¾ Vè`„þÿVèzðþÿƒÄ錋ƒøu.‹G ‹HQènüÿPhß1 hD¾ Vè.„þÿ‹W jRVèâƒÄ ëWhß1 ƒøtuh,¾ Vè„þÿ‹G jPVèìƒÄë1=˜uh¾ Vèåƒþÿ‹O jQVèù$ƒÄëhø½ VèɃþÿƒÄ WèàIÿÿƒÄ÷D$4uThß1 hè½ V裃þÿƒÄ …ÀŽx‹T$,‹‹hU‰l$$èE¯þÿƒÄ…À…|hß1 hܽ VèjƒþÿƒÄ …ÀŽ?÷D$4…‹D$,Pè× ‹èƒÄ…í„ïhß1 hÀ½ Vè*ƒþÿU3Ûèâ®þÿƒÄ…À޾¤$SUèÙ®þÿhß1 h¸½ V‹øè÷‚þÿƒÄ…ÀŽÌWèVJPV蟎ÿÿWèYJƒÄ…À¸¬½ u¸ß1 Ph¤½ V輂þÿƒÄ …ÀŽ‘‹L$4jQWVè³›ƒÄ…Àuhß1 hœ½ V茂þÿ‹WRVèƒÄjh2 VèÒ?þÿƒÄ …À~KUCè$®þÿƒÄ;ØŒIÿÿÿhp¤Uè~°þÿƒÄ÷D$4…ž‹D$,‹H‹PQRVè‹ƒÄ …À…hh„½ jjyj è{ÓþÿƒÄ_^]3À[ƒÄÃ3ÿU‰|$ è²­þÿƒÄ;øˆþÿÿ‹L$ W3íQ3ÛÇD$ ‰l$8蜭þÿ‹R‰D$ èÐþþÿP芃ąÀ…hß1 h¸½ VèŸþÿƒÄ …ÀŽtÿÿÿ‹D$‹QVèGÿÿ‹øƒÄ…ÿ~‹D$9ht_‹@‹(‹X¸+Ç‹ø…ÿ~jht+ Vè³>þÿƒÄ ƒø…'ÿÿÿO…ÿâhˆ± VèW?þÿƒÄ…ÀŽ ÿÿÿƒýt+ƒýt&ƒýt!hh½ ë7‹PRÇD$4èŬþÿƒÄ‰D$ë5‹ ‹SQRVèO>þÿƒÄ ;…Äþÿÿh2 Vèù>þÿ‹D$8@ƒÄ;D$‰D$0}‹D$0‹L$‹QPRè…¬þÿƒÄé;ÿÿÿ‹|$‹l$ Gé£þÿÿ_^]¸[ƒÄÃÌÌ‹D$‹L$jjPQèMúÿÿƒÄÃÌÌÌÌÌÌÌÌÌVè:QþÿPètCþÿ‹ðƒÄ…öujQh„½ jjzj è¹ÑþÿƒÄ3À^ËD$WPjjjVè@þÿ‹L$ jjQVèóùÿÿV‹øèÛ;þÿƒÄ$‹Ç_^ÃÌÌ̸èV$¡Àç3ĉD$SU‹l$(VW‹|$4hŒ¿ UèäþÿƒÄ…ÀŽ‹‹HjQè,æÿÿh‹ðht¿ Vè:ùúÿƒÄ‰D$‹Ø…À„æ‹‹HT$RQèùåÿÿƒÄjèO6ÿÿPjT$ RVSèÿÿƒÄ3ö¶D4Phl¿ UèjþÿƒÄ …ÀŽ“Fƒþ|ÞSèƒúúÿhL¿ UèHþÿƒÄ …À~~‹‹Q‹rjèò5ÿÿ‹‹VPjD$ PQRèžÿÿƒÄ3öë¤$¶D4Phl¿ Uèÿ~þÿƒÄ …À~5Fƒþ|âh2 Uèç~þÿƒÄ_^]¸[‹L$3ÌèK#ƒÄÃSèöùúÿƒÄ‹L$(_^][3Ì3Àè-#ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌU‹l$h¼¿ Uè°<þÿƒÄ…À3À]ËD$ ‹QUè8ŠÿÿƒÄ…À~è‹D$S‹XVW‹83ö…ÿ~{½+ë뛸9Žã8÷îÁú‹ÂÁèÂÀÒ‹Æ+Âu‹L$j h°¿ Qèƒ;þÿƒÄ …À~S(¹ß1 ;×t¹ˆ± ¶Q‹L$Ph¨¿ Qèô}þÿƒÄ…À~$F;÷|˜‹l$jh2 Uè7;þÿƒÄ H_÷Ø^À[@]Ã_^[3À]ÃÌ̸Tè"¡Àç3ĉD$PS‹\$\W‹|$d…ÿu_3À[‹L$P3Ìè "ƒÄTÃU‹oV3É3ö9~jŠ.<~< }< t< uˆD ëÆD .AƒùP|QD$PSè­:þÿƒÄ …À~3ÉF;7|Â…É~(QL$QSè:þÿƒÄ …À^]_3À[‹L$P3Ìè’!ƒÄTËL$`^]_[3̸èz!ƒÄTÃÌÌÌÌÌÌÌÌÌÌ̸è6!‹D$V‹0‹@3Òƒþ ‰T$‰T$Œ-€|0ÿZuÇD$ë¤$Š €ù9€ù0ŒÿBƒú |å¾¾P ‰ J¾P ‰ J¾P ‰ŒJ°/ÿÿ‰L$¾H‰¾H”QðýÿÿJÿƒù ‡²ƒþ¾HS¾X U¾h W¾x ‰¼Oðýÿÿ¾H ‰œKðýÿÿ¾H ‰¬Mðýÿÿ|*ŠH €ù0|"€ù9Š@ <0|<9¾É¾À ‰ŒHðýÿÿë‹L$ƒ|$¸À u¸ß1 P‹D$$PQ‹ •”°‹T$(USWQhè¿ Rè°{þÿƒÄ$3É…ÀŸÁ_][^‹ÁƒÄËT$jhØ¿ Rèë8þÿƒÄ 3À^ƒÄÃ̸èÆ‹D$UV‹0‹@3Òƒþ ‰T$‰T$ Œ(€|0ÿZuÇD$ë¤$Š €ù9€ù0ŒûBƒú |å¾¾P ‰ŒJðýÿÿƒù2‰L$}ƒÁd‰L$¾H¾P ‰¬JðýÿÿMÿƒù ‡¶ƒþ ¾H‰¾H”Qðýÿÿ¾HS¾X W¾x ‰¼Oðýÿÿ¾H ‰œKðýÿÿ|*ŠH €ù0|"€ù9Š@ <0|<9¾É¾À ‰ŒHðýÿÿë‹L$ƒ|$¸À u¸ß1 P‹D$$lPQ‹ ­”°SWR‹T$4Qhè¿ RèDzþÿƒÄ$3É…ÀŸÁ_[^]‹ÁƒÄËT$jhØ¿ Rè7þÿƒÄ ^3À]ƒÄÃÌÌÌ̸èV‹D$jjPÇD$ èƒÄ €8‰D$uPèõúÿƒÄ¸ƒÄÃS‹\$UVpW‹îëIŠ€ù/u ŠFnt;jhÔ° SèÍ6þÿƒÄ ƒøu€>t!Fëhõht¿ jjuj è¸Êþÿ‹t$$ƒÄ뾋L$Qè`ôúÿƒÄ_‹Æ^][ƒÄÃÌÌÌ‹L$‹Aƒøu ‰L$é‹ýÿÿƒøu ‰L$é üÿÿ‹T$jhØ¿ RèL6þÿƒÄ 3ÀÃÌÌÌÌÌ̸ è&SVW‹|$$‹Ï3Àá‰D$ÆD$ ‰D$ùu ÆD$ ÇD$ ;øuÇD$öD$(‹\$ ‹‹t$‰T$ u0j h Á VèÕ5þÿƒÄ …ÀŽmj hø¾ Vè½5þÿƒÄ …ÀŽUöD$(u(‹‹Qèñ˜ÿÿP@Phß1 hðÀ Vè.xþÿƒÄ…ÀŽ&öD$(U…ÕjhØÀ Vèj5þÿƒÄ …ÀŽSè©Zÿÿ‹èƒÄƒ}7U蘘ÿÿƒÄ…À} ÷ع¤v ë¹ß1 PQPQhÄÀ VèÄwþÿƒÄ…ÀŽ»ëu}¸¸À t¸ß1 Phß1 h°À Vè“wþÿƒÄ…ÀŽŠ‹M3À…É~=x‹×+Ñ‹M÷ÚÒƒâ0ƒÂ R¶Rh 2 VèZwþÿƒÄ…ÀŽQ‹M‹Ç;Á|Ç‹|$(öD$,uLhß1 h”À Vè+wþÿƒÄ …ÀŽ"‹D$$‹H‹RVèЂÿÿƒÄ…ÀŽh2 Vè5þÿƒÄ…ÀŽñöD$,uU¾D$Ph€À Vè×vþÿƒÄ …ÀŽÎ‹L$WQSè*ÿÿƒÄPVè6ÈÿÿƒÄ…ÀŒ­jh2 Vèþ3þÿƒÄ …ÀŽ•öD$, …“jhlÀ VèÛ3þÿƒÄ …ÀŽrjhPÀ VèÃ3þÿƒÄ …ÀŽZ‹‹B‹QVè*ýÿÿƒÄ…À„Ajh4À Vè’3þÿƒÄ …ÀŽ)‹‹B‹HQVèøüÿÿƒÄ…À„jh2 Vè`3þÿƒÄ …ÀŽ÷öD$,@uU¾T$Rhľ VèÝuþÿƒÄ …ÀŽÔ‹D$WPS膃ÄPVè<ÇÿÿƒÄ…ÀŒ³jh2 Vè3þÿƒÄ …ÀŽ›öD$,€…(j!h ¾ Vèá2þÿƒÄ …ÀŽxhß1 h„¾ VèfuþÿƒÄ …ÀŽ]‹L$$‹Q‹‹QVè ÿÿƒÄ…ÀŽ@h2 VèS3þÿƒÄ…ÀŽ*SèB‹øƒÄ…ÿuhß1 hd¾ Vè uþÿVè#áþÿƒÄ錋ƒøu.‹W ‹BPè(_üÿPhß1 hD¾ Vè×tþÿ‹O jQVè‹ ƒÄ ëWhß1 ƒøtuh,¾ Vè±tþÿ‹W jRV蕃Äë1=˜uh À VèŽtþÿ‹G jPV袃Äëhø½ VèrtþÿƒÄ Wè‰:ÿÿƒÄ‹D$,©u‹L$$‹Q$jPRh À Vè厃Ä÷D$,u‹C‹KPQVèŠõÿÿƒÄ …À~%÷D$,u‹SXjRVèÍƒÄ …ÀtÇD$]‹D$_^[ƒÄ ÃÌÌVèºDþÿPèô6þÿ‹ðƒÄ…öujYht¿ jjvj è9ÅþÿƒÄ3À^ËD$WPjjjVè‚3þÿ‹L$(‹T$$‹D$ QRPVè½úÿÿV‹øèU/þÿƒÄ$‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$jjPQèúÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjPQè]ÿÿÿƒÄÃÌÌÌÌÌÌÌÌ̸X膡Àç3ĉD$TV‹t$dW‹|$d…ö„߃>S‹\$pUhß1 „CPhß1 ShˆÁ WÆD$+èërþÿ‹Q3í衞þÿƒÄ…À~R€|$uhÔ° Wèè0þÿƒÄëÆD$‹jUR胞þÿƒÄPD$jPPècðþÿL$$QWè¸0þÿ‹REèOžþÿƒÄ;è|®h2 Wè0þÿƒÄëShpÁ WèlrþÿƒÄƒ~hß1 „CPhß1 ShXÁ WÆD$+è@rþÿ‹NQ3íèõþÿƒÄ…À~T€|$uhÔ° Wè<0þÿƒÄëÆD$‹VjURèÖþÿƒÄPD$jPPè¶ïþÿL$$QWè 0þÿ‹VREè¡þÿƒÄ;è|¬h2 Wèï/þÿƒÄëSh@Á Wè¾qþÿƒÄ‹F…Àt‹@Phß1 Sh0Á WèŸqþÿƒÄƒ~ tZhß1 Sh$Á Wè…qþÿ‹F 3ÛƒÄ9~-¹ˆ± …Ûu¹ß1 ‹P¶PQhÁ WèWqþÿ‹F CƒÄ;|Ójh2 WèŸ.þÿƒÄ ][‹L$\_^3̸裃ÄXÃÌÌÌÌSUV‹t$Wh Â Vè qþÿ‹|$ ‹‹Q译ÿÿP@Phß1 hˆÂ Vèìpþÿ‹W‹PèñíþÿƒÄ$…Àu¸€Â ë PèéþÿƒÄPhß1 hd Vè¹pþÿ‹‹QjjRèJ‹ØShß1 hT Vè—pþÿSèÁëúÿhß1 h@ Vèpþÿ‹‹H QVèU÷ÿÿƒÄDhß1 h, Vèbpþÿ‹‹BƒÄ …Àt PVè/÷ÿÿë h€Â VèBpþÿƒÄh2 Vè4pþÿWèþ8‹‹HjjQh V蹊‹‹jUèΛþÿƒÄ$…À~h ëhèÁ VèõoþÿƒÄU3Û誛þÿƒÄ…À~hISUè©›þÿhÔÁ V‹øèÌoþÿ‹PVècRh¸Á Vè¸oþÿ‹OQVèŽöÿÿh2 Vè£oþÿ‹WjjRh Á Vè0ŠƒÄDUCèF›þÿƒÄ;Ø|Ÿ‹|$‹G‹OPQVèÍðÿÿƒÄ _^]¸[ÃVè*@þÿPèd2þÿ‹ðƒÄ…öujKhÄ jh“j è¦ÀþÿƒÄ3À^ËD$WPjjjVèï.þÿ‹L$ QVèôýÿÿV‹øèÌ*þÿƒÄ‹Ç_^ÃÌÌÌ̸èFSU‹l$W‹ù‹Ú…ÿu_]A[Yà V¾¤v u¾ß1 ‹D$ h€PUè>.þÿƒÄ …À„XƒuSh@à Uè¡nþÿƒÄ 3É…ÀŸÁ^_][‹ÁYÃWèÉXüÿƒÀ™ƒâÂÁøƒÄƒø'‹‹PVPVSh,à UèanþÿƒÄ…À^_]3À[YËD$Æ€>-¸¸À t¸ß1 PSh$à Uè+nþÿƒÄ…ÀŽÅ‹\$sVWè’]üÿƒÄö€‹øtGë‹Þ3ö…ÿŽŠ¸+ÉD$¸‰ˆˆˆ÷îÖÁú‹ÂÁè‹ÈÁá+È‹Ö+Ñu,h2 Uèã+þÿƒÄ…À~a‹D$ h€ƒÀPUè)-þÿƒÄ …ÀtG‹L$È;Ϲß1 t¹ˆ± ¶QRh¨¿ Uè{mþÿƒÄ…À~F;÷|jh2 UèÂ*þÿƒÄ …À^_]3À[YÃ^_]¸[YÃÌÌÌÌÌÌÌ̸ˆè†¡Àç3ĉ„$„U‹¬$”V‹ñ…Ûu^C]‹Œ$„3ÌèĈÅítFý€~½€UD$j Pè¹UL$QWè5*þÿƒÄ…À^3À]‹Œ$„3Ìè7ĈÃVh|± Wè©lþÿƒÄ …À~Ô3ö9´$”†ž¸+ÉD$뛸‰ˆˆˆ÷æÁê‹ÂÁà+‹Î+Èu/URD$j PÆD$ è,MQT$RWè¥)þÿƒÄ…ÀŽlÿÿÿ‹L$3È;Œ$”¹ß1 t¹ˆ± ¶QRh¨¿ WèlþÿƒÄ…ÀŽ5ÿÿÿF;´$”‚uÿÿÿjh2 WèH)þÿ3ÉƒÄ …ÀŸÁ^]‹Á‹Œ$„3ÌèGĈÃÌÌÌÌ̸èSUVW‹|$‹G3ön‰t$…À„ÊPèÔUüÿÅ™#Õ‹ð‹G ƒÄÁþ…ÀtPè¸UüÿÅ™#ÕÂÁøƒÄ;ðs‹ðh¸h°Ã ƒÆ VèÒäúÿ‹ðƒÄ …öuhAëy‹GPè{Uüÿ‹\$PhˆÃ Sè+kþÿƒÄ…À~Y‹OjVSº€Ã èüÿÿƒÄ …ÀtA‹O jVSºtà èûûÿÿƒÄ …Àt)‹…ÿtWhHà SèájþÿƒÄ …À~ÇD$ë½ChÍh°Ã Ujdjè'¼þÿƒÄ…öt VèÚåúÿƒÄ‹D$_^][YÃÌÌÌÌÌÌÌÌÌÌÌÌÌUW‹|$‹G 3í…À„VPè¶TüÿƒÀ™ƒâ‹ð‹GƒÄÁþ…ÀtPè˜TüÿƒÀ™ƒâÂÁøƒÄ;ðs‹ð‹G…ÀtPèvTüÿƒÀ™ƒâÂÁøƒÄ;ðs‹ðhúh°Ã ƒÆ VèŽãúÿ‹ðƒÄ …öuhýh°Ã jAjdj è`»þÿƒÄëw‹G SPè!Tüÿ‹\$PhÔà SèÑiþÿƒÄ…À~U‹O jVSºÐà è¹úÿÿƒÄ …Àt=‹O…ÉtjVSºÌà èúÿÿƒÄ …Àt!‹O…ÉtjVSºÈà èúÿÿƒÄ …Àt½[…öt VèšäúÿƒÄ^_‹Å]Ãhñh°Ã jejdj 輺þÿƒÄ_‹Å]ÃÌÌÌ̸Œè† ¡Àç3ĉ„$ˆSU‹¬$˜VW‹¼$¤‹G3Û3ö‰\$‰\$;ÃtPè=SüÿƒÀ™ƒâ‹ðƒÄÁþ‹G;ÃtPèSüÿƒÀ™ƒâÂÁøƒÄ;ðs‹ð‹G…ÀtPèýRüÿƒÀ™ƒâÂÁøƒÄ;ðs‹ð‹G…ÀtPèÛRüÿƒÀ™ƒâÂÁøƒÄ;ðs‹ð‹G …ÀtPè¹RüÿƒÀ™ƒâÂÁøƒÄ;ðs‹ð‹G$…ÀtPè—RüÿƒÀ™ƒâÂÁøƒÄ;ðs‹ð‹G(…ÀtPèuRüÿƒÀ™ƒâÂÁøƒÄ;ðs‹ð‹G,…ÀtPèSRüÿƒÀ™ƒâÂÁøƒÄ;ðs‹ðh‹h°Ã ƒÆ Vèkáúÿ‹ðƒÄ …öuhŽh°Ã jAjsjè=¹þÿƒÄ‹Ãé‹G…Àt PèöQüÿƒÄ‰D$9_‹œ$¨t2h€SUè'þÿƒÄ …À„G‹D$PhxÄ Uè|gþÿƒÄ …ÀŽ,ƒu‹L$QhdÄ T$ h€RèrgþÿƒÄëh€D$hXÄ Pè!þÿƒÄ ‹OSVUT$$è'øÿÿƒÄ …À„׃ºLÄ tº<Ä ‹O…ÉtSVUèý÷ÿÿƒÄ …À„­‹O…ÉtSVUº(Ä èÞ÷ÿÿƒÄ …À„Ž‹O…ÉtSVUº Ä è¿÷ÿÿƒÄ …Àts‹O …ÉtSVUºÄ è¤÷ÿÿƒÄ …ÀtX‹O$…ÉtSVUº Ä è‰÷ÿÿƒÄ …Àt=‹O(…ÉtSVUºÄ èn÷ÿÿƒÄ …Àt"‹O,…ÉtSVUºðà èS÷ÿÿƒÄ …Àt¿ë‹|$VèkáúÿƒÄ‹Ç‹Œ$˜_^][3ÌèŸ ÄŒÃÌÌÌÌÌÌÌÌÌÌÌÌ̸èV SW‹|$‹G 3Û‰\$…À„ÈVPè(PüÿƒÀ™ƒâ‹ð‹GƒÄÁþ…ÀtPè PüÿƒÀ™ƒâÂÁøƒÄ;ðs‹ð‹G…ÀtPèèOüÿƒÀ™ƒâÂÁøƒÄ;ðs‹ð‹G…ÀtPèÆOüÿƒÀ™ƒâÂÁøƒÄ;ðs‹ð‹G…ÀtPè¤OüÿƒÀ™ƒâÂÁøƒÄ;ðs‹ðhåh°Ã ƒÆ Vè¼Þúÿ‹ðƒÄ …öuhèh°Ã jAjhj 莶þÿƒÄéÛ9_‹\$U‹l$ t7h€USè|$þÿƒÄ …À„±‹G Pè(OüÿPhxÄ SèÜdþÿƒÄ…ÀŽ‘‹O…ÉtUVSº°Ä è½õÿÿƒÄ …Àtv‹O…ÉtUVSº¨Ä è¢õÿÿƒÄ …Àt[‹O …ÉtUVSº Ä è‡õÿÿƒÄ …Àt@‹O…ÉtUVSº˜Ä èlõÿÿƒÄ …Àt%‹…ÿtUVS‹ÏºÄ èOõÿÿƒÄ …ÀtÇD$‹\$]…öt VèaßúÿƒÄ^_‹Ã[YÃhÕh°Ã jejhj 肵þÿƒÄ_‹Ã[YÃÌÌÌÌÌÌÌÌ̸0èFS‹\$t?U‹l$‹NüQUè”iÿÿƒÄ…Àt „ÛuhÔ° Wè>þÿƒÄ‹RWè2þÿƒÄ2ÛƒÆ ƒ>uÇ]h2 WèþÿƒÄ_^¸[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ƒxSVpW‹øts‹\$‹G‹ËëIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀtC‹‹ËIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀtƒÇ ƒwu‘_^ƒÈÿ[Ë_^[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$PQèQÿÿÿƒÄ…À}3ÀËL$…Ét‹T$ RPQècgÿÿƒÄ …Àtâ¸ÃÌÌÌÌÌÌ‹D$…Àt‹H…Ét ‹I…Ét‰D$ÿá€8t‹HëƒÉÿQƒú ‡‹¶’œSÿ$•ˆSjèFÍþÿ‹L$‰ƒÄ¸Ã…Àt‹P‹D$‰¸ËL$Çÿÿÿÿ¸ËT$ǸÃhgh4Æ jèãÎúÿƒÄ …ÀuËL$Ç@Çÿÿÿÿ‰3À9•ÀÃQèZ}‹L$‰3ÀƒÄ9•ÀÃtnƒÀƒø wO¶ˆlXÿ$XX‹RèÌ]ÿÿƒÄÇ^Ã…Òt‹B‰^ÃÇÿÿÿÿ^ÃjVèvÿÿÿ‹Qè®ËúÿƒÄ Ç^ËRèÛxǃÄÇ^Ëÿ"XXNXüW=XÌÌÌÌÌÌÌÌ̸èvô‹F…ÿ„ªŠ„Ét ƒ?„›S…Àt ‹X…Ût‰\$ë ÇD$‹\$¾Éƒù‡pUÿ$DZ‹F…ÀtPWè|ƒÄ][ƒÄÃVWè¬þÿÿƒÄ][ƒÄÃ…ÛtVWjÿÓƒÄ ƒø„*VWè†%ƒÄ…ÀŒó;F ê‹N€,UWèr'UPèƒÄéË…À„è‹@…À„Ý‹][ƒÄ‰L$ÿà…À„È‹@…À„½VWÿЃÄ][ƒÄÃVjÿWèJ%ƒÄ …Àœ…ÛtVWjÿÓƒÄ ƒø„†VWè²%‹F ‹NƒÄ€l‘ìÇD$ …À~>›jUWèç&‹ØƒÄ …ÛtSWè·&SPè`ƒÄ‹D$ @ƒí;F ‰D$ |Ì‹\$…Ût VWjÿÓƒÄ ƒ|$u‹Rè¬ÉúÿǃÄ][ƒÄÃÖXYýXMYmYíXY¸è–òV‹t$‹W¨te‹D$SU‹(U3ÛèêyþÿƒÄ…À~5ë‹t$SUèåyþÿ‹NƒÄj‰D$ÿÑ‹ð|$èÌýÿÿUCèµyþÿƒÄ;Ø|ÎUèxyþÿ‹T$ƒÄ][_Ç^YÃ%P‹FÿЋ|$‹ðèýÿÿƒÄ_^YÃÌÌÌÌÌÌÌÌV‹t$ Wj|$èoýÿÿƒÄ_^ÃÌÌÌÌÌÌÌÌÌV‹t$ W‹|$ jèOýÿÿƒÄ_^ÃÌÌÌÌÌÌÌÌ̸$è¶ñ‹T$0‹ ‹D$4VW‰L$ öÁt"ƒøÿt _ƒÈÿ^ƒÄ$Ër‹Á%À‰t$‰D$ ë6ƒøÿt‹|$@‰D$‹t$‹Ç%À‰D$ ëÇD$ÿÿÿÿ‹t$ÇD$ ‹D$ ‹|$@ç?ÿÿÿU‰|$D÷Át ½÷Çu½SöÁ„g‹T$8‹3ÿ;ß„~öÁtÇD$öÁtÇD$ë‰|$ƒþÿtöÁu ‰t$ ‰D$$ë3À9|$‰|$$•ÀƒÀ‰D$ S3öè&xþÿƒÄ…À~;VSè(xþÿ‹L$P‹T$HƒÄQ‰D$0‹BjÿÿÐPL$8jQè$SøFèëwþÿƒÄ;ð|Å‹T$ RWUèˆr‹L$4ƒÄ ƒá‰D$0‰L$(t‹L$QPUèhrƒÄ ‹t$<‰D$…ö„ƒ|$(t‹T$‹D$‹L$0RPQUVè˜vƒÄ‹T$$‹D$ RPWUVèƒv‹L$\‹T$0‹D$TƒÄQ‹HRÿÑPWVSèăăý…³VèÒqƒÄƒ|$(„ŸVè¾q‹D$ƒÄ[]_^ƒÄ$ÃöÁ„‹RWjÿÿÒP‹D$DjPè1‹ðƒÄ…öu []_3À^ƒÄ$ËL$QVUè’q‹\$HƒÄ ‰D$…Ût>‹T$‹D$RPVUSèÑu‹L$T‹QƒÄWjÿÿÒP‹D$DSPèփăýu Sè(qƒÄ‹D$[]_^ƒÄ$ËJ ÇPVÿÑ‹T$DP‹D$DRPè ƒÄ[]_^ƒÄ$ÃÌÌÌÌÌ‹T$‹B…Àt‹@…Àt‹L$ R‹T$ Q‹L$ RQÿЃÄÊ‹L$„Àuƒzt ƒ9u¸ÿÿÿÿÃVW¾üÿÿÿ<u ‹‹@‹|$‰ë9ru‹ ‹‹|$‰ƒÁë‹D$‹ƒø y„ÊHƒøwyÿ$…x_‹ ‹A‹q é”3À3öé‹‹ƒøÿt9rt…Àt ƒz~ _ƒÈÿ^ÃztôŠÈˆL$D$¾ëX‹T$‹ ÷ÚÒD$#ÐRQè#YÿÿƒÄ_^Ã-tPƒètKz‹ uöA t‹D$…Àt ‰AÇ_¸þÿÿÿ^ËA‹1‹L$…Ét…öt VPQè0îƒÄ _‹Æ^ËT$‹ ÷ÚÒD$#ÐRQèeÿÿƒÄ_^ó^Z_æ^_ª^^‹D$ ‹L$‹T$jjÿPQRè˜ûÿÿƒÄÃÌÌÌ̸èFí‹T$ ‹CU‹l$VWSL$Q3ÿWR‰D$è5þÿÿ‹ð‹D$ƒÄƒøtƒøt ÇD$ƒøýu‰|$ƒþÿu _^3À]ƒÄÃþþu~3öƒ|$ ÿu‰D$ …ítEƒ|$t‹D$$‹L$ PQVWUèAsƒÄ‹E‹L$ST$RPQèºýÿÿƒÄ…ÿt UènƒÄëuƒ|$t‹T$ RVWè¢nƒÄ _^]ƒÄÃ_‹Æ^]ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èVìS‹\$ Š‹KU3íV‹t$ ÇD$ÇD$‰l$„Àt 9.u ^]3À[ƒÄÃ…Ét ‹Q…Òt‰T$‹ê¾ÀWƒø‡Áÿ$…¼c‹L$4‹C‹T$0QR…ÀtP‹D$4PVèúÿÿƒÄ_^][ƒÄËD$0PVèwþÿÿƒÄ_^][ƒÄËL$4‹T$(QjÿRVèZþÿÿƒÄ_^][ƒÄÃ…ít SVjÿÕƒÄ …ÀtNSVè'ƒÄ…À|3;C }.‹K€t!‹VN‹n‹F‰T$‹V ‰l$‰T$‰L$Hë}SD$PL$QT$$RD$XPè h‹l$,ƒÄ…ötT‹L$‹T$‰N‹L$H‰V ‹Ñ+׉F‰n‰Vƨu2Õ;Ó~,hhðÆ h›jhj è{þÿƒÄ_Æ^]3À[ƒÄ ËL$H„Ày)hhðÆ jfjhj èNþÿƒÄ…ötÆ_^]3À[ƒÄ ËT$<…Ò|;T$uo‹T$@;T$ue…ötƨt+ùû‹ï‹t$,…ötŠÐ€âˆ‹T$0…Òt$ ˆ‹D$ …Àt‰(‹D$(…ÀtŠT$ˆ‹D$$…Àt‹T$‰‹D$4_^]‰¸[ƒÄ À|$Dt _^]ƒÈÿ[ƒÄ Ã…ötÆh$hðÆ h¨jhj 茎þÿƒÄ_^]3À[ƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸ èFáS‹\$U‹l$…íu]3À[ƒÄ ËW‹|$ ‹?S‰|$Q¨„%ÀP‹FPRL$$QT$4RD$+PjL$8jQèáýÿÿ‹|$<ƒÄ,…Àuh2ëCƒøÿu _] À[ƒÄ À|$uh:hðÆ jxë'S‹\$jVST$ RUèØƒÄ…Àu$hBhðÆ j:h„j è©þÿƒÄ_]3À[ƒÄ Ã+|$߀|$t"SL$è&ýÿÿƒÄ…ÀuChMhðÆ h‰ë…Ût.hXhðÆ jwh„j èRþÿƒÄVUèˆíÿÿƒÄ_]3À[ƒÄ ËD$ ‹L$_]‰¸[ƒÄ ÃVR‹T$0RUè)ƒÄ_][ƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èÖ߀|$‹D$V‹0W‹ùu÷‰0_¸^ƒÄÃSU½…ÿ~tƒÿ|€>u€~uƒÆƒí„ºƒïëKWD$PL$$QT$ RD$ P‹Þ‰t$$èÊdƒÄ„ÀxT‹L$¨t+ñ÷‰t$$‹ñtEë‹T$4 +Þû…ÿ…ítbhihðÆ h‰h¾j è<ŒþÿƒÄ][_3À^ƒÄÃhhðÆ jfjhj èŒþÿh^hðÆ j:h¾j èŒþÿƒÄ(][_3À^ƒÄËD$$][‰0_¸^ƒÄÃÌ̸è¶Þ€d$(S‹\$ V‹t$(‹‰D$…Ûu8\$0u‹L$,Á‰^C[ƒÄÃU‹l$0W…íŽë›ƒý‰D$$|€8u €x„(UT$ R‰D$4‹ðD$ PL$ QT$QSèùñýÿƒÄ…À„à‹T$‹CVRÇPèÿÝ‹D$ƒÄ ƉD$‹L$$+Èé…íðþÿÿ€|$8„ñhºhðÆ h‰jjj è]ŠþÿƒÄ_]^3À[ƒÄÃÀ€|$8‰D$…ºh™hðÆ hŸjjj è&ŠþÿƒÄ_]^3À[ƒÄÃhhðÆ jfjhj èŠþÿƒÄh£hðÆ j:jjj èì‰þÿƒÄ_]^3À[ƒÄÃh$hðÆ h¨ëÁhÉhðÆ jAhŒj 趉þÿƒÄ_]^3À[ƒÄÃh­hðÆ hÅjjj 葉þÿƒÄ_]^3À[ƒÄËL$0_]^‰¸[ƒÄÃ̸èFÜ‹L$ ‹T$V‹t$,D$PQR‹T$42ÉÆD$èÒúÿÿƒÄ ^ƒÄÃÌÌÌÌÌÌÌÌÌ̸ è܃|$$U‹l$0V‹ñÆD$ u h hðÆ j}jlj èýˆþÿƒÄ^3À]ƒÄ ËD$8€8Su‹ÞƒÎÿë‹X‰\$Wƒûü…¡…ö|"hhðÆ jjlj è·ˆþÿƒÄ_[^3À]ƒÄ À|$Ht"h"hðÆ j~jlj 莈þÿƒÄ_[^3À]ƒÄ ËL$L‹|$8‹QjjjÿUT$(Rj‰D$0jD$3PL$‹I…Ét7öAt1‹T$‹A‹T$…Òu ÇBËI juh$Ç QRP舖úÿƒÄÃ3ÀÃÌ‹D$…Àt2‹…Ét,‹D$‹@…Àt!ö@t‹@ÁtÇÇ@Ç@ÃÌÌÌÌÌ‹D$…ÀtC‹…Ét=‹D$‹@…Àt2ö@t,V‹pñt#‹…Àt Pè=¤úÿƒÄÇÇFÇF^ÃÌÌÌÌ‹D$V…Àt‹…Ét‹D$‹@…Àt ö@t‹pñu¸^Ë…Àt Pèæ£úÿƒÄW‹|$h¯h$Ç Wè¢úÿƒÄ ‰…Àu_^ËL$WQPèXÍƒÄ ‰~_ÇF¸^ÃÌ‹D$ V…ÀtY‹…ÉtS‹D$‹@…ÀtHö@tB‹pñt;ƒ~u5W‹|$…ÿt‹N‹‹QRPèýÌ‹NƒÄ ‹D$ _…Àt‹V‰¸^Ã3À^ÃÌÌÌÌÌÌÌÌÌÌ‹D$÷t‹D$Ë@‹L$ÃÌÌÌÌÌV‹t$ ÷u‹Æ^ËFWÿЋL$ ‹ø‹Gu ‹G…Àt?_^Ã÷t ‹R貤þÿë‹PèHHÿÿ‹w‹W ƒÄ3É…ö~ 9t6AƒÂ;Î|ô‹G…Àu$ƒ|$thh$Ç h¤jnj èÇxþÿƒÄ3À_^Ã_B^ÃÌÌÌÌÌÌÌÌ̸ìÈ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hìÈ PQRè§üÿÿƒÄÃÌÌÌ‹D$‹L$hìÈ PQèìäÿÿƒÄ ÃÌÌÌÌÌÌÌÌhìÈ è–ÕÿÿƒÄÃÌÌ‹D$hìÈ Pè!ÙÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸É ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hÉ PQRè'üÿÿƒÄÃÌÌÌ‹D$‹L$hÉ PQèläÿÿƒÄ ÃÌÌÌÌÌÌÌÌhÉ èÕÿÿƒÄÃÌÌ‹D$hÉ Pè¡ØÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸$É ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h$É PQRè§ûÿÿƒÄÃÌÌÌ‹D$‹L$h$É PQèìãÿÿƒÄ ÃÌÌÌÌÌÌÌÌh$É è–ÔÿÿƒÄÃÌÌ‹D$h$É Pè!ØÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸@É ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h@É PQRè'ûÿÿƒÄÃÌÌÌ‹D$‹L$h@É PQèlãÿÿƒÄ ÃÌÌÌÌÌÌÌÌh@É èÔÿÿƒÄÃÌÌ‹D$h@É Pè¡×ÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸\É ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h\É PQRè§úÿÿƒÄÃÌÌÌ‹D$‹L$h\É PQèìâÿÿƒÄ ÃÌÌÌÌÌÌÌÌh\É è–ÓÿÿƒÄÃÌÌ‹D$h\É Pè!×ÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸xÉ ÃÌÌÌÌÌÌÌÌÌ̸”É ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h”É PQRèúÿÿƒÄÃÌÌÌ‹D$‹L$h”É PQè\âÿÿƒÄ ÃÌÌÌÌÌÌÌÌh”É èÓÿÿƒÄÃÌÌ‹D$h”É Pè‘ÖÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸°É ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h°É PQRè—ùÿÿƒÄÃÌÌÌ‹D$‹L$h°É PQèÜáÿÿƒÄ ÃÌÌÌÌÌÌÌÌh°É è†ÒÿÿƒÄÃÌÌ‹D$h°É PèÖÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ÌÉ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hÌÉ PQRèùÿÿƒÄÃÌÌÌ‹D$‹L$hÌÉ PQè\áÿÿƒÄ ÃÌÌÌÌÌÌÌÌhÌÉ èÒÿÿƒÄÃÌÌ‹D$hÌÉ Pè‘ÕÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸èÉ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hèÉ PQRè—øÿÿƒÄÃÌÌÌ‹D$‹L$hèÉ PQèÜàÿÿƒÄ ÃÌÌÌÌÌÌÌÌhèÉ è†ÑÿÿƒÄÃÌÌ‹D$hèÉ PèÕÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸Ê ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hÊ PQRèøÿÿƒÄÃÌÌÌ‹D$‹L$hÊ PQè\àÿÿƒÄ ÃÌÌÌÌÌÌÌÌhÊ èÑÿÿƒÄÃÌÌ‹D$hÊ Pè‘ÔÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ Ê ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h Ê PQRè—÷ÿÿƒÄÃÌÌÌ‹D$‹L$h Ê PQèÜßÿÿƒÄ ÃÌÌÌÌÌÌÌÌh Ê è†ÐÿÿƒÄÃÌÌ‹D$h Ê PèÔÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸<Ê ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h<Ê PQRè÷ÿÿƒÄÃÌÌÌ‹D$‹L$h<Ê PQè\ßÿÿƒÄ ÃÌÌÌÌÌÌÌÌh<Ê èÐÿÿƒÄÃÌÌ‹D$h<Ê Pè‘ÓÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸XÊ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hXÊ PQRè—öÿÿƒÄÃÌÌÌ‹D$‹L$hXÊ PQèÜÞÿÿƒÄ ÃÌÌÌÌÌÌÌÌhXÊ è†ÏÿÿƒÄÃÌÌ‹D$hXÊ PèÓÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸tÊ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$htÊ PQRèöÿÿƒÄÃÌÌÌ‹D$‹L$htÊ PQè\ÞÿÿƒÄ ÃÌÌÌÌÌÌÌÌhtÊ èÏÿÿƒÄÃÌÌ‹D$htÊ Pè‘ÒÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ¸Ê ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hÊ PQRè—õÿÿƒÄÃÌÌÌ‹D$‹L$hÊ PQèÜÝÿÿƒÄ ÃÌÌÌÌÌÌÌÌhÊ è†ÎÿÿƒÄÃÌÌ‹D$hÊ PèÒÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸¬Ê ÃÌÌÌÌÌÌÌÌÌ̸ÈÊ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h¬Ê PQRèõÿÿƒÄÃÌÌÌ‹D$‹L$h¬Ê PQèLÝÿÿƒÄ ÃÌÌÌÌÌÌÌÌh¬Ê èöÍÿÿƒÄÃÌÌ‹D$h¬Ê PèÑÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸äÊ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$häÊ PQRè‡ôÿÿƒÄÃÌÌÌ‹D$‹L$häÊ PQèÌÜÿÿƒÄ ÃÌÌÌÌÌÌÌÌhäÊ èvÍÿÿƒÄÃÌÌ‹D$häÊ PèÑÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ¸Ë ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hË PQRèôÿÿƒÄÃÌÌÌ‹D$‹L$hË PQèLÜÿÿƒÄ ÃÌÌÌÌÌÌÌÌhË èöÌÿÿƒÄÃÌÌ‹D$hË PèÐÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸Ë ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hË PQRè‡óÿÿƒÄÃÌÌÌ‹D$‹L$hË PQèÌÛÿÿƒÄ ÃÌÌÌÌÌÌÌÌhË èvÌÿÿƒÄÃÌÌ‹D$hË PèÐÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸8Ë ÃÌÌÌÌÌÌÌÌÌ̸TË ÃÌÌÌÌÌÌÌÌÌ̸pË ÃÌÌÌÌÌÌÌÌÌ̸ŒË ÃÌÌÌÌÌÌÌÌÌÌSW‹|$3Û…ÿu_3À[Ã÷GU‹l$Vtjh¤v Uè“ÚýÿƒÄ ƒø…·‹Ø‹…Àu"jh¬Ë UèrÚýÿƒÄ ƒø…–Ø^]_‹Ã[Ã3ö…À~ó¤$…öt3¸ë ê÷îÖÁú‹ÂÁèÂkÀ#‹Î+Èujh¨Ë Uè#ÚýÿƒÄ ƒøuKØ‹W‹ Ô°2¶ÁêŠ ˆT$¶jT$ƒàŠ RUˆL$%èæÙýÿƒÄ ƒøuFØ;7|‡^]_‹Ã[Ã^]_ƒÈÿ[ÃÌÌÌÌÌÌÌ̸è¦À‹L$(‹T$‹D$ SUV‹t$0WQ3ÿVR‰|$‰|$$‰|$ ÇD$(Ç@èíÚýÿƒÄ ƒøŒ¦ë‹|$€|ÿ uHÆ0…À„Œ€|ÿ uHÆ0…À„x3Û€|ÿ\”Ã3Ò‰\$$…À~*Š 2€ù0|€ù9~€ùa|€ùf~ €ùA| €ùFB;Ð|Úë‹ÂƒøÆ0Œ-ƒ|$‹ît€>0ÇD$u €~0unƒè+ËÈá€yIƒÉþA…™+‹ØÑû;;D$‰D$ ~Pƒ|$4_uhªh°Ë Vè±”úÿƒÄ ë‹T$‹D$h¬h°Ë VRPè’•úÿƒÄ…À„Ò‰t$‹t$4‰D$3ÿ…Û~[ëI3ö¶.HЃù w‹ÁëHŸƒùwƒèWëP¿ƒú‡Ãƒè7‹L$‹L$ÊŠÀâ ÐFƒþˆ|¸GƒÅ;û|®‹t$4ƒ|$$‹D$ ‰D$„–‹D$8‹L$,PVQèGÙýÿƒÄ ƒø\þÿÿh×h°Ë h–jfj èÃkþÿƒÄ_^]3À[ƒÄÃh¢h°Ë h‘ëÙh¯h°Ë jAjfj èkþÿ‹D$$ƒÄ…ÀtÅPè?•úÿƒÄ_^]3À[ƒÄÃhÃh°Ë hë•‹L$0‹T$_^]‰‰Q¸[ƒÄÃÌÌÌÌÌÌÌSW‹|$3Û…ÿu_3À[ËUV…Àu&‹D$jh v Pè×ýÿƒÄ ƒø…š‹Ø^]_‹Ã[Ã3ö…À~ó‹l$¤$…öt3¸ë ê÷îÖÁú‹ÊÁéÊkÉ#‹Ö+Ñujh¨Ë Uè³ÖýÿƒÄ ƒøuKØ‹G¶0‹ ذÆÁêŠ ˆT$¶jT$ƒàŠ RUˆL$%èvÖýÿƒÄ ƒøuFØ;7|‡^]_‹Ã[Ã^]_ƒÈÿ[ÃÌÌÌÌÌÌÌ̸è6½‹D$$‹L$SU‹l$(VWP3öUQ‰t$‰t$ ‰t$$è×ýÿƒÄ ƒøŒë‹ÿ‹t$€|(ÿ uHÆ(…À„k€|(ÿ uHÆ(…À„W3Ò€|(ÿ\”‹úPÿ‰|$ …Ò~*Š *€ù0|€ù9~€ùa|€ùf~ €ùA| €ùFJ…ÒÚë‹ÂƒøÆ(Œ +Ç‹Èá€yIƒÉþA…™+‹ØÑû3;D$‰D$~Kƒ|$4^uh¢hÈË Vèq‘úÿƒÄ ë‹T$h¥hÈË VRèבúÿƒÄ…À„Õ‹l$0‰D$‰t$3ÿ…Û~^3öë›¶.HЃù w‹ÁëHŸƒùwƒèWëP¿ƒú‡Ãƒè7‹L$‹L$ÊŠÀâ ÐFƒþˆ|¸GƒÅ;û|¦‹l$0ƒ|$ ‹D$‰D$„–‹L$4‹T$(QURè ÖýÿƒÄ ƒø}þÿÿhÐhÈË h–jgj è…hþÿƒÄ_^]3À[ƒÄÃhšhÈË h‘ëÙh¨hÈË jAjgj èRhþÿ‹D$$ƒÄ…ÀtÅPè’úÿƒÄ_^]3À[ƒÄÃh¼hÈË hë•‹t$‹D$,‹L$_‰0^]‰H¸[ƒÄÃÌÌÌÌÌ‹D$‹L$hdÌ PQèlÔÿÿƒÄ ÃÌÌÌÌÌÌÌÌ‹D$hdÌ Pè±ÈÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$h¼Ì PQè,ÔÿÿƒÄ ÃÌÌÌÌÌÌÌÌ‹D$h¼Ì PèqÈÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ÌèVº¡Àç3ĉ„$È‹„$Ô‹Œ$ØS‹œ$ÔV3ö‰\$‰D$‰L$ÇD$…Ûu^3À[‹Œ$È3Ìè0ºÄÌÃUWh¼Ì èRÄÿÿ‹øƒÄ…ÿ„hdÌ è;Äÿÿ‹ðƒÄ…ö„ùjÇèþÿ‹WƒÄ‰èöÿÿ‹O‰A‹W‹B…À„ËjSÇèâ×üÿh¼Ì ‹Ø‹GjW‰èÓÿÿ‹N‹Q‹è‰*‹jÇ è¥Œþÿ‹N‹ƒÄ‰è¶õÿÿ‹N‹‰B‹F‹ƒy„jƒ|$ ‹Ð‹‹HÇujVèCþÿÿW‹Øè›þÿÿVèUþÿÿ‹ÃéSh«h Í Sè.ŽúÿƒÄ ‰D$…Àu h­h Í jAh¢j èûeþÿƒÄéþ‹W‹L$$‰BD$PQè×üÿhµh Í UèÞúÿƒÄ‰D$…Àuh·ë®‹jÿhÍ Rè];ƒÄ …Àuh½ë‘‹F‹H‹T$D$PW‰QèÇýÿÿ‹O‹QSRèJúÿƒÄƒ|$uÇD$`AjhäÌ „$àhPÿT$(ƒÄ‰D$…Àt hËh Í jgh¢j è-eþÿƒÄé0„$ØPŠ@„Éuù+ƒ¼$ì‰D$tSjèÝÉþÿ‹T$PjŒ$äQR‹ÁPèõ£þÿf¡àÌ ‹ ØÌ ‹ÜÌ f‰„$¸ƒÄ‰Œ$艔$ì‰D$jŒ$¼QjP”$èRjèuÉþÿPèºþÿP詬þÿ„$øhPèGúÿ‹N‹Q‹BL$TQ‰D$<èpÄþÿƒÄ,j”$¼Rjè̹þÿPD$æÿÿ‹øƒÄH…ÿuhAh Í hžë3‹G‹H‰L$‹W‹PL$QUèùÒüÿ‹ØƒÄ …ÛuhHh Í hhÉj èÅaþÿƒÄh¼Ì Wè—Âÿÿ‹Œ$̃Ä_]‹Ã[3Ì謴ļÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$jPQRèúùÿÿƒÄÃÌÌÌÌÌÌ‹L$ S‹\$ ‹VWhdÌ QT$R3öV‰D$$èlåÿÿ‹øƒÄ…ÿu!hüh Í johÈj è+aþÿƒÄ_^3À[˃8 …“‹@j PhÍ ÿ€! ƒÄ …Àu{‹O‹‹Pè’ŒþÿƒÄƒøt h h Í h¦hÈj èÏ`þÿƒÄë2‹D$…Àu¸`A‹L$ ‹W‹rQP‹D$Pè÷üÿÿ‹ðƒÄ …öt‹L$‰ hdÌ WèmÁÿÿƒÄ_‹Æ^[Ãhh Í h’hÈj èi`þÿhdÌ Wè>ÁÿÿƒÄ_^3À[ÃÌÌÌÌÌ‹D$‹L$ ‹T$jP‹D$ QRPèÅþÿÿƒÄÃÌSW‹|$3Û…ÿu_3À[ËUV…Àu&‹D$jh¬Ë PèöËýÿƒÄ ƒø…š‹Ø^]_‹Ã[Ã3ö…À~ó‹l$¤$…öt3¸ë ê÷îÖÁú‹ÊÁéÊkÉ#‹Ö+Ñujh¨Ë Uè£ËýÿƒÄ ƒøuKØ‹G¶0‹ ܰÆÁêŠ ˆT$¶jT$ƒàŠ RUˆL$%èfËýÿƒÄ ƒøuFØ;7|‡^]_‹Ã[Ã^]_ƒÈÿ[ÃÌÌÌÌÌÌÌ̸è&²‹L$(‹T$‹D$ SUV‹t$0WQ3ÿVR‰|$‰|$ ‰|$(ÇD$$Ç@ èmÌýÿƒÄ ƒøŒ¤ë‹|$€|ÿ uHÆ0…À„Š€|ÿ uHÆ0…À„v3Û€|ÿ\”Ã3Ò‰\$$…À~*Š 2€ù0|€ù9~€ùa|€ùf~ €ùA| €ùFB;Ð|Úë‹ÂƒøÆ0Œ+ƒ|$‹ît€>0ÇD$u €~0unƒè+ËÈá€yIƒÉþA…™+‹ØÑû;;D$‰D$ ~Kƒ|$4_uhh$Í Vè1†úÿƒÄ ë‹T$h h$Í VRè—†úÿƒÄ…À„Õ‰t$‹t$4‰D$3ÿ…Û~^3öë›¶.HЃù w‹ÁëHŸƒùwƒèWëP¿ƒú‡Ãƒè7‹L$‹L$ÊŠÀâ ÐFƒþˆ|¸GƒÅ;û|¦‹t$4ƒ|$$‹D$ ‰D$„–‹D$8‹L$,PVQèÉÊýÿƒÄ ƒø^þÿÿhËh$Í h–jej èE]þÿƒÄ_^]3À[ƒÄÃh•h$Í h‘ëÙh£h$Í jAjej è]þÿ‹D$$ƒÄ…ÀtÅPèÁ†úÿƒÄ_^]3À[ƒÄÃh·h$Í hë•‹L$0‹T$_^]‰‰Q¸[ƒÄÃÌÌÌÌÌÌÌÌÌV‹t$…öu3À^ËSUWjPè¦åÿÿ‹N‹V‹ø‹jRÿÐøjWjè‹1‹\$4ƒÄ‹è…Ût?‹ jjWT$ jR‰L$(èÇ5‹D$(PQèZåÿÿ‹V‹N‹D$0PQÿÒ‹D$8‰ƒÄ$‹Å_][^ÃÌÌÌÌÌÌÌÌÌÌVjhh<Í j è1„úÿ‹ðƒÄ …öujhh<Í jAjsj è\þÿƒÄ3À^Ãjè¨2ƒÄ‰…ÀtìÇFÇF‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$…öt'‹Pè¿2‹FƒÄ…Àt ‹N‹P QÿÒƒÄVèc…úÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸,èf®S‹\$4VW‹|$@‹‰|$0‰D$,ÇD$:…Ût‹3…öuè*ÿÿÿ‹ð…öuFRé‹L$D‹‰D$ …Éu‰L$(ëÁ‰D$(L$DQT$RèS5ƒÄ…Àu ¸U鈋L$$‹D$ QT$RV‰D$8èÚãÿÿƒÄ …Àu¸Vëb‹L$,‹D$ +ÈL$$ƒ~„¹‰D$,‹D$$‹VPL$Q‹JFPÿÑƒÄ …Àu¸Yë"‹T$,+T$ D$ T$$Pè60ƒÄ…Àun¸`‹L$Ph<Í Qh‘j ‰D$HèoZþÿ‹‹T$@+ÐRPè 2ƒÄ…öt/…Ût93t'‹PèI1‹FƒÄ…Àt ‹N‹P QÿÒƒÄVèíƒúÿƒÄ_^3À[ƒÄ,ËD$ ‰…Ût‰3_‹Æ^[ƒÄ,ÃÌÌÌÌÌÌÌÌÌÌÌÌVWjphTÍ j4è‚úÿ‹ð3ÿƒÄ ;÷ujphTÍ jAh­j èÐYþÿƒÄ_3À^É>è‘[ÿÿ‰F;Çtíjèc0ƒÄ‰F;Çt܉~ ‰~‰~‰~‰~3À‰F ‰F$‰F(‰F,_ÇF0‹Æ^ÃV‹t$…ötmh…hTÍ jF0jÿPèðtúÿƒÄ…ÀO‹F…Àt Pè,[ÿÿƒÄ‹F…Àt Pè<0ƒÄ‹F …Àt PèÜÍþÿƒÄ‹F…Àtƒ~t PèÖ‚úÿƒÄVèÍ‚úÿƒÄ^ÃÌÌÌÌÌÌÌ̸,èÖ«S‹\$8‹U‹l$8VW‰\$4‰D$0ÇD$:…ít‹u…öuèÈþÿÿ‹ð…öuFKé3‹L$H‹‰D$…Éu‰L$,ëÁ‰D$,L$HQT$RèÁ2ƒÄ…Àu ¸Néù‹L$(‹D$QT$R~W‰D$<èõYÿÿƒÄ …Àu ¸OéÍ‹D$‹T$0‹L$(+ÐÊQ‰D$4D$‰L$,PNQè áÿÿƒÄ …Àu ¸Pé•‹T$0+T$T$(‹‹Q覃þÿPèPþÿPèê±þÿƒÄ ‰F…ÀuÇD$¥¸WëZ‹‹Bƒ8u,‹@‹ƒù~ÇD$‡¸`ë7‹@QPN Qè«ƒÄ ë3À‰F ‰F$‰F(‰F,T$Rè3-ƒÄ…ÀuR¸hP‰D$<‹D$hTÍ PhŸj èlWþÿ‹‹L$D+ÈQPè/ƒÄ…öt…ít9ut VèÇýÿÿƒÄ_^]3À[ƒÄ,ËT$‰…ít‰u_‹Æ^][ƒÄ,ÃÌÌ̸èö©VWjjjè ,‹t$ ƒÄ ‹ø…öt.‹jjjL$jQ‰D$èD0ŠD$$‹T$ˆ‹L$ƒÄA‰‹Ç_^YÃÌÌÌÌÌÌÌÌÌ̸ è–©‹L$V‹t$‹QT$R‰D$ D$ PL$QT$(RèÍ.ƒÄ„Ày¸fëº9T$tBtë 9T$t$¸jjnhlÍ PhŽj èPVþÿƒÄƒÈÿ^ƒÄ ËL$¶Ê‹T$…Òt‰‰^ƒÄ ÃÌÌÌÌÌÌÌÌÌÌ̸ìÍ ÃÌÌÌÌÌÌÌÌÌ̸Î ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hìÍ PQRèÚÿÿƒÄÃÌÌÌ‹D$‹L$hìÍ PQèLÂÿÿƒÄ ÃÌÌÌÌÌÌÌÌhìÍ èö²ÿÿƒÄÃÌÌ‹D$hìÍ Pè¶ÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hÎ PQRè—ÙÿÿƒÄÃÌÌÌ‹D$‹L$hÎ PQèÜÁÿÿƒÄ ÃÌÌÌÌÌÌÌÌ‹D$PhìÍ èA.ÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌWèJÎþÿPèÄÆýÿ‹øƒÄ…ÿujxh8Î jAhÑj èUþÿƒÄ3À_ËD$SVPWè²Äýÿ‹L$‹T$ Q‹ðVRèÀ2ÿÿjjj V‹Øè2ÃýÿVèÜÄýÿWè¿ýÿƒÄ,^‹Ã[_ÃÌÌÌÌÌÌÌÌÌÌÌÌÌWèÊÍþÿPèDÆýÿ‹øƒÄ…ÿuhŠh8Î jAhÐj èƒTþÿƒÄ3À_ËD$SVPWè/Äýÿ‹L$‹ðjVQè 0ÿÿ‹ØƒÄ…Ûuhh8Î jnhÐj è?TþÿƒÄjjj VèÂýÿVè:ÄýÿWèt¾ýÿƒÄ^‹Ã[_ÃÌÌÌÌÌÌÌÌÌÌ̸èæ¦SU‹l$W3ÿU‰|$3ÛèA.þÿƒÄ…Àލ›…Ûtjhа Vè¿¿ýÿƒÄ WU»è .þÿ‹PèXþÿƒÄ = !tƒøt ƒø@u!hôŠ ëBhì ë;hdÎ ë4-¡t(ƒètƒ|$ t3Ûë&h˜@ VèÀýÿ‰\$ëh\Î ëhTÎ VèÀýÿƒÄUGè™-þÿƒÄ;øŒ^ÿÿÿ_]¸[YÃÌÌÌ̸@覡Àç3ĉD$<‹D$H‹L$L‹T$\‰D$‹D$`S‰D$‹D$hU‰D$‹D$XV‹t$P3íW‰L$$‰T$»ÈÐ ÇD$°Ð ©uÇD$œÐ ¿˜Ð ©u¿2 ¨@„^…É„VL$(j Qè,GþÿƒÄ3ɤ$ŠD ($< }0ë7ˆD (Aƒù |æWh„Ð VÆD$TèõþÿhdÐ Vèêþÿ‹\$(ShHÐ VèÚþÿh<Ð Vèï¾ýÿ‹T$DRè%þÿÿWWD$\Ph Ð Vè³þÿƒÄ@WWhøÏ Vè£þÿWL$WÿՃąÀt Wÿ„! ƒÄˆF€>uá_]ë3Û‹D$…ÀtPèe¹ýÿ‹ðƒÄ…öu^3À[Ã3öhh8Î jèäwúÿƒÄ …Àt቉pP‹D$‹HQè )þÿƒÄ^¸[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸ èv¢‹D$ $QV‰D$è,þÿƒÄ…À}3ÀƒÄ ÃPVèÐ)þÿƒÄƒÄ ÃÌÌÌÌÌÌÌÌÌV‹t$‹…Àt PèyúÿƒÄ‹F…Àt PèÿxúÿƒÄVèöxúÿƒÄ^Ã̸袡Àç3ĉ„$UV‹´$W‹¼$è"åýÿPèœÀýÿ‹èƒÄ…íu_^]‹Œ$3Ìèí¡ÄÃVU蔾ýÿ‹ðŠ„$$ƒÄ„ÀyChD$PWèä¹ýÿƒÄ …ÀŽÁPL$QVèºýÿhT$RWè½¹ýÿƒÄ…ÀÝ陨thØÐ VèýýÿƒÄhD$PWè¿»ýÿƒÄ …À~pS¤$3Û…À~%T$JëIŠ €ù u»ë€ù uH…Àç…ÀtPL$QVèºýÿƒÄ „Ûtjh˜Ð Vèó¹ýÿƒÄ hT$RWèP»ýÿƒÄ …À™[jjj Vè<¼ýÿVèæ½ýÿUè ¸ýÿ‹Œ$$ƒÄ_^]3̸è ÄËD$SUVW‹Ù…ÀtGPè ·ýÿ‹èƒÄ…íu_^]3À[À}‹õt+d$¾>Wÿˆ! ƒÄ…Àt Wÿ„! ƒÄˆF€>uÝë3í…Ût;Sè¿¶ýÿ‹ØƒÄ…Ût³€;‹ót'¾>Wÿˆ! ƒÄ…Àt Wÿ„! ƒÄˆF€>uÝë3Ûhñh8Î j èuúÿ‹ðƒÄ …ö„gÿÿÿh §‰.‰^èË$þÿƒÄ‰F÷Ø_À#Æ^][ÃÌÌÌÌÌÌÌÌÌ̸覟¡Àç3ĉ„$V3ÀW‹ñh §‰t$‰D$ ‰D$è|$þÿ‹øhD$ PV‰|$èæ¹ýÿƒÄ…ÀŽ/SUƒ|$t¶L$ Qÿ|! ƒÄ¾…Àu¾ŠD$ 3í\$ ‹Ë„À„< „þ< „öVÿƒú‡Þÿ$•ð¯<:…ϾÆèHø‹øè‘ø‹èKé±<;u3Æè+ø‹øètøU‹Èè,þÿÿ‹T$PR‰D$è%þÿƒÄ 3íKuëz<(uv‰t$¾ëk<)ug‹t$ëa<=u]¾ÆèÖ÷‹øèø‹èKëB<;u*¾Æè·÷‹øèøP‹D$UPèûÿÿƒÄ 3íKë<"u–¾ë <"u¾ŠCC„À…úþÿÿƒþuT‹ùŠ „Ét€ù"t9¶ÉQÿ|! ƒÄ…Àt ŠOG„Éuâ3ÿè˜÷U‹ÈèPýÿÿ‹T$PR‰D$èA$þÿëPG¾8÷ßÿ#øëÔƒþu@‹ùŠ „Ét"d$€ù"tq¶ÁPÿ|! ƒÄ…Àt ŠOG„Éuâ3ÿè;÷‹L$PUQèOúÿÿƒÄ T$ ;Út‹L$h‹ÂPQèâ·ýÿƒÄ …Àþýÿÿ‹D$][_^‹Œ$3ÌèlÄÃG¾8÷ßÿ#øëœ‹Œ$‹Ç_^3ÌèEÄÃI®)®y®˜®Ñ®o®ÌÌÌÌÌÌÌ̸èæœ‹D$Ç$…ÀtÇSU‹l$‹Íèýÿÿ‹Ø…Ûu&huh8Î hÊhÒj èÃIþÿƒÄ]3À[ƒÄÃVWD$PSÇD$Ñ è#&þÿƒÄ…ÀŒ‰PSèñ#þÿ‹ðƒÄ…ö„u‹~…ÿ„j¹|Ñ ‹Ç‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À…FhpÑ èÙöƒÄ…À„‹P…Ò„L$Q‹Íè×ùh`­S‹ðèÊ%þÿ‹l$ƒÄ …ö„ËUèE#þÿƒÄƒø…¹jUèA#þÿƒÄ‹È‰D$èüÿÿ‹ð…öu3h•h8Î hËhÒj è²HþÿhðdUèg%þÿƒÄ_^]3À[ƒÄÃhÑ èðøÿÿ‹øƒÄ…ÿ„4‹G…À„)ºPÑ ‹ÈŠ:u„ÛtŠY:ZuƒÁƒÂ„Ûuä3ÉëɃÙÿ…Ét~¹4Ñ ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀtNh`­VèÌ$þÿh¦h8Î hÐhÒj èñGþÿ‹WRh,Ñ jèáIþÿhðdUè–$þÿƒÄ0_^]3À[ƒÄÃh`­Vè~$þÿ‹D$4‹|$PWèÿòÿÿ‹ðƒÄ…öuh®h8Î hÇéÔþÿÿ‹\$(…Ût#jUèâ!þÿW‰èʱýÿUè”!þÿƒÄ_‹Æ^][ƒÄÃhðdUè$þÿƒÄ_‹Æ^][ƒÄÃh`­Vè$þÿhŸh8Î hÏé;hŒh8Î hÍé^þÿÿh`­SèÑ#þÿh†h8Î hÎé¹Ñ ‹Ç›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àts¹øÐ ‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀtCh¿h8Î hÈhÒj è|Fþÿ‹NQh,Ñ jèlHþÿh`­Sè!#þÿƒÄ(_^]3À[ƒÄÃh`­Sè #þÿ‹T$4RUèŽñÿÿƒÄ…ÀuShÈh8Î hÆhÒj èFþÿƒÄ_^]3À[ƒÄÃh`­SèÄ"þÿh{h8Î hÌhÒj èéEþÿƒÄ3À_^][ƒÄÃÌÌÌÌÌÌÌÌÌÌÌ̸覘¡Àç3ĉ„$ U‹¬$VW‹¼$ ‹ÏèÐøÿÿ‹ð…öu8hþh8Î hÊhÓj èEþÿƒÄ_^3À]‹Œ$ 3Ìèt˜ÄÃSD$PVÇD$Ñ èÎ!þÿƒÄ…ÀŒØPVèœþÿ‹ØƒÄ…Û„Ä‹C…À„¹¹ Ñ Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àt;hh8Î hÈhÓj èÛDþÿ‹KQh,Ñ jèËFþÿh`­Vè€!þÿƒÄ(ëyh`­Vèp!þÿhT$(RWèЯýÿƒÄ…À~#PD$ PUè}°ýÿhL$,QWè­¯ýÿƒÄ…ÀÝ3Ò…À‹Âë+hh8Î hÉhÓj èPDþÿh`­Vè!þÿƒÄ3À‹Œ$[_^]3Ìè9—ÄÃÌÌÌÌÌÌ̸èö–V‹òW‹ù…ötGj D$PVÿü ‹L$ƒÄ …Ét €9t>;Êw"…À}&h‡hTÓ h»h¶j èÈCþÿƒÄ_3À^ƒÄËT$‰…É„˜+ñþ„ŽŠ ¾ÁƒÀ¿ƒøwA¶€0·ÿ$…·_Ǹ^ƒÄÃ_Ç@¸^ƒÄÃ_ÇÀ¸^ƒÄÃh¨hTÓ hºh¶j ˆL$ÆD$è3CþÿL$QhLÓ jè"EþÿƒÄ _3À^ƒÄÃ_Ç€¸^ƒÄËÿ§¶ ·¸¶–¶ɶÌÌÌÌÌÌÌÌÌÌÌ‹D$‹ƒúÿt(ƒ|$u!hhTÓ h³h°j è£BþÿƒÄ3ÀÃV‹°¤ƒþu"h hTÓ h®h°j èvBþÿƒÄ3À^ÃL¶F ˆ‰°¤ƒúÿt*‰‹P‰Q‹T$ÇÿÿÿÿÇ@ÿÿÿÿ‹D$‰A‰Q ¸^ËD$ ‹T$‰‹D$‰Q‹T$‰A‰Q ¸^ÃSU‹l$ VW‹ùƒÿÿu‹ÅPŠ@„Éuù+‹ø‹€! ¸à°£< 3ö;xu‹WUPÿÓƒÄ …Àt¡< FƒÀ £< ƒþ/rÚ_^]ƒÈÿ[Ë < ‹A_^][ÃÌÌÌV‹t$…ötJj D$ PVÿü ‹L$ƒÄ …Ét€9t ‹T$ ò;Îu"…À}"hFhTÓ h»h´j èPAþÿƒÄ3À^ÃjP‹D$PèÿÿƒÄ …ÀuhKhTÓ jAh´j èAþÿƒÄ3À^ø^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$UVW‹|$3í3ö3ɋÅÿ~€8:tA@;Ï|õë p‹ë+îï+ËøS‹Ïè¶þÿÿƒÄƒøÿu3h'hTÓ hÂh±j è£@þÿSh„Ó jè–BþÿƒÄ _^]ƒÈÿ[éuA‹L$‰A‰q…öu,€<;t&h4hTÓ h½h±j èU@þÿƒÄ_^]ƒÈÿ[Ã_^]3À[Ãÿÿþÿƒøw5ÿ$…È»‹D$ƒ8ÿthAhTÓ hµë·XP‹Í‹ÖèëûÿÿƒÄ…Àt²_^]¸[ÃD$P\$‹Í‹ÖèÈûÿÿƒÄ…À„Jÿÿÿ‹T$ƒ:ÿt&hhTÓ h³h°j è¹?þÿƒÄ_^]ƒÈÿ[Ã‹Š¤ƒùuh hTÓ h®ëÍD‰‚_A‰Š¤‹L$‹T$^]‰‰PÇ@Ç@ ¸[Ãjjjjj‹D$0Pè{üÿÿƒÄ…À…<ÿÿÿ_^]ƒÈÿ[ËL$jjjjjQë׋T$jjjjjRëÆjjjjj뵋=€! jh|Ó Vÿ×ƒÄ …Àu‹L$_^]ÇA ¸[Ãjh˜Ò Vÿ×ƒÄ …Àu‹T$_^]ÇB ¸[ÃjhxÓ Vÿ×ƒÄ …Àu‹D$_^]Ç@ ¸[ÃjhpÓ Vÿ×ƒÄ …Àu‹L$_^]ÇA ¸[ÃhohTÓ hÃé÷ýÿÿî¹&ººùº »Áºèº»ÌÌÌÌÌÌÌ̸è‘U‹l$VW‹ùèXÍÿÿ‹ð…öu$h}hTÓ jAh³j èú=þÿƒÄ_^3À]ƒÄÃ…ÿu¿ß1 ‹L$$Aÿƒø‡¶¶€dÀÿ$…DÀ…ÿ„€?„hŠhTÓ h¶h³j è›=þÿƒÄVèâÌÿÿƒÄ_^3À]ƒÄÃýt0h’hTÓ h¾h³j èf=þÿƒÄVè­ÌÿÿƒÄ_^3À]ƒÄÃNQT$RÇD$ÇD$‰|$ èŸ ƒÄ…À…hšhTÓ h°éƒýt0h£hTÓ h¹h³j èð<þÿƒÄVè7ÌÿÿƒÄ_^3À]ƒÄÃWjè㠃ĉF…À… h¨hTÓ h´é¡ƒýt0h°hTÓ h¿h³j è‘<þÿƒÄVèØËÿÿƒÄ_^3À]ƒÄÃjWè”mþÿƒÄ‰F…À…ÁhµhTÓ h·éBƒýt0h¾hTÓ hÁh³j è2<þÿƒÄVèyËÿÿƒÄ_^3À]ƒÄÃè8‰F…ÀuhÃhTÓ jAéðjÿWPè§ƒÄ …ÀuhÈhTÓ jAéÏ‹F‹L$$‰H‹VRèüÿÿƒÄ…À…hÎhTÓ h¸éƒýu½ë ƒýu5½Qè1¨ÿÿPUjÿFWPèÃ0ÿÿƒÄ…ÀÓhëhTÓ jAéWhãhTÓ h±h³j èL;þÿƒÄVè“ÊÿÿƒÄ_^3À]ƒÄÃèR‰F…Àu-høhTÓ jAh³j è;þÿƒÄVèZÊÿÿƒÄ_^3À]ƒÄÃýucL$ QWèÎ ƒÄ…ÀuhhTÓ h²éËV‰B‹F‹L$ ‰‹V‹D$$‰Bƒ|$$u‹Fƒ` ð‹FƒH ‹L$$_‰‹Æ^]ƒÄÃýujÿWPè8ƒÄ ëɃýu/ƒ|$$u(Ph€¸jj,W蟃ąÀu»hhTÓ h¼ë?hhTÓ h¯h³j è4:þÿƒÄVè{ÉÿÿƒÄ_^3À]ƒÄÃh(hTÓ hÄh³j è:þÿƒÄWhŒÓ jèô;þÿƒÄ Vè;ÉÿÿƒÄ_^3À]ƒÄÃIš¼½é¾Y¼o½s¾νÀÌÌÌÌÌÌÌÌÌÌÌÌÌ̸ÌèfŒ‹Œ$ÐSUD$,Ph ¹j3ÛƒÍÿj,Q‰\$ ‰\$,‰l$@‰l$DÇD$L‰œ$äèõƒÄ…Àt ]3À[ÄÌËD$4Vƒøtƒøt‹T$<‹L$@PRèåúÿÿƒÄëD‹Œ$à;Ëu*h£hTÓ hÀh²j èê8þÿƒÄ^]3À[ÄÌÃQ‹L$DQPèÏƒÄ ‹ð;ótß9l$0u 9œ$Ô„œWT$RVèÇÇÿÿ‹øV‰|$0èëÇÿÿ‹D$ ƒÄ 3ö‰D$9l$4tdWL$4QT$4RD$(PL$(Q讃ĄÀˆ-‹T$+T$ú‰|$$¨tÇD$ ‰\$ëƒà ‰D$ ‹D$4‹L$PQjè+ ƒÄ ‹ðë‹÷‹„$Ø3í<€|¼4…À~#w ‹RVj‰wèý EƒÄ ƒï;¬$Ø‹ð|ÝhåhTÓ Vèë_úÿ3íƒÄ 9¬$؋؉\$~A|$XI‹Gô‹Oð‹P‹GøQRPL$ QèƒÄƒüt ‹T$ÆÿD$EƒÇ;¬$Ø|Æ‹D$4ƒøÿt‹L$8‹T$QP‹D$(RPL$ QèÃċT$$‹D$‹L$RPQ變VT$8Rj‰\$@è;ÆÿÿƒÄ‹ð‹D$_…Àt Pèç`úÿƒÄ…Ût SèÚ`úÿƒÄ‹Æ^][ÄÌÃÌÌÌÌÌÌÌÌÌÌ̸ èÖ‰SUVW3í3ö3Ûèwþÿ‰D$‹D$$…Àto‹L$(…É„þPQèøì‹ØƒÄ…Û„êS3ÿèþÿƒÄ…À~@‹D$(PWSèþÿ‹HƒÄQèýÿÿ‹ðƒÄ…ö„¶‹T$VRèÌþÿS3öGèÃþÿƒÄ ;ø|À‹|$ ‹L$3Àƒÿ”À‹èUjWh@‰jQèI ÿÿhÜhTÓ P‰D$<èE^úÿUjWh@‰T$H‰D$X‰D$H‹D$DRPè ÿÿƒÄ<èMÅÿÿ‹è…ít%Wè± ƒÄ‰E…Àt‹L$$‰}‰H‹U‹D$‰ë‹D$$…Àt Pè”_úÿƒÄ‹D$…Àthp‰Pè~þÿƒÄ…öt VèÅÿÿƒÄ…Ût‹L$(SQè?ìƒÄ_^‹Å][ƒÄ ÃÌ̸èfˆ‹D$$…ÀuP‹D$$PèãûÿÿƒÄƒÄÃPL$QèQì‹D$(T$RPèÂûÿÿƒÄƒÄÃÌÌÌÌÌÌÌÌÌÌÌ‹D$=t= u%ÿþÿÿƒøw‹…³øxÔ ÃÌÌÌÌÌ̸„èæ‡¡Àç3ĉ„$€ö„$ˆ ¸ÀÔ u¸¸Ô jPVèË ýÿƒÄ ƒøŒ®‹„$ŒUh€PVèË¢ýÿ‹ËƒÄ áÀl$W€ùÀuh¨Ô T$ h€RèBãýÿƒÄëX‹Ã%€<€uhœÔ L$ h€QèãýÿƒÄë4öÃ@thÔ 뼃ÿ~h„Ô D$ h€PèôâýÿƒÄë èúþÿÿƒÄ‹èUhdÔ Vè¹âýÿƒÄ ]…À3À‹Œ$€3Ìè‡ĄËŒ$€3̸è‡Ąø,èÆ†‹L$83À‰D$‰D$ ‰D$$‹D$4‹SUÈVPÿW‰D$‰L$,‰T$;Áƒê‹t$@9D$ƒÜ‹ø‹D$HPL$,QT$,RD$ PL$ Q‰|$0è¿ ‹ØƒÄ‰\$8„Ûˆ·‹l$‹T$D+ï+:)l$H|$LWhpÕ VèÞáýÿƒÄ …ÀŽFƒû!t‹D$‹L$PPUQhXÕ Vè¸áýÿƒÄë‹T$PURh@Õ Vè¢áýÿƒÄ…ÀŽ ‹D$T‹|$$÷ØÀ#D$PPS‹\$0èÜýÿÿƒÄ…À„ä‹\$8öà „ì‹L$‹T$j< h2 V‰|$D訞ýÿƒÄ …Àް‹D$;D$H ƒû!u_…Àu[‹|$P‹D$‹\$X‹l$TGëI‹T$DS‹È+ UL$TWQ‹L$<+ÈQT$$RVènþÿÿƒÄ…À„Ôƒø‹D$„m;D$,rÀéb‹D$;ǃV‹|$P‹\$X‹l$TG‹ÿ‹L$D+‹T$D$LSUWPRD$$PVèþÿÿƒÄ…À‹D$„{;D$8rÍéƒ|$(t)‹L$L$jh2 Vè¼ýÿƒÄ …ÀŽÄ‹D$éß‹D$$3Ûƒø„°ƒø„§ƒø„žƒø„•ƒø„Œƒø „ƒƒø„zƒø„qƒø…ª‹D$‹T$èUL$‰T$QT$8Rè“îþÿƒÄ …Àt'jhˆ± VèýÿƒÄ …À~+‹D$0PVèmëþÿƒÄéj h4Õ VèøœýÿƒÄ …Àî‹t$ ‹D$‹L$0…Ét Qè—ìþÿ‹D$ƒÄ‹L$4…É„wQè΋D$‹L$HƒÄ_‰‹Æ^][ƒÄ,ÃøuP‹T$‹L$êUD$Pj‰L$$è×Ùÿÿ‹øƒÄ …ÿ}j h$Õ VèqœýÿƒÄ …À…yÿÿÿWh Õ VèúÞýÿƒÄ éSƒø„Jƒø…š‹T$‹L$êUD$Pj‰L$$è¹ÿÿ‹èƒÄ ‰l$4…í„9]Ž÷‹}‰|$‹U3É…Ò~Š9< s < t< t< u@<~w3ÀÃÇ@?3ÀøÃÌé›ÿÿÿÌÌÌÌÌÌÌÌÌÌÌU‹l$ W‹|$…ÿ}…íu_3À]ËÅPd$Š@„Éuù+‹øSV‹t$9>|‹F…Àub‹^…ÛuhwGh Õ Pè RúÿƒÄ ëhyh Õ OQSèqRúÿƒÄ‰F…Àu%h}h Õ jAhºj è¿)þÿƒÄ‰^^[_3À]É>…ítWUPè}‹VƒÄ Æ^[_¸]ÃV‹t$‹F…ÀtPè>Súÿ‹D$‹L$ƒÄ‰F‰^ËT$ ‹D$‰V‰^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌhžh Õ jèOQúÿ3ÉƒÄ ;Áuh¡h Õ jAh‚j è)þÿƒÄ3ÀËT$‰‰P‰H‰H ÃÌÌÌÌÌÌÌÌV‹t$…öt‹F…Àt PèªRúÿƒÄVè¡RúÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌS‹\$ W‹|$ ‹‹Á+uw‹SUV‹wƒùr‹;uƒéƒÂƒÆƒùsì…ÉtC¶¶*+Åu1ƒùv4¶F¶j+Åu ƒùv#¶F¶j+Åuƒùv¶F¶J+ÁÁøƒÈë3À^]…Àu‹G+C_[ÃÌÌÌ̸$è{¡Àç3ĉD$ ‹D$(Phœv D$j PèÅÖýÿ‹L$QVRnFUPVèíýÿÿƒÄ‰F „Ày_ÇF<^]3À[Ã}t_ÇF=^]3À[Ã+>;ƒ~‹t…Û}_ÇF>^]3À[Ã~ !u ‹F$‹+ˉN_ÇF^]¸[ÃW‹|$…ÿu3À_ËGVPèÙûÿÿ‹ðƒÄ…öt-‹‹WQRVèÃúÿÿƒÄ …Àu‹F…Àt Pè¿NúÿƒÄVè¶NúÿƒÄ^3À_ËG ‰F ‹Æ^_ÃÌÌÌhžh Õ jèßLúÿƒÄ …Àuh¡h Õ jAh‚j è°$þÿƒÄ3ÀÃÇÇ@Ç@Ç@ ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¡˜³Pèµ4þÿƒÄ…Àuh˜³Pèã1þÿh(·jè×1þÿƒÄÃÌÌ̸°ºÃÌÌÌÌÌÌÌÌÌ̸ÀºÃÌÌÌÌÌÌÌÌÌ̸èw‹D$‹S‹\$ UVWST$ RD$ ‰L$PL$QT$$R3ö3ÿè6üÿÿ‹l$8ƒÄ„Àˆ€‹D$ƒø |¿™ëpPèqÿÿƒÄ…D$0u¿©ëZƒ|$u‹D$(SP‹ÍQè ¬ÿÿƒÄ _^][ƒÄÃ…ít‹u…öu è±þÿÿ‹ð…ötQ‹D$…Àtxjh@htæ Pè…Kúÿ‹øƒÄ …ÿu<¿Aj}htæ Wh•j èS#þÿƒÄ…öt…ít9ut Vè=úÿÿƒÄ_^]3À[ƒÄËT$‹D$RPWè‚v‹L$Æ‹D$ƒÄ D$ë3ÿ‹N…Ét Qè¼Lúÿ‹D$ƒÄ‰‰~‹T$‰V…ít‰u‹D$‹L$(_‰‹Æ^][ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸è–uV‹t$ …öu3À^YÃS‹\$ƒûu‹D$PVè«ÿÿƒÄ[^YÃUW‹>SWjè÷ÿÿ‹l$(ƒÄ ‰D$…ítM‹M‰L$ƒût ƒût3À븋T$$RSWPD$(Pè¤ûÿÿ‹‹V‹D$,QRPè•u‹‹D$0ƒÄ L$‰M_][^YÃÌÌÌÌÌÌÌÌÌÌÌÌ̸<èæt‹D$@U3íW…Àt‹8…ÿuèýÿÿ‹ø…ÿu_]ƒÄ<ËD$L‹SV‹t$XVT$ RD$ ‰L$PL$QT$$RèùùÿÿƒÄ„Ày ½f鳋\$\9\$t ½¨éŸ¨ tS‹L$T‹T$‰L$D‹L$‰D$,‹D$`‰L$ ‰T$8‰\$0‰D$4…öu‰l$<ëΉL$‹D$L;Ç~‹Ç‹L$H…É„ ÿÿÿ‹VPRQè"kƒÄ é ÿÿÿÌÌÌÌÌÌÌÌ‹D$‹L$‹T$ VjjQR‰D$‹D$PL$QjèØíþÿ‹ðƒÄ…öujMhðæ jnjj èmþÿƒÄ‹Æ^ÃÌÌÌÌÌ̸è6jS‹\$U‹l$WjjjSjUè<ëþÿ‹øƒÄ…ÿuj\hðæ jpj~j è!þÿƒÄ_]3À[YÃVj_hðæ Wè?úÿ‹ðƒÄ …öuj`hðæ jAj~j èîþÿƒÄ^_]3À[YÃjjjSD$ PU‰t$(èÍêþÿ‹D$<ƒÄ…Àt‰8‹D$ …Àt‰0‹Æ^_][YÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‹HVRD$ Pj‰L$ÿT$‹ðƒÄ …öujthðæ jnhˆj èhþÿƒÄ‹Æ^ÃÌVW‹|$…ÿt‹7…öu.èkñÿÿ‹ð…öuhhðæ jAj|j è0þÿƒÄ_3À^Ã…ÿt‰7‹|$ S‹\$jWÿӃĉ…Àuhˆhðæ jpj|j èöþÿƒÄ[_3À^Ãh‹hðæ Pèí=úÿƒÄ ‰D$…ÀuhŒhðæ jAj|j è½þÿƒÄ[_3À^ÉFD$PWÿÓƒÄ[_‹Æ^ÃV‹t$W…öt‹>…ÿu1è«ðÿÿ‹ø…ÿu hžhðæ jAhÆj èmþÿƒÄ_3À^Ã…öt‰>‹Gw…ÀtPè?úÿƒÄÇ‹D$‹L$ PVQè¶ÿÿƒÄ ‰…Àu hªhðæ jphÆj èþÿƒÄ_3À^Ã>uh®ë‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹H‹T$‹VR‰L$ PL$Qjèð˜ÿÿ‹ðƒÄ…öuh½hðæ jnhÇj è¯þÿƒÄ‹Æ^ÃÌÌÌÌÌÌÌ̸Pç ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hPç PQRè—˜ÿÿƒÄÃÌÌÌ‹D$‹L$hPç PQèÜ€ÿÿƒÄ ÃÌÌÌÌÌÌÌÌhPç è†qÿÿƒÄÃÌÌ‹D$hPç PèuÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌSVWhPç 3ÛèQqÿÿ‹ðƒÄ…öujUhlç jAhÊj èóþÿƒÄ_^3À[ËD$…À¸P‹FPè#âþÿƒÄ…Àu9jZhlç jAhÊj è·þÿƒÄhPç Vè‰tÿÿƒÄ…Ût Sèì¢ÿÿƒÄ_^3À[Ë|$…ÿu¿j^hlç Wè‰;úÿ‹‰A‹ƒÄ 9Xuj_뜉8‹D$W…Àt‹P‹BPè±fƒÄ ë‹‹QRèÏþÿƒÄ…À|„ès¢ÿÿ‹Ø…Ûujhé\ÿÿÿCPh°åVÇè±üÿÿƒÄ …Àujoé9ÿÿÿVè½þÿÿ‹L$Qè9þÿƒÄ‹øè¹ÿÿ‹ð…öujwhlç jAhÊj èÎþÿƒÄé ÿÿÿ‹RènÎþÿƒÄ‰>_‰^‹Æ^[øèç ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hèç PQRè§–ÿÿƒÄÃÌÌÌ‹D$‹L$hèç PQèì~ÿÿƒÄ ÃÌÌÌÌÌÌÌÌhèç è–oÿÿƒÄÃÌÌ‹D$hèç Pè!sÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸è ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hè PQRè'–ÿÿƒÄÃÌÌÌ‹D$‹L$hè PQèl~ÿÿƒÄ ÃÌÌÌÌÌÌÌÌhè èoÿÿƒÄÃÌÌ‹D$hè Pè¡rÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸´è†d¡Àç3ĉ„$°‹„$¸‹Œ$ÀSUVW3íP‰D$‰L$‰l$3ÿ3öè^ þÿƒÄ‰D$;Åujfhpè jlékPèo7þÿhèç ‰D$(ènÿÿ‹ðƒÄ;õ„>‹^‹T$ ‰èf ÿÿ‰C…À„%‹D$PèÑAýÿƒÄ…Àt#‹L$QèÀAýÿP”$¸Rè‚þÿƒÄ …ÀŒ D$$Pèípþÿ‹T$jŒ$¸QjjRD$þÿ‰‹@PURèç\ƒÄƒÆƒl$uÊ‹\$l‰\$…ít Uè&3úÿƒÄD$(j Pè'4úÿ‹L$P‹D$ƒÄ_^][3ÌèL\ƒÄ<ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸Pè\¡Àç3ĉ„$L‹„$T‹Œ$XS‹œ$dU‹¬$dW‹¼$pW‰D$ƒÀ`SP‰L$ÇEèˆEþÿƒÄ …ÿ~^Vÿ°¾°‹÷VST$RD$(P‹D$(ƒÀpPèøIþÿ‹L$(Q‹L$(T$4R‹T$4D$0PQRè*@þÿ‹D$<ED$8+þƒÄ(Þ…ÿ¤^‹Œ$X_][3Ìèm[ÄPÃÌÌÌÌÌÌÌÌÌÌ̸è&[‹D$ V3öƒ8W‹|$‰t$ thšhté jnjnj èþÿƒÄéÚ‹@ PèKSüÿƒÄ‰D$ƒøds ¸d‰D$hŸ hté Qèó/úÿ‹ðƒÄ …öuh¢hté jAjnj èÅþÿƒÄéƒSUT$RGpVPè\Jþÿ‹L$(‹l$4QVT$$RUWè6?þÿ‹D$0‹\$LL$0‰QÅPWè>@þÿ‹D$\‹T$<PL$LQW`VRèqþÿƒÄ<][…Àt!‹D$‹L$PVQè[<þÿ‹T$(ƒÄ ‰ÇD$ G`PèqDþÿƒÇpWèØgþÿƒÄ…öt VèÛ0úÿƒÄ‹D$ _^ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸HèÖY¡Àç3ĉD$D‹D$P‹L$T‹T$XSU3ÛVW‹|$\‰|$0‰D$8‰L$4‰T$<‰\$‰\$‰\$‰\$(;Ãu)è<âýÿ‹ð‰t$;óu jlhüé jAjtj èþÿƒÄé´‹ð‰D$è-)ÿÿ‹è;넟D$$PL$QT$RD$$PW‰\$4è5ƒÄ…À„ë¤$‹|$¹ðé ‹ÇëIŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ä‹¹Üé ‹ÇŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;ÄW¹Èé ‹ÇŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu4¿ 9]„#UVèÚÞýÿƒÄ…À„˜è*(ÿÿ‹è;ë…0ÿÿÿé—¹¼é ‹Çd$Š:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu¿9]uœué¹¹¬é ‹ÇŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;ÃuW¿0k9]…Vÿÿÿ‰]$‰] èܪÿÿ‰Eèôsþÿ‹M‰A ‹U‹B ;ÄÙÇ‹E‹p ‹D$ƒÆ PŠ@:Ëuùé¹œé ‹Ç¤$Š:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;ÃuW¿€9]…Èþÿÿ‰]$‰] èNªÿÿ‰Eèfsþÿ‹M‰A ‹U‹B ;ÄKÇt‹E‹p ‹D$ƒÆ PŠ@:Ëuù釹Œé ‹ÇŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ã…Ç¿€9]…=þÿÿ‰]$‰] èéÿÿ‰EèÛrþÿ‹M‰A ‹U‹B ;ÄÀǘ‹E‹p ‹D$ƒÆ PŠ@:Ëuù+ƒø ~ÇD$ ë ¿0éÔýÿÿ‹õ;û„G9\$ …‹T$L$@QRè+ƒÄ…Àt]‹D$<‹L$4P‹D$QT$,RPL$PQè ƒÄ…Àt8‹D$$‹T$PL$0QV‰T$8ÿ×ƒÄ …À…âhhüé j jtj èêþÿƒÄ;ët UèÝ%ÿÿƒÄ9\$(uB‹|$W3öèÝýÿƒÄ…À~VWèÝýÿPè³%ÿÿWFèüÜýÿƒÄ;ð|å;|$8t Wè¹ÜýÿƒÄ‰\$‹D$;Ãt PèD,úÿƒÄ‹D$;Ãt Pè3,úÿƒÄ‹D$_^];Ã[t Pè,úÿƒÄ‹L$D‹D$ 3ÌèWUƒÄHËD$U RPèƒÄ…À„Hÿÿÿ‹L$‰M$‹T$$‰U ‰\$‹t$‹|$;ût WèË+úÿƒÄ‹D$;Ãt Pèº+úÿƒÄ‹D$;Ãt Pè©+úÿƒÄD$$PL$Q‹L$8T$RD$$PQ‰\$,‰\$$‰\$(‰\$4蘃ąÀ…mûÿÿèøþÿ%ÿƒøl…³þÿÿè…þÿ9]u9]u 9]u9]$tUVèÊÚýÿƒÄ…À„ˆþÿÿ3íÇD$(éyþÿÿ¸¤è6T¡Àç3ĉ„$ ‹„$¨‹Œ$ÀS‹œ$¸U‹¬$ÄV‹´$¼W‹¼$¼‰D$‰L$ÇD$…öt0Vè Pèª'þÿƒÄ…ÀuhFhüé jqjuj èÞþÿƒÄé‹G…À„ò‹O$‰L$…É„»‹O ‰L$ …Éެ‹W RoèAPèK'þÿ‹ØƒÄ…Ûuhbë‹ÃP›Š@„Éuù‹N +ÂTH$úvhê hghüé èúÿƒÄ „$°j PÆ„$¸è ‹N UQ”$ÀSRèg‹D$8‹L$0P‹D$,Q”$ÐRh¬é Pèv ƒÄ,ë$‹L$‹”$È‹@ Q‹H UR‹T$SVQR考ąÀ~ ‹?…ÿt‹D$WPè˜)ƒÄ…À~ÇD$L$$hŒQèz*úÿ”$¸hRèh*úÿ‹Œ$À‹D$$ƒÄ_^][3ÌèŠRĤÃÌÌÌÌÌÌÌÌVèÊ~ýÿPèqýÿ‹ðƒÄ…öujQhüé jjsj èIÿýÿƒÄ3À^ËD$WPjjjVè’mýÿ‹L$(‹T$$‹D$ QRPVèøÿÿV‹øèeiýÿƒÄ$‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌVW‹|$…ÿt/‹ÇPŠ@„Éuù+‹ð‹D$;ð~‹ð‹D$ VWPè1RƒÄ _‹Æ^ÃèâEþÿ‹ø…ÿu¿Ðê ‹t$ S‹\$U‹l$UWSVèàEþÿƒÄ…Àu>‹ÆPd$Š@„Éuù+ƒø}Hjhœê ÿÐ ƒÀ@Pÿ! UWSVè¢EþÿƒÄ…ÀtÂjih„ê jmjdj èIþýÿSjVè¨QƒÄ ƒÈÿ][_^ÃÌÌÌÌÌ‹D$VWƒø u¿ë ëƒøu¿ë ë¿ë ƒøt¿øê ‹t$ hhèê VèŸfýÿhWVè“fýÿhh2 VèƒfýÿƒÄ$_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$UWhh(ë SèYfýÿ‹D$ hPSèIfýÿhhа Sè9fýÿ‹ÃƒÄ$PŠ@„Éuù‹|$+‹èL}ùL3À…ÿ~9V‹t$ +¤$¶0Áê¶’pê ˆ¾0ƒâ¶’pê ˆQ@ƒÁ;Ç|×^DEÃÆ Æ@_][ÃÌÌÌÌÌVèj|ýÿPè¤nýÿ‹ðƒÄ…öuh©h„ê jjfj èæüýÿƒÄ3À^ËD$WPjjjVè/kýÿ‹L$0‹T$,‹D$(Q‹L$$R‹T$$PVQRè`(V‹øèøfýÿƒÄ,‹Ç_^ËϋƊ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu¸ù˜ë ‹Æ›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu0¹ˆë ‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àt”¹|ë ‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu4¹ˆë ‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„0ÿÿÿ¹¬é ‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu4¹ˆë ‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„Ìþÿÿ¹œé ‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu4¹ˆë ‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„hþÿÿ¹Œé ‹Æd$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu4¹ˆë ‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„þÿÿ¹Üé ‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu4¹ðé ‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„œýÿÿ¹dë ‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu4¹Pë ‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„8ýÿÿ¹ðé ‹Æd$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu4¹Èé ‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„Ðüÿÿ¹Üé ‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu4¹Èé ‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„lüÿÿ¹ðé ‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu4¹Hë ‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„üÿÿ¹4ë ‹Æd$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu4¹Hë ‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„ ûÿÿ3Àø¼èæJ¡Àç3ĉ„$¸‹”$È‹Œ$Ì‹„$ÐU‹*V‹´$ȃ>W‹¼$ЉT$„TPjh…Éu„$ÐPèªøÿÿë ”$ÐRÿуÄ…À2h–h„ê jhjjj è‚÷ýÿƒÄ_^3À]‹Œ$¸3ÌèwJļÃSjŒ$¬QjP”$ØR^Sè&\þÿP‹Pè]?þÿL$ PQèsWýÿƒÄ…Àtdj ”$ h°ë Rÿ€! ƒÄ …ÀtY‹L$‹QV„$ P×RèD‹D$$‹Hhþ”$¬ÎRˆ9Uþè÷]ýÿ‹ðƒÄ;óZÿÿÿëh¯h„ê jAéÅÇD$ ‹t$hV‰\$èÜVýÿƒÄ…Àuh¼h„ê jAé’‹Fˆ9\$ …6hþŒ$ QUè‚]ýÿ‹ðƒÄ ;óŽ*ëI€¼4œ ƒîyñFÆ„4œ Fˆœ4œƒþAtÇD$$j ”$ h°ë Rÿ€! ƒÄ …À„؃þAÏ‹D$‹|$L QWèçVýÿƒÄ…ÀtR‹GD$V”$ RPèìB‹L$‹GƒÄ ˆt$hþ9\$(u.Œ$ QUè½\ýÿ‹ðƒÄ ;ó@ÿÿÿëghÎh„ê jAé‹”$ RUˆœ$¨èˆ\ýÿƒÄ ;Ã~:€¼œ ƒèyñ@Æ„œ ˆœë‹D$‰|$‰t$‰D$‹øë‹|$‹l$‹EPŠ@:Ëuù‹€! +Âj ‹ð„$ h°ë PÿÓƒÄ …À…ò‹UVŒ$©QRÿÓƒÄ …À…Øj„4©h¼ë PÿÓƒÄ …À…¼L$h„ê jAjij èìýÿƒÄé{T$,RS‰|$4ÿՃċȉL$…ö„"‹l$…íug‹D$8Œ$ø…Àu‹D$ PjhQèÏìÿÿë‹T$ RjhQÿЋ؃Ä…ÛhNh„ê jojij è ëýÿƒÄéþ‹L$”$ø‹ê닜$¸èX>ÙîÝ$QWè,ßýÿƒÄƒ~ ~hÐë hXh„ê è úÿƒÄ ‹F PŒ$ÌQèËßýÿƒÄ…ÀŒ–j”$ÜRjS„$ØUPèõOþÿPVè.3þÿŒ$ƒÄ ;éu‹ÑhRèÃúÿƒÄ‹\$$‹ÃP¤$Š@„Éuù‹N +ÂTH$úvhê hah„ê èt úÿƒÄ h„$ühèê PÆ„$èBSýÿhŒ$hë Qè+Sýÿh”$h2 RèSýÿ‹N „$ìPQ”$$SRèŠìÿÿD$pPèPJþÿŒ$Q”$Rj„$€VPèÐ*þÿ‹L$\ƒÄLQWT$0RD$HWPèW+þÿ‹T$4uòF€>,uìj Fhë Vÿ×ƒÄ …ÀthÃh„ê jjjkj èŠèýÿƒÄ_^3À]Ê< t „Àt ŠFF< uô€>uhÇh„ê jpjkj èUèýÿƒÄ_^3À]Ãj Fh(ë Vÿ×ƒÄ …ÀthÊh„ê jijkj è%èýÿƒÄ_^3À]ÃƒÆ ‹þS›Š€ûA|€ûZ~ €û-tŠÃ,0< wFëäWÆè;þÿWèÕAþÿ‰EˆƒÄF‰t$[…Àuhäh„ê jrjkj è¾çýÿƒÄ_^3À]ÃÅL$UQ‹H èTñÿÿƒÄ÷Ø_À^÷Ø]Ã^¸]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌVèÚfýÿPèYýÿ‹ðƒÄ…öuhh„ê jjqj èVçýÿƒÄ3À^ËD$WPjjjVèŸUýÿ‹L$,‹T$(‹D$$Q‹L$$RPQVè•ñÿÿV‹øèmQýÿƒÄ(‹Ç_^ÃÌÌÌÌÌVèjfýÿPè¤Xýÿ‹ðƒÄ…öuhch„ê jjlj èææýÿƒÄ3À^ËD$WPjjjVè/Uýÿ‹L$,‹T$(‹D$$Q‹L$$RPQVè•óÿÿV‹øèýPýÿƒÄ(‹Ç_^ÃÌÌÌÌ̸<èv9¡Àç3ĉD$8‹D$@‹L$D‹T$TS‹\$TU‹l$PV‰D$,‹D$dW‹|$\‰L$$‰D$ 3ÀL$Q‰T$,T$R‰D$ ‰D$‰D$‰D$4D$PL$$QSèóÿÿƒÄ…ÀtP뛋t$èwéÿÿ…ÀuoVèÍúÿ‹T$RèÃúÿ‹D$Pè¹úÿL$(QT$$RD$$PL$0QSè¿òÿÿƒÄ …Àu¸èãëýÿ%ÿƒøluWhüë jè¼çýÿƒÄ _^]3À[‹L$83Ìè³8ƒÄ<ËD$T$4RPèuüÿÿ‹\$ƒÄ…ÀtC‹L$ ‹T$(QRD$$PL$@SQè`íÿÿƒÄ…Àt"‹T$0‹D$‹L$$‰‰…ít‰u¿…íuë‹|$,VèýúÿƒÄ‹T$RèðúÿƒÄ…ÿu SèãúÿƒÄ‹L$H‹Ç_^][3Ìè8ƒÄ<ÃÌÌÌÌÌÌÌÌÌÌÌVèZdýÿPè”Výÿ‹ðƒÄ…öuhh„ê jjhj èÖäýÿƒÄ3À^ËD$WPjjjVèSýÿ‹L$<‹T$8‹D$4Q‹L$4R‹T$4P‹D$4Q‹L$0R‹T$0PVQRèa÷ÿÿV‹øèÙNýÿƒÄ8‹Ç_^ÃÌ‹D$‹L$ ‹T$P‹D$QRPhPë h  è ƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhPë h  èçÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhPë hÀ èÍöÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhPë hÀ èÍþÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhdë hÀ èmöÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhdë hÀ èmþÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPh¼é hèíƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPh¼é hèýåÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQh¼é h°è­õÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQh¼é h°è­ýÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhHë h@lè-ƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhHë h@lè=åÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhHë h`lèíôÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhHë h`lèíüÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhðé hÐèm ƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhðé hÐè}äÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhðé hðè-ôÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhðé hðè-üÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$VPQjR虋ðƒÄ…öu^ÃWVègPþÿV‹øèŸUþÿƒÄ…ÿu_3À^Ët$…öt ‹PèSUüÿƒÄ‰>‹Ç_^ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$VPQjRèY‹ðƒÄ…öu^ÃWVèPþÿV‹øè?UþÿƒÄ…ÿu_3À^Ët$…öt ‹PèóTüÿƒÄ‰>‹Ç_^ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$‹T$P‹D$Q‹L$R‹T$P‹D$QRPh¬é hPkèþòÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‹T$P‹D$Q‹L$R‹T$P‹D$QRPh¬é hPkèîúÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhì hpkèm ƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhì hpkè}âÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhì hkè-òÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhì hkè-úÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhì hè­ ƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhì hè½áÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhì h èmñÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhì h èmùÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$VPQjRèÙ‹ðƒÄ…öu^ÃWVèçMþÿV‹øèßRþÿƒÄ…ÿu_3À^Ët$…öt ‹Pè“`üÿƒÄ‰>‹Ç_^ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$‹T$P‹D$Q‹L$R‹T$P‹D$QRPhœé h èžðÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‹T$P‹D$Q‹L$R‹T$P‹D$QRPhœé h èŽøÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhì h€è ƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhì h€èàÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhì hèÍïÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhì hèÍ÷ÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$VPQjRèY‹ðƒÄ…öu^ÃWVèGLþÿV‹øè?QþÿƒÄ…ÿu_3À^Ët$…öt ‹Pèó^üÿƒÄ‰>‹Ç_^ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPh$ì hÀèíƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPh$ì hÀèýÞÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQh$ì hàè­îÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQh$ì hàè­öÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$VPQjRè‹ðƒÄ…öu^ÃWVègKþÿV‹øèPþÿƒÄ…ÿu_3À^Ët$…öt ‹Pè“ýÿƒÄ‰>‹Ç_^ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPh4ì h@è̓ÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPh4ì h@èÝÝÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQh4ì hðèíÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQh4ì hðèõÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$‹T$P‹D$Q‹L$R‹T$P‹D$QRPhŒé h èíÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‹T$P‹D$Q‹L$R‹T$P‹D$QRPhŒé h èõÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhì hpèƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhì hpèÜÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhì hèMìÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhì hèMôÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$VPQjRèÙ‹ðƒÄ…öu^ÃWVèIþÿV‹øè¿MþÿƒÄ…ÿu_3À^Ët$…öt ‹Pè3ýÿƒÄ‰>‹Ç_^ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhDì hèmƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhDì hè}ÛÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhDì h è-ëÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhDì h è-óÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹L$‹ƒøtu¸œé ëƒø¸¬é t¸Œé ‹T$R‹T$R‹T$R‹T$R‹T$RQ‹L$QPh "è¥êÿÿƒÄ$ÃÌ‹L$‹ƒøtu¸œé ëƒø¸¬é t¸Œé ‹T$R‹T$R‹T$R‹T$R‹T$RQ‹L$QPh "è…òÿÿƒÄ$ÃÌ‹D$‹L$ ‹T$P‹D$QRPhì hÐè ƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhì hÐèÚÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhì h0èÍéÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhì h0èÍñÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ¡X¼PèõæýÿƒÄ…ÀuhX¼Pè#äýÿh0½jèäýÿƒÄÃÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhðé h0èƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhðé h0è-ÙÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhðé hPèÝèÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhðé hPèÝðÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhÈé h è]ƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPhÈé h èmØÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhÈé h€èèÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQhÈé h€èðÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPh(ï hèƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPh(ï hè­×ÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQh(ï h0è]çÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQh(ï h0è]ïÿÿƒÄ$ÃÌÌÌÌÌÌÌÌ̸ è&'‹D$$‹L$ ‹T$P‹D$QRPjL$QT$RÇD$ ÇD$èqíÿÿƒÄ…ÀuƒÄ Ë$‹L$VQT$ ‰D$ ‹D$$RPÿT$ ‹ðƒÄ …öujSh<ï j jgj èÐÓýÿƒÄ‹L$QèƒýùÿƒÄ‹Æ^ƒÄ ÃÌÌÌÌÌÌÌÌ̸è†&¡Àç3ĉ„$‹„$S‹œ$U‹¬$VW‹¼$ jPèi‹ðƒÄ…ötDSjh…ÿt D$Pÿ×ë L$QèHÔÿÿƒÄ…À"h¤hTï jhjxj è,ÓýÿVèÆáþÿƒÄ3ÀëIPT$RV賸V‹øè«áþÿƒÄ…ÿtáWè>nþÿW‹ðèÅÿÿƒÄ…ötÌ…ít‹E…Àt PèŽGþÿƒÄ‰u‹Æ‹Œ$_^][3ÌèÏ%ÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$VjPèÓXýÿ‹ðƒÄ…öuhæhTï jjyj è…ÒýÿƒÄ3À^ËL$‹T$‹D$ WQRPVè¸þÿÿV‹øè°<ýÿƒÄ‹Ç_^ÃÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPh˜ë hpèÝýÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPh˜ë hpèíÔÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQh˜ë hèäÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQh˜ë hèìÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPh|ë hðëèýÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$P‹D$QRPh|ë hðëè-ÔÿÿƒÄÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQh|ë hìèÝãÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$jjjjjPQh|ë hìèÝëÿÿƒÄ$ÃÌÌÌÌÌÌÌÌ̸ è¦#¡Àç3ĉ„$‹„$SU‹¬$0V‰D$ ‹„$ W‹¼$0P‹Ú‰L$è(|þÿ‹ðƒÄ…öujzhTï jsj~j èmÐýÿƒÄ3Àé@…ÛuLƒ¼$,ÿuBV9œ$,t‹T$RèAgƒÄV‹øèVÂÿÿ‹Çé ‹D$PèõþÿÿƒÄV‹øè:Âÿÿ‹Çéí…ÿuc…íu‹L$QjT$ hRèõÐÿÿë‹D$PjL$ hQÿÕ‹èƒÄ…í%h‚hTï joj~j èÂÏýÿVèÜÁÿÿƒÄ3Àé|$달$4‹”$,VjjjUWSRè^µ‹ØD$8ƒÄ ;øu ‹ÈUQèHúùÿƒÄVèÁÿÿƒÄƒ¼$(t‹T$SRèeƒÄë"‹D$jjjjjSPh˜ë hèâÿÿƒÄ$S‹ðèÈÝþÿ‹ÆƒÄ‹Œ$_^][3Ìè"Ä ÃÌÌÌÌÌÌÌÌÌÌ‹D$VjPè#Uýÿ‹ðƒÄ…öuhÙhTï jj}j èÕÎýÿƒÄ3À^ËL$$‹T$ ‹D$WQ‹L$R‹T$P‹D$Q‹L$ÔþÿD$ PèTúýÿL$jQè¸PþÿƒÄjè$þÿPT$ RèCûýÿ‹v‹‹NPQT$Rè¿ûýÿjD$0PL$$Qè¾ûýÿT$(Rè4üýÿ¶D$?¶L$>¶T$=Áà Á¶L$<Áà ÂÁàƒÄ( Á‹L$$^3Ìè̓Ä$ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$UVWS3öèð˜ýÿƒÄ…À~3‹l$ëIVSèé˜ýÿ‹ø‹‹@UPè›ýÿÿƒÄ…ÀtSF轘ýÿƒÄ;ð|Ö_^]3À[ËÇ_^][ÃÌÌÌÌÌÌÌÌ‹D$…Àt‹…Àt ‹@‰D$éVÆþÿ3ÀÃÌÌÌ‹D$…ÀuË‹H‹AÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$SV3ÛW…Àt‹…Àt‹@PèÆþÿƒÄ‹ðë3ö‹|$WVè0,þÿƒÀƒÄƒøw|ÿ$…Ø<V»ès2þÿƒÄ_^‹Ã[Ãh–h,ð jtëDh™h,ð jsë6‹=˜uhŸh,ð jëƒøuh§h,ð jrë h«h,ð juh€j è\½ýÿƒÄVè2þÿƒÄ_^‹Ã[Ëÿ‚<t<f<R<ÌÌÌÌÌÌÌÌ‹L$‹D$V‹0‹FW‹9‹WRPèE”ÿÿƒÄ…Àu‹O ‹V QRè!üÿÿƒÄ_^ÃÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‹Q ‰T$‹D$‹‹Q ‰T$éñûÿÿÌ‹D$‹‹Q‰T$‹D$‹‹Q‰T$éÑûÿÿÌ‹D$‹‹Q‰T$‹D$‹‹Q‰T$é±ûÿÿÌ‹D$‹‹Q ‰T$éýÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‹Q‰T$éîüÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌU‹l$…íu3À]ÃSVWU3Û舖ýÿƒÄ…À~DSU艖ýÿ‹ø‹7‹D$$‹NPQèG“ÿÿƒÄ…Àu‹T$‹F RPè"ûÿÿƒÄ…ÀtUCèD–ýÿƒÄ;Ø|½_^[3À]ËÇ_^[]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸€è¦¡Àç3ĉD$|‹„$ˆS‹œ$ˆU3íVW‰\$4‰D$$‰l$…Àu8è’!ýÿ‹ø‰|$…ÿ„ºhÈWèù!ýÿƒÄ…À„¤‹Gƾȋïë‹´$œ3À;Øu4;èt‹MU‰L$(èåùÿƒÄ‹|$$Vhdð Wÿ! ƒÄ ÆD7ÿ‹Çé‹¿+÷R‰´$ ‰D$4‰D$,èP•ýÿƒÄ…À"…í„P‹uUè¨äùÿƒÄéC‹\$4¿‹D$(‹ PQè*•ýÿ‹ð‹R‰t$Dè\æýÿƒÄ …ÀtPè_áýÿƒÄ‰D$,…Àu‹PL$@jPQèÅtþÿT$HƒÄ ‰T$,‹ÂPëIŠ@„Éuù+‹؋Fƒx‹(‹puz‹Å%€yHƒÈü@uj3ÿ3É3À;ï‰|$‰|$‰L$~€<0t ‹ÈƒáÇDŒ@;Å|è‹L$ L$ L$t¸‰D$ ‰D$‰D$‰D$ë(‰|$‰|$‰|$ÇD$ ë‰|$ ‰|$‰|$‰|$3ÿ3À3Ò;ï~$I‹Èƒá9|ŒtŠ 0B€ù r€ù~vƒÂ@;Å|ß‹|$0‹L$Ó‹ÇD‰D$0…Ét@PQè ýÿƒÄ…À„¶‹L$‹q÷ë;„$œË‹T$$4:‹D$,SÆ/PFVè· ‹L$DóÆ=‹Q‹zƒÄ F3É…í~B‹Áƒàƒ|„t1¶9Pàƒú^v"Æ\‹ÐFÁúÆxƒâŠ’¸½FˆFƒàŠ€¸½ˆFA;Í|¾‹L$4Æ‹t$(‹FR‰t$,è2“ýÿƒÄ;ðŒ÷ýÿÿ‹l$éÕýÿÿ‹|$hÞhHð jAjtj 赸ýÿƒÄ…ÿt WèèýÿƒÄ3Àë‹t$$ƒ|$(uƋƋŒ$Œ_^][3ÌèŠ Ä€ÃÌÌÌÌÌÌÌÌVWè)Èþÿ‹ø…ÿu#jOhtð jAj~j èQ¸ýÿƒÄWèÈþÿƒÄ_3À^Ë7‹F jVhtð jÇè7àùÿ‹N ‰A‹V ƒÄ ƒzt[‹t$ ‹Â‹HVÆèSôÿÿPWè¬$ƒÄ …Àt;SVèžùÿÿ‹ðVWèµ$V‹Øè,þÿƒÄ…Û[t‹D$…Àt!‹T$RPWèÑEƒÄ …ÀuWè„ÇþÿƒÄ_3À^ËÇ_^ÃÌÌÌÌÌÌÌ‹D$…Àt‹…Àt ‹@‰D$馿þÿ3ÀÃÌÌÌ‹D$SV3ÛW…Àt‹…Àt‹@Pè„¿þÿƒÄ‹ðë3ö‹|$WVè %þÿƒÀƒÄƒøw|ÿ$…hCV»èã+þÿƒÄ_^‹Ã[Ãh€htð jtëDhƒhtð jsë6‹=˜uh‰htð jëƒøuh‘htð jrë h•htð juhj è̶ýÿƒÄVès+þÿƒÄ_^‹Ã[ËÿCCöBâBÌÌÌÌÌÌÌÌ‹ ؽ‹…Àt‹T$;Ðt ‹AƒÁ…Àuò3ÀøÃÌÌÌÌÌÌÌÌ̡ؽÃÌÌÌÌÌÌÌÌÌÌ‹D$£Ø½ÃÌÌÌÌÌ̸è& SUVW3Ûè{Eÿÿ‹ð…ö„åèL‘ÿÿ‰F…À„Õ‹D$SSjh@¤SPÇèŠþÿhè‹èhtð UèÞùÿ‹øƒÄ$…ÿ„œ‹T$SSjh@¤L$ QR‰|$(è̉þÿ‹F‰x‹NƒÄ‰)è)Æþÿ‹Ø…Ûtgè>‘ýÿ‰C…Àt[VPèðŽýÿƒÄ…ÀtM‹T$ 3öR‰sèªÛýÿ‹|$‰‹‹@ƒÄ…Àuè‘ýÿ‹‰A‹‹B…ÀtSP讎ýÿƒÄ…Àt _^]¸[YÃSèÆÅþÿVèDÿÿƒÄ_^]3À[YÃÌÌÌÌÌ‹D$‹L$h¬PQèÌþÿÿƒÄ ÃÌÌÌÌÌÌÌÌ‹D$‹‹Q‰T$é/ÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$‹‹H‰L$éÞ(ÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹‹B‰D$éÞ.ÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹‹B‰D$éî.ÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹D$‹PƒÂRèü.ƒÄ÷ØÀ÷ØÃÌÌ‹D$‹L$‹T$ P‹D$ Q‹L$ R‹PƒÂRè 3ƒÄ÷ØÀ÷ØÃÌÌÌ‹D$‹L$‹T$ P‹D$ Q‹L$ R‹PƒÂRèÝ4ƒÄ÷ØÀ÷ØÃÌÌÌ‹D$‹L$‹T$ P‹D$ Q‹L$ R‹PƒÂRè=3ƒÄ÷ØÀ÷ØÃÌÌÌVW‹|$ …ÿt6ƒ?t1‹5ؽ…öt'ƒ>t"‹ÿ‹jÿP‹‹HQèà)ƒÄ ƒøÿu ƒÆƒ>uà_3À^ËP‹BPè¯-‹ðƒÄƒ~t‹Fë‹NQèÆýÿƒÄ…ÀtÏ‹VjRèÄýÿƒÄ…Àt½ƒ8u¸‹H‹Qjj‰T$‹@‹hp¤h ¤QT$ Rjè~‰þÿƒÄ_^ÃÌÌÌÌÌÌÌÌ‹D$…Àt‹…Àt ‰D$éY·þÿ3ÀÃÌÌÌÌÌÌ‹D$…Àt‹…Àt ‹‰D$é»þÿ3ÀÃÌÌÌÌS‹\$VW‹|$…ÿ‹ÃPŠ@„Éuù+‹øjUGhð PèÁÚùÿ‹ðƒÄ …öujVhð jAhj 蓲ýÿƒÄ_^3À[ÃWSVè¢èýÿƒÄ …À}$j\hð jvhj èf²ýÿVè ÜùÿƒÄ_^3À[ÃPL$Qj‰t$ èFÖþÿV‹øèþÛùÿƒÄ‹Ç_^[ÃÌÌÌÌ̸èSU‹l$VWjUè6Öþÿjn‹øhð WèÚùÿjo‹ð?hð PèÚùÿƒÄ ‹Ø…öt,…Ût(L$QU‰t$èùÕþÿWVSèáæýÿVè‹ÛùÿƒÄ_^]‹Ã[YÃjqhð jAh‚j 諱ýÿƒÄ_^]3À[YËD$ÃÌÌÌÌÌÌÌÌÌÌÌU‹l$VWS3öèÑ‹ýÿƒÄ…À~*VSèÓ‹ýÿ‹M(‹ø‹D$WPUÿуÄ…ÀuSFè§‹ýÿƒÄ;ð|Ö_^3À]ËÇ_^]ÃÌÌÌÌV‹t$ W‹|$VWèɃÄ…Àu_¸^ËL$ ‹QöBu_3À^ÃQ‰A\‹A j‰q`‰ydÿЃÄ_^ÃÌÌÌÌÌÌÌ‹D$ SP‹D$‹XPèMÿÿÿ‹L$ƒÄ‰[…Àt h|hÔð jƒÀjPèHÌùÿƒÄ¸Ã3ÀÃÌÌÌÌÌÌÌÌÌÌÌ̸èv‹F‹@S‹^ UÁèW3íƒàhðð ‰l$‰l$‰D$ÇD$ÿÿÿÿÿÀ ƒÄ…ÀtÇD$9nHޝ‹NLUQ衊ýÿ‹VƒÄöB‹øu&÷G(tVjÇF\"‰nX‰~`ÿӃąÀ„vƒ|$u&÷G(tVjÇF\(‰nX‰~`ÿӃąÀ„IWèêÄ‹L$ƒÄƒùÿt#…Ét…Àt-‹VöB tEƒøë…Àt<ÇF\%ë‹VöB t*ƒøt%…Àt!ÇF\Vj‰nX‰~`ÿӃąÀ„å‹L$ ‹F‹@…À~A3Ò…ÉŸÂRPWèÈƒÄ …Àt‹NöA t"ƒøtVjÇF\‰nX‰~`ÿӃąÀ„–ƒý~5öG( u/‹G ƒøÿt'‹T$D9D$~VjÇF\‰nX‰~`ÿӃąÀt\‹G(¨ uÿD$©t3‹G$ƒøÿt;è~VjÇF\&‰nX‰~`ÿӃąÀt%ÿD$ÇD$ ëÇD$ E;nHŒQþÿÿ¸_][ƒÄËFLSU‹n WPèшýÿ‹NL‹øOWQèÔˆýÿ‹V‹Ø‹BjPSèƒLƒÄƒøu_][Ã3Ƀø”ÁVj‰~X‰^`ƒÁ‰N\ÿÕƒÄ_][ÃÌÌÌÌÌÌ̸è‹FXSWP‹FLPÇD$èoˆýÿ‹V0‹ØSL$QV‰^`ÿ҃ąÀuVP‹F ÇF\ÿЃÄë&‹D$‹N4PV‰FhÿÑ‹øƒÄ…ÿt‹T$‹F8SRVÿÐƒÄ ‹ø‹L$QÇFhèkÏþÿƒÄ‹Ç_[YÃÌ̸èv‹D$SVPèÊ>þÿ‹t$$‹‰D$ ‹QRèWˆýÿƒÄ…Àu4h0hÔð jj è½Èùÿ‹‹HQèˆýÿh2hÔð jj èŸÈùÿƒÄ$‹‹HT$RQ謉ýÿ‹\$$ƒÄ…À|‹S SjÇC\ÿ҃ąÀu^[ƒÄËCö@t ^¸[ƒÄËW‹yW3öè3‡ýÿƒÄ…À~VWè5‡ýÿƒÄƒxWFè‡ýÿƒÄ;ð|â_^¸[ƒÄËS SjÇC\$ÿ҃ąÀuÞ_^[ƒÄÃÌÌÌÌÌV‹t$‹F‹H‹P$‹FLQRPNTQVPRèŸò3ɃÄ;ÁuhahÔð jAh‘j èN¬ýÿƒÄ3À^ÃøÿuXWx‹FLPè…†ýÿƒÄ;Ç~<‹NLWQ脆ýÿƒÄ÷@(t‹V Vj‰F`ÇF\*ÿ҃ċFLPGèI†ýÿƒÄ;ø|Ä_¸^ÃøþuV‰N`Q‹N ÇF\+ÿуÄ^ËV÷Bt‹F Vj‰N`‰N\ÿЃÄ…À„_ÿÿÿ¸^ÃÌÌ̸èvþ‹D$V…Àt‹‹pëD$Pÿð ‹t$ ‹L$ƒÄ‹D$™È‹D$ò‰L$‰t$…Àt-‹PƒúuVQPè7nþÿƒÄ ^ƒÄÃúuVQPèRrþÿƒÄ ^ƒÄÃVQPèÂsþÿƒÄ ^ƒÄÃÌÌÌÌÌÌÌÌÌÌ‹D$…ÀtPèRþÿƒÄ…Àu¸ÃU‹l$ VWU3ÿè6…ýÿƒÄ…À~7WUè8…ýÿPè‚ìÿÿ‹ðƒÄ …öt?VèþÿƒÄ…ÀtPVèfþÿUGèÿ„ýÿƒÄ;ø|Éh”hÔð jkjnj 蓪ýÿƒÄ_^3À]Ãh‡hÔð jljnj èuªýÿƒÄ_^3À]ÃS_ÿ…Û|(d$SU蹄ýÿPèìÿÿ‹øVWèþÿWèôþÿƒÄƒëyÜ‹D$[…Àt VPèüþÿƒÄVèÓþÿƒÄ_^¸]ÃÌÌÌÌÌÌÌ‹D$‹L$‹T$ P‹D$ Q‹L$ RPQjè@íùÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ‹T$ƒÂl‰T$é îùÿ‹L$ƒÁl‰L$é0ïùÿ‹D$‹@\ÃÌÌÌÌÌÌÌÌ‹D$‹L$‰A\ÃÌÌÌÌ‹D$‹@`ÃÌÌÌÌÌÌÌÌ‹D$‹@LW…ÀtUPè~„ýÿ‹øƒÄ…ÿtFVW3ö較ýÿƒÄ…À~1ëIVW蹃ýÿhÚhÔð jƒÀjPèÒÄùÿWF苃ýÿƒÄ ;ð|Ô^‹Ç_Ã3À_ÃÌÌÌÌÌÌÌÌÌÌÌV‹t$ W‹|$…ÿu‹þ…öthW跃ăøÿu hhÔð jyh†j èæ¨ýÿƒÄ_3À^ÃP趃ăxÿuVèÙ¶ƒÄƒøÿuhëÁPè䵃Ä‹t$…öu ‹pë‹t$…öt.VèæBƒÄƒøÿu h(hÔð jxh†j èv¨ýÿƒÄ_3À^ËL$ …ÿt ‹Aƒxu‰x…öt ‹Aƒxu‰p_¸^ÃÌÌVh5hÔð jtè>Ðùÿ‹ðƒÄ …öuh8hÔð jAhŽj è ¨ýÿƒÄ3À^ÃjtjVèdûƒÄ ‹Æ^ÃÌÌÌÌÌ‹D$‹L$‰HÇ@$0IÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$‹F@W…ÀtVÿЃÄ‹F…ÀtPèPRƒÄÇF‹FP…ÀtPèyêƒÄÇFP‹FL…Àth€Pè=„ýÿƒÄÇFL~lWVjè×ëùÿ3ÀƒÄ ‰‰G_^ÃÌÌÌÌÌÌÌÌÌÌ‹L$‹Q‰T$éÐR‹L$‹Q‰T$éPR‹D$‹L$ ‹T$P‹BQPè¹RƒÄ ÃÌÌÌÌÌ‹D$‹@PÃÌÌÌÌÌÌÌÌ‹D$‹@TÃÌÌÌÌÌÌÌÌ‹D$Pè¦TƒÄ…ÀuËL$‹Q‰D$‰T$éUÌÌÌÌÌÌÌÌÌÌV‹t$‹F…ÀtPèNQ‹D$ƒÄ‰F^ËL$ ‰N^ÃÌÌÌÌÌÌÌÌÌV‹t$‹F‹@¨u¸^ÃS¨t‹NLQè¼€ýÿ‹ØƒÄKë3ÛW3ÿ…Û|‰~Xè#øÿÿ…ÀtG;û~ï_[¸^Ã_[3À^ÃÌÌÌÌÌÌÌÌÌÌ̸Dèù¡Àç3ĉD$@U‹l$PV‹t$P‹‹FW‹~ƒÿu;ƒÁõƒùw‹‹P‰L$f‹Hf‰L$$‰T$ L$&ƒÀ ë4_^3À]‹L$@3Ìè×øƒÄDÃù |ç‹‹H‰T$‹P‰L$ ‰T$$L$(ƒÀ Š€úZt3€ú-t.€ú+t)ˆŠP@Aˆ@A€8.u!ŠP@€ú0|€ú9ŠP@€ú0}òëÆ0AÆ0AŠÆZÆA€úZu3Àë=€ú+t €ú-…jÿÿÿ¾HS¾X ‰ K¾X¾@ I K ‰„H0‚ÿÿ[€ú-u÷Ø‹ÐÁâ+Ð÷ÚÒUÒRD$L$‰^‰F‰N ‰^‰^H‰^‰^D‰^L‰^\‰^T‰^X‰^`‰^d‰^PèÊF‰F;Ãu!h]hÔð jAhj è{œýÿƒÄ_^3À[Ã;ût?‹W RPè´J‹O‰N ‹W0ƒÄ‰V@;ÃthŒæ èJP‹FPèJƒÄ ;Ãuhy롃H‰^@ëÕ;ût ‹G;Ãt‰F(ëÇF(àH;ût ‹G;Ãt‰F$ëÇF$€…;ût ‹G;Ãt‰F ëÇF €H;ût ‹G;Ãt‰FëÇFÀ[;ût ‹G ;Ãt‰F,ëÇF,S;ût ‹G$;Ãt‰F0ëÇF0pX;ût ‹G(;Ãt‰F4ëÇF4 Y;ût ‹,;ût‰~8ëÇF8€LNlQVjÇFèPvýÿ‰FL;ÇtQ‹NQPèÿsýÿƒÄ…Àt@‹Vj}hÔð jƒÂjRè!¶ùÿƒÄÇFH‹F ;Çt2PèzuýÿƒÄ‰D$;Çu!h…ëjzhÔð jAjj èVšýÿƒÄé ‹FLPè•týÿ‹VL‹èMÿQRè–týÿ‹ø‹C ƒÄ ;ʼnD$ Œ€‹ÿWèêûýÿ‹F(WWVÿЃÄ…Àui9F td‹\$WVèkèÿÿƒÄ‰D$…ÀtN‹NLPQè6sýÿƒÄ…À„É‹T$h¦hÔð jƒÂjRèPµùÿ‹D$$P‹ËQèSuýÿÿFH‹|$,EƒÄ9l$ }‚‹VLRèésýÿXÿ‹FLSPèìsýÿ‹øWèÔÕÿÿ‹N(WWVÿуÄ…À„Ï‹VLRè¸sýÿƒÄƒø…—‹N$WD$VPÿÑƒÄ ‰D$0…À~A‹T$RWèšÕÿÿƒÄ…Àu+Wè´þÿ‹|$‹FLWSPèžsýÿƒÄÇFHëph£é¢þÿÿ‹D$0ÇF\‰~`‰^Xƒøu ‹L$QèH´þÿƒÄVjÇD$$ÿT$,ƒÄ‰D$0…À„„ë#‹VLRèŒrýÿ‹NLÿNH‰D$MEÿPQèsýÿƒÄ ‹ø‹\$ ;Ý|LWèdúýÿ‹V(WWVÿ҃ąÀu7‹N$WD$VPÿÑƒÄ …ÀŒ‹t‹|$‹VLWRè®qýÿƒÄ…À„LE;Ý}´Wèúýÿ‹F(WWVÿЃÄ…Àus‹\$…Ût4‹N(SWVÿÑƒÄ …Àt%‹VLSRèhqýÿƒÄE‰nH‰^`ÇF\ÇD$ë3À9nH‰~`œÀHƒàƒÀ‰F\VMj‰nXÇD$$ÿT$,ƒÄ‰D$0…À„ƒè!çÿÿ‰D$0…Àtv‹L$(ƒy~ èéÿÿ‰D$0ƒ|$0t\‹VLRjè„ìÿÿ‹F,VÿÐƒÄ ‰D$0…Àt@‹FV…ÀtÿÐëèùÿÿƒÄ‰D$0…Àt$ƒ|$u‹NöA€t ‹VV‹p‹D$;ðt(Pè‹Æ_^ÃÌÌÌÌÌÌÌÌ‹D$PèÆ´ýÿƒÄ…Àu¸þÿÿÿÉD$éÐûÿÿV‹t$W…öt‹>…ÿu èÛ¢þÿ‹ø…ÿt?‹D$PWè*þÿÿƒÄ…Àt‹L$‹T$‹D$QRPWè^þÿÿƒÄ…Àu…öt;>t Wè©¢þÿƒÄ_3À^Ã…ötƒ>u‰>‹Ç_^ÃÌ‹D$Pè6´ýÿƒÄ…ÀuƒÈÿÉD$éÒþÿÿÌÌVèZ¢þÿ‹ð…öt7‹D$ PVè©ýÿÿƒÄ…Àt‹L$‹T$‹D$QRPVèÝýÿÿƒÄ…Àu Vè0¢þÿƒÄ3À^ËL$ ‹T$‹D$WQRVPè3üÿÿV‹øè ¢þÿƒÄ‹Ç_^ÃÌÌÌVW‹|$jW袾ýÿ‹ðƒÄ…öu-hhØö jwhƒj èaýÿWh€’ jèTýÿƒÄ _3À^ËD$‹L$‹T$P‹D$QRVPè¢þÿÿV‹øèÚHþÿƒÄ‹Ç_^ÃÌÌ‹D$VPè5³ýÿ‹ðƒÄ…öuh/hØö jmjrj è÷ŒýÿƒÄ3À^ËL$‹T$‹D$WQ‹L$RPVQèEþÿÿV‹øè}HþÿƒÄ‹Ç_^ÃÌÌÌÌÌ‹D$‹L$‹T$ VP‹D$QRPjè„ÿÿÿ‹ðƒÄ…öu^ËL$ ‹T$‹D$WQRVPèûÿÿV‹øèë þÿƒÄ‹Ç_^ÃÌÌÌ‹D$‹L$‹T$ VP‹D$QRPjèÄþÿÿ‹ðƒÄ…öu^ËL$ ‹T$‹D$WQRVPèÃúÿÿV‹øè› þÿƒÄ‹Ç_^ÃÌÌÌ‹D$…ÀuÉD$é^fýÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$…ÛuƒÈÿ[ÃV‹t$ƒÆy3öUWSè.fýÿ‹øƒÄ;÷}!‹l$VSè)fýÿ‹UPèð¿ýÿƒÄ…Àt F;÷|ä_]^ƒÈÿ[Ã_]‹Æ^[ÃÌÌÌÌÌW‹|$…ÿuƒÈÿ_ÃV‹t$ƒÆy3öSUWèÎeýÿ‹ØƒÄ;ó}'‹l$VWèÉeýÿ‹@ƒÄ…À~…íu…À…ít F;ó|Þ][^ƒÈÿ_Ã][‹Æ^_ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌSU‹l$ V3ÛW…íuh˜hôö jCjhj è ‹ýÿƒÄ_^]3À[Ëu…öu è‡fýÿ‹ð…öt9Vè;eýÿ‹|$ ƒÄ;ø…ÿ}‹ø‹D$Pè€5ÿÿ‹ØƒÄ…Ût4WSVècýÿƒÄ …Àu9h°hôö jAjhj 裊ýÿƒÄ…Ût Sèæ4ÿÿƒÄ…öt Vè©dýÿƒÄ_^]3À[Ã}u‰u_‹Æ^][ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$…ÀuËL$÷ÙÉáI‰H¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$…Éu3ÀËD$‹‹@‹IRPQèÁ_ÿÿƒÄ ÷ØÀ÷ØÃÌÌÌÌÌÌÌ‹D$…ÀuËÃÌÌÌÌ‹D$…ÀuÃ3É9HŸÁ‹ÁÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$Pèæ¯ýÿƒÄ…Àu¸þÿÿÿÉD$é°ýÿÿVW‹|$ …ÿt‹7…öu(èÛ3ÿÿ‹ð…öuhÑhôö jAjmj 耉ýÿƒÄ_3À^ÃS‹\$…Ût=‹PèEþÿSè1¼ýÿ‹L$ ÷ÙÉቋD$$I‰N‹‹@‹NRPQèé^ÿÿƒÄ…Àu…ÿt;7t Vèt3ÿÿƒÄ[_3À^Ã…ÿtƒ?u‰7[_‹Æ^ÃÌÌÌÌÌÌÌÌÌÌ‹D$VPè¯ýÿ‹ðƒÄ…öuhÀhôö jmjlj è׈ýÿƒÄ3À^ËL$‹T$‹D$WQRVPè ÿÿÿ‹øƒÄ…ÿu Vè[DþÿƒÄ‹Ç_^ÃÌÌÌ‹D$‹‹Q‰T$énüÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$‹‹H‰L$éžþÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$‹‹H‰L$é®üÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‹Q‰T$é~JÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹ƒÂ‰T$éNKÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ ‹T$‹L$P‹QƒÀPè·üÿÿƒÄ ÷ØÀ÷ØÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‹Q$‰T$éžûÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$‹‹H$‰L$éÎýÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$‹‹H$‰L$é~ûÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$‹‹H$‰L$é¾ûÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹‹B$‰D$é^ÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹‹B$‰D$énÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ ‹T$‹L$P‹QƒÀ$PèÇûÿÿƒÄ ÷ØÀ÷ØÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‹Q$‰T$éIÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹ƒÂ$‰T$éîIÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹H‰L$épúÿÿ‹T$‹B‰D$é°üÿÿ‹T$‹B‰D$épúÿÿ‹T$‹B‰D$éÀúÿÿ‹L$‹Q‰T$ép‹L$‹Q‰T$é‹D$ ‹L$‹T$PQƒÂRèùúÿÿƒÄ ÷ØÀ÷ØÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹H‰L$éPH‹L$ƒÁ‰L$é0Ié;`ýÿÌÌÌÌÌÌÌÌÌÌÌV‹t$…öt!Vè!`ýÿ‹L$ƒÄ;Á~…É| QVè`ýÿƒÄ^Ã3À^ÃÌÌV‹t$…öt!Vèñ_ýÿ‹L$ƒÄ;Á~…É| QVè‹^ýÿƒÄ^Ã3À^ÃÌÌS‹\$VW3ÿ…Ûu!hh ÷ jCh‡j è[…ýÿƒÄ_^3À[Ë3…öu è×`ýÿ‹ð…öt!‹D$Pèוþÿ‹øƒÄ…ÿt6WVèw^ýÿƒÄ…Àu;h•h ÷ jAh‡j è…ýÿƒÄ…ÿt Wè{•þÿƒÄ…öt Vè_ýÿƒÄ_^3À[Ã;u‰3_‹Æ^[ÃÌÌÌÌÌÌÌÌV‹t$W…öt#‹|$…ÿt‹Pèf@þÿW耷ýÿƒÄ‰_¸^Ã_3À^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èf×S‹\$V3ö‰t$;Þu^3À[ƒÄÃUW‹|$ ‹Ç%‰D$t>‹Pèó¯ýÿ‹l$,‹L$(PWUQjèphÿÿ‹ðƒÄ…öuh'h ÷ j é«‹V‰T$ë/‹l$(ƒýÿt&Wè¾Zÿÿ‹ðƒÄ…öt~‹D$$UPVè©YÿÿƒÄ …Àtk‰|$èy_ýÿ‰C…Àt[ÇC…ÿtuèÿÿ‹Ø…ÛtEƒýÿuƒ|$u‹L$$QWSè„VþÿƒÄ …Àt&ë‹T$VRSèVþÿƒÄ ‹D$‹HSQèÞ\ýÿƒÄ…Àu%hCh ÷ jAhŠj èoƒýÿƒÄ_]^3À[ƒÄÃ_]^¸[ƒÄÃÌÌÌÌÌ‹D$ƒxu ‹@‰D$éŠ]ýÿ3É9H•Á‹ÁÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$…öu3À^Ã~u‹FPèT]ýÿƒÄë3À9F•À‹L$ ;È}؃~uQ‹NQè?]ýÿƒÄ^ËF^ÃÌÌÌÌÌVW‹|$ …ÿt‹7…öu+è+“þÿ‹ð…öu híh ÷ jAh‰j è‚ýÿƒÄ_3À^ÃS‹\$…Ût,‹Pè4>þÿSèNµýÿ‹L$(‹T$$Q‰‹D$$RPVè×ýÿÿƒÄ…Àu…ÿt;7t VèÒ’þÿƒÄ[_3À^Ã…ÿtƒ?u‰7[_‹Æ^ÃÌÌÌÌÌÌÌÌVW‹|$jWèB³ýÿ‹ðƒÄ…öu-h h ÷ jwhŒj è‚ýÿWh€’ jèôƒýÿƒÄ _3À^ËD$‹L$‹T$P‹D$QRVPèÿÿÿV‹øèz=þÿƒÄ‹Ç_^ÃÌÌV‹t$…ötlƒ~u‹FPèø[ýÿƒÄë3À9F•À‹L$ ;È}Hƒ~uQ‹NQèã[ýÿƒÄ‹ðë‹v…öt*VèÏSþÿƒÄ9D$th[h ÷ jzh‹j èNýÿƒÄ3À^ËF^ÃÌÌVWè©‘þÿ‹ð…öu híh ÷ jAh‰j èýÿƒÄ_3À^Ë|$…ÿt,‹Pè³<þÿWèͳýÿ‹L$$‹T$ Q‰‹D$ RPVèVüÿÿƒÄ…ÀuVèY‘þÿƒÄ_3À^ËL$ VQèFûÿÿV‹øè>‘þÿƒÄ ‹Ç_^ÃÌÌÌÌÌÌ‹D$‹L$‹T$ VP‹D$QRPjèdþÿÿ‹ðƒÄ…öu^ËL$WVQèýúÿÿV‹øèõþÿƒÄ ‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$ U‹l$VW‹|$USWèHôÿÿ‹ðƒÄ ƒþÿu_^]3À[ÃýþVSWè*ôÿÿƒÄ ƒøÿuä…ÿtWèhZýÿƒÄ;Æ~…ö|VWèfZýÿƒÄ‹ðë3öƒýýƒ~u(‹FPè9ZýÿƒÄƒøu£‹L$ jQjVèþÿÿƒÄ_^][Ã~uã_^]3À[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$VPèÅ¥ýÿ‹ðƒÄ…öuhÜh ÷ jmhˆj è„ýÿƒÄ3À^ËL$‹T$‹D$WQ‹L$RPVQè’üÿÿ‹øƒÄ…ÿu Vè;þÿƒÄ‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‹T$ VP‹D$QRPjètÿÿÿ‹ðƒÄ…öu^ËL$WVQèùÿÿV‹øè…þÿƒÄ ‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌSW‹|$ 3Û…ÿu_3À[ÃU‹l$V…íu WèÀÿÿƒÄ‹ðë‹õ…öu^]_3À[˃øttƒøt ƒøuX(ë»1ë»ë =˜u»X‹G‹QèªýÿPèèîýÿƒÄƒøtƒøtt=˜uËëËëËVèëýÿƒÄ=€Ë…íu VèÞòýÿƒÄ^]_‹Ã[ÃÌÌÌÌVjEh(÷ jè!¦ùÿ‹ð3ÉƒÄ ;ñt,‹D$‰‰N‰F‰N ‰N‹@;ÁtVÿЃÄ…Àu Vè§ùÿƒÄ3À^ËÆ^ÃÌÌV‹t$…öt‹F…Àt ‹@…ÀtVÿЃÄVèm§ùÿƒÄ^ÃÌÌÌÌÌÌÌÌ‹L$‹A…ÀuË@ …Àt‰L$ÿà¸ÃÌ‹L$‹A…ÀuË@…Àt‰L$ÿà¸ÃÌ‹L$‹A…ÀuƒÈÿË@…Àt‰L$ÿà¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹A…Àt‹@…Àt ƒyu‰L$ÿà3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹A…Àt ‹@…Àt‰L$ÿà3ÀÃÌÌÌÌÌ‹L$‹A…Àt ‹@ …Àt‰L$ÿà3ÀÃÌÌÌÌÌ‹L$‹A…Àt ‹@$…Àt‰L$ÿà3ÀÃÌÌÌÌÌ‹D$‹‹T$‹V‹1‹Æ+u ƒîtƒît^ËB^‰D$‹I‰L$黿ÿÿ‹R‹A^‰T$‰D$釿ÿÿÌÌÌÌÌÌÌVWh¶h(÷ j@èM¤ùÿ‹ð3ÿƒÄ ;÷u_3À^Ãh€}èTýÿƒÄ‰FÇè¢Wýÿ‰F‰~‰~è4&‰F ;ÇtËF4PVj‰~‰~‰~ ‰~$‰~(‰~,‰~0茿ùÿƒÄ _ÇF<‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$‹ƒøu‹FPè —þÿƒÄVèb¥ùÿƒÄ^Ãøu ‹NQèOþÿƒÄVèF¥ùÿƒÄ^ÃÌU‹l$…턜S‹]WS3ÿè¶UýÿƒÄ…À~JVWSè·Uýÿ‹ð‹FƒÄ…Àt ‹@…ÀtVÿЃÄ‹F…Àt ‹@…ÀtVÿЃÄVèä¤ùÿSGèmUýÿƒÄ;ø|¸^Sè/Uýÿ‹Eh`~PèÁWýÿM4QUjèe¿ùÿ‹E ƒÄ_[…Àt Pèƒ%ƒÄU蚤ùÿƒÄ]ÃÌÌÌÌÌSU‹l$ VW‹}W3öè Uýÿ‹\$ƒÄ…À~#‹ÿVWè UýÿƒÄ;X„€WFèæTýÿƒÄ;ð|ßjEh(÷ jè‘¢ùÿ‹ð3ÿƒÄ ;÷tW‰>‰~‰^‰~ ‰~‹[;ßt VÿӃąÀt/‰n‹EVPèšSýÿƒÄ…Àt_‹Æ^][ËF;Çt ‹@;ÇtVÿЃÄVèâ£ùÿƒÄ3À_^][ÃÌÌÌÌÌÌÌÌ‹L$‹ƒèt#ƒèu;‹Ahh(÷ jƒÀ jPèv•ùÿƒÄËIhŒh(÷ jƒÁjQèX•ùÿƒÄÃÌÌÌÌ‹L$‹ƒètƒèu‹A‰D$éd›þÿ‹I‰L$éø”þÿÃÌÌÌÌÌÌ̸ÈèfÌ¡Àç3ĉ„$Ä‹„$ЋŒ$̉$ƒèt:ƒètƒÈÿ‹Œ$Ä3ÌèWÌÄÈÃD$‰D$‹„$ÔT$‰T$‰D$ ëT$h‰T$‹”$ÔD$@‰D$h‰T$T$PQèƒUýÿ‹Œ$̃Ä3ÌèýËÄÈÃÌÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$V‹t$PQVè;ÿÿÿƒÄ ƒøÿu3À^ÃPVèSýÿƒÄ^ÃÌÌ̸è†ËU‹l$ VW‹|$WUèUýÿ‹ðƒÄƒþÿu_^3À]YÃ?tVUè×RýÿƒÄ_^]YÃSU‹Þè¶RýÿƒÄ;ð}hSUè¸Rýÿ‹ð‹‹ÈƒÄ+uTƒètƒèu#‹W‹FRPè„»ÿÿë ‹O‹VQRèU»ÿÿƒÄ…Àu'ƒ?u*‹G‹NPQèl´ÿÿƒÄ…ÀtUCèNRýÿƒÄ;Ø|˜[_^3À]YÃ[_‹Æ^]YÃÌÌÌÌÌÌÌ‹L$‹Q ‰T$éð"‹D$‹L$‹Q PRèN#ƒÄ¸ÃÌÌÌÌÌ‹L$‹Q ‰T$é#‹L$‹Q ‰T$é#‹L$‹Q ‰T$éÀ&¸èVÊ‹D$ ‹L$SU‹l$VW‹8‹wUQVèÉýÿÿƒÄ ƒøÿu3ÛëPVè¦Qýÿ‹ØƒÄ…Û…‹G‹T$‹rPèyQýÿƒÄ;ð}`‹ÿ‹OVQèvQýÿ‹HƒÄ…Ét$‹I…ÉtƒxuT$R‹T$$URPÿуÄ…À|u"‹GPFè.QýÿƒÄ;ð|·ë‹L$_^]‰A[ƒÄÃ\$‹T$ÇB…Ûu _^]3À[ƒÄË ‹D$(‰‹K‰H‹ƒètƒèu+hh(÷ jƒÁ ëhŒh(÷ jƒÁjQè÷‘ùÿƒÄ_^]¸[ƒÄÃÌÌÌÌÌÌÌSW‹|$»…ÿu_3À[ÃVhJh(÷ jè:žùÿ‹ðƒÄ …öuhMh(÷ jAj|j è výÿƒÄ^_3À[ÃhSh(÷ j j ‰‰~èK‘ùÿVèÕûÿÿ‹|$$‹GVPè'ýÿÿƒÄV…Àt'è üÿÿV脟ùÿh\h(÷ jej|j è¯uýÿƒÄ3Ûë ‹OQèïNýÿƒÄhah(÷ j j èéùÿƒÄ^_‹Ã[ÃSW‹|$»…ÿu_3À[ÃVhlh(÷ jèjùÿ‹ðƒÄ …öuhoh(÷ jAj}j è’D’P’J’V’\’b’h’n’t’z’€’†’Œ’’’˜’ž’ª’¼’Â’È’Ô’Ú’à’æ’ì’ò’ø’“¤’°’þ’¶’ ““““"“"“"“"“"“Î’ÌÌÌÌ‹L$¡À‰ Àᬠ…Àu¸ÃPè;@ýÿƒÄƒÀÃÌÌÌÌ‹D$…À}3ÀÃø} @ÅÀÃÀùP¡¬ Pè@ýÿƒÄÃÌ̸膸‹D$HÿƒùwHƒÄÉ$¡¬ …ÀuƒÈÿƒÄÃ$RPèøAýÿƒÄƒøÿtçƒÀƒÄÃÌÌÌÌÌÌÌÌ̸è6¸V‹t$$FÿƒøwFÿë#¡¬ ‰t$…ÀtL$QPè¬AýÿƒÄƒøÿtƒÀƒøÿu"h—hðý j{hj èeýÿƒÄ3À^ƒÄËT$ ‰2¸^ƒÄÃÌÌÌÌÌÌÌÌÌ̸è¶·S‹\$$U‹l$$ƒãþEÿVƒËWƒøw}ÿë,¡¬ ‰l$…ÀuƒÏÿëL$QPèAýÿƒÄƒøÿu øëxƒÿÿuHh«hðý jè…Œùÿ‹ðƒÄ …öu%h¬hðý jAh…j èTdýÿƒÄ_^]3À[ƒÄÃÇFë-…ÿ}3öë%ƒÿ} 44õÀ롬 WùRPèv>ýÿƒÄ‹ðöFt ‹N QèÂùÿƒÄ‹T$8RèeÍüÿƒÄ‰F …Àu h¶ézÿÿÿ‹F‹L$4‹T$<ƒà ÉF‹D$@‰.‰N‰V‰FƒÿÿuA¡¬ …Àu h»è‡;ýÿƒÄ£¬ …Àu hÆé*ÿÿÿVPèÚ<ýÿƒÄ…Àu hÊéÿÿÿ_^]¸[ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌV‹t$…öt ‹F¨t¨t ‹F PèùÿƒÄVèúŒùÿƒÄ^ÃÌÌÌÌÌVW¾À¿d$Fü…Àt"‹¨t¨t ‹NQèÆŒùÿƒÄVüR躌ùÿƒÄƒÆƒïuÏ¡¬ hÀ–PèŸ?ýÿƒÄ‰=¬ _^ÃÌÌÌV‹t$ jjÿVèá{ŠF(öжÀƒà ƒÄ ƒÈÁè^ÃÌÌÌÌÌÌÌÌÌÌÌ‹D$V‹pX…öuF^ËFS‹\$ W…Àt:P3ÿèÊ<ýÿƒÄ…À~+I‹NWQèÆ<ýÿPèŽýÿƒÄ ;ÃtX‹VRGèŸ<ýÿƒÄ;ø|Ø‹…Àt8P3ÿèŠ<ýÿƒÄ…À~)I‹WPè‡<ýÿPèÁýÿƒÄ ;Ãt"‹QGèa<ýÿƒÄ;ø|Ú_[¸^Ã_[¸^Ã_[¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$ ƒþÿuF^ÃVèüÿÿƒÄƒøÿu‹D$‹L$PQVÿÀƒÄ ^Ã…À}3Àë$ƒø} @ÅÀ달 ƒÀùPRèä;ýÿƒÄ‹T$‰D$‹@^‰T$ÿàÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$ ‹FX…Àt#ƒ8uƒxt‹D$‹L$‹QPVRè–þÿÿƒÄ ^ÃjjÿVèGzŠF(öжÀƒà ƒÄ ƒÈÁè^ÃÌ‹D$ƒxXt‰D$‹T$‹B‰D$éRþÿÿ¸ÃÌÌÌÌÌÌÌÌÌÌÌ̸ÀÀÃÌÌÌÌÌÌÌÌÌ̸観SV‹t$3ÛÇD$…öu^C[YÃWèàüÿPè?Òüÿ‹øƒÄ…ÿ„8VjjlWèçÎüÿƒÄ…ÀŽ"‹D$ƒø…¦UjjjWè’Šÿÿ‹ðƒÄ…öt6‹l$ëI‹EVPèöéÿÿƒÄ…Àt8VCè˜{þÿjjjWè\Šÿÿ‹ðƒÄ…öuÓèngýÿ%ÿƒølu1…Û~-èû`ýÿ‰\$]…öt Vè\{þÿƒÄ…ÿt Wè?ÊüÿƒÄ‹D$ _^[YÃh¢h$þ j joj èÎ_ýÿƒÄëƒøuMjWè¬îÿÿ‹ðƒÄ…öuh³h$þ j joj èž_ýÿƒÄë“‹L$‹QVRè;éÿÿƒÄ…À„zÿÿÿ‰D$ éqÿÿÿh¼h$þ jdjoj èb_ýÿƒÄéaÿÿÿhŽh$þ jjoj èE_ýÿƒÄéDÿÿÿÌÌÌÌÌÌÌÌÌÌÌÌ̸è²SV‹t$3ÛÇD$…öu^C[YÃWèeÞüÿPèŸÐüÿ‹øƒÄ…ÿ„8VjjlWèGÍüÿƒÄ…ÀŽ"‹D$ƒø…¦UjjjWèb{ÿÿ‹ðƒÄ…öt6‹l$ëI‹EVPè&éÿÿƒÄ…Àt8VCèX€þÿjjjWè,{ÿÿ‹ðƒÄ…öuÓèÎeýÿ%ÿƒølu1…Û~-è[_ýÿ‰\$]…öt Vè€þÿƒÄ…ÿt WèŸÈüÿƒÄ‹D$ _^[YÃhåh$þ j jpj è.^ýÿƒÄëƒøuMjWèŒíÿÿ‹ðƒÄ…öuhöh$þ j jpj èþ]ýÿƒÄë“‹L$‹QVRèkèÿÿƒÄ…À„zÿÿÿ‰D$ éqÿÿÿhÿh$þ jdjpj èÂ]ýÿƒÄéaÿÿÿhÑh$þ jjpj è¥]ýÿƒÄéDÿÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ U3íƒøt ]‰D$ éªüÿÿ‹T$ Vhô¨ Rèºâüÿ‹ðƒÄ…öu hh$þ jh„j èI]ýÿƒÄ^3À]ÃWjjjVè4VÿÿV‹øè|ÇüÿƒÄ…ÿu!hh$þ j h„j è ]ýÿƒÄ_^3À]ÃSW3ÛèK7ýÿƒÄ…À~Od$SWèI7ýÿ‹ð‹ƒÄ…ÀtP‹D$‹HQè€æÿÿƒÄE‹v…öt‹T$‹BVPè7çÿÿƒÄEWCèü6ýÿƒÄ;Ø|µh WèZ9ýÿƒÄ[_^‹Å]ËL$3Àƒéu^‹D$ƒøuVVèæ•ÿÿPÿÀ ƒÄj…ÀtP‹D$Pë è©•ÿÿ‹L$ PQè¾þÿÿƒÄ ‹ð÷Þö÷Þ…öujrh$þ jhjej è-\ýÿƒÄ‹Æ^Ãøu‹T$ P‹D$RPèþÿÿƒÄ ÷ØÀ÷ØÃ‹L$ ‹T$PQRè'ûÿÿƒÄ ÷ØÀ÷ØÃÌÌÌÌÌÌÌÌÌÌÌÌ̸èÀÃÌÌÌÌÌÌÌÌÌÌVWh˜hdþ jè̓ùÿ‹ð3ÿƒÄ ;÷tè­Áüÿ‰;ÇuVèa…ùÿƒÄ_3À^ËD$ ‰~‰~‰~ ‰~‰p _¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$V‹p W3ÿ9~~‹Nƒ<¹¹t ‹Rè …ùÿƒÄG;~|ã‹F…Àt Pèö„ùÿƒÄ‹F …Àt Pèæ„ùÿƒÄ‹…Àt PèWÁüÿƒÄVè΄ùÿƒÄ_^ÃÌÌÌÌÌÌÌ̸èÖ­‹D$ …À„Í€8„ÄSU‰D$WЉD$€ù;t„É…ƒ‹L$ ‹Ø+ÙP‰L$‰T$ „j3ÿ9~~B¤$‹F‹¸‹ÂhëIŠ@„Éuù+Å;Ãu‹L$SQRÿ€! ƒÄ …ÀtG;~|É‹D$‹N;ùŒ‹FA;ÁžƒÀ hÖ…hdþ R‰FèA‚ùÿ‹ø‹FhØÀÀhdþ Pè(‚ùÿƒÄ‹è…ÿ„Í…í„Å‹N‹FØÿÿÿRPWèP­‹N‹F ØÿÿÿRPUè;­‹FƒÄ…Àt P艃ùÿƒÄ‹F …Àt PèyƒùÿƒÄ‰~‰n ‹N‹V ‹D$hꉊKhdþ Qè ùÿ‹V‹N‰‘‹V‹FƒÄ ƒ8tP‹L$‹SQRÿ! ‹F‹N‹‹L$$ƸFƒÄ €9t"‹Á@édþÿÿhÛhdþ jAjdj è)YýÿƒÄ3À_][ƒÄÃh¾hdþ jqjdj èYýÿƒÄ3ÀƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸ÔèÆ«¡Àç3ĉ„$Ћ„$äS‹œ$ÜW‹¼$è‰\$‰D$ ÇD$…ÿu_3À[‹Œ$Ð3Ì覫ÄÔË„$ä‰D$ƒøu$Œ$°T$T‰L$T‰¼$ĉT$ÇD$ ß1 ë%ƒø…âD$dL$T‰D$T‰|$l‰L$ÇD$ ô¨ Vè5¾üÿ‹ð…öuh$hdþ jjgj èXýÿƒÄéBU‹k W蘘ÿÿ3ÛƒÄ9]‰D$Ž%›‹U‹šP¤$Š@„Éuù+ƒÀPVèM¾üÿƒÄ…À„3ÿ‹D$‹L$‹UWP‹š‹VQ‹Nj/Ph|þ QRèJýÿ‹ND$LPQGÿh! ƒÄ(…À|H‹„$ìƒøu‹U ‹š‹N‹T$PQRè’öÿÿëƒøu›‹E ‹ ˜‹V‹D$QRPèøÿÿƒÄ …À…{ÿÿÿhkhdþ j jèˆrùÿ‹|$ ‹W‹BL$0QPè“3ýÿƒÄƒøÿt‹O‹QPRè^1ýÿƒÄ‹øë3ÿhohdþ j jèBrùÿƒÄ…ÿuNC;]Œáþÿÿ]…öt Vè½üÿƒÄ^‹Œ$Ø‹D$_[3Ì蹩ÄÔÃh0hdþ jAjgj è’VýÿƒÄ뼋‹D$(‰‹WÇD$‰Pë¤hhdþ jpjgj è`VýÿƒÄë™ÌÌÌÌÌÌÌÌÌÌÌ‹L$V‹q ‹L$ 3ÀƒéuL‹D$ƒøuEèÿÿPÿÀ ƒÄj…ÀuèZÿÿPèûÿÿ‹ðƒÄ…öuhŠhdþ jgjfj èöUýÿƒÄ‹Æ^ËT$PRèäúÿÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌVWjZhxÿ j(èÐ}ùÿ‹ð3À‰‰F‰F‰F ‰F‰F‰F3ÿ‰FƒÄ ‰F ‰F$;÷t-‹F$‰>‰~‰~‰~‰~ÇF ÿÿÿÿ;ÇthеPè/2ýÿƒÄ‰~$_‹Æ^ÃÌÌÌÌV‹t$W3ÿ;÷t-‹F$‰>‰~‰~‰~‰~ÇF ÿÿÿÿ;ÇthеPèí1ýÿƒÄ‰~$Vèá~ùÿƒÄ_^ÃÌÌÌÌÌÌÌÌÌÌÌV‹t$‹…Àt Pè¿~ùÿƒÄ‹D$ Pèb¾üÿ3ɃÄ…À•Á‰^‹ÁÃÌÌ‹D$‹T$ P‹H÷€t É€‰H¸ÃÌÌÌÌÌÌÌÌÌÌÌ‹L$‹D$÷Ñ!H¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$ƒÁ‰L$é`n‹L$ƒÁ‰L$éïÿÿ‹D$‹L$‰A ÃÌÌÌÌ‹D$‹L$‹T$ ƒH‰H‰P ÃÌÌÌÌÌÌÌÌÌV‹t$ƒ~$uèÀ/ýÿ‰F$…Àu^ËD$ ‹N$PQèi-ýÿƒÄ÷ØÀ÷Ø^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌU‹l$W3ÿ;ïu_3À]ËE$;ÇthеPè0ýÿƒÄS‹\$;ßu [‰}$_¸]ÃèP/ýÿ‰E$;Çu[_3À]ÃVSèü-ýÿƒÄ…À~:ëIWSèù-ýÿPèc†ýÿ‹ðƒÄ …öt9‹E$VPèÐ,ýÿƒÄ…ÀtSGèÂ-ýÿƒÄ;ø|ËM€^[_¸]ÃVèþÿƒÄ^[_3À]ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‹‹ d$Š:u„ÀtŠA:Bu ƒÁƒÂ„Àuä3ÀÃÀƒØÿÃÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‹‹D$‹‹ Š:u„ÀtŠA:Bu ƒÁƒÂ„Àuä3ÀÃÀƒØÿÃÌÌÌÌÌÌÌÌÌÌÌ¡° W‹|$…Àuh §èˆ*ýÿƒÄ£° …Àu7_ÃVWPè/ýÿ‹ðƒÄƒþÿt"¡° VPèÜ,ýÿPèýÿÿ‹ ° VQèi+ýÿƒÄ^‹° WRè¨+ýÿƒÄ÷ØÀ÷Ø_ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸(襋D$,‰$¡° …Àt& $QPèœ.ýÿƒÄƒøÿt‹° PRèg,ýÿƒÄƒÄ(Ãhà¦j(jD$ h°þ Pèè{ýÿƒÄƒÄ(ÃÌ¡° …ÀthÀ¤PèŒ.ýÿƒÄǰ ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$…Éu¸ËD$‹Q PöÂtÇ@öÂußS¶ÚVƒãWöÂt¾ë3ö9qt…Ûu9pu ‹y‰x…öuƒyt…Ûu9Xu ‹y‰x…öuƒÏÿ9y t…Ûu9x u ‹y ‰x …öuö@u‹y‰x‹y ƒ`ý‰x öÂtÇ@‹Q P…öu9q$t…Ûu9X$u‹I$QPèàüÿÿƒÄ…Àu_^[Ã_^¸[ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ƒH‰D$éÿþÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h PQRè—ÔþÿƒÄÃÌÌÌ‹D$‹L$h PQèܼþÿƒÄ ÃÌÌÌÌÌÌÌÌh 膭þÿƒÄÃÌÌ‹D$h Pè±þÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$ ‹D$PQh0 è ‹FT$RPh¨ÿ è‹D$(ƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸è¶¢Vh è ­þÿ‹ðƒÄ‰t$…öujhhP jAjfj"è¬OýÿƒÄ3À^YÃSU‹l$WU3Ûèå)ýÿƒÄ…ÀŽ®SUèã)ýÿ‹ø‹wƒÄ¹0 ‹Æd$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ‹D$PWè¬ëA¹¨ÿ ‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu3‹L$ƒÁQWèY ƒÄ…ÀtTUCè;)ýÿƒÄ;ØŒVÿÿÿ‹t$_][‹Æ^YÃjrhP jjjfj"èÂNýÿ‹W‹G‹RhH Ph@ Qh4 jè¡PýÿƒÄ0‹T$h Rèo¯þÿƒÄ_][3À^YÃÌÌÌÌ‹D$V‹p4ƒ~t2W‹|$‹QWèTþÿƒÄ…Àt‹FT$RjPèƒÄ ƒÆ ƒ~uÔ_‹D$^ÃÌÌÌÌÌÌÌÌÌ̸è¡WjèÎ$ÿÿ‹øƒÄ‰|$…ÿujqhˆ jAjej"èÿMýÿƒÄ3À_ƒÄÃSUV‹t$$V3íè6(ýÿƒÄ…ÀŽÊUVè4(ýÿ‹ø‹D$$‹p4‹FƒÄ‰|$…À„ˆ‹›‹N‹×Š:u„ÛtŠY:ZuƒÁƒÂ„Ûuä3ÉëɃÙÿ…Ét7‹ÏŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àt ‹FƒÆ …Àuë‹‹T$jQRè þÿƒÄ …Àt.‹|$ƒ~tM‹t$$VEèp'ýÿƒÄ;èŒ:ÿÿÿ‹|$^][‹Ç_ƒÄÃj{hˆ jAjej"èõLýÿ‹D$$Pèë#ÿÿƒÄ^][3À_ƒÄÃh„hˆ jojej"èÉLýÿ‹O‹W‹QhH Rh@ Ph4 jè¨Nýÿ‹L$@Qèž#ÿÿƒÄ4^][3À_ƒÄÃ̸èfŸV‹ñ‹FW…Àt!ÇD$ÿÐPD$ PSèå¸þÿ‹øƒÄ …ÿ|më7‹NjSÿÑhÁ‹øh¤ WèPtùÿƒÄ‰D$…ÀtFT$ R‰D$‹FSÿЃÄjèÌ"ÿÿ‹ðƒÄ…öt$‹T$‹D$‹L$VRPj‰N‰>èøÂÿÿ‹øƒÄ…ÿu#hÐh¤ jAh‡j"è×KýÿƒÄ_3À^ƒÄÃVèÆ"ÿÿƒÄ‹Ç_^ƒÄÃÌÌÌÌÌÌÌÌÌÌÌV‹t$Vèµ ƒÄ…Àu"hÛh¤ hhˆj"èƒKýÿƒÄ3À^ËL$ S‹\$QV‹ÈèÚþÿÿƒÄ[^ÃÌÌÌÌV‹3‹ÆPŠ@„Éuù+ƒø rFj hÀ Vÿ€! ƒÄ …Àu1¶F ƒÆ W‹=|! Pÿ׃Ä…Àt¶NFQÿ׃Ä…Àuñ_‰3¸^Ã3À^ÃSU‹l$ V‹u‹ÆWPŠ@„Éuù‹=€! +ƒørjhÔ Vÿ×ƒÄ …ÀuƒÆXë*‹ÆPŠ@„Éuù+ƒørIjhÌ Vÿ×ƒÄ …Àu8ƒÆX¶‹=|! Pÿ׃Ä…Àt›¶NFQÿ׃Ä…Àuñ_‰u^]‹Ã[Ã_^]3À[øè6‹D$VPQÇD$ è²ÿÿ‹ðƒÄ…öu^YÃT$RVèKÙþÿ‹L$V‰èoÙþÿ‹D$ƒÄ ^YÃÌÌÌÌÌ‹D$‹H…Ét‹@…Àt ƒ8t‰L$‹ÿàh„h¤ h”hj"èÖIýÿƒÄ3ÀËD$‹H…Ét‹@…Àt ‹@…Àt‰L$ÿàhh¤ h”hŽj"è–IýÿƒÄ3ÀËT$…Òt‹L$‹A‹@…Àt ‹I‰T$‰L$ÿàÃÌÌÌÌÌÌÌÌÌÌÌÌ‹T$…Òt‹L$‹A‹@ …Àt ‹I‰T$‰L$ÿàÃÌÌÌÌÌÌÌÌÌÌÌÌé“ÌÌÌÌÌÌÌÌÌÌÌé«’ÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$Ç@øÁ‰HÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‹T$ ‰H‹L$‰P‹T$‰H‹L$‰P ‰ÃÌÌÌÌÌÌÌÌÌé»”ÌÌÌÌÌÌÌÌÌÌÌéK”ÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$Ç@‰HÃÌÌÌÌÌÌÌÌÌÌÌÌÌSU‹l$W‹ù‹Ú…íu!j|h¤ h‚h—j"èYHýÿƒÄ_]3À[ÃVUèY ‹ðƒÄ…öu%hh¤ hh—j"è%HýÿƒÄ^_]3À[Ã~(„Í€?@u‹L$GPQ莑ƒÄë W賃ċèUè8"ýÿƒÄ…ÀEh‹h¤ jih—j"èÉGýÿ‹T$,ƒÄWhÜ RèfnýÿƒÄPh€’ jè¦IýÿƒÄ^_]3À[ËF(USVÿÐƒÄ €?@‹ØthÐÅUè?$ýÿƒÄ…Û„À‹l$‹L$QU‹ÎèÓúÿÿ‹ø‹FƒÄ…Àt@ÿÐPSè.¨þÿƒÄ^‹Ç_][ËF …Àu‹F0…ÀtTƒ{t)ƒ{t#WSVÿÐ‹ØƒÄ …Ûu¬^_][ËVSÿÒƒÄ^‹Ç_][Ãhœh¤ hˆh—j"èìFýÿƒÄ^_]3À[Ãh£h¤ jgh—j"èÊFýÿUètmýÿPh€’ jè·HýÿƒÄ$^_]3À[ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸èv™SU‹l$VW3ÿWU3ö‰|$èŸwýÿ‹ØƒÄ…Ûu*hh¤ jsjtj"èaFýÿUh€’ jèTHýÿƒÄ 鯋D$(ƒøu‹L$ D$PQèëƒøu‹D$,‹L$ T$RPèºûÿÿ‹ðƒÄ…öu+hh¤ jtjtj"èüEýÿ‹L$4Qhè jèëGýÿƒÄ ëIjèÿÿ‹øƒÄ…ÿuh!h¤ jAjtj"èÁEýÿƒÄë‹D$$WP‰w‹T$3öSV‰èô»ÿÿƒÄ‰D$SèGþÿWè‘ÿÿƒÄ…öt VèDoùÿƒÄ‹D$_^][ƒÄÃÌÌÌÌÌSV\$èúÿÿ‹ð‹ÃPè[úÿÿƒÄ…Àt‹L$‹T$QP‹D$VRPèžþÿÿƒÄ^[ÃW‹|$VWè|uýÿ‹L$‹\$$‹T$ƒÄPQ‹Ëè”üÿÿ‹ðƒÄ …öu.j]h¤ h€h˜j"èóDýÿShˆ’ Wh€’ jèàFýÿƒÄ(_‹Æ^[ÃÌÌÌÌÌÌÌSV\$èeùÿÿ‹ð‹ÃPè»ùÿÿƒÄ…Àt%‹L$‹T$QP‹D$VRPèNkýÿƒÄPèõýÿÿƒÄ^[ËL$‹T$ VQ‹L$ R‹T$è÷ûÿÿƒÄ ^[ÃÌ‹D$ ‹L$SPQèð‹ØƒÄ…Ûu[ÃUVWS3ÿèšýÿƒÄ…À~O‹l$WSè˜ýÿ‹P‹@‹L$RPUQèµþÿÿ‹ðƒÄ…öt2‹D$ …Àt jÿVPèÛ¸ÿÿƒÄ VèRîþÿSGèKýÿƒÄ;ø|µ_^]¸[Ã_^]3À[ÃÌÌÌ‹L$3À…Ét‹ƒÀ$‰D$éXÿÿÿÌÌÌÌÌÌÌÌ‹L$3À…Ét‹ƒÀ‰D$é8ÿÿÿÌÌÌÌÌÌÌ̸èv–VW‹|$3öÇD$…ÿtt$‹D$‹L$‹T$VPQRèùþÿÿƒÄ…Àt%…öt!‹D$PWè#Žÿÿ‹L$hp¤Q‹ðè ýÿƒÄ‹Æ_^YÃÌÌÌÌÌÌÌÌ̸ è–‹D$PL$Q臋‹T$$‹D$ ‹L$RPQT$RèŽýÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ̸ èÆ•‹D$PL$QèG‹‹T$$‹D$ ‹L$RPQT$RèîýÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ̸ 膕‹D$PL$Qè‹‹L$$ƒÄ3À…Ét‹ƒÀ$‹T$P‹D$RPL$ QèþÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌ̸ è6•‹D$PL$Qè·Š‹L$$ƒÄ3À…Ét‹ƒÀ‹T$P‹D$RPL$ Qè°ýÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌ̸ èæ”‹D$PL$QègŠ‹T$$‹D$ ‹L$RPQT$Rè>þÿÿƒÄ$ÃÌÌÌÌÌÌÌÌÌ̸ˆ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hˆ PQRèÇÅþÿƒÄÃÌÌÌ‹D$‹L$hˆ PQè ®þÿƒÄ ÃÌÌÌÌÌÌÌÌhˆ è¶žþÿƒÄÃÌÌ‹D$hˆ PèA¢þÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸Xè&”¡Àç3ĉD$T‹D$dVW‹|$hW‰D$ 3öèuýÿƒÄ…À~3VWèwýÿPL$jPQè:ûýÿT$RD$$PjèÉ WFèBýÿƒÄ$;ð|Í‹L$\‹D$_^3Ìè哃ÄXÃÌÌÌÌÌÌUèZýÿ‹è…íuj}h¤ jAjgj"è²@ýÿƒÄ3À]ÃS‹\$VWS3öèìýÿƒÄ…À~?ëIVSèéýÿ‹ø‹GƒÄ…Àu‹GjPè’qýÿƒÄ…ÀtPUè´ýÿSFè­ýÿƒÄ ;ð|Æ_^[‹Å]ÃhеUèýÿh‡h¤ jnjgj"è/@ýÿ‹G‹O‹PhH Qh@ Rh4 jèBýÿƒÄ8_^[3À]ÃÌÌÌÌW‹|$ …ÿtV‹…ÀtPVjU@h€ Pèògùÿ‹ðƒÄ …öujVh€ jAh•j"èÄ?ýÿƒÄ^3À_Ë‹OPQVè“‹ƒÄ Æ‹Æ^_Ã3À_ÃÌÌÌÌÌÌÌÌÌÌÌÌÌW‹|$…ÿujch€ jkjdj"èu?ýÿƒÄ3À_ÃVjèÿÿ‹ðƒÄ…öt&‹ÇPŠ@„Éuù+ÂPWVè÷ÿÿƒÄ …Àu#Vè:ÿÿƒÄjqh€ jAjdj"è%?ýÿƒÄ^3À_ËÆ^_ÃÌÌÌÌÌÌÌÌ‹D$‹‹T$‹‹ +‹ÁÃÌÌÌÌÌÌÌÌÌÌÌÌ̸<èÆ‘D$‰$‹D$@…À}3ÀƒÄ<Ãh»jj%L$ hÂQ‰D$èµhýÿƒÄ…Àt‹ƒÄ<á´ …ÀtÈT$RPèýÿƒÄƒøÿtµP¡´ PèàýÿƒÄƒÄ<ÃÌÌÌÌÌÌÌÌÌ‹D$‹QèjýÿƒÄ…ÀuÉD$écÿÿÿÌÌÌ‹D$ö@t ‰D$éýgùÿÃÌÌÌÌÌÌÌÌÌÌÌ̸è‘V‹t$ ‹Pè¹iýÿƒÄ…Àt PèÿÿÿƒÄ…Àu3À^YËN‹Q‰T$‹P…ÒtÿÒP‹F‹QT$ RjèúÁþÿƒÄ^YË ‹@QT$RjÿÐƒÄ ^YÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$U3í…Ûu!‹D$…ÀtÇÿÿÿÿ‹D$…ÀtÇÿÿÿÿ]3À[ÃVW‹|$ …ÿt‹7F…ö}3öSèºýÿƒÄ;ð}}IVSè¹ýÿ‹ø‹PèïhýÿƒÄ ;D$u‹D$ …Àu9…íu;‹ïSFèýÿƒÄ;ð|Ê…ít<‹t$…öt Uè(³ÿÿƒÄ‰UèÝþÿÿƒÄ_^][É0‹ïëÕ‹D$…Àt)_^]Çþÿÿÿ3À[Ë|$ …ÿtÇÿÿÿÿ‹D$…ÀtÇÿÿÿÿ_^]3À[ÃÌÌÌÌÌÌÌS‹\$ U‹l$ V‹t$ WƒæƒÏÿƒþtN‹EWSPèʲÿÿ‹øƒÄ …ÿ|:ƒþu_Fý^][Ã…öu ¸‘éÃþu,‹MWQègýÿƒÄ÷Ø_À^ƒà]H[Ãþ„–ƒþ„‹T$‹D$ RPSè…ðÿÿ‹ðƒÄ …öuhhœ hëz…ÿ|+‹MWQèmýÿPèWæþÿ‹UVWRè|ýÿƒÄ÷Ø_À^ƒà]H[Ã}uèqýÿ‰E…Àu_^]ƒÈÿ[ËEVPèýÿƒÄ÷Ø_À^ƒà]H[øföD$$uh+hœ PhŒj"è•;ýÿƒÄ_^]3À[ÃÌÌÌÌÌÌÌÌÌÌÌ¡´ …Àu.h»èMýÿƒÄ£´ …ÀujLhœ jAjhj"èO;ýÿƒÄ3ÀËL$QPèŽýÿƒÄ…ÀujPëÔ¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$ƒ>ÿt;›¡´ …Àuh»èÝýÿƒÄ£´ …ÀtVPè:ýÿƒÄ…ÀtƒÆ8ƒ>ÿu˸^ÃjLëjPhœ jAjhj"è¾:ýÿƒÄ3À^ÃÌÌÌÌÌÌÌ‹D$VPèµûÿÿ‹ðƒÄ…öujhœ jfjjj"èŠ:ýÿƒÄ3À^Ãh‚hœ j8è‚bùÿƒÄ …Àuhƒhœ jAjjj"èV:ýÿƒÄ3À^ÃW‹ø¹ó¥‹L$ ƒHP‰èµþÿÿƒÄ_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¡´ hлPèÐýÿƒÄÇ´ ÃÌÌS‹\$ …Û„üƒ|$U‹l$V‹t$t Sè,ýÿƒÄ…Àu,hß1 Uh0Æ VèTèüÿSèýÿƒÄ…ÀuhÀ Vè\¦üÿƒÄWS3ÿèðýÿƒÄ…ÀŽ›ëIƒ|$ thß1 Uh0Æ VèèüÿƒÄë…ÿ~hÔ° VèôçüÿƒÄWSèºýÿ‹H‹@ƒÄ…Éu PVèö¥üÿƒÄë …Àu QVèæ¥üÿƒÄëPQh¸ Vè´çüÿƒÄƒ|$ th2 Vè¿¥üÿƒÄSGèUýÿƒÄ;øŒjÿÿÿ_^][ÃÌÌÌÌÌ‹D$%=w\tC…Àt<=uVƒ|$hß1 Qthà RèKçüÿ¸ƒÄÃhÌ Rè7çüÿ¸ƒÄÃ3ÀËFjÿQ‹‹@QPRèx ÿÿƒÄÃ=t¸ËFQ‹‹@QPRèöêüÿƒÄÃÌ̸ è6‹UV‹t$W3íV‰l$ÇD$èËùÿÿ‹øƒÄ;ýu‹D$$‹L$(‹T$UPè/ÿÿÿƒÄ_^]ƒÄ ËF‹H‰L$‹OS;ÍtÿÑ‹VP‹PL$QUè¼þÿƒÄë‹‹ORD$PUÿÑƒÄ ‹Ø…Ûu‹T$(‹L$,jR‹T$(èÏþÿÿƒÄ[_^]ƒÄ ËG…Àt.SWÿЃÄ‰D$…Àts‹L$ P‹D$0hß1 Phô QèæüÿƒÄëX‹G$…Àt1jSWÿЋèƒÄ …íu‰D$ë<‹W‹D$,‹L$ ƒâRPUQèLýÿÿƒÄë ‹G,…Àt‹T$,‹L$ RQSWÿЃÄ…Àu‰l$hÐÅUèÜýÿ‹D$ ƒÄ…Àt PèË`ùÿƒÄ‹G…ÀtÿÐPSèØ—þÿ‹D$ƒÄ[_^]ƒÄ ËWSÿÒ‹D$ƒÄ[_^]ƒÄ ÃÌÌÌ̸覉W‹|$Wè ýÿƒÄ…À¸_YËD$U‹l$ V‹t$…ÀtPhß1 Uhü VèåüÿƒÄƒÅSWÇD$èÃýÿƒÄ…À[^]¸_YË|$ ‹D$PWè±ýÿƒÄ‹ø…íthß1 Uh0Æ VèÇäüÿƒÄ…ÀŽ©Wè&¬ÿÿPVèoðýÿWè)¬ÿÿƒÄ…À¸¬½ u¸ß1 Ph¤½ VèŒäüÿƒÄ …À~r‹L$$]SQWVè…ýÿÿƒÄ…Àuhß1 Sh0Æ Vè]äüÿ‹WRVè“fþÿƒÄjh2 V裡üÿƒÄ …À~)‹|$‹D$ GP‰|$èéýÿƒÄ;øŒ.ÿÿÿ[^]¸_YÃ[^]3À_YÃÌÌÌÌÌÌÌÌÌÌÌ‹D$VjPè“»üÿ‹ðƒÄ…öu^ËL$‹T$‹D$ WQRPVèâüÿÿV‹øèŠŸüÿƒÄ‹Ç_^ÃÌÌ‹D$SUVW3ö3ÿ3í…ÀtP舞üÿ‹øƒÄ…ÿt^‹D$…ÀtPèqžüÿ‹èƒÄ…ítGjXh j èú\ùÿ‹ðƒÄ …öt0‹\$ƒ;u ècýÿ‰…Àtlj~‰n‹VPèýÿƒÄ…ÀuCj`h jAjij"èŸ4ýÿƒÄ…öt VèR^ùÿƒÄ…ÿt WèE^ùÿƒÄ…ít Uè8^ùÿƒÄ_^]3À[Ã_^]¸[ÃÌÌÌÌé+ÿÿÿÌÌÌÌÌÌÌÌÌÌÌV‹t$…öt8‹F…Àt Pèú]ùÿƒÄ‹F…Àt Pèê]ùÿƒÄ‹…Àt PèÛ]ùÿƒÄVèÒ]ùÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌ̃|$t ÇD$< é¼þÿÿÇD$4 é¯þÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̃|$t ÇD$< éŒþÿÿ¸ÃÌÌÌÌÌÌ‹D$W3ÿ…Àu_ÃVjPèþÿ‹ðƒÄ…ötVè›ëúÿ‹øƒÄ…ÿuhŽh jAjyj"èm3ýÿƒÄVèÄÌúÿƒÄ^‹Ç_ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$W3ÿ…Àu_ÃVjPèºþÿ‹ðƒÄ…ötVè;ëúÿ‹øƒÄ…ÿuhšh jAjxj"è 3ýÿƒÄVèdÌúÿƒÄ^‹Ç_ÃÌÌÌÌÌÌÌÌÌÌÌ̸èÆ…V‹t$ÇD$…öuh¦h jmjlj"èÀ2ýÿƒÄ3À^YÃWèrÌúÿ€>-‰D$uF¿ë3ÿ€>0uŠFhåh jhjnj"èò.ýÿ‹G‹O‹PhH Qh@ Rh4 jèÑ0ýÿƒÄ0_3À^ËD$_Ǹ^ËL$_Çÿ¸^ÃÌÌÌÌÌV‹t$‹FPjè ûÿÿƒÄ…Àu(‹N‹V‹QhH Rh@ Ph4 jèh0ýÿƒÄ3À^ËL$ ‰¸^ÃÌÌÌÌS‹|! V‹ñ€>t¶PÿӃąÀt F€>uí^3À[À>u^3À[ËÆPŠ@„Éuù+ÂW|0ÿ;þt.¤$¶QÿӃąÀtO;þuî¾÷ØÀ_#Æ^[Ã;÷tÆG¾÷ØÀ_#Æ^[ÃÌÌÌÌÌÌÌÌÌÌÌÌS‹\$V…Û„†‹t$…ö„zWhrDvh Pè¡Uùÿ‹øƒÄ …ÿuhsh jAjoj"ès-ýÿƒÄ_^3À[ËϋӅö~,‹ÿ¶Áè¶€ ˆ¶ƒà¶€ AˆAÆ:ABƒîuÖ‹Ç_^ÆAÿ[Ã^3À[ÃÌÌÌÌÌÌ̸èöV‹t$ …öuhh jkjqj"èø,ýÿƒÄ3À^YËÆPŠ@„Éuù+ÂhÑøh PèàTùÿ‹ÈƒÄ ‰L$…Éuh´h jAjqj"è®,ýÿƒÄ3À^YÀ>SUW‹þ‹é„°›ŠG€û:„•ŠGˆD$„À„£¶óVÿˆ! ƒÄ…Àt Vÿ„! ƒÄŠØ¶t$Vÿˆ! ƒÄ…Àt Vÿ„! ƒÄëŠD$ŠË€é0€ù wŠÙë ŠË€éa€ùwu€Ã©ŠÈ€é0€ù wˆL$ŠÁë ŠÐ€êa€úwV©‹L$Àã ؈]E€?…Vÿÿÿ‹D$…Àt+é‰(_][‹Á^YÃhœh jpjqj"è½+ýÿ‹D$$PèsUùÿƒÄ_][3À^YËL$Qè^Uùÿh¹h jqjqj"è‰+ýÿƒÄ_][3À^YÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$V‹ÂWpëIŠ@„Éuù‹|$ +Æ‹ðVRWÿ€! ƒÄ …ÀuŠ>„Àt <.t_¸^Ã3À_^ÃÌÌÌÌÌÌÌÌÌ‹D$hPèÑýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸èÖ}D$ PL$ Q‹L$T$ RD$ Ph\1 Qÿ! ƒÄƒøt3ÀƒÄÃS‹\$ûÿw8‹T$úÿw,‹L$ ùÿw ‹D$=ÿwˆˆFˆVˆN¸[ƒÄÃ3À[ƒÄÃÌÌÌÌÌÌÌÌU‹l$V‹ñ3ɃþW‹ú~_^3À]Ã…ötEd$ŠŠÐ€ê0NGÁá€ú w¶Àƒè0ë"ŠÐ€êA€úw¶Àƒè7ëŠÐ€êa€úw½¶ÀƒèW È…öu¿‹Ñ_Áê^ˆUˆM¸]ÃÌÌÌÌÌÌÌÌÌÌ̃|$u3ÀÃS‹\$ UVWS3ÿè&ýÿƒÄ…À~w‹l$WSè$ýÿ‹pŠƒÄ‹Ö„Ét'›€ù:t€ù,t€ù.t ŠJB„ÉuéëB€:t‹ò€>+uƒÉÿFë3É‹@Q‹L$jÿjÿPUVQèýœÿÿƒÄ…ÀtSGè¯ýÿƒÄ;ø|_^]¸[Ã_^]3À[ÃÌÌÌÌÌÌ̸è|‹D$ SUVW3ÛP‰\$è’’üÿ‰D$‹ð‹øŠƒÄk„À„Þ< „“< „‹‹Íƒét3ƒéus<,uoiˆ‹ÏèŽúÿÿ…À„…L$QPSèšóÿÿƒÄ 3Û~ëE<:u‹Ï½Æè]úÿÿ‹Ø…Ûtd~ë'<,u#‹ÏÆèDúÿÿ‹Ø~…ÛtOT$RjSèNóÿÿƒÄ ŠFF„À…eÿÿÿƒýu>‹Ïèúÿÿ…Àu*h<h jmëhFh jljmj"è (ýÿ‹T$(ƒÄRè¿Qùÿ‹D$hÐÅPè°ýÿƒÄ _^]3À[ƒÄÃL$QjPè¦òÿÿ‹T$ ƒÄ Rè‰Qùÿ‹D$ƒÄ_^][ƒÄÃÌÌÌÌÌÌÌÌÌ̃ukƒteƒ?t`ƒ>uhà¦èpÿüÿƒÄ‰…ÀtE‹G‹PQèûýÿƒÄƒøÿu4‹WRèÚüÿƒÄ…ÀtP‹PèªýÿƒÄ…Àu‹Qè+üÿÿƒÄÇ3ÀøÃÌÌÌÌÌÌÌÌÌW‹|$‹Gƒøu3À_ËL$ …Éu#‹Oƒùÿu ÿG‰G¸_Ã;ÈuÛÿG¸_Ãù~,ƒø Ç‹T$€< u½VR48èÖûÿÿƒÄ^…Àt«ƒG¸_ËT$ÇPèGüÿÿƒÄ…ÀtƒG¸_ÃÌÌÌÌ̸èvy‹D$SU3íUUh±P‰l$èŸÿÿ‹ØƒÄ;Ýu]3À[YÃSè¸ýÿƒÄ…À~EVWUSè¸ýÿ‹ð‹QèîQýÿƒÄ =²u‹vƒ>u‹~t$è€þÿÿ…ÀtSEèuýÿƒÄ;è|¿_^SèVA‹D$ ƒÄ][YÃÌÌÌÌÌÌÌÌÌÌ̸èÖxSU‹l$VWjÿj0UÇD$è,—ÿÿ‹ØƒÄ …Û|4ISUèi“ÿÿPè“—ƒÄ ‹øt$èþÿÿ…Àt\Sj0Uèø–ÿÿ‹ØƒÄ …Û}Ï‹l$U3ÛèãÿüÿƒÄ…À~-SUèåÿüÿƒÄƒ8u‹xt$èÁýÿÿ…ÀtUCè¶ÿüÿƒÄ;Ø|Ó‹D$_^][YÃ_^]3À[YÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ èx¡Àç3ĉD$‹D$$V‹ñL$QhðÒjj:PÇD$(ÇD$,ÿÿÿÿÇD$0訉ƒÄ…Àu^‹L$3ÌèðwƒÄ ÃSW‹|$ ƒÿÿuƒ|$„Ë_[3À^‹L$3ÌèÆwƒÄ Ë\$ƒûtã‹D$$ƒøÚu…Û~=_[3À^‹L$3ÌèšwƒÄ Ãøu…ÿt$;ût_[3À^‹L$3ÌèywƒÄ Ã…ÿt›;ût—…ÿ|^WT$RVè´w¸+ÃP >jQè§w‹L$4‹D$8ƒÄ;ÈtK‹Ñ+ÐRT+ñRDPè|wƒÄ _[¸^‹L$3ÌèwƒÄ ËL$ ‹T$‹D$‰‹L$‰V‰F‰N ‹L$(_[^3̸èÝvƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌVW‹|$ jjjUWèΜÿÿƒÄ‹ðVWèò_ÿÿƒÄPè™ýÿÿh`ÚV‹øèLýÿƒÄ‹Ç_^ÃÌÌÌÌS‹\$VWSè“oÿÿjj‹ðjUVèµåÿÿ‹ø‹‹HWQèWýÿÿh`ÚW‹Øè ýÿhp¤VèÿÿüÿƒÄ,_^‹Ã[ÃÌÌÌÌÌÌV‹t$ j:Vÿp! ƒÄV…Àt‹L$ èÑýÿÿƒÄ÷ØÀƒà^Ët$ èü÷ÿÿƒÄ÷ØÀƒà^øèÆu¡Àç3ĉD$V‹t$Wj:Vÿp! ƒÄV…ÀtL$ è{ýÿÿƒÄ…ÀtC¿ët$ è¤÷ÿÿƒÄ…Àt,¿賫þÿ‹ð…ötWD$ PVèqàýÿƒÄ …ÀuV褫þÿƒÄ_3À^‹L$3ÌèmuƒÄËL$_‹Æ^3ÌèZuƒÄÃÌÌÌÌÌÌÌÌÌÌ̸$èu¡Àç3ĉD$ S‹\$,Wj/Sÿp! ‹øƒÄ…ÿu_[‹L$ 3ÌèuƒÄ$ÃVSèk‹üÿ‹ðƒÄ…öt+ÃL$ øVQÆè°þÿÿ‹ØƒÄ…ÛtSGT WRè›þÿÿV‹øèƒKùÿƒÄ …ÿtI;ßuEèÓªþÿ‹ð…öt:ûWD$PVèßýÿƒÄ …Àt‹Æ^_[‹L$ 3Ìè“tƒÄ$ÃVè>KùÿëV親þÿƒÄ‹L$,^_[3Ì3ÀèntƒÄ$ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¡°ÂPè…1ýÿƒÄ…Àuh°ÂPè³.ýÿh Äjè§.ýÿƒÄÃÌÌ̸Ð ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hÐ PQRè¥þÿƒÄÃÌÌÌ‹D$‹L$hÐ PQè\þÿƒÄ ÃÌÌÌÌÌÌÌÌhÐ è~þÿƒÄÃÌÌ‹D$hÐ Pè‘þÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h PQRè—¤þÿƒÄÃÌÌÌ‹D$‹L$h PQèÜŒþÿƒÄ ÃÌÌÌÌÌÌÌÌh è†}þÿƒÄÃÌÌ‹D$h PèþÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ä ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hä PQRè¤þÿƒÄÃÌÌÌ‹D$‹L$hä PQè\ŒþÿƒÄ ÃÌÌÌÌÌÌÌÌhä è}þÿƒÄÃÌÌ‹D$hä Pè‘€þÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h PQRè—£þÿƒÄÃÌÌÌ‹D$‹L$h PQèÜ‹þÿƒÄ ÃÌÌÌÌÌÌÌÌh è†|þÿƒÄÃÌÌ‹D$h Pè€þÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸èöq¡Àç3ĉ„$ ‹Œ$‹„$‰ $‹Sƒù‡ÿ$PÝT$Rh hø è éÿÿƒÄ éÞD$Ph hì è„éÿÿƒÄ éÂL$Qh hÜ èhéÿÿƒÄ 馋@‹HT$RQh èêÿÿƒÄ 鈋@‹HT$RQhØ èüéÿÿƒÄ éj‹@‹HT$RQhÔ èÞéÿÿƒÄ éL‹@hT$RPèSbÿÿL$QT$ RhÌ é‹Hƒ9‹Yu/¶C¶K¶SP¶QRPh\1 L$$hQèÌüÿƒÄé‹Ñƒ:…UVWÆD$3í¶¶KÁà ÁPhÈ T$jRèRÌüÿD$$ƒÄƒÃ‹È›Š@„Òuù|$+Á‹ñOŠOG„Éuø‹ÈÁéó¥‹Èƒáó¤ƒýt|$OŠGG„Àuøf¡ˆ± f‰Eƒý|‰_^]L$QT$Rh¼ èèÿÿƒÄ ëCD$Ph° h¼ èéçÿÿƒÄ ë*‹HQT$hRè1×ýÿD$PL$ Qh  è½çÿÿƒÄ‹Œ$‹D$[3ÌèâoÄÃ<ÛÛ®ÛXÛêÛtÛÌÛÜ ÝÌÌÌÌÌÌÌÌÌÌÌÌW‹|$ ‹ƒø‡±Vÿ$…Hß‹D$ h¤ Pè ËüÿƒÄ^¸_ËL$ hŒ QèïÊüÿƒÄ^¸_ËT$ hp RèÕÊüÿƒÄ^¸_ËG‹H‹T$ Qhd Rè´ÊüÿƒÄ ^¸_ËG‹H‹T$ Qh\ Rè“ÊüÿƒÄ ^¸_ËG‹H‹T$ QhT RèrÊüÿƒÄ ^¸_Ët$ hH VèXÊüÿ‹Gh‚jPVèÇþÿƒÄ^¸_ËGƒ8‹pu-¶N¶V¶FQ¶R‹T$PQh0 RèÊüÿƒÄ^¸_Ã8uY‹|$ Sh¼ WèïÉüÿƒÄ»¤$¶¶VÁá ÊQh, WèÈÉüÿƒÄ ƒÆƒëuÝh2 WèÒ‡üÿƒÄ[^¸_ËD$ h Pè—ÉüÿƒÄ^¸_Ët$ h  Vè}Éüÿ‹OQVè3ÕýÿƒÄ^¸_ØÝæÝÞ²ÝIÞÌÝ(ÞtÞ$ßÌÌÌÌV‹ñW…ö„ƒ>t{‹F…À„²jÿjUPèÚ’ÿÿƒÄ …À|_P‹FPè)“ÿÿƒÄ…ÀtsPè<Üÿÿ‹ðƒÄ…ötdV3ÿè«ôüÿƒÄ…À~'d$WVè©ôüÿPSè’óüÿƒÄ…ÀtVGè„ôüÿƒÄ;ø|ÝVèGôüÿƒÄ_¸^Ãh!h¼ jAj{j"èýÿƒÄ_3À^Ãhh¼ j~j{j"èêýÿƒÄ_3À^Ãhh¼ jj{j"èÍýÿƒÄ_3À^ÃÌÌÌÌÌ‹D$SUVW3Û3ÿ…À„Úƒ8u _^]¸[ËH…Éu 9X „»…Ét QèÓUÿÿƒÄ‹èë‹@ ‹‹ijÿj0U躊ÿÿ‹ðƒÄ …ö|ºVUèù†ÿÿPè#‹Pè ôþÿƒÄƒ|$‹Øt VUè‡ÿÿƒÄN…ÛtRè]ùÿÿ‹ø…ÿtG‹T$W‰_R3ÛÇèaòüÿƒÄ…ÀtVj0U3ÿèOŠÿÿ‹ðƒÄ …ö}–_^]C[Ãhuh¼ jAëhnh¼ jAë h[h¼ j}jzj"è½ýÿƒÄWèôøÿÿSè®ïþÿƒÄ_^]3À[ÃÌÌÌÌU‹l$Vj;Uÿp! ‹ðƒÄ…öu^3À]Ãè®÷ÿÿ‰C…Àtï‹@Pè¾§þÿ‹L$QVRèÐÞþÿ‹K‰A‹SƒÄ ƒztÆWh&+õFh¼ PèH@ùÿV‹øUWÿ! jWÆ>èAIýÿ‹KW‰èÖAùÿ‹SƒÄ$3À9_^•À]ÃÌÌÌÌÌVW‹ùè-þÿ‹ð…ötC‹D$WPèÎÿÿƒÄ…Àu6h:h¼ h–hj"èÄýÿWhØ jè·ýÿVèÑ,þÿƒÄ$_3À^ÃhPVè­íÿÿ‹øƒÄ …ÿu Vè®,þÿƒÄ‹L$ ‹Ç_‰q^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$ VWS3öè±ñüÿ‹|$ƒÄ…À~&U‹l$VSè©ñüÿWPUè!øÿÿS‹øFèˆñüÿƒÄ;ð|á]…ÿu_^[é´òüÿ‹Ç_^[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$V‹pW‹x…öuh°h¼ j|juj"èëýÿƒÄ_3À^ÃSU‹l$…ítn‹Ýh Wè\ëÿÿƒÄ…À…€xjègíþÿƒÄ‰C…Àt%‹ÎiŠA„Òuù+ÍQVPèGìþÿƒÄ …À…Ç‹l$hh¼ jAjuj"èsýÿƒÄéÇè–öÿÿ‹Ø…Ûu‰h»h¼ jAjuj"èKýÿƒÄ][_3À^ÃhÔ WèÆêÿÿƒÄ…ÀuxéiÿÿÿhØ Wè¬êÿÿƒÄ…ÀuxéOÿÿÿhü Wè’êÿÿƒÄ…Àu?PVèGýÿƒÄ…Àu hÔh¼ jwjuj"èØýÿVhè é‰C¿]‰;‹Ã[_^Ãhø WèAêÿÿƒÄ…ÀuKV9D$(tè^óÿÿëè§òÿÿƒÄ‰C…Àu hãh¼ jvjuj"èxýÿVhè é¿¿]‰;‹Ã[_^Ãhð WèäéÿÿƒÄ…Àu8x‹D$PS‹Îè=ýÿÿƒÄ…À…mÿÿÿhîh¼ h•juj"èýÿƒÄëqhä WèšéÿÿƒÄ…Àu:‹L$QVèXüÿÿƒÄ…Àuhöh¼ h“juj"èÙýÿƒÄë03ÿ]‰;‹Ã[_^Ãhýh¼ jujuj"è´ýÿWh€’ jè§ýÿƒÄ …íu SèÚôÿÿƒÄ][_3À^ËD$ ‹L$‹T$jPQRjèhýÿÿƒÄÃÌÌÌ̸èFgVèðïüÿ‹ð‰t$…öu hôh¼ jAh™j"è>ýÿƒÄ3À^YÃS‹\$UWS3ÿèwîüÿƒÄ…Àާ‹l$WSèqîüÿ‹ð‹Fh· Pè‘èÿÿƒÄ…ÀuJ‹F…ÀtC¹ Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu‹\$‹Íè ùÿÿ…ÀtI‹\$ ë%‹L$jVUQjèüÿÿƒÄ…Àt,‹T$PRèÞìüÿƒÄSGèÔíüÿƒÄ;øŒaÿÿÿ‹t$_][‹Æ^YËD$h`ÚPèðüÿƒÄ_][3À^YÃÌÌÌUèÚîüÿ‹è…íuh5h¼ jAhšj"è,ýÿƒÄ3À]ËD$SVWP3ÛèfíüÿƒÄ…ÀŽ‹|$¤$‹L$SQèUíüÿ‹ð‹Vh RèuçÿÿƒÄ…Àu:‹F…Àt3¹ ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuPëO‹Fh Pè&çÿÿƒÄ…Àu]‹F…ÀtV¹ IŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu%jUWèŽøÿÿƒÄ …Àu6h`ÚUèüîüÿƒÄ_^[3À]ËL$jVWQjèûÿÿƒÄ…ÀtÔPUèdëüÿƒÄ‹T$RCèVìüÿƒÄ;ØŒûþÿÿ_^[‹Å]ÃÌÌÌ̸èÆdSèpíüÿ‹Ø‰\$…Ûuhh¼ jAjvj"èÁýÿƒÄ3À[YÃUVW‹|$ W3öèúëüÿƒÄ…À~?‹\$‹l$VWèôëüÿjPSUjèxúÿÿƒÄ…Àt%P‹D$PèÆêüÿWFè¿ëüÿƒÄ ;ð|Í‹\$_^]‹Ã[YËL$h`ÚQè îüÿƒÄ_^]3À[YÃÌÌ‹D$‹‰L$‹P‰T$éjãÿÿÌÌÌÌÌÌÌÌÌ̸èöcVjè¾çþÿ‹ðƒÄ…öujVhH jAjpj"èóýÿƒÄ3À^YËL$D$PQè¼ãÿÿƒÄ‰F…ÀuVèÌçþÿƒÄ3À^YËT$‰‹Æ^YÃÌÌÌÌÌÌÌÌ̸Hè†c¡Àç3ĉD$DV‹t$TW‹|$\¹d ‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àt ‹D$TWVPè5ÿÿÿƒÄ _^‹L$D3ÌèPcƒÄHÃjèêæþÿ‹øƒÄ…ÿu(jphH jAjsj"èýÿƒÄ_3À^‹L$D3ÌècƒÄHÃ…ö„Œƒ>„£‹F …Àu 9Ftw…Àt‹‹Që‹F‹‹Q‹r…öuh€ëXjèuýÿ‹PD$P‹FL$QRPè½Nýÿ‹L$ QT$(RWèMåþÿƒÄ$…Àuh‡hH jAë‹Ç_^‹L$D3Ìè„bƒÄHÃjwhH jrjsj"ècýÿƒÄWèZæþÿƒÄ3À‹L$L_^3ÌèSbƒÄHÃÌÌÌÌVW‹|$‹…Àt'‹‹PQRèháÿÿ‹ðD$PVh¬¸ èæÙÿÿVèÐ8ùÿƒÄ‹G…Àt‹L$QPjè‰÷ÿÿƒÄ ‰D$‹G…Àt'‹‹@RPèáÿÿL$Q‹ðVh¤ èÙÿÿVè‡8ùÿƒÄ‹D$_^ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸è†a‹D$ SUV3íWPÆD$2Û‰l$‰l$‰l$$‰l$ èÏèüÿƒÄ…ÀŽd$‹L$0UQèÅèüÿ‹ø‹wƒÄ¹¬¸ ‹Æ›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuG‹GÆD$…À„¤¹È ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀutÆD$ëm¹· ‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À…¹‹G³…Àt0¹È Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu³‹T$0REè¸çüÿƒÄ;èŒíþÿÿ3í‹D$,;Å„‹p;õ„t€|$t|jÿjRV胅ÿÿƒÄ ;Å|PVèÕ…ÿÿƒÄ;Åt PèèÎÿÿƒÄ‰D$€|$uI9l$uCh¦h¬ j{é@hh¬ jxjwj"èÞ ýÿ‹GPh€’ jèÎýÿƒÄ _^]3À[ƒÄÄÛt9l$t€ûu;Vè|nýÿPèæ!þÿ‹øV‰|$$èÚýÿPèTçþÿƒÄ‰D$;ýt;Åuh±h¬ jzëpè2/‹ð;õtq9l$t5èñçüÿ‹Ø‰\$ ;ÝtDè‚ìÿÿ‹ø…ÿt9WSè•åüÿƒÄ…Àt+‹L$ljO‹D$‹T$ ‹L$_‰F‰V‰‹Æ^][ƒÄÃh¾h¬ jAjwj"èþ ýÿƒÄ‹T$Rè!þÿ‹D$ Pèçâþÿ‹L$QèÝâþÿƒÄ _^]3À[ƒÄÃ8u _^][ƒÄé.h™h¬ jyjwj"èª ýÿƒÄ_^]3À[ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸D ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hD PQRè‡þÿƒÄÃÌÌÌ‹D$‹L$hD PQèÌwþÿƒÄ ÃÌÌÌÌÌÌÌÌhD èvhþÿƒÄÃÌÌ‹D$hD PèlþÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$V‹t$Whß1 Ph0Æ Vè…¹üÿ‹|$ ƒÄƒ?t/j hl VèÌvüÿ‹QVès<þÿƒÄƒt0jhÔ° Vè­vüÿƒÄ ƒtj h` Vè—vüÿ‹WRVè=<þÿƒÄ_¸^ÃÌÌ‹D$ ‹L$PQè‘×ÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$ Vèµêýÿ‹T$ ‹J4ƒÄƒytëI;tƒÁ ƒyuóVRèŒÖÿÿƒÄ^ËAPèžsüÿƒÄ^ÃÌÌÌÌÌÌÌÌ̸ì ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hì PQRèŽþÿƒÄÃÌÌÌ‹D$‹L$hì PQè\vþÿƒÄ ÃÌÌÌÌÌÌÌÌhì ègþÿƒÄÃÌÌ‹D$hì Pè‘jþÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸0 ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h0 PQRè—þÿƒÄÃÌÌÌ‹D$‹L$h0 PQèÜuþÿƒÄ ÃÌÌÌÌÌÌÌÌh0 è†fþÿƒÄÃÌÌ‹D$h0 PèjþÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌU‹l$ ‹EVPèQØýÿ‹L$‹T$P@Phß1 Qhd Rè…·üÿ‹EP3öè:ãüÿƒÄ …À~\SW‹MVQè6ãüÿ‹ø‹RjèzÕÿÿ‹L$,‹Ø‹D$0Shß1 PhL Qè>·üÿSèh2ùÿ‹W‹D$DRPèj9þÿ‹MQFèàâüÿƒÄ4;ð|©_[^¸]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$‹CUVWP3öè­âüÿƒÄ…À~3‹l$‹ÿ‹KVQè¦âüÿ‹ø‹URèkßþÿƒÄ…Àt‹CPFèzâüÿƒÄ;ð|Ó_^]3À[ËG_^][ÃÌÌÌÌSU‹l$ 3Û…í„^9\$„T‹D$…À„HW‹|$ƒÿÿuPŠ@„Éuù+‹øƒÿ@~!hÂh| h„j~j"èµýÿƒÄ_]3À[ÃV‹u…öu/h0 èÚdþÿ‹ðƒÄ…ö„Ÿ‹jPèÓÕýÿƒÄ…À„Љu‹L$QVèúþÿÿƒÄ…Àt"hËh| h…j~j"èKýÿƒÄ^_]3À[Ãhì èwdþÿ‹ØƒÄ…Ût@ƒÿÿu‹D$P‹ÿŠ@„Éuù+‹ø‹T$‹CWRPè¶ÜþÿƒÄ …Àt‹NSQèEàüÿƒÄ…Àu@u\FVUè-®ÿÿ‹øƒÄ…ÿ„»‹T$RWUèÔûÿÿWU‹ðè{®ÿÿƒÄ…öuQ‹|$hÐÅWè…Ôüÿ‹L$ höQèvÔüÿƒÄ_][3À^ƒÄÃjVèÁ(ýÿ‹øƒÄ…ÿ„£hä èÊTþÿ‹ðƒÄ‰>‹D$VPèÈÐüÿƒÄ…À„Š‹|$‹t$FW‰t$èªÑüÿƒÄ;ðŒâþÿÿhÐÅWèÔüÿ‹D$ ƒÄ_][^ƒÄÃh§h, h‡h‚j"è÷üÿ‹K‹S‹QhH Rh@ Ph4 jèùøüÿƒÄ0éÿÿÿh±h, jnë½VèMóÿÿhºh, jAh‚j"èÅöüÿƒÄééþÿÿh›h, h†h‚j"è¢öüÿ‹K‹S‹QhH Rh@ Ph4 jèøüÿƒÄ0é©þÿÿÌÌÌÌÌÌÌÌÌS‹\$ WS3ÿè²ÐüÿƒÄ…ÀŽ˜V›WSè©Ðüÿ‹ð‹ƒÄ…Àt2ƒ8u‹L$‹PQRjè¹Þÿÿ‰D$$ëD$Phì hÜ èßÀÿÿƒÄ ƒ~tL$Qhì h èÂÀÿÿƒÄ ƒ~tT$Rhì h„ è¥ÀÿÿƒÄ SGèÐüÿƒÄ;øŒpÿÿÿ^‹D$_[ÃÌÌÌÌÌÌÌ̸8 ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h8 PQRè§yþÿƒÄÃÌÌÌ‹D$‹L$h8 PQèìaþÿƒÄ ÃÌÌÌÌÌÌÌÌh8 è–RþÿƒÄÃÌÌ‹D$h8 Pè!VþÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h PQRè'yþÿƒÄÃÌÌÌ‹D$‹L$h PQèlaþÿƒÄ ÃÌÌÌÌÌÌÌÌh èRþÿƒÄÃÌÌ‹D$h Pè¡UþÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸À ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hÀ PQRè§xþÿƒÄÃÌÌÌ‹D$‹L$hÀ PQèì`þÿƒÄ ÃÌÌÌÌÌÌÌÌhÀ è–QþÿƒÄÃÌÌ‹D$hÀ Pè!UþÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸èGSUVW3í3ÿè©Ïüÿ‰D$…À„Ï‹D$ P3ÛèQÎüÿƒÄ…ÀŽ ›‹L$ SQèEÎüÿ‹T$$P‹D$$RPèEßÿÿ‹øƒÄ…ÿ„¥èsÔÿÿ‹è…ítWUèÍüÿƒÄ…Àtqh 3ÿèãPþÿ‹ðƒÄ…öt\‹L$VQèßÌüÿƒÄ…Àt¶€0ÿ$… ƒN0ë*ƒN0ë$ƒN0ë n0ëƒN0ëƒN0 ë ƒN0@ëN0€WCèMÇüÿƒÄ;Ø|˜hеWè«ÉüÿƒÄ3ÛSSjGVèüeÿÿƒÄ;Ãt9~ ‹H¶‰V4ë‰^4 n(PèjuþÿƒÄSSjRVèÍeÿÿSSjZV‰F8èÀeÿÿV‰F<èÇdÿÿƒÄ$…À~mSVè9eÿÿ‹øWè‘bÿÿƒÄ …Àt6WètbÿÿPèýÿƒÄ‰D$ …Àt9hð jj D$hÈPèKýÿƒÄ…ÀtVCèmdÿÿƒÄ;Ø|¦N(_][YÃN(N(_][YÃIì ò þ ø      ÌÌÌÌÌÌÌ‹F(‹ÈƒátöF,t8¨t ¶ÀÁèƒàËЃâ`€ú`u¸Ã…Ét¸èt öF4t¸Ã3ÀÃÌÌÌÌÌV‹t$÷F(u.hàhä jj è/ùÿèÊûÿÿhâhä jj èùÿƒÄ ‹F(‹ÈƒátöF,t<¨t ¶ÀÁèƒà^ËЃâ`€ú`u¸^Ã…Ét¸^èt öF4t¸^Ã3À^ÃÌÌÌÌ‹F(‹ÈƒátöF,t>¨t ¨t6¸ËЃâ`€ú`u¸Ã…Ét¸èt‹N4öÁt ¸öÁu3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$ ‹F(¨t öF0u3À^Ã|$tè~ÿÿÿ^ñ€¨t„N,tã¨t„N4tÚ¸^ÃÌV‹t$ ‹F(¨t öF0u3À^Ã|$tè>ÿÿÿ^ètöF4@tä¨töF, tÚ¸^ÃÌV‹t$ ‹F(¨töF0t-ƒ|$tèÿÿÿ^ètöF4@tƒàtöF, t …Àt öF, u3À^ø^ÃÌÌÌÌÌÌV‹t$ ‹N(öÁtöF0tBƒ|$tèÑýÿÿ…Àt2ƒøu/öF4ë%öÁt‹F4¨ u „Ày¸ë¸öÁtöF,Àu3À^ÃÌÌÌÌÌÌÌV‹t$ ‹N(öÁtöF0tBƒ|$tèqýÿÿ…Àt2ƒøu/öF4ë%öÁt‹F4¨ u „Ày¸ë¸öÁtöF, u3À^ÃÌÌÌÌÌÌ̃|$ tV‹t$ èýÿÿ‹Èƒè÷ØÀ#Á^ËD$±„H(t„H,u3ÀøÃÌÌÌÌÌÌÌÌ̃|$ t V‹t$ èßüÿÿ^øÃÌÌÌÌÌÌÌS‹\$ USèÔIýÿ‹l$ƒÄPUèF$ÿÿƒÄPè 'ÿÿƒÄ…Àt]¸[ÃVW‹õèÕøÿÿ‹óèÎøÿÿ‹C<…À„€ƒ8t!‹M8…Ét‹QP螸ýÿƒÄ…Àt _^]¸[ËK<‹A…ÀtPUèÌxýÿƒÄPè³±ýÿƒÄ…Àus‹S<‹z…ÿt/W3öèºÁüÿƒÄ…À~ IVWè¹ÁüÿƒÄƒ8t-WFèšÁüÿƒÄ;ð|ã÷C(t;öE(tKöE,€uE_^]¸'[Ëp…ötÚUèçHýÿPVè0&ÿÿƒÄ …ÀtÆ_^]¸[ÃöE(töE,u _^]¸ [Ã_^]3À[ÃÌÌV‹t$÷F(u(jphä jj è"ùÿè½÷ÿÿjrhä jj è ùÿƒÄ ‹D$ ƒøÿu¸^ÃPè¤ôÿÿƒÄƒøÿu À^Ã…À}‹L$Q3À‹P VPÿÒƒÄ ^Ãø}% Å+È‹,Ç Ç‹L$QVPÿÒƒÄ ^˸ ƒÀøPRè—Àüÿ‹L$‹P ƒÄQVPÿÒƒÄ ^ÃÌÌ̸èö8V‹t$(FÿƒøwFÿë#¡¸ ‰t$…ÀtL$QPèlÂüÿƒÄƒøÿtƒÀƒøÿu"j~hä h’hj"èÄåüÿƒÄ3À^ƒÄËT$$‰2¸^ƒÄÃÌÌÌÌÌÌÌÌÌÌ¸Ø ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hØ PQRè—iþÿƒÄÃÌÌÌ‹D$‹L$hØ PQèÜQþÿƒÄ ÃÌÌÌÌÌÌÌÌhØ è†BþÿƒÄÃÌÌ‹D$hØ PèFþÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸! ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h! PQRèiþÿƒÄÃÌÌÌ‹D$‹L$h! PQè\QþÿƒÄ ÃÌÌÌÌÌÌÌÌh! èBþÿƒÄÃÌÌ‹D$h! Pè‘EþÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸`èv7¡Àç3ĉD$\‹D$dSUV‹t$tW‹|$|V‰D$‰t$3í軾üÿƒÄ…À(…ÿ…èç¿üÿ_^][‹L$\3ÌèS7ƒÄ`Ãd$‹t$UV蕾üÿ‹T$ ‹ð‹NWQRèÅÿÿƒÄ‰D$…Àt½UPèr¾üÿ‹Ø‹PL$(jPQè1žýÿD$0ƒÄP¤$Š@„Éuù+‹ЋCpŠ@„Éuù+Æjv|h(! WèÕ ùÿ‹ðƒÄ …ötNWT$ RVè LüÿWh$! VèTLüÿ‹CWPVèILüÿ‹KQèP ùÿ‹T$h$! Vè|JüÿƒÄ…À~,‹CPVèÁÿÿƒÄ…À~‹MQGèú·üÿƒÄ;ø|”_^]¸[Ã_^]3À[ÃÌ̸p# ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hp# PQRè‡aþÿƒÄÃÌÌÌ‹D$‹L$hp# PQèÌIþÿƒÄ ÃÌÌÌÌÌÌÌÌhp# èv:þÿƒÄÃÌÌ‹D$hp# Pè>þÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸4$ ÃÌÌÌÌÌÌÌÌÌ̸d$ ÃÌÌÌÌÌÌÌÌÌÌh4$ è&:þÿƒÄÃÌÌ‹D$h4$ Pè±=þÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸¨è–/¡Àç3ĉ„$¤‹„$´S‹œ$´VS‰D$ 3öèܶüÿƒÄ…À~SWd$VSèÙ¶üÿ‹ø‹QT$ljPR蘖ýÿ‹GPL$(jPQ舖ýÿT$,RD$4PŒ$ˆQè§ÿÿSF芶üÿƒÄ0;ð|³_‹Œ$¬‹D$^[3Ìè)/ĨÃÌÌÌÌÌÌ̸èæ.è‘·üÿ‰$…Àujzh€$ jAh‘j"èåÛüÿƒÄ3ÀYËD$SUVWP3Ûè¶üÿƒÄ…ÀŽ}I‹L$ SQè¶üÿ‹ðƒÄƒ~„Ú‹F…À„ÏjPè³ ýÿ‹VjR‹øè¦ ýÿƒÄ‹è…ÿts…ítoh4$ è¯8þÿƒÄ…Àt,P‰8‰h‹D$P訴üÿ‹L$(QCèµüÿƒÄ ;Ø|†‹D$_^][YËT$h@Rèí·üÿh‘h€$ jAh‘j"èÛüÿƒÄ_^]3À[YËD$h@Pè»·üÿhŠh€$ jnh‘j"èãÚüÿ‹N‹V‹QhH Rh@ Pë<‹L$h@Qè}·üÿh‚h€$ jnh‘j"è¥Úüÿ‹V‹F‹RhH Ph@ Qh4 jè„ÜüÿƒÄ8_^]3À[YÃÌÌÌÌÌÌÌÌ̸@% ÃÌÌÌÌÌÌÌÌÌÌh@% è–7þÿƒÄÃÌÌ‹D$h@% Pè!;þÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$ ‹D$PQht% è9¨ÿÿ‹FT$RPh\% è&¨ÿÿ‹D$(ƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸èÆ,Vh@% è7þÿ‹ðƒÄ‰t$…öujmhŒ% jAh’j"è¹ÙüÿƒÄ3À^YÃSU‹l$WU3Ûèò³üÿƒÄ…ÀŽ«¤$SUèé³üÿ‹ø‹wƒÄ¹È$ ‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu‹D$Pë;¹°$ ‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuS‹L$ƒÁQWèiªÿÿƒÄ…ÀtwUCèK³üÿƒÄ;ØŒ`ÿÿÿ‹t$ƒ~uuƒ>upjhŒ% h—h’j"èÉØüÿƒÄë=jyhŒ% jjh’j"è¯Øüÿ‹W‹G‹RhH Ph@ Qh4 jèŽÚüÿƒÄ0‹t$h@% Vè\9þÿƒÄ_][3À^YÃ_][‹Æ^YÃÌÌÌÌÌÌÌÌ̸x& ÃÌÌÌÌÌÌÌÌÌ̸¼& ÃÌÌÌÌÌÌÌÌÌÌhx& èv5þÿƒÄÃÌÌ‹D$hx& Pè9þÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌh¼& èF5þÿƒÄÃÌÌ‹D$h¼& PèÑ8þÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸è¶*SUVWh¼& 3Ûè5þÿ‹øƒÄ‰|$…ÿ„þ‹D$,P3íèù±üÿƒÄ…ÀŽÙ‹L$,UQèó±üÿ‹ð‹Vj h' Rÿ€! ƒÄ…Àu‹F€x tƒÀ ë/‹Fjhô& Pÿ€! ƒÄ …À…µ‹F€x„¨ƒÇƒÀ ‰D$‹Nhx& ‰L$ èg4þÿ‹L$(j‹Ø‹D$0T$R‹PQRèü¿ÿÿƒÄ…À„‡ƒ?u 臲üÿ‰…Àt6‹SPè8°üÿƒÄ…Àt&‹L$,Q3ÛEè$±üÿ‹|$ƒÄ;èŒ'ÿÿÿ‹Ç_^][ƒÄË|$h‘hØ& jAh“j"èŸÖüÿƒÄë$h€hØ& hh“j"èÖüÿƒÄë‹|$…ÿth¼& WèG7þÿƒÄ…Ûthx& Sè57þÿƒÄ_^]3À[ƒÄÃÌÌÌÌÌÌÌÌ‹D$V‹pW‹8h$' SèÚBüÿƒÄƒÿu;¶F¶N¶VP¶FQ¶NR¶VP¶FQ¶RPQh ' S耄üÿƒÄ(Gù_^Ãÿ uM3ÿ¶¶FÁâ ÐRhÈ SèX„üÿƒÄ ƒÆƒÿuh± ë ƒÿthˆ± SèVBüÿƒÄGƒÿ|½_¸^Ãh Sè„üÿƒÄ_¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èF(SU‹l$VWU‹ù‹Ú褯üÿƒÄ…À~‹D$Phß1 Whü SèǃüÿƒÄU3öè|¯üÿƒÄ…À~gƒÇ‰|$VUèw¯üÿ‹L$hß1 Qh0Æ S‹øèƒüÿ‹ƒÄƒ8u‹PRè­þÿÿƒÄë PSèA¸ÿÿƒÄVUè7¯üÿh2 Sè|AüÿUFè¯üÿƒÄ;ð| _^]¸[YÃÌÌÌS‹\$V‹t$‹W‹|$h4' P‹Ï‹Óè ÿÿÿ‹Nh(' Q‹Ï‹ÓèÿÿÿƒÄ_^¸[ÃÌ̸Ð' ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hÐ' PQRègXþÿƒÄÃÌÌÌ‹D$‹L$hÐ' PQè¬@þÿƒÄ ÃÌÌÌÌÌÌÌÌhÐ' èV1þÿƒÄÃÌÌ‹D$hÐ' Pèá4þÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸( ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h( PQRèçWþÿƒÄÃÌÌÌ‹D$‹L$h( PQè,@þÿƒÄ ÃÌÌÌÌÌÌÌÌh( èÖ0þÿƒÄÃÌÌ‹D$h( Pèa4þÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$V‹t$Whß1 Sh ( Vèäüÿ‹|$$‹ƒÄ…Àt PVèpdþÿë h”( VèÃüÿƒÄh2 VèÕ?üÿhß1 Sh|( Vè¤üÿ‹G‹QVèXýÿh2 Vè­?üÿ‹W‹BƒÄ(…Àt‹@…ÀtPhß1 Shh( VègüÿƒÄ_^¸[ÃÌÌÌÌÌÌÌÌÌÌ̸è–%¡Àç3ĉ„$ ‹„$SU‹¬$‹]W‹ù‰D$ ‰l$ÇD$¹ð( ‹ÃŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À… 9tWjUhÔ( h›h–j"è2Òüÿ‹M‹U‹EQhH Rh@ Ph4 jèÔüÿƒÄ0_]3À[‹Œ$ 3Ìè%ÄËMjQèýÿƒÄ‰…À…›j[hÔ( jnh–j"èÆÑüÿ‹U‹E‹MRhH Ph@ Që’¹¨ÿ ‹Ã¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu:‹D$ ƒ8tjdhÔ( hëŽPUè¹¢ÿÿƒÄ…À…jjhÔ( hœékÿÿÿ¹' ‹Ã›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À…Ã3ÿ9>u!èZþÿ‰…ÀujxhÔ( jAéÿÿÿÇD$‹U‹€! jhÌ( RÿÓƒÄ …Àu~‹MD$ PƒÁQè‘£ÿÿ‹ØƒÄ…Û„C‹‹‹L$ ‹@h†hÔ( TRPèùøÿ‹øƒÄ…ÿ„Ñ‹‰y‹T$ RS‹‹HQèÁ#‹‹T$ƒÄ ‹‹H‹Æé–‹EjhÄ( PÿÓ‹MƒÄ …À…"ƒÁhô¨ QèkUüÿ‹èƒÄ…íu2h—hÔ( j h–j"èúÏüÿ‹D$$‹P‹HR‹élë›hD$PUè;üÿ‹ØƒÄ …Û2…€jUè©:üÿƒÄ…ÀuÒ‹l$…ÿ…fhÊhÔ( jAé‹‹‹@h¡hÔ( T RPè øøÿ‹øƒÄ…ÿt/‹‰y‹‹HST$RQèº"‹ƒÄ ‹‹P‹Æéaÿÿÿ…Û}‹h¯hÔ( j h–j"è%Ïüÿ‹D$$‹H‹P‹QhH Rh@ Pé—jh¼( QÿÓƒÄ …ÀuU‹EƒÀPŠ@„Éuù‹+‰D$ ‹‹Ih¸hÔ( DPQèT÷øÿ‹øƒÄ…ÿ„ÿÿÿ‹‰z‹L$ ‹UQƒÂRé5þÿÿhÄhÔ( h˜h–j"è†Îüÿ‹E‹U‹MPhH Qh@ Rh4 jèdÐüÿƒÄ0ƒ|$„Iüÿÿ‹Pè~WþÿƒÄÇé3üÿÿ‹Œ$_][3̸è5!ÄÃÌÌ̸èö ‹D$ SUV3íWP‰l$$‰l$‰l$‰l$趤ÿÿ‹øW‰|$$è:¨üÿƒÄ…ÀŽÛUWè8¨üÿ‹Ø‹CƒÄ…À„XŠ€ù@tƒ{„G€ù@ur‹L$,@PQ¾èуÿÿ‹øƒÄ…ÿ„³3Û‹ÿWèÚ§üÿƒÄ;Ø}'T$RSWè×§üÿƒÄPt$ L$è¦úÿÿ‹ðƒÄC…öuÌ‹D$,WPèñƒÿÿ‹|$$ƒÄ…ö„këL$QSt$ L$èmúÿÿƒÄ…À„‰WEèk§üÿƒÄ;èŒ1ÿÿÿ‹t$…ö…ÕhhÔ( hšh›j"èéÌüÿƒÄéhõhÔ( h‡h›j"èÆÌüÿ‹S‹C‹ RhH Ph@ Qh4 jè¥Îüÿ‹|$LƒÄ0é‹S‹C‹ RhH Ph@ Qh4 jèxÎüÿƒÄé™héhÔ( h™h›j"èUÌüÿ‹S‹C‹ RhH Ph@ Qh4 jè4ÎüÿƒÄ0ëXVèÉ÷üÿ‹\$ƒÄ=›t=™u…ÛthhÔ( hŸëèZøÿÿ‰D$ …ÀuXhhÔ( jAh›j"èÚËüÿƒÄ‹D$…Àt Pèy‡ýÿƒÄ‹D$…ÀtPèhSþÿƒÄÇD$‹D$…Àt$PèÏTþÿƒÄë‹P‰2‹H‰Y‹T$‰ÇD$hÐÅWè6¨üÿ‹D$(ƒÄ_^][ƒÄÃÌÌÌÌÌÌÌV‹t$…öt-‹…Àt P蛃ċF…Àthp4Pèö§üÿƒÄVèíôøÿƒÄ^ÃÌÌÌÌÌÌÌ̸èö‹D$V‹t$‹VL$QR‰D$è{§üÿƒÄƒøÿu3À^ƒÄÃP‹FPèB¥üÿƒÄ^ƒÄÃÌÌÌÌÌÌÌÌÌÌ‹D$‹‹Q‰T$‹D$‹‹Q‰T$éáþüÿÌ‹D$…Àtxu3ÀÃPèÖ™ýÿ‹L$ƒÄ‰¸ÃÌÌÌÌÌÌ̸èV‹D$U‹h@VW3ÿS‰|$è°¤üÿƒÄ…À„·hP/è+¢üÿƒÄ‰E;Ç„ŸS臤üÿƒÄ…À~lWS艤üÿ‹L$ QjP謋ðƒÄ…ötu‹VRèªõüÿƒÄ=êu ƒ}u@‰uë#‹EVPèk¦üÿƒÄƒøÿu)‹MVQè)£üÿƒÄ…Àt+SGè¤üÿƒÄ;ø|”ÇD$ ë‹D$H(ÇD$ ÿÿÿÿVèñƒÄhöSèS¦üÿ‹t$ƒÄ…ö‹Uhp4Rè:¦üÿƒÄÇE_‹Æ^]YÃÌÌÌÌÌÌÌÌ̸ è6UVh‰hü( 3íj‰l$èMñøÿ‹ðƒÄ ;õu^3À]ƒÄ ÃSF Çÿÿÿÿ‰D$UD$P^h‘‰.‰n‰nÇFÿÿÿÿÇÿÿÿÿW‰w@èBÿÿ‹èƒÄ…íu:ƒÎÿ9t$ tj‹\$O(…ít Uè{îÿÿƒÄ…Ût SènPþÿƒÄ¸[^]ƒÄ ËE…Àu 9EtÃ…Àtxt¶PèЗýÿƒÄ‰F‹MQSèÐýÿÿƒÄ…Àt™ƒÎÿjT$RjYWè‡AÿÿƒÄ…Àu9t$ …vÿÿÿ[^¸]ƒÄ ËL$ QW‹Øè½ýÿÿƒÄ‰D$ …ÀŽxÿÿÿjT$RhëWèƒ~t8‹FÇ@ ‹FPhÐMP踉üÿ‹FPhðMP詉üÿ‹NƒÄ^‰L$驈üÿ^ÃÌÌÌÌÌÌ̸XÍÃÌÌÌÌÌÌÌÌÌ̸€ÍÃÌÌÌÌÌÌÌÌÌÌVh„h¸, jènÓøÿ‹ðƒÄ …öt ‹D$‹HVÿуÄ…Àu VèþÔøÿƒÄ3À^ËÆ^ÃÌÌÌ‹D$…ÀuÃÇXÍÇ@XÉÇ@¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$…ÀuÃÇ€ÍÇ@XËÇ@¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$…ÀuÃPèáþÿÿƒÄ¸ÃÌÌÌÌÌÌÌ̸è†ýSV3ÛW‹ñ‰\$è–üÿ‹ø‰|$ ;ûu _^3À[ƒÄËÆPŠ@„Éuù+ÂU@PWèìüÿƒÄ…À„Š‹|$0‹O¶Ð·QöÂ@tWF¾øŠ¶Ð·QöÂu;¾è;ït4ö t ŠFF¶ÐöQu"‹L$‹Q‹L$0ˆŠF‹IF¶Ð·QCöÂtž;Çu—Fë”÷ÂtNF¾Ðжèöiu.¾È;Êu ¾F;ÂuF‹L$‹AŠˆ ŠF‹oF¶ÈCöDMtÒ¾;Â…DÿÿÿFé>ÿÿÿö tjŠFF¶ÐFöQ…Ü=…ÌFV‹ÏÆEèeúÿÿ¶‹Ø‹GƒÄöHu‹È‹ÿ¶VFöQtõN;ót¶öHtN;óuòh|h¸, j ÆFè]Éøÿ‹ðƒÄ ‰t$…ö„tƒ|$u‹T$‰T$‹D$,P›Š@„Éuù+Âhƒ@h¸, PèÉøÿ‰FƒÆƒÄ Ç…À„.‹L$,iŠA„Òuù+ÍAQ‹L$0QPèB üÿ‹T$$VRW‹ËèöÿÿƒÄ…À„‹t$‹L$‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àt-VWèðÿÿƒÄ…Àu#VWèqóÿÿƒÄ…Àuh–h¸, jgé«‹D$ ‹L$QPWèÙðÿÿƒÄ …À„„‹\$0ÇD$‹D$“RPè¡üÿƒÄ…À…[üÿÿhh¸, jëZ‹L$Qè>üÿƒÄ…ít Uè±ÉøÿƒÄ_^]¸[‹L$@3ÌèåòƒÄDÃhnh¸, jeëhë hˆëh¤h¸, jAjyj襟üÿƒÄ‹T$RèØüÿ‹D$ƒÄ…Àt PèGÉøÿƒÄ‹D$4…Àt‹L$$‰‹T$$Rh4° D$Hj PèNüÿL$PQhè, jèO¡üÿ‹GƒÄ9D$8t…ÀtPèYìÿÿƒÄÇG‹t$…öt)‹F…Àt PèÚÈøÿƒÄ‹F…Àt PèÊÈøÿƒÄVèÁÈøÿƒÄ‹L$P_^][3Ì3ÀèøñƒÄDÃÌÌÌÌÌÌÌÌÌ‹D$VhÜ6 Pè $üÿ‹ðƒÄ…öuIè¦üÿ%ÿ=€uhÅh¸, jrjxj衞üÿƒÄ3À^ÃhÇh¸, jjxjè…žüÿƒÄ3À^ËL$‹T$WQVRè½ùÿÿV‹øèµüÿƒÄ‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌÌ̃=À uèÒyüÿ£À …ÀuÃVh+hð, jè6Æøÿ‹ðƒÄ …ötE‹L$ ‹D$Q‰è}üÿ‹ À ‹T$‰F‹D$VQ‰V‰F ÇFè8wüÿƒÄ …Àu Vè›ÇøÿƒÄ3À^ËÆ^ÃSU‹l$ VWj.UÿŒ! ƒÄ…Àt+Åë‹ÅPŠ@„Éuù+‹ءÀ P3ÿèçwüÿƒÄ…À~5‹ À WQèãwüÿ‹ð‹VSURÿ€! ƒÄ…Àt¡À PGè²wüÿƒÄ;ø|Ë_^]3À[Ã_‹Æ^][ÃÌÌÌÌÌÌÌÌÌÌÌÌÌSUVWhchð, j‹Ù¿3íè2Åøÿ‹ðƒÄ …ö„Œ‹D$P‰èyüÿ‹L$Q‰FèlüÿƒÄ‰F‰n9ntv…Àtr‹C…Àt‹T$RVÿЋøƒÄ½…ÿ~D¡Ä …ÀuèOxüÿ£Ä …Àuh~ëVPèøuüÿƒÄ…Àu^h…hð, jAjsj茜üÿƒÄ‹[ …Ût …ítVÿӃąöt)‹F…Àt Pè'ÆøÿƒÄ‹F…Àt PèÆøÿƒÄVèÆøÿƒÄ_^]ƒÈÿ[ÃÿC‹Ç_^][ÃÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$PQRjèÊýÿÿƒÄ÷ØÀ÷ØÃ‹D$‹@ÃÌÌÌÌÌÌÌÌ‹D$‹@ÃÌÌÌÌÌÌÌÌ‹D$‹L$‰A ÃÌÌÌÌ‹D$‹L$‰AÃÌÌÌÌh- ÿÀ ƒÄ…Àt Pè(üÿƒÄÃèßÔþÿPŠ@„ÉuùVW+Âh1x hð, WèžÃøÿ‹ðƒÄ …öu_^ÃWè¬ÔþÿPVèåüÿWh± VèüÿWh - Vè üÿƒÄ$_‹Æ^ÃÌÌÌÌÌSU‹-|! VW‹|$‹ÿƒ|$tŠ„ÀtI¶ÀPÿՃąÀtŠGG„Àuë‹L$QWÿp! ‹ØƒÄ;ßtR€?tM…Ûtsÿë‹ÇPIŠ@„Éuù+Ât8ÿƒ|$t¶RÿՃąÀt¶FÿNPÿՃąÀuñ‹L$$+÷QFVWë ‹T$$RjjÿT$,ƒÄ …À~…Ût{éTÿÿÿ¸_^][ÃÌÌÌÌÌÌÌÌÌ̸èVí‹D$ SU‹l$VWh m PQÇD$èFäÿÿ‹øƒÄ …ÿuè8›üÿ‹ýjjWjè:1ûÿ‹ðƒÄ…öuFnëFhH- Vè1-ûÿ‹ØƒÄ…Ûu ÇD$pëh8- Vè-ûÿPSUVèªûÿÿƒÄ…Àu9Vè-+ûÿ‹D$ƒÄhhð, PjujèÒ™üÿWh0- Uh(- jè¿›üÿƒÄ(3À_^][YÃÌÌÌÌ¡Ä PèõsüÿƒÄ…À~RV‹ Ä Qèasüÿ‹ð‹‹B ƒÄ…ÀtVÿЃÄ‹ÿH‹FPè/Ãøÿ‹NQè&ÃøÿVè Ãøÿ‹Ä Rè¤süÿƒÄ…À°^¡Ä PèasüÿƒÄÇÄ ÃÌÌ̸èì¡Àç3ĉD$SŠ\$ U‹l$ Vè;ûÿÿƒÄ…ÀuSöÃuWV‹ÍèvþÿÿƒÄ…Àu>öÃu%hÞhð, jqjvjèÕ˜üÿVh(- jèÈšüÿƒÄ ]ƒÈÿ[‹L$3ÌèÀëƒÄÃUWV‹Èègûÿÿ‹èƒÄ …íLöÃuGhëhð, jmjvj脘üÿUhd- D$$j Pè"GüÿL$,QhX- Whˆ’ Vh(- jèUšüÿƒÄ@‹L$‹Å][3ÌèNëƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌWèzþÿÿ¡À Pèorüÿ‹øƒÄƒïx_S‹\$ V‹ À WQèbrüÿ‹ðƒÄƒ~ƒ>u…Ût1‹À WRèápüÿ‹ƒÄ…Àt Pè)ûÿƒÄ‹FPè†ÁøÿVè€ÁøÿƒÄƒïy©^[‹ À QèúqüÿƒÄ_…Àu‹À Rè¶qüÿƒÄÇÀ ÃÌÌÌÌÌÌÌÌèËýÿÿjèDÿÿÿYÃÌÌV‹t$…öt8‹D$ …ÀtPjVèFáÿÿƒÄ …Àu'öD$ thl- jVè+áÿÿƒÄ …Àu è˜üÿ¸^ÃUPVè°àÿÿ‹èƒÄ…íu]^ÃSWU3ÛèZqüÿƒÄ…À~;ë‹t$SUèUqüÿ‹L$$‹xQV‹pè´ýÿÿƒÄ…ÀöD$tUCèqüÿƒÄ;Ø|ȸ_[]^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌSUVW3ÛS3öèRßÿÿ‹l$‹øƒÄ…ÿtZ…íu è¼úÿÿ‹ð…ötOë‹õjVWè©ßÿÿƒÄ …À"öD$t0è¶üÿ%ÿƒøru!èG—üÿ»ë‹D$‹L$PQWèÐþÿÿƒÄ ‹Ø…íu Vèñ¿øÿƒÄWèßÿÿƒÄ_^]‹Ã[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌè+ŠþÿèÆ®éÁáüÿ̃=È ugèâÿÿÿè­œèØ–üÿ‹D$j0Pjè*ÿÿÿƒÄ …ÀCVèÍ«üÿjÿÐ ƒÀ@Pèìüÿ‹ðƒÄ…öth|- Vè8DüÿVèR°üÿVèìÿûÿƒÄjÿ”! ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÇÈ ÃÌÌÌÌ̸èFèSUV3í3öÇD$‰l$ÇD$èFûûÿ‹Ø‰\$$;Ý„.hSè­ûûÿƒÄ…À„WjVhD. j è#½øÿƒÄ ‰D$;Å„õ‹t$4‹ø‰7‰o‰o èpüÿ‰G;Å„×j]<µhD. Wèâ¼øÿ‹L$ƒÄ ‰A;Å„±j_hD. Wèüøÿ‹T$ƒÄ ‰B ;Å„’3À;õ~‹L$‹Q‰,‚‹I ‰,@;Æ|ë‹SƒÇ‰|$$Æ‚ÿ3ÿI…ÿt‹D$PS‰D$ è˜ûûÿƒÄ…À„>‹C‹L$Æ‹S‹D$0+ÏQ×RPèüÿ‹KÿD$(9ƒÄ €8„Ø…ÿu€9#t pŠ@„Òuù+Æø€|9ÿ u‹‹t$$j}ˆT9ÿ >hD. Qèó»øÿƒÄ …À„É‹ÐƉ‹sŠ3ÿo‰|$ „Ét'€ù uƒ|$ tbH3Û€ù\”È@F‰\$ Š„ÉuÝ‹\$(‹L$4Æ;éuW€>uR@‰ªR‹T$‹BPèÇlüÿƒÄ…À…üþÿÿh0. ÿÐ ƒÀ@Pÿ! ƒÄë;Æ@F;l$4}ª‰ªEëžÇD$ë(VUQ‹L$(Qhà- ÿÐ ƒÀ@Pÿ! ƒÄÇD$‹t$_SèDùûÿ‹D$ƒÄ…ÀtcƒøuhÄ- ÿÐ ƒÀ@Pÿ! ƒÄ…öt9‹F…Àt PèëlüÿƒÄ‹F…Àt Pè{¼øÿƒÄ‹F …Àt Pèk¼øÿƒÄVèb¼øÿƒÄ^]3À[ƒÄËÆ^][ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$V‹t$;| ÇF3À^ËN‹…Àu ÇF^ËT$RPèštüÿƒÄÇF^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èåS‹\$V‹t$;| ÇF^3À[YËD$ ‹L$PQè|rüÿƒÄ‰D$…Àu ÇF^[YËVUWRè+lüÿ‹l$$ƒÄ3ÿ‰D$…À~:‹FWPè lüÿƒÄ‹Ø…ít SÿՃąÀtS‹\$SèòrüÿƒÄ…Àu=G;|$|Ê‹\$‹Vƒ<ššt ‹PèŒnüÿƒÄ‹N‹T$‰™‹F _‰,˜]^¸[YËNPQÇFèÍmüÿS‰F‰~èQnüÿƒÄ _]^3À[YÃÌÌÌÌÌ̸èäVW3ÿƒÎÿ‰|$‰t$è÷ûÿ‰D$;Ç„‹t$$‹FSUPèGküÿ‹.ƒÄ;ljD$ ‰|$ŽÊë‹t$,‹L$‹VQRè.küÿƒÄ3ÿ3Ò‹Ø…í~!‹“…Àtp›Š@„Éuù+ÆøB;Õ|à‹L$D}PQèÑ÷ûÿƒÄ…Àtz‹T$‹B3ö…í~,‹ ³…ÉtŠ„Òt€ú uÆ\@¶AˆŠ@„ÒuêÆ F@;õ|Ô‹L$‹T$(Æ@ÿ ‹I+Á‹ðVQRè&üûÿƒÄ ;Æu‹D$t$@;D$ ‰D$Œ8ÿÿÿ‹D$‰D$‹L$QèFöûÿ‹D$ ƒÄ][_^ƒÄÃ_‹Æ^ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$ V‹t$ W3ÿ9>~:‹Fƒ<¸t,‹N ƒ<¹¹t ‹Sÿ҃ąÀt‹F‹ ¸SQèñqüÿƒÄ…Àu!G;>|Æ‹VSRèÛhüÿƒÄ…Àu_ÇF^[É~_‰FÇF^3À[Ã3ÿ9>~6‹Fƒ<¸t(‹N ƒ<¹¹t ‹Sÿ҃ąÀt‹F‹ ¸SQè‚püÿƒÄG;>|Ê_^¸[ÃÌW‹|$…ÿ„ƒVt4‹7ƒîx!ëI‹Gƒ<°°t ‹QèüküÿƒÄƒîyä‹WR蛸øÿƒÄ‹G …Àt P苸øÿƒÄ‹G…À„¨PèiüÿƒÄƒè‰D$ ˆ†SUëI‹D$P‹GPèòhüÿ‹Ø‹‹,ƒƒÄ3ö…íu…À~;‹³…Àt Pè1¸øÿƒÄF;7|ëë$…À~ I‹³;Ãr;Åv …Àt Pè ¸øÿƒÄF;7|ã‹t$‹OVQè•hüÿPèï·øÿƒÄ ƒî‰t$yƒ][‹WRè8hüÿƒÄWèÏ·øÿƒÄ^_ÃÌÌÌÌÌÌÌÌ̸d0 ÃÌÌÌÌÌÌÌÌÌ̸81 ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h81 PQRèçþÿƒÄÃÌÌÌ‹D$‹L$h81 PQè,úýÿƒÄ ÃÌÌÌÌÌÌÌÌh81 èÖêýÿƒÄÃÌÌ‹D$h81 PèaîýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$h81 PQè¼ùýÿƒÄ ÃÌÌÌÌÌÌÌÌ‹D$Ph81 èAfýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸T1 ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hT1 PQRè'þÿƒÄÃÌÌÌ‹D$‹L$hT1 PQèlùýÿƒÄ ÃÌÌÌÌÌÌÌÌhT1 èêýÿƒÄÃÌÌ‹D$hT1 Pè¡íýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̃|$u‹D$‹‹QRèJýÿƒÄ¸Ã̸Œ2 ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hŒ2 PQRè‡þÿƒÄÃÌÌÌ‹D$‹L$hŒ2 PQèÌøýÿƒÄ ÃÌÌÌÌÌÌÌÌhŒ2 èvéýÿƒÄÃÌÌ‹D$hŒ2 PèíýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸Ð2 ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hÐ2 PQRèþÿƒÄÃÌÌÌ‹D$‹L$hÐ2 PQèLøýÿƒÄ ÃÌÌÌÌÌÌÌÌhÐ2 èöèýÿƒÄÃÌÌ‹D$hÐ2 PèìýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸(3 ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h(3 PQRè‡þÿƒÄÃÌÌÌ‹D$‹L$h(3 PQèÌ÷ýÿƒÄ ÃÌÌÌÌÌÌÌÌh(3 èvèýÿƒÄÃÌÌ‹D$h(3 PèìýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̃|$u‹D$‹‹QRèZ¦ýÿƒÄ¸Ã̸\3 ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h\3 PQRèçþÿƒÄÃÌÌÌ‹D$‹L$h\3 PQè,÷ýÿƒÄ ÃÌÌÌÌÌÌÌÌh\3 èÖçýÿƒÄÃÌÌ‹D$h\3 PèaëýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸4 ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h4 PQRègþÿƒÄÃÌÌÌ‹D$‹L$h4 PQè¬öýÿƒÄ ÃÌÌÌÌÌÌÌÌh4 èVçýÿƒÄÃÌÌ‹D$h4 PèáêýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸¬4 ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h¬4 PQRèç þÿƒÄÃÌÌÌ‹D$‹L$h¬4 PQè,öýÿƒÄ ÃÌÌÌÌÌÌÌÌh¬4 èÖæýÿƒÄÃÌÌ‹D$h¬4 PèaêýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ð4 ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hð4 PQRèg þÿƒÄÃÌÌÌ‹D$‹L$hð4 PQè¬õýÿƒÄ ÃÌÌÌÌÌÌÌÌhð4 èVæýÿƒÄÃÌÌ‹D$hð4 PèáéýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ 5 ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h 5 PQRèç þÿƒÄÃÌÌÌ‹D$‹L$h 5 PQè,õýÿƒÄ ÃÌÌÌÌÌÌÌÌh 5 èÖåýÿƒÄÃÌÌ‹D$h 5 PèaéýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸Œ5 ÃÌÌÌÌÌÌÌÌÌ̸¼5 ÃÌÌÌÌÌÌÌÌÌÌV‹t$‹FPèâ³üÿ‹L$ƒÄƒét]ƒétjlhØ5 jnjhj!èˆüÿƒÄ3À^Ãøu!‹F…Àt‹Hƒyt3À‰F ^ø‰F ^ÃjfhØ5 jhjhj!èà‡üÿƒÄ3À^ÃøuGW‹|$‰~ …ÿt6‹V‹B‹HQèY³üÿƒÄƒøu‹V‹B‹HQèÒþÿ‹V‹BƒÄÇ@‹Ç_^ÃjWë™ÌÌÌÌÌÌÌÌÌV‹t$‹FPè³üÿƒÄƒøtEƒøth–hØ5 jpjmj!èP‡üÿƒÄ3À^ËN‹A…Àt Pè©ùÿÿƒÄ‹V‹D$ ‰B¸^ËN‹A…Àt Pè…ùÿÿƒÄ‹V‹D$ ‰B¸^ÃÌV‹t$ Vè­üÿNëƒÄƒù‡bÿ$¸t‹t$‰Fèóùÿÿ‰F…À„\‹jPèUýÿƒÄ…À…(‹NQèÚùÿÿƒÄÇF3À^Ët$j‰Fè>]þÿƒÄ‰Féô‹t$‰Fè×üÿÿ‰F…À„‹jRè²Týÿ‹F‹jQè¥TýÿƒÄ…À„Þjèc¬üÿ‹V‹JƒÄ‰¸^Ët$‰Fèåúÿÿ‰F…À„®‹jRè`TýÿƒÄ…À„™jè¬üÿ‹N‹QƒÄ‰¸^Ët$‰FèÀüÿÿ‰F…Àtm‹jPèTýÿƒÄ…Àt\jèá«üÿ‹N‹QƒÄ‰¸^Ët$‰Fèýÿÿ‰F…Àt0‹jPèâSýÿƒÄ…Àt¸^ÃhÜhØ5 jpjnj!èo…üÿƒÄ3À^ÄsAsïssqt4t‹D$Pèf«üÿ‹L$‹T$‰AƒÄ‰Q¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌUV‹t$ ‹FPè±°üÿƒÄƒèt"ƒèthþhØ5 jqjgj!èï„üÿƒÄ^3À]ËF‹L$‹Q‹p‹h‹SWPèm°üÿV‹Ø3ÿè_üÿƒÄ…À~$WVè_üÿ‹QèM°üÿƒÄ ;ÃtyVGèï^üÿƒÄ;ø|Üèc†ýÿ‹ø…ÿt;èÈþÿ‰G…Àt/S蛪üÿ‹WW‰VÇè¹]üÿƒÄ …Àu5Wè<†ýÿƒÄ_[^3À]ÃWè,†ýÿhhØ5 jAjgj!è7„üÿƒÄ_[^3À]ËD$PUèr]üÿƒÄ_÷Ø[À^÷Ø]ÃÌÌÌÌV‹t$‹FP袯üÿƒÄƒèt!ƒèth5hØ5 jqjdj!èàƒüÿƒÄ3À^ËvƒÆƒ>u'èY_üÿ‰…Àuh=hØ5 jAjdj!讃üÿƒÄ3À^ÃW‹|$h@hØ5 jOjQèŸøÿ‹WRèÒ\üÿƒÄ…ÀuWèÕžýÿƒÄ_3À^Ã_¸^ÃÌÌÌÌÌV‹t$‹FPèò®üÿƒÄƒèt!ƒèthXhØ5 jqjej!è0ƒüÿƒÄ3À^ËvƒÆ ƒ>u'è©^üÿ‰…Àuh`hØ5 jAjej!èþ‚üÿƒÄ3À^ÃW‹|$hdhØ5 jO jQèkžøÿ‹WRè"\üÿƒÄ…ÀuWè…¤ýÿƒÄ_3À^Ã_¸^ÃÌÌÌÌÌSU‹l$‹EVWƒøtt =˜t2Û볋t$‹jPèÕPýÿƒÄ…À„n‹|$Wè@äüÿ‹NPQ膛ýÿƒÄ …À„O‹V‹BPèOYþÿWè‰ýÿPè]þÿ‹N‰A‹VƒÄ ƒz„!h†hØ5 j EjPè¦øÿƒÄ‰n„Ût j@è%¨üÿƒÄë‹T$ Rè–’ÿÿPè¨üÿƒÄ‹N‰‹V‹B…Àt Pè(þÿƒÄèþÿ‹N‰A‹V‹B…À„°Ç‹F‹@…Àt PèöþÿƒÄ‹MQè òüÿƒÄƒøu!P謧üÿ‹VƒÄ‰è¿þÿ‹N‰A‹V‹BëQƒøtu"P膧üÿ‹NƒÄ‰‹V_^]ÇB¸[Ã=˜u7h èY§üÿ‹NƒÄ‰èlþÿ‹V‰B‹F‹@…Àt_^]Ǹ[Ã_^]3À[ÃÌÌÌÌÌVèºôÿÿ‹ð…öt.‹D$‹L$‹T$ PQRVè/þÿÿƒÄ…Àt‹D$VPè­ûÿÿƒÄ…Àu VèôÿÿƒÄ3À^ËÆ^ÃÌÌÌÌÌV‹t$‹FPèB¬üÿƒÄƒøufèÕþÿ‹N‹Q‰B‹F‹HƒyuhÎhØ5 jAj~j!èk€üÿƒÄ3À^ËЋB‹T$ ‹HRÇèìÿÿPèf¦üÿ‹N‹QƒÄ‰¸^ÃhÖhØ5 jqj~j!è€üÿƒÄ¸^ÃÌÌÌÌÌV‹t$‹FP被üÿƒÄƒøu‹N‹A^ËVR艫üÿƒÄƒøu‹F‹@^Ã3À^ÃÌÌÌÌÌV‹t$‹FPèb«üÿƒÄƒèt)ƒèthhØ5 jqjfj!è üÿƒÄ3À^ËN‹Aë‹V‹B‹L$ QPèÐXüÿƒÄ÷ØÀ÷Ø^ÃÌÌÌÌÌV‹t$‹jPè±MýÿƒÄ…Àu^ÃW‹|$Wèáüÿ‹NPQèc˜ýÿƒÄ …ÀtJ‹V‹BPè0VþÿWèjýÿPèäYþÿ‹N‰A‹VƒÄ ƒzt ‹FPèé€ýÿ‹‹Q‹Pè<ýÿƒÄ‰F…Àu_3À^ÃhhØ5 jOjQèfšøÿƒÄ‰~_¸^ÃÌÌÌÌÌÌÌÌV‹t$‹FPèRªüÿƒÄƒøu‹L$ ‹A‹P‹‹NR‹QPRè@ÂþÿƒÄ ^Ã3À^ÃÌÌÌÌÌÌÌV‹t$‹FPèªüÿƒÄƒèt)ƒèth>hØ5 jqjlj!èP~üÿƒÄ3À^ËN‹që‹V‹rW‹|$Wè ýÿƒÄ…Àu hEhØ5 hjlj!è~üÿƒÄ_3À^ÃPè#¤üÿƒÄ‰~ _¸^ÃÌÌÌÌÌVèJðÿÿ‹ð…öt-‹D$ PVèÙöÿÿƒÄ…Àt‹L$VQèGöÿÿƒÄ…Àu Vè*ðÿÿƒÄ3À^ø^ÃÌÌÌÌÌÌÌÌÌÌÌÌVèúòÿÿ‹ð…öt$‹D$ PVèþÿÿƒÄ…Àt‹L$VQè§ýÿÿƒÄ…Àu VèÚòÿÿƒÄ3À^ËÆ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¡¨ÍPè…üÿƒÄ…Àuh¨ÍP賊üÿhÎjè§ŠüÿƒÄÃÌÌÌ‹FPè·¨üÿƒÄƒøu‹FËNQ袨üÿƒÀëƒÄƒøv‹F…Àt ƒ8u‹@Ã3ÀÃÌÌÌÌVèzòüÿPètîûÿ‹ðƒÄ…öujohH; j j}j!è¹|üÿƒÄ3À^ËD$‹QèF¨üÿPèP£üÿPèšÖüÿƒÄ …Àu jvhH; jmë4PjjoVèÝêûÿ‹ƒÄ…Àu ‰7¸^ÃVPè$ìûÿƒÄ…ÀuëjhH; j j}j!èK|üÿƒÄVè’æûÿƒÄ3À^ÃÌÌÌÌÌÌÌÌÌÌ̸XèÏ¡Àç3ĉD$T‹D$`SUVW‹|$l‹O3öQ‰|$,‰D$$‰t$ ‰t$(‰t$3Û3í‰t$‰t$‰t$0耧üÿƒÀêƒÄ‰wƒø‡œÿ$…ƒ‹G‹h‹pëz‹G‹P‹h‹@‹X ‹H‰T$‰L$;Þugh«hH; jtjij!è‰{üÿƒÄ_^]3À[‹L$T3Ìè€ÎƒÄXËG‹P‹@‹X ‹H‰T$‰L$;Þuh¶ë¶‹G‹P‹p‰T$èþÿÿ3ö‰D$,UèUüÿƒÄ…À~*VUèƒUüÿP|$(è9þÿÿƒÄ …ÀteUFè[UüÿƒÄ;ð|Ú‹|$(‹D$…ÀtP|$ èþÿÿƒÄ…Àt:‹|$(…Û„ôèvüüÿPèpìûÿƒÄ‰D$$…ÀuQhÕhH; j jij!è°züÿƒÄ‹D$…Àt PèëûÿƒÄ‹D$$…Àt PènëûÿƒÄ_3ö^]3À[‹L$T3ÌèƒÍƒÄXÃL$QjhPèÂèûÿSèŒRþÿS‰D$Hè«ûÿS‹ðè: ýÿPèd üÿ‹l$0ƒÄ ‰E…ö~T$4VRè»nüÿƒÄ…ÀŽsÿÿÿ‹D$jjjjSPèíÛüÿƒÄ…ÀŽUÿÿÿ‹T$L$DQRèCÀüÿƒÄ…ÀŽ;ÿÿÿ‹T$jD$8PL$LQ3ÛSSRè®ÛüÿƒÄ…ÀŽÿÿÿ;ó~.9]uèõþÿ‰E;Äýþÿÿ‹E‹L$PQè| ýÿƒÄ…ÀŒäþÿÿ‹T$R‰\$èÓSüÿƒÄ…À~U‹D$SPèÑSüÿ‹@ƒÄ…ÀtnPè»þÿ‹ðƒÄ…ö„§þÿÿVèæüÿV‹èèöíüÿƒÄ9l$}‰l$‹L$QCè~SüÿƒÄ;Ø|«‹T$hhH; Rè#¡øÿ‹èƒÄ …íu"hhH; jAé@þÿÿh÷hH; jgé/þÿÿ‹D$PÇD$è&SüÿƒÄ…À~w‹L$‹T$QRè Süÿ‹ø‹GPèeºþÿ‹ðƒÄ …ö„ûýÿÿ‹L$0VQT$LRUè—íüÿV‹Øè?íüÿƒÄ…Û~Z‹G SUPè-NþÿƒÄ …Àtk‹t$‹L$FQ‰t$è³RüÿƒÄ;ð|‹|$(Uè¢øÿ‹T$4RD$LPè£øÿ‹D$(ƒÄ …Àu;‹L$$‰L$ë?hhH; jjij!èxüÿUèÓ¡øÿƒÄé^ýÿÿhhH; jAëÛ‹T$$RPè²çûÿƒÄÇD$$ƒ|$ …ƒ‹GPès£üÿƒÄƒøu#jjjWèoïÿÿƒÄ…ÀtèóûÿPèMéûÿƒÄë‹L$,…Ét‹…À~‹IPQè€îûÿƒÄ‰D$ …Àu,è`îûÿPèéûÿƒÄ‰D$ …À„¾üÿÿjjh‚Pè¼åûÿƒÄ‹T$ ‹t$RVè çûÿ‹L$lƒÄ_‹Æ^][3ÌèAʃÄXÃh¿hH; jpéûÿÿY~¯~d~Ñ~¸,èæÉSU‹l$8‹EV3öWP‰t$‰t$8‰t$‰t$ ‰t$$‰t$(‰t$‰t$03ÿ3Ûèo¢üÿƒÄƒè‰u„ʃè„€ƒèt!hhH; jpjpj!èvüÿƒÄ‰t$é.‹E‹x‹h‹@‹H‹@‹R‰L$4‰D$0è¢üÿPèüÿPèSÐüÿƒÄ ‰D$$;ÆuwhmhH; jojpj!èCvüÿƒÄ‰t$éÔ‹E‹x‹@‹H‹@‰L$,‹ Q‰D$4踡üÿPèœüÿPèüÏüÿƒÄ ‰D$$;Æ…ßhy룋U‹rèËøÿÿ‰D$0‹E‹h…í„«U‰\$,èPüÿƒÄ…ÀŽ–d$‹L$(QUèPüÿ‰D$@èLëüÿPèFçûÿ‹ðƒÄ ‰t$4…ö„”‹T$8‹Pè)¡üÿPè3œüÿPè}ÏüÿƒÄ …À„ŽPjjoVèÇãûÿ‹D$ ƒÄ…Àu‰t$ë VPèåûÿƒÄ‹t$(FU‰\$8‰t$,è‰OüÿƒÄ;ðŒnÿÿÿ‹l$@3ö9t$$„åè¹öüÿPè³æûÿƒÄ‰D$;ÆuAh®ëh‹hH; j jpj!èìtüÿƒÄé#h“hH; jmjpj!èÏtüÿƒÄé9t$Lt~Wè OüÿƒÄ…À~Td$VWè Oüÿ‹L$T‹‹Ø‹B ‹K‹PRè²³þÿƒÄ…Àu‹C‹H‹T$L‹Q‹HQè¥KþÿƒÄ…Àt+WFè·NüÿƒÄ;ð|°hÂhH; jsjpj!èKtüÿƒÄé‚‹T$DRè áüÿ‹ðhÈF hH; Pè4œøÿƒÄ‰D$ …ÀuhËhH; jAjpj!ètüÿƒÄé;ƒ|$L…“W3íè9NüÿƒÄ…À~`‹ÿUWè9Nüÿ‹L$L‹Ø‹C ‹‹@Q‹L$,RPQèéüÿ‹ðƒÄ…ö3è tüÿWEèùMüÿƒÄ;è|ÂhâhH; h’jpj!èŠsüÿƒÄéÁ…Ûu[hâhH; h’jpj!èfsüÿƒÄé‹[ ‹T$D‹ R‹SQRPè™èüÿ‹ðƒÄ…ö!hîhH; jjpj!è+süÿƒÄéb‹l$@‹L$D$P3ÿWhQ‰|$$èdáûÿ‹T$4‹D$$WWWWRPèÑÔüÿƒÄ(…ÀŽ%‹L$,‹Q‹D$RPèäýÿƒÄ…ÀŒ‹L$QèýÿƒÄ;ðt/‹T$VRèm¸üÿƒÄ…ÀuhhH; jdjpj!è‘rüÿƒÄéÈ‹D$ ‹L$WWPWWQèVÔüÿƒÄ…ÀŽª‹T$ VRè0øÿ‹D$ƒÄ;Çu ‹D$‰D$ë‹L$QPèâûÿƒÄ‰|$‹URèÐüÿ‹t$LƒÄƒøujjjUèÈéÿÿƒÄ…Àu…öt‹Æé•‹L$0‹…À~P‹APèâèûÿƒÄ‰D$ë!èÄèûÿPè~ãûÿjjh‚P‰D$0è+àûÿƒÄƒ|$uL‹D$3ö;Æt Pè‘âûÿƒÄ‹D$4;Æt Pè€âûÿƒÄ‹D$;Æt PèoâûÿƒÄ‹D$;Æt Pè^âûÿƒÄ‰t$ë‹D$‹t$PVè&áûÿƒÄ‹D$ …Àt Pè›øÿƒÄ_‹Æ^][ƒÄ,ÃÌÌÌÌÌÌÌÌ‹D$VhPèÀáûÿ‹ðƒÄ…ötH¤$WjjxVèußûÿ‹ƒÄ…ÀtIPè¦ÿÿPè ÿÿƒÄ;ÃtRVèÃáûÿhPèxáûÿ‹ðƒÄ …öu¿hEhH; jljj!èÊpüÿƒÄ3À^ÃhKhH; jDjj!è®püÿƒÄ3À^ËÆ^ÃÌÌÌV‹t$‹FPè2œüÿƒÄƒøt3À^ËF…Àtõ‹p…ötîjVèÐJüÿVèºJüÿ‹L$ƒÄ ;Á~ÕQVè¸Jüÿ‹@ƒÄ^ËD$UPèe–üÿ‹èƒÄ…ítq…ÛtmVWS3öè~JüÿƒÄ…À~.¤$VSèyJüÿ‹ø‹UQè>¤üÿƒÄ…ÀtSFèPJüÿƒÄ;ð|Ù_^3À]Ãuô‹WRè4JüÿƒÄ…Àtä‹GjPè2JüÿƒÄ_^]Ã3À]ÃÌÌÌÌÌÌÌS‹\$j3èdÿÿÿƒÄ[…ÀuË@ÃÌÌÌÌÌÌÌS‹\$‹C W…Àth  PèHLüÿƒÄ‹|$Wè{JüÿƒÄ‰C …Àu_[ÃVW3öèµIüÿƒÄ…À~-VWè·IüÿPèñýÿP‹C VPèÆIüÿƒÄ…ÀtWFèˆIüÿƒÄ;ð|Ó^_¸[Ã^_3À[ÃÌÌS‹\$‹CW…Àth  PèÈKüÿƒÄ‹|$WèûIüÿƒÄ‰C…Àu_[ÃVW3öè5IüÿƒÄ…À~-VWè7IüÿPèqýÿP‹CVPèFIüÿƒÄ…ÀtWFèIüÿƒÄ;ð|Ó^_¸[Ã^_3À[ÃÌÌ‹U‹l$VW…ÀuèJüÿ‰…ÀuB_^3À]ÃP3öèÊHüÿƒÄ…À~-I‹VPèÇHüÿ‹ø‹Qèý™üÿƒÄ ;ÅtH‹RFèHüÿƒÄ;ð|Ö‹D$‹L$PQUèö~ýÿ‹ðƒÄ …öt¥‹VRètGüÿƒÄ…ÀuRVè—~ýÿƒÄ_^3À]ÃWèˆ~ýÿ‹D$‹L$PQUè¸~ýÿ‹øƒÄ…ÿ„cÿÿÿ‹WVRèaHüÿƒÄ …ÀuWèT~ýÿƒÄ_^3À]Ã_^¸]ÃÌ̸lè–À¡Àç3ĉD$h‹D$|S‹\$|UV‹t$|W‹¼$„L$Q‰\$8‰D$03íè¨üÿ‹WRè™üÿƒÄƒøt"‹GPè™üÿƒÄƒøththH; jr鎋K‹Rèâ˜üÿ‹øƒÄ‰|$(‹Æ…öthIhPèµÝûÿ‹ðƒÄ…ötQD$PjjxVèmÛûÿ‹D$$ƒÄ…ÀtqPèœ}ÿÿPè–}ÿÿƒÄ;Çtl‹L$Qè…}ÿÿPèÏÐÿÿƒÄ;ÇtUVè¢ÝûÿƒÄ…Àu›hhH; jljqj!è¶lüÿƒÄT$Rèé©üÿ‹L$|ƒÄ_^‹Å][3Ìè ¿ƒÄlÃhˆhH; jDëÄ‹T$RD$P脪üÿ‹{ ƒÄ…ÿ„Wè°FüÿƒÄ…À„ïL$0QT$tu è¦Ñüÿ‰D$>˜u èõÑüÿ‰D$‹‹GVRPL$$QèÖüÿV‹øèÇßüÿƒÄ…ÿ@hÕhH; jijqj!èûjüÿƒÄƒÍÿé=þÿÿh´hH; jejqj!èÛjüÿƒÄƒÍÿéþÿÿ½éþÿÿÌÌÌÌÌÌ‹D$‹L$S‹Y Pè^úÿÿƒÄ[ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$S‹YPè>úÿÿƒÄ[ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$S‹\$PQRƒÃ èÄûÿÿƒÄ [ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$S‹\$PQRƒÃè”ûÿÿƒÄ [ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸€èö¼¡Àç3ĉD$|‹„$ˆSU‹¬$ŒV3öL$4WQ‰D$0‰t$,‰t$ ‰t$‰t$èé¤üÿ‹URèp•üÿ‹øGêƒÄ‰uƒøwsÿ$…¨•‹E‹Xj‰\$èX@þÿƒÄ‰D$;Æu hmhH; jAh€j!è…iüÿƒÄéÌ‹M‹Q‰Bé2jè@þÿƒÄ‰D$;Æuhv뾋M‹Q‰BƒÿuV‹M‹Q‹PèÚ”üÿ‹L$0Q‹Ø|$8èê÷ÿÿƒÄ…À„n‹L$0T$$RD$PPQèË¥üÿ‹T$0‹MR‹Q D$\PRè¥>þÿƒÄ‹EP艔üÿƒÄƒøujjjUè…àÿÿƒÄ…À…‹L$,hQèKÙûÿ‹ðƒÄ…ö…³hhH; jkh€j!è–hüÿƒÄéÝ‹E‹H‹p‰L$è\ëÿÿ‹U‰D$‹B‹HQè ”üÿƒÄƒøu ƒ} t‹T$RèQ?þÿ‹E‹HƒÄÇA‹\$…Û„èþÿÿè0Îûÿ‰D$…Àush•hH; j h€j!èhüÿƒÄéW‹U‹rèÝêÿÿ‰D$‹E‹H‹QR芓üÿƒÄƒø…‘þÿÿƒ} „‡þÿÿ‹D$PèÊ>þÿ‹M‹QƒÄÇBéhþÿÿ3ÿS‰|$8èùAüÿƒÄ…ÀެþÿÿWSè÷Aüÿ‹ðƒÄƒ~„ЋF‹Qè“üÿ‹T$0R‹Ø|$8è-öÿÿƒÄ…À„±‹D$0PL$‹T$ RVèaþÿƒÄ…Àu#h)hd; hjuj!èXüÿVè\ÂûÿƒÄëiVèQÂûÿƒÄö„$¼uN‹D$P3öè82üÿƒÄ…À~;‹L$VQè52üÿ‹T$VR‹øè(2üÿPWSUèÿéÿÿƒÄ …À~J‹D$PFèý1üÿƒÄ;ð|ÆÇD$$‹D$(9D$u …Àt UèšÇûÿƒÄUèaÈûÿ‹L$Qè—1üÿ‹D$,ƒÄë4h8hd; jijuj!èYWüÿƒÄë¶hÓhd; j{juj!è?WüÿƒÄ3À‹Œ$ _^][3Ìè3ªÄ”Ã̸èö©SVW‹|$jjjhÐûjWèü*ýÿjL‹Øh; Sèý~øÿ‹ðƒÄ$…öujMh; jAjvj!èÒVüÿƒÄ_^3À[YÃjjjhÐûD$PW‰t$$è®*ýÿƒÄèÆ1þÿ‹ø…ÿujTëºSVWèD,þÿƒÄ …ÀujXë§VèC€øÿ‹L$Wjh§QèñëÿÿƒÄ_^[YÃÌÌÌÌÌÌÌÌ̸è6©‹D$h§Pè‡ëÿÿƒÄ…Àt4ƒ8u/‹H‹Qjj‰T$‹@‹hüh°ûQT$Rjèa,ýÿƒÄYÃ3ÀYÃÌÌÌÌÌÌÌÌVèÊWýÿ‹ð…öujuh; jAjwj!èâUüÿƒÄ3À^ËSWPèýÿ‹L$Qèç{üÿ‹\$ ƒÄ‰…Û~]èõäýÿ‰F…Àuj}ë%èEÝýÿ‹ø…ÿuhëSWèá#ýÿƒÄ…Àuh…h; jAjwj!èuUüÿƒÄ_[3À^ËV‰z‹FÇ‹L$VQè¢.üÿƒÄ_[¸^ÃÌÌÌÌÌÌWèZÎüÿPèÔÆûÿ‹øƒÄ…ÿujwh¬; jAjyj!èUüÿƒÄ3À_ËD$VPWèÆÄûÿ‹L$‹ðQVè åþÿjjj VèMÃûÿVè÷ÄûÿWè1¿ûÿƒÄ(^¸_ÃÌÌÌÌÌÌWèêÍüÿPèdÆûÿ‹øƒÄ…ÿuh‡h¬; jAjxj!è¦TüÿƒÄ3À_ËD$SVPWèRÄûÿ‹ðjVèxäþÿ‹ØƒÄ…ÛuhŒh¬; h‚jxj!ègTüÿƒÄjjj Vè¸ÂûÿVèbÄûÿW蜾ûÿƒÄ^‹Ã[_ÃÌÌÌSU‹l$‹Ù÷Åu‹D$ UWPèôþÿƒÄ ]¸[ÃVWSèá×ÿÿ‹L$‹ðUVQèÓþÿjjjSè§ËÿÿVSèÐéÿÿƒÄ,;÷tVèóÃûÿV‹Øè+¾ûÿƒÄ‹ó;ßué^]¸[ÃÌÌÌÌÌÌÌÌÌV‹ñŠW„Àt‹=|! <"t¶ÀPÿ׃Ä…ÀtŠFF„Àuç_3À^þFN÷ØÀ_#Á^Ã_‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ…ÿu3ÀËÇPd$Š@„ÉuùS+ÂVt8ÿ;÷r(‹|! ¤$Š<"t¶ÀPÿӃąÀtÆN;÷så^3À[ÃNÿ;ÏtôÆ^‹Ç[ÃÌ‹D$SV…ÀtAPèp¼ûÿ‹ØƒÄ…ÛtK€;‹ót-U‹-ˆ! W¾>WÿՃąÀt Wÿ„! ƒÄˆF€>uá_]ë3Û‹D$…ÀtPè%¼ûÿ‹ðƒÄ…öu^3À[Ã3öhvh¬; jè¤zøÿƒÄ …Àt቉pP‹D$‹HQèÊ+üÿƒÄ^¸[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸è6¥‹V‹D$ $QR‰D$èÁ.üÿƒÄ…À}3ÀƒÄÃP‹FPèŠ,üÿƒÄƒÄÃÌÌÌU‹l$VW‹ùƒúÿu‹ÃPŠ@„Éuù+‹Ѓÿÿu‹ÅpŠ@„Éuù+Æ‹øG;ÂB‹5€! jhÔÐ SÿÖƒÄ …Àu+WKUQÿÖƒÄ …ÀujT;hÔÐ RÿÖƒÄ ÷Ø_À^ƒÀ]Ã_^3À]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸0èf¤¡Àç3ĉD$,‹D$@‹L$Wÿˆ! ƒÄ…Àt Wÿ„! ƒÄˆF€>uÝë3í…Ût;S诶ûÿ‹ØƒÄ…Ût³€;‹ót'¾>Wÿˆ! ƒÄ…Àt Wÿ„! ƒÄˆF€>uÝë3ÛhYh¬; j èuøÿ‹ðƒÄ …ö„gÿÿÿh §‰.‰^è»$üÿƒÄ‰F÷Ø_À#Æ^][ÃÌÌÌÌÌÌÌÌÌÌV‹t$‹…Àt PèovøÿƒÄ‹F…Àt Pè_vøÿƒÄ‹F…ÀthÀªPèJ)üÿƒÄVèAvøÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌ̸èFŸ¡Àç3ĉ„$V3ÀW‹ñh §‰t$‰D$ ‰D$è$üÿ‹øhD$ PV‰|$膹ûÿƒÄ…ÀŽ/SUƒ|$t¶L$ Qÿ|! ƒÄ¾…Àu¾ŠD$ 3í\$ ‹Ë„À„< „þ< „öVÿƒú‡Þÿ$•P°<:…ϾÆèè÷ÿÿ‹øè1øÿÿ‹èKé±<;u3ÆèË÷ÿÿ‹øèøÿÿU‹ÈèÜýÿÿ‹T$PR‰D$è½$üÿƒÄ 3íKuëz<(uv‰t$¾ëk<)ug‹t$ëa<=u]¾Æèv÷ÿÿ‹øè¿÷ÿÿ‹èKëB<;u*¾ÆèW÷ÿÿ‹øè ÷ÿÿP‹D$UPèô÷ÿÿƒÄ 3íKë<"u–¾ë <"u¾ŠCC„À…úþÿÿƒþuT‹ùŠ „Ét€ù"t9¶ÉQÿ|! ƒÄ…Àt ŠOG„Éuâ3ÿè8÷ÿÿU‹Èèýÿÿ‹T$PR‰D$èá#üÿëPG¾8÷ßÿ#øëÔƒþu@‹ùŠ „Ét"d$€ù"tq¶ÁPÿ|! ƒÄ…Àt ŠOG„Éuâ3ÿèÛöÿÿ‹L$PUQè/÷ÿÿƒÄ T$ ;Út‹L$h‹ÂPQè‚·ûÿƒÄ …Àþýÿÿ‹D$][_^‹Œ$3Ìè ÄÃG¾8÷ßÿ#øëœ‹Œ$‹Ç_^3ÌèåœÄÃIc®‰®Ù®ø®1¯Ï®ÌÌÌÌÌÌÌ̸膜‹D$Ç$…ÀtÇSU‹l$‹Íèýÿÿ‹Ø…Ûu#h"h¬; h…jzj!èfIüÿƒÄ]3À[ƒÄÃVWD$PSÇD$Ñ èÆ%üÿƒÄ…ÀŒ±PSè”#üÿ‹ðƒÄ…ö„‹~…ÿ„’¹|Ñ ‹ÇëIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À…vhpÑ èyöÿÿƒÄ…À„B‹P…Ò„7L$Q‹Íèwùÿÿh`­S‹ðèj%üÿ‹l$ƒÄ …ö„ßUèå"üÿƒÄƒø…ÍjUèá"üÿƒÄ‹È‰D$èüÿÿ‹ð…öu0hBh¬; h†jzj!èUHüÿhðdUè %üÿƒÄ_^]3À[ƒÄÃhÑ è“øýÿ‹øƒÄ…ÿ„K‹G…À„@ºPÑ ‹Èd$Š:u„ÛtŠY:ZuƒÁƒÂ„Ûuä3ÉëɃÙÿ…Ét{¹4Ñ ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀtKh`­Vèl$üÿhSh¬; hjzj!è”Güÿ‹WRh,Ñ jè„IüÿhðdUè9$üÿƒÄ0_^]3À[ƒÄÃh`­Vè!$üÿ‹|$Wè‡òÿÿ‹ðƒÄ …öu0h[h¬; hŒjzj!è6GüÿhðdUèë#üÿƒÄ_^]3À[ƒÄË\$(…Ût#jUèn!üÿW‰èV±ûÿUè !üÿƒÄ_‹Æ^][ƒÄÃhðdUè¨#üÿƒÄ_‹Æ^][ƒÄÃh`­Vè#üÿhLh¬; hŠéLh9h¬; hˆjzj!è¤FüÿhðdUèY#üÿƒÄ_^]3À[ƒÄÃh`­SèA#üÿh3h¬; h‰éý¹Ñ ‹Ç›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àtp¹øÐ ‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àt@hlh¬; hƒjzj!èïEüÿ‹FPh,Ñ jèßGüÿh`­Sè”"üÿƒÄ(_^]3À[ƒÄÃh`­Sè|"üÿUèæðÿÿƒÄ …ÀuMhuh¬; h‹jzj!è—EüÿƒÄ_^]3À[ƒÄÃh`­Sè?"üÿh(h¬; h‡jzj!ègEüÿƒÄ3À_^][ƒÄÃÌÌÌÌÌÌÌÌÌÌWèz‹ø…ÿujGh< jAjuj#è2EüÿƒÄ3À_ËD$PèAküÿ‹T$OQ‰‹D$RPèl/þÿƒÄ…ÀujLë¿V軋ð…öujPh< jAjuj#èãDüÿƒÄ^3À_ËL$Q‰~èîjüÿƒÄ‰‹Æ^_ÃÌÌÌÌVèz‹ð…öuj^h< jAjpj#è¢DüÿƒÄ3À^Ãh–è±jüÿ‰‹D$ ‰FƒÄ‹Æ^ÃÌVè:‹ð…öujph< jAjqj#èbDüÿƒÄ3À^Ãh—èqjüÿ‹L$ ‹T$‰‹D$$P‹D$Q‹L$R‹T$P‹D$QRjPèõ)ƒÄ$‰F…Àujx륋Æ^ÃÌÌÌVèj¶ÿÿ‹ð…öuh„h< jAjrj#èïCüÿƒÄ3À^Ãjèjüÿj‰Fè‡þÿƒÄN‰…Àuh‰ëÅQè®P‹D$Pè.þÿƒÄ …ÀuhŽh< jdjrj#è—CüÿƒÄ3À^ËÆ^ÃÌÌÌÌÌÌÌÌÌÌÌÌV‹t$‹FPèoüÿƒÄƒøth™h< jyhƒj#èRCüÿƒÄ3À^Ãè6‹NPQèL.þÿƒÄ^ÃÌÌÌÌÌÌÌV芵ÿÿ‹ð…öuh¨h< jAjsj#èCüÿƒÄ3À^ÃjVè¼ÿÿƒÄ…Àuh­h< jxjsj#èäBüÿƒÄ3À^ËD$‹L$‹T$WP‹D$QRPè£.þÿ‹øƒÄ…ÿuh±h< jAjsj#è¥BüÿƒÄ_3À^ËN‹Q‹BPènDýÿ‹N‹Q‰z‹F‹H‹QRèvþÿ‹D$,‹L$‹T$ƒÄjPQRèMPWè‹N‹Q‰B‹F‹HƒÄƒyuhºh< jgjsj#è)BüÿƒÄ_3À^Ã_‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌV‹t$‹FPè¢müÿƒÄƒøt3À^ËN‹Q‹B‹L$‹T$ jPQRèËP‹F‹H‹QRè˃Ä^ÃÌÌÌÌÌÌ‹T$‹B‰D$éP'‹D$‹HƒÁQè ‹T$ PRèõ+þÿƒÄ ÷ØÀ÷ØÃÌÌÌÌÌÌÌÌÌÌÌV‹t$‹F‹HQèmüÿƒÄƒøthÜh< jyh‚j#èOAüÿƒÄ3À^ÃèC‹VP‹BPèF,þÿƒÄ^Ã̸\= ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h\= PQRè'ÅýÿƒÄÃÌÌÌ‹D$‹L$h\= PQèl­ýÿƒÄ ÃÌÌÌÌÌÌÌÌh\= èžýÿƒÄÃÌÌ‹D$h\= Pè¡¡ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸´= ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h´= PQRè§ÄýÿƒÄÃÌÌÌ‹D$‹L$h´= PQèì¬ýÿƒÄ ÃÌÌÌÌÌÌÌÌh´= è–ýÿƒÄÃÌÌ‹D$h´= Pè!¡ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ä= ÃÌÌÌÌÌÌÌÌÌ̸p> ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hp> PQRèÄýÿƒÄÃÌÌÌ‹D$‹L$hp> PQè\¬ýÿƒÄ ÃÌÌÌÌÌÌÌÌhp> èýÿƒÄÃÌÌ‹D$hp> Pè‘ ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸0? ÃÌÌÌÌÌÌÌÌÌ̸ˆ? ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hˆ? PQRè‡ÃýÿƒÄÃÌÌÌ‹D$‹L$hˆ? PQèÌ«ýÿƒÄ ÃÌÌÌÌÌÌÌÌhˆ? èvœýÿƒÄÃÌÌ‹D$hˆ? Pè ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸¸? ÃÌÌÌÌÌÌÌÌÌ̸è? ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$PQjƒÂhRè’¿þÿƒÄ÷ØÀ÷ØÃÌÌÌÌÌÌÌÌ‹T$ŠD$jL$ QjƒÂjSRˆD$è`¿þÿƒÄ÷ØÀ÷ØÃÌÌÌÌÌÌ‹D$ ‹L$‹T$PQhƒÂhœRè/¿þÿƒÄ÷ØÀ÷ØÃÌÌÌÌÌ‹D$ ‹L$‹T$PQhƒÂhœRèÿ¾þÿƒÄ÷ØÀ÷ØÃÌÌÌÌÌ‹D$ ‹L$‹T$PQhƒÂh¡RèϾþÿƒÄ÷ØÀ÷ØÃÌÌÌÌÌS‹\$…Ûu3À[ÃUVWS3öè8üÿƒÄ…À~*‹l$VSè6üÿ‹ø‹PèliüÿƒÄ ;ÅtSFèüÿƒÄ;ð|Ú_^]3À[ËOQè÷üÿƒÄ…Àté‹WjRèõüÿƒÄ_^][ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹HhœQènÿÿÿƒÄ…Àu3ÀÃ8uø‹@‹‹@RPè@ƒÄÃÌÌÌÌÌÌÌÌÌÌÌ̸Hè¡Àç3ĉD$D‹D$L‹L$P‹T$\‰D$‹D$X‰L$‹L$`‰$‰L$…À„wƒ8…nƒx„d‹@‹PS‰T$‹PL$QjèC(þÿ‹ØƒÄ …Ûu'jih@ jejxj#è¸<üÿƒÄ3À[‹L$D3Ì貃ÄHËCU…Àuhë PèÐ ýÿƒÄ‹è‹‹T$ ‹L$V‹pW‹8RD$8PQèžþÿ‹T$pƒÄP‹D$$UjWVRPèvƒÄ$…Àu0jsh@ jkjxj#è=<üÿSè÷'þÿƒÄ_^]3À[‹L$D3Ìè.ƒÄHËL$‹D$QT$(RPèËlûÿ‹L$p‹T$$ƒÄPUjWVQRèƒÄ$…Àu jyh@ jjë›Sè›'þÿ‹D$xP‹D$L$,Q‹L$,T$@RjPQè›üÿT$Pj R‹ðè}føÿD$HjPèqføÿƒÄ,_‹Æ^][‹L$D3Ì蘎ƒÄHÃjch@ jejxj#èw;üÿ‹L$XƒÄ3Ì3ÀèrŽƒÄHÃÌÌÌhà¼覠üÿPèÐüÿPhèEèüÿƒÄhà¼舠üÿPèÂüÿPh‘è'èüÿƒÄhà¼èj üÿPèDüÿPh’è èüÿƒÄhà¼èL üÿPèæŽüÿPh“èëçüÿƒÄhà¼è. üÿP訖üÿPh”èÍçüÿƒÄhà¼è üÿPèÚ–üÿPh•è¯çüÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌSW‹|$ ƒ?uè üÿ‰…Àu_[ûë3Û‹D$V…Àua¸•‹L$‹T$Q‹L$$RjjjÿQPè%÷ÿÿƒÄ‹ð…öt‹VRè“üÿƒÄ…Àu<…Ût‹PèPüÿƒÄÇ…öt Vè¬ÿÿƒÄ^_3À[ÃøÿuŸ‹D$PèõõÿÿƒÄë®^_¸[ÃÌÌÌÌÌÌÌ…öuFÃ>Wuèmüÿ‰…Àt2¿ë3ÿ‹D$‹PQèüÿƒÄ…Àu…ÿt‹RèÎüÿƒÄÇ3À_ø_ÃÌÌÌÌÌÌÌÌÌÌ‹D$…À¸VPè<‹ðƒÄ…öt‹D$PVè¸÷ÿÿƒÄ…Àu Vè‹øÿÿƒÄ3À^ËÆ^øè&ŒV‹t$ƒÈÿWV‰D$ ‰D$èÿ‹øƒÄ…ÿtdD$PVè[WýÿƒÄ…Àt‹L$QPWèxúÿÿƒÄ …Àt6T$ RVèfWýÿƒÄ…Àt‹L$ QPWèóùÿÿƒÄ …Àt‹t$WèâþÿÿƒÄ…ÀuWè•ùÿÿƒÄ_3À^ƒÄËÇ_^ƒÄÃÌÌ‹D$VWPèDäüÿ‹ðƒÄ…ötk‹D$…ÀtPVèÌùÿÿƒÄ…ÀtU‹D$Vƒøÿt#‹L$‹T$$QjjjÿRPèåóÿÿV‹øè}*þÿƒÄ ë è“óÿÿƒÄ‹ø…ÿt‹t$ WèPþÿÿƒÄ…ÀuWèùÿÿƒÄ_3À^ËÇ_^ÃÌÌÌÌÌ̸XèöŠ¡Àç3ĉD$T‹D$\‹L$`S‹\$hU‹l$tV3öW‹|$x‰D$ ‰L$‰t$‰t$‰t$9´$„u Ç„$„•9´$€u Ç„$€’9´$ˆu Ç„$ˆ9´$Œu Ç„$Œ;Þu6;þu];î…¤jrh @ jhjij#èk7üÿƒÄ_^]3À[‹L$T3ÌèbŠƒÄXÃ;þtvSWè8yþÿƒÄ…ÀtÙT$RD$(P肜üÿPWè›ËþÿƒÄL$WQèÍýÿÿ‹ð‹D$$ƒÄ…ÀtjÿPVèwøÿÿƒÄ …À„E‹D$…ÀtPT$(RVèø÷ÿÿƒÄ …À„&‹t$U3ÿè!üÿƒÄ…À~/WUè#üÿPD$PèhýÿÿƒÄ…À„öUGèöüÿƒÄ;ø|Õ‹t$‹l$ …öt'‹Œ$ˆ‹”$„UQRD$ VPè×ûÿÿƒÄ…À„hðºVè!üÿ3öƒÄ‰t$…Û„ð‹Œ$€‹”$ˆ‹„$UQRPL$ SQè|ýÿÿ‹ðƒÄ…ö„Ljÿh¡SèBßüÿƒÄ …À|PSèTßüÿPVRèz°þÿƒÄ…À„jÿhXSèßüÿƒÄ …À|PSè$ßüÿPFPèJ°þÿƒÄ…À„ì‹D$…ÀtjÿPVè÷ÿÿƒÄ …À„ЋD$…ÀtPL$(QVèŸöÿÿƒÄ …À„±‹t$…ötjjjÿT$ VRèËúÿÿƒÄ…À„‘hðºVèüÿj3öè ‹øƒÄ …ÿtt‹\$SWèˆóÿÿƒÄ…Àu Wè[ôÿÿƒÄëWhlSèÛüÿ‹„$”ƒÄƒøÿ„|jPjjjÿUWè8ƒÄ…ÀueWèôÿÿƒÄ_^]3À[‹L$T3Ìè⇃ÄXËt$‹D$…ÀthlPè|üÿƒÄë‹t$…öthðºVèdüÿƒÄ_^]3À[‹L$T3Ì蛇ƒÄXËL$d‹Ç_^][3Ì膇ƒÄXÃÌÌÌÌÌÌ̸˜èF‡¡Àç3ĉ„$”‹„$°S‹œ$¬U‹¬$¼V‹´$¨W‹¼$°L$Q‰D$è3”üÿ‹”$Ì‹NR‹”$¼D$ P‹QRWPè±ßüÿƒÄ…ÀujSh<@ jsjwj#èè3üÿƒÄ3Àé¹jWL$h<@ Qè Åüÿ‹¼$ÈǃÄPèË[øÿ‹ðƒÄ …öujXh<@ jAjwj#è 3üÿƒÄëgWST$RD$$VPèzüÿ‹D$$L$$‹øQÆPT$4RèAzüÿƒÄ …ÀuVè$]øÿjah<@ jtjwj#3öèP3üÿƒÄë…ít ‹D$ø‰}‹D$…Àt‰0L$QèÚ“üÿƒÄ‹Æ‹Œ$¤_^][3Ìè†ĘÃÌÌÌÌÌÌÌÌÌÌÌ̸èÖ…jD$P‹D$$‹‹@L$$Q‹L$$R‹T$$P‹D$ QRPè[þÿÿƒÄ …Àuj{h<@ jujjj#è²2üÿƒÄ3ÀƒÄËL$S‹\$V‹t$$WQST$Rj‰t$ 訶ýÿƒÄƒ|$,‹øt SVèE]øÿƒÄ…ÿuhh<@ jejjj#èY2üÿƒÄVè\øÿƒÄ‹Ç_^[ƒÄÃÌÌÌ̸è…VjÇD$èÖþÿ‹ðƒÄ…öuhžh<@ jAjlj#è2üÿƒÄ3À^YËD$‹T$WPL$ QRèkžýÿ‹ø‹D$ƒÄ …Àuh£h<@ jfjlj#èÉ1üÿƒÄ_3À^YËT$jVNQ‹L$WP‹D$,RPQè3ýÿÿƒÄ …Àu(h¨h<@ jgjlj#è‡1üÿ‹T$Rè=[øÿƒÄ_3À^YÃ|$$t‹D$WPè2\øÿƒÄ‹L$Qè[øÿƒÄ_‹Æ^YÃÌÌÌÌÌÌÌÌÌÌÌÌVèZðÿÿ‹ð…öujEhX@ jAjmj#è"1üÿƒÄ3À^ËWjPè`ÿüÿ‹|$Wè&Wüÿ‹NƒÄ ƒÿ‰A_t jThX@ jwë"jè•þÿ‹V‰B‹FƒÄƒxu"jNhX@ jAjmj#èÁ0üÿƒÄVèèïÿÿƒÄ3À^ËÆ^ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸8èvƒSUVD$4WPè˜küÿ‹|$pWèžåW‹ðè¦þÿh„‹øht@ V‰|$4èpXøÿh…ht@ W‰D$Pè\Xøÿh†N‹èht@ Q‰l$dèCXøÿ‹”$ˆ‰D$@Dÿ™÷þƒÄ0‹È‹D$P¯Î‰L$0…ÀtDÿ™÷þ¯Æ‰D$ ë ÇD$ ‹D$ h‹Áht@ P‰D$4èëWøÿƒÄ ‰D$èÉùÿ‹ØèˆÉùÿ‹L$,‰D$$…É„¯…í„§ƒ|$„œƒ|$„‘…Û„‰…À„…ö~‹D$\VPQèâ‚ƒÄ ‹L$3À9D$0‰D$~&¤$™÷|$X‹D$TAŠ‹D$@;D$0ˆQÿ‰D$|á3À9D$ ‰D$~(ëI™÷|$P‹D$LAŠ‹D$@;D$ ˆQÿ‰D$|á‹|$‹D$ljPL$@Qèküÿ‹T$8VRD$LPèœküÿ‹L$@‹T$,QRD$XPèˆküÿjL$`UQè‹küÿ‹„$ƒÄ0ƒø~@H‰D$X¤$‹T$ljRD$@Pè¿jüÿWL$HUQèCküÿjT$TURèFküÿƒÄ$ƒl$XuÌ‹D$d;Ç|‹ÇP‹D$lUPèÈƒÄ ;|$d)|$d|$h3É…ö~‹Á™÷|$‹D$A;Ί*ˆTÿ|é‹|$‹L$$‹T$QVRè@Ëùÿ‹D$0jPèÄôùÿƒÄƒ|$(ÇD$XŽñþÿÿ‹l$SVUèËùÿ‹L$0QSSèf§ùÿ‹T$(RSèëËùÿSè¥ÆùÿƒÀ™ƒâ‹øÁÿƒÄ$;þ~‹|$WSèÅËùÿVGWUèƒÄë1}%‹Æ+ÇPjUè‹L$d+ÏL$ ÎQSè•ËùÿƒÄë USè‰ËùÿƒÄ‹D$XÆî;D$(‰D$XŒfÿÿÿ‹l$4éFþÿÿUèWøÿ‹T$RèWøÿ‹D$4PèýVøÿ‹L$ QèóVøÿSèÆùÿ‹T$8RèƒÆùÿD$PPèYjüÿƒÄ_^]¸[ƒÄ8Ãhht@ jAjoj#èô,üÿƒÄ_^]3À[ƒÄ8ÃÌÌÌÌÌÌ̸è¶‹D$…Àud‰D$‰$‹T$(‹D$$‹L$ VR‹T$$P‹D$$Q‹L$$R‹T$$P‹D$Q‹L$$RPQèôûÿÿ‹ð‹D$0ƒÄ$…Àt‹T$RPèLWøÿ‹D$Pè2VøÿƒÄ ‹Æ^Yà $Q‹L$T$ RQPèÆ ƒÄ…ÀuˆjXht@ jAjnj#è=,üÿƒÄ3ÀYÃÌÌÌÌÌÌU‹l$VW3öèrüÿƒÄ…À~Kë ¤$‹ÿ‹D$‹L$‹T$SUP‹D$Q‹L$RPQVWèNüÿƒÄPè%ƒÄ …ÀtWFè'üÿƒÄ;ð|À^¸]Ã^3À]ÃÌÌ̸è–~SUVW‹|$‹Ghœ3ÛP3ö‰\$è˜íÿÿƒÄ;Ãt‹H‰L$‹WhRè|íÿÿ‹l$8ƒÄ;Ãt.‹p‹Þ…öt%‹D$4Š€á€ùt‹EV…Àt+Pè|þÿƒÄ…Àt3ö‹RèÛVüÿjÿÿÿƒÄƒøw^ÿ$…¬ÐèâþÿƒÄ‰E…ÀuÕhàh@ jAhj#è+üÿƒÄ_^]3À[YÃ…öt!‹t$$…öt‹GPè ÆüÿƒÄ‰…ÀtÚ‹D$4€_^]¸[YÃ…ötñ‹l$$…íté‹L$ ‹T$QRWèéèÿÿ‹ðƒÄ …öt£VèÚÅüÿV‰Eè±þÿƒÄƒ}u±_^]3À[YËG‹QèVüÿƒÄ=žu›Wèu ‹øƒÄ…ÿ„[ÿÿÿ…Ût%‹‹CRPWè÷GýÿƒÄ …ÀuWèšEýÿƒÄ_^]3À[YËD$…Àt1PL$Qè +ýÿƒÄ…À~‹T$PRWè)Gýÿ‹è‹D$$Pè½SøÿƒÄ…ít¶…öt‹D$4€‹D$(…Àt,‰8_^]¸[YËD$,…Àt‹WQèüÿƒÄ_^]¸[YÃWèEýÿƒÄ_^]¸[YËT$,‹D$(‹L$$‹\$4‹UR‹T$(P‹D$(QRPèMýÿÿƒÄ_^][YÃ+Ï[Ï ÏPÏPÏ}ÐÌÌÌÌÌÌÌÌÌÌÌ̸ è&|‹D$SU3ÛP‰\$ˆ\$è°çÿÿ‹èƒÄ;ëu]3À[ƒÄ ÃVW3ÿU‰|$èaüÿƒÄ…ÀŽ£›WUèYüÿ‹ð‹NQèŽTüÿƒÄ ƒøu Vè`åÿÿƒÄëƒøu]‹T$(‹D$$RPVè¶æÿÿƒÄ ‹ø…ÿ„‚‹T$4‹D$0L$Q‹L$0R‹T$0P‹D$0QRP\$+èbüÿÿƒÄhðºW…Àtfè@üÿ‹|$ƒÄGU‰|$è¾üÿƒÄ;øŒcÿÿÿhlUèüÿ‹D$ ƒÄ…Àt PèGÿýÿƒÄ_^]¸[ƒÄ ÃhlUèìüÿƒÄ_^]3À[ƒÄ ÃèÚüÿhlUèÏüÿƒÄ_^]3À[ƒÄ ÃÌÌS‹\$…ÛujZh@ jijvj#èå'üÿƒÄ3À[ÃV‹t$…öt*ƒ>u%è[üÿ‰…Àujah@ jAjvj#è³'üÿƒÄ^3À[ÃW‹|$…ÿtÇU‹l$ …ítÇE‹t$…öt€>tjÿVSè–ƒÄ …Àu2jyë\jjSèƒÄ …Àt3öëjhß1 SèiƒÄ …Àt1¾ß1 ‹D$$PUWjÿVSèÝýÿÿƒÄ…Àu jh@ jrë]_^¸[Ãjuh@ jqjvj#èÿ&üÿƒÄ…ÿt‹…Àt P蜛üÿƒÄ…ít‹E…Àt Pè8BýÿƒÄ‹D$$…Àt‹h€Qè€üÿƒÄ]_^3À[ÃÌÌÌÌÌ̸ è†y¡Àç3ĉ„$‹„$‹Œ$‹”$ W‹¼$‰D$‹G‰L$ ‹HQ‰T$ èRüÿƒÄƒøt-jMh¬@ jyjkj#èI&üÿƒÄ3À_‹Œ$3Ìè@yÄ ËGƒx‹HS‹YU‹)u ÇD$ ë‹Ð‹BPèFõüÿƒÄ‰D$ ‹O‹‹‹VQèQüÿPè™LüÿPèãüÿ‹ðƒÄ …öujWh¬@ jvjkj#èÈ%üÿƒÄ3Àé·V”$ÜRVèßýýÿ‹Œ$4‹T$(ƒÄP‹D$PjUSQRè°øÿÿƒÄ$…Àuj\h¬@ jkjkj#èw%üÿƒÄ3ÀëiD$ Pè–æøÿƒÄjVVèŠýýÿƒÄPŒ$äQT$0Rè$äøÿ‹G‹@‹‹PQRD$èµðýÿ‹L$0‹T$ ‹D$ƒÄjQRPè\ þÿPWèUçÿÿƒÄ‰F…Àu#jXhðD jgj}j#èyüÿƒÄVè(ýÿƒÄ_3À^Ã_‹Æ^ÃÌÌÌVj h E jèaAøÿ‹ðƒÄ 3À…öt6‰F‰F‰F ‰F‰F‰F‹D$‰‹@…ÀtVÿЃÄ…Àu Vè×BøÿƒÄ3ö‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$…öt‹‹@ …ÀtVÿЃÄVè¢BøÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$‹‹@…ÀuƒÈÿ^ËL$‹T$W‹|$WQ‹L$RQVÿЃÄ…À~~F_^ÃÌÌÌÌÌV‹t$‹‹@…ÀuƒÈÿ^ËL$‹T$W‹|$WQ‹L$RQVÿЃÄ…À~~ F_^ÃÌÌÌÌÌ¡°ÑPè…(üÿƒÄ…Àuh°ÑPè³%üÿhØÑjè§%üÿƒÄÃÌÌ̸øÑÃÌÌÌÌÌÌÌÌÌÌ‹L$Vq9t$sƒÈÿ^ËD$ Q‹L$ÆQ@PèKkƒÄ ‹Æ^ÃÌÌV‹t$N9t$sƒÈÿ^ËD$€8u@VP‹D$PèkƒÄ ‹Æ^ÃÌ̸ÒÃÌÌÌÌÌÌÌÌÌÌ¡8ÒPèÕ'üÿƒÄ…Àuh8ÒPè%üÿhhÓjè÷$üÿƒÄÃÌÌÌVjDhK jhèq?øÿ‹ðƒÄ …öujGhK jAjzj&èFüÿƒÄ3À^ÃjhjVèjFXPVj ÇFPèÒZøÿƒÄ‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌ‹D$3ɉ‰H‰H‰H ‰H‰H‰H ‰H$‰H(‰H,‰H0‰H4‰H8‰H<‰H@‰HH‰HLÃÌÌÌÌÌÌÌV‹t$…öujphK jCjlj&èµüÿƒÄ3À^Ã|$ tjthK jFPjÿPè#2øÿƒÄëÿNP‹FP…À"‹F,…ÀtVÿЃÄNXQVj èÛZøÿVè%@øÿƒÄ¸^ÃÌÌÌÌÌÌÌÌÌÌÌV‹t$…öujphK jCjlj&è5üÿƒÄ3À^ÃjthK jFPjÿPèª1øÿƒÄ…À"‹F,…ÀtVÿЃÄNXQVj èjZøÿVè´?øÿƒÄ¸^ÃÌÌÌÌÌÌÌÌÌ̃=Ì uèbñûÿ3É…À•Á£Ì ‹Á…Àt/hŸhK jè¿=øÿƒÄ …Àt‹T$jP‰¡Ì PèäíûÿƒÄ Ã=Ì uèñûÿ3É…À•Á£Ì ‹Á…Àt-hŸhK jèo=øÿƒÄ …Àt‹T$P‰¡Ì Pè–îûÿƒÄÃÌÌV‹t$‹ÿÐVèñ>øÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌ¡Ì …ÀthàäPèÌñûÿƒÄÇÌ jèøüÿYÃÌÌÌÌÌÌ‹D$‹L$‹T$ P‹D$ Q‹L$ RPQj è XøÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ‹T$ƒÂX‰T$é€Yøÿ‹L$ƒÁX‰L$éZøÿ‹D$…ÀuhâhK jChj&è€üÿƒÄ3ÀËL$‰¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$…ÀuhîhK jCh‚j&è@üÿƒÄ3ÀËL$‰A¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‰A,¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‰A0¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‰A8¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‰AL¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‰AH¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹@4ÃÌÌÌÌÌÌÌÌ‹D$‹@LÃÌÌÌÌÌÌÌÌ‹D$‹@HÃÌÌÌÌÌÌÌ̸РÃÌÌÌÌÌÌÌÌÌÌ…Éuh¤h¬K jCjyj&è'üÿƒÄ3ÀËÔ ‹Â…ÒtëI;Át ‹@d…Àuõë…Àuh®h¬K jijyj&èêüÿƒÄ3ÀËAdV…Àt‹q`‰p`‹A`…Àt‹qd‰pd^;Ñu‹Ad£Ô 9 Ø u ‹Q`‰Ø jQèÓûÿÿƒÄ¸ÃÌÌÌÌÌÌÌÌÌÌVhÄh¬K jj èÜ-øÿ¡Ô ƒÄ‹ð…Àtÿ@PhËh¬K jj è¸-øÿƒÄ‹Æ^ÃÌVhÓh¬K jj èœ-øÿ¡Ø ƒÄ‹ð…Àtÿ@PhÚh¬K jj èx-øÿƒÄ‹Æ^ÃÌW‹|$…ÿuhåh¬K jCjsj&èòüÿƒÄ3À_ÃVhèh¬K jj è7-øÿ‹wdƒÄ…ötÿFPhðh¬K jj è-øÿWèaûÿÿƒÄ‹Æ^_ÃÌÌÌÌÌÌÌÌÌW‹|$…ÿuhüh¬K jCjtj&è‚üÿƒÄ3À_ÃVhÿh¬K jj èÇ,øÿ‹w`ƒÄ…ötÿFPhh¬K jj è§,øÿWèñúÿÿƒÄ‹Æ^_ÃÌÌÌÌÌÌÌÌÌVW‹|$ ¾…ÿuh.h¬K jCj{j&è üÿƒÄ_3À^Ãh1h¬K jj èQ,øÿƒÄ‹Ïè§ýÿÿ…Àuh5h¬K jnj{j&èÎüÿƒÄ3öh8h¬K jj è,øÿƒÄ_‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‰‹P‰Q‹P‰Q‹P ‰Q ‹P‰Q‹P‰Q‹P‰Q‹P‰Q‹P ‰Q ‹P$‰Q$‹P(‰Q(‹P,‰Q,‹P0‰Q0‹P4‰Q4‹P8‰Q8‹P<‰Q<‹P@‰Q@‹PH‰QH‹@L‰ALÃÌÌÌÌÌÌÌÌÌÌÌS‹\$…Ûuhdh¬K jCjjj&èüÿƒÄ3À[ÃVhgh¬K jj èG+øÿ¡Ô ƒÄ‹ð…Àt`‹‹ÃëIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àt ‹vd…öuÇë%öFLtè#øÿÿ‹È…Éu3öëVèãþÿÿƒÄ‹ñëÿFPhh¬K jj èÆ*øÿƒÄ…öt‹Æ^[ùÀ% ‹ÃIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿW…À„‹hL ÿÀ ‹øƒÄ…ÿu¿ìK hÀ% èßþÿÿ‹ðƒÄ…öt_jShèK Vè¨ ƒÄ…ÀtJjh¨ø hÜK Vè ƒÄ…Àt1jWhÔK Vèz ƒÄ…ÀtjjhÌK Vèd ƒÄ…Àt_‹Æ^[ÃhŸh¬K jtjjj&è‚üÿShÈK jèuüÿƒÄ _^3À[ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$…Àuhªh¬K jCh¾j&è@üÿƒÄ3ÀÃh­h¬K jƒÀPjPè³)øÿƒÄ¸ÃÌÌÌÌÌÌÌÌÌÌ¡Ô …Àt¤$PèÊüÿÿ¡Ô ƒÄ…ÀuîÃÌÌÌÌÌÌÌÌÌÌÌÌÌ3À…ÿujhh¬K jCjxj&èÈ üÿƒÄ3ÀË Ô V‹ñ…Ét_ëI…Àu=‹‹Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ‹vd3É…À”Á‹Á…öuÃ…Àt=jth¬K jgjxj&è] üÿƒÄ3À^Ã9Ø tj}ëIhì‰=Ô ‰G`è§÷ÿÿƒÄë¡Ø …Àt#ƒxdu‰xd‰G`¸GP‰=Ø ÇGd^Ãhh¬K jnjxj&èñ üÿƒÄ3À^ÃÌÌÌÌÌÌÌÌÌÌVW‹|$ ¾…ÿuhh¬K jCjij&è¼ üÿƒÄ_3À^Ã?tƒuhh¬K jljij&è” üÿƒÄhh¬K jj èÞ'øÿƒÄè–þÿÿ…Àuh h¬K jnjij&è] üÿƒÄ3öh#h¬K jj è¥'øÿƒÄ_‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$ƒ~T¸u‹N0…Ét VÿуÄ…ÀtÿFPÿFT^ÃÌÌÌÌÌÌÌV‹t$ƒFTÿW¿uIƒ~4tCS‹\$…ÛtjahL jj è0'øÿƒÄ‹F4VÿЃÄ…Û‹ø[tjdhL jj è 'øÿƒÄ…ÿt'jVèÎôÿÿƒÄ…ÀujrhL jjh¿j&è‚ üÿƒÄ_3À^ËÇ_^ÃÌÌÌÌÌV‹t$…öuj~hL jCjwj&èU üÿƒÄ3À^ÃWhhL jj èš&øÿƒÄƒ~T¿u‹F0…Àt VÿЋøƒÄ…ÿtÿFPÿFThƒhL jj è`&øÿƒÄ‹Ç_^ÃÌÌÌÌÌÌÌÌV‹t$…öuhŽhL jCjkj&èÒ üÿƒÄ3À^ÃWh‘hL jj è&øÿƒÄƒFTÿ¿u5ƒ~4t/jahL jj èó%øÿ‹F4VÿÐjdhL jj ‹øèÛ%øÿƒÄ$…ÿt'jVèœóÿÿƒÄ…ÀujrhL jjh¿j&èP üÿƒÄ3ÿh“hL jj è˜%øÿƒÄ…ÿuh–hL jjjkj&è üÿƒÄ_3À^ËÇ_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ƒ8t ƒxt3ÀøÃÌÌÌÌÌÌÌÌSV‹ñ3Àƒ>tC‹N…Ét1‹×Š:u„ÛtŠY:ZuƒÁƒÂ„Ûuä3ÉëɃÙÿ…Ét@ƒÆëÃ>tƒ~uƒÈÿ^[ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$SU‹l$‹ÚW‹ùƒû u‹@H…Àtƒ8t ƒxt‹_][Ã_]3À[Ãû t ƒûtƒûu#…ÿuj{h4L jCh¬j&è& üÿƒÄ_]ƒÈÿ[ÃVƒû u1‹pH…öt‹Îè(ÿÿÿ…À| Áà‹0^_][Ãh†h4L h‰é]‹PH…Ò„C‹Ê3À›‹1…ötƒyt ;õs@ƒÁëê;õ……ÀŒKôƒù‡ùÿ$°ò@Áà QèŠþÿÿƒÄ…Àt^_]3À[Ë^_][ÃÁà‹DPŠ@„Éuù^_]+Â[ÃÁà‹D‹ÈQŠA„Ûuù+ÊëRÁà‹D…ÀtP¤$Š@„Éuù^_]+Â[á¨ÔPŠ@„Éuù^_]+Â[ÃÁà‹D…Àt$‹ÈqŠA„Òuù+ÎPh|± AQWè•¶ûÿƒÄ^_][˨ԋÂp‹ÿŠ@„ÉuùR+Æh|± @PWèi¶ûÿƒÄ^_][Ã^_Áà‹D ][Ãh²h4L jnëh‘h4L hŠh¬j&è|üÿƒÄ^_]ƒÈÿ[Éñ{ò«ñÃñÛñòoòÌÌÌÌV‹t$…öuh»h4L jChŽj&è/üÿƒÄ3À^ÃWh¾h4L jj èt"øÿ3À9FPhÀŸÀh4L jj ‹øèW"øÿ‹N8ƒÄ 3À…É•À…ÿ_u"hÄh4L h‚hŽj&èÊüÿƒÄ3À^ËT$ ƒú t~~Cƒú>…ÀtöFLuW‹L$Q‹L$VèýÿÿƒÄ^ÃhÙh4L jxhŽj&è}üÿƒÄƒÈÿ^Ã…Àuhåh4L jxhŽj&èYüÿƒÄ3À^ËD$P‹D$P‹D$PRVÿуÄ^ÃÌÌÌÌÌÌÌÌÌÌ‹D$‹L$jjPjQèËþÿÿƒÄ…À}!hñh4L hŠhªj&èùüÿƒÄ3Àètù¸ÃÌÌÌÌÌÌÌÌÌV‹t$…ötx‹D$ …Àtpƒ~8t5jPjj VèlþÿÿƒÄ…À~!‹L$‹T$Q‹L$RQPVèOþÿÿƒÄ÷ØÀ÷Ø^Ã|$t èxüÿ¸^Ãhh4L h‰h²j&èfüÿƒÄ3À^Ãhh4L jCh²j&èGüÿƒÄ3À^ÃW‹|$…ÿ„‹‹D$ …À„ƒ8V„=jPjj Wè¿ýÿÿ‹ðƒÄ…öŽ#VWèËþÿÿƒÄ…ÀuhBh4L h†é$jjVjWèƒýÿÿƒÄ…À}hJh4L jnéÿ¨t4ƒ|$thTh4L hˆéàjjjVWè?ýÿÿƒÄ÷ØÀ^÷Ø_ÃS‹\$…Ûuhdh4L h‡ëu¨tjSjVWè ýÿÿƒÄ÷Ø[À^÷Ø_èuhvh4L jnëFj D$PSÿ˜! ‹L$ƒÄ ;Ùt€9ujjPVWèÀüÿÿƒÄ÷Ø[À^÷Ø_Ãh}h4L h…h«j&èèüÿƒÄ[^3À_Ã|$t èÃüÿ^¸_Ãh<h4L h‰h«j&è°üÿƒÄ^3À_Ãh)h4L jCh«j&èüÿƒÄ3À_ÃÌÌÌÌÌÌÌÌÌ¡Ü ÃÌÌÌÌÌÌÌÌÌÌ‹D$£Ü ÃÌÌÌÌÌ̸è6VSVjzhPL j3Ûj ‰\$èžøÿ‹t$0ƒÄ9u)hð hÀ è¤ãûÿƒÄ;ĉ‹D$$Pè-íÿÿƒÄU‹l$4W;ë„à‹|$4ë ›‹t$(‹‹T$RPM‰L$è(åûÿ‹ðƒÄ;óuLhˆhPL jèÎ*øÿ‹ðƒÄ ;ó„ÇF ‹‰è1Þûÿ‰FV;Ä£‹T$,‰^‹PèÖãûÿƒÄ‹L$0‹VQRèÞûÿ‹D$8‹NPQè·ÛûÿƒÄ…ÀtL‰^ 9\$‹D$UV3öj.P‰t$ÇD$ÿÿÿÿ‰t$ÿp! ƒÄ;Æt@‰D$‹L$ ‹T$$QRè*5ÿÿ‹èƒÄ;îu#jphÀN h•h¼j&èyëûÿƒÄ^3À]ƒÄÃSWU‰t$è²ÅûÿƒÄ…ÀŽ ¤$‹D$PUè¥Åûÿ‹ø‹_j.Sÿp! ƒÄ…ÀtX‹¹´N ‹ÃIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ‰|$$鹨N ‹Ã¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$éÛ¹˜N ‹ÃIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀulhÀ% èMÚÿÿ‹ðƒÄ…ö„+jWhN VèåÿÿƒÄ…À„jh¨ø h„N VèõäÿÿƒÄ…À„èjjhÌK VèÛäÿÿƒÄ…À„Îé<…öu‹L$$QèÝÙÿÿ‹ðƒÄ…ö„ƒ¹|N ‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu3ÿ¹tN ‹Ã¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuc‹D$(‹L$,T$RhtN PQèÞ3ÿÿƒÄ…À„!‹D$ƒøuè%ýÿÿ…À„ ë|…Àtxh²hÀN h—h¼j&è,éûÿƒÄéâ¹`N ‹ÃŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuWVèîÿÿƒÄ…À„ ëjWSVè–ãÿÿƒÄ…Àt{‹|$GU‰|$èÃûÿƒÄ;øŒeýÿÿ…ötgƒ|$ÿu`Vè4ÝÿÿƒÄ…Àt[¡ …ÀuèÄûÿ£ …ÀtVPèÏÁûÿƒÄ…Àu.Vè‚ÝÿÿƒÄë+ƒ|$tèQéûÿ_[^¸]ƒÄÃ_[^3À]ƒÄÃÇD$…öt VèèÑÿÿƒÄ‹D$_[^]ƒÄÃÌÌÌÌÌÌÌÌÌ‹D$SWPèDÀýÿ‹\$PSè™1ÿÿ‹øƒÄ …ÿu#hÛhÀN h”h»j&èåçûÿƒÄ_3À[ÃVW3öè$ÂûÿƒÄ…À~*VWè&Âûÿ‹H‹PSQRèØûÿÿƒÄ…ÀtWFèúÁûÿƒÄ;ð|Ö^_¸[Ã^_3À[ÃÌÌÌÌ¡ PèUÁûÿƒÄ…ÀtPèˆÜÿÿ‹  Qè<ÁûÿƒÄ…Àuç‹ RèyÁûÿƒÄÇ ÃÌÌÌÌÌÌÌÌÌÌÌhhhÜN èüJÿÿƒÄ ÃÌÌÌÌÌÌÌÌéÛøÿÌÌÌÌÌÌÌÌÌÌÌV‹t$ …ötM‹…Àt Pè;xúÿƒÄ‹F …Àt Pè«øÿƒÄ‹F…Àt Pè›øÿƒÄ‹F(…ÀthPè†ÃûÿƒÄVè}øÿƒÄ^ÃÌÌÌÌÌÌÌÌU‹l$VWh½hTQ j,è¨øÿ‹ð3ÿƒÄ ;÷u!hÀhTQ jAh·j&èuæûÿƒÄ_^3À]Ãj,WVèË9ƒÄ ‰>‰~‰~‰~ ‰~‰~‰~ÇFLQ ÇF @Q ÇF$èÂÁûÿ‰F(;Çu'hÑhTQ jAh·j&èæûÿVèÍøÿƒÄ_^3À]ÃhÕhTQ jj èQøÿ¡ÐÔPUè5ÑÿÿƒÄ‰;Çu‹ ÐÔVQUèÑÿÿƒÄ ‰33öhÞhTQ jj èøÿƒÄ;÷t VègøÿƒÄ_^¸]ÃÌÌÌÌÌÌÌÌÌÌ̸èf8ƒ=ÐÔV}zhjjjjèzÐÿÿ‹ðƒÄƒþÿu#hôhTQ hhµj&èEåûÿƒÄ3À^YÃh÷hTQ jj èŠøÿƒÄƒ=ÐÔ}‰5ÐÔhÿhTQ jj èeøÿƒÄ¡ÐÔPWèFÐÿÿƒÄ‰D$…ÀuSW\$ è0þÿÿƒÄ[…Àt–‹D$^YÃÌ3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌ̃~$t‹F ‹jjPQèª{úÿƒÄ…Àt¸Ã~$Utt‹V(Rèݾûÿ‹èƒÄƒý|aS3ÛW…í~B‹F(SPèѾûÿ‹N ‹PQRèäyúÿ‹øƒÄ…ÿt"‹jjWPèN{úÿƒÄW…ÀuèøÿCƒÄ;Ý|¾_[3À]Ãèî øÿƒÄ_[¸]Ã3À]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸”èæ6U‹¬$œW3ÿ9;uèâzúÿ‰9{ u!‹C;Çu _3À]Ä”ÃP‹Pè°yúÿƒÄ‰C V‹óèÿÿÿ…Àu4hÂhTQ h„h¶j&è£ãûÿ‹ QèÛtúÿƒÄ^‰;_3À]ĔËS ‹RPèŽvúÿƒÄ‰C;Çu‹ Q‰{è©túÿhÏhTQ jhëI9{ua‹S‹RPèZvúÿƒÄ‰C;ÇthÿЃÄ=s:‹ Q‰{‰{èatúÿhçhTQ h‘h¶j&‰;èãûÿƒÄ^_3À]Ĕù‹õ|$8ó¥è“Ïÿÿ‰D$ è:ëûÿ‰D$è‘!øÿT$ ‰D$RD$ PL$ Qè‰øÿè„ý÷ÿ‰D$0è‹ý÷ÿ‰D$4è2øÿ‰D$8è9øÿ‰D$<è@øÿU‰D$DèvËÿÿ‹C‹KT$RPUÿуÄ…ÀuF‹3öR‰s‰sè súÿh hTQ jmh¶j&‰3èFâûÿƒÄ‹ý¹t$8ó¥^_3À]ĔÃ{~?Uè>ÕÿÿƒÄ…Àu2ƒ{~'hhTQ jgh¶j&èùáûÿƒÄ^_3À]Ä”ÃèÕâûÿ^_¸]Ä”ÃÌÌÌÌÌÌSVW‹|$è4üÿÿ‹ð3Û;óuhBhTQ jpé¾9thJhTQ jdé©‹D$8ÿÿÿƒø‡‹ÿ$…H‹|$;ût‹ÇPŠ@:Ëuù+ƒøs3ÿ‹F ;Ãt Pè øÿƒÄ;ûtWè¶JûÿƒÄ‰F 3À9^ _^•À[Ã_‰^ 3À;Û^•À[Ã3À9\$_•À‰F^¸[Ë|$;ût‹ÇPd$Š@:Ëuù+ƒøs3ÿ‹F;Ãt Pè£ øÿƒÄ;ûtWèFJûÿƒÄ‰F3À9^_^•À[Ã_‰^3À;Û^•À[ËD$ƒøw _‰F^¸[ÃhlhTQ hé W‹ÞèuüÿÿƒÄ_^[ËD$ƒøw _‰F$^¸[ÃhwhTQ hëk‹|$;ûtF‹ÇPŠ@:Ëuù+ƒør3Wè§IûÿƒÄ;Ãuh‰hTQ jAë5‹N(jÿPQèf¸ûÿƒÄ _^¸[ÃhhTQ hë h’hTQ jwh´j&èáßûÿƒÄ_^3À[ãúj¢È“ÌÌÌÌÌÌÌÌÌÌÌÌVè:Èÿÿ‹ð…ö„‹¡ÈÔPVèôÊÿÿƒÄ…Àto‹ ÌÔQVè ËÿÿƒÄ…Àt[hPVènËÿÿƒÄ…ÀtIhPVèÜ“ƒÄ…Àt7hPVèjËÿÿƒÄ…Àt%jVè{ËÿÿƒÄ…Àth°P Vè‰ËÿÿƒÄ…Àt‹Æ^ÃVèÈÈÿÿƒÄ3À^ÃÌVèZÿÿÿ‹ð…ötVèÒÿÿVè¨ÈÿÿƒÄ^éßßûÿ^ÃÌÌÌÌÌÌÌÌÌÌÌÌ̃=x u ƒ=t u3ÀøÃÌÌÌÌÌSVW‹ÂPX ‹|$‹t$ó§È_^[ÂÌÌÌSVW‹ÂPX ‹|$‹t$ó§Ð_^[ÂÌÌÌSVW‹ÂPX ‹|$‹t$ó§à_^[ÂÌÌÌSVW‹ÂPX ‹|$‹t$ó§è_^[ÂÌÌÌW‹ù§À_ÃÌÌÌÌÌÌÌÌœÃÌÌÌÌÌÌÌÌÌÌÌÌÌœº$$s ;  tƒìƒÄ‰  ÃÌÌSœX‹È5 PœX3Áºàsk¸¢3ÀûCentuZúaurHuRùaulsuJ¸À¢‹Ð3ÀúÀr7¸À¢3Àºâsºâs Çt @ºâsºâs Çx @[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$…Àu‹D$ ÇÜÔ¡ ÕËL$Á^þÿÿƒù ‡—ÿ$|ÇxQ ¸ÃǬQ ¸ÃÇàQ ¸ÃÇR ¸ÃÇHR ¸ÃÇ|R ¸ÃǰR ¸ÃÇäR ¸ÃÇS ¸ÃÇLS ¸ÃÇ€S ¸ÃÇ´S ¸ÃÇ3ÀÃâîú6*BNfZÌÌÌÌSU‹l$ UèÄmüÿ‹ØÛÛƒÄÛƒ|$u]3À[ËE`V‹ð÷ÞhƒæðjVè›/Uèí=üÿ$ƒÄ<u fÿýÿÿë3À9E”ÀÁà 3F%1FW{€‹Ç™ƒâ?‹ȋǙƒâ‹VÁùÁøƒáƒèÁá ƒà Èâðóÿÿ Ê‹Ã-€‰N_„„ƒè@t ƒè@t^]3À[ÃUèi=üÿƒàƒÄ<t=UèY=üÿ$ƒÄ<t.ƒ|$u'‹L$F PSQèÞØN€ƒÄ è;ýÿÿ^]¸[ËD$V RSPè ÖN€ƒÄ èýÿÿ^]¸[ËD$‹‰V ‹P‰V$‹P‰V(‹@ áÿÿÿ‰F,‰Nèâüÿÿ^]¸[ÃÌÌÌÌÌÌÌÌÌ‹G`U‹l$ V‹ð÷Þƒæð‹ÎèÇüÿÿWè¡<üÿƒàHƒÄƒø‡ôÿ$…H ‹D$ U‹ËPÁé‹ÖèøûÿÿéÁ‹O ‰‹W$‰V‹G(‹T$ ‰F‹O,‰N UR‹ËÁé‹Öèêûÿÿ‹‰O ‹P‰W$‹H‰O(‹P ‰W,ë‹G ‰‹O$‰N‹W(‹L$ U‰V‹G,Q‹ËÁé‹Ö‰F èÈûÿÿ‹‰W ‹H‰O$‹P‰W(‹@ ë=‹O ‰‹W$‰V‹G(‹T$ ‰F‹O,‰N UR‹ËÁé‹Öè©ûÿÿ‹‰G ‹N‰O$‹V‰W(‹F ‰G,3À‰‰F‰F‰F ^¸]Ã^3À]ÃVm¯îÌÌÌÌÌÌÌÌU‹ì¸è“,¡Àç3ʼnEüSVW‹}‹wPÇEè…ö„»WèK;üÿƒàƒÄƒèt>ƒè…¡ƒþƒR‹]‹E ‹M…ÉtŠT7 2FˆI@C‰Mƒþråƒæ‰E ‰wPëuƒþƒƒ‹]‹E t-ƒ}tFŠ 2L7 ÿMˆˆL7 F@Cƒþrãƒæ‰E ‰wPë5ëIƒ}tŠ ŠT7 ÿM2шˆL7 FC@ƒþráƒæ‰E ‰wPë‹]‹E ‹M…É„ƒ=ØÔu(öÁu#‹E SP‹Ùè«ýÿÿƒÄeÜ_^[‹Mü3Íè£+‹å]Ëøƒç‹Óƒâ‹÷ ò‰Uì‰}ðu+öÁu&‹U ‹}SR‹ÙèjýÿÿƒÄeÜ_^[‹Mü3Íèb+‹å]Ëñæÿu¾…ÿt;ñs¹A‰MèèL+‹Ä‹È÷ÙƒáÁ‹U‰Eø‹B`‹ø÷߃çø‹ÏèèùÿÿRèÂ9üÿƒàHƒÄƒø‡Öÿ$…&ƒ}ìt‹Eø‹ÖƒâüRSPè7+ƒÄ ë‹Ã‹MøPQ‹ÎÁé‹×Þèûøÿÿƒ}ðt‹Eø‹M ‹ÖƒâüRPQè+ƒÄ Æë‹E ƉEø)u‰E ¾u›é‹E‹P ‰‹H$‰O‹P(‰W‹@,‰G ¤$ƒ}ìt‹Uø‹ÎƒáüQSRè¬*ƒÄ ë‹ÃP‹Eø‹ÎPÁé‹×Þèøÿÿƒ}ð‰Eô‹E t‹Uø‹ÎƒáüQRPèv*ƒÄ ÆëƉEø)u‰E ‹Eô„Ž;Çt‹‰‹P‰W‹H‰O‹P ‰W ¾éuÿÿÿƒæð‹E‹H ‰‹P$‰W‹H(‰O‹P,‰}ô‰W „’ƒ}ìt‹Mø‹ÆƒàüPSQèû)ƒÄ ë‹Ã‹UøPR‹ÎÁé‹×Þèÿ÷ÿÿƒ}ð‰Eôt‹Mø‹U ‹ÆƒàüPQRèÅ)ƒÄ Æë‹E ƉEø‰E ‹E+ƉEƒør*‹Eô;Çt‹‰‹P‰W‹H‰O‹P ‰W ¾énÿÿÿ‹E…À„¤‹Mô‹÷;Ït‹‰‹Q‰W‹Q‰W‹I ‰O ‰}ô‹U‰BP‹G©tE%ÿýÿÿ‰Gè£÷ÿÿWW‹×¹è÷ÿÿOè‰÷ÿÿ‹M ›ŠŠ2ЈˆCAFƒmuíë-èf÷ÿÿWW‹×¹èÈöÿÿèS÷ÿÿ‹M Š2AˆAÿˆCFƒmuî‹Eô‹‹M‰Q ‹P‰Q$‹P‰Q(‹@ ‰A,éçƒæð‹E‹H ‰‹P$‰W‹H(‰O‹P,‰W tmƒ}ìt‹Mø‹ÆƒàüPSQèy(ƒÄ ë‹Ã‹UøPR‹ÎÁé‹×Þèöÿÿƒ}ðt‹Mø‹U ‹ÆƒàüPQRèF(ƒÄ Æë‹E ƉEø‰E ‹E+ƉE¾ƒøs“‹E…Àt:‹M‹÷‰APè|öÿÿWW‹×¹èÞõÿÿèiöÿÿ‹E ›Š2ÙˆÁñ)Muï‹‹E‰H ‹W‰P$‹O‰H(‹W ‰P,ƒ}ðt‹Eè‹MøÁè…Àt‹ÿHǃÁ…Àuò3À‰‰G‰G‰G ¸eÜ_^[‹Mü3Íè+'‹å]Ã3ÀeÜ_^[‹Mü3Íè'‹å]Ëÿ5"Ÿ"K#Ô$ÌÌÌÌV‹t$ ƒþW‹|$ |(3Ò‹Ïè—õÿÿ¨@t_©|uXƒàt ƒøuNø+ðƒþ}ÙS…ö~/Š\$ºL$èbõÿÿ¨@t/©|u(ƒàt ƒøuˆGN…öÕ[_ÇD$ ¸^Ã_3À^Ã[_3À^ÃÌÌÌÌÌÌÌÌÌè[õÿÿƒ=t Çx ¸T u¸T PhT hèS jdh è×ûÿ¡ÔÔPVè{¾ÿÿƒÄ…Àt`h V詾ÿÿƒÄ…ÀtNh@Vè÷¾ÿÿƒÄ…Àt<ƒ=t th°Vè<‡ƒÄ…Àt!ƒ=x thÕVè¡ßÿÿƒÄ…Àt¸Ã3ÀÃÌVè:»ÿÿ‹ð…ötè?ÿÿÿV…Àu èE¼ÿÿƒÄ^Ãè«ÅÿÿVè5¼ÿÿƒÄ^élÓûÿÌÌÌÌÌÌÌÌÌÌÌ̸,W ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h,W PQRègVýÿƒÄÃÌÌÌ‹D$‹L$h,W PQè¬>ýÿƒÄ ÃÌÌÌÌÌÌÌÌh,W èV/ýÿƒÄÃÌÌ‹D$h,W Pèá2ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸˜W ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h˜W PQRèçUýÿƒÄÃÌÌÌ‹D$‹L$h˜W PQè,>ýÿƒÄ ÃÌÌÌÌÌÌÌÌh˜W èÖ.ýÿƒÄÃÌÌ‹D$h˜W Pèa2ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ÜW ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hÜW PQRègUýÿƒÄÃÌÌÌ‹D$‹L$hÜW PQè¬=ýÿƒÄ ÃÌÌÌÌÌÌÌÌhÜW èV.ýÿƒÄÃÌÌ‹D$hÜW Pèá1ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸HX ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hHX PQRèçTýÿƒÄÃÌÌÌ‹D$‹L$hHX PQè,=ýÿƒÄ ÃÌÌÌÌÌÌÌÌhHX èÖ-ýÿƒÄÃÌÌ‹D$hHX Pèa1ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ŒX ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hŒX PQRègTýÿƒÄÃÌÌÌ‹D$‹L$hŒX PQè¬<ýÿƒÄ ÃÌÌÌÌÌÌÌÌhŒX èV-ýÿƒÄÃÌÌ‹D$hŒX Pèá0ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ÐX ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hÐX PQRèçSýÿƒÄÃÌÌÌ‹D$‹L$hÐX PQè,<ýÿƒÄ ÃÌÌÌÌÌÌÌÌhÐX èÖ,ýÿƒÄÃÌÌ‹D$hÐX Pèa0ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸Y ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hY PQRègSýÿƒÄÃÌÌÌ‹D$‹L$hY PQè¬;ýÿƒÄ ÃÌÌÌÌÌÌÌÌhY èV,ýÿƒÄÃÌÌ‹D$hY Pèá/ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸XY ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hXY PQRèçRýÿƒÄÃÌÌÌ‹D$‹L$hXY PQè,;ýÿƒÄ ÃÌÌÌÌÌÌÌÌhXY èÖ+ýÿƒÄÃÌÌ‹D$hXY Pèa/ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸œY ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hœY PQRègRýÿƒÄÃÌÌÌ‹D$‹L$hœY PQè¬:ýÿƒÄ ÃÌÌÌÌÌÌÌÌhœY èV+ýÿƒÄÃÌÌ‹D$hœY Pèá.ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ôY ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hôY PQRèçQýÿƒÄÃÌÌÌ‹D$‹L$hôY PQè,:ýÿƒÄ ÃÌÌÌÌÌÌÌÌhôY èÖ*ýÿƒÄÃÌÌ‹D$hôY Pèa.ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸tZ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$htZ PQRègQýÿƒÄÃÌÌÌ‹D$‹L$htZ PQè¬9ýÿƒÄ ÃÌÌÌÌÌÌÌÌhtZ èV*ýÿƒÄÃÌÌ‹D$htZ Pèá-ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ôZ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hôZ PQRèçPýÿƒÄÃÌÌÌ‹D$‹L$hôZ PQè,9ýÿƒÄ ÃÌÌÌÌÌÌÌÌhôZ èÖ)ýÿƒÄÃÌÌ‹D$hôZ Pèa-ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸`[ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h`[ PQRègPýÿƒÄÃÌÌÌ‹D$‹L$h`[ PQè¬8ýÿƒÄ ÃÌÌÌÌÌÌÌÌh`[ èV)ýÿƒÄÃÌÌ‹D$h`[ Pèá,ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸¸[ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$h¸[ PQRèçOýÿƒÄÃÌÌÌ‹D$‹L$h¸[ PQè,8ýÿƒÄ ÃÌÌÌÌÌÌÌÌh¸[ èÖ(ýÿƒÄÃÌÌ‹D$h¸[ Pèa,ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ü[ ÃÌÌÌÌÌÌÌÌÌÌ‹D$ ‹L$‹T$hü[ PQRègOýÿƒÄÃÌÌÌ‹D$‹L$hü[ PQè¬7ýÿƒÄ ÃÌÌÌÌÌÌÌÌhü[ èV(ýÿƒÄÃÌÌ‹D$hü[ Pèá+ýÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‹Q ‰T$é¾>þÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$‹‹H ‰L$éî@þÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$‹‹H ‰L$éž>þÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$‹‹H ‰L$éÞ>þÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹‹B ‰D$é~DþÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹‹B ‰D$éŽDþÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‹Q ‰T$énŒþÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹ƒÂ ‰T$é>þÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ ‹T$‹L$P‹QƒÀ Pè§>þÿƒÄ ÷ØÀ÷ØÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹H‰L$é=þÿ‹T$‹B‰D$éÐ?þÿ‹T$‹B‰D$é=þÿ‹T$‹B‰D$éà=þÿ‹L$‹Q‰T$éCþÿ‹L$‹Q‰T$é°Cþÿ‹D$‹H‰L$é ‹þÿ‹L$ƒÁ‰L$逌þÿ‹D$ ‹L$‹T$PQƒÂRèù=þÿƒÄ ÷ØÀ÷ØÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‹Q‰T$éÞ<þÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$‹‹H‰L$é?þÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$‹‹H‰L$é¾<þÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$‹‹H‰L$éþ<þÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹‹B‰D$éžBþÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹‹B‰D$é®BþÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‹Q‰T$鎊þÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹ƒÂ‰T$é^‹þÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ ‹T$‹L$P‹QƒÀPèÇ<þÿƒÄ ÷ØÀ÷ØÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹H‰L$é°;þÿ‹T$‹B‰D$éð=þÿ‹T$‹B‰D$é°;þÿ‹T$‹B‰D$é<þÿ‹L$‹Q‰T$é°Aþÿ‹L$‹Q‰T$éÐAþÿ‹D$‹H‰L$éÀ‰þÿ‹L$ƒÁ‰L$é Šþÿ‹D$ ‹L$‹T$PQƒÂRè<þÿƒÄ ÷ØÀ÷ØÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌSUVW‹|$…ÿtD‹l$jWÿÕ‹ðƒÄ…öŽêhh\ Vèï÷ÿƒÄ ‰D$‹Ø…À„ÉD$PWÿÕƒÄë^‹|$ …ÿ„ˆ‹l$jjjUjWèÁšüÿ‹ðƒÄ…öŽh h\ Vè´î÷ÿƒÄ ‰D$‹Ø…ÀtsjjjUL$,QWè…šüÿƒÄ…À~Q‹|$…ÿu è‘¡ýÿ‹ø…ÿt>VSWèœýÿƒÄ …Àt/Sèð÷ÿƒÄ‹Ç_^][Ãh)h\ jdjdj'è7ÆûÿƒÄ_^]3À[ÃSèçï÷ÿƒÄ_^]3À[ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸èæSV‹ñ3Û…ö¾jVjèíšýÿhIh\ P‰D$$èéí÷ÿƒÄ‰D$…ÀtojjV‰D$D$jPèŸýÿƒÄV…ÿt‹L$ WQèƒÄ ë ‹T$ Rè'ºûÿƒÄ‹L$ jjD$PhnQ輈þÿƒÄ…Àt»‹D$…Àt Pè"ï÷ÿƒÄ^‹Ã[ƒÄÃÌÌÌÌÌÌÌ‹D$‹ƒÁ W‹|$ Q‹L$è(ÿÿÿƒÄ_ÃÌÌÌ‹D$‹ƒÁW‹|$ Q‹L$èÿÿÿƒÄ_ÃÌÌÌS‹\$‹‹H UVWjÿhnQè&;þÿ‹l$$‹Ujÿ‹ð‹BhnPè ;þÿƒÄ‹ø…ö}…ÿ}_^]¸[Ã…ÿ}_^]ƒÈÿ[Ã_^]¸[Ë ‹Q VRèÄ>þÿ‹ð‹E‹HWQèµ>þÿ‹P‹FRPèx•üÿƒÄ_÷Ø^À]@[ÃÌÌÌÌÌÌÌÌÌÌÌV‹t$ ‹‹H jÿhnQè‰:þÿƒÄ …À}¸^ËP‹B Pè_>þÿ‹L$‹jÿPƒÂRèý8þÿƒÄ÷ØÀ÷Ø^ÃÌÌVWèyøÿÿ‹ø…ÿ„¹‹t$ …öt#è²Oýÿ‰…À„™jÿVP蟙ýÿƒÄ …À„…‹t$…ötèwKýÿ‰G…Àtq‹QPè’üÿƒÄ…Àta‹t$…ötèãPýÿ‰G…ÀtMVPèEŠüÿƒÄ…Àt?èÙmýÿ‹ð…öt4hoè©éûÿƒÄ‰…Àt‹VjWh`.Rè?üÿÿƒÄ…ÀuVè²mýÿƒÄWèÉ÷ÿÿƒÄ_3À^ÃWè»÷ÿÿƒÄ_‹Æ^ÃÌÌÌVWèÉžûÿ‹ø…ÿ„‹‹t$ …öt6¤$‹…Àt)PèõûÿƒÄ…ÀtPè'éûÿƒÄ…Àt PWèIœûÿƒÄƒÆuÑè,mýÿ‹ð…öt4hpèüèûÿƒÄ‰…Àt‹FWjh°Pè’ûÿÿƒÄ…ÀuVèmýÿƒÄhеWègŸûÿƒÄ_3À^ÃhеWèTŸûÿƒÄ_‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌVW3öè§Oýÿ‹ø…ÿt^‹D$ PWè‰üÿƒÄ…Àt6èšlýÿ‹ð…öt+hrèjèûÿƒÄ‰…Àt‹NjWh0‡QèûÿÿƒÄ…ÀuWècOýÿƒÄ…öt VèflýÿƒÄ_3À^ÃWèHOýÿƒÄ_‹Æ^ÃSUVWè×öÿÿ‹è…í„‹D$Pè#×üÿƒÄ‰E…À„á‹\$…Û„–ƒ;„èKûÿ‰E…À„¼ƒ;txèVÜþÿ‹ð…ö„¨h²è²çûÿƒÄ‰…À„‘è°¡þÿ‰F…À„è Mýÿ‹ø…ÿtv‹ jÿQWè—ýÿƒÄ …Àtd‹VÇ‹F‰x‹MVQèšûÿƒÄ…ÀtDƒÃuƒènkýÿ‹ð…öt4hsè>çûÿƒÄ‰…Àt‹VjUhà.RèÔùÿÿƒÄ…ÀuVèGkýÿƒÄUèÞõÿÿƒÄ_^]3À[ÃUèÎõÿÿƒÄ_‹Æ^][ÃÌÌÌÌV‹t$‹F…Àt Pè+ûÿƒÄ‹F…Àt Pènê÷ÿƒÄVèeê÷ÿƒÄ^ÃSVWhh4\ jèœè÷ÿ‹ðÇè_7ûÿPè2ûÿ‰F‹D$ ‰F ‹D$,ƒÄ…À~‰FëÇF‹Nh‰h4\ QèUè÷ÿ‹|$ ƒÄ ‰F…ÿu¿± ‹\$jSèæïÿÿ‹VPWh(ÕRè¦nûÿƒÄ…À _Ç^3À[ËFSPhà)èüÿƒÄ …À~Þ‹NjjjQÇè8.ûÿƒÄ‰F_‹Æ^[ÃÌÌÌÌÌÌÌÌÌÌÌ̸è–S‹|! W‹ù€?t¤$¶PÿӃąÀuG8uî늄Àuh®h4\ jsjuj'èq¿ûÿƒÄ_3À[YöÈQÿӃąÀtŠGG„Àuëh¹ëË€?uh¹ë¿€?V‹÷t¶RÿӃąÀuF8uî€>uhÄh4\ jsjuj'è ¿ûÿƒÄ^_3À[YÃUj D$PÆWFÿü ‹L$ƒÄ €9‹è…½Š„Àtd¤$¶ÐRÿӃąÀt ŠFF„ÀuëëF€>tA‹ÆPŠ@„Éuù+ÂD0ÿ‰D$¶PÿӃąÀt‹L$Æ‹D$H‰D$¶RÿӃąÀuãýÈtShàh4\ jrjuj'èV¾ûÿƒÄ€>uWhX\ jèAÀûÿƒÄ ]^_3À[YÃVhL\ WhX\ jè#ÀûÿƒÄ]^_3À[YÃ]^_¸[YÃÌÌÌÌÌÌÌÌÌÌÌÌÌU‹-è V‹t$WI÷u7‹F‹N‹V PQRè)ûÿ‹øƒÄ …ÿŽ’‹F‹NWPQè¬)ûÿƒÄ ;Ç…}‹=ä„jHƒø‡`ÿ$…$?‹FT$RjjPèÛ+ûÿ‹øƒÄ…ÿŽ@‹L$Wj QÿÕƒÄ …À„+‹V‹F‹NRPQè¨*ûÿƒÄ …ÀŽí;F„úƒ>‹Nuègýÿÿ…À„åÇ늉L$Š„Àt< t< …£A‰L$Š„ÀuéÇ‹ND$PjjQè>+ûÿƒÄƒøŒâþÿÿ‹D$Š@‰D$€ú0…„Єɉ›¶Ñƒâtrƒúm@‰D$ÇF…Ò~&‹úëIÁf¶(‹N é@ƒï‰n‰D$uç‹-è ‹F=w-D‰FëN€9…ÈþÿÿéZÿÿÿ‹VjRè5'ûÿƒÄ…À…JþÿÿÇ_^3À]Ã;~Œ5þÿÿ_Ç^3À]öɃÁ‰NÇ‹FT$RjjPèX*ûÿƒÄ;FŒüýÿÿ‹NQT$Rjè|ìÿÿ‹L$ƒÄ ‰…Àt•Ç_^¸]Ã-tƒèt[ƒètæ_^3À]ËVL$QjjRè÷)ûÿ‹N‹T$$+ÑQЋF RPèq'ûÿƒÄ…À~X)F…ýÿÿ‹NjjjQÇè¼)ûÿƒÄ‹V jjj Rèª)ûÿƒÄ…À~)ÇéHýÿÿ‹F jPè&ûÿƒÄ_÷Ø^À]ËV jRë‹F jPèÿ%ûÿƒÄ…À„Êþÿÿ_^ƒÈÿ]Ó<“<0=>ÌÌÌÌÌÌÌÌÌÌÌ̸è¶ ‹D$‹L$ S‹\$ VWjÿPQSÇD$èúÿÿƒÄ‹ðT$ VRè¥üÿÿ‹øƒÄƒÿÿujSèƒ%ûÿƒÄ…ÀuÜ‹F…Àt PèÏ$ûÿƒÄ‹F…Àt Pè/ä÷ÿƒÄVè&ä÷ÿƒÄ‹Ç÷Ø_À#D$^[YÃÌÌÌ̸Pè& ¡Àç3ĉD$L‹D$X‹L$`S‹\$XU‹l$dVW‰D$‰L$èzèÿÿ‹ð…ö„D‹>‹…Àt Pè²uüÿƒÄSè™ÊþÿƒÄ…Àu3jsh`\ jxjej'èà¹ûÿƒÄVèGèÿÿƒÄ_^]3À[‹L$L3ÌèÎ ƒÄPÃPèÙßûÿƒÄ‰…À„×èçHýÿ‰G…À„Ç‹L$T$RÇD$ PSQèNþÿƒÄ…Àu6h‰h`\ jfjej'èe¹ûÿƒÄVèÌçÿÿƒÄ_^]3À[‹L$L3ÌèS ƒÄPËT$‹NRD$ PQè!wüÿƒÄ …ÀtU‹MjST$R‹UD$(PQRè øûÿ‹D$(‹VPL$8QRèívüÿƒÄ$…Àt!‹|$…ÿt7‹F Pè•@ýÿW迉üÿƒÄ‰F …ÀuVè?çÿÿƒÄ_^]3À[‹L$L3ÌèÆ ƒÄPËL$\_‹Æ^][3Ìè± ƒÄPÃÌÌV‹t$ ‹‹W‹|$ ‹‹QPè·ìûÿƒÄ…Àu$‹N‹WQRèc‰üÿƒÄ…Àu‹F‹OPQèO‰üÿƒÄ_^ÃÌÌÌÌÌÌÌÌÌV‹t$ ‹‹W‹|$ ‹‹QPègìûÿƒÄ…Àu8‹N‹WQRè‰üÿƒÄ…Àu$‹F‹OPQèÿˆüÿƒÄ…Àu‹V ‹G RPè+‚üÿƒÄ_^ÃÌÌÌÌÌ‹D$SUVWPèR!ûÿ‹èƒÄ…í„V‹L$‹T$‹D$ Çj:ÇUÇÿp! ‹ðƒÄ…ö„CÆFºT2 ‹Í›Š:u„ÛtŠY:ZuƒÁƒÂ„Ûuä3ÀëÀƒØÿ…Àu‹\$$‰ë>º<2 ‹ÍŠ:u„ÀtŠY:ZuƒÁƒÂ„Ûuä3ÀëÀƒØÿ…À…Í‹\$$Ç€>/…º€~/…°ƒÆj/V‹þÿp! ‹ðƒÄ…öuh± è] ûÿ‹L$$‰ëVèO ûÿ‹T$$‰Æ‹D$$ƒÄƒ8tKj:Wÿp! ƒÄ…ÀtÆ@ëƒ;¸€\ u¸|\ Pè ûÿ‹L$ ƒÄ‰…ÀtWèüûÿ‹T$ƒÄ‰…Àuhøh`\ jAëUè+à÷ÿƒÄ_^]¸[Ãhüh`\ jyjrj'èI¶ûÿƒÄ…ít Uèüß÷ÿƒÄ‹D$ ‹…Àt Pèéß÷ÿƒÄ‹L$‹…Àt PèÖß÷ÿƒÄ‹T$‹…Àt PèÃß÷ÿƒÄ_^]3À[ÃÌÌÌÌÌÌÌÌÌSU‹l$ VW…íuè/üÿ‹è‹|$‹\$…ÿtWè›üÿW‹ðèGüÿƒÄ‹øë SèòýÿƒÄ‹ð3ÿSèy÷ýÿWPVUèPûÿÿƒÄ_^][ÃÌÌÌÌÌÌÌÌVèjäÿÿ‹ð…öt0‹…Àt PèèãÿÿƒÄ‹D$ ‰‹D$…Àt ‹‹QVR諎ûÿƒÄ…Àu Vè>äÿÿƒÄ3À^ËÆ^ÃÌÌÌVèj•þÿ‹ð…öt‹D$ PNQèFÎüÿƒÄ…Àu VèY•þÿƒÄ3À^ÃW‹|$ Ç‹‹B…Àt Pè8•þÿƒÄ‹‰p_¸^ÃÌÌÌÌÌÌÌÌV‹t$ƒ~uè°âÿÿ‰F‹v…öu3À^ÃW‹|$…ÿtBƒ~u è>ûÿ‰F…Àt‹FWPèíûÿƒÄ…Àu_3À^Ãh…h„\ jjƒÇWè Ð÷ÿƒÄ_¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌSU‹l$VWUè¢ðýÿ‹|$PWèÿÿÿƒÄ …ÀtIèâÿÿ‰G…Àt=‹\$ …Ûuèwüÿ‹Ø‹t$…ötcVUèöýÿƒÄ…Àu2h£h„\ jnjnj'èú³ûÿƒÄ‹OQèÞáÿÿƒÄÇG_^]3À[ËG‹‹P‹SVQRjPè×âÿÿPè1œüÿƒÄ…ÀtÃöD$(uFUWèÌþÿÿƒÄ…Àt®‹\$$S3öèéûÿƒÄ…À~%‹ÿVSèéûÿPWè¢þÿÿƒÄ…Àt„SFèÄûÿƒÄ;ð|Ý_^]¸[ÃÌÌÌ‹D$‹‰L$é¡“üÿÌ‹D$V‹p…öuhÌh„\ jljoj'è/³ûÿƒÄ3À^ËQèÀÞûÿƒÄ=mthÑh„\ jhjoj'è³ûÿƒÄ3À^Ãè…æÿÿ‹VPRèûýÿƒÄ^ÃÌÌÌÌÌÌ‹D$…ÀuƒÈÿË‹H ‰L$éûÿÌÌÌÌÌÌ‹D$…ÀuË‹B ‰D$é ûÿÌÌÌÌÌÌÌÌÌ‹D$…ÀuƒÈÿÃV‹t$…ö}3öëF‹SW‹x WèÉŒûÿƒÄ;ð})‹\$VWèÇŒûÿ‹QSèúÿÿƒÄ…ÀtWFè ŒûÿƒÄ;ð|Û_[ƒÈÿ^Ã_[‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌW‹|$…ÿuƒÈÿ_ËGS‹ƒûu3‹L$‹@…Ét‹‰V‹t$…öt‹@…Àt PèB’üÿƒÄ‰ëÇÿÿÿÿ^‹D$…Àt‹O‰‹D$…Àt‹W ‰‹Ã[_ÃÌÌÌÌÌ‹D$V‹t$jÿPVèÿÿÿƒÄ …À}3À^Ã…öu3Àë‹‹Q PRèï‹ûÿƒÄ‹L$ ‹T$Q‹L$R‹T$QRPèBÿÿÿ‹L$$ƒÄ…Ét‰¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸è&SUVD$WP¾ÿð ‹\$(SèXvüÿ‹l$4ƒÄ…ÀuhAh„\ j{ëz‹Å™D$L$T$QS‰D$‰T$èÁ þÿƒÄ…À~hIh„\ j~jsj'èÕ°ûÿƒÄ3ö‹D$0…À|A‹L$™+È‹D$‰L$L$QÂS‰D$èx þÿƒÄ…À}hSh„\ jjsj'茰ûÿƒÄ3ö‹|$(…ÿ„†Wè¥uüÿƒÄ…Àuh_h„\ jzë5‹L$‹Å™+È‹D$‰L$L$QÂW‰D$è þÿƒÄ…À}hgh„\ j}jsj'è"°ûÿƒÄ3öSWèF‡ýÿƒÄ…À}hoh„\ j|jsj'èú¯ûÿƒÄ3ö_‹Æ^][ƒÄÃÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‹Q‰T$éŠûÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹‹B‰D$éŠûÿÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$…ÀuËL$…Ét‹‹‰‹L$…Ét‹P‰‹L$ …Ét‹P‰‹L$…Ét‹@ ‰¸ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹L$3À9A•ÀÃÌÌÌVWèàÿÿ‹ð…öt]‹D$ ‹PQè–ŽüÿƒÄ…Àt@‹|$…ÿtFèrßÿÿ‰F…Àt,hmè!Õûÿ‹V‰‹FƒÀƒÄPè}âÿÿPWèF™ýÿƒÄ …ÀuVèÉßÿÿƒÄ_3À^Ã_‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌSUV‹t$‹W3ÿ9x uè:Šûÿ‹‰A ‹9z „èuáÿÿ‹ø…ÿ„ ‹L$(GPQèÝwüÿƒÄ…À„ò‹D$,…ÀtW RPèÀwüÿƒÄ…À„Õ‹Pè½Üÿÿ‹L$Qh@(h`(詆üÿƒÄ‰…À„¬‹D$‹_‰ƒètƒètƒè…è«7ýÿ‰Cës‹l$$…íu(h hœ\ jmjgj'èé­ûÿƒÄWèÐàÿÿƒÄ_^]3À[Ãè±ßÿÿ‹ð‰s…ötHVUè!wüÿƒÄ…Àt:‹\$ ƒûÿtèÌ5ýÿ‰F…Àt%SPèüÿƒÄ…Àt‹t$‹‹B WPè׆ûÿƒÄ…ÀuWèjàÿÿƒÄ_^]3À[ËÇ_^][ÃÌÌÌÌÌÌÌÌÌV‹t$ƒ~ uèàˆûÿ‰F …Àu^ËF W‹|$WP舆ûÿƒÄ…Àu_^ÃhÌhœ\ jjƒÇWè§È÷ÿƒÄ_¸^ÃÌÌÌÌÌÌÌÌÌÌÌ̸ èÖÿ¡Àç3ĉD$‹D$,‹L$0S‹\$,U‹l$ƒûÿ‹ø‹¹è€ýÿÿ‹T$(‹GjRPh´] VèêqþÿƒÄ…Àt:‹|$‹MGQ‰|$ èñ‚ûÿƒÄ;ø|®‹\$‹T$ ‹E jRPh ] Vè°qþÿƒÄ…Àu_^]3À[YÃ…ÛtR‹K‹QRVèPØüÿ‹CP3ÿ襂ûÿƒÄ…À~3‹KWQ褂ûÿPVèMãüÿ‹SWRè“‚ûÿPVèüÑýÿ‹CPGèr‚ûÿƒÄ$;ø|Í_^]¸[YøèæúS‹\$UV‹t$W‹{3íhˆ_ V‰l$‰l$è’ûÿƒÄ…Àާ‹PèˆüÿƒÄ¹|Õ¤$9„ƒƒÁù¬Õrí¹„] PQh`_ Vè+VûÿƒÄ…ÀŽ`;ýtJhL_ Vè1ûÿƒÄ…ÀŽF‹QVè½aüÿƒÄ…ÀŽ2‹RèúÒûÿƒÄ=mt h0_ VèõûÿƒÄ_^]¸[ƒÄËI눋GPèWýÿ‹OQè¾·þÿSèÈóÿÿƒÄ ‰D$;ńًЋ*‹EPèhØ^ VèóTûÿƒÄ…ÀŽ(‹M 3ÿQ‰|$$虀ûÿƒÄ…Àއ‹U WR蔀ûÿƒÄ…À„Y‹E WPè€ûÿ‹ø‹ƒÄ¹è¾úÿÿ…ÀŽÖ‹_‹ Qè{ûÿÿPhÄ^ VèTûÿƒÄ…ÀŽ´ƒ;u^‹[h¬^ VèaTûÿƒÄ…ÀŽ–‹RVè]×üÿƒÄ…À„‚‹C…Àt*Pèõ…üÿƒÄPPèKûÿÿƒÄPhˆ^ VèTûÿƒÄ…ÀŽQht^ VèTûÿƒÄ…ÀŽ;‹GPVè×üÿƒÄ…À„&ƒ t+h`^ VèÕSûÿƒÄ…ÀŽ ‹O QVèÐÖüÿƒÄ…À„õjh2 VèûÿƒÄ …À„Ý‹T$$‹GjRPhD^ Vè'nþÿƒÄ…À„¼jh2 VèÏûÿƒÄ …À„¤‹|$ ‹M GQ‰|$$èûÿƒÄ;øŒyþÿÿ‹T$$‹EjRPh0^ VèÑmþÿƒÄ…Àu‹D$‹H‹PQRVèxÔüÿƒÄ …À~Q‹\$‹C P3ÿèÂ~ûÿƒÄ…À~3‹K WQèÁ~ûÿPVèjßüÿ‹S WRè°~ûÿPVèÎýÿ‹C PGè~ûÿƒÄ$;ø|ÍÇD$‹L$QèØÿÿ‹D$ƒÄ_^][ƒÄÃÌÌÌÌÌÌ̸èæö¡Àç3ĉD$‹D$ƒ8‹@uPSè8åýÿƒÄ‹L$3ÌèåöƒÄÃ8t3À‹L$3ÌèÏöƒÄÃUVW‹xS3öè~ûÿƒÄ…À~]‹ïL$ +éIVSèù}ûÿƒÄT$ jR‹øèØüÿPWè±7þÿƒÄ¹D$ ëIƒùr1‹(;uƒéƒÀëìSFè¥}ûÿƒÄ;ð|®_^3À]‹L$3ÌèIöƒÄËL$ ‹Ç_^]3Ìè5öƒÄÃÌÌÌÌÌ̸èöõU‹l$ WUèZ}ûÿ‹øƒÄ‰|$…ÿh h _ jojkj'èè¢ûÿƒÄ_ƒÈÿ]YÃSVjUè4}ûÿ‹‹D$$¾ƒÄ;þÇ~VUè}ûÿ‹8WSè êÿÿƒÄ…ÀuF;t$|â‹T$^‰[_¸]YË ‹‹‹RQè®ÖûÿƒÄ^÷Ø[À_ƒà]YÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸Dè6õ¡Àç3ĉD$@S‹\$LU‹l$TVW‹|$`…í„S‹E‹QèÈÍûÿPèÒÈûÿPèüûÿ‹ðƒÄ …öu.h2h _ jwjmj'èþ¡ûÿƒÄ_^]ƒÈÿ[‹L$@3ÌèôôƒÄDÃVèzýÿ‹U‹øƒÄ9:…Ú‹E98…ÏSèÞýÿjL$QVPè°6þÿƒÄ…Àt®‹U‹J‹Çt$ƒÿr 뛋;…‘ƒèƒÁƒÆƒøsè…Àt Š:uyƒøvŠQ:VulƒøvŠA:Fu_L$jQè˜üÿPSèq5þÿ‹U‹JƒÄ‹Çt$ƒÿr‹;u2ƒèƒÁƒÆƒøsì…ÀtlŠ:uƒøvaŠQ:Vu ƒøvTŠA:FtL_^]3À[‹L$@3ÌèïóƒÄDÃW3öè({ûÿƒÄ…À~(VWè){ûÿ‹jPSè^þÿÿƒÄ…À~WFè{ûÿƒÄ;ð|Ù¸‹L$P_^][3Ìè óƒÄDÃÌjjÿV覹þÿƒÄ öF(t öF0 t¸Ãh\h _ jgjjj'è\ ûÿƒÄ3ÀÃÌÌÌÌÌÌöD$‹D$Pu‹D$‹H‹QRè„áýÿ‰ƒÄ¸ËD$PèoáýÿƒÄ…Àt‰¸Ã3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹SU‹l$ V‹pV‹ÙèÜûÿÿƒÄ…Àt ^‰E]¸[ÃöD$u‹_ Vè¹ûÿÿƒÄ…Àt ^‰E]¸[Ã^ÇE]3À[ÃÌÌÌÌÌÌÌÌ̸èvò‹D$‹S‹Y WÇD$èÎyûÿƒÄ…ÀhÞh _ jijlj'èbŸûÿƒÄƒÈÿ[YÃT$RSè.üÿÿƒÄ…À~TUVjWèyûÿW‹ðè…yûÿ‹l$ƒÄ ƒø~)jWèyûÿSUPè¹üÿÿƒÄ…À|tè{þÿÿ÷Ø^À]÷Ø[YÃSUVè˜üÿÿƒÄ ^][YøxèÆñW‹¼$€ƒu"hnh _ h€jtj'èÀžûÿƒÄ3À_ƒÄxË‹@…À„ˆƒ8…‹Œ$„‹@S‹œ$VSQPWt$è0þÿÿƒÄ…À!h{h _ jvjtj'èdžûÿƒÄ^[3À_ƒÄxÃøu ÷ÃtƒËöÃuG‹T$ URèèßýÿ‹ƒÄ‹ð‹G‹P‹VQRPè0ÍÿÿPè:‹üÿV‹èèÂüÿƒÄ…í]hˆh _ juëöÃ…ÆöÃt‹L$ ‹”$jQRD$Pë‹O‹Q‹D$ ‹Œ$RPQT$RèÚþÿƒÄ…Àuh–h _ j é5ÿÿÿD$jPè†ùýÿL$jQèJúýÿT$ Rè`þÿ‹ðD$$Pè¤õýÿƒÄ…ö@L$Qè£óýÿh¡h _ jejtj'‹ðèLûÿVè&5þÿPh€; jè9ŸûÿƒÄ(^[3À_ƒÄxÃ^[¸_ƒÄxÃhth _ hjtj'è ûÿƒÄ3À_ƒÄxÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸xèÆï‹Œ$€S‹œ$ŒU‹¬$„VWD$SP‹ýèÀüÿÿ‹ðƒÄ…öujUh _ jvjij'襜ûÿƒÄ_‹Æ^][ƒÄxÃþu÷Ãt ƒË‰œ$˜öË\$uQSè"Þýÿ‹M‹UƒÄ‹ø‹EWQRPèkÏÿÿPèu‰üÿW‹ðèýüÿƒÄ…öjbh _ jujij'è4œûÿƒÄ_‹Æ^][ƒÄxÊ„$˜¨…&‹Œ$”T$¨tjë‹E PSQRèÿýÿƒÄ…Àujoh _ j jij'èà›ûÿƒÄ_‹Æ^][ƒÄxÃD$jPè·÷ýÿL$QèþÿT$ R‹ðè!òýÿ‹øD$$PèÕóýÿƒÄ…ö6L$QèÔñýÿjzh _ jejij'‹Øè€›ûÿSèZ3þÿPh€; jèmûÿƒÄ(ëd‹œ$˜÷ÃuPUè³ûÿÿ‹ðƒÄ…öuFöà uAWèuûÿHPWè—uûÿVh´PèK9þÿƒÄƒøth”h _ jpjij'è›ûÿƒÄë¾…ÿth€WèµwûÿƒÄ_‹Æ^][ƒÄxÃÌÌÌÌÌÌÌÌ¡ÈÕPè«ûÿƒÄ…ÀuhÈÕPèC¨ûÿh`Öjè7¨ûÿƒÄÃÌÌÌ¡X×PèåªûÿƒÄ…ÀuhX×Pè¨ûÿhÀ×jè¨ûÿƒÄÃÌÌÌV‹t$öFt/‹FPè,Ä÷ÿƒÄƒ>u‹NQèÄ÷ÿ‹VRèÄ÷ÿ‹FPè Ä÷ÿƒÄ VèÄ÷ÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌV‹t$…öt#‹Fh _PèÙvûÿN QVj è}Þ÷ÿVèÇÃ÷ÿƒÄ^ÃÌÌU3í…öuh“h´d jCjmj(èä™ûÿƒÄ‹Å]Ãÿt ƒÿtƒÿu …Ûuh˜h´d jijmj(èµ™ûÿƒÄ‹Å]Ãhšh´d j è­Á÷ÿƒÄ …Àt‹T$ 3É9L$‰p•Á‰P‰8‰X ‰H]ÃÌÌÌÌÌÌÌÌÌ‹D$ UV‹t$WPQ‹úƒÍÿèYÿÿÿ‹ðƒÄ…ötJ‹|$ƒu èÑtûÿ‰G…Àt+‹T$‹D$ ‹L$$‰V‰F‰N‹WVRèkrûÿƒÄ…À_^H]ÃVè‰þÿÿƒÄ‹Å_^]ÃU‹l$VƒÎÿ…íuhÊh´d jCjlj(èÞ˜ûÿƒÄ‹Æ^]ÃW‹|$ …ÿuhÎh´d jCjlj(踘ûÿƒÄ_‹Æ^]À}S‹õt2‹p! ¾PWÿӃąÀth×h´d jhjlj(è}˜ûÿƒÄF€>uÔ‹L$0‹T$(‹\$4‹|$,‹t$QRèYþÿÿƒÄ‹ð[…ötF‹|$ƒu èÐsûÿ‰G…Àt'‹D$‹L$ ‰F‰n‰N‹WVRènqûÿƒÄ…À_^H]ÃVèŒýÿÿƒÄƒÈÿ_^]ÃÌÌ‹D$‹L$‹T$ S‹\$jP‹D$Q‹L$RPQº3ÉèdþÿÿƒÄ[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$3À…Ét(Qè ûÿƒÄ…Àuhh´d jAjgj(è”—ûÿƒÄ3ÀËL$‹T$S‹\$jQ‹L$R‹T$QPRº‹ÊèöýÿÿƒÄ[ÃÌ‹D$‹L$‹T$S‹\$P‹D$Q‹L$R‹T$PQRº3ÉèÁýÿÿƒÄ[ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹L$3À…Ét)Qè€ûÿƒÄ…Àuhh´d jAjjj(èô–ûÿƒÄƒÈÿËL$‹T$S‹\$Q‹L$R‹T$QRP‹D$ºPJÿèQýÿÿƒÄ[ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‹T$P‹D$Q‹L$jjR‹T$P‹D$QRPè„ýÿÿƒÄ$ËD$SUVW3ö3ÿ3í3Û…ÀtPèÖÿúÿ‹ðƒÄ…öuh>ëX‹D$…ÀtPè¸ÿúÿ‹øƒÄ…ÿuhHë:‹D$ …ÀtPèšÿúÿ‹èƒÄ…íuhRë‹D$$…ÀtVPè|ÿúÿ‹ØƒÄ…ÛuGh\h´d jAjnj(èî•ûÿƒÄ…öt Vè¡¿÷ÿƒÄ…ÿt W蔿÷ÿƒÄ…ít U臿÷ÿƒÄ_^]ƒÈÿ[ËD$,‹L$(‹T$PQjjSUWVRè üÿÿƒÄ$_^][ÃÌÌÌÌÌÌÌÌS‹\$ UW3ÿƒÍÿ;ßuh“h´d jCjmj(èk•ûÿƒÄ_‹Å][ÃVhšh´d j è`½÷ÿ‹ðƒÄ ;÷tP‰^‹\$‰~‰~lj~ 9{u è·pûÿ‰C;Çt ‰~‰~‰~‹CVPè]nûÿƒÄ;Ç^_]H[ÃVèzúÿÿƒÄ‹Å^_][ËL$3À…Ét)QèPþúÿƒÄ…Àuh{h´d jAjfj(èÄ”ûÿƒÄƒÈÿÃSjjjjP‹D$3ÛPSKè1ûÿÿƒÄ[ÃÌÌÌÌÌÌÌÌÌÌÌÌS‹\$ UW3ÿƒÍÿ;ßuh“h´d jCjmj(èk”ûÿƒÄ_‹Å][ÃVhšh´d j è`¼÷ÿ‹ðƒÄ ;÷tP‰^‹\$‰~‰~lj~ 9{u è·oûÿ‰C;Çt ‰~‰~‰~‹CVPè]mûÿƒÄ;Ç^_]H[ÃVèzùÿÿƒÄ‹Å^_][ËL$3À…Ét)QèPýúÿƒÄ…Àuh“h´d jAjej(èÄ“ûÿƒÄƒÈÿÃSjjjjP‹D$3ÛPSKè1úÿÿƒÄ[ÃÌÌÌÌÌÌÌÌÌÌÌ̸èfæ¡Àç3ĉD$‹D$‹‹IS‹\$(U‹l$(W…ÉtSUPÿÑƒÄ ‹ø_][‹L$3ÌèVæƒÄ÷Ød ‹Ôd Š Úd f‰D$·Ðd ‰T$‹Ìd ˆL$¹:‰T$f‰D$f‰L$ …íu_]3À[‹L$3ÌèþåƒÄËÅPŠ@„Éuù+ÂVp…Ût‹ÃPd$Š@„Éuù+Âth±ƒÆh´d VèÀº÷ÿVT$$‹øRWèûúÿVUWèJûúÿƒÄ$…ÛtVD$ PWè7ûúÿVSWè/ûúÿƒÄVL$QWè ûúÿ‹L$0ƒÄ ^‹Ç_][3ÌègåƒÄÃÌÌÌÌÌÌÌÌ‹L$‹T$‹A‰QÃ̸ èå‹L$,‹3À‰$‰D$‰D$‰D$ ‰D$‰D$‰D$‰D$‹D$$Ç$‰D$‹B…Àt$RQÿЃÄ…ÀuƒÈÿƒÄ Ã3ÀƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌUV‹t$ ‹‹@3í…ÀtVÿЃÄ…Àu^ƒÈÿ]Ã÷FtVhàgèË©ûÿƒÄ‹NSWQ3ÿèÛkûÿƒÄ…À~4d$‹9kt‹VWRèÏkûÿP‹CVÿЃÄ…Àt{‹NQGè§kûÿƒÄ;ø|Ћ‹B …ÀtVÿЃÄƒøÿt[…ÀtR3í‹FP3Ûè{kûÿƒÄ…À~Hd$‹>ƒt‹NSQènkûÿ‹WPVÿ҃ăøÿt…Àt3í‹FPCè?kûÿƒÄ;Ø|Èë ƒÍÿë½þÿÿÿ‹‹A_[…ÀtVÿЃÄ…À„ÿÿÿ^‹Å]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$…Òuh)h´d jCjoj(è“ûÿƒÄƒÈÿËD$ƒèt(ƒèth<h´d jjjoj(èiûÿƒÄƒÈÿËBƒàËJ‹ÁÁèƒàƒ|$ t ɉJÃáÿþÿÿ‰JÃÌÌÌÌÌ‹D$‹L$‹T$ P‹D$ Q‹L$ RPQj è`Ó÷ÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ‹T$ƒÂ ‰T$éÀÔ÷ÿ‹L$ƒÁ ‰L$éPÕ÷ÿ‹D$£| ÃÌÌÌÌÌÌ¡| …Àu è²£| ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‰ÃÌÌÌÌÌVhmh´d jèž·÷ÿ‹ðƒÄ …öt'3À‰‰F‰F‰F ‰F‰F‰F‹D$PèÕøúÿ‰ƒÄ‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌV‹t$‹Pè¹÷ÿVÇè÷¸÷ÿƒÄ^ÃÌÌ‹D$…Àt ‹L$‰H3ÀÃÈÿÃÌÌÌÌÌÌÌÌÌÌ‹D$…Àt ‹L$‰H3ÀÃÈÿÃÌÌÌÌÌÌÌÌÌÌ‹D$…Àt ‹L$‰H 3ÀÃÈÿÃÌÌÌÌÌÌÌÌÌÌ‹D$…Àt ‹L$‰H3ÀÃÈÿÃÌÌÌÌÌÌÌÌÌÌ‹D$…Àt ‹L$‰H3ÀÃÈÿÃÌÌÌÌÌÌÌÌÌÌ‹D$…Àt‹@Ã3ÀÃÌ‹D$…Àt‹@Ã3ÀÃÌ‹D$…Àt‹@ Ã3ÀÃÌ‹D$…Àt‹@Ã3ÀÃÌ‹D$…Àt‹@Ã3ÀÃÌ‹D$…ÀuË@ÃÌÌÌ‹D$…ÀuË@ÃÌÌÌ‹L$…Éu3À˃ètƒèuñ‹AÃÌÌÌÌÌ‹L$…Ét ‹Hƒøw‹A Ã3ÀÃÌÌÌÌÌÌÌÌÌ‹L$…Éu3À˃èuö‹AÃÌÌÌÌÌÌÌÌÌÌ‹L$…Ét ‹Hƒøw‹AÃÈÿÃÌÌÌÌÌÌÌÌ‹L$…Ét ‹Hƒøw‹AÃÈÿÃÌÌÌÌÌÌÌ̸$èVà¡Àç3ĉD$ S‹\$,UV‹t$8W‹|$@‹ÇP›Š@„Éuùƒcþ+‹è…ö„%‹…ÀŽ”ƒøޤƒø…‚‹F …Àu hpéPÆ€?„e‹p! ¾‹NPQÿӃąÀu)¾‹FRPÿӃąÀu7G8uÙ_^][‹L$ 3ÌèÏ߃Ä$ËN‹V Š_^]ˆ3À[‹L$ 3Ìè°ßƒÄ$ËN‹V Š_^]ˆ3À[‹L$ 3Ìè‘߃Ä$ËNQhX1 T$(j Rè;ûÿ‹FPhX1 L$(j Qè;ûÿƒÄ ;n}RƒKhRh´d jejij(è7Œûÿhød T$(Rhðd D$@PhÜd jèŽûÿƒÄ,_^]ƒÈÿ[‹L$ 3Ìè ߃Ä$ËF;è~/ƒKhZh´d jdjij(èÞ‹ûÿhød L$(Qhðd T$@R륋v …öuhch´d jijij(謋ûÿƒÄë“@PWVèôúÿƒÄ ‹L$0_^][3Ì3Àè•ÞƒÄ$ÃÌÌÌÌÌÌVjPh´d jè³÷ÿ‹ðƒÄ …öujSh´d jAjhj(èV‹ûÿƒÄ3À^ËD$…Àu¡| …Àu è)£| ‰F PVj ÇFÇFÇFèÁÎ÷ÿƒÄ ‹Æ^ÃÌÌÌÌÌÌÌÌÌÌV‹t$ …ö}hÎh´d jgjkj(èâŠûÿƒÄ3À^ÃW‹|$ ‹GPèeûÿƒÄ;ð|hÓh´d jfjkj(豊ûÿƒÄ_3À^ËOVQèÿdûÿƒÄ…Àtê‹Iƒùwâ‹@ _^ÃÌÌÌÌÌÌÌÌÌÌVjPh´d jè²÷ÿ‹ðƒÄ …öujSh´d jAjhj(èVŠûÿƒÄ3À^á| …Àu è1£| ‰F PVj ÇFÇFÇFèÉÍ÷ÿƒÄ ‹Æ^ÃÌ̸ØÃÌÌÌÌÌÌÌÌÌÌV‹t$ VèõÿýÿƒÀüƒÄƒøw&¡ˆ PVè®ûÿÿƒÄPÿ$! ‹ ˆ Qÿ8! ƒÄ ¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ è†Ü¡Àç3ĉD$V‹5T! W‹=p! SD$ jPÿÖL$j Qÿ׃Ä…Àtæ‹L$_^3ÌèqÜƒÄ ÃÌÌVWhÙh(e jj 諤÷ÿ‹5h¨v h‘h¥j,èðoûÿƒÄ3ÀËT$R‹T$R‹T$R‹T$R‹T$RjQÿЃÄ…Àu!hEh¨v hh¥j,èªoûÿƒÄ3ÀøÃh>h¨v jCh¥j,è†oûÿƒÄ3ÀËL$…Ét_‹…ÀtY‹@ …Àuhfh¨v jsjhj,èVoûÿƒÄ3ÀËT$ R‹T$ RjQÿЃÄ…Àuhlh¨v jfjhj,è%oûÿƒÄ3ÀøÃhfh¨v jCjhj,èoûÿƒÄ3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$…Étz‹…Àtt‹@…Àu!h˜h¨v h‘h¢j,èÀnûÿƒÄ3ÀËT$R‹T$R‹T$R‹T$R‹T$RjQÿЃÄ…Àu!hŸh¨v hŠh¢j,èznûÿƒÄ3ÀøÃh˜h¨v jCh¢j,èVnûÿƒÄ3ÀËL$…Étk‹…Àte‹@ …Àu!hÀh¨v h‡hžj,è nûÿƒÄ3ÀËT$ R‹T$ RjQÿЃÄ…Àu!hÆh¨v h„hžj,èémûÿƒÄ3ÀøÃhÀh¨v jChžj,èÅmûÿƒÄ3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌhÎh¨v j 试÷ÿƒÄ …Àt 3ɉ‰H‰HÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$…ö„€‹Hƒøwoÿ$…0‹FP軈üÿƒÄVè—÷ÿƒÄ^ËNQèüÿƒÄVèû–÷ÿƒÄ^ËVRèÝáûÿƒÄVèä–÷ÿƒÄ^ËFPèvùÿƒÄVèÍ–÷ÿƒÄ^ËNQè?ÓúÿƒÄVè¶–÷ÿƒÄ^üŒÓŒêŒêŒÌÌÌÌÌÌÌÌhh¨v jdèÏ”÷ÿƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌW‹|$…ÿuh4h¨v jCh‹j,èlûÿƒÄ3À_ÃV‹t$Fÿƒø w1‹Îá€SyIƒÉøA‹Æ™ƒâ»ÓãÂÁøŠ 8„Ù[t‹D·^_Ãh:h¨v h‚h‹j,è/lûÿƒÄ^3À_ÃÌÌÌÌÌÌÌW‹|$…ÿuhCh¨v jChŽj,èÿkûÿƒÄ3À_ÃV‹t$Fÿƒø w1‹Îá€SyIƒÉøA‹Æ™ƒâ»ÓãÂÁøŠ 8„Ù[t‹D·^_ÃhIh¨v h‚hŽj,èŸkûÿƒÄ^3À_ÃÌÌÌÌÌÌÌW‹|$…ÿuhQh¨v jChŒj,èokûÿƒÄ3À_ÃV‹t$Fÿƒø w1‹Îá€SyIƒÉøA‹Æ™ƒâ»ÓãÂÁøŠ 8„Ù[t‹D·^_ÃhWh¨v h‚hŒj,èkûÿƒÄ^3À_ÃÌÌÌÌÌÌÌW‹|$…ÿuh_h¨v jChj,èßjûÿƒÄ3À_ÃV‹t$Fÿƒø w1‹Îá€SyIƒÉøA‹Æ™ƒâ»ÓãÂÁøŠ 8„Ù[t‹D·^_Ãheh¨v h‚hj,èjûÿƒÄ^3À_ÃÌÌÌÌÌÌÌW‹|$…ÿuhnh¨v jCh“j,èOjûÿƒÄ3À_ÃV‹t$Fÿƒø wJ‹Îá€SyIƒÉøA‹Æ™ƒâ»ÓãÂÁøŠ 8„Ù[t hyh¨v jh“j,èùiûÿƒÄ^3À_ËT$‹D$RPèòÒúÿƒÄ‰D·…Àt^¸_Ãhvh¨v jAh“j,è·iûÿƒÄ^3À_ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌW‹|$…ÿuh‚h¨v jCh–j,èiûÿƒÄ3À_ÃV‹t$Fÿƒø wJ‹Îá€SyIƒÉøA‹Æ™ƒâ»ÓãÂÁøŠ 8„Ù[t hh¨v jh–j,è)iûÿƒÄ^3À_ËT$‹D$RPè2ÑúÿƒÄ‰D·…Àt^¸_ÃhŒh¨v jAh–j,èçhûÿƒÄ^3À_ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌW‹|$…ÿuh˜h¨v jCh”j,è¯hûÿƒÄ3À_ÃV‹t$Fÿƒø wJ‹Îá€SyIƒÉøA‹Æ™ƒâ»ÓãÂÁøŠ 8„Ù[t h£h¨v jh”j,èYhûÿƒÄ^3À_ËT$Rè‡}üÿƒÄ‰D·…Àt^¸_Ãh h¨v jAh”j,èhûÿƒÄ^3À_ÃÌÌÌÌW‹|$…ÿuh¬h¨v jCh•j,èïgûÿƒÄ3À_ÃV‹t$Fÿƒø wJ‹Îá€SyIƒÉøA‹Æ™ƒâ»ÓãÂÁøŠ 8„Ù[t h·h¨v jh•j,è™gûÿƒÄ^3À_ËT$Rè× ùÿƒÄ‰D·…Àt^¸_Ãh´h¨v jAh•j,è\gûÿƒÄ^3À_ÃÌÌÌÌU‹l$…íuhÀh¨v jChj,è/gûÿƒÄ3À]ÃW‹|$Gÿƒø wOSV‹÷æ€yNƒÎøF‹Ç™ƒâÂÁøº‹Î(ŠÓâ„Ðt‹L½Qè£÷ÿ²‹ÎÒâƒÄÇD½öÒ ^[‹D$‹L$PQWUèKüÿÿƒÄ_]ÃÌÌÌÌÌU‹l$…íuhÑh¨v jCh’j,èfûÿƒÄ3À]ÃW‹|$Gÿƒø wOSV‹÷æ€yNƒÎøF‹Ç™ƒâÂÁøº‹Î(ŠÓâ„Ðt‹L½Qè÷ÿ²‹ÎÒâƒÄÇD½öÒ ^[‹D$‹L$PQWUè{üÿÿƒÄ_]ÃÌÌÌÌÌU‹l$…íuhâh¨v jChj,èïeûÿƒÄ3À]ÃW‹|$Gÿƒø wOSV‹÷æ€yNƒÎøF‹Ç™ƒâÂÁøº‹Î(ŠÓâ„Ðt‹L½Qèc÷ÿ²‹ÎÒâƒÄÇD½öÒ ^[‹D$PWUè°üÿÿƒÄ _]ÃÌÌÌÌÌÌÌÌÌÌU‹l$…íuhóh¨v jCh‘j,èOeûÿƒÄ3À]ÃW‹|$Gÿƒø wOSV‹÷æ€yNƒÎøF‹Ç™ƒâÂÁøº‹Î(ŠÓâ„Ðt‹L½QèÃŽ÷ÿ²‹ÎÒâƒÄÇD½öÒ ^[‹D$PWUèÐüÿÿƒÄ _]ÃÌÌÌÌÌÌÌÌÌÌW‹|$…ÿt@Vhh¨v jèÅŒ÷ÿ‹ðƒÄ …öt‰>^_Ãh h¨v jAh«j,èdûÿƒÄ‹Æ^_Ãhh¨v jCh«j,èodûÿƒÄ3À_ÃÌÌÌÌÌÌÌÌW‹|$…ÿ„ ƒ?„—V3ö¤$‹‹=ÿ„…À„úHƒø ‡ä¶ˆœ—ÿ$Œ—…öuhh¨v jdè Œ÷ÿ‹ðƒÄ …ö„Ô‹‹P‹HR‹QRVèlùÿÿƒÄé™…öuhh¨v jdèÏ‹÷ÿ‹ðƒÄ …ö„ž‹‹H‹P‹QRPVèÿùÿÿƒÄë_…öuhh¨v jdè•‹÷ÿ‹ðƒÄ …öto‹‹H‹QRVè]ýÿÿë-…öuhh¨v jdèf‹÷ÿ‹ðƒÄ …ötG‹‹H‹QRVèÎýÿÿƒÄ ƒƒ?…ïþÿÿ‹8ÿuƒÀ‰‹Æ^_Ãh(ëh9ë hGëhSh¨v jAh˜j,èîbûÿƒÄƒ?t›‹‹ùÿt …Ét ƒÀ‰…Àuç‹8ÿuƒÀ‰^3À_Ãhih¨v jCh˜j,è›bûÿƒÄ3À_ÖL–†–µ–ÌÌÌÌÌÌÌÌÌ‹D$…Àtƒ8tPèŒ÷ÿƒÄ¸Ãhxh¨v jCh—j,èè(¡÷ÿ‹‹AƒÄ …ÀtVÿЃÄ…Àu Vè¬ßÿÿƒÄ3ö‹Æ^_ÃÌÌV‹t$…ö„VèÍQÿÿƒÄ…Àuh’h¨v j&h…j,è]ûÿƒÄ3À^ÃVèñƒÄ…Àu%h¢h¨v j&h…j,èò\ûÿVèüQÿÿƒÄ3À^ÃPèÿþÿÿƒÄ…Àuh¬h¨v j,h…j,èÀ\ûÿƒÄ3À^Ép^Ãh™h¨v jCh…j,èœ\ûÿƒÄ3À^ÃÌÌÌÌÌ‹L$…É„‘‹…À„‡‹@…Àuhh¨v jwjmj,è^\ûÿƒÄ3ÀËT$ VR‹T$RjQÿЋðƒÄ…öt0‹F…Àt)Whh¨v jƒÀjPè°w÷ÿ‹~Vè—îÿÿƒÄ‹Ç_^Ãh h¨v jijmj,èú[ûÿƒÄ3À^Ãhh¨v jCjmj,èÞ[ûÿƒÄ3ÀÃÌÌÌÌÌÌÌÌW‹|$…ÿ„Ú‹…À„Ѓxuhh¨v j}hªj,è›[ûÿƒÄ3À_ÃVhÎh¨v j è’ƒ÷ÿ‹ðƒÄ …ötkS‹\$3Àh)‰h¨v ‰Fj‰FCjPèãv÷ÿ‹T$0‹D$,RP‰^‹‹IVjWÿÑV‹øè³íÿÿƒÄ,[…ÿu:h7h¨v jpjdj,è[ûÿƒÄ^3À_Ãh%h¨v jAjdj,èùZûÿƒÄ^3À_Ã^¸_Ãhh¨v jChªj,èÑZûÿƒÄ3À_ÃÌÌÌÌÌÌÌÌÌÌ‹L$…ɄЋ…À„€‹@(…Àuhˆh¨v jzjsj,èŽZûÿƒÄ3ÀËT$VRQÿЋðƒÄ…öt0‹F…Àt)Wh‘h¨v jƒÀjPèçu÷ÿ‹~VèÎìÿÿƒÄ‹Ç_^ÃhŽh¨v jljsj,è1ZûÿƒÄ3À^Ãhˆh¨v jCjsj,èZûÿƒÄ3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$…É„‘‹…À„‡‹@ …Àuh½h¨v jvjlj,èÎYûÿƒÄ3ÀËT$ VR‹T$RjQÿЋðƒÄ…öt0‹F…Àt)WhÇh¨v j ƒÀjPè u÷ÿ‹~VèìÿÿƒÄ‹Ç_^ÃhÄh¨v jhjlj,èjYûÿƒÄ3À^Ãh½h¨v jCjlj,èNYûÿƒÄ3ÀÃÌÌÌÌÌÌÌÌ‹L$…É„‘‹…À„‡‹@…Àuh×h¨v jwjpj,èYûÿƒÄ3ÀËT$ VR‹T$RjQÿЋðƒÄ…öt0‹F…Àt)Wháh¨v j ƒÀjPè`t÷ÿ‹~VèGëÿÿƒÄ‹Ç_^ÃhÞh¨v jjjpj,èªXûÿƒÄ3À^Ãh×h¨v jCjpj,èŽXûÿƒÄ3ÀÃÌÌÌÌÌÌÌÌS‹\$…Û„è‹…À„Þƒxuhñh¨v j}jj,èNXûÿƒÄ3À[ÃVhÎh¨v j èE€÷ÿ‹ðƒÄ …öt33À‰‰F‰Fè=Çûÿ‰F…Àu$hþh¨v jAjj,èXûÿƒÄ^3À[Ãh÷ëáW‹|$hh¨v j GjPèfs÷ÿ‹T$0‹D$,RP‰~‹ ‹IVjSÿÑV‹øè6êÿÿƒÄ,…ÿuhh¨v jqjj,èšWûÿƒÄ_^3À[ËÇ_^[Ãhñh¨v jCjj,èvWûÿƒÄ3À[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$…ɄЋ…À„€‹@(…Àuheh¨v jzjyj,è.WûÿƒÄ3ÀËT$VRQÿЋðƒÄ…öt0‹F…Àt)Whnh¨v j ƒÀjPè‡r÷ÿ‹~VènéÿÿƒÄ‹Ç_^Ãhkh¨v jmjyj,èÑVûÿƒÄ3À^Ãheh¨v jCjyj,èµVûÿƒÄ3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$…É„‘‹…À„‡‹@…Àuhšh¨v jwjqj,ènVûÿƒÄ3ÀËT$ VR‹T$RjQÿЋðƒÄ…öt0‹F…Àt)Wh¤h¨v j ƒÀjPèÀq÷ÿ‹~Vè§èÿÿƒÄ‹Ç_^Ãh¡h¨v jjjqj,è VûÿƒÄ3À^Ãhšh¨v jCjqj,èîUûÿƒÄ3ÀÃÌÌÌÌÌÌÌÌS‹\$…Û„ñ‹…À„çƒxuh´h¨v j}h€j,è«UûÿƒÄ3À[ÃVhÎh¨v j è¢}÷ÿ‹ðƒÄ …öt63À‰‰F‰FèšÄûÿ‰F…Àu'hÁh¨v jAh€j,è[UûÿƒÄ^3À[ÃhºëÞW‹|$hÅh¨v j GjPèÀp÷ÿ‹T$0‹D$,RP‰~‹ ‹IVjSÿÑV‹øèçÿÿƒÄ,…ÿu!hÓh¨v jqh€j,èñTûÿƒÄ_^3À[ËÇ_^[Ãh´h¨v jCh€j,èÊTûÿƒÄ3À[ÃÌÌÌ‹L$…ɄЋ…À„€‹@(…Àuh(h¨v jzj|j,èŽTûÿƒÄ3ÀËT$VRQÿЋðƒÄ…öt0‹F…Àt)Wh1h¨v j ƒÀjPèço÷ÿ‹~VèÎæÿÿƒÄ‹Ç_^Ãh.h¨v jmj|j,è1TûÿƒÄ3À^Ãh(h¨v jCj|j,èTûÿƒÄ3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$…É„‘‹…À„‡‹@ …Àuh]h¨v jujkj,èÎSûÿƒÄ3ÀËT$ VR‹T$RjQÿЋðƒÄ…öt0‹F…Àt)Whgh¨v jƒÀ jPè o÷ÿ‹~VèæÿÿƒÄ‹Ç_^Ãhdh¨v jgjkj,èjSûÿƒÄ3À^Ãh]h¨v jCjkj,èNSûÿƒÄ3ÀÃÌÌÌÌÌÌÌÌ‹L$…É„‘‹…À„‡‹@…Àuhwh¨v jwjnj,èSûÿƒÄ3ÀËT$ VR‹T$RjQÿЋðƒÄ…öt0‹F…Àt)Whh¨v jƒÀ jPè`n÷ÿ‹~VèGåÿÿƒÄ‹Ç_^Ãh~h¨v jjjnj,èªRûÿƒÄ3À^Ãhwh¨v jCjnj,èŽRûÿƒÄ3ÀÃÌÌÌÌÌÌÌÌW‹|$…ÿ„Ô‹…À„ʃxuh‘h¨v j}jej,èNRûÿƒÄ3À_ÃVhÎh¨v j èEz÷ÿ‹ðƒÄ …ötkS‹\$3Àh›‰h¨v ‰Fj‰FC jPè–m÷ÿ‹T$0‹D$,RP‰^‹‹IVjWÿÑV‹øèfäÿÿƒÄ,[…ÿu:h©h¨v jqjej,èÉQûÿƒÄ^3À_Ãh—h¨v jAjej,è¬QûÿƒÄ^3À_Ã^‹Ç_Ãh‘h¨v jCjej,èŠQûÿƒÄ3À_ÃÌÌÌ‹L$…ɄЋ…À„€‹@(…Àuhêh¨v jzjvj,èNQûÿƒÄ3ÀËT$VRQÿЋðƒÄ…öt0‹F…Àt)Whóh¨v jƒÀ jPè§l÷ÿ‹~VèŽãÿÿƒÄ‹Ç_^Ãhðh¨v jmjvj,èñPûÿƒÄ3À^Ãhêh¨v jCjvj,èÕPûÿƒÄ3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌW‹|$…ÿ„¾‹…À„´ƒxuhh¨v j~j~j,èŽPûÿƒÄ3À_ÃVhÎh¨v j è…x÷ÿ‹ðƒÄ …ötR‹T$3À‰‰F‰F‹D$‰F‹D$‹‹IRPVjWÿÑV‹øè¾âÿÿƒÄ…ÿu:h3h¨v jrj~j,è"PûÿƒÄ^3À_Ãh%h¨v jAj~j,èPûÿƒÄ^3À_Ã^¸_Ãhh¨v jCj~j,èàOûÿƒÄ3À_ÃÌÌÌÌÌÌÌÌÌ‹L$…Étv‹…Àtp‹@…ÀuhRh¨v jxjoj,è¦OûÿƒÄ3ÀËT$ VR‹T$RjQÿЃÄ…Àt‹p…ötPÇ@èõáÿÿƒÄ‹Æ^ÃhYh¨v jkjoj,èYOûÿƒÄ3À^ÃhRh¨v jCjoj,è=OûÿƒÄ3ÀÃÌÌÌÌÌÌÌW‹|$…ÿ„Í‹…À„Ãxu"hyh¨v h‰hj,èøNûÿƒÄ3À_ÃVhÎh¨v j èïv÷ÿ‹ðƒÄ …ötX‹T$3À‰‰F‰F‹D$‰F‹D$‹‹IRPVjWÿÑV‹øè(áÿÿƒÄ…ÿuChh¨v h†hj,è†NûÿƒÄ^3À_Ãhh¨v jAhj,èfNûÿƒÄ^3À_Ã^¸_Ãhyh¨v jChj,è>NûÿƒÄ3À_ÃÌÌÌÌÌÌÌ‹L$…É„‚‹…Àt|‹@…Àu!h¬h¨v hˆhŸj,èüMûÿƒÄ3ÀËT$ VR‹T$RjQÿЃÄ…Àt‹p…ötPÇ@èKàÿÿƒÄ‹Æ^Ãh³h¨v h…hŸj,è©MûÿƒÄ3À^Ãh¬h¨v jChŸj,èŠMûÿƒÄ3ÀÃÌÌÌÌFÿƒø ww‹Îá€SyIƒÉøA‹Æ™ƒâ»ÓãÂÁøŠ 8„Ù[tMFÿƒø wE¶0­ÿ$• ­jjVWèÝåÿÿƒÄÃjjVWènæÿÿƒÄÃjVWèçÿÿƒÄ ÃjVWè”çÿÿƒÄ Ãè¬÷¬­­ÌÌÌÌÌW‹|$…ÿtV3öd$FèJÿÿÿƒþ |õWèv÷ÿƒÄ^¸_ÃÌÌÌÌVjAhÄv jDè±t÷ÿ‹ðƒÄ …ötjDjVèöŸ‹D$Pèôµúÿ‰ƒÄ‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌV‹t$…öt‹Pèv÷ÿVÇèv÷ÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‰A¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‰A ¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‰A¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‰A¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‰A ¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‰A$¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‰A4¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‰A@¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹@ÃÌÌÌÌÌÌÌÌ‹D$‹@ÃÌÌÌÌÌÌÌÌ‹D$‹@ ÃÌÌÌÌÌÌÌÌ‹D$‹@,ÃÌÌÌÌÌÌÌÌ‹D$‹@8ÃÌÌÌÌÌÌÌÌ‹D$‹@<ÃÌÌÌÌÌÌÌÌ‹D$‹@@ÃÌÌÌÌÌÌÌ̸àÛÃÌÌÌÌÌÌÌÌÌÌÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌhªhw h€h‡j,è•JûÿƒÄ3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌh¿hw h€hŠj,èeJûÿƒÄ3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌhÇhw h€h©j,è5JûÿƒÄ3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌhÍhw h€h†j,èJûÿƒÄ3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸ èÆœ‹D$SUVW3öjP‰t$‰t$ÇD$ èäÌÿÿ‹\$,ƒÄ3í‹ø;Þu%hhw jChˆj,èIûÿƒÄ_^]3À[ƒÄ Ã;þuhhw hëÒƒ{ÿuM‹KQè¼#ûÿƒÄ…À~=ëI‹SVRè¶#ûÿ‰D$‹D$PQèå%ûÿƒÄ…À}‹SRFè„#ûÿƒÄ;ð|Íë‰C‹C…À|‡P‹CPèw#ûÿ‹s‰D$‹QèX#ûÿƒÄ ;ð}I‹VRèW#ûÿP‹D$ PèüèÿÿƒÄ…Àt-‹VQè<#ûÿ‹T$PRèéÿÿ‹èƒÄ…íu‹PFè#ûÿƒÄ;ð|¸‰s…í„ÿÿÿ‹VQè#ûÿ‹ƒÄ_^][ƒÄ ÃÌÌÌÌÌÌÌV‹t$ …öuhGhw jCh¨j,èoHûÿƒÄ3À^ËF…Àt Pè{"ûÿƒÄVèr÷ÿƒÄ¸^ÃÌÌÌÌÌÌÌÌV‹t$ …öt‹FPè~"ûÿƒÄ9Ft3À^ø^ÃÌÌÌÌÌÌÌÌÌÌÌVhÜhw jèp÷ÿ‹ðƒÄ …öuhâhw jAh‰j,èÝGûÿƒÄ3À^Ã3À‰‰F‰FS‰F ‹D$WPèíâÿÿ‹ØƒÄ…Ûu/hêhw j,h‰j,èœGûÿ‹T$$ƒÄVRèþþÿÿƒÄ_[3À^ÃSèãÿÿ‹øƒÄ…ÿt9›ƒ~uhð™è@ûÿƒÄ‰F…ÀtC‹NWQèœ ûÿSèæâÿÿ‹øƒÄ …ÿuÍSèåÿÿƒÄ…Àu:Sèºäÿÿ‹T$ƒÄVRèŒþÿÿƒÄ_[3À^Ãh÷hw jAh‰j,èûFûÿƒÄëÆSè€äÿÿƒÄƒÈÿ_‰F‰F [‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$ ‹T$SVW‹|$PQRWè¤þÿÿ‹ðƒÄ…ötVWè´üÿÿVW‹Øè þÿÿƒÄ…Àt_^‹Ã[Ã_^3À[ÃÌÌÌÌÌÌÌÌjIhw jè‚n÷ÿƒÄ …ÀuËL$‹T$‰‹L$ ‰P‰HÇ@ ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌjahw jèBn÷ÿƒÄ …ÀuÃ3ɉ‰HÃÌÌ‹D$…Àt ‰D$éÏo÷ÿÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$‹ ‹D$…Éu‰ÃS‹XU‹(V3ÒWd$‹y‹1;ûw"r;õw;îu;ßt&‹Ñ‹I …Éuà‰H _^]‰B [ÉH …Òuñ‹L$_^]‰[Ã_^]3À[ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹…Àt‹P ‰ËL$‹ 3À…ÉuËQ V‹t$ W‹|$…ÒtS‹;Þu‹Y;ßt ‹Ê‹Q …Òuêë‹Á[‹;Öu ‹Q;×u‹Á_^ÃÌÌÌ‹D$V‹0…öt W‹=¤! ‹N‹QRh8w ÿ׋v ƒÄ …öuè_^ÃÌÌÌ‹L$…Ét ‹…Àt‹P ‰Ã3ÀÃÌÌÌÌÌÌÌÌÌ¡4 …Àu èRXûÿ£4 ƒ=ÀÜt(h(ÜPÇÀÜè/Rûÿ¡4 hhÜPèRûÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌ¡4 …Àu èXûÿ£4 ‹L$‹T$ Q‹L$ R‹T$ QRPècDûÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¡8 …Àt Pèn÷ÿƒÄ‹D$PÇ8 èš­úÿ3ɃÄ…À•Á£8 ‹ÁÃÌÌÌÌÌÌÌ̃=ÀÜu.¡4 h(ÜPè÷Qûÿ‹ 4 hhÜQèæQûÿƒÄÇÀÜ¡8 …Àt PèŠm÷ÿƒÄ¸Ç8 ÃÌÌÌÌÌÌÌ¡8 V3ö;Æt Pè^m÷ÿƒÄ¡< ‰58 ;Æu.¡4 ;Æu èþVûÿ£4 hXh4y jjjePèeCûÿƒÄ3À^ÃPè˜ÔùÿƒÄ…Àu.¡4 ;Æu èÃVûÿ£4 h^h4y jljePè*CûÿƒÄ3À^É5< ‰5, ‰5 ‰5$ ‰50 ‰5( ‰5 ‰5 ¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌ3À9< •À|$Èt-¡4 …Àu è=Vûÿ£4 h†h4y jfjdPè¤BûÿƒÄ3ÀËL$…Éu-¡4 …Àu èVûÿ£4 hxh4y jCjdPèoBûÿƒÄ3ÀÃ…Àt-¡4 …Àu è×Uûÿ£4 h~h4y jdjdPè>BûÿƒÄ3ÀÃQèâýÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸<èö”¡Àç3ĉD$8‹D$@‹ Ly ‹Py S‹\$LV‹t$TW‹|$PV‰D$(ÇD$ÇD$$‰L$0‰T$4ÇD$èùÿ‰D$¡àÜPVè·ùÿ‹ƒÄ SƒÀT$RP‰L$4D$4PL$DQT$,RWD$@PL$LQT$DRD$dPL$Ch4y Pèýb÷ÿ‹ðƒÄ ‰t$<…öuhBë­L$ƒÄlÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹ñŠF<uz€>uuŠNƒÆF€ùui€>ud¶FƒÆ¶VFÁà ‹T$ ‰¶FF¶NFÁà Á‰¶FF¶NFÁà Á‰‹‹D$RFVPè‹ ‹‹D$QÖRPèƒÄ¸^Ã3À^ÃÌÌÌÌÌÌÌ̸(èfŒ¡Àç3ĉD$$¡dy ‹ hy Šly V‹t$0W‹|$8ƒÿ‰D$ ‰L$$ˆT$(|CD$PL$$QT$RD$ PL$QT$Rÿ ƒ|$uf‹D$‹L$ƒï‰‰NƒÆƒÿ}½…ÿt4T$RD$$PjjL$QT$Rÿ ƒ|$u%WD$PVè9ŒƒÄ _¸^‹L$$3ÌèÍ‹ƒÄ(ËL$,_^3Ì3À躋ƒÄ(ÃÌÌÌÌÌÌÌÌÌÌÌ‹D$…ÀtPèRb÷ÿYÃV3ö95< t$¡4 ;Æu è÷Kûÿ£4 hh4y jdé[¡8 ;Æu¸(y VVPVèJÏùÿƒÄ£< ;Æu¡4 ;Æu è°Kûÿ£4 hé‹ ÄÜQPè$ËùÿƒÄ£, ;ƄߋÜÜ¡< RPèËùÿƒÄ£ ;Æ„½‹ ÈÜ‹< QRèßÊùÿƒÄ£ ;Æ„š¡ÌÜ‹ < PQè½ÊùÿƒÄ£$ ;Æt|‹ÐÜ¡< RPèŸÊùÿƒÄ£0 ;Æt^‹ ÔÜ‹< QRè€ÊùÿƒÄ£( ;Æt?¡ØÜ‹ < PQèbÊùÿƒÄ£ ;Æt!h€ÁVVhpy Vè­ùÿƒÄ£àܸ^á4 ;Æu è—Jûÿ£4 h/h4y jgjfPèþ6ûÿ¡< ƒÄ;Æt Pè,ÈùÿƒÄ‰5< ‰5, ‰5 ‰5$ ‰50 ‰5( ‰5 ‰5 3À^ÃÌÌÌÌ̸< 膉¡Àç3ĉ„$8 SU‹¬$L ¸Ä V‹´$L ‰D$(‰D$3Û‹ÅW‰\$ ‰\$PŠ@:Ëuù+‹ø¸‰D$$‰D$ƒÿ@v1¡4 ;Ãu è¿Iûÿ£4 h¨h4y jkjgPè&6ûÿƒÄ3ÀéÕj@D$Hj Pèv‰WL$TUQèd‰h¯h4y hÈ èþ]÷ÿ‹èƒÄ$;ëu1¡4 ;Ãu èWIûÿ£4 h³h4y jAjgPè¾5ûÿƒÄ3Àém}WT$RD$LPL$HQT$(RD$HPL$8QT$DRD$0Pÿ, 9\$t:¡4 ;Ãu èîHûÿ£4 h¾h4y jhjgPèU5ûÿƒÄUè _÷ÿƒÄ3ÀéûŒ$„QT$0RWD$ PL$LQT$,RD$LPL$ÿÿƒÄ…À„‰h¶VèJÿÿƒÄ…ÀtwhÁVèXÿÿƒÄ…Àtehp¶VèÆåÿÿƒÄ…ÀtSh@·VèTÿÿƒÄ…ÀtAhpÃVèÒ1ÿÿƒÄ…Àt/hÆVè°åÿÿƒÄ…Àthy Vè^ÿÿƒÄ…Àt èìÿÿ¸Ã3ÀÃÌÌÌÌÌÌÌÌÌVèjÿÿ‹ð…ötèÿþÿÿV…Àu èuÿÿƒÄ^ÃèÛ#ÿÿVèeÿÿƒÄ^éœ1ûÿÌÌÌÌÌÌÌÌÌÌÌÌ¡@…Àu èDûÿ£@ƒ=Þt(h@ÝPÇÞèï=ûÿ¡@hˆÝPèß=ûÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌ¡@…Àu èÂCûÿ£@‹L$‹T$ Q‹L$ R‹T$ QRPè#0ûÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¡L…Àt PèÁY÷ÿƒÄ‹D$PÇLèZ™úÿ3ɃÄ…À•Á£L‹ÁÃÌÌÌÌÌÌÌ̸覂SUV3öW95Ht$¡@;Æu è*Cûÿ£@hÀhø{ jdék¡L;Æu¸ z VVPVè}ÆùÿƒÄ£H;Æu¡@;Æu èãBûÿ£@hÉé$‹ ´ÞQPèWÂùÿƒÄ‰D$;Æ„ð‹¸Þ¡HRPè6ÂùÿƒÄ‰D$;Ƅϋ ¼Þ‹HQRèÂùÿ‹èƒÄ;¡ÀÞ‹ HPQèõÁùÿ‹ØƒÄ;Þ„‹ÄÞ¡HRPèÖÁùÿ‹øƒÄ;þtu‹ ÈÞ‹HQRèºÁùÿ‹ðƒÄ…ötW¡ÌÞ‹ HPQèŸÁùÿƒÄ…Àt>‹T$‹L$‰=P_‰5h^‰-d]‰`£T‰X‰ \¸[ƒÄÃ3ö¡@;Æu èºAûÿ£@hØhø{ jojgPè!.ûÿ¡HƒÄ;Æt PèO¿ùÿƒÄ_‰5H‰5P‰5X‰5\‰5`‰5d‰5T‰5h^]3À[ƒÄÃÌÌ¡L…Àt PèW÷ÿƒÄƒ=ÞÇLu/¡@h@ÝPè›;ûÿ‹ @hˆÝQèŠ;ûÿ¸ƒÄ£ÞøÃÌÌÌÌÌÌ3À9H•À|$Èt-¡@…Àu èÍ@ûÿ£@hThø{ jgjdPè4-ûÿƒÄ3ÀËL$…Éu-¡@…Àu è˜@ûÿ£@hGhø{ jCjdPèÿ,ûÿƒÄ3ÀÃ…Àt-¡@…Àu èg@ûÿ£@hMhø{ jdjdPèÎ,ûÿƒÄ3ÀÃQè²üÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌhÑhø{ jj èýG÷ÿƒÄ3Àë›94ÅD t @=|ïë ÇÅ@ hÝhø{ jj è¿G÷ÿƒÄ3ÀÃÌÌÌÌÌÌÌÌÌSVWhçhø{ jj ‹ù3Ûè–G÷ÿƒÄ3ö9<õD t Fþ|îë'‹õD <õD PÿT‹ØƒÄ…Ûu ‰õ@ ‰høhø{ jj èBG÷ÿƒÄ_^‹Ã[ÃÌÌÌÌÌÌÌÌÌ‹D$‹H‹T$Éɉ 3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌ‹T$3É9J~:SV‹t$W‹¶|ˆ¶\ˆˆÁç û¶X¶Áç ûÁç ø‰>AƒÆ;J|Ð_^[3ÀÃÌÌÌÌÌÌÌÌV‹t$W‹|$ý™ƒâÂÁø;F~ PVèJÆøÿƒÄ‹ÇÁè3ɉF…À~5‹D$ëI¶P¶xÁâ ×¶xÁâ ×¶8Áâ ׋>‰AƒÀ;N|Ô_3À^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌW3ÿ9=Hu.¡@;Çu èG>ûÿ£@hhø{ jojePè®*ûÿƒÄ‹Ç_ÃSV3Û¾D ‹FüƒètƒèuCë‹PÿTƒÄ;ÇuD‰~ü‰>ƒÆþD|Ð;ßt`¡@;Çu èÜ=ûÿ£@hhø{ jfjePèC*ûÿƒÄ^[‹Ç_á@;Çu è¬=ûÿ£@hhø{ jejePè*ûÿƒÄ^[‹Ç_Ãÿd…Àth#hø{ jhjeèùÿÿƒÄ^[‹Ç_Ë HQè»ùÿƒÄ…Àuh)hø{ jsjeènùÿÿƒÄ^[‹Ç_Ã^[‰=H‰=T‰=P‰=X‰=\‰=`‰=d‰=h¸_ÃÌÌÌÌÌÌÌÌÌÌÌÌSU‹l$ Whdhø{ jj 3Û3ÿè²D÷ÿƒÄÿ¨! 9D„ë£DÿdSÿ`‹øƒÄ;ût5¡@;Ãu è”<ûÿ£@h~hø{ jkjfPèû(ûÿƒÄ‰DéÖhÀÎhpÎhPÎÿh‹øƒÄ ;ût!¡@;Ãu èA<ûÿ£@h‰hø{ jr뫸D ‰Xü‰ƒÀ=D|ñUÿP‹øƒÄ;ût$¡@;Ãu èü;ûÿ£@hŸhø{ jsécÿÿÿÇ@ ‹E£D ë;3À¹9 Å@ tGÁ=|îV3ö›9õ@ tCñþ|í¿^hÈhø{ jj èdC÷ÿƒÄ‹Ç_][Ë ÅD ÇÅ@ ‰MëÍUÿPƒÄ‹ø;ût,¡@;Ãu èF;ûÿ£@h½hø{ jsjfPè­'ûÿƒÄëÇõ@ ‹U‰õD évÿÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èVzU‹l$V‹ñVÇD$è0ÀøÿƒÄ;°Þ~>¡@…Àu èÇ:ûÿ£@hehø{ jtjhPè.'ûÿ‹D$,PVWSUè@¾øÿƒÄ(^]ƒÄÃL$QèýÿÿƒÄ…Àt>¡@…Àu èx:ûÿ£@hmhø{ jijhPèß&ûÿ‹T$,RVWSUèñ½øÿƒÄ(^]ƒÄËD$jUVWSPÿXƒÄ…ÀtG¡@…Àu è":ûÿ£@hvhø{ jnjhPè‰&ûÿ‹L$è0úÿÿ‹L$,QVWSUè’½øÿƒÄ(^]ƒÄËt$è°ùÿÿ…Àt hhø{ jqjhèùõÿÿ‹D$ƒÄ^]ƒÄÃ^¸]ƒÄÃ̸èy$Pè­üÿÿƒÄ…Àt1¡@…Àu èˆ9ûÿ£@h”hø{ jijiPèï%ûÿƒÄ¸YËL$‹T$ ‹D$jQ‹L$ R‹T$ P‹D$ Q‹L$ R‹T$PQRÿ\ƒÄ$…Àt:¡@…Àu è 9ûÿ£@hhø{ jmjiPè‡%ûÿ‹L$ƒÄè+ùÿÿ¸YÃV‹t$èºøÿÿ‹ð…öt*¡@…Àu èÖ8ûÿ£@h¦hø{ jqjiPè=%ûÿƒÄ‹Æ^YÃÌÌÌÌÌU3í9-Hu.¡@…Àu è—8ûÿ£@hhø{ jojkPèþ$ûÿƒÄ‹Å]ÃSV‹t$W‹~ …ÿtP‹V$…ÒtI‹N(…ÉtB‹F,…Àt;‹\$P‹FQRW‹|$(PWSèþÿÿƒÄ=u>èNVùÿ‹L$ ‹PQVWSÿÒƒÄ_^[]Ë~…ÿt+‹N…Ét$‹D$ ‹T$‹\$PRèøüÿÿƒÄ…Àu4_^[¸]á@…Àu èÙ7ûÿ£@hhø{ jljkPè@$ûÿƒÄ_^[‹Å]ÃÌÌÌÌÌ̸èwSUVD$WPÇD$è°½øÿ‹t$L‹l$4‹L$H‹|$<‹\$8VUèuüÿÿƒÄ …Àt<‹|$@‹\$H÷ÿƒÄ¡p‰5€;Æu.¡l;Æu èÞ1ûÿ£lh•h¤} jijePèEûÿƒÄ3À^ÃPèx¯ùÿƒÄ…Àu.¡l;Æu è£1ûÿ£lhšh¤} jkjePè ûÿƒÄ3À^É5p‰5t‰5x‰5|¸^ÃÌÌÌÌ3À9p•À|$Èt-¡l…Àu è=1ûÿ£lh¸h¤} jgjdPè¤ûÿƒÄ3ÀËL$…Éu-¡l…Àu è1ûÿ£lh¬h¤} jCjdPèoûÿƒÄ3ÀÃ…Àt-¡l…Àu è×0ûÿ£lh±h¤} jdjdPè>ûÿƒÄ3ÀÃQè‚üÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸Tèöoƒ=pVÇD$uC¡l…Àu èv0ûÿ£lhÐh¤} jijgPèÝûÿ‹´$€ƒÄVèýÂøÿ‹D$ ƒÄ^ƒÄTËt$lSUWVè”ÂøÿVèÃøÿV‹øèÃøÿV‹ØèÃøÿV‹èèÃøÿ‹ÈƒÄ‰L$…Éu,¡l…Àu èû/ûÿ£lhÛh¤} jejgPèbûÿé&‹t$t‹F;G‹ÇëPWèV·øÿ‹L$ƒÄ…À„Ò‹F;C‹ÃëPSè4·øÿ‹L$ƒÄ…À„°‹F;E‹ÅëPUè·øÿ‹L$ƒÄ…À„Ž‹F;A‹Áë PQèð¶øÿƒÄ…À„pjLD$jPè/oVè‘´øÿ‹ ƒÀ™ƒâ‹ðÁþVjQèo‹VjRèo‹„$˜Pè`´øÿ‹ ƒÀ™ƒâ‹”$œÁø+ÈÎQR耹øÿ‹„$¨Pè3´øÿ‹ƒÀ™ƒâ‹”$¬Áø+ÈÎQRèS¹øÿ‹ƒÄ@‰D$4‰t$8‹V‰L$(‰t$,‹UjRèˆn‹|$‹VjPèyn‹œ$„SèÔ³øÿƒÀ™ƒâÂÁø‹Î+ÈMQSèú¸øÿ‹T$L‹E‹RPQT$HRÿxƒÄ4…Àt2høh¤} jjjgèÉùÿÿ‹´$ˆƒÄ_][VèÖÀøÿ‹D$ ƒÄ^ƒÄTËD$h‹PVQ謷øÿ‹´$„ƒÄ _][VÇD$ è¡Àøÿ‹D$ ƒÄ^ƒÄTál…Àu è×-ûÿ£lháh¤} jfjgPè>ûÿ‹´$ŒƒÄ_][Vè[Àøÿ‹D$ ƒÄ^ƒÄTÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌV3ö95pu.¡l…Àu èw-ûÿ£lh h¤} jijhPèÞûÿƒÄ‹Æ^ËD$‹H…Ét"‹@…Àt‹T$RP‹D$Q‹L$PQèüÿÿƒÄ^ál…Àu è-ûÿ£lhh¤} jhjhPèƒûÿƒÄ‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌ̸èFlSUVD$ WP3íèö²øÿ‹t$H‹|$D‹L$8‹T$4‹\$0VWQRSèüÿÿƒÄ…Àt7‹D$<‹L$8VWPQT$ RèûûÿÿƒÄ…ÀtVWD$PSSè¦ÍøÿƒÄ…Àt½L$QèP²øÿƒÄ_^‹Å][ƒÄÃÌÌÌ‹D$‹L$‹T$P‹D$Q‹L$RPQè¢ûÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‹T$ P‹D$ Q‹L$ RPQèrûÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¡èßPVèÔÿÿƒÄ…À„)‹ ìßQVèüÿÿƒÄ…À„h\ßVè6 ÿÿƒÄ…À„ûh”ßVèÌÿÿƒÄ…À„åhÄßVèÌÿÿƒÄ…À„Ïh°ÙVèäÿÿƒÄ…À„¹h ÚVèîÿÿƒÄ…À„£hÛVèXÌÿÿƒÄ…À„h@ÜVèâÿÿƒÄ…Àt{h|} VèÿÿƒÄ…ÀtièDIùÿ‹P‰`ß‹H‰ dß‹P ‰hß‹@£lßè,Ÿùÿ‹H‰ ˜ß‹P‰œß‹@ £ ßè=¼ùÿ‹H‰ Èß‹P‰Ìßèæõÿÿ¸Ã3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌVèºÿþÿ‹ð…ötèŸþÿÿV…Àu èÅÿÿƒÄ^Ãè+ ÿÿVèµÿÿƒÄ^éìûÿÌÌÌÌÌÌÌÌÌÌÌÌ¡„…Àu èb*ûÿ£„ƒ=°àtDhàPǰàè?$ûÿ¡„hPàPè/$ûÿ¶ „Ááh àj‰  àè$ûÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¡„…Àu èò)ûÿ£„‹L$‹T$ Q‹L$ R‹T$ QRPèSûÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¡œ…Àt Pèñ?÷ÿƒÄ‹D$PÇœèŠúÿ3ɃÄ…À•Á£œ‹ÁÃÌÌÌÌÌÌÌÌ¡œ…Àt Pè±?÷ÿƒÄƒ=°àÇœu;¡„hàPèË#ûÿ‹ „hPàQèº#ûÿh àjè®#ûÿ¸ƒÄ£°àøÃÌÌÌÌÌÌÌÌÌ̸èfhSU3íVW9-ˆt$¡„;Åu èê(ûÿ£„h†h jd顜;Åu¸ˆ UUPUè=¬ùÿƒÄ£ˆ;Åu¡„;Åu è£(ûÿ£„héÖ‹ `áQPè¨ùÿ‹ðƒÄ;õ„¤‹dᡈRPèø§ùÿ‹ØƒÄ;Ý„…‹ hወQRèØ§ùÿ‹øƒÄ;ýti¡lá‹ ˆPQè½§ùÿƒÄ;ÅtPT$R‰5Œ‰‰=”£˜ÿÖ…Àth¥h jljhèñýÿÿƒÄë@‹D$Pÿ˜_^]¸[Yá„;Åu èÈ'ûÿ£„h™h jjjhPè/ûÿƒÄ¡ˆ;ÅtPè]¥ùÿƒÄ‰-ˆ_^‰-Œ‰-‰-”‰-˜]3À[YÃÌÌÌÌ¡œV3ö;Æt Pèž=÷ÿƒÄ¡ˆ‰5œ;Æu.¡„;Æu è>'ûÿ£„h½h jjjgPè¥ûÿƒÄ3À^ÃPèØ¤ùÿƒÄ…Àu.¡„;Æu è'ûÿ£„hÂh jljgPèjûÿƒÄ3À^É5ˆ‰5Œ‰5‰5”‰5˜¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ3À9ˆ•À|$Èt-¡„…Àu è&ûÿ£„háh jhjdPèôûÿƒÄ3ÀËL$…Éu-¡„…Àu èX&ûÿ£„hÕh jCjdPè¿ûÿƒÄ3ÀÃ…Àt-¡„…Àu è'&ûÿ£„hÚh jdjdPèŽûÿƒÄ3ÀÃQèBüÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸pèFe¡Àç3ĉD$l‹D$tU‹l$|W‹¼$„‰D$$D$P‰L$‰T$ ‰|$ ÇD$$ÿŒ…Àt/¡„…Àu è•%ûÿ£„hþh jljiPèüûÿƒÄé•SVWèÌ·øÿWèV¸øÿW‰D$ èL¸øÿW‰D$0èB¸øÿW‹Øè:¸øÿ‹ðƒÄ…öu$¡„…Àu è3%ûÿ£„h h jfé&‹E‹L$;A‹Áë PQè–¬øÿƒÄ…À„å‹L$$‹A‹L$ ;A‹Áë PQèp¬øÿƒÄ…À„¿‹T$‹B;C‹Ãë PSèN¬øÿƒÄ…À„‹E;F‹Æë PVè0¬øÿƒÄ…À„‹D$ÇD$@‹QUè¯øÿ‹T$‹|$(‰D$L‹‹T$,‰D$P‹QRèñ®øÿ‹T$(ƒÄL$@‰D$L‹QR‰D$Xÿ‹øÿêØÿÿ„…ÿtGh&h jkjièúÿÿW„$€h4° Pÿì! Œ$ˆQh¨ jèwûÿ‹|$8ƒÄ(éÿ‹‹D$RPèn®øÿ‰D$@‹ U‰L$Hè©øÿƒÀ™ƒâÂÁøP‰D$@‹jRè›c‹ƒÄjL$4QjT$DR‰D$D‹D$(jPÿ”‹ø…ÿt4h7h jkjièvùÿÿWŒ$€h4° Qÿì! ”$ˆRéRÿÿÿ‹D$,‹L$0‹PQRèã¬øÿ‹|$ƒÄ ÇD$(ëFh!h jejièùÿÿ‹|$ ƒÄë*¡„…Àu è#ûÿ£„hh jgjiPèoûÿƒÄ‹D$Pÿ˜^[W艵øÿ‹L$x‹D$$ƒÄ_]3ÌèPbƒÄpÃÌVSè ¨øÿƒÀ™ƒâÂÁøƒÄ3ö‰¨t ‹ÿ@F¨uú‰‹hRh Pè7÷ÿƒÄ ‰G…Àu^ÃÆPSè­øÿƒÄ…öt‹OVjQèFbƒÄ ¸^ÃÌÌÌ̸xè¦a¡Àç3ĉD$t‹D$|S‹œ$„‰D$‹„$ˆUV3ö‰D$8‰L$‹Œ$”‰T$‹”$˜D$ P‰\$8‰L$$‰T$43í‰t$‰t$ ‰t$H‰t$P‰t$X‰t$`‰t$hÿŒ…Àt/¡„;Æu è¿!ûÿ£„hvh jljjPè&ûÿƒÄéW¿‰|$ èϧøÿ‹èèȧøÿ‹ð…ö„6…í„.‰|$@|$Dè©þÿÿ…Àu hé‹\$|$LèŽþÿÿ…Àu h’éå‹\$<|$Tèsþÿÿ…Àu h—éÊ‹\$$|$\èXþÿÿ…Àu hœé¯‹\$4|$dè=þÿÿ…Àu h¡é”‹L$‹A;E‹Åë PUèh¨øÿƒÄ…À„m‹T$‹|$8‹B‹OÁ;F‹Æë PVè=¨øÿƒÄ…À„B‹D$T$@RPÿ‹ØûêØÿÿ„ …ÛtCh·h jkjjèmöÿÿSŒ$ˆh4° Qÿì! ”$Rh¨ jèÅûÿƒÄ(é‹E‹L$PQ迪øÿ‰D$t‹UW‰T$|èn¥øÿƒÀ™ƒâÂÁøÀP‰D$<‹jPèé_‹ƒÄjT$0RjD$xP‰L$@‹L$ jQÿ”‹ø…ÿt@hÈh jkjjèÄõÿÿW”$ˆh4° Rÿì! „$Ph¨ jèûÿƒÄ(ëy‹L$(‹T$,‹QRPè%©øÿƒÄ ÇD$ëZh²h jejjèeõÿÿƒÄëBh§h jgjjèMõÿÿƒÄë*¡„…Àu è:ûÿ£„h€h jfjjPè¡ ûÿƒÄ_‹D$D…Àt PèO5÷ÿƒÄ‹D$L…Àt Pè>5÷ÿƒÄ‹D$T…Àt Pè-5÷ÿƒÄ‹D$\…Àt Pè5÷ÿƒÄ‹D$d…Àt Pè 5÷ÿƒÄ…öt V螤øÿƒÄ…ít U葤øÿƒÄƒ|$^][t ‹ $Qÿ˜‹L$t‹D$3Ìè^ƒÄxÃÌÌÌÌÌÌÌV‹t$‹FW3ÿ…À„ 9~ „9~$„÷9~(„î9~,„åPè“£øÿƒÀ™ƒâÂÁøƒÄ=€|‹F Pèt£øÿƒÀ™ƒâÂÁøƒÄ=€]‹N$QèU£øÿƒÀ™ƒâÂÁøƒÄ=€>‹V(Rè6£øÿƒÀ™ƒâÂÁøƒÄ=€‹F,Pè£øÿƒÀ™ƒâÂÁøƒÄ=€~$èÌ;ùÿ…Àt‹L$‹T$Q‹L$VR‹PQÿÒƒÄ_^ËF,‹N(‹V$P‹FQ‹L$R‹V PQ‹L$$èûÿÿƒÄ‹ø_^á„…Àu èVûÿ£„híh jijkPè½ ûÿƒÄ‹Ç_^ÃÌÌÌÌÌSV‹t$ WVès¢øÿ‹|$ ‹\$ƒÀ™ƒâÂÁøƒÄ=8SèO¢øÿƒÀ™ƒâÂÁøƒÄ=Wè3¢øÿƒÀ™ƒâÂÁøƒÄ=~'èè:ùÿ…Àt‹L$$‹T$ Q‹L$R‹PWQSVÿÒƒÄ_^[ËD$ ‹T$PWV‹Ëè¤öÿÿƒÄ _^[ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸hèÖ[¡Àç3ĉD$d‹D$lUV‹t$|W3ÿ‰D$ ‰|$è!®øÿ‹è…í„UL$ QÿŒ…Àt/¡„…Àu è*ûÿ£„h<h jljePè‘ûÿƒÄéSUèb®øÿUèì®øÿU‹Øè䮸ÿU‰D$,èÚ®øÿU‰D$4èЮøÿU‰D$0èÆ®øÿ‹øƒÄ…ÿu$¡„…Àu è¿ûÿ£„hIh jfé‹V ‹B;C‹Ãë PSè#£øÿƒÄ…À„M‹F‹@‹L$;A‹Áë PQèþ¢øÿƒÄ…À„(‹N‹A‹L$ ;A‹Áë PQèÙ¢øÿƒÄ…À„‹V‹B‹L$;A‹Áë PQè´¢øÿƒÄ…À„Þ‹F ‹@;G‹Çë PWè“¢øÿƒÄ…À„½‹V ÇD$8‹ QRèt¥øÿ‹V‰D$D‹‹\$$‰D$H‹ QRèZ¥øÿ‹V‰D$T‹‹\$0‰D$X‹ QRè@¥øÿ‹V‰D$d‹‹\$0‰D$h‹ QRè&¥øÿ‹T$0ƒÄ L$8‰D$T‹QR‰D$`ÿ‹ØûêØÿÿ„…Ût@hnh jkjeèTðÿÿSD$xh4° Pÿì! Œ$€Qh¨ jè¯ûÿƒÄ(é‹N ‹”$€‹D$$Q‰T$4‰D$8è[ŸøÿƒÀ™ƒâÂÁøP‰D$0‹jRèØY‹ƒÄjL$,QjT$¡¼PÿÄ‹ ¸Q螌ùÿƒÄ…Àu,¡ ;Çu èÉûÿ£ h€h´ƒ jhjePè0ûúÿƒÄ3ö¡¤;Çt PèleúÿƒÄ‰=¸‰=À‰=ĉ=ȉ=̉=Ô‰=؉=܉=à‰=Ð_‹Æ^ÃÌÌÌÌÌÌÌÌ‹D$HW¿=ˇÿ¶€¼ ÿ$…˜ ƒ=¸thŸh´ƒ jdjdèpýÿÿƒÄ3À_ËD$…Àuh¤h´ƒ jCjdèNýÿÿƒÄ3À_ÃPèýÿÿƒÄ_Ãh¬h´ƒ jj è©÷ÿ¡¤ƒÄ…ÀtPè‡dúÿƒÄǤV‹t$h²h´ƒ jN,WQèŸ÷ÿƒÄ;Ç~‰5¤ëhµh´ƒ jejdèÍüÿÿƒÄh·h´ƒ jj è7÷ÿƒÄ^‹Ç_Ãhºh´ƒ jj è÷ÿ‹T$(‰¬h¼h´ƒ jj èÿ÷ÿƒÄ ‹Ç_ÃhÀh´ƒ jj èå÷ÿ‹D$$£°hÂëÈhÆh´ƒ jj èÂ÷ÿ‹L$$‰ ´hÈë¤hÎh´ƒ jj èž÷ÿƒÄƒ|$t ƒ Ðâëƒ%ÐâïhÕh´ƒ jj èq÷ÿƒÄ‹Ç_ÃhÝh´ƒ jj èW÷ÿ‰=¨hßé:ÿÿÿhâh´ƒ jj è4÷ÿ3Ò9T$ h䕉¨éÿÿÿ¡ …Àu è- ûÿ£ hêh´ƒ jgjdPè”øúÿ3ÿƒÄ‹Ç_ÃIÄÿQ ˆ « Ï  tÿ9 e ÌÌÌÌÌÌÌ̸(èfJ¡Àç3ĉ„$$ƒ=¼‹„$,S‹œ$8U‹¬$@V‹´$<L$0W‰D$(‰L$ ÇD$$u1¡ …Àu è­ ûÿ£ h h´ƒ jjjiPè÷úÿƒÄ3Àé¼hh´ƒ jè ÷ÿ‹øƒÄ …ÿu1¡ …Àu èb ûÿ£ hh´ƒ jAjiPèÉöúÿƒÄ3Àéq‹ ¼T$,RD$$PWVQ‰\$@‰l$DÿԃąÀt=¡ …Àu è ûÿ£ hh´ƒ jfjiPèpöúÿ‹T$4RjèdøúÿƒÄ3Àé ƒ?uh#h´ƒ jmjiè"ùÿÿƒÄ3Àéê‹D$(Pè>iùÿ‹ $ãW‹ðQVèlùÿèÙøÿ‰FèÑøÿƒN< ‹V‰F‹BÀÀ‰D$$‹N‹‰T$ ‹F‹HÉɉL$,‹V‹L$0Q‰D$,‹T$$RD$0PQÿØƒÄ ƒøýth2h´ƒ jfjiè‰øÿÿ‹T$0R釋D$‹NÁèPQèžøÿ‹T$$‹FÁêRPèøÿ‹N‹QÒÒ‰T$$‹F‹‰L$ ‹V‹BÀÀ‰D$,‹N‹D$0P‰T$,‹L$$QT$0RPÿØƒÄ …Àt2h?h´ƒ jfjièý÷ÿÿ‹L$0Qjè÷úÿƒÄVèˆiùÿƒÄ3Àé°‹T$‹FÁê‰P‹F‹HƒÊÿ…É~‹Lˆü‹ƒé…Àu‹FP‹Fƒxè‹L$‹FÁé‰H‹F‹H…É~‹Lˆü‹ƒé…Àu‹FP‹Fƒxèè¬cûÿV‹øjWè±gûÿƒÄ …ÿu*¡ …Àu èìûÿ£ hNh´ƒ jnjiPèSôúÿƒÄ‹Ç‹Œ$4_^][3ÌèGGÄ(ÃÌÌÌÌÌ‹D$‹L$ ‹T$WP‹D$ QRPè†üÿÿ‹øƒÄ…ÿ„’ƒ?t4¡ …Àu èvûÿ£ h{h´ƒ jgjjPèÝóúÿWè‡hûÿƒÄ3À_ÃVhmh´ƒ j j è÷ÿ‹w è$kùÿ‰G ‹N‰H‹W ‹Fhth´ƒ ‰Bj j ÇFÇFèá÷ÿVèûgùÿƒÄ$^‹Ç_ÃÌÌ̸èFF¡Àç3ĉ„$ƒ=¼SU‹¬$(D$ W‹Ù‹ú‰D$ ÇD$uD¡ …Àu è£ûÿ£ h˜h´ƒ jjjkPè óúÿƒÄ_]3À[‹Œ$3ÌèÿEÄËOQVèóøÿ‹W‹?‹M‹C‹m‹‰|$$‹~ÿÿ‰|$ ‹>‰|$|$WÒÒ|$ WR‹T$0RÉÉQÀÀUP¡¼SPÿÈ‹L$DÁéƒÄ,‰N…É~‹LŠüƒÊÿ‹9ƒé…ÿuV9~ï…À}tƒøþ¡ u…Àu èÐûÿ£ h°h´ƒ jpë…Àu è´ûÿ£ h´h´ƒ jojkPèòúÿ‹D$ ƒÄPjè ôúÿƒÄ_]3À[‹Œ$3ÌèEÄËŒ$$_][3̸èäDÄÃÌ̸Dè¦D¡Àç3ĉ„$@S‹œ$PUV‹´$T3íD$LW‹¼$`‰D$ÇD$9-¼u1¡ …Àu è÷ûÿ£ hÌh´ƒ jjjmPè^ñúÿƒÄ‹Åé‹ $ãQWèWgùÿ‹èƒÄ…í„ò‹…ÿu¡ …Àu è¥ûÿ£ hÛéK‹WRVèŒøÿ‹N‹‹C‹ÉɉL$L$ Q‹M‰T$T$RÀQÀPSÿÌ‹L$0ÁéƒÄ‰N…É~‹LŠüƒÊÿ‹ÿ‹9ƒé…ÿuV9~ï…À½ƒøþ¡ u…Àu èûÿ£ hóh´ƒ jpë…Àu èøûÿ£ høh´ƒ jojmPè_ðúÿ‹D$,ƒÄPjèPòúÿƒÄ郄[ƒ „Qƒ$„Gƒ(„=ƒ,„3‹O‹QRVè‹øÿ‹W‹ ‹C‹_ ‹o$‰L$H‹J‹‰T$8‹S‹‰\$P‹]‹m‰l$0‹o(‹míí‰l$‹o(‹m‰l$‹o,‹}‹m‰l$@‹níí‰l$,‹.‰l$(ÿl$ Uÿl$,UW‹|$LW‹|$,W‹|$,W‹|$HÛÒÛSWÒR‹T$tR‹T$pÉÉQ‹L$dÀQÀP¡¼RPÿà‹L$hÁéƒÄD‰N…É~‹LŠüƒÊÿ‹9ƒé…ÿuV9~ï…À}:ƒøþuh#h´ƒ jpë h(h´ƒ jojmèÞñÿÿ‹D$(ƒÄPjèïðúÿƒÄë1¸ë,¡ …Àu èUûÿ£ hh´ƒ jijmPè¼îúÿƒÄ3À‹Œ$P_^][3Ìè°AÄDÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ ‹T$‹L$V‹t$Pè ûÿÿƒÄ^ÃÌÌÌÌ‹D$‹T$‹L$ V‹t$ PèéúÿÿƒÄ^ÃÌÌÌ̸ è&A¡Àç3ĉ„$‹„$L$‰ $‹ ¼V3öÇD$…ÉuB¡ …Àu è‡ûÿ£ hUh´ƒ jjjlPèîíúÿƒÄ‹Æ^‹Œ$3Ìèå@Ä ÃT$R‹”$RPQÿЃąÀ}rƒøþ¡ u…Àu è$ûÿ£ hbh´ƒ jpë…Àu èûÿ£ hgh´ƒ jojlPèoíúÿ‹D$ƒÄPjè`ïúÿƒÄ‹Æ^‹Œ$3ÌèW@Ä ËŒ$ ^3̸è<@Ä ÃÌÌÌÌÌÌÌÌÌ̸èö?¡Àç3ĉ$V‹t$…öt‹jPÿÜVè²÷ÿƒÄ ‹L$^3Ìèî?YÃÌèk ÷ÿ‹L$3Ò…À”‰‹ÂÃÌÌÌÌÌÌÌÌÌÌÌ‹D$‹h¡h´ƒ Qj è÷ÿƒÄ3ÀÃÌÌ‹D$‹h§h´ƒ Qj èè÷ÿƒÄÃÌÌÌÌ‹D$‹‰L$é± ÷ÿ̸èF?‹D$UV3Ò3ö‰T$…Àt‹H…Ét‹ñ‹…Ét‹Ñ‹@…Àt‰D$‹L$…Ét‹…Àt‹ð3Ò‹A…Àt‰D$‹l$…Òu5…öu9¡ …Àu èÿúÿ£ hÍh´ƒ jljfPèèëúÿƒÄ^ƒÈÿ]YÃ…ö„´VèP`ÿÿ‹ðƒÄ…ö„¹‹D$SWPhȃ Vè!Xÿÿ‹M‹T$,IQjR‹ØjSVèšSÿÿ‹ø‹D$4PVè=YÿÿjjjjVèÏZÿÿƒÄ@…ÿ|7Vè¢YÿÿƒÄ…À}jjjjVè­ZÿÿƒÄ…ÀuÞë‹D$ PŠ@„Éuù+‰EVè QÿÿSèõ÷ÿ‹EƒÄ_÷Ø[À÷Ø^H]YËL$‹EQ‹L$jPQÿ҃ĉE‹E÷ØÀ÷Ø^H]YÃÌÌÌÌÌÌÌÌÌÌÌ̸èÆ=¡Àç3ĉ„$ ‹„$‹Œ$S‰D$ ‹„$$U‹¬$ ƒËÿ3ÒVÇD$…Àt‹p…öt‹Ö‹@…Àt‰D$…Ét‹…Àt‹Ð‹I…Ét‰L$…ÒuE¡ …Àu èçýúÿ£ hh´ƒ jljhPèNêúÿƒÄ^]ƒÈÿ[‹Œ$ 3ÌèB=ÄÃWRè©^ÿÿ‹øƒÄ…ÿ„·…ítUh„ L$$hÿQ賘úÿƒÄT$RWèUÿÿ‹ðƒÄ…ö|C‹D$…Àt;Ph„ D$$hÿPè˜úÿL$#Qjh„ h˜Ð hÔƒ T$@RWè.SÿÿƒÄ,‹ð‹D$PWèNWÿÿƒÄ…ö| WèÁWÿÿƒÄ‹ðWèVOÿÿƒÄƒþþt…ö| €|$Ct 3Ûë ƒËÿ뻋Œ$_^]‹Ã[3Ìè\<ÄÃÌÌÌÌÌÌÌÌÌÌh=h´ƒ jj è÷ÿ‹D$ƒÄ…Àt‹…Àt‹L$Qh" P蜗úÿƒÄ hDh´ƒ jj èV÷ÿƒÄÃÌ̸èÆ;SUV3öW95¸t$¡ ;Æu èJüúÿ£ hh´ƒ jdép¡ä;Æu¸¨ƒ VVPVèùÿƒÄ£¸;Æu¡ ;Æu èüúÿ£ hé)‹ (ãQPèw{ùÿƒÄ‰D$;Æ„õ‹,㡸RPèV{ùÿƒÄ‰D$;Ƅԋ 0㋸QRè4{ùÿƒÄ‰D$;Æ„²¡4ã‹ ¸PQè{ùÿƒÄ‰D$;Æ„‘‹<㡸RPèòzùÿ‹èƒÄ;î„r‹ @㋸QRèÒzùÿ‹ØƒÄ;Þ„R¡Dã‹ ¸PQè³zùÿ‹øƒÄ;þ„3‹8㡸RPè”zùÿ‹ðƒÄ…ö„‹ H㋸QRètzùÿƒÄ…À„ôƒ=¨‹L$‹T$‰ À‹L$‰Ä‹T$‰ ȉ̉-ԉ؉=܉5УàuCè– ÷ÿ…Àt:è ÷ÿ…Àt1è¤ ÷ÿ…Àt(Çðâ@ Çôâ` Çøâ€ Çüâ  h¬¾¼èêÿÿƒÄ…ÀuhVh´ƒ jqjgèéÿÿƒÄ3öë_ƒ=$ãÿuh jjh,„ jèJ\ùÿƒÄ£$ã_^]¸[ƒÄÃ3ö¡ ;Æu èÕùúÿ£ h3h´ƒ jhjgPè<æúÿƒÄ¡¸;Æt PèjwùÿƒÄ_‰5¸‰5À‰5ĉ5ȉ5̉5Ô‰5؉5܉5à‰5Ð^]3À[ƒÄÃÌ¡ÈâPVè4ÑþÿƒÄ…À„2‹ ÌâQVè\ÑþÿƒÄ…À„hTâVè–íþÿƒÄ…À„hŒâVè™ÿÿƒÄ…À„îh°âVèZòþÿƒÄ…À„ØhðýVèDÑþÿƒÄ…À„Âh0 VèNÑþÿƒÄ…À„¬h`þV踙ÿÿƒÄ…À„–hPÿVèBÑþÿƒÄ…À„€h Vè¼åþÿƒÄ…Àtnhð Vèš™ÿÿƒÄ…Àt\hHƒ VèHÑþÿƒÄ…ÀtJè|ùÿ‹P‰Xâ‹H‰ \â‹P ‰`â‹@£dâ蔉ùÿ‹H‰ â‹P‰”âè çÿÿ¸Ã3ÀÃÌÌÌÌVèÍþÿ‹ð…ötèŸþÿÿV…Àu è%ÎþÿƒÄ^Ãè‹×þÿVèÎþÿƒÄ^éLåúÿÌÌÌÌÌÌÌÌÌÌÌÌ¡è…Àu èÂ÷úÿ£èƒ=¼ãtDhLãPǼãèŸñúÿ¡èhtãPèñúÿ¶ èÁáh¬ãj‰ ¬ãèsñúÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¡ì…Àt Pè‘ ÷ÿƒÄ‹D$PÇìè*Múÿ3ɃÄ…À•Á£ì‹ÁÃÌÌÌÌÌÌÌÌ¡ì…Àt PèQ ÷ÿƒÄƒ=¼ãÇìu;¡èhLãPèkñúÿ‹ èhtãQèZñúÿh¬ãjèNñúÿ¸ƒÄ£¼ãøÃÌÌÌÌÌÌÌÌÌ̃=ôt-¡è…Àu è™öúÿ£èh€h€… jdjfPèãúÿƒÄ3Àáì…Àu¸t… jjPjèàyùÿƒÄ£ô…Àu-¡è…Àu èFöúÿ£èhˆh€… jhjfPè­âúÿƒÄ3ÀË ÀãQPèªuùÿƒÄ£ð…Àu-¡è…Àu èöúÿ£èhh€… jgjfPègâúÿƒÄ3ÀøÃÌÌÌÌÌÌÌÌÌÌÌ¡ì…Àt Pè ÷ÿƒÄ¡ôÇì…Àu-¡è…Àu èõúÿ£èh›h€… jijePèâúÿƒÄ3ÀÃPè8sùÿƒÄ…Àu-¡è…Àu ècõúÿ£èh h€… jfjePèÊáúÿƒÄ3ÀÃÇôÇð¸ÃÌÌÌÌÌÌÌÌÌÌ3À9ô•À|$Èt-¡è…Àu èýôúÿ£èh¼h€… jejdPèdáúÿƒÄ3ÀËL$…Éu-¡è…Àu èÈôúÿ£èh°h€… jCjdPè/áúÿƒÄ3ÀÃ…Àt-¡è…Àu è—ôúÿ£èhµh€… jdjdPèþàúÿƒÄ3ÀÃQèýÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̃=ô‹D$ ‹H‹@u-¡è…Àu è?ôúÿ£èhÅh€… jijgPè¦àúÿƒÄ3ÀÉL$‰D$ ÿ%ðÌ̸èf3SD$P3ÛèzøÿƒÄ9ôu>¡è…Àu èàóúÿ£èhÅh€… jijgPèGàúÿT$ƒÄRèšyøÿƒÄ‹Ã[ƒÄËL$(‹T$$V‹t$8W‹|$(VQRWÿðƒÄ…Àto9ôu,¡è…Àu èwóúÿ£èhÅh€… jijgPèÞßúÿƒÄë;‹D$8‹L$4VPQT$RÿðƒÄ…Àt‹D$@PVL$QWWèJ”øÿƒÄ…Àt»_T$^RèòxøÿƒÄ‹Ã[ƒÄÃÌÌÌÌÌÌÌ̃=ôu-¡è…Àu èéòúÿ£èhÅh€… jijgPèPßúÿƒÄ3ÀËD$‹L$ ‹T$P‹D$QRPÿðƒÄÃÌÌÌÌÌÌÌÌÌÌÌ̃=ôu-¡è…Àu è‰òúÿ£èhÅh€… jijgPèðÞúÿƒÄ3ÀËD$‹L$‹T$ P‹D$ QRPÿðƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ¡PäPVèÊþÿƒÄ…À„)‹ TäQVè<ÊþÿƒÄ…À„hÄãVèvæþÿƒÄ…À„ûhüãVèP’ÿÿƒÄ…À„åh,äVèZ’ÿÿƒÄ…À„Ïh€ Vè$ÊþÿƒÄ…À„¹hð Vè.ÊþÿƒÄ…À„£hÐ V蘒ÿÿƒÄ…À„h€ Vè"ÊþÿƒÄ…Àt{hT… VèPÊþÿƒÄ…Àtiè„ùÿ‹P‰Èã‹H‰ Ìã‹P ‰Ðã‹@£Ôãèleùÿ‹H‰ ä‹P‰ä‹@ £äè}‚ùÿ‹H‰ 0ä‹P‰4äè6ùÿÿ¸Ã3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌVèúÅþÿ‹ð…ötèŸþÿÿV…Àu èÇþÿƒÄ^ÃèkÐþÿVèõÆþÿƒÄ^é,ÞúÿÌÌÌÌÌÌÌÌÌÌÌÌ¡ø…Àu è¢ðúÿ£øƒ=(åtDhXäPÇ(åèêúÿ¡øhÐäPèoêúÿ¶ øÁáhåj‰ åèSêúÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¡ø…Àu è2ðúÿ£ø‹L$‹T$ Q‹L$ R‹T$ QRPè“ÜúÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$W¿+Çtjƒèdt.¡ø…Àu èßïúÿ£øh¤h˜ˆ jwjdPèFÜúÿƒÄ3À_Ãhœh˜ˆ jj èŒ÷öÿhžh˜ˆ jj Çæèo÷öÿƒÄ ‹Ç_Ãh‰h˜ˆ jj èU÷öÿ¡4ƒÄ…ÀtPè3FúÿƒÄÇ4V‹t$hh˜ˆ jF,jPèJ÷öÿƒÄƒø~‰54ë*¡ø…Àu èïúÿ£øh’h˜ˆ jdjdPèƒÛúÿƒÄh”h˜ˆ jj èÍööÿƒÄ^‹Ç_ÃÌÌÌÌ̃=(åu;¡øhXäPèGéúÿ‹ øhÐäQè6éúÿhåjè*éúÿ¸ƒÄ£(åøÃÌÌÌÌÌÌV3öW¿95üu!¡ø;Æu èqîúÿ£øh'h˜ˆ jpë7ÿ¡üPè lùÿƒÄ…Àu,¡ø;Æu è8îúÿ£øh.h˜ˆ jhjgPèŸÚúÿƒÄ3ÿ¡4;Æt PèÛDúÿƒÄ‹Ç_‰5ü‰5‰5‰5‰5 ‰5‰5‰5 ‰5$‰5(‰5,‰5‰5‰50^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ƒÁƒùwCÿ$Ð hKh˜ˆ jhë:hNh˜ˆ jfë,hQh˜ˆ jgëhTh˜ˆ jjëÆÃhWh˜ˆ jePj&è½ÙúÿƒÄ€>taVjè­ÛúÿƒÄƒ=4tMhah˜ˆ jj èîôöÿ‹ÆƒÄP›Š@„Éuù+ÂP¡4VPèZEúÿhch˜ˆ jj è·ôöÿƒÄÃI= /  ! O O K ÌÌÌ̸Dè,¡Àç3ĉD$@‹ ´ˆ ‹¸ˆ ¡°ˆ V‹t$LWj.3ÿ‰T$‰D$ ¡¼ˆ ‰L$f‹ Àˆ T$WR‰D$ f‰L$$è<,¡ƒÄ …Àu,¡ø…Àu è:ìúÿ£øhnh˜ˆ jujlPè¡ØúÿƒÄë‹L$TQT$ VRÿЋøjl‹Ït$è`þÿÿƒÄ‹L$H3Àƒÿ_”À^3Ìès+ƒÄDÃÌÌÌ̸Dè6+¡Àç3ĉD$@‹ Ȉ ‹̈ ¡Äˆ V‹t$Lj/‰T$‰D$¡Ðˆ ‰L$ Š Ôˆ T$jR‰D$ˆL$ èp+¡ ƒÄ …Àu:¡ø…Àu ènëúÿ£øh~h˜ˆ jujmPèÕ×úÿƒÄ^‹L$@3ÌèÑ*ƒÄDËL$PQT$VRÿÐjm‹Èt$èˆýÿÿ‹L$TƒÄ^3Ìè¤*ƒÄDÃÌÌÌÌÌ‹D$‹L$PQè!ÿÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸HèF*¡Àç3ĉD$D‹D$LSU‹l$XV‹ñ‹ ؈ W‰L$‹ äˆ ‰D$¡àˆ ‹Ú‹܈ j+‰L$$‰T$‹èˆ ‰D$  ìˆ L$-jQ‰T$0ˆD$4èg*ƒÄ ƒ=„ƒ=„‚¾D$dƒè„4ƒètB¡ø…Àu èAêúÿ£øhôh˜ˆ h€jjPè¥ÖúÿƒÄ_^]3À[‹L$D3Ìèœ)ƒÄHÃVè§Wùÿ‹ÜåS‹øRWè7Zùÿè2pøÿ‰Gè*pøÿ‰G è"pøÿ‰Gèpøÿ‹Ý‰G‹GÁëSPèXqøÿ‹O SQèNqøÿ‹WjRèCqøÿ‹GSPè9qøÿ‹GƒÄ0…Àtw9Xur‹w …ötk9^uf‹W…Òt_ƒzuY‹O…ÉtR9YuM‹ ‹Q‹R‹‹D$QRUPL$,Qÿ‹èjj‹Ít$4è©ûÿÿƒÄ ƒýt7hßh˜ˆ hjjèëøÿÿƒÄWè"XùÿƒÄ_^]3À[‹L$D3Ìè™(ƒÄHËW‰Z‹G‹HƒÊÿ…É~‹Lˆü‹ƒé…Àu‹GP‹Gƒxè‹O ‰Y‹G ‹H…É~ ‹Lˆü‹ÿ‹ƒé…Àu‹G P‹G ƒxè‹OÇA‹G‹H…É~‹Lˆü‹ƒé…Àu‹GP‹Gƒxè‹O‰Y‹G‹H…É~‹Lˆü‹ƒé…Àu‹GP‹GƒxèèãCûÿW‹ðjtVèèGûÿƒÄ _‹Æ^][‹L$D3Ìè¯'ƒÄHÃVèªGùÿ‹ ØåS‹øQWèŠJùÿƒO< èAnøÿ‰Gè9nøÿ‹W‹ÝÁëSR‰Gèwoøÿ‹GSPèmoøÿ‹GƒÄ …ÀtX9XuS‹O…ÉtL9YuG‹‹‹L$RPUQT$$Rÿ‹èjj‹Ít$,èüùÿÿƒÄƒýt$h³h˜ˆ hjjè>÷ÿÿƒÄWèuHùÿéNþÿÿ‹G‰X‹G‹HƒÊÿ…É~%‹Lˆü¤$‹ƒé…Àu‹GP‹Gƒxè‹O‰Y‹G‹H…É~ ‹Lˆü‹ÿ‹ƒé…Àu‹GP‹Gƒxèè£BûÿW‹ðjVè¨FûÿƒÄ _‹Æ^][‹L$D3Ìèo&ƒÄHáø…Àu èÒæúÿ£øh™h˜ˆ jujjPè9Óúÿ‹L$hƒÄ_^][3Ì3Àè0&ƒÄHÃ̸Pèö%¡Àç3ĉD$L‹øˆ ¡ðˆ ‹ ôˆ SV‹t$`W‹|$`3Ûj,‰T$$‰D$¡üˆ ‰L$ ‹ ‰ T$0SR‰\$‰\$ˆ\$ ‰D$0‰L$4è&¡ƒÄ ;Ãu>¡ø;Ãu èæúÿ£øhh˜ˆ jujiPè‚ÒúÿƒÄ_^‹Ã[‹L$L3Ìèz%ƒÄPÃL$QT$RL$QT$$VRÿЃÄƒøtM¡ø;Ãu è¾åúÿ£øhh˜ˆ h€jiPè"ÒúÿD$,PjèÔúÿƒÄ_^‹Ã[‹L$L3Ìè%ƒÄPËL$‹T$ QR‹T$V‹Ïèyúÿÿ‹L$dƒÄ _^[3Ìèã$ƒÄPÃÌÌÌ̸Lè¦$¡Àç3ĉD$H¡‰ ‹ ‰ ‹ ‰ SV‹t$\W‹|$\‰D$¡‰ 3Ûj-‰D$$‰L$f‹ ‰ ‰T$ Љ D$+SP‰\$ˆ\$f‰L$0ˆT$2èÅ$¡ƒÄ ;Ãu>¡ø;Ãu èÃäúÿ£øh.h˜ˆ jujqPè*ÑúÿƒÄ_^‹Ã[‹L$H3Ìè"$ƒÄLÃL$QT$RL$VQÿЃÄƒøtM¡ø;Ãu èkäúÿ£øh6h˜ˆ hjqPèÏÐúÿT$(RjèÃÒúÿƒÄ_^‹Ã[‹L$H3Ìè»#ƒÄLËD$‹L$ PQV3Ò‹Ïè(ùÿÿ‹L$`ƒÄ _^[3Ìè’#ƒÄLÃÌÌÌ¡ …Àu+¡ø…Àu èéãúÿ£øhFh˜ˆ jujfPèPÐúÿƒÄËL$jQÿЃÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸Hè#¡Àç3ĉD$D‹ ‰ ¡‰ ‹ ‰ S‹\$XU‹l$`VW‹|$`j,3ö‰T$ ‰D$¡$‰ ‰L$‹ (‰ T$,VR‰D$,‰L$0è4#ƒÄ 95$…¡ø…Àu è/ãúÿ£øhhh˜ˆ jujnPè–ÏúÿƒÄƒ|$lL$…œ‹T$\jVSQWRD$,Pÿ$‹øjn‹Ït$4è?õÿÿƒÄ ƒÿ…„‹D$_^][‹L$D3ÌèK"ƒÄHáØåPUè@Eùÿ‹ðƒÄ…öu”¡ø…Àu è™âúÿ£øhmh˜ˆ jijnPèÏúÿƒÄ_^]3À[‹L$D3Ìè÷!ƒÄHËl$\jVSQWT$(URÿ$‹øjn‹Ït$4è£ôÿÿƒÄ ƒÿ…è‹D$hh˜ˆ Pè³ööÿ‹ðƒÄ …öu/¡ø…Àu è âúÿ£øhƒh˜ˆ jAjnPèsÎúÿƒÄé„‹L$QSVèÁ!‹D$xƒÄ ƒèt?ƒèt*ƒèth•h˜ˆ jkëJ‹D$jjPPVPSè¹,ùÿƒÄë!‹D$PUVPSèæ(ùÿë‹D$PUVPSèV'ùÿƒÄ‹ø…ÿ}h™h˜ˆ jjjnè*ñÿÿƒÄ…öt‹T$RVè¨øöÿVè’÷öÿƒÄ ‹L$T‹Ç_^][3ÌèÉ ƒÄHÃÌÌÌÌÌÌÌÌÌ̸Hè† ¡Àç3ĉD$D‹ 0‰ ¡,‰ ‹4‰ S‹\$TU‹l$\V‹t$dWj03ÿ‰L$‰D$¡8‰ L$(WQ‰T$(‰D$,è¾ ƒÄ 9=(u?¡ø…Àu è½àúÿ£øh¯h˜ˆ jujoPè$ÍúÿƒÄ‹Ç_^][‹L$D3Ìè ƒÄHËØåRVèCùÿƒÄ…Àu?¡ø…Àu èjàúÿ£øh´h˜ˆ jijoPèÑÌúÿƒÄ‹Ç_^][‹L$D3ÌèȃÄHËL$lƒét?¡ø…Àu è"àúÿ£øhÀh˜ˆ jkjoPè‰ÌúÿƒÄ‹Ç_^][‹L$D3Ì考ÄHËL$\jPUD$PSQT$,Rÿ(‹øjo‹Ït$4è(òÿÿ‹D$0ƒÄ ƒÿt‹Ç‹L$T_^][3Ìè6ƒÄHÃÌÌÌÌÌÌ̸Dèö¡Àç3ĉD$@¡<‰ ‹ @‰ ‹D‰ S‹\$LV‹t$XW‰D$ ¡H‰ j-3ÿ‰D$‰L$f‹ L‰ ‰T$ŠN‰ D$#WPf‰L$(ˆT$*èƒÄ 9=,u>¡ø…Àu èßúÿ£øhÒh˜ˆ jujePèƒËúÿƒÄ‹Ç_^[‹L$@3Ìè{ƒÄDË ÜåQVè/Oùÿ‹ðƒÄ…öu!¡ø…Àu èÈÞúÿ£øhØh˜ˆ jiëªèÐZùÿ‹ø…ÿu/¡ø…Àu èœÞúÿ£øhßh˜ˆ jAjePèËúÿƒÄéÖUèµdøÿ‰è®døÿ‹½UR‰Gèíeøÿ‹GUPèãeøÿ‹ƒÄ…É„ 9i…—‹G…À„Œ9h…ƒ‹‹‹L$\VRPSQT$$Rÿ,je‹Èt$,èdðÿÿ‹‰h‹‹HƒÄƒÊÿ…É~‹Lˆü‹ƒé…Àu ‹P‹ƒxê‹O‰i‹G‹H…É~‹Lˆü‹ƒé…Àu‹GP‹Gƒxè]…ÿ„þÿÿWèçYùÿ‹L$PƒÄ_^[3Ì3ÀèƒÄDøDèÖ¡Àç3ĉD$@¡P‰ SU‹l$PV‹ñ‹ T‰ j2‰L$‹Ú‹X‰ ‰D$f¡\‰ L$jQ‰T$ f‰D$$èƒÄ ƒ=0u>¡ø…Àu èÝúÿ£øhh˜ˆ jujkPèwÉúÿƒÄ^]3À[‹L$@3ÌèoƒÄDËSRWèfdøÿƒÄ…ÿtÛ‹C9GuÓ‹‹Q‹NR‹UÉÉQ‹MR‹ÉÉQÀRÀPL$(Qÿ0‹èjk‹Ít$0èëîÿÿƒÄ$ƒýu$‹[‰_…Û~‹DšüƒÉÿ‹ƒè…ÒuO9Wï‹L$L^‹Å][3ÌèÚƒÄDÃÌÌÌÌÌÌÌÌÌÌÌ‹D$ ‹T$‹L$W‹|$Pè©þÿÿƒÄ_ÃÌÌÌÌ‹D$‹T$‹L$ W‹|$ Pè‰þÿÿƒÄ_ÃÌÌÌ̸èVSUVD$ WP3íèbøÿ‹L$8‹\$D‹t$0Q‹L$8‹Ó‹þèLþÿÿƒÄ…Àt7‹T$<‹L$8R‹Ó|$è1þÿÿƒÄ…Àt‹D$DPS‹ÏQVVèº|øÿƒÄ…Àt½T$RèdaøÿƒÄ_^‹Å][ƒÄÃÌÌÌÌÌÌ̸hèÆ¡Àç3ĉD$d‹ DJ ‹D$l‹HJ SUVWj4‰L$83ÿ‰D$0¡LJ L$DWQ‰T$D‰D$Hè ƒÄ 9=üt$¡ø;Çu è Ûúÿ£øhÇh˜ˆ jdé2‹àåWWRWèe^ùÿƒÄ£ü;Çu¡ø;Çu èËÚúÿ£øhÎéó‹ äåQPè?Zùÿ‹ðƒÄ;÷„Á‹èå¡üRPè ZùÿƒÄ‰D$0;Ç„ ‹ ìå‹üQRèþYùÿƒÄ‰D$;Ç„~¡ðå‹ üPQèÝYùÿƒÄ‰D$(;Ç„]‹ôå¡üRPè¼YùÿƒÄ‰D$ ;Ç„<‹ üå‹üQRèšYùÿƒÄ‰D$;Ç„¡æ‹ üPQèyYùÿƒÄ‰D$;Ç„ù‹æ¡üRPèXYùÿƒÄ‰D$;DŽ؋ æ‹üQRè6YùÿƒÄ‰D$$;Ç„¶¡æ‹ üPQèYùÿ‹èƒÄ;ï„—‹øå¡üRPèöXùÿ‹ØƒÄ;ß„x‹ æ‹üQRèÖXùÿ‹øƒÄ…ÿ„V¡æ‹ üPQè·XùÿƒÄ…À„9‹T$0‹L$‰‹T$(‰ ‹T$‰ ‹L$ ‰‹T$‰ ‹L$‰$‹æ£0‰ ‹L$$RD$8P‰5‰ (‰-,‰‰=ÿփăøýuhóh˜ˆ jhjhèFèÿÿƒÄ3ÿéÅ‹ æQT$8RÿƒÄƒøýuhøëÇ‹D$,jjjPè«ñÿÿƒÎÿƒÄ95Øåuh ) jjh|‰ jèx:ùÿƒÄ£Øå95Üåuh ) jjh`‰ jèHùÿƒÄ£Üå_^]¸[‹L$d3ÌèrƒÄhÃ3ÿ¡ø;Çu èÓ×úÿ£øhßh˜ˆ jhjhPè:ÄúÿƒÄ¡ü;Çt PèhUùÿƒÄ‹L$t‰=ü‰=‰=‰=‰= ‰=‰=‰= ‰=$‰=(‰=,‰=‰=‰=0_^][3Ì3Àè˃ÄhÃÌÌÌÌÌÌÌÌÌÌÌÌ¡ÐåPVè¯þÿƒÄ…À„9‹ ÔåQVè,¯þÿƒÄ…À„!h,åVèfËþÿƒÄ…À„ h åVè@wÿÿƒÄ…À„õhdåVèJwÿÿƒÄ…À„ßhˆåVèÐþÿƒÄ…À„ÉhÀ Vèþ®þÿƒÄ…À„³h02 Vè¯þÿƒÄ…À„h VèrwÿÿƒÄ…À„‡h  Vèü®þÿƒÄ…Àtuh' VèzÃþÿƒÄ…ÀtchP( VèXwÿÿƒÄ…ÀtQèLôøÿ…Àt‹P‰0å‹@£4åèBJùÿ…Àt ‹H ‰ ¬åè`gùÿ…Àt‹P‰hå‹@£låè6åÿÿ¸Ã3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌVèÚªþÿ‹ð…ötèþÿÿV…Àu èå«þÿƒÄ^ÃèKµþÿVèÕ«þÿƒÄ^é ÃúÿÌÌÌÌÌÌÌÌÌÌÌÌ¡8…Àu è‚Õúÿ£8ƒ=èætDh æPÇèæè_Ïúÿ¡8hˆæPèOÏúÿ¶ 8ÁáhØæj‰ Øæè3ÏúÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¡8…Àu èÕúÿ£8‹L$‹T$ Q‹L$ R‹T$ QRPèsÁúÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¡t…Àt PèëöÿƒÄ‹D$PÇtèª*úÿ3ɃÄ…À•Á£t‹ÁÃÌÌÌÌÌÌÌÌ¡t…Àt PèÑêöÿƒÄƒ=èæÇtu;¡8h æPèëÎúÿ‹ 8hˆæQèÚÎúÿhØæjèÎÎúÿ¸ƒÄ£èæøÃÌÌÌÌÌÌÌÌÌ̸ è†SUVW3ÿ9=<t$¡8;Çu è Ôúÿ£8hŒhTŒ jdé¡t;Çu¸ÀŠ WWPWè]WùÿƒÄ£<;Çu¡8;Çu èÃÓúÿ£8h•é{‹ „çQPè7SùÿƒÄ‰D$;Ç„G‹ˆç¡<RPèSùÿƒÄ‰D$;Ç„&‹ Œç‹<QRèôRùÿ‹ðƒÄ;÷„¡ç‹ <PQèÕRùÿƒÄ‰D$;DŽ勔ç¡<RPè´RùÿƒÄ‰D$;DŽċ ˜ç‹<QRè’RùÿƒÄ‰D$ ;Ç„¢¡œç‹ <PQèqRùÿƒÄ‰D$$;Ç„‹ ç¡<RPèPRùÿƒÄ‰D$(;Ç„`‹ ¤ç‹<QRè.RùÿƒÄ‰D$,;Ç„>¡¨ç‹ <PQè Rùÿ‹èƒÄ;ï„‹¬ç¡<RPèîQùÿ‹ØƒÄ;ß„‹ °ç‹<QRèÎQùÿ‹øƒÄ…ÿ„Þ¡´ç‹ <PQè¯QùÿƒÄ…À„Á‹T$‹L$‰@‹T$‰ D‹L$‰L‹T$ ‰ P‹L$$‰T‹T$(‰ X‹L$,hHŒ ‰5H‰\‰ `‰-d‰h‰=l£pÿÖ‹ðƒÄ…ö~*h€çVÿpƒÄ…ÀuVÿLƒÄ_^]¸[ƒÄ ÃhÒhTŒ jljiè:üÿÿƒÄ3ÿë,3ÿ¡8;Çu èCÑúÿ£8h±hTŒ jgjiP誽úÿƒÄ¡<;Çt PèØNùÿƒÄ‰=<‰=@‰=D‰=H‰=L‰=P‰=T‰=X‰=\‰=`‰=d‰=h‰=l‰=p_^]3À[ƒÄ ÃÌÌÌÌÌÌÌ¡tV3ö;Æt PèÞæöÿƒÄ¡<‰5t;Æu.¡8;Æu è~Ðúÿ£8hõhTŒ jijhPèå¼úÿƒÄ3À^ÃPèNùÿƒÄ…Àu.¡8;Æu èCÐúÿ£8húhTŒ jgjhP誼úÿƒÄ3À^É5<‰5@‰5D‰5H‰5L‰5P‰5T‰5X‰5\‰5`‰5d‰5h‰5l‰5p¸^ÃÌÌÌÌÌÌÌÌ3À9<•À|$Èt-¡8…Àu èÏúÿ£8h(hTŒ jfjdPè¼úÿƒÄ3ÀËL$…Éu-¡8…Àu èhÏúÿ£8hhTŒ jCjdPèÏ»úÿƒÄ3ÀÃ…Àt-¡8…Àu è7Ïúÿ£8h!hTŒ jdjdPèž»úÿƒÄ3ÀÃQè2úÿÿƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èVƒ=<U‹l$ÇD$u/¡8…Àu èÒÎúÿ£8h4hTŒ jijjPè9»úÿƒÄ3À]YÃVèûSøÿƒÄ;€ç‰D$~?¡8…Àu èŽÎúÿ£8h;hTŒ jkjjPèõºúÿ‹D$(‹L$ PVUQWèRøÿƒÄ(]YËF;G‹Çë PWèÚUøÿƒÄ…Àu/¡8…Àu è5Îúÿ£8hAhTŒ jejjP蜺úÿƒÄ3À]YÃShHŒ ÿH‹ØƒÄ…Û,hGhTŒ jljjèÌøÿÿ‹T$(‹D$ RVUPWèzQøÿƒÄ$[]YËL$QRUèSøÿƒÄP‹EPVèSøÿ‹‹T$$ƒÄPQRèöRøÿƒÄP‹D$,‹QSÿXƒÄ$…Àt3hOhTŒ jjjjèZøÿÿSÿL‹T$,‹D$$RVUPWèQøÿƒÄ([]YÃSÿLVèRøÿƒÀ™ƒâƒÄÂÁø[‰G¸]YÃÌ̸è† SU‹l$W‹ùWègRøÿVèaRøÿWè[RøÿV‹ØèSRøÿ؃Ä;€ç‰\$ ~4¡8…Àu èäÌúÿ£8h‚hTŒ jkjnPèK¹úÿƒÄ_]¸ñÿÿÿ[YËG‹ND;E‹Åë PUè4TøÿƒÄ…Àu1¡8…Àu èÌúÿ£8h‡hTŒ jejnPèö¸úÿƒÄ_]3À[YÃhHŒ ÿH‹ØƒÄ…Û$¡8…Àu èJÌúÿ£8hhTŒ jléaÿÿÿ‹ET$ RPVèuQøÿ‹‹T$,ƒÄPQRèdQøÿƒÄP‹D$4‹QWèSQøÿ‹ƒÄP‹D$8RPèBQøÿ‹L$@‹ƒÄP‹D$HRPè-Qøÿ‹L$P‹ƒÄP‹D$DRPèQøÿ‹L$L‹ƒÄPRSÿ\ƒÄ<…Àt'h™hTŒ jjjnè|öÿÿSÿLƒÄ_]¸ñÿÿÿ[YÃSÿLWèËPøÿV‹øèÃPøÿD™ƒâƒÄ ÂÁø_‰E]¸[YÃÌÌÌÌÌÌV‹t$Vè•PøÿƒÄ;€ç~)èUéøÿ‹L$‹T$Q‹L$R‹T$VQ‹L$R‹PQÿÒƒÄ^ËD$‹L$‹T$ W‹|$ PQRèøûÿÿƒÄ _^ÃÌÌ‹D$‹L$‹T$ V‹t$W‹|$PQRèÒûÿÿƒÄ _^ÃÌÌÌÌÌÌÌÌÌÌÌ̸ è SU¸ V‰D$ ‰D$D$WP3öè¹PøÿƒÄèÑPøÿ‹èèÊPøÿ‹Ø…í„Ö…Û„Û‹L$8‹T$4QRÿ@¿ƒÄ9{‰D$|‹Ãë WSèÜQøÿƒÄ…À„Ã9}|‹Åë WUèÁQøÿƒÄ…À„¨‹L$8‹T$4D$PQRè²SøÿƒÄ …ÀuhühTŒ jejfèØôÿÿƒÄëIhHŒ ÿH‹øƒÄ…ÿfhhTŒ jljfè¬ôÿÿè÷=ùÿ‹L$L‹T$HQ‹L$HR‹PQÿ҃ċð…öu…Ût Sè€OøÿƒÄ…ít UèsOøÿƒÄL$QèOøÿƒÄ_‹Æ^][ƒÄ ËM‹t$hTŒ jejgPè\´úÿD$ ƒÄPèOMøÿƒÄ‹Ç_^ƒÄËF SUPè Møÿ‹|$4‹l$0WU‰D$ÿ@hHŒ ‰D$HÿH‹ØƒÄ…ÛC¡8…Àu èÇúÿ£8hIhTŒ jljgPèæ³úÿè‘;ùÿ‹L$H‹P VQWUÿÒƒÄ$‹øéê‹L$‹|$4‹WD$PQRèƒLøÿ‹ƒÄP‹G‹QRèqLøÿ‹VƒÄP‹‹QRè_Løÿ‹VƒÄP‹F‹QRèLLøÿ‹VƒÄP‹F‹QRè9Løÿ‹V ƒÄP‹F‹QRè&Løÿ‹T$lƒÄP‹F ‹QRUjSÿdƒÄH…ÀtG¡8…Àu è¨Æúÿ£8hYhTŒ jjjgPè³úÿSÿLè³:ùÿ‹L$H‹P VWQUÿÒƒÄ(‹øëSÿLƒÄ¿]D$[PèÔKøÿƒÄ‹Ç_^ƒÄÃÌÌÌÌÌÌÌÌÌV‹t$‹FWPèKøÿhHŒ ‰D$ÿH‹øƒÄ…ÿB¡8…Àu è Æúÿ£8hwhTŒ jljePèr²úÿèMWùÿ‹L$$‹T$ ‹@VQRÿÐƒÄ _^ËVSU‹l$L$QURèKøÿ‹\$$ƒÄP‹F‹QSèþJøÿ‹ƒÄP‹FRPèîJøÿ‹N‹ƒÄPRWÿTƒÄ$…ÀtC¡8…Àu èxÅúÿ£8h…hTŒ jjjePèß±úÿWÿLè³Vùÿ‹@VSUÿЃÄ$][_^ÃWÿL‹L$ QÿDƒÄ][_^ÃÌÌÌÌÌÌÌÌ̸ èvSUV‹t$3íW‹~3Û‰l$‰l$‰l$;ýu^è2Køÿ‹ø;ý„§‹FPè/Jøÿ‹N‰D$‹AƒÄ;G~ PWèVLøÿƒÄI‹VRWè¶røÿƒÄ…À„j9otæWèðIøÿƒÄ‰D$‹^;Ýu,èÍJøÿ‹Ø‹FPèÒIøÿ‹N‰D$‹AƒÄ;C~ PSèùKøÿƒÄhHŒ ÿH‹èƒÄ…í=¡8…Àu èDÄúÿ£8hÃhTŒ jljoPè«°úÿè†Uùÿ‹PVÿÒƒÄ_^][ƒÄ ËD$‹NPjjQèSIøÿ‹V‹N ƒÄP‹PQè@Iøÿ‹V ƒÄP‹‹PL$,Q‹RD$8PQUÿPƒÄ0…ÀtD¡8…Àu èºÃúÿ£8hÓhTŒ jjjoPè!°úÿUÿLèõTùÿ‹PVÿÒƒÄ_^][ƒÄ ÃUÿL‹D$ƒÀ™ƒâÂÁø‰^‰C‹D$ƒÀ™ƒÄƒâ‰~Áø‰G_^]¸[ƒÄ Ã_^]‹Ã[ƒÄ ÃÌÌÌÌÌÌÌ¡xçPVè›þÿƒÄ…À„‹ |çQVè,›þÿƒÄ…À„îhìæVèf·þÿƒÄ…À„Øh$çVè@cÿÿƒÄ…À„ÂhTçVèJcÿÿƒÄ…À„¬h9 Vè›þÿƒÄ…À„–hp9 Vè›þÿƒÄ…À„€hð< VèˆcÿÿƒÄ…Àtnhà= Vè›þÿƒÄ…Àt\h(Œ VèD›þÿƒÄ…ÀtJèxàøÿ‹P‰ðæ‹H‰ ôæ‹P ‰øæ‹@£üæèSùÿ‹H‰ Xç‹P‰\çè‰ìÿÿ¸Ã3ÀÃVè—þÿ‹ð…ötèÏþÿÿV…Àu è%˜þÿƒÄ^Ãè‹¡þÿVè˜þÿƒÄ^éL¯úÿÌÌÌÌÌÌÌÌÌÌÌÌSUVW‹|$‹O3í…ÉtP‹w …ötI‹_$…ÛtB‹W(…Òt;‹G,…Àt4‹l$PRS‹\$$SUèaôÿÿƒÄƒøñuFè¤ßøÿ‹L$ ‹PQWSUÿÒƒÄ_^][á8…Àu èaÁúÿ£8hbhTŒ jhjlPèÈ­úÿƒÄ‹Å_^][ÃÌÌÿ%h" ÿ%d" ÿ%`" ÿ%\" ÿ%X" ÿ%T" ÿ%P" ÿ%L" ÿ%H" ÿ%D" ÿ%@" ÿ%<" ÿ%8" ÿ%4" ÿ%0" ÿ%," ÿ%(" ÿ%$" ÿ% " ÿ%" ÿ%" ÿ%" ÿ%" ÿ% " ÿ%" ÌÌÌÌÌÌQL$+ÈÀ÷Ð#È‹Ä%ðÿÿ;Èr ‹ÁY”‹‰$Ã-…ëé; ÀçuóÃé ÌÌÌÌÌÌQL$+ȃáÁÉ ÁYéªÿÿÿQL$+ȃáÁÉ ÁYé”ÿÿÿÌÌÌÌÿ%Ø ÿ%Ü ÿ%à ÿ%ä ÿ%ô ÌÌ‹D$‹L$ È‹L$ u ‹D$÷áÂS÷á‹Ø‹D$÷d$Ø‹D$÷áÓ[ÂÌÌÌÌÌÌÌÌÌÌÌÌ€ù@s€ù s­ÐÓêËÂ3Ò€áÓèÃ3À3ÒÃÌSV‹D$ Àu‹L$‹D$3Ò÷ñ‹Ø‹D$ ÷ñ‹ÓëA‹È‹\$‹T$‹D$ ÑéÑÛÑêÑØ Éuô÷ó‹ð÷d$‹È‹D$÷æÑr;T$wr;D$ vN3Ò‹Æ^[ÂÌÌÌÌÌÌÌÌS‹D$ Àu‹L$‹D$ 3Ò÷ñ‹D$÷ñ‹Â3ÒëP‹È‹\$‹T$ ‹D$ÑéÑÛÑêÑØ Éuô÷ó‹È÷d$‘÷d$Ñr;T$ wr;D$v+D$T$+D$T$ ÷Ú÷؃Ú[ÂÌÌÌÌÌÌÌÌÌÌ̃=Ät-U‹ìƒìƒäøÝ$ò,$ÉÃ=ÄtƒìÙ<$XfƒàfƒøtÓU‹ìƒì ƒäðÙÀÙT$ß|$ßl$‹T$‹D$…Àt<Þé…ÒyÙ$‹ $ñ€ÁÿÿÿƒÐ‹T$ƒÒë,Ù$‹ $ÁÿÿÿƒØ‹T$ƒÚë‹T$÷Âÿÿÿu¸Ù\$Ù\$ÉÃÌÌÌÌÌV‹D$ Àu(‹L$‹D$ 3Ò÷ñ‹Ø‹D$÷ñ‹ð‹Ã÷d$‹È‹Æ÷d$ÑëG‹È‹\$‹T$ ‹D$ÑéÑÛÑêÑØ Éuô÷ó‹ð÷d$‹È‹D$÷æÑr;T$ wr;D$v N+D$T$3Û+D$T$ ÷Ú÷؃ڋʋӋًȋÆ^ÂÌÿ%d! ‹ÿVh€ÿ°! ‹ðVÿ¬! YY£À£¼…öu3À@^Ã&èhV èæÇ$ŸU èÚY3À^ËÿU‹ìQQ3À9E u9x~<ÿ xƒ} ‹ È! ‹ SVW‰ °…Ôd‹ ‹y‹5€ ‰E P»¸ë3ÀéÉ;Çthèÿ| jWSÿÖ…ÀuçëÇE ¡´j^…Àt jèëYéµÿ5À‹5¸! ÿÖY‰E …À„‡ÿ5¼ÿÖ‹ø‹E Y‰E‰}ƒï;} rQƒ?tóÿ´! 9téÿ7ÿÖ‰Eøÿ´! ‰ÿUøÿ5ÀÿÖÿ5¼‰EøÿÖ‹MøƒÄ 9Mu9Et´‰M‰M ‰E‹øë§ÿu ÿØ Yÿ´! £¼£À3À£´9EüuPSÿx 3À@_^[É jhˆŒ è{‹ù‹ò‹]3À@‰Eä3ɉMü‰5Ðç‰Eü;ñu9 xu‰Mäé·;ðtƒþu.¡hŒ ;ÁtWVSÿЉEäƒ}ä„“WVSèsýÿÿ‰Eä…À„€WVSèeÃöÿ‰Eäƒþu$…Àu WPSèQÃöÿWjSèCýÿÿ¡hŒ …ÀtWjSÿÐ…ötƒþuCWVSè#ýÿÿ…Àu!Eäƒ}ät.¡hŒ …Àt%WVSÿЉEäë‹Eì‹‹ ‰MàPQè—YYËeèƒeäƒeüÇEüþÿÿÿè ‹EäèÂÃÇÐçÿÿÿÿËÿU‹ìƒ} uèßÿu‹M‹U èÌþÿÿY] ‹ÿU‹ìì(£ˆ‰ „‰€‰|‰5x‰=tfŒ fŒ ”fŒpfŒlfŒ%hfŒ-dœ˜‹E£Œ‹E£E£œ‹…àüÿÿÇØ¡£ŒÇ€ ÀÇ„¡À牅Øüÿÿ¡Ä牅Üüÿÿÿ” £Ðjè•YjÿŒ hlŒ ÿ ƒ=ÐujèqYh Àÿˆ Pÿ„ ÉÃj h°Œ è<ƒeüf(ÁÇEäë#‹Eì‹‹=Àt =Àt3ÀÃ3À@ËeèƒeäÇEüþÿÿÿ‹Eäè>ËÿU‹ìƒì3ÀS‰Eü‰Eô‰EøSœX‹È5 PœZ+ÑtQ3À¢‰Eô‰]è‰Uì‰M𸢉Uü‰Eø[÷Eütè\ÿÿÿ…Àt3À@ë3À[ÉÃè™ÿÿÿ£Ä3ÀÃh¨è™YÃjhÐŒ èqÿ5À‹5¸! ÿÖY‰Eäƒøÿu ÿuÿä! YëgjèsYƒeüÿ5ÀÿÖ‰Eäÿ5¼ÿÖYY‰EàEàPEäPÿu‹5¬! ÿÖYPè6‰EÜÿuäÿÖ£Àÿuàÿփģ¼ÇEüþÿÿÿè ‹EÜè'ÃjèúYËÿU‹ìÿuèNÿÿÿ÷ØÀ÷ØYH]ËÿV¸xŒ ¾xŒ W‹ø;Æs‹…ÀtÿЃÇ;þrñ_^ËÿV¸€Œ ¾€Œ W‹ø;Æs‹…ÀtÿЃÇ;þrñ_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹ÿU‹ì‹M¸MZf9t3À]ËA<Á8PEuï3Ò¹ f9H”‹Â]ÃÌÌÌÌÌÌÌÌÌÌÌ‹ÿU‹ì‹E‹H<È·ASV·q3ÒWD…öv‹} ‹H ;ùr ‹XÙ;ûr BƒÀ(;Örè3À_^[]ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹ÿU‹ìjþhðŒ hX d¡PƒìSVW¡Àç1Eø3ÅPEðd£‰eèÇEühè*ÿÿÿƒÄ…ÀtU‹E-PhèPÿÿÿƒÄ…Àt;‹@$Áè÷ЃàÇEüþÿÿÿ‹Mðd‰ Y_^[‹å]ËEì‹‹3Ò=À”‹ÂËeèÇEüþÿÿÿ3À‹Mðd‰ Y_^[‹å]ÃÌÿ%¼! ÿ%À! ÿ%Ä! ÿ%Ì! ÌÌhX dÿ5‹D$‰l$l$+àSVW¡Àç1Eü3ÅP‰eèÿuø‹EüÇEüþÿÿÿ‰EøEðd£Ã‹Mðd‰ Y__^[‹å]QËÿU‹ìÿuÿuÿu ÿuh+M hÀç蹃Ä]ËÿU‹ìƒì¡ÀçƒeøƒeüSW¿Næ@»»ÿÿ;Çt …Ãt ÷УÄçë`VEøPÿ˜ ‹uü3uøÿP 3ðÿ¬ 3ðÿ@ 3ðEðPÿ< ‹Eô3Eð3ð;÷u¾Oæ@»ë …óu‹ÆÁà ð‰5Àç÷Ö‰5Äç^_[ÉÃÿ%Ð! ÿ%Ô! ÿ%Ø! ÿ%Ü! ÿ%à! ÿ%è! ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌUSVW3ÒœX‹È5 PœX3Ⱥás_3À¢3ÀûGenu•À‹èúineI•À èùntel•À 踢ƒýu%=uʺâsÁëãÿƒûwâÿÿÿï‹Â‹Ñ_^[]Ã3À3Ò xèº!s1à xèº!s#XƒàuœXºà s1RPô1+$T$ƒÄÃ3À3ÒÜXºà s(‹D$‹L$ŽØ3À‹ë ¤$@;tûÃ3À3ÒÃ3À3Ò xè‹ º!s:º!s fïÀfïÉfïÒfïÛfïäfïífïöfïÿÙîÙîÙîÙîÙîÙîÙîÙî›ÛãD$ËT$‹L$S‹ð±uö‹Ã[ÃU‹ìƒì‹M ‰ $‹U‰T$‹E‰D$‹E‰D$ ‹E‰D$‹E ‰D$‹E$‰D$ÿU‹å]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌVW‹|$ ‹t$‹L$UÁáS΃é@‹Q‹_‹O‹W ‹ù‹.3ú#û„(x¤j×3úÇ‹ûÁÀ‹nÃ3ù#ø”*V·Çè3ù׋øÁ ‹nÐ3û#úŒ)Ûp $3ûÏ‹úÁÁ‹n Ê3ø#ùœ+îνÁ3øß‹ùÁËnÙ3ú#û„(¯|õ3úÇ‹ûÁÀ‹nÃ3ù#ø”**ƇG3ù׋øÁ ‹nÐ3û#úŒ)F0¨3ûÏ‹úÁÁ‹nÊ3ø#ùœ+•Fý3øß‹ùÁËn Ù3ú#û„(ؘ€i3úÇ‹ûÁÀ‹n$Ã3ù#ø”*¯÷D‹3ù׋øÁ ‹n(Ð3û#úŒ)±[ÿÿ3ûÏ‹úÁÁ‹n,Ê3ø#ùœ+¾×\‰3øß‹ùÁËn0Ù3ú#û„("k3úÇ‹ûÁÀ‹n4Ã3ù#ø”*“q˜ý3ù׋øÁ ‹n8Ð3û#úŒ)ŽCy¦3ûÏ‹úÁÁ‹n<Ê3ø#ùœ+!´I3øß‹ùÁËnÙ„(b%ö3û#ú‹n3ùÇ‹ûÁÀÔ*@³@À3ø#ù‹n,3û׋øÁ ÐŒ)QZ^&3ú#û‹.3øÏ‹úÁÁÊœ+ªÇ¶é3ù#ø‹n3úß‹ùÁÃÙ„(]/Ö3û#ú‹n(3ùÇ‹ûÁÀÔ*SD3ø#ù‹n<3û׋øÁ ÐŒ)æ¡Ø3ú#û‹n3øÏ‹úÁÁÊœ+ÈûÓç3ù#ø‹n$3úß‹ùÁÃÙ„(æÍá!3û#ú‹n83ùÇ‹ûÁÀÔ*Ö7Ã3ø#ù‹n 3û׋øÁ ÐŒ)‡ Õô3ú#û‹n 3øÏ‹úÁÁÊœ+íZE3ù#ø‹n43úß‹ùÁÃÙ„(éã©3û#ú‹n3ùÇ‹ûÁÀÔ*ø£ïü3ø#ù‹n3û׋øÁ ÐŒ)Ùog3ú#û‹n03øÏ‹úÁÁÊœ+ŠL*3ù#ø‹n3úß‹ùÁÃÙ3ú3û„(B9úÿÇÁÀ‹n ‹û”*öq‡Ã3ù3ø‹n,׋øÁ Ð3û3úŒ)"amÏÁÁ‹n8‹úœ+ 8åýÊ3ø3ù‹nß‹ùÁÃÙ3ú3û„(D꾤ÇÁÀ‹n‹û”*©ÏÞKÃ3ù3ø‹n׋øÁ Ð3û3úŒ)`K»öÏÁÁ‹n(‹úœ+p¼¿¾Ê3ø3ù‹n4ß‹ùÁÃÙ3ú3û„(Æ~›(ÇÁÀ‹.‹û”*ú'¡êÃ3ù3ø‹n ׋øÁ Ð3û3úŒ)…0ïÔÏÁÁ‹n‹úœ+ˆÊ3ø3ù‹n$ß‹ùÁÃÙ3ú3û„(9ÐÔÙÇÁÀ‹n0‹û”*å™ÛæÃ3ù3ø‹n<׋øÁ Ð3û3úŒ)ø|¢ÏÁÁ‹n‹úœ+eV¬ÄÊ3ø3ù‹.ß¿ÿÿÿÿÁÃÙ3ú û„(D")ô3ù‹nÇ¿ÿÿÿÿÁÀ3ùà ø”*—ÿ*C3û‹n8׿ÿÿÿÿÁ 3ûÐ úŒ)§#”«3ø‹nÏ¿ÿÿÿÿÁÁ3øÊ ùœ+9 “ü3ú‹n0ß¿ÿÿÿÿÁÃ3úÙ û„(ÃY[e3ù‹n Ç¿ÿÿÿÿÁÀ3ùà ø”*’Ì 3û‹n(׿ÿÿÿÿÁ 3ûÐ úŒ)}ôïÿ3ø‹nÏ¿ÿÿÿÿÁÁ3øÊ ùœ+Ñ]„…3ú‹n ß¿ÿÿÿÿÁÃ3úÙ û„(O~¨o3ù‹n<Ç¿ÿÿÿÿÁÀ3ùà ø”*àæ,þ3û‹n׿ÿÿÿÿÁ 3ûÐ úŒ)C£3ø‹n4Ï¿ÿÿÿÿÁÁ3øÊ ùœ+¡N3ú‹nß¿ÿÿÿÿÁÃ3úÙ û„(‚~S÷3ù‹n,Ç¿ÿÿÿÿÁÀ3ùà ø”*5ò:½3û‹n׿ÿÿÿÿÁ 3ûÐ úŒ)»Ò×*3ø‹n$Ï¿ÿÿÿÿÁÁ3øÊ ùœ+‘Ó†ë3ú‹l$߃Æ@ÁË}ÙÇ‹}ß‹}Ï‹} ׉E‰]‹<$‰M‰U ;þƒ‚ùÿÿX[]_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌUSVW‹l$‹t$‹D$ƒì@ÁàƉD$\‹}‹‹^‹N‹V ÈËÉʉ$‰\$‰L$‰T$ ‹F‹^‹N‹VÈËÉʉD$‰\$‰L$‰T$‹F ‹^$‹N(‹V,ÈËÉʉD$ ‰\$$‰L$(‰T$,‹F0‹^4‹N8‹V<ÈËÉʉD$0‰\$4‰L$8‰T$<‰t$X‹E‹]‹M‹U ‹ñ‹èÁÅ3òï#ó‹<$3òÁˬ=™y‚Zî‹û‹õÁÅ3ùê#ø‹T$3ùÁȬ™y‚Zï‹Ð‹ýÁÅ3Óé#Ö‹L$3ÓÁά ™y‚Zê‹Î‹ÕÁÅ3Èë#Ï‹\$ 3ÈÁϬ™y‚Zé‹ß‹ÍÁÅ3Þè#Ú‹D$3ÞÁʬ™y‚Zë‹Â‹ÝÁÅ3Çî#Á‹t$3ÇÁɬ5™y‚Zè‹ñ‹ÅÁÅ3òï#ó‹|$3òÁˬ=™y‚Zî‹û‹õÁÅ3ùê#ø‹T$3ùÁȬ™y‚Zï‹Ð‹ýÁÅ3Óé#Ö‹L$ 3ÓÁά ™y‚Zê‹Î‹ÕÁÅ3Èë#Ï‹\$$3ÈÁϬ™y‚Zé‹ß‹ÍÁÅ3Þè#Ú‹D$(3ÞÁʬ™y‚Zë‹Â‹ÝÁÅ3Çî#Á‹t$,3ÇÁɬ5™y‚Zè‹ñ‹ÅÁÅ3òï#ó‹|$03òÁˬ=™y‚Zî‹û‹õÁÅ3ùê#ø‹T$43ùÁȬ™y‚Zï‹Ð‹ýÁÅ3Óé#Ö‹L$83ÓÁά ™y‚Zê‹Î‹ÕÁÅ3Èë#Ï‹\$<3ÈÁϬ™y‚ZÍ‹$‹ï3\$3î3\$ #êÁÊ3\$4ÑÃ3î‰$œ™y‚Z‹ÁÁÀÝØ‹D$‹ê3D$ 3ï3D$$#éÁÉ3D$8ÑÀ3ï‰D$„0™y‚Z‹óÁÆÅÆ‹t$‹é3t$3ê3t$(#ëÁË3t$<ÑÆ3ê‰t$´>™y‚Z‹øÁÇõ÷‹|$ ‹ë3|$3é3|$,#èÁÈ3<$ÑÇ3é‰|$ ¼™y‚Z‹ÖÁÂýú‹î‹T$ÁÎ3T$3è3T$03ë3T$ÑÂé‰T$‹ÏÁÁ”*¡ëÙnÑ‹ï‹L$ÁÏ3L$3î3L$43è3L$ÑÁë‰L$‹ÚÁÃŒ)¡ëÙnË‹ê‹\$ÁÊ3\$ 3ï3\$83î3\$ ÑÃè‰\$‹ÁÁÀœ+¡ëÙnØ‹é‹D$ÁÉ3D$$3ê3D$<3ï3D$ÑÀî‰D$‹óÁÆ„(¡ëÙnÆ‹ë‹t$ ÁË3t$(3é34$3ê3t$ÑÆï‰t$ ‹øÁÇ´.¡ëÙn÷‹è‹|$$ÁÈ3|$,3ë3|$3é3|$ÑÇê‰|$$‹ÖÁ¼/¡ëÙnú‹î‹T$(ÁÎ3T$03è3T$3ë3T$ÑÂé‰T$(‹ÏÁÁ”*¡ëÙnÑ‹ï‹L$,ÁÏ3L$43î3L$ 3è3L$ ÑÁë‰L$,‹ÚÁÃŒ)¡ëÙnË‹ê‹\$0ÁÊ3\$83ï3\$3î3\$$ÑÃè‰\$0‹ÁÁÀœ+¡ëÙnØ‹é‹D$4ÁÉ3D$<3ê3D$3ï3D$(ÑÀî‰D$4‹óÁÆ„(¡ëÙnÆ‹ë‹t$8ÁË34$3é3t$3ê3t$,ÑÆï‰t$8‹øÁÇ´.¡ëÙn÷‹è‹|$<ÁÈ3|$3ë3|$3é3|$0ÑÇê‰|$<‹ÖÁ¼/¡ëÙnú‹î‹$ÁÎ3T$3è3T$ 3ë3T$4ÑÂé‰$‹ÏÁÁ”*¡ëÙnÑ‹ï‹L$ÁÏ3L$ 3î3L$$3è3L$8ÑÁë‰L$‹ÚÁÃŒ)¡ëÙnË‹ê‹\$ÁÊ3\$3ï3\$(3î3\$<ÑÃè‰\$‹ÁÁÀœ+¡ëÙnØ‹é‹D$ ÁÉ3D$3ê3D$,3ï3$ÑÀî‰D$ ‹óÁÆ„(¡ëÙnÆ‹ë‹t$ÁË3t$3é3t$03ê3t$ÑÆï‰t$‹øÁÇ´.¡ëÙn÷‹è‹|$ÁÈ3|$3ë3|$43é3|$ÑÇê‰|$‹ÖÁ¼/¡ëÙnú‹î‹T$ÁÎ3T$ 3è3T$83ë3T$ ÑÂé‰T$‹ÏÁÁ”*¡ëÙnÑ‹ï‹L$ÁÏ3L$$3î3L$<3è3L$ÑÁë‰L$‹ÚÁÃŒ)¡ëÙnË‹\$ ‹l$(3Ý‹,$3Ý‹l$3Ý‹êÑà ï‰\$ #îœܼ‹ÂÁÊ#Ç è‹ÁÁÀÝØ‹D$$‹l$,3Å‹l$3Å‹l$3Å‹éÑÀ ê‰D$$#ï„0ܼ‹ñÁÉ#ò î‹óÁÆÅÆ‹t$(‹l$03õ‹l$3õ‹l$3õ‹ëÑÆ é‰t$(#ê´>ܼ‹ûÁË#ù ï‹øÁÇõ÷‹|$,‹l$43ý‹l$ 3ý‹l$ 3ý‹èÑÇ ë‰|$,#é¼ܼ‹ÐÁÈ#Ó ê‹ÖÁÂýú‹T$0‹l$83Õ‹l$3Õ‹l$$3Õ‹îÑ è‰T$0#ë” Ü¼‹ÎÁÎ#È é‹ÏÁÁÕÑ‹L$4‹l$<3Í‹l$3Í‹l$(3Í‹ïÑÁ î‰L$4#èŒܼ‹ßÁÏ#Þ ë‹ÚÁÃÍË‹\$8‹,$3Ý‹l$3Ý‹l$,3Ý‹êÑà ï‰\$8#îœܼ‹ÂÁÊ#Ç è‹ÁÁÀÝØ‹D$<‹l$3Å‹l$3Å‹l$03Å‹éÑÀ ê‰D$<#ï„0ܼ‹ñÁÉ#ò î‹óÁÆÅÆ‹4$‹l$3õ‹l$ 3õ‹l$43õ‹ëÑÆ é‰4$#ê´>ܼ‹ûÁË#ù ï‹øÁÇõ÷‹|$‹l$ 3ý‹l$$3ý‹l$83ý‹èÑÇ ë‰|$#é¼ܼ‹ÐÁÈ#Ó ê‹ÖÁÂýú‹T$‹l$3Õ‹l$(3Õ‹l$<3Õ‹îÑ è‰T$#ë” Ü¼‹ÎÁÎ#È é‹ÏÁÁÕÑ‹L$ ‹l$3Í‹l$,3Í‹,$3Í‹ïÑÁ î‰L$ #èŒܼ‹ßÁÏ#Þ ë‹ÚÁÃÍË‹\$‹l$3Ý‹l$03Ý‹l$3Ý‹êÑà ï‰\$#îœܼ‹ÂÁÊ#Ç è‹ÁÁÀÝØ‹D$‹l$3Å‹l$43Å‹l$3Å‹éÑÀ ê‰D$#ï„0ܼ‹ñÁÉ#ò î‹óÁÆÅÆ‹t$‹l$ 3õ‹l$83õ‹l$ 3õ‹ëÑÆ é‰t$#ê´>ܼ‹ûÁË#ù ï‹øÁÇõ÷‹|$‹l$$3ý‹l$<3ý‹l$3ý‹èÑÇ ë‰|$#é¼ܼ‹ÐÁÈ#Ó ê‹ÖÁÂýú‹T$ ‹l$(3Õ‹,$3Õ‹l$3Õ‹îÑ è‰T$ #ë” Ü¼‹ÎÁÎ#È é‹ÏÁÁÕÑ‹L$$‹l$,3Í‹l$3Í‹l$3Í‹ïÑÁ î‰L$$#èŒܼ‹ßÁÏ#Þ ë‹ÚÁÃÍË‹\$(‹l$03Ý‹l$3Ý‹l$3Ý‹êÑà ï‰\$(#îœܼ‹ÂÁÊ#Ç è‹ÁÁÀÝØ‹D$,‹l$43Å‹l$ 3Å‹l$ 3Å‹éÑÀ ê‰D$,#ï„0ܼ‹ñÁÉ#ò î‹óÁÆÅÆ‹ë‹t$0ÁË3t$83é3t$3ê3t$$ÑÆï‰t$0‹øÁÇ´.ÖÁbÊ÷‹è‹|$4ÁÈ3|$<3ë3|$3é3|$(ÑÇê‰|$4‹ÖÁ¼/ÖÁbÊú‹î‹T$8ÁÎ3$3è3T$3ë3T$,ÑÂé‰T$8‹ÏÁÁ”*ÖÁbÊÑ‹ï‹L$<ÁÏ3L$3î3L$3è3L$0ÑÁë‰L$<‹ÚÁÃŒ)ÖÁbÊË‹ê‹$ÁÊ3\$3ï3\$ 3î3\$4ÑÃè‰$‹ÁÁÀœ+ÖÁbÊØ‹é‹D$ÁÉ3D$ 3ê3D$$3ï3D$8ÑÀî‰D$‹óÁÆ„(ÖÁbÊÆ‹ë‹t$ÁË3t$3é3t$(3ê3t$<ÑÆï‰t$‹øÁÇ´.ÖÁbÊ÷‹è‹|$ ÁÈ3|$3ë3|$,3é3<$ÑÇê‰|$ ‹ÖÁ¼/ÖÁbÊú‹î‹T$ÁÎ3T$3è3T$03ë3T$ÑÂé‰T$‹ÏÁÁ”*ÖÁbÊÑ‹ï‹L$ÁÏ3L$3î3L$43è3L$ÑÁë‰L$‹ÚÁÃŒ)ÖÁbÊË‹ê‹\$ÁÊ3\$ 3ï3\$83î3\$ ÑÃè‰\$‹ÁÁÀœ+ÖÁbÊØ‹é‹D$ÁÉ3D$$3ê3D$<3ï3D$ÑÀî‰D$‹óÁÆ„(ÖÁbÊÆ‹ë‹t$ ÁË3t$(3é34$3ê3t$ÑÆï‰t$ ‹øÁÇ´.ÖÁbÊ÷‹è‹|$$ÁÈ3|$,3ë3|$3é3|$ÑÇê‰|$$‹ÖÁ¼/ÖÁbÊú‹î‹T$(ÁÎ3T$03è3T$3ë3T$ÑÂé‰T$(‹ÏÁÁ”*ÖÁbÊÑ‹ï‹L$,ÁÏ3L$43î3L$ 3è3L$ ÑÁë‰L$,‹ÚÁÃŒ)ÖÁbÊË‹ê‹\$0ÁÊ3\$83ï3\$3î3\$$ÑÃè‰\$0‹ÁÁÀœ+ÖÁbÊØ‹é‹D$4ÁÉ3D$<3ê3D$3ï3D$(ÑÀî‰D$4‹óÁÆ„(ÖÁbÊÆ‹ë‹t$8ÁË34$3é3t$3ê3t$,ÑÆï‰t$8‹øÁÇ´.ÖÁbÊ÷‹è‹|$<ÁÈ3|$3ë3|$3é3|$0ÑÇê‰|$<‹ÖÁ¼/ÖÁbÊú‹l$T‹T$X}uE] M‰}ƒÂ@‰u;T$\‰E‹ù‰] ‹ò‰M‚˜ðÿÿƒÄ@_^[]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌU‹ìSVW‹U‹} è^¶¯ì@ƒäðóoóoJóoR óoZ0d$f„$fŒ$f”$ fœ$03ÒòÖÀòÖÊ‹׋\×ÈˉÔ‰DÔ‰œÔ€‰„Ô„‹ÿ‹D׋\× Èˉ\Ô‰DÔ ‰œÔˆ‰„ÔŒo¤$(o¬$0o´$8ÊËsÒsó×ïûsÒsóïúïûsÒsóïúïûŒ$(¤$0¬$8ïåÛáïåÔüo”$oœ$oŒ$ÔþÔ<ÖÔ<ÔÔÏÄÅsÔsõæïõsÔsõïôïõsÔsõïôïõ„$”$œ$ÄëÃÛãÛÂëàÔôøÔÆBƒúŒâþÿÿ„þþÿÿ‹Ú‹ÿƒâóoDÔfoÐfoØfsÒfsó8foÂfïÃfsÒfsófïÂfïÃfsÒfïÂfoLÔpfoáfoéfsÔfsõfoÌfïÍfsÔ fsõ*fïÌfïÍfsÔ*fïÌóotÔHfÔÁfÔÆfÔÔfÔf„Ô€o¤$(o¬$0o´$8ÊËsÒsó×ïûsÒsóïúïûsÒsóïúïûŒ$(¤$0¬$8ïåÛáïåÔüo”$oœ$oŒ$ÔþÔ<ÞÔ<ÔÔÏÄÅsÔsõæïõsÔsõïôïõsÔsõïôïõ„$”$œ$ÄëÃÛãÛÂëàÔôøÔÆCBo¤$(o¬$0o´$8ÊËsÒsó×ïûsÒsóïúïûsÒsóïúïûŒ$(¤$0¬$8ïåÛáïåÔüo”$oœ$oŒ$ÔþÔ<ÞÔ<ÔÔÏÄÅsÔsõæïõsÔsõïôïõsÔsõïôïõ„$”$œ$ÄëÃÛãÛÂëàÔôøÔÆCBƒûPŒuýÿÿ‹U„$Œ$ óoóoJóoR óoZ0fÔ„$fÔŒ$fÔ”$ fÔœ$0óóJóR óZ0Ç€ÿM…‘ûÿÿw‹}ô‹uø‹]üÉä$"®(ט/ŠBÍeï#‘D7q/;MìÏûÀµ¼Û‰¥Ûµé8µHó[ÂV9жññY›O¯¤‚?’mÚÕ^«B£˜ªؾopE[ƒŒ²äN¾…1$â´ÿÕÃ} Uo‰{òt]¾r±–;þ±Þ€5Ç%§Ü›”&iÏtñ›ÁÒJñžÁi›äã%O8†G¾ïµÕŒ‹ÆÁeœ¬wÌ¡ $u+Yo,é-ƒä¦nª„tJÔûA½Ü©°\µSƒÚˆùv«ßfîRQ>˜2´-mÆ1¨?!û˜È'°äï¾ÇY¿Â¨=ó àÆ%§ “G‘§Õo‚àQcÊpn g))ü/ÒF… ·'&É&\8!.í*ÄZüm,Mß³• 8SÞc¯‹Ts e¨²w<» jvæ®íG.ÉÂ;5‚…,r’dñL¡è¿¢0B¼Kf¨‘—øÐp‹KÂ0¾T£QlÇRïÖè’Ñ©eU$™Ö* qW…5ô¸Ñ»2p jÈÐÒ¸Á¤S«AQl7™ëŽßLwH'¨H›áµ¼°4cZÉų 9ËŠAãJªØNsãcwOÊœ[£¸²Öóo.hü²ï]î‚t`/Coc¥xr«ð¡xÈ„ì9dÇŒ(c#úÿ¾é½‚ÞëlP¤yƲ÷£ù¾+SrãòxqÆœa&êÎ>'ÊÂÀ!Ǹ†ÑëàÍÖ}ÚêxÑnîO}õºorªgð¦˜È¢Å}c ® ù¾˜?G5 q„}#õwÛ(“$Ç@{«Ê2¼¾É ¾žË¾ÔÅL*~eüœ)YìúÖ:«oË_XGJŒDlÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$‹D$V‹ W‹rU‹zSƒìl‹‹h‰$‰l$‹X‹h ‰\$‰l$ ‹X‹h‰\$‰l$‹X‹h‰\$‰l$‹X ‹h$‰\$ ‰l$$‹X(‹h,‰\$(‰l$,‹X0‹h4‰\$0‰l$4‹X8‹h<‰\$8‰l$<‹Ç‹Z ‹j3Ë$3ÆÊÁÇ È‹ÆÁÁ Í3Ç‹T$3Áè‹ÁÁÆ ê3ÆÁÅë‹T$3ÅÚÁÁ Ø‹ÅÁÃß3Á‹T$ 3Ãø‹ÃÁÅ ú3ÅÁÇ þ‹T$3ÇòÁà ð‹ÇÁÆñ3ËT$3ÆÈ‹ÆÁÇ Ê3ÇÁÁÍ‹T$3ÁêÁÆ è‹ÁÁÅë3Æ‹T$3ÅØ‹ÅÁÁ Ú3ÁÁà ß‹T$ 3ÃúÁÅ ø‹ÃÁÇ þ3Å‹T$$3Çð‹ÇÁà ò3ÃÁÆ ñ‹T$(3ÆÊÁÇ È‹ÆÁÁÍ3Ç‹T$,3Áè‹ÁÁÆ ê3ÆÁÅë‹T$03ÅÚÁÁ Ø‹ÅÁÃß3Á‹T$43Ãø‹ÃÁÅ ú3ÅÁÇþ‹T$83ÇòÁà ð‹ÇÁÆ ñ3ËT$<3ÆȸÿÿÿÿÁÇ Ê‹T$ÁÁÍê‹Ö+Á#Ñ#Ç Ð‹D$ÁÆ ¬™y‚ZºÿÿÿÿÁÅëØ‹Á+Õ#Å#Ö Â‹T$4ÁÁ œ™y‚Z¸ÿÿÿÿÁÃßú‹Õ+Ã#Ó#Á ЋD$ÁÅ ¼™y‚ZºÿÿÿÿÁÇþð‹Ã+×#Ç#Õ Â‹T$(Áà ´™y‚Z¸ÿÿÿÿÁÆ ñÊ‹×+Æ#Ö#à ЋD$ÁÇ Œ™y‚ZºÿÿÿÿÁÁ Íè‹Æ+Ñ#Á#× Â‹T$<ÁÆ ¬™y‚Z¸ÿÿÿÿÁÅ ëÚ‹Ñ+Å#Õ#Æ Ð‹D$ ÁÁ œ™y‚ZºÿÿÿÿÁÃßø‹Å+Ó#Ã#Ñ Â‹T$0ÁÅ ¼™y‚Z¸ÿÿÿÿÁÇþò‹Ó+Ç#×#ŠЋ$Áà ´™y‚ZºÿÿÿÿÁÆñÈ‹Ç+Ö#Æ#Ó Â‹T$$ÁÇ Œ™y‚Z¸ÿÿÿÿÁÁ Íê‹Ö+Á#Ñ#Ç Ð‹D$ÁÆ ¬™y‚ZºÿÿÿÿÁÅëØ‹Á+Õ#Å#Ö Â‹T$ÁÁ œ™y‚Z¸ÿÿÿÿÁà ßú‹Õ+Ã#Ó#Á ЋD$8ÁÅ ¼™y‚ZºÿÿÿÿÁÇ þð‹Ã+×#Ç#Õ Â‹T$,Áà ´™y‚Z¸ÿÿÿÿÁÆñÊ‹×+Æ#Ö#à ЋD$ ÁÇ Œ™y‚ZºÿÿÿÿÁÁ Íè‹Æ+Ñ#Á#× ÂºÿÿÿÿÁÆ ¬™y‚Z+ÑÁÅ ë‹D$ ÕØ3Ö¸ÿÿÿÿÁÁ œ¡ëÙn+ÅÁà ß‹T$( Ãú3ÁºÿÿÿÿÁÅ ¼¡ëÙn+ÓÁÇ þ‹D$8 ×ð3Õ¸ÿÿÿÿÁà ´¡ëÙn+ÇÁÆñ‹T$ ÆÊ3úÿÿÿÿÁÇ Œ¡ëÙn+ÖÁÁÍ‹D$$ Ñè3׸ÿÿÿÿÁÆ ¬¡ëÙn+ÁÁÅë‹T$< ÅÚ3ƺÿÿÿÿÁÁ œ¡ëÙn+ÕÁà ß‹D$ Óø3ѸÿÿÿÿÁÅ ¼¡ëÙn+ÃÁÇ þ‹T$ Çò3źÿÿÿÿÁà ´¡ëÙn+×ÁÆñ‹D$ ÖÈ3Ó¸ÿÿÿÿÁÇ Œ¡ëÙn+ÆÁÁÍ‹T$ Áê3ǺÿÿÿÿÁÆ ¬¡ëÙn+ÑÁÅë‹$ ÕØ3Ö¸ÿÿÿÿÁÁ œ¡ëÙn+ÅÁà ß‹T$ Ãú3ÁºÿÿÿÿÁÅ ¼¡ëÙn+ÓÁÇþ‹D$4 ×ð3Õ¸ÿÿÿÿÁà ´¡ëÙn+ÇÁÆñ‹T$, ÆÊ3úÿÿÿÿÁÇ Œ¡ëÙn+ÖÁÁ Í‹D$ Ñè3׸ÿÿÿÿÁÆ ¬¡ëÙn+ÁÁÅë‹T$0 ÅÚ3ƺÿÿÿÿÁÁ œ¡ëÙn‹ÁÁÃß+Ñ#Ã#Õ Ð‹D$ÁÅ ¼ܼºÿÿÿÿø‹ÅÁÇ þ+Õ#Ç#Ó Ð‹D$$Áà ´ܼºÿÿÿÿð‹ÃÁÆ ñ+Ó#Æ#× Ð‹D$,ÁÇ ŒܼºÿÿÿÿÈ‹ÇÁÁÍ+×#Á#Ö Ð‹D$(ÁÆ ¬ܼºÿÿÿÿè‹ÆÁÅë+Ö#Å#Ñ Ð‹$ÁÁ œܼºÿÿÿÿØ‹ÁÁÃß+Ñ#Ã#Õ Ð‹D$ ÁÅ ¼ܼºÿÿÿÿø‹ÅÁÇþ+Õ#Ç#Ó Ð‹D$0Áà ´ܼºÿÿÿÿð‹ÃÁÆ ñ+Ó#Æ#× Ð‹D$ÁÇ ŒܼºÿÿÿÿÈ‹ÇÁÁÍ+×#Á#Ö Ð‹D$4ÁÆ ¬ܼºÿÿÿÿè‹ÆÁÅ ë+Ö#Å#Ñ Ð‹D$ ÁÁ œܼºÿÿÿÿØ‹ÁÁÃß+Ñ#Ã#Õ Ð‹D$ÁÅ ¼ܼºÿÿÿÿø‹ÅÁÇþ+Õ#Ç#Ó Ð‹D$<Áà ´ܼºÿÿÿÿð‹ÃÁÆñ+Ó#Æ#× Ð‹D$8ÁÇ ŒܼºÿÿÿÿÈ‹ÇÁÁÍ+×#Á#Ö Ð‹D$ÁÆ ¬ܼºÿÿÿÿè‹ÆÁÅë+Ö#Å#Ñ Ð‹D$ÁÁ œܼºÿÿÿÿØ‹ÁÁÃß+Ñ#Ã#Õ Ð‹D$ÁÅ ¼ܼºÿÿÿÿø+ÕÁÇ þ‹D$ Óð3׸ÿÿÿÿÁà ´NýS©+ÃÁÆ ñ‹$ ÇÊ3ƺÿÿÿÿÁÇ ŒNýS©+×ÁÁÍ‹D$ Öè3ѸÿÿÿÿÁÆ ¬NýS©+ÆÁÅë‹T$$ ÁÚ3źÿÿÿÿÁÁ œNýS©+ÑÁà ß‹D$ Õø3Ó¸ÿÿÿÿÁÅ ¼NýS©+ÅÁÇþ‹T$0 Ãò3ǺÿÿÿÿÁà ´NýS©+ÓÁÆñ‹D$ ×È3Ö¸ÿÿÿÿÁÇ ŒNýS©+ÇÁÁ Í‹T$( Æê3ÁºÿÿÿÿÁÆ ¬NýS©+ÖÁÅ ë‹D$8 ÑØ3Õ¸ÿÿÿÿÁÁ œNýS©+ÁÁÃß‹T$ Åú3úÿÿÿÿÁÅ ¼NýS©+ÕÁÇ þ‹D$ Óð3׸ÿÿÿÿÁà ´NýS©+ÃÁÆ ñ‹T$ ÇÊ3ƺÿÿÿÿÁÇ ŒNýS©+×ÁÁÍ‹D$, Öè3ѸÿÿÿÿÁÆ ¬NýS©+ÆÁÅ ë‹T$ ÁÚ3źÿÿÿÿÁÁ œNýS©+ÑÁÃß‹D$< Õø3Ó¸ÿÿÿÿÁÅ ¼NýS©+ÅÁÇþ‹T$4 Ãò3Ç‹”$€Áà ´NýS©‰L$@ÁÆñ‹ ‰t$D‰|$H‹r‰\$L‹z‰l$P‹Z ‹jºÿÿÿÿ+Ó‹D$ ×È3Ö¸ÿÿÿÿÁÇ Œæ‹¢P+ÇÁÁÍ‹T$8 Æê3ÁºÿÿÿÿÁÆ ¬æ‹¢P+ÖÁÅ ë‹D$ ÑØ3Õ¸ÿÿÿÿÁÁ œæ‹¢P+ÁÁà ß‹$ Åú3úÿÿÿÿÁÅ ¼æ‹¢P+ÕÁÇ þ‹D$$ Óð3׸ÿÿÿÿÁà ´æ‹¢P+ÃÁÆ ñ‹T$ ÇÊ3ƺÿÿÿÿÁÇ Œæ‹¢P+×ÁÁÍ‹D$, Öè3ѸÿÿÿÿÁÆ ¬æ‹¢P+ÆÁÅë‹T$ ÁÚ3źÿÿÿÿÁÁ œæ‹¢P+ÑÁÃß‹D$4 Õø3Ó¸ÿÿÿÿÁÅ ¼æ‹¢P+ÅÁÇþ‹T$ Ãò3ǺÿÿÿÿÁà ´æ‹¢P+ÓÁÆñ‹D$< ×È3Ö¸ÿÿÿÿÁÇ Œæ‹¢P+ÇÁÁÍ‹T$ Æê3ÁºÿÿÿÿÁÆ ¬æ‹¢P+ÖÁÅ ë‹D$ ÑØ3Õ¸ÿÿÿÿÁÁ œæ‹¢P+ÁÁÃß‹T$( Åú3úÿÿÿÿÁÅ ¼æ‹¢P+ÕÁÇþ‹D$ Óð3׸ÿÿÿÿÁà ´æ‹¢P+ÃÁÆ ñ‹T$0 ÇÊ3ƺÿÿÿÿÁÇ Œæ‹¢P‹ÇÁÁÍ+×#Á#Ö Ð‹D$ÁÆ ¬$ÑM\ºÿÿÿÿè‹ÆÁÅ ë+Ö#Å#Ñ Ð‹D$,ÁÁ œ$ÑM\ºÿÿÿÿØ‹ÁÁà ß+Ñ#Ã#Õ Ð‹D$ ÁÅ ¼$ÑM\ºÿÿÿÿø‹ÅÁÇþ+Õ#Ç#Ó Ð‹D$Áà ´$ÑM\ºÿÿÿÿð‹ÃÁÆñ+Ó#Æ#× Ð‹$ÁÇ Œ$ÑM\ºÿÿÿÿÈ‹ÇÁÁ Í+×#Á#Ö Ð‹D$4ÁÆ ¬$ÑM\ºÿÿÿÿè‹ÆÁÅë+Ö#Å#Ñ Ð‹D$ÁÁ œ$ÑM\ºÿÿÿÿØ‹ÁÁà ß+Ñ#Ã#Õ Ð‹D$(ÁÅ ¼$ÑM\ºÿÿÿÿø‹ÅÁÇ þ+Õ#Ç#Ó Ð‹D$8Áà ´$ÑM\ºÿÿÿÿð‹ÃÁÆñ+Ó#Æ#× Ð‹D$<ÁÇ Œ$ÑM\ºÿÿÿÿÈ‹ÇÁÁÍ+×#Á#Ö Ð‹D$ ÁÆ ¬$ÑM\ºÿÿÿÿè‹ÆÁÅ ë+Ö#Å#Ñ Ð‹D$0ÁÁ œ$ÑM\ºÿÿÿÿØ‹ÁÁÃß+Ñ#Ã#Õ Ð‹D$ÁÅ ¼$ÑM\ºÿÿÿÿø‹ÅÁÇþ+Õ#Ç#Ó Ð‹D$$Áà ´$ÑM\ºÿÿÿÿð‹ÃÁÆñ+Ó#Æ#× Ð‹D$ÁÇ Œ$ÑM\ºÿÿÿÿÈ‹ÇÁÁ Í+×#Á#Ö Ð‹D$ÁÆ ¬$ÑM\ºÿÿÿÿè+ÑÁÅ ë‹D$< ÕØ3Ö¸ÿÿÿÿÁÁ œó>pm+ÅÁà ß‹T$ Ãú3ÁºÿÿÿÿÁÅ ¼ó>pm+ÓÁÇþ‹D$ ×ð3Õ¸ÿÿÿÿÁà ´ó>pm+ÇÁÆñ‹T$ ÆÊ3úÿÿÿÿÁÇ Œó>pm+ÖÁÁ Í‹D$ Ñè3׸ÿÿÿÿÁÆ ¬ó>pm+ÁÁÅë‹T$8 ÅÚ3ƺÿÿÿÿÁÁ œó>pm+ÕÁÃß‹D$ Óø3ѸÿÿÿÿÁÅ ¼ó>pm+ÃÁÇþ‹T$$ Çò3źÿÿÿÿÁà ´ó>pm+×ÁÆñ‹D$, ÖÈ3Ó¸ÿÿÿÿÁÇ Œó>pm+ÆÁÁ Í‹T$ Áê3ǺÿÿÿÿÁÆ ¬ó>pm+ÑÁÅ ë‹D$0 ÕØ3Ö¸ÿÿÿÿÁÁ œó>pm+ÅÁÃß‹T$ Ãú3ÁºÿÿÿÿÁÅ ¼ó>pm+ÓÁÇþ‹D$( ×ð3Õ¸ÿÿÿÿÁà ´ó>pm+ÇÁÆ ñ‹$ ÆÊ3úÿÿÿÿÁÇ Œó>pm+ÖÁÁ Í‹D$ Ñè3׸ÿÿÿÿÁÆ ¬ó>pm+ÁÁÅë‹T$4 ÅÚ3Æ‹T$ ÁÁ œó>pm¸ÿÿÿÿÁÃßú‹Õ+Ã#Ó#Á ЋD$ÁÅ ¼évmzºÿÿÿÿÁÇþð‹Ã+×#Ç#Õ Â‹T$Áà ´évmz¸ÿÿÿÿÁÆñÊ‹×+Æ#Ö#à ЋD$ÁÇ ŒévmzºÿÿÿÿÁÁÍè‹Æ+Ñ#Á#× Â‹T$ ÁÆ ¬évmz¸ÿÿÿÿÁÅ ëÚ‹Ñ+Å#Õ#Æ Ð‹D$,ÁÁ œévmzºÿÿÿÿÁÃßø‹Å+Ó#Ã#Ñ Â‹T$<ÁÅ ¼évmz¸ÿÿÿÿÁÇþò‹Ó+Ç#×#ŠЋ$Áà ´évmzºÿÿÿÿÁÆñÈ‹Ç+Ö#Æ#Ó Â‹T$ÁÇ Œévmz¸ÿÿÿÿÁÁÍê‹Ö+Á#Ñ#Ç Ð‹D$0ÁÆ ¬évmzºÿÿÿÿÁÅëØ‹Á+Õ#Å#Ö Â‹T$ÁÁ œévmz¸ÿÿÿÿÁà ßú‹Õ+Ã#Ó#Á ЋD$4ÁÅ ¼évmzºÿÿÿÿÁÇ þð‹Ã+×#Ç#Õ Â‹T$$Áà ´évmz¸ÿÿÿÿÁÆ ñÊ‹×+Æ#Ö#à ЋD$ÁÇ ŒévmzºÿÿÿÿÁÁ Íè‹Æ+Ñ#Á#× Â‹T$(ÁÆ ¬évmz¸ÿÿÿÿÁÅëÚ‹Ñ+Å#Õ#Æ Ð‹D$8ÁÁ œévmzºÿÿÿÿÁÃßø‹Å+Ó#Ã#Ñ Ð‹ÃÁÅ ¼évmz3ÅÁÇþ‹T$03ÇòÁà ð‹ÇÁÆñ3ËT$<3ÆÈ‹ÆÁÇ Ê3ÇÁÁÍ‹T$(3ÁêÁÆ è‹ÁÁÅ ë3Æ‹T$3ÅØ‹ÅÁÁ Ú3ÁÁà ß‹T$3ÃúÁÅ ø‹ÃÁÇ þ3Å‹T$3Çð‹ÇÁà ò3ÃÁÆñ‹T$ 3ÆÊÁÇ È‹ÆÁÁÍ3Ç‹T$3Áè‹ÁÁÆ ê3ÆÁÅë‹T$3ÅÚÁÁ Ø‹ÅÁÃß3Á‹T$3Ãø‹ÃÁÅ ú3ÅÁÇ þ‹T$43ÇòÁà ð‹ÇÁÆñ3ËT$83ÆÈ‹ÆÁÇ Ê3ÇÁÁÍ‹$3ÁêÁÆ è‹ÁÁÅë3Æ‹T$ 3ÅØ‹ÅÁÁ Ú3ÁÁà ß‹T$$3ÃúÁÅ ø‹ÃÁÇ þ3Å‹T$,3ÇðÁà ò‹”$€ÁÆ ñ‹BØ‹D$HØ‹Bè‹D$Lè‹B È‹D$PÈ‹Bð‹D$@ð‹ø‹D$Dø‹„$ˆ‰‰j‰Jƒè‰r ‰z~#‰„$ˆ‹ù‹„$„‹ËƒÀ@‹õ‰„$„é3ëÿÿƒÄl[]_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌVW‹t$ 3ÉSU‹‹\$‹~ÁÀ‹ð3Ç%ðððð3ð3øÁÇ‹Ç3þçðÿ3Ç3÷ÁÀ‹ø3Æ%33333ø3ðÁÆ‹Æ3÷æüü3Æ3þÁÀ ‹ð3Ç%ªªªª3ð3øÑÇ-°9 ‹L$ƒû„$‹3Û‹Q3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹A3Û‹Q 3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹A3Û‹Q3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹A3Û‹Q3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹A 3Û‹Q$3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹A(3Û‹Q,3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹A03Û‹Q43Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹A83Û‹Q<3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹A@3Û‹QD3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹AH3Û‹QL3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹AP3Û‹QT3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹AX3Û‹Q\3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹A`3Û‹Qd3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹Ah3Û‹Ql3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹Ap3Û‹Qt3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹Ax3Û‹Q|3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´é‹Ax3Û‹Q|3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹Ap3Û‹Qt3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹Ah3Û‹Ql3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹A`3Û‹Qd3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹AX3Û‹Q\3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹AP3Û‹QT3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹AH3Û‹QL3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹A@3Û‹QD3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹A83Û‹Q<3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹A03Û‹Q43Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹A(3Û‹Q,3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹A 3Û‹Q$3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹A3Û‹Q3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹A3Û‹Q3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹A3Û‹Q 3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹3Û‹Q3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹T$Ñ΋Ç3þ窪ªª3Ç3÷ÁÀ‹ø3Æ%üü3ø3ðÁÇ ‹Ç3þç33333Ç3÷ÁÆ‹þ3ðæðÿ3þ3ÆÁÇ ‹÷3øçðððð3÷3ÇÁȉ‰r][_^ÃVW‹D$ 3ÉSU‹0‹\$ÁÆ‹xÁÇ-°9 ‹L$ƒû„$‹3Û‹Q3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹A3Û‹Q 3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹A3Û‹Q3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹A3Û‹Q3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹A 3Û‹Q$3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹A(3Û‹Q,3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹A03Û‹Q43Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹A83Û‹Q<3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹A@3Û‹QD3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹AH3Û‹QL3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹AP3Û‹QT3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹AX3Û‹Q\3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹A`3Û‹Qd3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹Ah3Û‹Ql3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹Ap3Û‹Qt3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹Ax3Û‹Q|3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´é‹Ax3Û‹Q|3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹Ap3Û‹Qt3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹Ah3Û‹Ql3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹A`3Û‹Qd3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹AX3Û‹Q\3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹AP3Û‹QT3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹AH3Û‹QL3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹A@3Û‹QD3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹A83Û‹Q<3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹A03Û‹Q43Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹A(3Û‹Q,3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹A 3Û‹Q$3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹A3Û‹Q3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹A3Û‹Q3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´‹A3Û‹Q 3Æ3É3Ö%üüüüâÏÏÏÏŠØŠÌÁÊ3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ3¼3¼ ‹L$3¼3¼‹3Û‹Q3Ç3É3×%üüüüâÏÏÏÏŠØŠÌÁÊ3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ3´3´ ‹L$3´3´ÁÏ‹D$ÁΉ8‰p][_^ÃS‹\$UVW‹;‹sƒì ÁÇ‹×3þçðððð3×3÷ÁÆ‹þ3òæðÿ3þ3ÖÁÇ‹÷3úç33333÷3×Á‹ú3Öâüü3ú3òÁÇ ‹×3þ窪ªª3×3÷ÁÊÁΉs‹D$$‰‹|$(‹t$,ÇD$‰D$‰$èíðÿÿÇD$‰|$‰$èÙðÿÿÇD$‰t$‰$èÅðÿÿƒÄ ‹;‹sÁÆÁÇ‹Ç3þ窪ªª3Ç3÷ÁÀ‹ø3Æ%üü3ø3ðÁÇ ‹Ç3þç33333Ç3÷ÁÆ‹þ3ðæðÿ3þ3ÆÁÇ ‹÷3øçðððð3÷3ÇÁȉ‰s_^][ÃS‹\$UVW‹;‹sƒì ÁÇ‹×3þçðððð3×3÷ÁÆ‹þ3òæðÿ3þ3ÖÁÇ‹÷3úç33333÷3×Á‹ú3Öâüü3ú3òÁÇ ‹×3þ窪ªª3×3÷ÁÊÁΉs‹t$$‰‹|$(‹D$,ÇD$‰D$‰$èÉïÿÿÇD$‰|$‰$èµïÿÿÇD$‰t$‰$è¡ïÿÿƒÄ ‹;‹sÁÆÁÇ‹Ç3þ窪ªª3Ç3÷ÁÀ‹ø3Æ%üü3ø3ðÁÇ ‹Ç3þç33333Ç3÷ÁÆ‹þ3ðæðÿ3þ3ÆÁÇ ‹÷3øçðððð3÷3ÇÁȉ‰s_^][ÃUSVW‹l$‹\$$‹3‹{WVWV‹Ü‹t$$‹|$(‹L$8Q‹D$4PSƒù„ƒåø‹D$ ‹\$t.‹‹V3Á3Ú‰D$ ‰\$è¾ßÿÿ‹D$ ‹\$‰‰_ƒÆƒÇƒíuÒ‹l$8ƒå„üèZŠ‹,©ê3É3ÒÿåŠvÁâŠvŠV‹ë ŠnÁáŠnŠ3Á3Ú‰D$ ‰\$èVßÿÿ‹D$ ‹\$‰‰_é§ƒåø‹D$‹\$tC‹‹^‰D$ ‰\$è%ßÿÿ‹D$ ‹\$‹L$‹T$3È3Ó‹‹^‰‰W‰D$‰\$ƒÆƒÇƒíu½‹l$8ƒåtN‹‹^‰D$ ‰\$èÙÞÿÿ‹D$ ‹\$‹L$‹T$3È3Ó‹‹^ÁʈWÁêˆwˆW‰ëÁɈOÁáˆnˆë‹L$@ƒÄ‰‰Y_^[]ä$+("¤$¤$¤$¤$d$USVW‹l$‹\$,‹3‹{WVWV‹Ü‹t$$‹|$(‹L$@‹D$8P‹D$8P‹D$8PSƒù„ƒåø‹D$‹\$t.‹‹V3Á3Ú‰D$‰\$è…ûÿÿ‹D$‹\$‰‰_ƒÆƒÇƒíuÒ‹l$<ƒå„üèZŠ7‹,©ê3É3ÒÿåŠvÁâŠvŠV‹ë ŠnÁáŠnŠ3Á3Ú‰D$‰\$èûÿÿ‹D$‹\$‰‰_é§ƒåø‹D$‹\$tC‹‹^‰D$‰\$èüÿÿ‹D$‹\$‹L$‹T$3È3Ó‹‹^‰‰W‰D$‰\$ƒÆƒÇƒíu½‹l$<ƒåtN‹‹^‰D$‰\$èÄûÿÿ‹D$‹\$‹L$‹T$3È3Ó‹‹^ÁʈWÁêˆwˆW‰ëÁɈOÁáˆnˆë‹L$LƒÄ ‰‰Y_^[]ä$¤$¤$¤$¤$¤$+("¤$¤$¤$¤$d$ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌUSVW3ÿ3ö°9 R‹l$j‹D$$‹ÖÁê‹L$(3Ö#Â#Ñ‹ØÁã‹ÊÁá3Ã3Ñ‹]3ËM3Æ3Ö3Ñ%üüüü3ÛâÏÏÏÏ3ÉŠØŠÌÁÊ‹l$3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ‹œ3û‹œ 3û‹œ3û‹œ3û‹l$ ‹D$$‹×Áê‹L$(3×#Â#Ñ‹ØÁã‹ÊÁá3Ã3Ñ‹]3ËM 3Ç3×3Ñ%üüüü3ÛâÏÏÏÏ3ÉŠØŠÌÁÊ‹l$3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ‹œ3ó‹œ 3ó‹œ3ó‹œ3ó‹l$ ‹D$$‹ÖÁê‹L$(3Ö#Â#Ñ‹ØÁã‹ÊÁá3Ã3Ñ‹]3ËM3Æ3Ö3Ñ%üüüü3ÛâÏÏÏÏ3ÉŠØŠÌÁÊ‹l$3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ‹œ3û‹œ 3û‹œ3û‹œ3û‹l$ ‹D$$‹×Áê‹L$(3×#Â#Ñ‹ØÁã‹ÊÁá3Ã3Ñ‹]3ËM3Ç3×3Ñ%üüüü3ÛâÏÏÏÏ3ÉŠØŠÌÁÊ‹l$3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ‹œ3ó‹œ 3ó‹œ3ó‹œ3ó‹l$ ‹D$$‹ÖÁê‹L$(3Ö#Â#Ñ‹ØÁã‹ÊÁá3Ã3Ñ‹] 3ËM$3Æ3Ö3Ñ%üüüü3ÛâÏÏÏÏ3ÉŠØŠÌÁÊ‹l$3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ‹œ3û‹œ 3û‹œ3û‹œ3û‹l$ ‹D$$‹×Áê‹L$(3×#Â#Ñ‹ØÁã‹ÊÁá3Ã3Ñ‹](3ËM,3Ç3×3Ñ%üüüü3ÛâÏÏÏÏ3ÉŠØŠÌÁÊ‹l$3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ‹œ3ó‹œ 3ó‹œ3ó‹œ3ó‹l$ ‹D$$‹ÖÁê‹L$(3Ö#Â#Ñ‹ØÁã‹ÊÁá3Ã3Ñ‹]03ËM43Æ3Ö3Ñ%üüüü3ÛâÏÏÏÏ3ÉŠØŠÌÁÊ‹l$3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ‹œ3û‹œ 3û‹œ3û‹œ3û‹l$ ‹D$$‹×Áê‹L$(3×#Â#Ñ‹ØÁã‹ÊÁá3Ã3Ñ‹]83ËM<3Ç3×3Ñ%üüüü3ÛâÏÏÏÏ3ÉŠØŠÌÁÊ‹l$3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ‹œ3ó‹œ 3ó‹œ3ó‹œ3ó‹l$ ‹D$$‹ÖÁê‹L$(3Ö#Â#Ñ‹ØÁã‹ÊÁá3Ã3Ñ‹]@3ËMD3Æ3Ö3Ñ%üüüü3ÛâÏÏÏÏ3ÉŠØŠÌÁÊ‹l$3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ‹œ3û‹œ 3û‹œ3û‹œ3û‹l$ ‹D$$‹×Áê‹L$(3×#Â#Ñ‹ØÁã‹ÊÁá3Ã3Ñ‹]H3ËML3Ç3×3Ñ%üüüü3ÛâÏÏÏÏ3ÉŠØŠÌÁÊ‹l$3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ‹œ3ó‹œ 3ó‹œ3ó‹œ3ó‹l$ ‹D$$‹ÖÁê‹L$(3Ö#Â#Ñ‹ØÁã‹ÊÁá3Ã3Ñ‹]P3ËMT3Æ3Ö3Ñ%üüüü3ÛâÏÏÏÏ3ÉŠØŠÌÁÊ‹l$3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ‹œ3û‹œ 3û‹œ3û‹œ3û‹l$ ‹D$$‹×Áê‹L$(3×#Â#Ñ‹ØÁã‹ÊÁá3Ã3Ñ‹]X3ËM\3Ç3×3Ñ%üüüü3ÛâÏÏÏÏ3ÉŠØŠÌÁÊ‹l$3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ‹œ3ó‹œ 3ó‹œ3ó‹œ3ó‹l$ ‹D$$‹ÖÁê‹L$(3Ö#Â#Ñ‹ØÁã‹ÊÁá3Ã3Ñ‹]`3ËMd3Æ3Ö3Ñ%üüüü3ÛâÏÏÏÏ3ÉŠØŠÌÁÊ‹l$3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ‹œ3û‹œ 3û‹œ3û‹œ3û‹l$ ‹D$$‹×Áê‹L$(3×#Â#Ñ‹ØÁã‹ÊÁá3Ã3Ñ‹]h3ËMl3Ç3×3Ñ%üüüü3ÛâÏÏÏÏ3ÉŠØŠÌÁÊ‹l$3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ‹œ3ó‹œ 3ó‹œ3ó‹œ3ó‹l$ ‹D$$‹ÖÁê‹L$(3Ö#Â#Ñ‹ØÁã‹ÊÁá3Ã3Ñ‹]p3ËMt3Æ3Ö3Ñ%üüüü3ÛâÏÏÏÏ3ÉŠØŠÌÁÊ‹l$3|ŠÚ3¼ ŠÎÁè3¼ŠÜÁê3¼ ŠÎ%ÿâÿ‹œ3û‹œ 3û‹œ3û‹œ3û‹l$ ‹D$$‹×Áê‹L$(3×#Â#Ñ‹ØÁã‹ÊÁá3Ã3Ñ‹]x3ËM|3Ç3×3Ñ%üüüü3ÛâÏÏÏÏ3ÉŠØŠÌÁÊ‹l$3tŠÚ3´ ŠÎÁè3´ŠÜÁê3´ ŠÎ%ÿâÿ‹œ3ó‹œ 3ó‹œ3ó‹œ3ó‹l$ ‹$‹ÇK‹þ‹ð‰$…½õÿÿ‹T$ÑÏ‹Æ3÷檪ªª3Æ3þÁÀ‹ð3Ç%üü3ð3øÁÆ ‹Æ3÷æ33333Æ3þÁÇ‹÷3øçðÿ3÷3ÇÁÆ ‹þ3ðæðððð3þ3ÆÁȉ‰zƒÄ_^[]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$ƒúuÃUSV3ÀW3Û‹l$‹t$ŠEŠ]‹|$ þÀƒì ƒÅƒ½ÿ„×T2ø‰T$‹L…;Ö‚HƒÆÙ‹T‰T…щLâÿþÀ‹L…‹T•ˆ$Ù‹T‰T…щLâÿþÀ‹L…‹T•ˆT$Ù‹T‰T…щLâÿþÀ‹L…‹T•ˆT$Ù‹T‰T…щLâÿþÀ‹L…‹T•ˆT$Ù‹T‰T…щLâÿþÀ‹L…‹T•ˆT$Ù‹T‰T…щLâÿþÀ‹L…‹T•ˆT$Ù‹T‰T…щLâÿþÀ‹L…‹T•ˆT$Ù‹T‰T…щLâÿþÀ‹T•ƒÇˆT$‹ $‹Vø3Ê‹Vü‰Oø‹L$3Ê‹T$‰Oü‹L…;ò†¸þÿÿƒÂF;Ö‚¨‰T$Ù‹T‰T…щLâÿþÀ‹L…‹T•Švÿ2Öˆ‹T$;Ö†qFÙ‹T‰T…щLâÿþÀ‹L…‹T•Švÿ2ÖˆW‹T$;Ö†<FÙ‹T‰T…щLâÿþÀ‹L…‹T•Švÿ2ÖˆW‹T$;Ö†FÙ‹T‰T…щLâÿþÀ‹L…‹T•Švÿ2ÖˆW‹T$;Ö†ÒFÙ‹T‰T…щLâÿþÀ‹L…‹T•Švÿ2ÖˆW‹T$;Ö†FÙ‹T‰T…щLâÿþÀ‹L…‹T•Švÿ2ÖˆW‹T$;ÖvlFÙ‹T‰T…щLâÿþÀ‹T•Švÿ2ÖˆWëE¤$‰T$¶LÙ¶TˆLˆTѶT2v¶L;t$ˆrÓHƒÄ ˆ]üˆEø_^[]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌUS‹\$ ‹l$VW‹;‹s3À‹]3É3û‹U‹ß3òÁë‹×ŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3ó‹U‹Þ3úÁë‹ÖŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3û‹U ‹ß3òÁë‹×ŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3ó‹U‹Þ3úÁë‹ÖŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3û‹U‹ß3òÁë‹×ŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3ó‹U‹Þ3úÁë‹ÖŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3û‹U‹ß3òÁë‹×ŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3ó‹U ‹Þ3úÁë‹ÖŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3û‹U$‹ß3òÁë‹×ŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3ó‹U(‹Þ3úÁë‹ÖŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3û‹U,‹ß3òÁë‹×ŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3ó‹U0‹Þ3úÁë‹ÖŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3û‹U4‹ß3òÁë‹×ŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3ó‹U8‹Þ3úÁë‹ÖŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3û‹U<‹ß3òÁë‹×ŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3ó‹U@‹Þ3úÁë‹ÖŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú‹D$3û‹UD3ò‰x‰0_^[]ÃUS‹\$ ‹l$VW‹;‹s3À‹]D3É3û‹U@‹ß3òÁë‹×ŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3ó‹U<‹Þ3úÁë‹ÖŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3û‹U8‹ß3òÁë‹×ŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3ó‹U4‹Þ3úÁë‹ÖŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3û‹U0‹ß3òÁë‹×ŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3ó‹U,‹Þ3úÁë‹ÖŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3û‹U(‹ß3òÁë‹×ŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3ó‹U$‹Þ3úÁë‹ÖŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3û‹U ‹ß3òÁë‹×ŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3ó‹U‹Þ3úÁë‹ÖŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3û‹U‹ß3òÁë‹×ŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3ó‹U‹Þ3úÁë‹ÖŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3û‹U‹ß3òÁë‹×ŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3ó‹U ‹Þ3úÁë‹ÖŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3û‹U‹ß3òÁë‹×ŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú3À3ó‹U‹Þ3úÁë‹ÖŠÇãÿŠÎâÿ‹D…H‹œHØ‹„H3Ø‹”•H Ú‹D$3û‹U3ò‰x‰0_^[]ÃUSVW‹l$‹\$$‹3‹{WVWV‹Ü‹t$$‹|$(‹L$8‹D$0PSƒù„­ƒåø‹D$‹\$ t6‹‹V3Á3ÚÈˉD$‰\$ èq÷ÿÿ‹D$‹\$ Èˉ‰_ƒÆƒÇƒíuÊ‹l$4ƒå„èZŠC‹,©ê3É3ÒÿåŠvÁâŠvŠV‹ë ŠnÁáŠnŠ3Á3ÚÈˉD$‰\$ è÷ÿÿ‹D$‹\$ Èˉ‰_é·ƒåø‹D$‹\$tK‹‹^ÈˉD$‰\$ èãúÿÿ‹D$‹\$ ÈË‹L$‹T$3È3Ó‹‹^‰‰W‰D$‰\$ƒÆƒÇƒíuµ‹l$4ƒåtV‹‹^ÈˉD$‰\$ èúÿÿ‹D$‹\$ ÈË‹L$‹T$3È3Ó‹‹^ÁʈWÁêˆwˆW‰ëÁɈOÁáˆnˆë‹L$<ƒÄ‰‰Y_^[]ä$¤$¤$¤$¤$+("¤$¤$¤$¤$d$ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌUS‹\$ ‹l$VW‹;‹s‹…€P3À‹U‹MÖÓ‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW 3Ë‹…À[ +Ë‹•À_ Ë3ù‹U‹M 3×Ó‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW +Ë‹…À[ Ë‹•À_ 3Ë3ñ‹U‹M+ÖÓ‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW Ë‹…À[ 3Ë‹•À_ +Ë3ù‹U‹M×Ó‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW 3Ë‹…À[ +Ë‹•À_ Ë3ñ‹U ‹M$3ÖÓ‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW +Ë‹…À[ Ë‹•À_ 3Ë3ù‹U(‹M,+×Ó‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW Ë‹…À[ 3Ë‹•À_ +Ë3ñ‹U0‹M4ÖÓ‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW 3Ë‹…À[ +Ë‹•À_ Ë3ù‹U8‹M<3×Ó‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW +Ë‹…À[ Ë‹•À_ 3Ë3ñ‹U@‹MD+ÖÓ‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW Ë‹…À[ 3Ë‹•À_ +Ë3ù‹UH‹ML×Ó‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW 3Ë‹…À[ +Ë‹•À_ Ë3ñ‹UP‹MT3ÖÓ‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW +Ë‹…À[ Ë‹•À_ 3Ë3ù‹UX‹M\+×Ó‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW Ë‹…À[ 3Ë‹•À_ +Ë3ñZ Ò…‹U`‹MdÖÓ‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW 3Ë‹…À[ +Ë‹•À_ Ë3ù‹Uh‹Ml3×Ó‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW +Ë‹…À[ Ë‹•À_ 3Ë3ñ‹Up‹Mt+ÖÓ‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW Ë‹…À[ 3Ë‹•À_ +Ë3ù‹Ux‹M|×Ó‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW 3Ë‹…À[ +Ë‹•À_ Ë3ñ‹D$‰x‰0_^[]ÃUS‹\$ ‹l$VW‹;‹s‹…€ À…3À‹Ux‹M|ÖÓ‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW 3Ë‹…À[ +Ë‹•À_ Ë3ù‹Up‹Mt+×Ó‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW Ë‹…À[ 3Ë‹•À_ +Ë3ñ‹Uh‹Ml3ÖÓ‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW +Ë‹…À[ Ë‹•À_ 3Ë3ù‹U`‹Md×Ó‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW 3Ë‹…À[ +Ë‹•À_ Ë3ñ‹UX‹M\+ÖÓ‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW Ë‹…À[ 3Ë‹•À_ +Ë3ù‹UP‹MT3×Ó‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW +Ë‹…À[ Ë‹•À_ 3Ë3ñ‹UH‹MLÖÓ‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW 3Ë‹…À[ +Ë‹•À_ Ë3ù‹U@‹MD+×Ó‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW Ë‹…À[ 3Ë‹•À_ +Ë3ñ‹U8‹M<3ÖÓ‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW +Ë‹…À[ Ë‹•À_ 3Ë3ù‹U0‹M4×Ó‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW 3Ë‹…À[ +Ë‹•À_ Ë3ñ‹U(‹M,+ÖÓ‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW Ë‹…À[ 3Ë‹•À_ +Ë3ù‹U ‹M$3×Ó‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW +Ë‹…À[ Ë‹•À_ 3Ë3ñ‹U‹MÖÓ‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW 3Ë‹…À[ +Ë‹•À_ Ë3ù‹U‹M+×Ó‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW Ë‹…À[ 3Ë‹•À_ +Ë3ñ‹U‹M 3ÖÓ‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW +Ë‹…À[ Ë‹•À_ 3Ë3ù‹U‹M×Ó‹Ú3ÉŠÎãÿÁê3ÀŠÆâÿ‹ ÀS ‹ÀW 3Ë‹…À[ +Ë‹•À_ Ë3ñ‹D$‰x‰0_^[]ÃUSVW‹l$‹\$$‹3‹{WVWV‹Ü‹t$$‹|$(‹L$8‹D$0PSƒù„±ƒåø‹D$‹\$ t6‹‹V3Á3ÚÈˉD$‰\$ èeöÿÿ‹D$‹\$ Èˉ‰_ƒÆƒÇƒíuÊ‹l$4ƒå„èZŠ7‹,©ê3É3Òÿå3ÒŠvÁâŠvŠV‹ë Šn3ÉÁáŠnŠ3Á3ÚÈˉD$‰\$ èñõÿÿ‹D$‹\$ Èˉ‰_é·ƒåø‹D$‹\$tK‹‹^ÈˉD$‰\$ èZúÿÿ‹D$‹\$ ÈË‹L$‹T$3È3Ó‹‹^‰‰W‰D$‰\$ƒÆƒÇƒíuµ‹l$4ƒåtV‹‹^ÈˉD$‰\$ èúÿÿ‹D$‹\$ ÈË‹L$‹T$3È3Ó‹‹^ÁʈWÁêˆwˆW‰ëÁɈOÁáˆnˆë‹L$<ƒÄ‰‰Y_^[]ä$¤$/,$ ¤$¤$¤$¤$d$ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̉|$ 33_3O3W ‹·ðt6þ4÷‰t$‹ðæÿ‹tõ¶ÿ3tý‹ùÁïçÿ3tý‹úÁï3tý‰t$‹óæÿÁë‹tõ¶ý3tý‹úÁïçÿ3tý‹øÁï3tý‰t$‹ñæÿÁé‹tõ¶þ3tý‹øÁïâÿçÿ3tý¶ÿ3tý‹|$ ‹TÕ¶Ä3TÅ‹D$ãÿ3TÝ‹\$3T͋΃Ç33_3O3W ;|$‰|$ ‚*ÿÿÿ‹ðæÿ‹tõæÿ¶ÿ‹|ýçÿ3÷‹ùÁïçÿ‹|ýçÿ3÷‹úÁï‹|ýçÿ3÷‰t$‹óæÿÁë‹tõæÿ¶ý‹|ýçÿ3÷‹úÁïçÿ‹|ýçÿ3÷‹øÁï‹|ýçÿ3÷‰t$‹ñæÿÁé‹tõæÿ¶þ‹|ýçÿ3÷‹øÁïâÿçÿ‹|ýçÿ3÷¶ÿ‹|ýçÿ3÷‹|$ âÿ‹TÕâÿ¶Ä‹DÅ%ÿ3ЋD$ãÿ‹\Ýãÿ3Ó‹\$‹LÍáÿ3ы΃Ç33_3O3W Ãd$Æcc¥Æcc¥ø||„ø||„îww™îww™ö{{ö{{ÿòò ÿòò Ökk½Ökk½Þoo±Þoo±‘ÅÅT‘ÅÅT`00P`00PÎgg©Îgg©V++}V++}çþþçþþµ××bµ××bM««æM««æìvvšìvvšÊÊEÊÊE‚‚‚‚‰ÉÉ@‰ÉÉ@ú}}‡ú}}‡ïúúïúú²YYë²YYëŽGGÉŽGGÉûðð ûðð A­­ìA­­ì³ÔÔg³ÔÔg_¢¢ý_¢¢ýE¯¯êE¯¯ê#œœ¿#œœ¿S¤¤÷S¤¤÷ärr–ärr–›ÀÀ[›ÀÀ[u··Âu··Âáýýáýý=““®=““®L&&jL&&jl66Zl66Z~??A~??Aõ÷÷õ÷÷ƒÌÌOƒÌÌOh44\h44\Q¥¥ôQ¥¥ôÑåå4Ñåå4ùññùññâqq“âqq“«ØØs«ØØsb11Sb11S*?*?  •ÇÇR•ÇÇRF##eF##eÃÃ^ÃÃ^0(0(7––¡7––¡  /ššµ/ššµ  $6$6€€›€€›ßââ=ßââ=Íëë&Íëë&N''iN''i²²Í²²ÍêuuŸêuuŸ  ƒƒžƒƒžX,,tX,,t4.4.6-6-Ünn²Ünn²´ZZî´ZZî[  û[  û¤RRö¤RRöv;;Mv;;M·ÖÖa·ÖÖa}³³Î}³³ÎR)){R)){Ýãã>Ýãã>^//q^//q„„—„„—¦SSõ¦SSõ¹ÑÑh¹ÑÑhÁíí,Áíí,@ `@ `ãüüãüüy±±Èy±±È¶[[í¶[[íÔjj¾Ôjj¾ËËFËËFg¾¾Ùg¾¾Ùr99Kr99K”JJÞ”JJÞ˜LLÔ˜LLÔ°XXè°XXè…ÏÏJ…ÏÏJ»ÐÐk»ÐÐkÅïï*Åïï*OªªåOªªåíûûíûû†CCņCCÅšMMךMM×f33Uf33U……”……”ŠEEÏŠEEÏéùùéùùþþ PPð PPðx<!>!–KKÝ–KKÝa½½Üa½½Ü ‹‹† ‹‹†ŠŠ…ŠŠ…àppàpp|>>B|>>BqµµÄqµµÄÌffªÌffªHHØHHØ÷öö÷ööÂaa£Âaa£j55_j55_®WWù®WWùi¹¹Ði¹¹Ð††‘††‘™ÁÁX™ÁÁX:':''žž¹'žž¹Ùáá8Ùáá8ëøøëøø+˜˜³+˜˜³"3"3Òii»Òii»©ÙÙp©ÙÙpŽŽ‰ŽŽ‰3””§3””§-››¶-››¶<"<"‡‡’‡‡’Ééé Ééé ‡ÎÎI‡ÎÎIªUUÿªUUÿP((xP((x¥ßßz¥ßßzŒŒŒŒY¡¡øY¡¡ø ‰‰€ ‰‰€  e¿¿Úe¿¿Ú׿æ1׿æ1„BBÆ„BBÆÐhh¸Ðhh¸‚AAÂAAÃ)™™°)™™°Z--wZ--w{°°Ë{°°Ë¨TTü¨TTüm»»Öm»»Ö,:,: @€6USVW‹t$‹|$‹ÄƒìƒäÀƒÄ‰D$è]­ ÷ÿÿ‹‹^‹N‹V èIõÿÿ‹d$‹t$‰‰^‰N‰V _^[]É|$ 33_3O3W ‹·ðt6þ4÷‰t$‹ðæÿ‹tõ¶þ3tý‹ùÁïçÿ3tý‹ûÁï3tý‰t$‹óæÿ‹tõ¶ü3tý‹úÁïçÿ3tý‹ùÁï3tý‰t$‹ñæÿ‹tõ¶ÿ3tý‹øÁïçÿ3tý‹úÁï3tý‹|$ âÿ‹TÕ¶Í3TÍ‹ÎÁëãÿ3TÝ‹\$Áè3TÅ‹D$ƒÇ33_3O3W ;|$‰|$ ‚(ÿÿÿ‹ðæÿ¶´5¶þ¶¼=Áç3÷‹ùÁïçÿ¶¼=Áç3÷‹ûÁï¶¼=Áç3÷‰t$‹óæÿ¶´5¶ü¶¼=Áç3÷‹úÁïçÿ¶¼=Áç3÷‹ùÁï¶¼=Áç3÷‰t$‹ñæÿ¶´5¶ÿ¶¼=Áç3÷‹øÁïçÿ¶¼=Áç3÷‹úÁï¶¼=Áç3÷‹|$ âÿ¶”¶Í¶Œ Áá3Ñ‹ÎÁëãÿ¶œÁã3Ó‹\$Áè¶„Áà3ЋD$ƒÇ33_3O3W ä$¤$¤$¤$¤$¤$¤$Qô§PQô§P~AeS~AeS¤Ã¤Ã:'^–:'^–;«kË;«kËEñEñ¬úX«¬úX«Kã“Kã“ 0úU 0úU­vmö­vmöˆÌv‘ˆÌv‘õL%õL%Oå×üOå×üÅ*Ë×Å*Ë×&5D€&5D€µb£µb£Þ±ZIÞ±ZI%ºg%ºgEê˜Eê˜]þÀá]þÀáÃ/uÃ/uLðLðF—£F—£kÓùÆkÓùÆ_ç_ç’œ•’œ•¿mzë¿mzë•RYÚ•RYÚÔ¾ƒ-Ô¾ƒ-Xt!ÓXt!ÓIài)Iài)ŽÉÈDŽÉÈDu‰ju‰jôŽyxôŽyx™X>k™X>k'¹qÝ'¹qݾáO¶¾áO¶ðˆ­ðˆ­É ¬fÉ ¬f}Î:´}Î:´cßJcßJå1‚å1‚—Q3`—Q3`bSEbSE±dwà±dwà»k®„»k®„þ þ ù+”ù+”pHhXpHhXEýEý”Þl‡”Þl‡R{ø·R{ø·«sÓ#«sÓ#rKârKâãWãWfU«*fU«*²ë(²ë(/µÂ/µÂ†Å{š†Å{šÓ7¥Ó7¥0(‡ò0(‡ò#¿¥²#¿¥²jºjºí‚\í‚\ŠÏ+ŠÏ+§y´’§y´’óòðóòðNiâ¡Niâ¡eÚôÍeÚô;վÕÑ4bÑ4bĦþŠÄ¦þŠ4.S4.S¢óU ¢óU Šá2Šá2¤öëu¤öëu ƒì9 ƒì9@`ïª@`ïª^qŸ^qŸ½nQ½nQ>!Šù>!Šù–Ý=–Ý=Ý>®Ý>®Mæ½FMæ½F‘Tµ‘TµqÄ]qÄ]ÔoÔo`Pÿ`Pÿ˜û$˜û$Ö½é—ֽ闉@C̉@CÌgÙžwgÙžw°èB½°èB½‰‹ˆ‰‹ˆç[8ç[8yÈîÛyÈîÛ¡| G¡| G|Bé|Béø„Éø„É €†ƒ €†ƒ2+íH2+íHp¬p¬lZrNlZrNýÿûýÿû…8V…8V=®Õ=®Õ6-9'6-9' Ùd Ùdh\¦!h\¦!›[TÑ›[TÑ$6.:$6.: g± g±“Wç“Wç´î–Ò´î–Ò›‘ž›‘ž€ÀÅO€ÀÅOaÜ ¢aÜ ¢ZwKiZwKi⓺ ⓺ À *åÀ *å<"àC<"àC  ò‹Ç­ò‹Ç­-¶¨¹-¶¨¹©È©ÈWñ…Wñ…¯uL¯uLî™Ý»î™Ý»£`ý£`ý÷&Ÿ÷&Ÿ\rõ¼\rõ¼Df;ÅDf;Å[û~4[û~4‹C)v‹C)vË#ÆÜË#ÆÜ¶íüh¶íüh¸äñc¸äñc×1ÜÊ×1ÜÊBc…Bc…—"@—"@„Æ „Æ …J$}…J$}Ò»=øÒ»=ø®ù2®ù2Ç)¡mÇ)¡mž/Kž/Kܲ0óܲ0ó †Rì †RìwÁãÐwÁãÐ+³l+³l©p¹™©p¹™”Hú”HúGéd"Géd"¨üŒÄ¨üŒÄ ð? ð?V},ØV},Ø"3ï"3ï‡INLJINÇÙ8ÑÁÙ8ÑÁŒÊ¢þŒÊ¢þ˜Ô 6˜Ô 6¦õϦõÏ¥zÞ(¥zÞ(Ú·Ž&Ú·Ž&?­¿¤?­¿¤,:ä,:äPx’ Px’ j_Ì›j_Ì›T~FbT~FböÂöÂØ¸èظè.9÷^.9÷^‚ïõ‚ïõŸ]€¾Ÿ]€¾iГ|iГ|oÕ-©oÕ-©Ï%³Ï%³È¬™;Ȭ™;}§}§èœcnèœcnÛ;»{Û;»{Í&x Í&x nYônYôìš·ìš·ƒOš¨ƒOš¨æ•neæ•neªÿæ~ªÿæ~!¼Ï!¼Ïïèæïèæºç›Ùºç›ÙJo6ÎJo6ÎêŸ ÔêŸ Ô)°|Ö)°|Ö1¤²¯1¤²¯*?#1*?#1Æ¥”0Æ¥”05¢fÀ5¢fÀtN¼7tN¼7ü‚ʦü‚ʦàаàа3§Ø3§Øñ˜Jñ˜JAìÚ÷AìÚ÷ÍPÍP‘ö/‘ö/vMÖvMÖCï°MCï°M̪MT̪MTä–ßä–ߞѵãžÑµãLjˆLjˆÁ,¸Á,¸FeQFeQ^ê^êŒ5]Œ5]ú‡tsú‡tsû A.û A.³gZ³gZ’ÛÒR’ÛÒRéV3éV3mÖGmÖGš×aŒš×aŒ7¡ z7¡ zYøŽYøŽë<‰ë<‰Î©'îΩ'î·aÉ5·aÉ5áåíáåízG±¹hÄ>8$4,8$4,£@_£@_ÃrÃr¼â% ¼â% (KÆÒy šÛÀþxÍZôݨ3ˆÇ1±Y'€ì_`Q©µJ -åzŸ“Éœï à;M®*õ°Èë»<ƒS™a+~ºwÖ&áicU! }USVW‹t$‹|$‹ÄƒìƒäÀƒÄ‰D$è]­àöÿÿ­€‹E€‹] ‹MÀ‹Uà‹E‹] ‹M@‹U`­€÷ÿÿ‹‹^‹N‹V è4ôÿÿ‹d$‹t$‰‰^‰N‰V _^[]ÃUSVW‹L$ƒù„…è]œüƒ|$,„¹­wëÿÿ¼$ÌþÿÿƒçÀ‹Å‹×%ÿãÿâÿ;Ór+Ó+úë+ÐâÿÂ@+ú‹D$‹\$‹T$$‹t$(‡çƒÄ‰|$‰D$‰\$‰L$‰T$ ‰t$$Ç„$,‹Ú¹=+Ý‹òãÿ|$<ûr û r I‰|$ ‰öó¥‹ð¿‹E‹] ‹M@‹U`­€Ouëí‹L$‹|$$÷Áðÿÿÿ„•‹‹_‹O‹W 33^3N3V ‹|$ è&èÿÿ‹t$‹|$‰‰_‰O‰W ‹L$v‰t$W‰T$ƒé÷Áðÿÿÿ‰L$u²÷Áu:‹t$$‹O‹W ‰‰^‰N‰V ƒ¼$,‹|$ t ¹<3À‰öó«‹d$_^[]܋Nj|$P»+Ù;þt‹ÿ‰öó¤ë<‹Ë3ÀI‰öóª_‹t$‹‹_ÇD$é1ÿÿÿ­wöÿÿ¼$ÌþÿÿƒçÀ‹Å ‹×%ÿãÿâÿ;Ór+Ó+úë+ÐâÿÂ@+úI‹D$‹\$‹T$$‹t$(‡çƒÄ‰|$‰D$‰\$‰L$‰T$ ‰t$$Ç„$,‹Ú¹=+Ý‹òãÿ|$<û r û r I‰|$ ‰öó¥‹ð¿‹E‹] ‹M@‹U`­€Ouëí ;t$„«‹|$$‰|$(I‹‹^‹N‹V ‹|$ èCñÿÿ‹|$(‹t$33_3O3W ƒîrP‰t$‹t$‹|$‰‰_‰O‰W ‰t$(v‰t$‰|$u©‹|$(‹t$$‹‹_‹O‹W ‰‰^‰N‰V 龋ÿ|$,‰‰_‰O‰W N‹÷‹|$‰öó¤‹|$뽋ÿ|$,‹‹^‹N‹V ‰‰_‰O‰W ‹|$ è”ðÿÿ‹|$$‹t$33_3O3W ‰‰^‰N‰V v‰t$t$,‹‹^‹N‹V ‰‰_‰O‰W ‹t$v‰t$‹L$ƒér ‰L$u„ë‹ÿ‹|$t$,<t÷Ù‰öó¤Iƒ¼$,‹|$ t¹<3ÀI‰öó«‹d$_^[]ÃUSVW‹t$‹|$÷Æÿÿÿÿ„Œ÷Çÿÿÿÿ„€è]­Açÿÿ‹L$ù€t"ùÀ„©ù„K¸þÿÿÿéK‹‹^‹N‹V ‰‰_‰O‰W 3Éë‹ÿ‹‹W ¶ò‹\õ¶öãÿ3Ë\õÁêãÿ¶ò3Ë\õ¶öãÿ3Ë\õãÿ3Ã3„‰G3G‰G3G‰G3G ‰GAƒÇƒù |—ÇGP 3À鸋‹^‹N‹V ‰‰_‰O‰W ‹N‹V‰O‰W3ÉëI‹‹W¶ò‹\õ¶öãÿ3Ë\õÁêãÿ¶ò3Ë\õ¶öãÿ3Ë\õãÿ3Ã3„‰G3G‰G3G‰G 3G ‰G$ƒùtA3G‰G(3G‰G,ƒÇë‰ÇGH 3Àé ‹‹^‹N‹V ‰‰_‰O‰W ‹F‹^‹N‹V‰G‰_‰O‰W3Éë‹W‹¶ò‹\õ¶öãÿ3Ë\õÁêãÿ¶ò3Ë\õ¶öãÿ3Ë\õãÿ3Ã3„‰G 3G‰G$3G‰G(3G ‰G,ƒùtbA‹Ð‹G¶ò‹\õ¶öãÿ3Ë\õÁêãÿ¶ò3Ë\õ¶öãÿ3Ë\õãÿ3ÉG03G‰G43G‰G83G‰G<ƒÇ é9ÿÿÿÇG03Àë¸ÿÿÿÿ_^[]ËD$‹L$‹T$ ƒì ‰$‰L$‰T$è3ýÿÿƒÄ ƒøtÃUSVW‹t$‹Žð <Ž‹‹^‹‹W‰‰_‰‰V‹F‹^ ‹O‹W ‰G‰_ ‰N‰V ƒÆƒï;÷uÊè]½Aïÿÿ­Aäÿÿ‹t$‹ŽðIƒÆ‹‹Ð¶ÜÁê%ÿ¶DŶ\Ý‹Ç3Dß¶Þâÿ¶TÕ¶\Ý3D×3D߉‹F‹Ð¶ÜÁê%ÿ¶DŶ\Ý‹Ç3Dß¶Þâÿ¶TÕ¶\Ý3D×3D߉F‹F‹Ð¶ÜÁê%ÿ¶DŶ\Ý‹Ç3Dß¶Þâÿ¶TÕ¶\Ý3D×3D߉F‹F ‹Ð¶ÜÁê%ÿ¶DŶ\Ý‹Ç3Dß¶Þâÿ¶TÕ¶\Ý3D×3D߉F I…üþÿÿ3À_^[]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌUSVW3ö‹|$‹L$‹\$ƒáø‹l$ Q„¾xèº ƒänÅïÉnÔËnôÐncôànsôðn{ ôøÔÊn_ÔÜnoÔîng Ôü~nSôÐsÑ ncôàÔËnsôð~OsÑ n[ƒÃ ôØÔÍnoÔÕ~OsÑ ÔÏnoÔå~O sÑ ÔÊnoÔõ~OsÑ ÔÌnoÔÝ~OsÑ ÔÎ~OsÑ ÔË~OƒÇ sÑ ƒé…,ÿÿÿ~Îwéʉ $‹÷寋7ƒÒƃ҉‹ò‹C÷寋wƒÒƃ҉G‹ò‹C÷寋wƒÒƃ҉G‹ò‹C ÷寋w ƒÒƃ҉G ‹ò‹C÷寋wƒÒƃ҉G‹ò‹C÷寋wƒÒƃ҉G‹ò‹C÷寋wƒÒƃ҉G‹ò‹C÷寋wƒÒƃ҉G‹ò‹ $ƒÃ ƒÇ ƒé…6ÿÿÿ‹L$ ƒáué´‹÷寋7ƒÒƃÒI‰‹ò„™‹C÷寋wƒÒƃÒI‰G‹òt‹C÷寋wƒÒƃÒI‰G‹òte‹C ÷寋w ƒÒƃÒI‰G ‹òtK‹C÷寋wƒÒƃÒI‰G‹òt1‹C÷寋wƒÒƃÒI‰G‹òt‹C÷寋wƒÒƃ҉G‹ò‹ÆY_^[]ÃUSVW3ö‹|$‹\$‹l$‹L$ ƒåø„†‹÷áƃ҉‹ò‹C÷áƃ҉G‹ò‹C÷áƃ҉G‹ò‹C ÷áƃ҉G ‹ò‹C÷áƃ҉G‹ò‹C÷áƃ҉G‹ò‹C÷áƃ҉G‹ò‹C÷áƃ҉G‹òƒÃ ƒÇ ƒítézÿÿÿ‹l$ƒåuëy‹÷áƃ҉‹òMti‹C÷áƃ҉G‹òMtW‹C÷áƃ҉G‹òMtE‹C ÷áƃ҉G ‹òMt3‹C÷áƃ҉G‹òMt!‹C÷áƃ҉G‹òMt‹C÷áƃ҉G‹ò‹Æ_^[]ÃUSVW‹t$‹|$‹\$ƒãøta‹÷à‰‰V‹G÷à‰F‰V ‹G÷à‰F‰V‹G ÷à‰F‰V‹G÷à‰F ‰V$‹G÷à‰F(‰V,‹G÷à‰F0‰V4‹G÷à‰F8‰V<ƒÇ ƒÆ@ƒëuŸ‹\$ƒãt]‹÷à‰K‰VtQ‹G÷à‰FK‰V tC‹G÷à‰FK‰Vt5‹G ÷à‰FK‰Vt'‹G÷à‰F K‰V$t‹G÷à‰F(K‰V,t ‹G÷à‰F0‰V4_^[]ÃUSVW‹T$‹D$‹\$÷ó_^[]ÃUSVW‹\$‹t$‹|$‹l$ 3Àƒåø„Ç‹‹ȸÀʃЉ ‹N‹WȸÀʃЉK‹N‹WȸÀʃЉK‹N ‹W ȸÀʃЉK ‹N‹WȸÀʃЉK‹N‹WȸÀʃЉK‹N‹WȸÀʃЉK‹N‹WȸÀʃЉKƒÆ ƒÇ ƒÃ ƒí…9ÿÿÿ‹l$ ƒå„´‹‹ȸÀʃÐM‰ „™‹N‹WȸÀʃÐM‰Kt‹N‹WȸÀʃÐM‰Kte‹N ‹W ȸÀʃÐM‰K tK‹N‹WȸÀʃÐM‰Kt1‹N‹WȸÀʃÐM‰Kt‹N‹WȸÀʃЉK_^[]ÃUSVW‹\$‹t$‹|$‹l$ 3Àƒåø„Ç‹‹+ȸÀ+ʃЉ ‹N‹W+ȸÀ+ʃЉK‹N‹W+ȸÀ+ʃЉK‹N ‹W +ȸÀ+ʃЉK ‹N‹W+ȸÀ+ʃЉK‹N‹W+ȸÀ+ʃЉK‹N‹W+ȸÀ+ʃЉK‹N‹W+ȸÀ+ʃЉKƒÆ ƒÇ ƒÃ ƒí…9ÿÿÿ‹l$ ƒå„´‹‹+ȸÀ+ʃÐM‰ „™‹N‹W+ȸÀ+ʃÐM‰Kt‹N‹W+ȸÀ+ʃÐM‰Kte‹N ‹W +ȸÀ+ʃÐM‰K tK‹N‹W+ȸÀ+ʃÐM‰Kt1‹N‹W+ȸÀ+ʃÐM‰Kt‹N‹W+ȸÀ+ʃЉK_^[]ÃUSVW‹\$‹t$‹|$‹l$ 3Àƒåø„Ç‹‹+ȸÀ+ʃЉ ‹N‹W+ȸÀ+ʃЉK‹N‹W+ȸÀ+ʃЉK‹N ‹W +ȸÀ+ʃЉK ‹N‹W+ȸÀ+ʃЉK‹N‹W+ȸÀ+ʃЉK‹N‹W+ȸÀ+ʃЉK‹N‹W+ȸÀ+ʃЉKƒÆ ƒÇ ƒÃ ƒí…9ÿÿÿ‹l$ ƒå„å‹‹+ȸÀ+ʃЉ ƒÆƒÇƒÃM„Á‹‹+ȸÀ+ʃЉ ƒÆƒÇƒÃM„‹‹+ȸÀ+ʃЉ ƒÆƒÇƒÃMt}‹‹+ȸÀ+ʃЉ ƒÆƒÇƒÃMt]‹‹+ȸÀ+ʃЉ ƒÆƒÇƒÃMt=‹‹+ȸÀ+ʃЉ ƒÆƒÇƒÃMt‹‹+ȸÀ+ʃЉ ƒÆƒÇƒÃƒ|$$„Š‹l$$ƒý„}׺+Õ‹êƒåø„Õ¹‹+ȸÀ+ʃЉ ¹‹W+ȸÀ+ʃЉK¹‹W+ȸÀ+ʃЉK¹‹W +ȸÀ+ʃЉK ¹‹W+ȸÀ+ʃЉK¹‹W+ȸÀ+ʃЉK¹‹W+ȸÀ+ʃЉK¹‹W+ȸÀ+ʃЉKƒÇ ƒÃ ƒí…+ÿÿÿ‹T$$½+êƒå„|¹‹+ȸÀ+ʃÐM‰ „^¹‹W+ȸÀ+ʃÐM‰K„>¹‹W+ȸÀ+ʃÐM‰K„¹‹W +ȸÀ+ʃÐM‰K „þ¹‹W+ȸÀ+ʃÐM‰K„Þ¹‹W+ȸÀ+ʃÐM‰K„¾¹‹W+ȸÀ+ʃЉKé ƒåøty‹+ȉ ƒ‹N+ȉKƒ ‹N+ȉKƒ‹N +ȉK ƒú‹N+ȉKƒò‹N+ȉKƒê‹N+ȉKƒâ‹N+ȉKƒÚƒÆ ƒÃ ƒíu‡‹l$$ƒå„‹+ȉ ƒÎM„‹N+ȉKƒÂM„í‹N+ȉKƒ¶M„Ø‹N +ȉK ƒªM„ËN+ȉKƒžM„®‹N+ȉKƒ’M„™‹N+ȉKƒ†¸é‹‰ ‹N‰K‹N‰K‹N ‰K ‹N‰K‹N‰K‹N‰K‹N‰KƒÆ ƒÃ ƒíuÇ‹l$$ƒåt:‹‰ Mt3‹N‰KMt*‹N‰KMt!‹N ‰K Mt‹N‰KMt‹N‰KMt‹N‰K¸_^[]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌUSVW3À‹|$(ƒÿŒCt$T$‹ìƒÇ÷ßd¼à÷ß‹Ä+Â%ÿ+à3Ôâò+âƒäÀ‹‹^‹N‹V ‹v‹6‰D$‰\$‰L$ ‰T$‰t$_ý‰l$xèº ƒ¸ÿÿÿÿnø‹t$‹|$ ‹l$3Ò3Én'n.n]ôìêèÛÇôl$ôÝÔØnMnFsÒ sÓ AôÄôÍÔÐÔÙÐÛÇnLÔØnDŽsÒ ~\ŒsÓ I;Ë|ÍôÄôÍÔÐÔÙÐÛÇÔØ~\ŒsÒ sÓ ÔÚ\œ B3Én$—n.nt$ n]ôìÔîèêÛÇôl$ôÝÔØnt$$nMnFsÒ sÓ ÔÖAKôÄôÍÔÐÔÙÐntŒ$ÛÇnLÔØnDŽsÒ ~\ŒsÓ ÔÖKIuÆ‹ÙôÄôÍÔÐÔÙÐÛÇÔØ~\ŒsÒ sÓ ntœ$ÔÚÔÞ\œ R;ÓŽAÿÿÿwé ¤$‹t$k‹|$ 3ɋփå+×DŸ ê‹?„>‰D$‹3Ò›‹ê÷çèIƒÒ‹Ž;ˉlŒ|é‹ê÷ç‹|$Å‹t$ƒÒ¯|$ ‰Dœ 3ɉTœ$‰Lœ(‹÷çD$ ‹FƒÒAéq‹ê÷çlŒ IƒÒ苎ƒÒ;ˉlŒ|â‹ê÷çDœ ‹|$ƒÒ‹t$èƒÒ¯|$ 3ÉTœ$‰lœ ƒÑ‹‰Tœ$‰Lœ(÷çD$ ‹FƒÒ¹¤$›‹ê÷çlŒ IƒÒ苎ƒÒ;ˉlŒ|â‹ê÷çlœ ƒÒèƒÒ‰lœ3À‹L$ Tœ$Dœ(I‰Tœ ;L$‰Dœ$„»‹9‹t$‰L$ 3É3Ò‹é&ÿÿÿ›‰$‰L$ ‹Ç÷ç‰D$ ‹ÚÑêƒãA¤$‹ÿ‹Ž‹ê÷çÅIƒÒ,CÁè; $‹Ø‰lŒ|à‹Ž‹ê÷çÅ‹|$ƒÒ‹t$,C¯|$ Áè‰lŒ ,P‹Áê‰lŒ$‰TŒ(÷çD$ ‹ÙƒÒ‹F¹¤$I‹ê÷çlŒ ƒÒè‹DŽƒÒ‰lŒ‹ê÷çlŒ$IƒÒ苎ƒÒ;ˉlŒ|Ê‹ê÷çlœ ƒÒèƒÒ‰lœ‹L$ 3À‹t$Tœ$Dœ(‰Tœ ;ˉDœ$„¤‹|ŽI‹Ç‰L$ ÷çDŒ ƒÒ‰DŒ 3í;ËItE‹ÚÑêƒã¤$I‹Ž‹ê÷çÅ,ƒÒÁèlŒ IƒÐëƒÐ; $‰lŒ‹Ø~Ô‹êSÁí‹|$‹t$¯|$ TŒ ‹ƒÕ‰TŒ ‰lŒ$÷çD$ YÿƒÒ¹‹Féõþÿÿ‹l$‹|$t$ ‹‹Ë3Ò¤$¤$D•‰—I‹D–R}ïƒØ#ð÷Ћï#è õ‹ÿ‹ž‰Ÿ‰Lœ K}ó‹d$¸_^[]ÃMontgomery Multiplication for x86, CRYPTOGAMS by ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$ W‹|$US3Û‹3É‹3í÷âØ‹D$Ê‹ƒÕ‰‹F3Û÷âÈ‹ê‹WƒÓ÷âÈ‹D$ꋃӉH‹F3É÷âè‹FÚ‹WƒÑ÷âè‹Ú‹WƒÑ÷âè‹D$Ú‹ƒÑ‰h‹F 3í÷âØ‹FÊ‹WƒÕ÷âØ‹FÊ‹WƒÕ÷âØ‹Ê‹W ƒÕ÷âØ‹D$Ê‹ƒÕ‰X ‹F3Û÷âÈ‹F ê‹WƒÓ÷âÈ‹Fê‹WƒÓ÷âÈ‹Fê‹W ƒÓ÷âÈ‹ê‹WƒÓ÷âÈ‹D$ꋃӉH‹F3É÷âè‹FÚ‹WƒÑ÷âè‹F Ú‹WƒÑ÷âè‹FÚ‹W ƒÑ÷âè‹FÚ‹WƒÑ÷âè‹Ú‹WƒÑ÷âè‹D$Ú‹ƒÑ‰h‹F3í÷âØ‹FÊ‹WƒÕ÷âØ‹FÊ‹WƒÕ÷âØ‹F Ê‹W ƒÕ÷âØ‹FÊ‹WƒÕ÷âØ‹FÊ‹WƒÕ÷âØ‹Ê‹WƒÕ÷âØ‹D$Ê‹ƒÕ‰X‹F3Û÷âÈ‹Fê‹WƒÓ÷âÈ‹Fê‹WƒÓ÷âÈ‹Fê‹W ƒÓ÷âÈ‹F ê‹WƒÓ÷âÈ‹Fê‹WƒÓ÷âÈ‹Fê‹WƒÓ÷âÈ‹ê‹WƒÓ÷âÈ‹D$ê‹WƒÓ‰H‹F3É÷âè‹FÚ‹WƒÑ÷âè‹FÚ‹W ƒÑ÷âè‹FÚ‹WƒÑ÷âè‹F Ú‹WƒÑ÷âè‹FÚ‹WƒÑ÷âè‹FÚ‹WƒÑ÷âè‹D$Ú‹WƒÑ‰h ‹F3í÷âØ‹FÊ‹W ƒÕ÷âØ‹FÊ‹WƒÕ÷âØ‹FÊ‹WƒÕ÷âØ‹F Ê‹WƒÕ÷âØ‹FÊ‹WƒÕ÷âØ‹D$Ê‹W ƒÕ‰X$‹F3Û÷âÈ‹Fê‹WƒÓ÷âÈ‹Fê‹WƒÓ÷âÈ‹Fê‹WƒÓ÷âÈ‹F ê‹WƒÓ÷âÈ‹D$ê‹WƒÓ‰H(‹F3É÷âè‹FÚ‹WƒÑ÷âè‹FÚ‹WƒÑ÷âè‹FÚ‹WƒÑ÷âè‹D$Ú‹WƒÑ‰h,‹F3í÷âØ‹FÊ‹WƒÕ÷âØ‹FÊ‹WƒÕ÷âØ‹D$Ê‹WƒÕ‰X0‹F3Û÷âÈ‹Fê‹WƒÓ÷âÈ‹D$ê‹WƒÓ‰H4‹F3É÷âè‹D$ڃщh8‰X<[]_^ÃV‹t$ W‹|$US3Û‹3É‹3í÷âØ‹D$Ê‹ƒÕ‰‹F3Û÷âÈ‹ê‹WƒÓ÷âÈ‹D$ꋃӉH‹F3É÷âè‹FÚ‹WƒÑ÷âè‹Ú‹WƒÑ÷âè‹D$Ú‹ƒÑ‰h‹F 3í÷âØ‹FÊ‹WƒÕ÷âØ‹FÊ‹WƒÕ÷âØ‹Ê‹W ƒÕ÷âØ‹D$Ê‹WƒÕ‰X ‹F 3Û÷âÈ‹Fê‹WƒÓ÷âÈ‹Fê‹W ƒÓ÷âÈ‹D$ê‹WƒÓ‰H‹F 3É÷âè‹FÚ‹W ƒÑ÷âè‹D$Ú‹W ƒÑ‰h‹F 3í÷âØ‹D$ʃՉX‰H[]_^ÃVWUS‹|$‹t$3Û3É‹3í÷àØÊ‹ƒÕ‰‹F3Û÷âÀÒƒÓÈê‹FƒÓ‰O‹3É÷âÀÒƒÑèÚ‹FƒÑ÷àèÚ‹ƒÑ‰o‹F 3í÷âÀÒƒÕØÊ‹FƒÕ‹V÷âÀÒƒÕØÊ‹FƒÕ‰_ ‹3Û÷âÀÒƒÓÈê‹F ƒÓ‹V÷âÀÒƒÓÈê‹FƒÓ÷àÈꋃӉO‹F3É÷âÀÒƒÑèÚ‹FƒÑ‹V÷âÀÒƒÑèÚ‹F ƒÑ‹V÷âÀÒƒÑèÚ‹FƒÑ‰o‹3í÷âÀÒƒÕØÊ‹FƒÕ‹V÷âÀÒƒÕØÊ‹FƒÕ‹V÷âÀÒƒÕØÊ‹F ƒÕ÷àØÊ‹ƒÕ‰_‹F3Û÷âÀÒƒÓÈê‹FƒÓ‹V÷âÀÒƒÓÈê‹FƒÓ‹V÷âÀÒƒÓÈê‹FƒÓ‹V ÷âÀÒƒÓÈê‹FƒÓ‰O‹V3É÷âÀÒƒÑèÚ‹FƒÑ‹V÷âÀÒƒÑèÚ‹FƒÑ‹V ÷âÀÒƒÑèÚ‹FƒÑ÷àèÚ‹VƒÑ‰o ‹F3í÷âÀÒƒÕØÊ‹FƒÕ‹V ÷âÀÒƒÕØÊ‹FƒÕ‹V÷âÀÒƒÕØÊ‹FƒÕ‰_$‹V 3Û÷âÀÒƒÓÈê‹FƒÓ‹V÷âÀÒƒÓÈê‹FƒÓ÷àÈê‹VƒÓ‰O(‹F3É÷âÀÒƒÑèÚ‹FƒÑ‹V÷âÀÒƒÑèÚ‹FƒÑ‰o,‹V3í÷âÀÒƒÕØÊ‹FƒÕ÷àØÊ‹VƒÕ‰_0‹F3Û÷âÀÒƒÓÈê‹FƒÓ‰O43É÷àèڃщo8‰_<[]_^ÃVWUS‹|$‹t$3Û3É‹3í÷àØÊ‹ƒÕ‰‹F3Û÷âÀÒƒÓÈê‹FƒÓ‰O‹3É÷âÀÒƒÑèÚ‹FƒÑ÷àèÚ‹ƒÑ‰o‹F 3í÷âÀÒƒÕØÊ‹FƒÕ‹V÷âÀÒƒÕØÊ‹F ƒÕ‰_ ‹V3Û÷âÀÒƒÓÈê‹FƒÓ÷àÈê‹VƒÓ‰O‹F 3É÷âÀÒƒÑèÚ‹F ƒÑ‰o3í÷àØʃՉ_‰O[]_^ÃÖ ¾ æ ’ ‚ h X J @ 0  ¨ ø• è• Ø• È• º• – œ• Œ• z• f• V• (– >– L– \– v– Œ– ”– ²– Æ– ö– Ú– — (— ®• H• :• *• • • à” î” „‘ Ž‘ ˜‘ ¦‘ ²‘ À‘ È‘ Б Ú‘ ä‘ î‘ ø‘ ’ ’ ’ z‘ (’ 2’ <’ F’ N’ X’ d’ n’ x’ ‚’ Š’ ”’ ž’ ¦’ °’ º’ Â’ Î’ Ø’ à’ è’ ð’ ø’ “ “ “ “ *“ 4“ >“ J“ T“ ^“ h“ r“ |“ †“ “ ˜“ ¢“ ¬“ ¶“ À“ Ö“ è“ ö“ ” ” $” 2” @” P” b” x” œ” ¦” ´” ¼” Æ” p‘ V‘ B‘ (‘ ‘ €€€ €€€ €q€t€s€4€€7€€ €€€€€€p€€o€€€0,P ’U %s no ApplinkTableno OPENSSL_ApplinkOPENSSL_Applinkno host applicationunimplemented functionOPENSSL_Uplink(%p,%02X): OPENSSL_ia32capService-0xOpenSSL: FATALOPENSSL%s(%d): OpenSSL internal error, assertion failed: %s compstoreec_pre_compbnecdhececdsauienginedynlockdsodebug_malloc2dhRSA_blindingreaddirgetservbynamegethostbynameBIOdebug_mallocrand2randssl_methodsslssl_sess_certssl_sessionssl_certssl_ctxx509_storeevp_pkeyrsadsax509_reqx509_crlx509_pkeyx509_infox509ex_dataerr<>è$ ä$ Ü$ Ô$ È$ ¼$ °$ ¤$  $ œ$ $ „$ |$ p$ d$ T$ P$ D$ <$ 4$ $$  $ $ $ ø# è# ä# Ô# Ð# È# À# ¼# ´# °# ¨# ¤# ˜# # ˆ# .\crypto\dyn_lck.cpointer != NULLERRORdynamic.\crypto\mem.c.\crypto\mem_dbg.c" thread=%lu, file=%s, line=%d, info="number=%d, address=%08lX thread=%lu, %5lu file=%s, line=%d, [%02d:%02d:%02d] %ld bytes leaked in %d chunks not availableOPENSSLDIR: "c:/MailRoot/bin/ssl"platform: %sVC-WIN32compiler: %scl /MD /Ox /O2 /Ob2 /W3 /WX /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DAES_ASM -DBN_ASM -DOPENSSL_BN_ASM_PART_WORDS -DOPENSSL_BN_ASM_MONT -DMD5_ASM -DSHA1_ASM -DRMD160_ASM -DOPENSSL_USE_APPLINK -I. /Fdout32dll -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_CMS -DOPENSSL_NO_JPAKE -DOPENSSL_NO_CAPIENG -DOPENSSL_NO_KRB5 -DOPENSSL_NO_DYNAMIC_ENGINE built on: %sSun Dec 20 20:06:10 2009OpenSSL 0.9.8l 5 Nov 2009.\crypto\ex_data.c.\crypto\tmdiff.cH¯¼šò×z>ÐcAðAno dynlock create callbackINT_NEW_EX_DATAINT_FREE_EX_DATAINT_DUP_EX_DATADEF_GET_CLASSDEF_ADD_INDEXCRYPTO_set_ex_dataCRYPTO_get_new_lockidCRYPTO_get_new_dynlockidCRYPTO_get_ex_new_indexMD2 part of OpenSSL 0.9.8l 5 Nov 2009md2(int)MD4 part of OpenSSL 0.9.8l 5 Nov 2009MD5 part of OpenSSL 0.9.8l 5 Nov 2009SHA part of OpenSSL 0.9.8l 5 Nov 2009SHA1 part of OpenSSL 0.9.8l 5 Nov 2009SHA-256 part of OpenSSL 0.9.8l 5 Nov 2009˜/ŠB‘D7qÏûÀµ¥Ûµé[ÂV9ññY¤‚?’Õ^«˜ªØ[ƒ¾…1$Ã} Ut]¾rþ±Þ€§Ü›tñ›ÁÁi›ä†G¾ïÆÁÌ¡ $o,é-ª„tJÜ©°\ÚˆùvRQ>˜mÆ1¨È'°ÇY¿ó àÆG‘§ÕQcÊg))… ·'8!.üm,M 8STs e» jv.ÉÂ…,r’¡è¿¢Kf¨p‹K£QlÇè’Ñ$™Ö…5ôp jÁ¤l7LwH'µ¼°4³ 9JªØNOÊœ[óo.hî‚toc¥xxȄnjúÿ¾ëlP¤÷£ù¾òxqÆSHA-512 part of OpenSSL 0.9.8l 5 Nov 2009"®(ט/ŠBÍeï#‘D7q/;MìÏûÀµ¼Û‰¥Ûµé8µHó[ÂV9жññY›O¯¤‚?’mÚÕ^«B£˜ªؾopE[ƒŒ²äN¾…1$â´ÿÕÃ} Uo‰{òt]¾r±–;þ±Þ€5Ç%§Ü›”&iÏtñ›ÁÒJñžÁi›äã%O8†G¾ïµÕŒ‹ÆÁeœ¬wÌ¡ $u+Yo,é-ƒä¦nª„tJÔûA½Ü©°\µSƒÚˆùv«ßfîRQ>˜2´-mÆ1¨?!û˜È'°äï¾ÇY¿Â¨=ó àÆ%§ “G‘§Õo‚àQcÊpn g))ü/ÒF… ·'&É&\8!.í*ÄZüm,Mß³• 8SÞc¯‹Ts e¨²w<» jvæ®íG.ÉÂ;5‚…,r’dñL¡è¿¢0B¼Kf¨‘—øÐp‹KÂ0¾T£QlÇRïÖè’Ñ©eU$™Ö* qW…5ô¸Ñ»2p jÈÐÒ¸Á¤S«AQl7™ëŽßLwH'¨H›áµ¼°4cZÉų 9ËŠAãJªØNsãcwOÊœ[£¸²Öóo.hü²ï]î‚t`/Coc¥xr«ð¡xÈ„ì9dÇŒ(c#úÿ¾é½‚ÞëlP¤yƲ÷£ù¾+SrãòxqÆœa&êÎ>'ÊÂÀ!Ǹ†ÑëàÍÖ}ÚêxÑnîO}õºorªgð¦˜È¢Å}c ® ù¾˜?G5 q„}#õwÛ(“$Ç@{«Ê2¼¾É ¾žË¾ÔÅL*~eüœ)YìúÖ:«oË_XGJŒDllen>=0 && len<=(int)sizeof(ctx->key).\crypto\hmac\hmac.cj <= (int)sizeof(ctx->key)RIPE-MD160 part of OpenSSL 0.9.8l 5 Nov 2009libdes part of OpenSSL 0.9.8l 5 Nov 2009DES part of OpenSSL 0.9.8l 5 Nov 2009des(%s,%s,%s,%s)idxcisc4long  ##%%&&))**,,//1122447788;;==>>@@CCEEFFIIJJLLOOQQRRTTWWXX[[]]^^aabbddgghhkkmmnnppssuuvvyyzz||€€ƒƒ……††‰‰ŠŠŒŒ‘‘’’””——˜˜››žž¡¡¢¢¤¤§§¨¨««­­®®°°³³µµ¶¶¹¹ºº¼¼¿¿ÁÁÂÂÄÄÇÇÈÈËËÍÍÎÎÐÐÓÓÕÕÖÖÙÙÚÚÜÜßßààããååææééêêììïïññòòôô÷÷øøûûýýþþþþþþþþþþààààññññþþþþþþþþààññààññààññààññþþþþþþþþàþàþñþñþþàþàþñþñ        0 0 0  0 0  0 0  0           0  0 0 0 0  0  0  0          $$  $ $ $$  $ $             $$  $ $ $$  $ $                  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0                            ((  ((  ((  ((  ((  ((  ((  ((          """"   " " " " ((((((((    """" ( ( ( ("("("("(€@€@@€€@€€@€@€@@€@@€€@€@€€@@@€€@€@€@€€@@@€@€@€€@€@€@€@€@@€€@€@@€@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@                            @€@ €@ @ € @ @ € € €@€ €@ @ €@ € @ €@ €@ € €€@ @ @ €@ € €@ €@ €€ @ € @ @ € @@ € @ €@€ €@ @€@ € € €@ @@ €@B@B@B@@@BB@BBB@B@@@@BBB@BB@BB@@€€ ‚ € €€€ €‚ € ‚€€‚€ € € €‚€€ €‚ € ‚ €€ €€ €‚ €€€ €‚ € ‚€€ €  €€‚ €€€ €‚ €€ € ‚€€ € €‚ €‚ €€ €‚.\crypto\des\enc_read.c.\crypto\des\enc_writ.cÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ   !"#$% !"#$%&'()*+,-./0123456789:;<=>?@ABCD./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzRC2 part of OpenSSL 0.9.8l 5 Nov 2009RC4 part of OpenSSL 0.9.8l 5 Nov 2009rc4(idx,int)IDEA part of OpenSSL 0.9.8l 5 Nov 2009idea(int)ˆj?$Ó£….ŠDsp"8 ¤Ð1Ÿ)˜ú.‰lNìæ!(EwÐ8ÏfT¾l é4·)¬ÀÝP|ɵՄ? GµÙÕ’ûy‰¦ 1Ѭµß˜Ûrý/·ßÐí¯á¸–~&jE|º™,ñG™¡$÷l‘³âòüŽ…Ø iciNWq£þX¤~=“ôt• X¶ŽrXÍ‹qîJ‚¤T{µYZÂ9Õ0œ`ò*#°ÑÅð…`(yAÊï8Û¸°ÜyŽ:`‹žl>аÁw×'K1½Ú/¯x`\`Uó%U攫Uªb˜HW@ècj9ÊU¶«*4\Ì´ÎèA¯†T¡“ér|î³*¼oc]Å©+ö1t>\Γ‡›3ºÖ¯\Ï$lS2zw†•(˜H;¯¹Kkè¿Ä“!(fÌ Øa‘©!û`¬|H2€ì]]]„ï±u…é#&܈eë>‰#Ŭ–Óóom9Bôƒ‚D . „¤JðÈi^›žBhÆ!šléöaœ gðˆÓ«Ò Qjh/TØ(§–£3Q«l ïnä;zPð;º˜*û~eñ¡v¯9>YÊfˆC‚†îŒ´ŸoEÃ¥„}¾^‹;Øuoàs Á…ŸD@¦jÁVbªÓNw?6rßþ=›B$×Ð7H ÐÓêÛ›ÀñIÉrS{™€ØyÔ%÷ÞèöPþã;Ly¶½àl—ºÀ¶O©ÁÄ`Ÿ@ž\^c$j¯oûhµSl>ë²9oìR;Qüm,•0›DEÌ ½^¯Ðã¾ýJ3Þ(f³K.W¨ËÀtÈE9_ ÒÛûÓ¹½ÀyU 2`Æ¡Öyr,@þ%ŸgÌ£ûøé¥Žø"2Ûßu<kaýÈP/«R­úµ=2`‡#ýH{1S‚ß>»W\ž ŒoÊ.V‡Ûißö¨BÕÃÿ~(Æ2g¬sUOŒ°'[iÈXÊ»]£ÿá ð¸˜=ú¸ƒ!ýlµüJ[ÓÑ-yäSšeEø¶¼IŽÒ—ûKÚòÝá3~ˤAûbèÆäÎÚÊ ïLw6þž~дñ+MÚÛ•˜‘®qŽ­ê Õ“kÐÑŽÐà%ǯ/[<Ž·”uŽûâöd+ò¸ˆˆð  ^­OÃh‘ñÏÑ­Á¨³"//w¾þ-uê¡‹Ì åètoµÖó¬™â‰ÎàO¨´·àý;Ä|Ù¨­Òf¢_w•€sÌ“w!e ­æ†úµwõBTÇÏ5û ¯Íë ‰>{ÓAÖI~®-%^³q »h"¯à¸W›6d$¹ ð‘cUª¦ßY‰CÁxSZÙ¢[} Źåv&ƒ©Ï•bhÈAJsNÊ-G³J©{RQ)Sš?WÖ䯛¼v¤`+tæµoºéWkì–òÙ *!ec¶¶ù¹ç.4ÿdV…Å]-°S¡Ÿ©™Gºj…népzKD)³µ. uÛ#&ݦn­}ß§I¸`îœf²íqŒªìÿšilRdVឱ¥6)L u@Y >:䚘T?eB[ÖäkÖ?÷™œÒ¡õ0èïæ8-MÁ]%ð† ÝL&ëp„Æé‚c^Ì?kh Éïº>—<¡pjk„5h†â RSœ·7Pª„>\®ÞìD}ޏòW7Ú:° Pððÿ³õ ®²tµÇÈìAu¤™Í8â/ê;¡»€21³>8‹TN¹mO Bo¿ ö¸,y|—$r°yV¯‰¯¼wšÞ“Ù®‹³.?ÏÜrU$qk.æÝP‡Í„ŸGXzÚt¼šŸ¼Œ}Ké:ìzìú…ÛfC cÒÃdÄGïÙ27;CݺÂ$CM¡QÄe*”PÝä:žøßqUN1Öw¬›_ñV5kÇ£×;< ¥$Yíæòúûñ—,¿ºžn<pEㆱoéê ^†³*>Zçwú=N¹Üe)ç™Ö‰>€%ÈfRxÉL.j³œºÆxêâ”S<ü¥ô- §N÷ò=+6&9`y§#R¶÷nþ­ëfÃê•E¼ãƒÈ{¦Ñ7±(ÿŒïÝ2Ã¥Zl¾…!Xe˜«h¥Îî;•/Û­}ï*„/n[(¶!pa)uGÝìŸa0¨Ì–½aëþ4Ïcª\sµ9¢pL žžÕު˼†Ìî§,b`«\«œn„󲯋dÊð½¹i# P»Ze2Zh@³´*<Õéž1÷¸!À T›™ _‡~™÷•¨}=bšˆ7øw-ã—_“íh)ˆ5ÖæÇ¡ßÞ–™ºXx¥„õWcr"ÿÛ–FÂë ³ÍT0.SäHÙ(1¼mïòëXêÿÆ4aí(þs<|îÙJ]ã·dè]Bà> ¶âîEꫪ£OlÛÐOËúBôBǵ»jï;Oe!ÍAžyØÇM…†jGKäPb=ò¡bÏF&[ ƒˆü£¶ÇÁÃ$’tËi Š„G…²’V¿[ H­t±b‚#*BXêõU >ô­ap?#’ðr3A~“ñì_ÖÛ;"lY7Þ|`tî˧ò…@n2w΄€¦žPøUØïè5—Ùaª§i©Â Åü«ZÜÊ €.zDž„4EÃgÕýÉžÓÛsÛ͈UyÚ_g@Cgãe4ÄÅØ8>qžø(= ÿmñç!>J=°+Ÿãæ÷­ƒÛhZ=é÷@”&Lö4)i”÷ A÷Ôv.kô¼h¢Ôq$Ôjô 3·Ô·C¯aP.ö9FE$—tO!@ˆ‹¿ü•M¯‘µ–ÓÝôpE/ fì ¼¿…—½Ðm¬…Ë1³'ë–A9ýUæG%Úš Ê«%xP(ô)SÚ†, ûm¶ébÜhiHפÀhî¡'¢þ?OŒ­‡èàŒµ¶Öôz|Ϊì_7Ó™£xÎB*k@5žþ ¹…óÙ«×9î‹N;÷úÉVmK1f£&²—ãêtún:2C[Ý÷çAhû xÊNõ û—³þجV@E'•Hº::SU‡ƒ ·©kþK•–мg¨UXš¡c)©Ì3Ûá™VJ*¦ù%1?~ô^|1)èøýp/'\»€ã,(HÁ•"mÆä?ÁH܆ÇîÉùA¤yG@nˆ]ëQ_2ÑÀ›ÕÁ¼òd5A4x{%`œ*`£èøßlc´ž2áÑOf¯ÑÊà•#ká’>3b $;"¹¾î¢²…™ ºæŒ rÞ(÷¢-ExÐý”·•b}dðõÌço£ITúH}‡'ýÃ>óAcG tÿ.™«no:7ýøô`ܨøÝë¡Lá™ knÛU{Æ7,gm;Ôe'èÐÜÇ )ñ£ÿÌ’9µ íiûŸ{fœ}ÛÎ Ï‘ £^Ùˆ/»$­[Q¿y”{ëÖ;v³.97yYÌ—â&€-1.ô§­Bh;+jÆÌLuñ.x7BjçQ’·æ»¡PcûKkúíÊؽ%=ÉÃáâYBD† nì Ù*ê«ÕNg¯d_¨†Úˆé¿¾þÃädW€¼†À÷ðø{x`M``FƒýѰ8ö®EwÌü6×3kBƒq«ð‡A€°_^<¾W w$®è½™BFUa.X¿ôXN¢ýÝò8ïtô½‰‡ÃùfSt޳ÈUòu´¹ÙüFa&ëz„ß‹yj„â•_‘ŽYnFpW´ ‘UÕŒLÞÉᬠ¹Ð‚»Hb¨ž©tu¶· ܩࡠ-f3F2ÄZ茾ð % ™Jþn=¹ߤ¥ ò†¡iñh(ƒÚ·Üþ9W›Îâ¡RÍO^Púƒ§Äµ 'Ðæ 'ŒøšA†?wL`õ¨a(zðà†õÀªX`b}Ü0מæcê8#”ÝÂS4ÂÂVî˻޶¼¡}üëvYÎ äoˆ|K= r9$|’|_rㆹMr´[Áü¸žÓxUTíµ¥üÓ|=ØÄ­M^ïPøæa±Ù…¢<QlçÇÕoÄNáVο*67ÈÆÝ42š×‚c’Žúgà`@7Î9:ÏõúÓ7w«-ÅZžg°\B7£O@'‚Ó¾›¼™ŽÕs¿~-Ö{ÄÇkŒ·E¡!¾±n²´n6j/«HWyn”¼Òv£ÆÈÂIeîøS}ÞF sÕÆMÐLÛ»9)PFº©è&•¬ã^¾ðÕú¡šQ-jâŒïc"¸Â‰Àö.$Cª¥¤ÐòœºaÀƒMjé›PåÖ[dºù¢&(á::§†•©KébUïÓï/ÇÚ÷R÷io?Y úw©ä€†°‡­æ ›“å>;Zýé—×4žÙ·ð,Q‹+:¬Õ–}¦}Ö>ÏÑ(-}|Ï%Ÿ›¸ò­r´ÖZLõˆZq¬)àæ¥àý¬°G›ú“íÄÓèÌW;()fÕø(.y‘_xU`uíD–÷Œ^ÓãÔmºmôˆ%a¡½ðdžëâW<ì'—*:©›m?õ!cûfœõóÜ&(Ù3uõýU±‚4V»<ºŠwQ(øÙ ÂgQÌ«_’­ÌQèMŽÜ08bX7‘ù “ÂzêÎ{>ûdÎ!Q2¾Ow~㶨F=)ÃiSÞH€æd®¢$²mÝý-…if! Fš³ÝÀEdÏÞlX®È Ý÷¾[@XÒÌ»ã´k~j¢ÝEÿY:D 5>ÕÍ´¼¨Îêr»„dú®fGo<¿cä›Òž]/Tw®pcNö tW[çqrø]}S¯Ë@@Ìâ´NjFÒ4„¯(°á:˜•´Ÿ¸H n΂;?o‚« 5Kø'r'±`aÜ?“ç+y:»½%E4á9ˆ KyÎQ·É2/ɺ ~ÈàöÑǼÃÏǪè¡I‡š½OÔËÞÚÐ8Ú Õ*Ã9g6‘Æ|1ùO+±à·Yž÷:»õCÿÕòœEÙ',"—¿*üæqü‘%”›a“åú뜶ÎYd¨ÂѨº^Á¶ jãePÒB¤Ënìà;Û˜¾ ˜Ldéx22•Ÿß’Óà+4 Óòq‰At Œ4£K q¾ÅØ2vß5ß./™›Go æñãTÚL周ÚÏybÎo~>Íf±,ýÅÒ„™"ûöWó#õ#v2¦15¨“ÍÌVbð¬µëuZ—6nÌsÒˆ’b–ÞÐI¹PLVÆq½ÇÆæ z2ÐáEš{òÃýSªÉ¨bâ¿%»öÒ½5iq"²|Ï˶+œvÍÀ>SÓã@`½«8ð­G%œ 8ºvÎF÷Å¡¯w``u NþË…Øèаùªz~ªùL\ÂHŒŠûäjÃùáëÖiøÔ Þ\¦-% ?ŸæÂ2aN·[âwÎãßWærÃ:Blowfish part of OpenSSL 0.9.8l 5 Nov 2009blowfish(idx)Ô@û0 ÿ Ÿ/ÍìkzŒ%?/?!ÓMœ@å`IÉŸÏ'¯Ô¿µ½»ˆ@âu–Иà cnÒaÃfçÂŽÿÔ"o;h(YÐÀÈy#ÿâP_wÓ@ÃCV†/ߤ|ˆ-½Ò¢ÖàÉ¡Hl4‡m·a/T"á2¾*kTª:ŽV"ÐAÓ¢È@Ûf/9„§/ÿMÞÒ¹-¬?”—ØÁ—J·DvR§7ôµïº,¸YÑQ×íð÷oz ZÐh{‚.õìTÀ°"5Y޼/mK¢d»PIfÒ-å¾"3·Ÿ;é䎴]4ÿK@ÂEý?—1­.ÐöÄeüU­Ê±Õ®-¬¡m·Ô¢P ›Áò@"ˆ8On ׿ä¤r¢[O/LVSœÅTãI¹þiF°Š«¶±ÝXÇEÅ…c]“ÕŠSW“9jà7=æ³öT*_}x:µ vbßü¦j BzÕÔù)‘ö^'r»gPª‘8ëµÆŒËÇ„Z×*'J‡k“Ñ¢¯†Ò*‘ÒVª`C‰× u\B&ž³“É„q-³l»âs<¼¾ y7bT«žEd‚‹2?‚Ïw¦Î¢Y.îæxþ‰P «?Âö_2?8ÈÅciÖZËvÉt™ÔÏ ÊÕ‚8ö\úÇÊžç5БÚG†ôžAâ§Ab61•ô;Wª]€JЃT<*2ßÍd¿Ž¦Wº+7ÆuAÓ¯Pu2Á§õ Z‘«¿Tk& +×ÉL«‚ÍœDeòû÷óÅ…«”ÛU$ãÔª?½¤Ïâ£ê-M ž¬%½È³Ußꘞ½Õ²1ãl­Õ*Þ)C•(E¾­iqØÉQªökxª?Q"›§QªÌDÓ*ðAZ{­û|Ó•‘äìAæ2ôÔh"Ì `Ém~8Îl±k¿xûpjÉÙ Þ9ßÔÚcàdô6GØ(ÓZ–ÌG³Ã»uûQ˜5ÌûOjÏ‹µ¼ áJþÅ¿ì § W9¬/D?S±ˆa.z9àyË'WAëœÖ¬–|Ó*Ëu ÿÆðe[ÇØ@ÛÙywìÔêDGt2±žË$ݽT~ùDð±$Òý³u–U7¬£¯'|ÔM_ÈQ–uV滥ðXñ,Êê7Ûª¿J>º5 ÿ&5 M{ÃÙn0¼f&¥˜%÷HVV^ÿÐcí ϲc|áE pñPêÕr(©…§½¯pH#Ôó ‡§yM;-˜AàBçíÐ ¸ G&Lø×jMG\^ |Y#јr8ÛôÒõS†ƒ«#/nžœqƒFà‘½nEVš 9ÜqÅÈ Ú+–ÿ–æá«A±¹‰Ê|ƒçiCHÌyÅ÷¢}ôžBœ{BIðÉZÝ¿e\” [§ ï~Ïãi€C?9zÏaþz ÅˆUQüryï§­5rNÎcZÕº6Þï0Ä™” _}ÛÜóïÖ¡{/µ 6èY”°î Ùÿé†DÜYD”ï³ÌƒºûÍÃàAÚѱ* ;Áñ—ù{Ïæ¥Û B[ïçäAÿ¡%ø€á€ÄzÆzÓ¤0Xþ‹Þ˜N?èwi’’y{Ÿú$[ÈáƒÄ¬%5P×_aê÷T1bcKU !h]YÃfÈsÏc=À4â·~ØÔ!+g\ab÷9„06;Wëä¤d/`œÍ:Ö5F¼-ž õ'´z„™yßã Œólº”0„^©7%þooô;ÿ¡jûŒ tŒE'¢àÙ4:ÇNiOˆüßèM>ˆïdY5Œ8EŠfC€ý›r»„†¥3c%è‚N„˜€´?Óþá (Î¥›á'R¦սT—äÝUÖÅdpfëM „w¨¶¡©&Û„gµà·Cð!`XÐå„0ðTrôoS¡£UGÜÚ¿]bµæVh”kʃ;Òn-ÛÏìºÐÓ¦\=€¶ §w¯L£´3ÖÈ{9•+â^S_aoídCç x^´›cÞ"¡ˆÑ&g¹è§I€{Ú·"%-U^7ÒrR•ÒyL‰ Æ´ŒH[þ¤kŸ°¤Ï¨0 ¢cßqˆË/Þ¹éÉÆ Sÿî E!ã5(T´<)cŸ)çAî|-n†RPó…fÆ4ó•,¢0P§1“`„ùsY˜&¡D\dì©wÈR¦3ÿÍA+ ¢Ùº|o€!œÙPaH?Ëe×k«ö£dv&4€{^§%üÑæäæÇ €¶ðÍ;M„Møî1ä$~ëIË,®;j„ˆx÷ö`]îsV÷zÛ\Ý/Á1¡Coö0Tìú³ú×Ìy…ïXÞRÑ^ý/ÛÎ2zùj0ø>ðÕš1™úB°ëã§IŽÆ #Ú¸(0‚€ÈóÞÜq±_ÓÈŠ`ÅÀ¾èÉ£aMõ¨¼úï/Ç™.‚"´pÅ‚‰NÙØ¼4‹æ0yé;'¦êÿ°Æ¸ÙaiH²?Îÿ·;(ÜZöÚC˜—á÷/·v¤› 7†Ü±Ó§·“ßën§>ƼÆB7Q¼(hïÖeR«wj-Kí'5Ò‚.n\ ûò’ÛË)ê^õ’XOX‘{iƒT̨g&H`…ê¬KŒÔ`8ƒùà# Š~8lIÒæ `„²s5ØGƱÜêVL¬³½>°«#‡¼8dú±µð³¢^BFüzk ½‰°O‰¥d^AE£#ƒ\¹;]>r•×C|Ðm~ßßïÄll9¥`qp¾¿sv‡ƒñì#E@ÂïŸ]ú%¿=ëÉèÿ`GKäŸ6DÆŒÊή¿ù±¾êÊûîPÏè®ßQˆ’H­ðƒ<áÕp’Ÿ}¹}dÔäã²^(O= ¨¯¹à‚Þú‹&g .yr‚À²?U+âšH”—ïÔ¼?^îüÿ!ý[‚íÅU’@¢WƒNÿàºçF‚RWŽ¿÷s3ˆŸŒèNü¦¥µ‚É·À¨dŸW1O g_?½òÁ÷ÿ@ü·ÁÒkŽ›å{C¿=°™KÆÛµæÀc™UÈ—¡n-J(JˆÅqoÃÌÂC¸ñCl<‰ ƒ_ÝíPè/~À׿PšûZÐÒG§.Q>¿p¯€ÃX.0˜_ÄÃ|r´ ‚ï­ý–Œ®*,]IšéޏˆÚP ô'„W¬I´oyÜR‚›}½ï}Yr¦Ø@¨­EõEt]úÃ>èu‘OÂiV’Aéï#.ñ©ò '`¶ävteý”²…y’ËÛv‚vw‘¯øž÷HNßma„âƒ}/„Èå 4‚¶»–H±´“«<0ï(¯O˜›¯Ÿw VÜ’ M"ˆª7„–Ü)}ÜÓV'î|‹@Òµã|Àç¡´få^aéà ø<ãÑ”`A£œÍFv\;˜êxÖÔ,WGýÙíl÷œ"¨½ª­}NŠCÀ—ŠÛ¾~ “Ê8¹ÿ<°—øÀÂ=ì²Q8dû{Ìhˆ'ÙIÔÿå]jø~Ýâ¢vh¤¹•]’úÿ9Ké®9º Óÿ¤;“÷ú#†Imú¼<Eub'zô\‚ ‹½aÑBÑô­Î’£~·Br©r‚¨Äp’ å}È¡[(Oôb<¥êÀ51Òèû)‰B‚ßü´Sj¶O[Á}«®†mýü‰(ÿùÌKi®\j#MÊÞÅŒ?,þ-ÐÒ–XïøÚRÏäg[•ŒHJI ¨¶¹¼‚\EkÓ‰7”`:©ÉìSRqDIK‡ @¼s×g4|ö~q6UëOÿ/ТÄ`¿ÒÀ?Ômï´PÑŒGˆnU?å¢¼Ôæ¹€¢38W—g} ×=Þ3{ør3OÌ«]ňv°¦{{”ÒuWøˆ»ùžB‰ÿ¥dBàc…+ÙÛri—îÞ/¢n+®_maz¯g‡ÉåÒëÏÂÈïaq%¬ñÂ9‚̸L!gуå±b>ܷν8\ ù=DðÆmn`I:T`HÁ'WŠé+8´Š$¾á Ú–¯%„Ehå;ƒ™}E `P“/(b³4ƒ Ù m+1+dZ0œˆæ¼RŠXÕïº÷œíBA\1¤Å>2ƒ6FïßÅ3¡SÓéƒ75î ³Þé¶ï{¾§˜¢sÒÛ{OJWŒ­dCQ…Ñúÿz(~c¶æ¡5_ ñëyCý±·—dcdóßJ$_(͸¢O@CÉ "à 0 ÓýO7¥ÀÙ-{$MîgQÊLÿqþ_-_dþþ Ê!S€þ^>èøôš¬'ç_î¸ÒaBߊ›ž»%ê“rßÿ„ΈqõKÖ=;&o¢„Ô~æë~T LmDõÖólß«I&õÇ ®ÁŒ36“~?Pa wÓá8¶Pr»²ø.Pà«Þwì—WFgOáT3É1 i™»¥Ãÿ5Mã\=ÆfȦ©Ì[]êoìÚ‘o’Ÿ/"FŸ}F‘9Žm¿¥OÄCƒ•CëN!иƒ  ¶?“øæX(>nH&pŠ×‹Áäwt|àµ% -ó‹ y»êä#;(8­ÞiÊtb‡ß·@!ùž¥{7ÈŠ@ ÒäY½ÕVÑãÕvèO@£‘/Þè{U§äêìÂå ¦»´Mÿ½Vç¬i3Ý5°ì'#W°È¯™‘ÃÈVeka^uË…nÀ¾wU2Âìô?‰-É¿[%;ìз€·$;mïcÇ ü¥fÀ(8œ2Î ŠTɪÇסì2úZb,gTzu›÷wÔ11°&‘ÛoÌ6F‹ ÇHjæÙyZåVëLjÿ~CR´v/¥€ù ãÍt†ëÚí¾©ßô,t·´÷*« MÃï|k .T¢A5 ¶åöB=!&|,õÂaùÚReø1ÂÒi%¢ØÈò¦–«& !\1cìr ^ýþºIÙy†½ §p1 d›>×>̶ÓÊՈî á0÷ÿŠrl¡âêqnóš/ÑËÏ„ÞÁk¾¬Ø¡DËV›‹Ãˆ9Ê/űÍ1¾´(xØâ¤£2å}o¶~ýXéÐÂÿ­$Å™ôŪ—•{Òçå‚ös˜–0a!•-Ãÿ!¡­„)—»Û³ž¯*íÉ)e¤â\,ó0§è?ªÐ‘À\Šç,žÔ©Tä †Í Ö_‘wö: Þ^V¨xßVãÞ¾\ð!‡ãu‹QųïÃ¥¸Ò¶îØw¾#å)EÂßïi/ûz毲Äpô[ëàóv˜ÌÖ Fä98…Ú/ƒ‡gsÊøD‘©ž)k)•Â/I«¾f’ingµÚÝÓ›/~ßp%ÛîQ^æ$SölãüjÌ>!D†ÐYÜ·)eyCýÖÌy9‚AöÍ+“MÃW¶‚ÒßN )åzkS¹<þ …~U3˜°ðìr³ÿÓÁÅ…?Ò~ï  É~¹tn,ßf›y3¦ÿj¸õXÓDÝD1úñûÌõçÒºZsØ"·*Ëc8:$ö¬zý¾iç¢æÍ ÇðHIÄ€ÁõÌ@…8H¨°Ë‹æÿÞªL H_ª²ü˜%âïÐA´@Nû¶Ž$þº›©A UËeºçôQr%¥•×ìÁ ˜¥—ª¹9ÅjþyMc÷óò@€¯hVž í‹•´ˆZëá°æ ‡Vqà×§þ)N-åfcÀÑެÄqõw“*7 ò5…W¾a"É BÖ€¢ßÒ[µtÀ™!hìå!Ôè<ûS³í­Èɨ(™•=ù\™Ó8þ ÿN ê$±O/ªvi¹O•Çt§¨°ÿ¡Uå'-¶¦cBjæeßf żUÝßUÞ)šs‘u‰¯‘Ç2h”ø‰€é ôUGRÉ<¶²DÈ ªðó¼é6¬‡&t:å+سItž~-îdÚ±ÛÍIÉ€¿h¸ýó& çíB“„Â¥¶7gc¶õPãfGòÁ6ÊŽÛn‘ƒñþ7zˆûÔ÷çÖÉ}ûÇßüc0Þ‰õ¶ÚA)ì•fä&dV·ÅïTö·XÐT’H˺ÁUÿåI0¶èе[Z.ׇánj«Îf:"Íó+Æù…žG>Ëhl è¢Þi‹ÑwWöóöÃúÃÚ~@PÕ³ËM“º×°Õx³ ûQÙVÚ×Þä»$AV Ê”ÑUWnåáྵ„aŸ$ XÀK÷”Žˆ'ãaU{Ÿ€ÜÃwh×kld³MD£ð´fŠdñÀ¯Õ~iö/éIO7ž0j5¶,s…€…@ø‘I®ðvMè;šB(”HD¸Lns) ÁÆ_É‹ôœ†}oaOw.á+³r´ª×¥<º}­œ¢+F¯ÒYäŸYEÓEÚòÙ‡TÆÛNùäóoHmê| Ç¥c‚s_DôƒV—jÆÍˆ¾prÏͳóÒ]ny`“ ¥€›EÛâ`¾1©\1¥ëòBN"r\,röóÿÒN@%Œ/×N2ý·g@Ž#x¼£\nÖ܃"’ukMxn±ëX…O D‡H?{®þüvÿµw¿#ŒVuôª*°F_( +÷õ8=6¨ ŠJ¯RÀçÕft;ßQ•¨×Z­Õöyäöl„u eúÎÐX¾÷ˆ&hJóøöpœ  «FS(lé\£ívá0¬kÒ)h7©6…*þãg—·$ k©õ•%ÍÖ¿ÿh,DUu¾ŸñšeàùI¹î4¸Ê0»þ"èƒ WˆIbuU~bÚ¨ÿv^FES±ÞGmÔçéïúöál¬,gH£L|3âçÛ•´Ch¼\íì¬SU2` Ÿ¿íâ¡ßWðƒ¹†íc¸¦¶9¾^Þ2÷ó8±‰‰aIñ3½7ÀÚÆõ~^bä™ê£<ã#NÌ×ËygC¡H–£ÕKÉþJ¡f ê-Û„ oH¨ Jaˆ¨˜¯)‘Yfc(™á` óÈ<ïx.2ÕÐìÏÒÊ÷r ¨Ð~Aý°¦“ÚãkèÍÓ¾t<¥-7HDL@ÔµÚúm§9Ù°ÏÛIS gNœ=\A¹½djc,ÍÙ}ºˆsoêbÇ çÛšò5ÝL\ŒÔðâS¸f˜¡Èê≯L(#‚’ªS¾4“¿!:;ãKC9êšnÃèïÙÍø®m"€£¤@à œ~ߨ”¦Ì^|[¦³"/ išTŠho)²Î:„ÀSU6‰þŠæ¿%¼Šb´¿."ÏHo¬%‡“©©eÛ½Sçûoçxýgéc5© Á+4Žé¡è t€Iü}È™¿ä ¡uyÓÀ&ZÚO™è‰Í(•íŸ3ý¿4x¸mE_˜†%";ÈÄɾVÁ-ªbOÅ^õW¾ "â¿n‘Ò•[ÇNÀÃò$™]ÑB  Íÿ'n{ðŠÜ¨ÁEs/#ô†#5&‰êæ”°33òÆ~¯t+7äs%iHØ©é‰óïb:8⇧vö¥óSH6tc• ivEÔú¶Pù*Y#5÷6‡nûLÀΤ}ª-l¨–Ë]þ Å«×ü/Ä! »ð߉x¾â_3ODÉFuÐ+…Õ¹HA”Ü› Ȇçí}s3šÃABQ j¦ÈóÖr‰‚v (¾÷©©g2¿u[[ÔýS³Xã°Ë "ƒ²ÏrÓJ<Ìf1öŒ¾‡ˆÉˆ—ãb`zŽÏGƒRȶû¬ÂÍ0ïžqt&‡ÜÔ@3Ù/C~AÂ^ l( ˆ‘Ø’õö0©ó~•½ÿû·oéf˜¬äoÀìs±*´`¼Ú˜4•®¡û6×K-«ú%ëüó¤#‘–â= %I¯H“¼6Joèò8C@ù£ÂTzœWOp¼ùçAÚ:ÓZ„ ôTU±¾|5YȽí«Å—µÇZº¯Þö¶:œG:%ÚSj~=eI&Têw¤Q[ÕPˆ]Ò×vlDȨ!¡å¸Š’¸iXí`–[Å—™ìêY“)ñ·ýúŽõö¶šŸ¿L;«ã]J5æUØá ñLkÓëíDõ$5é°½»¾Ïb×¢T/ÉI1óµ8T¤(q)9H¸[¦½—…/ÏuÖ@à…gõ+3ÿ¿-f“VÆÏo*É›«¡`ÞÚ( ç¼')dMÃú‚‹ñP˲,\ç2²ò•6KÞ‡²ö¼_ éAÍ !Pá½ñNâÃh±‰çäýذy\Cý‹PIMAC¾8î<‘?œ§’¾f—ô­îºÏ¾†Ëê¶Â`&ä½euz$d©ÜH‚f­³Ã†`(¨ßØ òm5¾‰wÎé²³ª5À *õk‚ÿëiHãuMÓÿ:{NgC_7àöœƒ¬IÎfB3·A“ŒÀTØÐˆl:Ë)(¼G7º%G+Òj¦Özúº\ ñ7Db™ç¶ØÒBˆ– nÀ¥ágžtür÷9ѱE7XùXßÏV÷þ0ºnÀ$!)ˆÂE1^ÉÅŽ¼éF¼8úæÆJXèºF¼N­‹PF_C)x;$ñŸº‚ôö¯mN,êd’ã‹JT’ÃO›íŒ¦«xoÉšš·¥nn…²©<숆ƒ¾éV¾ñU;6åç]ò¡³…»Þ÷<þa3bt(L©¦wn\‹eËÇ0RÔ‹@Ñ+·>À`x¹ôT7£}È0ô§È2Œm¹¾çÔë-‹¾ûyyS"çwÏu‹¤ïXȃàoxk¦cZ ÷\ú3Ú]°¿Žòùõ€Âê zv¹°ÒÙ£BÓyqj3Æš`ý'ãP€C¨™Äí=ï+m‚v„ëN%ÏHfÕÉ6ANç(Ê aÂÏ©I=ß¹ãºæ_¶d¯®’æÕÇ: ¨ž}+òp?¤ÃÝù×à‡¸±PÕOŸ+‚ºZbbyjœÀ.©ŠH@ç×,Z@"šÒ“š¿-ã¹E‡ÜS4n)™ÖoÿlI†IŸíâßÑBr¸®~ÞV>Œo­lbfLÂTq*+ê9)ë“ð°Ü®òÔXû”¢žLVÏRfþƒ˜Ä.ÃS9v.iÖÁ Ó硦ßòä…Ò>i˜FtÝ+LVvuOx39]O#2¡]2=”áõÓ&K/ŸÇ~~™<•O^½ûú?­÷vô“f)oÎ=¾EÆ4«µÓ·ù+÷À4gµrN=£’U“"µ¨ÒÏg·®`k8=ü0}À 8òý›QcÃÓXæøyTGÖ¸©aý—ôYwêSW-ÏXšV­cNèx.F~ø€eyóôUÚ‘ó0¢@5˜ÑÒã¶¼Pú?!ð@=®½ÀÃLÂXI²6QpÓ±„ƒÎíÚÚ‡Çy¢òèà”Koq£ŠK• 0âüÿÝ»½Úë§•€d5·ø‰wÁæ$µè,°Ï©/•å ™çìtц““B*ãv:ï-±üÝÝ7±ÞšÞ,à )p¾@  „:$»Ï7Ñ´ðyN´ýíž]¡ h1 HZÞ»‹Bíf1èìÇç•?ßr 3€uQB”úÍ}\cm¾«d!@ª Ô³ÊÑç®WS¢‚1zìݨ]3ªýèCoÔFûq"8Ôš”έiG¸bØ[–UÐó‚g—ûfN ¸ G[oàýL¸ÄŽÂnrèWüxzdD]†™“Õ‹` lö_Ü9£ ]ò¯c®2Ö‹~ ŒpIPÓ»ߘ)*ô ˜‘ôm›SÝ~žH…‘~ËX.ït;±ÿ/RÌGÒÍ'~[!ë¤âÒñ<8z´vOB9`…5çÞæ5ë'{ö¯É¸õº6ÍgÄ ±‰Á{¿áøÍÆpqT3^-ZIÞÔÐÆd,ÆÀ¼³ Ð=4pBÕwbO&¿Ò¸$ž·Ád%¥FNå×ø`7>¥Í•x¥œ…ˆ—Eæ_Ç{à ºÛ«£v›"{.„1ן%$rô¾ø¸ü_ƒòÁôm•±õ–üð ýLþ°=mPâê›O%òòos#¢(Ä´ŸyIÐ%øÇ4‡aĘnzêünÑ|l‡6ATñîÞ¾'¯éVA¤J ™È÷<æºì’mgÝë‚ßîB¨´`ºýu{ñã žÂØ$;g9á¸?¦ïT0‡q;Ïò¶Bd2ŸÌ¤ËE°}äñåJ„ÜßçºpÚËB ®}Íz[èWöZ?ÕŒMÏ (ԤΤ0Ñyûë†4ÜÍÓ3S;…wµüï7x‡Åæ³€åô¸hN~³ÈÅ¢ž€ |ë9”O*•·C}î/½6"¢ÊÝ+“ß7‰‚$ÄÃëó¬·öWÝx4ïoagòäËHÁ^R«A^e$Š´¤Ú.ä@{è„ Žéáé‰XüÓï[ÓÝ”VHÛ²å×8rW¼Þs1d[O~‘”º/©J{Ø`ƒ ‹©,8I¥%vé·ÑK$%Gƒv ‚žXÑY »f¤‚ Úø0‘ñÀNnºdQ&™ #瀭²Phîꃢ²žõ‹êCAST part of OpenSSL 0.9.8l 5 Nov 2009AES part of OpenSSL 0.9.8l 5 Nov 2009aes(partial)(length%AES_BLOCK_SIZE) == 0(AES_ENCRYPT == enc)||(AES_DECRYPT == enc).\crypto\aes\aes_ige.cin && out && key && ivec¦¦¦¦¦¦¦¦.\crypto\bn\bn_add.c.\crypto\bn\bn_div.c.\crypto\bn\bn_exp.cBig Number part of OpenSSL 0.9.8l 5 Nov 2009.\crypto\bn\bn_lib.c.\crypto\bn\bn_ctx.c.\crypto\bn\bn_mod.c0123456789ABCDEF.\crypto\bn\bn_print.c%09lu%lu0-.\crypto\bn\bn_rand.c.\crypto\bn\bn_blind.cÿÿÿÿÿÿÿÿ.\crypto\bn\bn_sqrt.c.\crypto\bn\bn_gcd.c %)+/5;=CGIOSYaegkmqƒ‰‹•—£§­³µ¿ÁÅÇÓßãåéïñû %379=KQ[]agou{…‘™£¥¯±·»ÁÉÍÏÓßçëó÷ý  #-39;AKQWY_eikwƒ‡“•¡¥«³½ÅÏ×Ýãçïõù)+57;=GUY[_mqsw‹—¡©­³¹ÇËÑ×ßåñõûý %'-?CEIOU]ci‹“£©±½ÁÇÍÏÕáëýÿ  ')/QW]ew“•™Ÿ§«­³¿ÉËÏÑÕÛçóû #+/=AGIMSU[eyƒ…¡£­¹»ÅÍÓÙßñ÷ûý '7EKOQUWamsy‹Ÿµ»ÃÉÍÏÓÛáëí÷!#')3?AQSY]_iqƒ›Ÿ¥­½¿ÃËÛÝáéïõù   # % + / 5 C I M O U Y _ k q w … ‰ › £ © ­ Ç Ù ã ë ï õ ÷ ý   ! 1 9 = I W a c g o u {  … ‹ “ — ™ Ÿ © « µ ½ Á Ï Ù å ç í ñ ó     # ) - ? G Q W ] e o { ‰ “ ™ › · ¹ Ã Ë Ï Ý á é õ û   % / 1 A [ _ a m s w ƒ ‰ ‘ • ³ µ ¹ » Ç ã å ë ñ ÷ û      ! + - = ? O U i y … ‡ ‹ £ « · ½ Ç É Í Ó Õ Û å ç ó ý ÿ !'/5;KWY]kqu}‡•›±·¹ÃÑÕÛíïù  %)1CGMOSY[gk•¡£§­³µ»ÑÓÙéïûý!%+9=?Qisy{…‡‘“£¥¯±»ÁÉçñóý '-9EGY_cioƒ›¡¥§«ÃÅÑ×çïõû #)+17AGS_qsy}—¯³µ¹¿ÁÍÑßý '-7CEIOW]gim{‡‹‘“Ÿ¯»ÃÕÙßëíóùÿ!/3;EMYkoqu™Ÿ¡±·½ËÕãç %)+7=ACI_egk}ƒ‘—›µ»ÁÅÍ×÷ %39=EOUimou“—Ÿ©¯µ½ÃÏÓÙÛáåëí÷ù #'3A]cw{•›Ÿ¥³¹¿ÉËÕáéóõÿ57;CIMUgqw}…›§­³¹ÁÇÑ×Ùßåëõý13EIQ[y“—™£©«±µÇÏÛíý!#-/5?MQik{}‡‰“§«­±¹ÉÏÕ×ãóûÿ#%/17;AGOUYeksƒ‘§¿ÅÑ×Ùï÷ '+-3=EKOUs‹™£¥µ·Éáóù !#59?AKS]ciqu{}‡‰•™Ÿ¥§³·Å×Ûáõù %+/=IMOmq‰•¡­»ÁÅÇËÝãï÷ý 9IKQgu{…‘—™¥¯µ»Óáçëóÿ   ' ) - 3 G M Q _ c e i w } ‰ ¡ « ± ¹ à Šã ç í ï û ÿ !!5!A!I!O!Y![!_!s!}!…!•!—!¡!¯!³!µ!Á!Ç!×!Ý!å!é!ñ!õ!û!" """!"%"+"1"9"K"O"c"g"s"u""…"‡"‘""Ÿ"£"·"½"Û"á"å"í"÷"# # #'#)#/#3#5#E#Q#S#Y#c#k#ƒ##•#§#­#±#¿#Å#É#Õ#Ý#ã#ï#ó#ù#$ $$$)$=$A$C$M$_$g$k$y$}$$…$›$¡$¯$µ$»$Å$Ë$Í$×$Ù$Ý$ß$õ$÷$û$%%%%'%1%=%C%K%O%s%%%“%—%%Ÿ%«%±%½%Í%Ï%Ù%á%÷%ù%& &&&'&)&5&;&?&K&S&Y&e&i&o&{&&ƒ&&›&Ÿ&­&³&Ã&É&Ë&Õ&Ý&ï&õ&''5'7'M'S'U'_'k'm's'w''•'›''§'¯'³'¹'Á'Å'Ñ'ã'ï'(( ((((!(1(=(?(I(Q([(](a(g(u((—(Ÿ(»(½(Á(Õ(Ù(Û(ß(í(÷()))!)#)?)G)])e)i)o)u)ƒ)‡))›)¡)§)«)¿)Ã)Õ)×)ã)é)í)ó)***%*/*O*U*_*e*k*m*s*ƒ*‰*‹*—**¹*»*Å*Í*Ý*ã*ë*ñ*û*+'+1+3+=+?+K+O+U+i+m+o+{++—+™+£+¥+©+½+Í+ç+ë+ó+ù+ý+ ,,,#,/,5,9,A,W,Y,i,w,,‡,“,Ÿ,­,³,·,Ë,Ï,Û,á,ã,é,ï,ÿ,---;-C-I-M-a-e-q-‰--¡-©-³-µ-Å-Ç-Ó-ß-... ...%.-.3.7.9.?.W.[.o.y..….“.—..£.¥.±.·.Á.Ã.Í.Ó.ç.ë./ / //'/)/A/E/K/M/Q/W/o/u/}//ƒ/¥/«/³/Ã/Ï/Ñ/Û/Ý/ç/í/õ/ù/0 0#0)070;0U0Y0[0g0q0y0}0…0‘0•0£0©0¹0¿0Ç0Ë0Ñ0×0ß0å0ï0û0ý01 11!1'1-191C1E1K1]1a1g1m1s11‘1™1Ÿ1©1±1Ã1Ç1Õ1Û1í1÷1ÿ1 2222)252Y2]2c2k2o2u2w2{22™2Ÿ2§2­2³2·2É2Ë2Ï2Ñ2é2í2ó2ù23%3+3/353A3G3[3_3g3k3s3y33ƒ3¡3£3­3¹3Á3Ë3Ó3ë3ñ3ý34444474E4U4W4c4i4m44‹4‘4—44¥4¯4»4É4Ó4á4ñ4ÿ4 555-535;5A5Q5e5o5q5w5{5}5555™5›5¡5·5½5¿5Ã5Õ5Ý5ç5ï5666#6165676;6M6O6S6Y6a6k6m6‹66­6¯6¹6»6Í6Ñ6ã6é6÷67777?7E7I7O7]7a7u777£7©7«7É7Õ7ß7ñ7ó7÷78 8!83858A8G8K8S8W8_8e8o8q8}88™8§8·8Å8É8Ï8Õ8×8Ý8á8ã8ÿ899#9%9)9/9=9A9M9[9k9y9}9ƒ9‹9‘9•9›9¡9§9¯9³9»9¿9Í9Ý9å9ë9ï9û9::::':+:1:K:Q:[:c:g:m:y:‡:¥:©:·:Í:Õ:á:å:ë:ó:ý:;;;!;#;-;9;E;S;Y;_;q;{;;‰;›;Ÿ;¥;§;­;·;¹;Ã;Ë;Ñ;×;á;ã;õ;ÿ;< <<<<)<5 >>>>#>)>/>3>A>W>c>e>w>>‡>¡>¹>½>¿>Ã>Å>É>×>Û>á>ç>ï>ÿ> ? ?7?;?=?A?Y?_?e?g?y?}?‹?‘?­?¿?Í?Ó?Ý?é?ë?ñ?ý?@!@%@+@1@?@C@E@]@a@g@m@‡@‘@£@©@±@·@½@Û@ß@ë@÷@ù@ A AAA!A3A5A;A?AYAeAkAwA{A“A«A·A½A¿AËAçAïAóAùABBBB#B)B/BCBSBUB[BaBsB}BƒB…B‰B‘B—BBµBÅBËBÓBÝBãBñBCCC%C'C3C7C9COCWCiC‹CC“C¥C©C¯CµC½CÇCÏCáCçCëCíCñCùC D DD#D)D;D?DEDKDQDSDYDeDoDƒDD¡D¥D«D­D½D¿DÉD×DÛDùDûDEEE+E1EAEIESEUEaEwE}EEE£E­E¯E»EÇEtoo many temporary variablestoo many iterationsp is not primeno solutionno inversenot initializednot a squareinvalid rangeinvalid lengthinput not reducedexpand on static bignum dataencoding errordiv by zerocalled with even modulusbignum too longbad reciprocalarg2 lt arg3BN_usubBN_rand_rangeBN_randBN_newBN_mpi2bnBN_mod_sqrtBN_mod_mul_reciprocalBN_mod_lshift_quickBN_mod_inverse_no_branchBN_mod_inverseBN_mod_exp_simpleBN_mod_exp_recpBN_mod_exp_mont_wordBN_mod_exp_mont_consttimeBN_mod_exp_montBN_mod_exp2_montBN_GF2m_mod_sqrtBN_GF2m_mod_sqrBN_GF2m_mod_solve_quad_arrBN_GF2m_mod_solve_quadBN_GF2m_mod_mulBN_GF2m_mod_expBN_GF2m_modBN_EXPAND_INTERNALbn_expand2BN_expBN_div_recpBN_div_no_branchBN_divBN_CTX_startBN_CTX_newBN_CTX_getBN_bn2hexBN_bn2decBN_BLINDING_updateBN_BLINDING_newBN_BLINDING_invert_exBN_BLINDING_create_paramBN_BLINDING_convert_exBNRAND.\crypto\bn\bn_recp.c.\crypto\bn\bn_mont.c.\crypto\bn\bn_mpi.c.\crypto\bn\bn_exp2.c@ADEPQTU.\crypto\bn\bn_gf2m.cÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿÿÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿýÿÿÿÿÿÿÿÿÿÿÿýÿÿÿüÿÿÿÿÿÿÿÿÿÿÿüÿÿÿûÿÿÿÿÿÿÿÿÿÿÿûÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿýÿÿÿüÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿüÿÿÿüÿÿÿûÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿûÿÿÿûÿÿÿúÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿþÿÿÿþÿÿÿýÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ¸‹ üÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ0Œ  Œ €  ÐŽ Œ  hŒ @ pŽ ( !!ÿÿÿÿÿÿÿÿÉÚ¢!hÂ4ÄÆb‹€ÜÑ)NŠgÌt ¾¦;›"QJyŽ4ÝÍ:C0+ mò_7Oá5mmQÂEä…µvb^~ÆôLBé¦:6 ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÚ¢!hÂ4ÄÆb‹€ÜÑ)NŠgÌt ¾¦;›"QJyŽ4ÝÍ:C0+ mò_7Oá5mmQÂEä…µvb^~ÆôLBé¦7ík ÿ\¶ô·íî8kûZ‰Ÿ¥®Ÿ$|KæI(fQìæSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÚ¢!hÂ4ÄÆb‹€ÜÑ)NŠgÌt ¾¦;›"QJyŽ4ÝÍ:C0+ mò_7Oá5mmQÂEä…µvb^~ÆôLBé¦7ík ÿ\¶ô·íî8kûZ‰Ÿ¥®Ÿ$|KæI(fQìä[=Â|¸¡c¿˜ÚH6UÓši?¨ý$Ï_ƒe]#Ü£­–bóV …R»žÕ)p––mg 5NJ¼˜ñtlÊ#s'ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÚ¢!hÂ4ÄÆb‹€ÜÑ)NŠgÌt ¾¦;›"QJyŽ4ÝÍ:C0+ mò_7Oá5mmQÂEä…µvb^~ÆôLBé¦7ík ÿ\¶ô·íî8kûZ‰Ÿ¥®Ÿ$|KæI(fQìä[=Â|¸¡c¿˜ÚH6UÓši?¨ý$Ï_ƒe]#Ü£­–bóV …R»žÕ)p––mg 5NJ¼˜ñtlÊ!|2^F.6Î;ãžw,†›'ƒ¢ì¢µÅ]ðoLRÉÞ+Ëö•X9•I|ê•jåÒ&˜úrŽZЬªhÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÚ¢!hÂ4ÄÆb‹€ÜÑ)NŠgÌt ¾¦;›"QJyŽ4ÝÍ:C0+ mò_7Oá5mmQÂEä…µvb^~ÆôLBé¦7ík ÿ\¶ô·íî8kûZ‰Ÿ¥®Ÿ$|KæI(fQìä[=Â|¸¡c¿˜ÚH6UÓši?¨ý$Ï_ƒe]#Ü£­–bóV …R»žÕ)p––mg 5NJ¼˜ñtlÊ!|2^F.6Î;ãžw,†›'ƒ¢ì¢µÅ]ðoLRÉÞ+Ëö•X9•I|ê•jåÒ&˜úrŽZŠªÄ-­3 Pz3¨U!«ßºdìû…XÛï ŠêqW] }³—…¦áäÇ«õ®ŒÛ 3׌”àJ%aÎãÒ&Òîkñ/úÙŠdØvs>ÈjdR+{ »áWza]lw ˆÀºÙFââO tå«1CÛ[üàýŽK‚Ñ ©:ÒÊÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÚ¢!hÂ4ÄÆb‹€ÜÑ)NŠgÌt ¾¦;›"QJyŽ4ÝÍ:C0+ mò_7Oá5mmQÂEä…µvb^~ÆôLBé¦7ík ÿ\¶ô·íî8kûZ‰Ÿ¥®Ÿ$|KæI(fQìä[=Â|¸¡c¿˜ÚH6UÓši?¨ý$Ï_ƒe]#Ü£­–bóV …R»žÕ)p––mg 5NJ¼˜ñtlÊ!|2^F.6Î;ãžw,†›'ƒ¢ì¢µÅ]ðoLRÉÞ+Ëö•X9•I|ê•jåÒ&˜úrŽZŠªÄ-­3 Pz3¨U!«ßºdìû…XÛï ŠêqW] }³—…¦áäÇ«õ®ŒÛ 3׌”àJ%aÎãÒ&Òîkñ/úÙŠdØvs>ÈjdR+{ »áWza]lw ˆÀºÙFââO tå«1CÛ[üàýŽK‚Ñ ©!r<§‡æ×ˆqš½º[&™Ã'jôâ<”h4¶ Ú%ƒéÊ*ÔLèÛ»ÂÛÞŽù.Žü¾Ê¦(|YGNkÀ]™²–O Ã¢#;¡†Q[çía)pÎâׯ¸Ýv!pHБ'Õ°Z©“´ê˜ÝÁ†ÿ·Ü¦ÀMô5É41™ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÚ¢!hÂ4ÄÆb‹€ÜÑ)NŠgÌt ¾¦;›"QJyŽ4ÝÍ:C0+ mò_7Oá5mmQÂEä…µvb^~ÆôLBé¦7ík ÿ\¶ô·íî8kûZ‰Ÿ¥®Ÿ$|KæI(fQìä[=Â|¸¡c¿˜ÚH6UÓši?¨ý$Ï_ƒe]#Ü£­–bóV …R»žÕ)p––mg 5NJ¼˜ñtlÊ!|2^F.6Î;ãžw,†›'ƒ¢ì¢µÅ]ðoLRÉÞ+Ëö•X9•I|ê•jåÒ&˜úrŽZŠªÄ-­3 Pz3¨U!«ßºdìû…XÛï ŠêqW] }³—…¦áäÇ«õ®ŒÛ 3׌”àJ%aÎãÒ&Òîkñ/úÙŠdØvs>ÈjdR+{ »áWza]lw ˆÀºÙFââO tå«1CÛ[üàýŽK‚Ñ ©!r<§‡æ×ˆqš½º[&™Ã'jôâ<”h4¶ Ú%ƒéÊ*ÔLèÛ»ÂÛÞŽù.Žü¾Ê¦(|YGNkÀ]™²–O Ã¢#;¡†Q[çía)pÎâׯ¸Ýv!pHБ'Õ°Z©“´ê˜ÝÁ†ÿ·Ü¦ÀMô5É4„’6Ãú´Ò|p&ÁÔܲ`&FÞÉuv=º7½øÿ”­žSåÛ8/A0®°jSí'Ø1—'°†Z‰Ú>ÛëÏ›íDÎlºÎÔ»ÛGæÌ%K3 QQ+ׯBo¸ô7ŒÒ¿YƒÊÆK’ìð2êÑrô‚×ÎntþöÕ^p/F˜ ‚µ¨@1 žYçɾÇèó#©z~6̈¾E·ÿXZÅKÔ²+ATªÌm~¿HáØÌ^Ò€7à§—îò›ã(¡Õ‹·ÅÚvõPª=Š¿ðë̱£Õ\ÚVÉì.ò–28è×n<h>f?H`î¿-[ ttÖæ”ùmÌ@$ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÉÚ¢!hÂ4ÄÆb‹€ÜÑ)NŠgÌt ¾¦;›"QJyŽ4ÝÍ:C0+ mò_7Oá5mmQÂEä…µvb^~ÆôLBé¦7ík ÿ\¶ô·íî8kûZ‰Ÿ¥®Ÿ$|KæI(fQìä[=Â|¸¡c¿˜ÚH6UÓši?¨ý$Ï_ƒe]#Ü£­–bóV …R»žÕ)p––mg 5NJ¼˜ñtlÊ!|2^F.6Î;ãžw,†›'ƒ¢ì¢µÅ]ðoLRÉÞ+Ëö•X9•I|ê•jåÒ&˜úrŽZŠªÄ-­3 Pz3¨U!«ßºdìû…XÛï ŠêqW] }³—…¦áäÇ«õ®ŒÛ 3׌”àJ%aÎãÒ&Òîkñ/úÙŠdØvs>ÈjdR+{ »áWza]lw ˆÀºÙFââO tå«1CÛ[üàýŽK‚Ñ ©!r<§‡æ×ˆqš½º[&™Ã'jôâ<”h4¶ Ú%ƒéÊ*ÔLèÛ»ÂÛÞŽù.Žü¾Ê¦(|YGNkÀ]™²–O Ã¢#;¡†Q[çía)pÎâׯ¸Ýv!pHБ'Õ°Z©“´ê˜ÝÁ†ÿ·Ü¦ÀMô5É4„’6Ãú´Ò|p&ÁÔܲ`&FÞÉuv=º7½øÿ”­žSåÛ8/A0®°jSí'Ø1—'°†Z‰Ú>ÛëÏ›íDÎlºÎÔ»ÛGæÌ%K3 QQ+ׯBo¸ô7ŒÒ¿YƒÊÆK’ìð2êÑrô‚×ÎntþöÕ^p/F˜ ‚µ¨@1 žYçɾÇèó#©z~6̈¾E·ÿXZÅKÔ²+ATªÌm~¿HáØÌ^Ò€7à§—îò›ã(¡Õ‹·ÅÚvõPª=Š¿ðë̱£Õ\ÚVÉì.ò–28è×n<h>f?H`î¿-[ ttÖæ”ùm¾Yt£’oþåä8w|¶©2ߌؾÄÐs¹1º;È2¶Ót§¿ŠüGí%vö“k¤$f:«cœZäõh4#´t+ñÉx#Ëãe-ãý¸¾ü„ŠÙ"".¤|ëW¨#ðÇ4südlê0kKËȆ/ƒ…ÝúK¢À‡èyh3í[Ý:+<õ³¢x¦m*ø?Dø-ß1àt«j6E—è™ %]ÁdóÅF…ù«H]í~¡±Õ½~çMsúókÃÏ¢h5Fô뇟’@ C‹Hl׈š.Õî8+É ¦ünG•XäGVw骞0PâvV”ßÈV耹nq`ɀݘíÓßÿÿÿÿÿÿÿÿbn(%d,%d)Eric Young's PKCS#1 RSA.\crypto\rsa\rsa_eay.c.\crypto\rsa\rsa_gen.c.\crypto\rsa\rsa_lib.c.\crypto\rsa\rsa_sign.csignature has problems, re-make with post SSLeay045 .\crypto\rsa\rsa_saos.cwrong signature lengthunknown padding typeunknown algorithm typethe asn1 object identifier is not known for this mdsslv3 rollback attacksalt length recovery failedsalt length check failedrsa operations not supportedq not primep not primepadding check failedoperation not allowed in fips modeoaep decoding errorn does not equal p qnull before block missingno public exponentnon fips methodmodulus too largelast octet invalidkey size too smalliqmp not inverse of qinvalid trailerinvalid paddinginvalid message lengthinvalid headerfirst octet invalidd e not congruent to 1dmq1 not congruent to ddmp1 not congruent to ddigest too big for rsa keydata too small for key sizedata too smalldata too large for modulusdata too large for key sizedata too largedata greater than mod lenblock type is not 02block type is not 01bad signaturebad pad byte countbad fixed header decryptbad e valuealgorithm mismatchRSA_verify_PKCS1_PSSRSA_verify_ASN1_OCTET_STRINGRSA_verifyRSA_sign_ASN1_OCTET_STRINGRSA_signRSA_set_methodRSA_set_default_methodRSA_setup_blindingRSA_public_decryptRSA_private_encryptRSA_print_fpRSA_printRSA_padding_check_X931RSA_padding_check_SSLv23RSA_padding_check_PKCS1_type_2RSA_padding_check_PKCS1_type_1RSA_padding_check_PKCS1_OAEPRSA_padding_check_noneRSA_padding_add_X931RSA_padding_add_SSLv23RSA_padding_add_PKCS1_type_2RSA_padding_add_PKCS1_type_1RSA_padding_add_PKCS1_PSSRSA_padding_add_PKCS1_OAEPRSA_padding_add_noneRSA_NULL_PUBLIC_ENCRYPTRSA_NULL_PUBLIC_DECRYPTRSA_NULL_PRIVATE_ENCRYPTRSA_NULL_PRIVATE_DECRYPTRSA_NULL_MOD_EXPRSA_NULLRSA_new_methodRSA_memory_lockRSA_generate_keyRSA_EAY_PUBLIC_ENCRYPTRSA_EAY_PUBLIC_DECRYPTRSA_EAY_PRIVATE_ENCRYPTRSA_EAY_PRIVATE_DECRYPTRSA_check_keyRSA_BUILTIN_KEYGENMEMORY_LOCKFIPS_RSA_VERIFYFIPS_RSA_SIGN.\crypto\rsa\rsa_pk1.c.\crypto\rsa\rsa_ssl.c.\crypto\rsa\rsa_none.c.\crypto\rsa\rsa_oaep.c.\crypto\rsa\rsa_chk.cNull RSA.\crypto\rsa\rsa_null.c.\crypto\rsa\rsa_pss.c.\crypto\rsa\rsa_x931.cRSAiqmpdmq1dmp1qpdenversionÀjü¦ À ø¦ p ô¦ p ð¦ p ì¦ p  è¦ p $ঠp (ئ p ,Ц p  §  § X̦ Àjø¦ p ô¦ p ¨ ð§ X̦ RSA part of OpenSSL 0.9.8l 5 Nov 2009.\crypto\rsa\rsa_eng.cDSA part of OpenSSL 0.9.8l 5 Nov 2009.\crypto\dsa\dsa_lib.cDSApriv_keypub_keygDSA_SIGsr°~ô¨ € 𨠀 © ø¨ è¨ 0ˆ© T© D̨ ü¦ À  ì¦ p è¦ p ä¨ p ܨ p Ш p 0 ì¦ p è¦ p ä¨ p ª ª D̨ ܨ p  ì¦ p è¦ p ä¨ p pª D̨ 0ܨ p €ôª ܪ D̨ .\crypto\dsa\dsa_asn1.cmissing parametersbad q valueSIG_CBi2d_DSA_SIGDSA_verifyDSA_SIG_newDSA_sign_setupDSA_signDSA_set_methodDSA_set_default_methodDSA_print_fpDSA_printDSA_new_methodDSA_generate_parametersDSA_do_verifyDSA_do_signDSA_BUILTIN_PARAMGENDSA_BUILTIN_KEYGENDSAparams_print_fpDSAparams_printd2i_DSA_SIGOpenSSL DSA method.\crypto\dsa\dsa_ossl.c.\crypto\dsa\dsa_utl.cfunctionality not supportedcould not unload the shared librarycould not bind to the requested symbol namethe meth_data stack is corruptset filename faileda null shared library handle was usedno file specificationno filenamename translation failedcould not load the shared libraryincorrect file syntaxcleanup method function failedfilename too bigfailureempty file structuredso already loadedcontrol command failedWIN32_UNLOADWIN32_SPLITTERWIN32_NAME_CONVERTERWIN32_MERGERWIN32_LOADWIN32_JOINERWIN32_BIND_VARWIN32_BIND_FUNCVMS_UNLOADVMS_MERGERVMS_LOADVMS_BIND_SYMDSO_up_refDSO_set_name_converterDSO_set_filenameDSO_new_methodDSO_mergeDSO_loadDSO_get_loaded_filenameDSO_get_filenameDSO_freeDSO_ctrlDSO_convert_filenameDSO_bind_varDSO_bind_funcDL_UNLOADDL_NAME_CONVERTERDL_MERGERDL_LOADDL_BIND_VARDL_BIND_FUNCDLFCN_UNLOADDLFCN_NAME_CONVERTERDLFCN_MERGERDLFCN_LOADDLFCN_BIND_VARDLFCN_BIND_FUNC.\crypto\dso\dso_lib.cNULL shared library methodOpenSSL 'win32' shared library methodfilename().\crypto\dso\dso_win32.csymname(%s%s.dll:\/\\DHlength°œì¦ p  ä¨ p œ± Ð ¼± ¤± L˜± .\crypto\dh\dh_gen.cOpenSSL DH Method.\crypto\dh\dh_key.cDiffie-Hellman part of OpenSSL 0.9.8l 5 Nov 2009.\crypto\dh\dh_lib.cno private valueinvalid public keybad generatorGENERATE_PARAMETERSGENERATE_KEYDH_new_methodDH_generate_parametersDH_generate_keyDH_compute_keyDH_BUILTIN_GENPARAMSDHparams_print_fpDHparams_printCOMPUTE_KEYEC part of OpenSSL 0.9.8l 5 Nov 2009.\crypto\ec\ec_lib.c–P¾À,¾À¾0¿ÐÀàÁðÁÐà0Ð01`1Ä`Å€ÆàÆ€ÉÍàÏ€ÒÐ×ðÛ <0Ü Þ@á@âpæ æ.\crypto\ec\ecp_smpl.c–Ðæðæ@çç`èÐÀàÁðÁÐà0Ð01`1Ä`Å€ÆàÆ€ÉÍàÏ€ÒÐ×ðÛ <0Ü Þ@á@âÀéê`ê°êë.\crypto\ec\ecp_mont.c–P¾À,¾`ëëÐÀàÁðÁÐà0Ð01`1Ä`Å€ÆàÆ€ÉÍàÏ€ÒÐ×ðÛ <0Ü Þ@á@âÐì í.\crypto\ec\ecp_nist.c.\crypto\ec\ec_mult.cwrong orderunsupported fieldunknown orderunknown groupundefined orderundefined generatorslot fullpoint is not on curvepoint at infinitypkparameters2group failurepassed null parameterno field modnot implementednot a supported NIST primenot a NIST primemissing private keyinvalid trinomial basisinvalid private keyinvalid pentanomial basisinvalid group orderinvalid forminvalid fieldinvalid encodinginvalid compression bitinvalid compressed pointinvalid argumentincompatible objectsi2d ecpkparameters failuregroup2pkparameters failurefield too largeec group new by name failurediscriminant is zerod2i ecpkparameters failurebuffer too smallasn1 unknown fieldasn1 erroro2i_ECPublicKeyi2o_ECPublicKeyi2d_ECPrivateKeyi2d_ECPKParametersi2d_ECParametersec_wNAF_precompute_multec_wNAF_mulEC_PRE_COMP_NEWEC_PRE_COMP_DUPEC_POINT_set_to_infinityEC_POINT_set_Jprojective_coordinates_GFpEC_POINT_set_compressed_coordinates_GFpEC_POINT_set_compressed_coordinates_GF2mEC_POINT_set_affine_coordinates_GFpEC_POINT_set_affine_coordinates_GF2mEC_POINT_point2octEC_POINT_oct2pointEC_POINT_newEC_POINT_mulEC_POINT_make_affineEC_POINT_is_on_curveEC_POINT_is_at_infinityEC_POINT_invertEC_POINT_get_Jprojective_coordinates_GFpEC_POINT_get_affine_coordinates_GFpEC_POINT_get_affine_coordinates_GF2mEC_POINT_dblEC_POINT_copyEC_POINT_cmpEC_POINT_addEC_POINTs_mulEC_POINTs_make_affineEC_KEY_print_fpEC_KEY_printEC_KEY_newEC_KEY_generate_keyEC_KEY_copyEC_KEY_check_keyEC_GROUP_set_generatorEC_GROUP_SET_EXTRA_DATAEC_GROUP_set_curve_GFpEC_GROUP_set_curve_GF2mEC_GROUP_precompute_multEC_GROUP_NEW_FROM_DATAEC_GROUP_new_by_curve_nameEC_GROUP_newEC_GROUP_get_trinomial_basisEC_GROUP_get_pentanomial_basisEC_GROUP_get_orderEC_GROUP_get_degreeEC_GROUP_get_curve_GFpEC_GROUP_get_curve_GF2mEC_GROUP_get_cofactorEC_GROUP_get0_generatorEC_GROUP_copyEC_GROUP_check_discriminantEC_GROUP_checkEC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES_GFPec_GFp_simple_set_compressed_coordinatesEC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES_GFPec_GFp_simple_point_set_affine_coordinatesEC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFPec_GFp_simple_point_get_affine_coordinatesec_GFp_simple_points_make_affineec_GFp_simple_point2octec_GFp_simple_oct2pointec_GFp_simple_make_affineEC_GFP_SIMPLE_GROUP_SET_GENERATOREC_GFP_SIMPLE_GROUP_SET_CURVE_GFPec_GFp_simple_group_set_curveec_GFp_simple_group_check_discriminantec_GFp_nist_group_set_curveec_GFp_nist_field_sqrec_GFp_nist_field_mulEC_GFP_MONT_GROUP_SET_CURVE_GFPec_GFp_mont_group_set_curveec_GFp_mont_field_sqrec_GFp_mont_field_set_to_oneec_GFp_mont_field_mulec_GFp_mont_field_encodeec_GFp_mont_field_decodeec_GF2m_simple_set_compressed_coordinatesec_GF2m_simple_point_set_affine_coordinatesec_GF2m_simple_point_get_affine_coordinatesec_GF2m_simple_point2octec_GF2m_simple_oct2pointec_GF2m_simple_group_set_curveec_GF2m_simple_group_check_discriminantEC_GF2M_MONTGOMERY_POINT_MULTIPLYEC_EX_DATA_set_dataEC_ASN1_PKPARAMETERS2GROUPEC_ASN1_PARAMETERS2GROUPEC_ASN1_GROUP2PKPARAMETERSEC_ASN1_GROUP2PARAMETERSEC_ASN1_GROUP2FIELDIDEC_ASN1_GROUP2CURVEECP_NIST_MOD_521ECP_NIST_MOD_256ECP_NIST_MOD_224ECP_NIST_MOD_192ECPKParameters_print_fpECPKParameters_printECParameters_print_fpECParameters_printd2i_ECPrivateKeyd2i_ECPKParametersd2i_ECParametersCOMPUTE_WNAF IPSec/IKE/Oakley curve #4 over a 185 bit binary field. Not suitable for ECDSA. Questionable extension field!FFFFFFFFFFFFFFFFFFFFFFEDF97C44DB9F2420BAFCA75E0d181ee9020000000000000000000000000000200000000000000001 IPSec/IKE/Oakley curve #3 over a 155 bit binary field. Not suitable for ECDSA. Questionable extension field!2AAAAAAAAAAAAAAAAAAC7F3C7881BD0868FA86C1c87b07338f0800000000000000000000004000000000000001WTLS curve over a 113 bit binary field00FFFFFFFFFFFFFFFDBF91AF6DEA7300F44B4AF1ECC2630E08785CEBCC1501667979A40BA497E5D5C270780617X9.62 curve over a 431 bit binary field0340340340340340340340340340340340340340340340340340340323C313FAB50589703B5EC68D3587FEC60D161CC149C1AD4A9120D0AF8903A96F8D5FA2C255745D3C451B302C9346D9B7E485E7BCE41F6B591F3E8F6ADDCBB0BC4C2F947A7DE1A89B625D6A598B3760120FC05D3C67A99DE161D2F4092622FECA701BE4F50F4758714E8A87BBF2A658EF8C21E7C5EFE965361F6C2999C0C247B0DBD70CE6B710D9B4A3D9047D8B154359ABFB1B7F5485B04CEB868237DDC9DEDA982A679A5A919B626D4E50A8DD731B107A9962381FB5D807BF26181A827EF00DD6FC0E234CAF046C6A5D8A85395B236CC4AD2CF32A0CADBDC9DDF620B0EB9906D0957F6C6FEACD615468DF104DE296CD8F800000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000001X9.62 curve over a 368 bit binary field00010090512DA9AF72B08349D98A5DD4C7B0532ECA51CE03E2D10F3B7AC579BD87E909AE40A6F131E9CFCE5BD9677B3EB1BDDCBA62D5D8B2059B525797FC73822C59059C623A45FF3843CEE8F87CD1855ADAA81E2A0750B80FDA23101085E2755381DCCCE3C1557AFA10C2F0C0C2825646C5B34A394CBCFA8BC16B22E7E789E927BE216F02E1FB136A5FFC1217D4320A90452C760A58EDCD30C8DD069B3C34453837A34ED50CB54917E1C2112D84D164F444F8F74786046AE0D2EE25095206F5E2A4F9ED229F1F256E79A0E2B455970D8D0D865BD94778C576D62F0AB7519CCD2A1A906AE30D0100000000000000000000000000000000000000000000000000000000000000000000002000000000000000000007X9.62 curve over a 359 bit binary field01AF286BCA1AF286BCA1AF286BCA1AF286BCA1AF286BC9FB8F6B85C556892C20A7EB964FE7719E74F490758D3B53D7E08529547048121E9C95F3791DD804963948F34FAE7BF44EA82365DC7868FE57E4AE2DE211305A407104BD3C258EF3047767E7EDE0F1FDAA79DAEE3841366A132E163ACED4ED2401DF9C6BDCDE98E8E707C07A2239B1B0972472E2D0197C49363F1FE7F5B6DB075D52B6947D135D8CA445805D39BC345626089687742B6329E706802319885667676A654B20754F356EA92017D946567C46675556F19556A04616B567D223A5E05656FB549016A96656A557800000000000000000000000000000000000000000000000000000000000000000000000100000000000000001X9.62 curve over a 304 bit binary field000101D556572AABAC800101D556572AABAC8001022D5C91DD173F8FB561DA6899164443051DE19FBEB76E0DA171517ECF401B50289BF014103288527A9B416A105E80260B549FDC1B92C03B197B07845E9BE2D96ADB0F5F3C7F2CFFBD7A3EB8B6FEC35C7FD67F26DDF6285A644F740A2614BDDB97E555A50A908E43B01C798EA5DAA6788F1EA2794EFCF57166B8C14039601E55827340BEFD0D693149A118F651E6DCE6802085377E5F882D1B510B44160074C1288078365A0396C8E681010000000000000000000000000000000000000000000000000000000000000000000000000807X9.62 curve over a 272 bit binary field000100FAF51354E0E39E4892DF6E319C72C8161603FA45AA7B998A167B8F1E62952110C7695716851EEF6BA7F6872E6142FBD241B830FF5EFCACECCAB05E02005DDE9D236108BABB2CEEBCF787058A056CBE0CFE622D7723A289E08A07AE13EF0D10D171DD8D7167EFC92BB2E3CE7C8AAAFF34E12A9C557003D7C73A6FAF003F99F6CC8482E540F791A091F03B5FBA4AB2CCF49C4EDD220FB028712D42BE752B2C40094DBACDB586FB20010000000000000000000000000000000000000000000000000000010000000000000B0CCCCCCCCCCCCCCCCCCCCCCCCCCCCCAC4912D2D9DF903EF9888B8A0E4CFF2E5A0EAF6E5E1305B9004DCE5C0ED7FE59A35608F33837C816D80B79F46170F6E9D04D289C4E89913CE3530BFDE903977D42B146D539BF1BDE4E9C926A941977BA9F6A435199ACFC51067ED587F519C5ECB541B8E44111DE1D4001238774666A67766D6676F778E676B66999176666E687666D8766C66A9F1555555555555555555555555555553C6F2885259C31E3FCDF154624522D5667334C45AFF3B5A03BAD9DD75E2C71A99362567D5453F7FA6E227EC83328F9D04E900069C8DC47A08534FE76D2B900B7D7EF31F5709F200C4CA2055037EA654196CFF0CD82B2C14A2FCF2E3FF8775285B545722F03EACDB74B4230017757A767FAE42398569B746325D45313AF0766266479B75654E65FX9.62 curve over a 239 bit binary field2000000000000000000000000000000F4D42FFE1492A4993F1CAD666E44761D8EE5077C33FECF6F1A16B268DE469C3C7744EA9A971649FC7A961630557927098FA932E7C0A96D3FD5B706EF7E5F5C156E16B7E7C86038552E91D790408F2EEDAF392B012EDEFB3392F30F4327C0CA3F31FC383C422AA8C1632010857077C5431123A46B808906756F543423E8D27877578125778AC76800000000000000000000000000000000000000000000000001000000001X9.62 curve over a 208 bit binary field000101BAF95C9723C57B6C21DA2EFF2D5ED588BDD5717E212F9D0F55B51A06E78E9AC38A035FF520D8B01781BEB1A6BB08617DE389FDFBE4ABE193DF9559ECF07AC0CE78554E2784EB8C1ED1A57AC8619ED45A62E6212E1160349E2BFA844439FAFC2A3FD1638F9E0000000000000000000000000000000000000000000000000000010000000000000000000000000000000800000000000000000007155555555555555555555555610C0B196812BFB6288A3EA3545A39176196575D985999366E6AD34CE0A77CD7127B06BE375D4CE24FDE434489DE8746E71786015009E66E38A926DD71FE1AF926CF847989EFEF8DB459F66394D90F32AD3F15E86C01074756099122221056911C77D77E77A777E7E7E77FCB20000000000000000000000050508CB89F652824E06B817317434386626D14F3DBF01760D9213A3E1CF37AEC437D668A3809B2B7CC1B28CC5A87926AAD83FD28789E81E2C9E3BF100620048D28BCBD03B6249C99182B7C8CD19700C362C46A01401028774D7777C7B7666D1366EA432071274F89FF01E718X9.62 curve over a 191 bit binary field40000000000000000000000004A20E90C39067C893BBB9A5765BE73433B3F95E332932E70EA245CA2418EA0EF98018FB36B3DAF8A23206F9C4F299D7B21A9C369137F2C84AE1AA0D2E45EF571F00786F67B0081B9495A3D95462F5DE0AA185EC2866537B676752636A68F56554E12640276B649EF7526267800000000000000000000000000000000000000000000201X9.62 curve over a 176 bit binary field00010092537397ECA4F6145799D62B0A19CE06FE26AD6FA4539C2DADDDD6BAB5167D61B436E1D92BB16A562C8D16C2866798B600F9F08BB4A8E860F3298CE04A57985DDA470ABE6414DE8EC133AE28E9BBD7FCEC0AE0FFF2E4E6DB2995065C407D9D39B8D0967B96704BA8E9C90B010000000000000000000000000000000008000000000703FFFFFFFFFFFFFFFFFFFE1AEE140F110AFF96130905B935590C155E17EA48EB3FF3718B893DF59A05D002F9F87B7C574D0BDECF8A22E6524775F98CDEBDCB03F7061798EB99E238FD6F1BF95B48FEEB4854252B07A526C63D3E25A256A007699F5447E32AE456B50E03FFFFFFFFFFFFFFFFFFFDF64DE1151ADBB78F10A7079F684DDF6684C5CD258B3890021B2386DFD19FC50024266E4EB5106D0A964D92C4860E2671DB9B6CC50667ACEB38AF4E488C407433FFAE4F1C811638DF200108B39E77C4B108BED981ED0E890E117C511CF072X9.62 curve over a 163 bit binary field0400000000000000000001E60FC8821CC74DAEAFC101EC23211B5966ADEA1D3F87F7EA5848AEF0B7CA9F07AF69989546103D79329FCC3D74880F33BBE803CB00C9517D06D5240D3CFF38C74B20B6CD4D6F9DD4D9072546B5435234A422E0789675F432C89435DE524208000000000000000000000000000000000000010703FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15B0303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D1902F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727A000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001NIST/SECG curve over a 571 bit binary field020000000000000000000000000000000000000000000000000000000000000000000000131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C10010349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA44370958493B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C897280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425010000000000000000000000000000000000000000000000000001E2AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A211730061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A70021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545F00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001NIST/SECG curve over a 409 bit binary field007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF01E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B0060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE90237460200000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000103FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB30703676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F405F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B12053027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5000000000000000000000000000000000000000000000000000000000000000000000001NIST/SECG curve over a 283 bit binary field01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C6101CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD22590503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC24584928360800000000000000000000000000000000000000000000000000000000000000000010A1SECG curve over a 239 bit binary field2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A576310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA29A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC80000000000000000000400000000000000000000000000000000000000101000000000000000000000000000013E974E72F8A6922031D2603CFE0D701006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F8105200FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD000000000000000000000000000000000000000000000000000000000001NIST/SECG/WTLS curve over a 233 bit binary field008000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126020000000000000000000000000000000000000004000000000000000001010000000000000000000000015AAB561B005413CCD4EE99D501CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C00D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709BSECG curve over a 193 bit binary field01000000000000000000000000C7F34A778F443ACC920EBA490025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B0501F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E100FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D8314788140017858FEB7A98975169E171F77B4087DE098AC8A911DF7B0102000000000000000000000000000000000000000000008001NIST/SECG curve over a 163 bit binary field040000000000000000000292FE77E70C12A4234C3300D51FBC6C71A0094FA2CDD545B11C5C0C797324F103F0EBA16286A2D57EA0991168D4994637E8343E36020A601907B8C953CA1481EB10512F78744A3205FDSECG curve over a 163 bit binary field03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B00435EDB42EFAFB2989D51FEFCE3C80988F41FF8830369979697AB43897789566789567F787A7876A6540713612DCDDCB40AAB946BDA29CA91F73AF958AFD907B6882CAAEFA84F9554FF8428BD88E246D2782AE2NIST/SECG/WTLS curve over a 163 bit binary field04000000000000000000020108A2E0CC0D99F8A5EF0289070FB05D38FF58321F2E800536D538CCDAA3D902FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE80800000000000000000000000000000000000000C9SECG curve over a 131 bit binary field0400000000000000016954A233049BA98F0648F06D867940A5366D9E265DE9EB240F0356DCD8F2F95031AD652D23951BB366A804B8266A46C55657AC734CE38F018F219203E5A88919D7CAFCBF415F07C2176573B2SECG/WTLS curve over a 131 bit binary field0400000000000000023123953A9464B54D078C6E7EA38C001F73C8134B1B4EF9E1500081BAF91FDF9833C40F9C1813436383990217C05610884B63B9C6C7291678F9D34107A11B09A76B562144418FF3FF8C2570B8080000000000000000000000000000010D010000000000000108789B2496AF9300B3ADC94ED1FE674C06E695BABA1D01A57A6A7B26CA5EF52FCDB81647970095E9A9EC9B297BD4BF36E059184F00689918DBEC7E5A0DD6DFC0AA55C7SECG curve over a 113 bit binary field0100000000000000D9CCEC8A39E56F00A52830277958EE84D1315ED31886009D73616F35F4AB1407D73562C10F00E8BEE4D3E2260744188BE0E9C723003088250CA6E7C7FE649CE85820F7020000000000000000000000000201WTLS curvs over a 224 bit prime fieldWTLS curve over a 160 bit prime field0100000000000000000001CDC98AE0E2DE574ABF33FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC808FWTLS curve over a 112 bit prime field0100000000000001ECEA551AD837E921FFFFFFFFFFFFFFFFFFFFFFFFFDE7SECG curve over a 256 bit prime fieldFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b879BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2FSECG curve over a 224 bit prime field010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F77e089fed7fba344282cafbd6f7e319f7c0b0bd59e2ca4bdb556d61a5A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C5FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56DSECG curve over a 192 bit prime fieldFFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D9b2f2f6d9c5628a7844163d015be86344082aa88d95e2f9dDB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37SECG/WTLS curve over a 160 bit prime field0100000000000000000000351EE786A818F3A1A16Bfeaffef2e331f296e071fa0df9982cfea7d43f2e52DCB034293A117E1F4FF11B30F7199D3144CE6DB4E134D3FB59EB8BAB57274904664D5AF50388BAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC700100000000000000000001F4C8F927AED3CA75225723a628553168947d59dcc912042351377ac5fb324A96B5688EF573284664698968C38BB913CBFC821C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFSECG curve over a 160 bit prime field0100000000000000000001B8FA16DFAB9ACA16B6B3938cf935318fdced6bc28286531733c3f03c4fee3B4C382CE37AA192A4019E763036F4F5DD4D7EBB7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC733FFFFFFF7FFFFFFFBE0024720613B5A327b6916a894d3aee7106fe805fc34b447B6AA5D85E572983E6FB32A7CDEBC1405EEEFCA380D02919DC2C6558BB6D8A5DD6031998D1B3BBFEBF59CC9BBFF9AEE1SECG curve over a 128 bit prime fieldFFFFFFFE0000000075A30D1B9038A115cf5ac8395bafeb13c02da292dded7a83161FF7528B899B2D0C28607CA52C5B86E87579C11079F43DD824993C2CEE5ED3FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFCFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFFSECG curve over a 112 bit prime field36DF0AAFD8B8D7597CA10520D04Badcd46f5882e3747def36e956e974BA30AB5E892B4E1649DD092864351DEF1815DB5ED74FCC34C85D7096127C24C05F38A0AAAF65C0EF02CSECG/WTLS curve over a 112 bit prime fieldDB7C2ABF62E35E7628DFAC6561C5a89ce5af8724c0a23e0e0ff7750009487239995A5EE76B55F9C2F098659EF8BA043916EEDE8911702B22DB7C2ABF62E35E668076BEAD2088DB7C2ABF62E35E668076BEAD208BX9.62/SECG curve over a 256 bit prime fieldFFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC6325514fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f56B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C2965AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604BFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFCFFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C4321465265511607e6898f390c06bc1d552bad226f3b6fcfe48b6e818499af18e3ed6cf36768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC5820635b0125e4dbea0ec7206da0fc01d9b081329fb555de6ef460237dff8be4ba38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2CX9.62 curve over a 239 bit prime field7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B7debe8e4e90a5dae6e4054ca530ba04654b36818ce226b39fccb7b02f1ae0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC1338a90f22637337334b49dcb66a6dc8f9978aca7648a943b07D29778100C65A1DA1783716588DCE2B8B4AEE8E228F189622123DC2395A05CAA7423DAECCC94760A7D462256BD56916X9.62 curve over a 192 bit prime fieldFFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD316574d11d69b6ec7a672bb82a083df2f2b0847de970b2de15EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034ACC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953NIST/SECG curve over a 521 bit prime field1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F001FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFNIST/SECG curve over a 384 bit prime fieldFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC529733617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5fAA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFFNIST/SECG curve over a 224 bit prime fieldFFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3Dbd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001NIST/X9.62/SECG curve over a 192 bit prime fieldFFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D2283107192b95ffc8da78631011ed6b24cdd573f977a11e794811188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF101264210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF0E®oÈB/díW•(Ó êá!–Õ–ˆ T   ì ¸ „ À P ½q4G™ÕÇüÜEµŸ£¹«j”‹Å– Ø œ ` $ è  ¼ £5’j£¢z‰jgs¤‚zͬs–X ð ˆ   ¸ P @ $ Оˆ)¸S–Ìg92„ª Údº–     € ø € Ì 1©.âŸÑ >™ðÒƶ–ˆ T ˜ d 0 ü À Ô ÄihD5Þ³xĶ\©Y*Wcš.–ˆ T   l 8   Ô ä;´`ð¸ ÀÀ°uyŽ”€`ø2}–Ä „ D  Ä „ @ \ è´ SÊ;€™˜+àŸËšæ–Ä „  Ü œ \ € \ }stþ4q¶ …v†¡”uÓ¿¢ÿ–Ä „  Ü œ \ À \ Ä6†ç“jfxá&·Ÿ~– Ð ˆ @ ø °  € õ ŽMinghuaQu)rx?±–` @    à À @ ” 'W¡MinghuaQuSÀ^ Ô–` t T 4  ô € Ì  MinghuaQu À:DsÐ6y–¨ „ ` <  ôÿ À Ìÿ MinghuaQuØð41üæ;ˆô–¨ ¨ÿ „ÿ `ÿ <ÿ ÿ  Ìÿ –ìþ  v èþ ¼þ þ dþ <þ SÍä,Ö–æv‡VS;óø3E–þ äý ¸ý Œý `ý 4ý l <þ ¹›™°™³#à' ¤Ö–æv‡VQ–ìþ ý Üü °ü „ü Xü ¬ ,ü –øû  v ôû Àû Œû Xû 0û –ôú  v ðú ´ú xú <ú ú –Ðù  v èþ ˆù @ù øø Ðø –°ø  v ôû ¬ø ¨ø ˆø `ø –4ø  v ôû ¬ø ¨ø ø à÷ – Ø œ ` $ è ¸÷ ç#«Ö–æv‡VVþ¿ËI©—˜÷ x÷ X÷ 8÷ ÷ øö ô Ðö Àûv`ÞñîôÖ–æv‡V]—˜÷ °ö ö pö Pö 0ö 4 Ðö MinghuaQu˜[Ó­ºÚ!´:—â— ö èõ Äõ  õ |õ Xõ t ,õ ˜[Ó­ºÔÖ–æv‡VZ!´:—ã— ö õ äô Àô œô xô ´ Pô —$ô ¬ø ¬ø øó Ìó  ó ló $·±7È¡MinghuaQuoÐÚ.\—$ô @ó ó èò ¼ò ò hò …â[þ\†"lÛouSùÐæ“¢h—$ô ¬ø <ò ò äñ ¸ñ Œñ ?®ÇMinghuaQuwű‘ï0—Xñ $ñ ðð ¼ð ˆð Tð   ,ð ·´Ö–æv‡VQ7È¡oÐÚ"—Xñ øï Äï ï \ï (ï à ,ð —èî  v ¬ø ¨î hî (î ôí tÕŸðkA=¡K4K ¢Û›P×èî ´í tí 4í ôì ´ì L ôí —tì  v ¬ø 4ì ôë ´ë Œë —@ë  v ¬ø ðê  ê Pê $ê wâ°spëƒ*mÕ¶-üˆÍ»„¾—@ë Øé ˆé 8é èè ˜è ä $ê —(è  v ¬ø ¸ç Hç Øæ ¬æ @™µ¤WùÖŸy!= LKÍMBb! —(è @æ Ðå `å ðä €ä P ¬æ —ðã  v ¬ø Xã Àâ (â üá * X÷:3«HkaÅ:#—ðã há Ðà 8à  ß ß ¼ üá ÒÀûv`ÞñîôÖ–æv‡VT—ÜÞ °Þ „Þ XÞ ,Þ Þ ü ØÝ SL DÖ–æv‡VX ¤âŸý—ÜÞ ¬Ý €Ý TÝ (Ý üÜ < ØÝ PËñÙ\©MinghuaQuñj6£¸—ÜÞ ÐÜ ¤Ü xÜ LÜ  Ü | ØÝ —ðÛ ÀÛ Û `Û 0Û Û nÿØÚ NÊT'DÖ–æv‡VU/'šŒ„—¤Ú pÚ <Ú Ú ÔÙ  Ù è xÙ qï/ï$Ö–æv‡VX¾àÙ\—¤Ú DÙ Ù ÜØ ¨Ø tØ ( xÙ àSQ-Ƅ֖æv‡VPg®xm—¤Ú @Ø  Ø Ø× ¤× p× h xÙ —8× × ÈÖ Ö XÖ  Ö HþøÕ ÓKšMinghuaQuÊq¹ ¿ï°]—¸Õ xÕ 8Õ øÔ ¸Ô xÔ Ô PÔ *¦˜/ߤ֖æv‡V]&g''}—¸Õ Ô ÐÓ Ó PÓ Ó  PÔ žoMinghuaQuáŸÝwù A—¸Õ ÐÒ Ò PÒ Ò ÐÑ  T PÔ —ˆÑ @Ñ øÐ °Ð hÐ  Ð ÿøÏ —¨Ï XÏ Ï ¸Î hÎ Î .þìÍ +5I ·$Ö–æv‡VX[¡3-Æ—Í 0Í ÐÌ pÌ Ì °Ë Lì ˆË —(Ë ÈÊ hÊ Ê ¨É HÉ pÿ É —°È @È ÐÇ `Ç ðÆ €Æ `'XÆ —˜÷ ¬ø ¬ø 8Æ Æ øÅ ÐÅ —¤Å  v œÅ ˜Å ”Å lÅ øÄ —ÄÄ  v ¼Ä ¸Ä ´Ä „Ä Ä ÀT Á” ÂÔ Ã Ä@ Å€ ÆÀ Çì È É ÊD ËT Ì” ™Ô šÔ › œT ” žÔ Ÿ Í ÎH ψ ÐÈ Ñô Ò4 Ót Ô´ Õô Ö  ×` ØŒ Ù¸ Úø Û$ Üd Ý ÞÐ ¬ ­P ® ¯¼ °ü ±< ²| µ¨ ¶è ·( ¸h »” ¼À ½ ¾, ¿X ß„ àô á â ãT äÀ åp æœ ç  è` éÈ í° îÜ .\crypto\ec\ec_curve.c.\crypto\ec\ec_check.c0123456789ABCDEF.\crypto\ec\ec_print.cEC_PRIVATEKEYpublicKeyparametersprivateKeyECPKPARAMETERSvalue.implicitlyCAvalue.parametersvalue.named_curveECPARAMETERScofactororderbasecurvefieldIDX9_62_CURVEseedbaX9_62_FIELDIDfieldTypep.char_twop.primeX9_62_CHARACTERISTIC_TWOtypemp.ppBasisp.tpBasisp.onBasisp.otherX9_62_PENTANOMIALk3k2k1ô# À ð# À ì# À ø#  Ø# Ð# ‰€$ P$ ©Ä# pƒª¸# p«¬# ð ¨# À  # ðƒÿÿÿÿ„#  È$  „# Ð# ‰–|# p—p#  4%  % d# ðƒÿÿÿÿT#  €% T# P# ð‚L# ð‚D# p‚Ä%  8# 8& ü" ü¦ À 0# 0 (# @  # ð‚# p # pè" ðƒÔ" P À" pƒ°& °" ü¦ À ¤" ð‚‘˜" ` ‘ Œ" p‚' |" .\crypto\ec\ec_asn1.c.\crypto\ec\ec_key.c—,À,ð,0-0.@/°/Ð/p0 0Ð01`1€1 2ð23°5€80<P< <°< > ? @€I@KPKð@ A@A.\crypto\ec\ec2_smpl.cc:\temp\openssl-0.9.8l\crypto\ec\ec2_smpt.c.\crypto\ec\ec2_mult.cECDH part of OpenSSL 0.9.8l 5 Nov 2009.\crypto\ecdh\ech_lib.cOpenSSL ECDH method.\crypto\ecdh\ech_ossl.cpoint arithmetic failureKDF failedECDH_DATA_NEW_METHODECDH_compute_keyECDSA part of OpenSSL 0.9.8l 5 Nov 2009.\crypto\ecdsa\ecs_lib.cECDSA_SIGô¨ € 𨠀 °) ¤) OpenSSL ECDSA method.\crypto\ecdsa\ecs_ossl.csignature malloc failedrandom number generation failedneed new setup valueserr ec libECDSA_sign_setupECDSA_do_verifyECDSA_do_signECDSA_DATA_NEW_METHOD.\crypto\buffer\buffer.c.\crypto\buffer\buf_str.cBUF_strndupBUF_strdupBUF_MEM_newBUF_MEM_grow_cleanBUF_MEM_growBUF_memdup.\crypto\bio\bio_lib.c bio callback - unknown type (%d) ctrl return %ld puts return %ld gets return %ld write return %ld read return %ld ctrl(%d) - %s gets(%d) - %s puts() - %s write(%d,%d) - %s write(%d,%d) - %s fd=%d read(%d,%d) - %s read(%d,%d) - %s fd=%d Free - %s BIO[%08lX]:WSAStartupwrite to read only BIOunsupported methoduninitializedunable to listen socketunable to create socketunable to bind sockettag mismatchnull parameterno such fileno port specifiedno port definedno hostname specifiedno accept port specifiednbio connect errorkeepalivein useinvalid ip addressgethostbyname addr is not af ineterror setting nbio on accept socketerror setting nbio on accepted socketerror setting nbioEOF on memory BIOconnect errorbroken pipebad hostname lookupbad fopen modeaccept errorWSASTARTUPSSL_newMEM_WRITEMEM_READLINEBUFFER_CTRLFILE_READFILE_CTRLCONN_STATECONN_CTRLBUFFER_CTRLBIO_writeBIO_sock_initBIO_readBIO_putsBIO_nwrite0BIO_nwriteBIO_nread0BIO_nreadBIO_new_mem_bufBIO_new_fileBIO_newBIO_MAKE_PAIRBIO_get_portBIO_get_host_ipBIO_get_accept_socketBIO_getsBIO_gethostbynameBIO_ctrlBIO_callback_ctrlBIO_BER_GET_HEADERBIO_acceptACPT_STATEmemory buffer.\crypto\bio\bss_mem.cNULLfile descriptorFILE pointer.\crypto\bio\bss_file.cfopen('','')twr+a+socketsocket connecthost=.\crypto\bio\bss_conn.c%d%d.%d.%d.%dNULL filterbuffer.\crypto\bio\bf_buff.c$@à?.\crypto\bio\b_print.c0123456789abcdef0xdoapr()%s%04x - %c %02x%c %04x - service=''gopherftphttpssockstelnethttptcp.\crypto\bio\b_sock.c%d.%d.%d.%d:%dport='*socket accept.\crypto\bio\bss_acpt.cnon-blocking IO test filter.\crypto\bio\bf_nbio.cBIO pair.\crypto\bio\bss_bio.cdatagram socket.\crypto\bio\bss_dgram.cgetsockoptsetsockoptStack part of OpenSSL 0.9.8l 5 Nov 2009.\crypto\stack\stack.clhash part of OpenSSL 0.9.8l 5 Nov 2009.\crypto\lhash\lhash.cnum_hash_comps = %lu num_retrieve_miss = %lu num_retrieve = %lu num_no_delete = %lu num_delete = %lu num_replace = %lu num_insert = %lu num_comp_calls = %lu num_hash_calls = %lu num_contract_reallocs = %lu num_contracts = %lu num_expand_reallocs = %lu num_expands = %lu num_alloc_nodes = %u num_nodes = %u num_items = %lu node %6u -> %3u load %d.%02d actual load %d.%02d %lu items %lu nodes used out of %u RAND part of OpenSSL 0.9.8l 5 Nov 2009@@.\crypto\rand\md_rand.cYou need to read the OpenSSL FAQ, http://www.openssl.org/support/faq.html....................rbwb.rndC:HOMERANDFILEprng stuckprng seed must not match keyPRNG not seededprng not reseededprng not rekeyedprng keyedprng errorprng asking for too muchno key setnot in test modeSSLEAY_RAND_BYTESRAND_get_rand_methodFIPS_SET_TEST_MODEFIPS_SET_PRNG_SEEDFIPS_SET_DTFIPS_RAND_SET_DTFIPS_RAND_GET_RAND_METHODFIPS_RAND_BYTESFIPS_RANDENG_RAND_GET_RAND_METHOD.\crypto\rand\rand_win.cDISPLAY@"@@@Module32NextModule32FirstThread32NextThread32FirstProcess32NextProcess32FirstHeap32ListNextHeap32ListFirstHeap32NextHeap32FirstCloseToolhelp32SnapshotCreateToolhelp32Snapshot@GetQueueStatusGetCursorInfoGetForegroundWindowUSER32.DLLP@Intel Hardware Cryptographic Service ProviderCryptReleaseContextCryptGenRandomCryptAcquireContextW1@LanmanServer€F@LanmanWorkstationNetApiBufferFreeNetStatisticsGetNETAPI32.DLLKERNEL32.DLLADVAPI32.DLLš™™™™™©?š™™™™™É?NA.\crypto\err\err.c p°€PP.\crypto\err\err_def.cint_err_get (err.c)int_thread_get (err.c)error:%08lX:%s:%s:%sreason(%lu)func(%lu)lib(%lu)%lu:%s:%s:%d:%s called a function that was disabled at compile-timeinternal errorpassed a null parametercalled a function you should not callmalloc failurefatalmissing asn1 eosasn1 length mismatchexpecting an asn1 sequencebad get asn1 object callbad asn1 object headernested asn1 errorOCSP libENGINE libDSO libRAND libPKCS12 libX509V3 libPKCS7 libBIO libSSL libEC libCRYPTO libCONF libASN1 libX509 libDSA libPEM libOBJ libBUF libEVP libDH libRSA libBN libsystem libfreadopendirWSAstartupacceptlistenbindioctlsocketconnectfopenJPAKE routinesCMS routinesFIPS routinesOCSP routinesengine routinesDSO support routinesrandom number generatorPKCS12 routinesX509 V3 routinesPKCS7 routinesBIO routinesSSL routineselliptic curve routinescommon libcrypto routinesconfiguration file routinesasn1 encoding routinesx509 certificate routinesdsa routinesPEM routinesobject identifier routinesmemory buffer routinesdigital envelope routinesDiffie-Hellman routinesrsa routinesbignum routinessystem libraryunknown libraryunknown.\crypto\err\err_str.c.\crypto\objects\o_names.cPermanent Identifierid-on-permanentIdentifierX509v3 Freshest CRLfreshestCRLMicrosoft Local Key setLocalKeySethmacHMACGOST R 3410-2001 Parameter Set Cryptocomid-GostR3410-2001-ParamSet-ccGOST R 34.11-94 with GOST R 34.10-2001 Cryptocomid-GostR3411-94-with-GostR3410-2001-ccGOST R 34.11-94 with GOST R 34.10-94 Cryptocomid-GostR3411-94-with-GostR3410-94-ccGOST 34.10-2001 Cryptocomgost2001ccGOST 34.10-94 Cryptocomgost94ccGOST 28147-89 Cryptocom ParamSetid-Gost28147-89-ccid-GostR3410-94-bBisid-GostR3410-94-bid-GostR3410-94-aBisid-GostR3410-94-aid-GostR3410-2001-CryptoPro-XchB-ParamSetid-GostR3410-2001-CryptoPro-XchA-ParamSetid-GostR3410-2001-CryptoPro-C-ParamSetid-GostR3410-2001-CryptoPro-B-ParamSetid-GostR3410-2001-CryptoPro-A-ParamSetid-GostR3410-2001-TestParamSetid-GostR3410-94-CryptoPro-XchC-ParamSetid-GostR3410-94-CryptoPro-XchB-ParamSetid-GostR3410-94-CryptoPro-XchA-ParamSetid-GostR3410-94-CryptoPro-D-ParamSetid-GostR3410-94-CryptoPro-C-ParamSetid-GostR3410-94-CryptoPro-B-ParamSetid-GostR3410-94-CryptoPro-A-ParamSetid-GostR3410-94-TestParamSetid-Gost28147-89-CryptoPro-RIC-1-ParamSetid-Gost28147-89-CryptoPro-Oscar-1-0-ParamSetid-Gost28147-89-CryptoPro-Oscar-1-1-ParamSetid-Gost28147-89-CryptoPro-D-ParamSetid-Gost28147-89-CryptoPro-C-ParamSetid-Gost28147-89-CryptoPro-B-ParamSetid-Gost28147-89-CryptoPro-A-ParamSetid-Gost28147-89-TestParamSetid-GostR3411-94-CryptoProParamSetid-GostR3411-94-TestParamSetid-Gost28147-89-None-KeyMeshingid-Gost28147-89-CryptoPro-KeyMeshingGOST R 34.10-94 DHid-GostR3410-94DHGOST R 34.10-2001 DHid-GostR3410-2001DHGOST R 34.11-94 PRFprf-gostr3411-94GOST 28147-89 MACgost-macgost89-cntGOST 28147-89gost89GOST R 34.10-94gost94GOST R 34.10-2001gost2001HMAC GOST 34.11-94id-HMACGostR3411-94GOST R 34.11-94md_gost94GOST R 34.11-94 with GOST R 34.10-94id-GostR3411-94-with-GostR3410-94GOST R 34.11-94 with GOST R 34.10-2001id-GostR3411-94-with-GostR3410-2001cryptocomcryptoprowhirlpooldsa_with_SHA256dsa_with_SHA224hmacWithSHA512hmacWithSHA384hmacWithSHA256hmacWithSHA224hmacWithMD5ecdsa-with-SHA512ecdsa-with-SHA384ecdsa-with-SHA256ecdsa-with-SHA224ecdsa-with-Specifiedecdsa-with-Recommendedid-aes256-wrapid-aes192-wrapid-aes128-wrapid-ct-asciiTextWithCRLFid-smime-ct-compressedDataCA RepositorycaRepositoryid-it-suppLangTagsDiffie-Hellman based MACid-DHBasedMacpassword based MACid-PasswordBasedMAChmac-sha1HMAC-SHA1hmac-md5HMAC-MD5seed-cfbSEED-CFBseed-ofbSEED-OFBseed-cbcSEED-CBCseed-ecbSEED-ECBkisaKISAX509v3 Certificate IssuercertificateIssuerX509v3 Issuing Distrubution PointissuingDistributionPointX509v3 Subject Directory AttributessubjectDirectoryAttributescamellia-256-ofbCAMELLIA-256-OFBcamellia-192-ofbCAMELLIA-192-OFBcamellia-128-ofbCAMELLIA-128-OFBcamellia-256-cfb8CAMELLIA-256-CFB8camellia-192-cfb8CAMELLIA-192-CFB8camellia-128-cfb8CAMELLIA-128-CFB8camellia-256-cfb1CAMELLIA-256-CFB1camellia-192-cfb1CAMELLIA-192-CFB1camellia-128-cfb1CAMELLIA-128-CFB1camellia-256-cfbCAMELLIA-256-CFBcamellia-192-cfbCAMELLIA-192-CFBcamellia-128-cfbCAMELLIA-128-CFBcamellia-256-ecbCAMELLIA-256-ECBcamellia-192-ecbCAMELLIA-192-ECBcamellia-128-ecbCAMELLIA-128-ECBcamellia-256-cbcCAMELLIA-256-CBCcamellia-192-cbcCAMELLIA-192-CBCcamellia-128-cbcCAMELLIA-128-CBCipsec4Oakley-EC2N-4ipsec3Oakley-EC2N-3X509v3 Inhibit Any PolicyinhibitAnyPolicyX509v3 Policy MappingspolicyMappingsX509v3 Any PolicyanyPolicywap-wsg-idm-ecid-wtls12wap-wsg-idm-ecid-wtls11wap-wsg-idm-ecid-wtls10wap-wsg-idm-ecid-wtls9wap-wsg-idm-ecid-wtls8wap-wsg-idm-ecid-wtls7wap-wsg-idm-ecid-wtls6wap-wsg-idm-ecid-wtls5wap-wsg-idm-ecid-wtls4wap-wsg-idm-ecid-wtls3wap-wsg-idm-ecid-wtls1sect571r1sect571k1sect409r1sect409k1sect283r1sect283k1sect239k1sect233r1sect233k1sect193r2sect193r1sect163r2sect163r1sect163k1sect131r2sect131r1sect113r2sect113r1secp521r1secp384r1secp256k1secp224r1secp224k1secp192k1secp160r2secp160r1secp160k1secp128r2secp128r1secp112r2secp112r1c2tnb431r1c2pnb368w1c2tnb359v1c2pnb304w1c2pnb272w1c2onb239v5c2onb239v4c2tnb239v3c2tnb239v2c2tnb239v1c2pnb208w1c2onb191v5c2onb191v4c2tnb191v3c2tnb191v2c2tnb191v1c2pnb176v1c2pnb163v3c2pnb163v2c2pnb163v1ppBasistpBasisonBasisid-characteristic-two-basiswap-wsgwapcerticom-arcidentified-organizationsha224SHA224sha512SHA512sha384SHA384sha256SHA256sha224WithRSAEncryptionRSA-SHA224sha512WithRSAEncryptionRSA-SHA512sha384WithRSAEncryptionRSA-SHA384sha256WithRSAEncryptionRSA-SHA256Independentid-ppl-independentX509v3 Name ConstraintsnameConstraintsInherit allid-ppl-inheritAllAny languageid-ppl-anyLanguageProxy Certificate InformationproxyCertInfoid-pplpostalCodestreetAddressdes-ede3-cfb8DES-EDE3-CFB8des-ede3-cfb1DES-EDE3-CFB1des-cfb8DES-CFB8des-cfb1DES-CFB1aes-256-cfb8AES-256-CFB8aes-192-cfb8AES-192-CFB8aes-128-cfb8AES-128-CFB8aes-256-cfb1AES-256-CFB1aes-192-cfb1AES-192-CFB1aes-128-cfb1AES-128-CFB1Microsoft Universal Principal NamemsUPNMicrosoft SmartcardloginmsSmartcardLoginInternational Organizationsinternational-organizationsjoint-iso-itu-tJOINT-ISO-ITU-Titu-tITU-TrsaOAEPEncryptionSETdes-cdmfDES-CDMFset-brand-Novusset-brand-MasterCardset-brand-Visaset-brand-JCBset-brand-AmericanExpressset-brand-Dinersset-brand-IATA-ATAsecure device signaturesetAttr-SecDevSigICC or token signaturesetAttr-TokICCsigcleartext track 2setAttr-T2cleartxtencrypted track 2setAttr-T2Encgenerate cryptogramsetAttr-GenCryptgrmsetAttr-IssCap-SigsetAttr-IssCap-T2setAttr-IssCap-CVMsetAttr-Token-B0PrimesetAttr-Token-EMVset-addPolicyset-rootKeyThumbissuer capabilitiessetAttr-IssCapsetAttr-TokenTypepayment gateway capabilitiessetAttr-PGWYcapsetAttr-CertsetCext-IssuerCapabilitiessetCext-TokenTypesetCext-Track2DatasetCext-TokenIdentifiersetCext-PGWYcapabilitiessetCext-setQualfsetCext-setExtsetCext-tunnelingsetCext-cCertRequiredsetCext-merchDatasetCext-certTypesetCext-hashedRootset-policy-rootadditional verificationsetext-cvsetext-track2setext-pinAnysetext-pinSecuremerchant initiated authsetext-miAuthgeneric cryptogramsetext-genCryptsetct-BCIDistributionTBSsetct-CRLNotificationResTBSsetct-CRLNotificationTBSsetct-CertResTBEsetct-CertReqTBEXsetct-CertReqTBEsetct-RegFormReqTBEsetct-BatchAdminResTBEsetct-BatchAdminReqTBEsetct-CredRevResTBEsetct-CredRevReqTBEXsetct-CredRevReqTBEsetct-CredResTBEsetct-CredReqTBEXsetct-CredReqTBEsetct-CapRevResTBEsetct-CapRevReqTBEXsetct-CapRevReqTBEsetct-CapResTBEsetct-CapReqTBEXsetct-CapReqTBEsetct-AuthRevResTBEBsetct-AuthRevResTBEsetct-AuthRevReqTBEsetct-AcqCardCodeMsgTBEsetct-CapTokenTBEXsetct-CapTokenTBEsetct-AuthTokenTBEsetct-AuthResTBEXsetct-AuthResTBEsetct-AuthReqTBEsetct-PIUnsignedTBEsetct-PIDualSignedTBEsetct-ErrorTBSsetct-CertInqReqTBSsetct-CertResDatasetct-CertReqTBSsetct-CertReqDatasetct-RegFormResTBSsetct-MeAqCInitResTBSsetct-CardCInitResTBSsetct-BatchAdminResDatasetct-BatchAdminReqDatasetct-PCertResTBSsetct-PCertReqDatasetct-CredRevResDatasetct-CredRevReqTBSXsetct-CredRevReqTBSsetct-CredResDatasetct-CredReqTBSXsetct-CredReqTBSsetct-CapRevResDatasetct-CapRevReqTBSXsetct-CapRevReqTBSsetct-CapResDatasetct-CapReqTBSXsetct-CapReqTBSsetct-AuthRevResTBSsetct-AuthRevResDatasetct-AuthRevReqTBSsetct-AcqCardCodeMsgsetct-CapTokenTBSsetct-CapTokenDatasetct-AuthTokenTBSsetct-AuthResTBSXsetct-AuthResTBSsetct-AuthReqTBSsetct-PResDatasetct-PI-TBSsetct-PInitResDatasetct-CapTokenSeqsetct-AuthRevResBaggagesetct-AuthRevReqBaggagesetct-AuthResBaggagesetct-HODInputsetct-PIDataUnsignedsetct-PIDatasetct-PIsetct-OIDatasetct-PANOnlysetct-PANTokensetct-PANDataset-brandcertificate extensionsset-certExtset-policyset-attrmessage extensionsset-msgExtcontent typesset-ctypeSecure Electronic Transactionsid-setpseudonymgenerationQualifierid-hex-multipart-messageid-hex-partial-messagemime-mhs-bodiesmime-mhs-headingsMIME MHSmime-mhsx500UniqueIdentifierdocumentPublisheraudiodITRedirectpersonalSignaturesubtreeMaximumQualitysubtreeMinimumQualitysingleLevelQualitydSAQualitybuildingNamemailPreferenceOptionjanetMailboxorganizationalStatusfriendlyCountryNamepagerTelephoneNumbermobileTelephoneNumberpersonalTitlehomePostalAddressassociatedNameassociatedDomaincNAMERecordsOARecordnSRecordmXRecordpilotAttributeType27aRecordlastModifiedBylastModifiedTimeotherMailboxsecretaryhomeTelephoneNumberdocumentLocationdocumentAuthordocumentVersiondocumentTitledocumentIdentifiermanagerhostuserClassphotoroomNumberfavouriteDrinkinforfc822MailboxmailtextEncodedORAddressuserIdUIDqualityLabelledDatapilotDSApilotOrganizationsimpleSecurityObjectfriendlyCountrydomainRelatedObjectdNSDomainrFC822localPartdocumentSeriesroomdocumentaccountpilotPersonpilotObjectcaseIgnoreIA5StringSyntaxiA5StringSyntaxpilotGroupspilotObjectClasspilotAttributeSyntaxpilotAttributeTypepilotuclpssdataHold Instruction RejectholdInstructionRejectHold Instruction Call IssuerholdInstructionCallIssuerHold Instruction NoneholdInstructionNoneHold Instruction CodeholdInstructionCodeaes-256-cfbAES-256-CFBaes-256-ofbAES-256-OFBaes-256-cbcAES-256-CBCaes-256-ecbAES-256-ECBaes-192-cfbAES-192-CFBaes-192-ofbAES-192-OFBaes-192-cbcAES-192-CBCaes-192-ecbAES-192-ECBaes-128-cfbAES-128-CFBaes-128-ofbAES-128-OFBaes-128-cbcAES-128-CBCaes-128-ecbAES-128-ECBMicrosoft CSP NameCSPNameecdsa-with-SHA1prime256v1prime239v3prime239v2prime239v1prime192v3prime192v2prime192v1id-ecPublicKeycharacteristic-two-fieldprime-fieldANSI X9.62ansi-X9-62X509v3 No Revocation AvailablenoRevAvailX509v3 AC TargetingtargetInformationX509v3 Policy ConstraintspolicyConstraintsroleid-aca-encAttrsSubject Information AccesssubjectInfoAccessac-proxyingmd4WithRSAEncryptionRSA-MD4clearanceSelected Attribute Typesselected-attribute-typesDomaindomaindomainComponentDCdcObjectdcobjectEnterprisesenterprisesMailSNMPv2snmpv2SecuritysecurityPrivateprivateExperimentalexperimentalManagementmgmtDirectorydirectoryianaIANAdodDODorgORGdirectory services - algorithmsX500algorithmsrsaSignaturealgorithmTrust RoottrustRootpathvalidExtended OCSP StatusextendedStatusOCSP Service LocatorserviceLocatorOCSP Archive CutoffarchiveCutoffOCSP No ChecknoCheckAcceptable OCSP ResponsesacceptableResponsesOCSP CRL IDCrlIDOCSP NonceNonceBasic OCSP ResponsebasicOCSPResponsead dvcsAD_DVCSAD Time Stampingad_timestampingid-cct-PKIResponseid-cct-PKIDataid-cct-crsid-qcs-pkixQCSyntax-v1id-aca-roleid-aca-groupid-aca-chargingIdentityid-aca-accessIdentityid-aca-authenticationInfoid-pda-countryOfResidenceid-pda-countryOfCitizenshipid-pda-genderid-pda-placeOfBirthid-pda-dateOfBirthid-on-personalDataid-cmc-confirmCertAcceptanceid-cmc-popLinkWitnessid-cmc-popLinkRandomid-cmc-queryPendingid-cmc-responseInfoid-cmc-regInfoid-cmc-revokeRequestid-cmc-getCRLid-cmc-getCertid-cmc-lraPOPWitnessid-cmc-decryptedPOPid-cmc-encryptedPOPid-cmc-addExtensionsid-cmc-recipientNonceid-cmc-senderNonceid-cmc-transactionIdid-cmc-dataReturnid-cmc-identityProofid-cmc-identificationid-cmc-statusInfoid-alg-dh-popid-alg-dh-sig-hmac-sha1id-alg-noSignatureid-alg-des40id-regInfo-certReqid-regInfo-utf8Pairsid-regCtrl-protocolEncrKeyid-regCtrl-oldCertIDid-regCtrl-pkiArchiveOptionsid-regCtrl-pkiPublicationInfoid-regCtrl-authenticatorid-regCtrl-regTokenid-regInfoid-regCtrlid-it-origPKIMessageid-it-confirmWaitTimeid-it-implicitConfirmid-it-revPassphraseid-it-keyPairParamRepid-it-keyPairParamReqid-it-subscriptionResponseid-it-subscriptionRequestid-it-unsupportedOIDsid-it-currentCRLid-it-caKeyUpdateInfoid-it-preferredSymmAlgid-it-encKeyPairTypesid-it-signKeyPairTypesid-it-caProtEncCertdvcsDVCSIPSec UseripsecUserIPSec TunnelipsecTunnelIPSec End SystemipsecEndSystemtextNoticesbgp-routerIdentifiersbgp-autonomousSysNumsbgp-ipAddrBlockaaControlsac-targetingac-auditEntityqcStatementsBiometric InfobiometricInfoid-mod-cmp2000id-mod-dvcsid-mod-ocspid-mod-timestamp-protocolid-mod-attribute-certid-mod-qualified-cert-93id-mod-qualified-cert-88id-mod-cmpid-mod-kea-profile-93id-mod-kea-profile-88id-mod-cmcid-mod-crmfid-pkix1-implicit-93id-pkix1-explicit-93id-pkix1-implicit-88id-pkix1-explicit-88id-cctid-qcsid-acaid-pdaid-onid-cmcid-algid-pkipid-itid-qtid-pkix-modmd4MD4id-smime-cti-ets-proofOfCreationid-smime-cti-ets-proofOfApprovalid-smime-cti-ets-proofOfSenderid-smime-cti-ets-proofOfDeliveryid-smime-cti-ets-proofOfReceiptid-smime-cti-ets-proofOfOriginid-smime-spq-ets-sqt-unoticeid-smime-spq-ets-sqt-uriid-smime-cd-ldapid-smime-alg-CMSRC2wrapid-smime-alg-CMS3DESwrapid-smime-alg-ESDHid-smime-alg-RC2wrapid-smime-alg-3DESwrapid-smime-alg-ESDHwithRC2id-smime-alg-ESDHwith3DESid-smime-aa-dvcs-dvcid-smime-aa-signatureTypeid-smime-aa-ets-archiveTimeStampid-smime-aa-ets-certCRLTimestampid-smime-aa-ets-escTimeStampid-smime-aa-ets-revocationValuesid-smime-aa-ets-certValuesid-smime-aa-ets-RevocationRefsid-smime-aa-ets-CertificateRefsid-smime-aa-ets-contentTimestampid-smime-aa-ets-otherSigCertid-smime-aa-ets-signerAttrid-smime-aa-ets-signerLocationid-smime-aa-ets-commitmentTypeid-smime-aa-ets-sigPolicyIdid-smime-aa-timeStampTokenid-smime-aa-smimeEncryptCertsid-smime-aa-signingCertificateid-smime-aa-encrypKeyPrefid-smime-aa-contentReferenceid-smime-aa-equivalentLabelsid-smime-aa-macValueid-smime-aa-contentIdentifierid-smime-aa-encapContentTypeid-smime-aa-msgSigDigestid-smime-aa-contentHintid-smime-aa-mlExpandHistoryid-smime-aa-securityLabelid-smime-aa-receiptRequestid-smime-ct-DVCSResponseDataid-smime-ct-DVCSRequestDataid-smime-ct-contentInfoid-smime-ct-TDTInfoid-smime-ct-TSTInfoid-smime-ct-publishCertid-smime-ct-authDataid-smime-ct-receiptid-smime-mod-ets-eSigPolicy-97id-smime-mod-ets-eSigPolicy-88id-smime-mod-ets-eSignature-97id-smime-mod-ets-eSignature-88id-smime-mod-msg-v3id-smime-mod-oidid-smime-mod-essid-smime-mod-cmsid-smime-ctiid-smime-spqid-smime-cdid-smime-algid-smime-aaid-smime-ctid-smime-modS/MIMESMIMEpkcs5pkcs1X9.57 CM ?X9cmX9.57X9-57ISO US Member BodyISO-USISO Member Bodymember-bodyisoISOOCSP SigningOCSPSigningCA IssuerscaIssuersOCSPAuthority Information AccessauthorityInfoAccessid-adid-pednQualifiernameExtension RequestextReqMicrosoft Extension RequestmsExtReqpbeWithSHA1AndDES-CBCPBE-SHA1-DESpbeWithMD5AndRC2-CBCPBE-MD5-RC2-64pbeWithMD2AndRC2-CBCPBE-MD2-RC2-64S/MIME CapabilitiesSMIME-CAPSrc2-64-cbcRC2-64-CBCPolicy Qualifier User Noticeid-qt-unoticePolicy Qualifier CPSid-qt-cpshmacWithSHA1PBMAC1PBES2x509CrlsdsiCertificatex509CertificatelocalKeyIDfriendlyNamesafeContentsBagsecretBagcrlBagcertBagpkcs8ShroudedKeyBagkeyBagpbeWithSHA1And40BitRC2-CBCPBE-SHA1-RC2-40pbeWithSHA1And128BitRC2-CBCPBE-SHA1-RC2-128pbeWithSHA1And2-KeyTripleDES-CBCPBE-SHA1-2DESpbeWithSHA1And3-KeyTripleDES-CBCPBE-SHA1-3DESpbeWithSHA1And40BitRC4PBE-SHA1-RC4-40pbeWithSHA1And128BitRC4PBE-SHA1-RC4-128Strong Extranet IDSXNetIDInvalidity DateinvalidityDateX509v3 CRL Reason CodeCRLReasonX509v3 Delta CRL IndicatordeltaCRLNetscape Server Gated CryptonsSGCMicrosoft Encrypted File SystemmsEFSMicrosoft Server Gated CryptomsSGCMicrosoft Trust List SigningmsCTLSignMicrosoft Commercial Code SigningmsCodeComMicrosoft Individual Code SigningmsCodeIndTime StampingtimeStampingE-mail ProtectionemailProtectionCode SigningcodeSigningTLS Web Client AuthenticationclientAuthTLS Web Server AuthenticationserverAuthid-kpPKIXX509v3 Extended Key UsageextendedKeyUsagezlib compressionZLIBrun length compressionRLErc5-ofbRC5-OFBrc5-cfbRC5-CFBrc5-ecbRC5-ECBrc5-cbcRC5-CBCripemd160WithRSARSA-RIPEMD160ripemd160RIPEMD160dsaEncryptionsha1WithRSARSA-SHA1-2md5-sha1MD5-SHA1dsaWithSHA1DSA-SHA1pbeWithMD5AndCast5CBCcast5-ofbCAST5-OFBcast5-cfbCAST5-CFBcast5-ecbCAST5-ECBcast5-cbcCAST5-CBCdescriptiontitleserialNumbermd5WithRSARSA-NP-MD5X509v3 CRL Distribution PointscrlDistributionPointsinitialssurnameSNgivenNameGNrc2-40-cbcRC2-40-CBCrc4-40RC4-40mdc2WithRSARSA-MDC2mdc2MDC2bf-ofbBF-OFBbf-cfbBF-CFBbf-ecbBF-ECBbf-cbcBF-CBCX509v3 Authority Key IdentifierauthorityKeyIdentifierX509v3 Certificate PoliciescertificatePoliciesX509v3 CRL NumbercrlNumberX509v3 Basic ConstraintsbasicConstraintsX509v3 Issuer Alternative NameissuerAltNameX509v3 Subject Alternative NamesubjectAltNameX509v3 Private Key Usage PeriodprivateKeyUsagePeriodX509v3 Key UsagekeyUsageX509v3 Subject Key IdentifiersubjectKeyIdentifierid-cedesx-cbcDESX-CBCNetscape Certificate SequencensCertSequenceNetscape CommentnsCommentNetscape SSL Server NamensSslServerNameNetscape CA Policy UrlnsCaPolicyUrlNetscape Renewal UrlnsRenewalUrlNetscape CA Revocation UrlnsCaRevocationUrlNetscape Revocation UrlnsRevocationUrlNetscape Base UrlnsBaseUrlNetscape Cert TypensCertTypedsaWithSHA1-oldDSA-SHA1-oldPBKDF2pbeWithSHA1AndRC2-CBCPBE-SHA1-RC2-64dsaEncryption-oldDSA-olddsaWithSHADSA-SHAsha1WithRSAEncryptionRSA-SHA1sha1SHA1des-ede3-ofbDES-EDE3-OFBdes-ede-ofbDES-EDE-OFBdes-ede3-cfbDES-EDE3-CFBdes-ede-cfbDES-EDE-CFBNetscape Data TypensDataTypeNetscape Certificate ExtensionnsCertExtNetscape Communications Corp.NetscapeextendedCertificateAttributesunstructuredAddresschallengePasswordcountersignaturesigningTimemessageDigestcontentTypeunstructuredNameemailAddresspkcs9idea-ofbIDEA-OFBdes-ofbDES-OFBdes-ede3-cbcDES-EDE3-CBCdes-ede-cbcDES-EDE-CBCshaWithRSAEncryptionRSA-SHAshaSHArc2-ofbRC2-OFBrc2-cfbRC2-CFBrc2-ecbRC2-ECBrc2-cbcRC2-CBCidea-ecbIDEA-ECBidea-cfbIDEA-CFBidea-cbcIDEA-CBCdes-ede3DES-EDE3des-edeDES-EDEdes-cbcDES-CBCdes-cfbDES-CFBdes-ecbDES-ECBdhKeyAgreementpkcs3pkcs7-encryptedDatapkcs7-digestDatapkcs7-signedAndEnvelopedDatapkcs7-envelopedDatapkcs7-signedDatapkcs7-datapkcs7organizationalUnitNameOUorganizationNameOstateOrProvinceNameSTlocalityNameLcountryNameCcommonNameCNX509directory services (X.500)X500pbeWithMD5AndDES-CBCPBE-MD5-DESpbeWithMD2AndDES-CBCPBE-MD2-DESmd5WithRSAEncryptionRSA-MD5md2WithRSAEncryptionRSA-MD2rsaEncryptionrc4RC4md5MD5md2MD2RSA Data Security, Inc. PKCSpkcsRSA Data Security, Inc.rsadsiundefinedUNDEF.\crypto\objects\obj_dat.c.%lu.\crypto\objects\obj_lib.cunknown nidOBJ_nid2snOBJ_nid2objOBJ_nid2lnOBJ_NAME_new_indexOBJ_dupOBJ_createOBJ_add_object.\crypto\evp\encode.cctx->length <= (int)sizeof(ctx->enc_data)n < (int)sizeof(ctx->enc_data).\crypto\evp\digest.cctx->digest->md_size <= EVP_MAX_MD_SIZEEVP part of OpenSSL 0.9.8l 5 Nov 2009.\crypto\evp\evp_enc.cbl <= (int)sizeof(ctx->buf)b <= sizeof ctx->bufb <= sizeof ctx->finalniv <= EVP_MAX_IV_LENGTH.\crypto\evp\evp_key.cnkey <= EVP_MAX_KEY_LENGTHname=, value=fips_mode.\crypto\evp\evp_cnf.calg_section@HF€ÀˆPˆ`H@HÀF€ÀˆPˆ`H-@H`F€ÀˆPˆ`H@HF€ÀˆPˆ`H@HG€ÀˆPˆ`H‘@H°G€ÀˆPˆ`H[ àI HHÀˆPˆ] àIÐHHÀˆPˆ^ àIpIHÀˆPˆ\ àIIHÀˆPˆ"@K`JØÀˆPˆ#@KÀJØÀˆPˆ.@KJØÀˆPˆ$@KJØÀˆPˆ+ NL€0O< NÐL€0O> NPL€0O  NàK€0O,àNL€0O=àNÐL€0O?àNPL€0O!àNàK€0O’àNM€0O“àNÐM€0OÀOðOaÀOðO£ÀRÐPô¥ÀR Pô¤ÀR`Pô¢ÀRQô§ÀRÐPô©ÀR Pô¨ÀR`Pô¦ÀRQô« ÀRÐPô­ ÀR Pô¬ ÀR`Pôª ÀRQôŠÀRðQô‹ÀRðQôŒ ÀRðQôÀRpRôŽÀRpRô ÀRpRô.\crypto\evp\e_aes.cP`T°TÀˆPˆ%JPVðTX WPX'KPV UX WPX(LPVÀUX WPX&IPV`UX WPX¦JPVðTX WPXbJPVðTX WPX.\crypto\evp\e_rc2.cl <= sizeof(iv)l ZÀX„ÀˆPˆn ZðX„ÀˆPˆo ZY„ÀˆPˆm Z0Y„ÀˆPˆ.\crypto\evp\enc_min.cEVP_CIPHER_CTX_iv_length(ctx) <= (int)sizeof(ctx->iv)ctx->cipher->block_size == 1 || ctx->cipher->block_size == 8 || ctx->cipher->block_size == 16ûûû0^@^P^H J˜Œ€^^ ^H J@`€^Ð^à^H J@`)*``_ _H J@d@A``Ð`P_H J@d£Ÿ€_ _°_H J@t œ _ _°_H J@t¡0ð_` `H J€Ü¢ž@`` `H J€ÜBB``Ð`P_P€tBqF@dtq``Ð`P_P€tBqF@duw``` `H J@d  ``Ð`P_à^P_˜@d.\crypto\evp\p_open.c.\crypto\evp\p_sign.c.\crypto\evp\p_verify.c.\crypto\evp\p_lib.c.\crypto\evp\p_enc.c.\crypto\evp\p_dec.cmessage digestbase64 encoding.\crypto\evp\bio_b64.cctx->buf_off+i < (int)sizeof(ctx->buf)cipher.\crypto\evp\bio_enc.cwrong public key typewrong final block lengthunsupported salt typeunsupported private key algorithmunsupported prfunsupported key sizeunsupported key derivation functionunsupported keylengthunsupported cipherunsuported number of roundsunknown pbe algorithmunknown optionseed key setup failedpublic key not rsapkcs8 unknown broken typeno verify function configuredno sign function configuredno dsa parametersno digest setno cipher setkeygen failureiv too largeinvalid key lengthinvalid fips modeinput not initializedinitialization errorfips mode not supportedexpecting a ec keyexpecting a ecdsa keyexpecting a dsa keyexpecting a dh keyexpecting an rsa keyevp pbe cipherinit errorerror setting fips modeerror loading sectionencode errordisabled for fipsdifferent key typesdecode errordata not multiple of block lengthctrl operation not implementedctrl not implementedcipher parameter errorcamellia key setup failedbn pubkey errorbn decode errorbad key lengthbad decryptbad block lengthasn1 libaes key setup failedRC5_CTRLRC2_MAGIC_TO_METHPKCS8_set_brokenPKCS5_v2_PBE_keyivgenPKCS5_PBE_keyivgenEVP_VerifyFinalEVP_SignFinalEVP_RIJNDAELEVP_PKEY_newEVP_PKEY_get1_RSAEVP_PKEY_get1_EC_KEYEVP_PKEY_GET1_ECDSAEVP_PKEY_get1_DSAEVP_PKEY_get1_DHEVP_PKEY_encryptEVP_PKEY_decryptEVP_PKEY_copy_parametersEVP_PKEY2PKCS8_brokenEVP_PKCS82PKEYEVP_PBE_CipherInitEVP_PBE_alg_addEVP_OpenInitEVP_MD_CTX_copy_exEVP_EncryptFinal_exEVP_DigestInit_exEVP_DigestInitEVP_DecryptFinal_exEVP_CIPHER_CTX_set_key_lengthEVP_CIPHER_CTX_ctrlEVP_CipherInit_exEVP_CipherInitECKEY_PKEY2PKCS8ECDSA_PKEY2PKCS8DSA_PKEY2PKCS8DSAPKEY2PKCS8DO_EVP_MD_ENGINE_FULLDO_EVP_MD_ENGINEDO_EVP_ENC_ENGINE_FULLDO_EVP_ENC_ENGINED2I_PKEYCAMELLIA_INIT_KEYALG_MODULE_INITAES_INIT_KEYû€‚aes256AES256aes192AES192aes128AES128cast-cbcCAST-cbccastCASTblowfishbfBFrc2RC2ideaIDEAdes3DES3desDESdesxDESXrmd160ripemddss1DSS1ssl3-sha1ssl3-md5ssl2-md5.\crypto\evp\evp_lib.cl <= sizeof(c->iv)j <= sizeof(c->iv)reliable.\crypto\evp\bio_ok.cThe quick brown fox jumped over the lazy dog's back.TYPE=.\crypto\evp\evp_pkey.c.\crypto\evp\evp_pbe.cEVP_CIPHER_iv_length(cipher) <= 16EVP_CIPHER_key_length(cipher) <= (int)sizeof(md_tmp).\crypto\evp\p5_crpt.ckeylen <= sizeof key.\crypto\evp\p5_crpt2.c.\crypto\asn1\a_object.c.\crypto\asn1\a_bitstr.c%02d%02d%02d%02d%02d%02dZ.\crypto\asn1\a_utctm.c%04d%02d%02d%02d%02d%02dZ.\crypto\asn1\a_gentm.cASN1_TIMEÀà® .\crypto\asn1\a_time.c2019.\crypto\asn1\a_int.c.\crypto\asn1\a_set.c.\crypto\asn1\a_dup.c.\crypto\asn1\a_d2i_fp.c.\crypto\asn1\a_i2d_fp.c.\crypto\asn1\a_enum.c.\crypto\asn1\a_sign.c.\crypto\asn1\a_digest.c.\crypto\asn1\a_verify.c'()+,-./:=?maxsize=minsize=%ld.\crypto\asn1\a_mbstr.c0123456789ABCDEFÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ\%02X\U%04lX\W%08lX.\crypto\asn1\a_strex.c#"= = + ; +,, X509_ALGORSalgorithmsX509_ALGORparameterèl ðƒü° ‰± ð° ä° ûÿÿÿÿL± ذ X509_VALnotAfternotBefore”± @ˆ± @ ± |± X509_PUBKEYpublic_keyalgorÐýü± ûð± p‚² ²  ä± .\crypto\asn1\x_pubkey.cX509_SIGdigestü± ûˆ² ð‚² |² X509_REQsignaturesig_algreq_infoX509_REQ_INFOattributespubkeysubjectà ü¦ p$³ à³ ðý‹³ @ H³ 0³ ³  ô²  ì² ûಠp‚̳ ´³ Ô² objectX509_ATTRIBUTEvalue.singlevalue.setL´ ‰<´ ‰X´  ,´ $´ ðƒ0 œ´  ,´ BIGNUMP°à´ P°à´ ZLONGLONGl°ÿÿÿ(µ l° µ .\crypto\asn1\x_long.cX509_NAMEX509_NAME_INTERNALNameX509_NAME_ENTRIESRDNSX509_NAME_ENTRYvalue$´ ðƒÔµ ‰ܵ ĵ ¼µ 0ÿÿÿÿ ¶ ¨µ  µ ÐÿÿÿÿP¶ Œµ €P€¶ €µ .\crypto\asn1\x_name.ccert_infoX509_CINFextensionssubjectUIDissuerUIDkeyvalidityissuer‘ü¦ p † pಠû · à · Pý$³ à· ðý‰ü¶ p‚‰ ð¶ p‚•$ä¶ ¤ ·  (ض P̶ Ðì² ûಠp‚¸ ¸ \ X509_CERT_PAIRreverseforwardX509_CERT_AUXotherkeyidaliasrejecttrustĸ ðƒ¼¸ ðƒ´¸ „ ¬¸ ð‚¤¸ ûи ”¸ ‘Œ¸  ‘„¸  P¹ t¸ X509_CRLcrlX509_CRL_INFOrevokednextUpdatelastUpdateX509_REVOKEDrevocationDate † pä¹ @Âä¶ ¤ø¹ Ô¹  ü¦ pì² û· à ȹ @¼¹ @´¹ €•ä¶ ¤hº Pº (¤¹   ¹ ì² ûಠp‚(» » ”¹ .\crypto\asn1\x_crl.c.\crypto\asn1\x_info.cNETSCAPE_SPKIsig_algorspkacNETSCAPE_SPKACchallenge³ ðýä» €…ð» Ô» Ì» À» ûಠp‚4¼  °» NETSCAPE_CERT_SEQUENCEcerts # ðƒ•¤¼  ļ ¬¼ Œ¼ .\crypto\asn1\d2i_pu.c.\crypto\asn1\d2i_pr.c.\crypto\asn1\i2d_pu.c.\crypto\asn1\i2d_pr.cunable to print attribute .\crypto\asn1\t_req.c%16s: %s critical%12s%8sRequested Extensions: %12sa0:00 %8sAttributes: %12sUnknown Public Key: %12sEC Public Key: %12sDSA Public Key: %12sRSA Public Key: (%d bit) %12sUnable to load Public Key %12sPublic Key Algorithm: Subject Public Key Info: Subject:%c%8sVersion: %s%lu (%s0x%lx) Data: Certificate Request: DecNovOctSepAugJulJunMayAprMarFebJan Public key OCSP hash: %02X.\crypto\asn1\t_x509.c Subject OCSP hash: %02x%s Signature Algorithm: Bad time value%s %2d %02d:%02d:%02d %d%s GMTX509v3 extensions%12sEC Public Key: Not After : Not Before: Validity Issuer:%c%8sSignature Algorithm: %12s%s (Negative) %s%lu (%s0x%lx) Serial Number:%8sVersion: %lu (0x%lx) Certificate: %s%02X%*sKey Id: %*sAlias: %s %*sNo Rejected Uses. %*sRejected Uses: %*s%*sNo Trusted Uses. %*sTrusted Uses: %*sCRL entry extensions Revocation Date: Serial Number: No Revoked Certificates. Revoked Certificates: CRL extensions %8sNext Update: %8sLast Update: %8sIssuer: %s %8sSignature Algorithm: %s NONE%8sVersion %lu (0x%lx) Certificate Revocation List (CRL): .\crypto\asn1\t_crl.cGenerator (hybrid):Generator (uncompressed):Generator (compressed):%s%s%s %s%lu (%s0x%lx) %s 0 recommended-private-length: %d bits generator:prime:Diffie-Hellman-Parameters: (%d bit) .\crypto\asn1\t_pkey.cg:q:p:DSA-Parameters: (%d bit) coefficient:exponent2:exponent1:prime2:prime1:privateExponent:publicExponent:Exponent:modulus:Modulus (%d bit):Private-Key: (%d bit) G: Q: P: pub: priv:Seed:Cofactor: Order: B: A: Prime:Polynomial:Basis Type: %s Field Type: %s ASN1 OID: %sECDSA-Parameters: (%d bit) Signature Algorithm: %s Challenge String: %s Unknown Public Key: EC Public Key: DSA Public Key: RSA Public Key: (%d bit) Unable to load public key Public Key Algorithm: %s UNKNOWNNetscape SPKI: %*s.\crypto\asn1\tasn_new.c.\crypto\asn1\tasn_enc.c @€ @€.\crypto\asn1\tasn_dec.cType=Field=, Type=.\crypto\asn1\tasn_utl.cASN1_OCTET_STRING_NDEFASN1_FBOOLEANASN1_TBOOLEANASN1_BOOLEANDIRECTORYSTRINGDISPLAYTEXTASN1_PRINTABLEASN1_SEQUENCEASN1_ANYASN1_BMPSTRINGASN1_UNIVERSALSTRINGASN1_VISIBLESTRINGASN1_GENERALIZEDTIMEASN1_UTCTIMEASN1_GENERALSTRINGASN1_IA5STRINGASN1_T61STRINGASN1_PRINTABLESTRINGASN1_UTF8STRINGASN1_OBJECTASN1_NULLASN1_OCTET_STRINGASN1_BIT_STRINGASN1_ENUMERATEDASN1_INTEGERÜÈ  ÌÈ ¼È ¨È œÈ È  €È hÈ XÈ HÈ 4È $È  È øÇ àÇ ÐÇ üÿÿÿÄÇ ´Ç =¤Ç P(˜Ç )ˆÇ ÿÿÿÿxÇ hÇ XÇ @Ç \ 00.\crypto\asn1\f_int.c.\crypto\asn1\f_string.cNETSCAPE_PKEYprivate_keyNETSCAPE_ENCRYPTED_PKEYenckeyos Ì ð‚Ì `<Ì $Ì Ì ü¦ À ü± ûôË ð‚€Ì  äË SGCKEYSALTEnter Private Key password:private-key.\crypto\asn1\n_pkey.c.\crypto\asn1\f_enum.c.\crypto\asn1\a_hdr.c.\crypto\asn1\x_pkey.c.\crypto\asn1\a_bool.cX509_EXTENSIONSExtensionX509_EXTENSION$´ ðƒ¬½ ‹Ôµ ð‚°Í   Í ”Í ¤ÿÿÿÿÎ „Í .\crypto\asn1\asn_mime.csha-384sha-512sha-256Content-Transfer-Encoding: base64%s%s name="%s"%s smime-type=%s;Content-Type: %smime; filename="%s"%ssmime.p7zcompressed-datacerts-onlysigned-datasigned-receiptenveloped-data%s------%s--%s%s filename="smime.p7s"%s%sContent-Disposition: attachment;Content-Transfer-Encoding: base64%s name="smime.p7s"%sContent-Type: %ssignature;%s------%s%s------%s%sThis is an S/MIME signed message%s%s"; boundary="----%s"%s%s micalg=" protocol="%ssignature";Content-Type: multipart/signed;MIME-Version: 1.0%s application/pkcs7-application/x-pkcs7-smime.p7m--Content-Type: text/plain application/pkcs7-mimeapplication/x-pkcs7-mimetype: application/pkcs7-signatureapplication/x-pkcs7-signatureboundarymultipart/signedcontent-typetext/plainFORMATFORMBITWRAPSETWRAPSEQWRAPOCTWRAPIMPLICITIMPEXPLICITEXPSETSEQSEQUENCEGENSTRGeneralStringTELETEXSTRINGT61STRINGT61PRINTABLEPRINTABLESTRINGVISIBLEVISIBLESTRINGBMPSTRINGBMPUTF8StringUTF8IA5STRINGIA5UNIVUNIVERSALSTRINGBITSTRINGBITSTROCTETSTRINGOCTGENTIMEGENERALIZEDTIMEUTCUTCTIMEOBJECTOIDENUMERATEDENUMINTEGERINTBOOLEANBOOLChar=.\crypto\asn1\asn1_gen.cBITLISTHEXASCIItag=string=GENERALSTRINGGRAPHICSTRINGVIDEOTEXSTRINGNUMERICSTRINGUTF8STRINGREALEXTERNALOBJECT DESCRIPTOROCTET STRINGBIT STRINGEOC%-18s%2d %-15s(unknown)appl [ %d ]cont [ %d ]priv [ %d ] prim: cons: length is greater than %ld Error in encoding BAD ENUMERATEDBAD INTEGER[HEX DUMP]::%dBad boolean :BAD OBJECTd=%-2d hl=%ld l=inf d=%-2d hl=%ld l=%4ld %5ld:ASN.1 part of OpenSSL 0.9.8l 5 Nov 2009.\crypto\asn1\asn1_lib.caddress= offset=wrong typewrong tagunsupported typeunsupported public key typeunsupported encryption algorithmunsupported any defined by typeunkown formatunknown tagunknown public key typeunknown object typeunknown message digest algorithmunknown formatuniversalstring is wrong lengthunexpected eocunable to decode rsa private keyunable to decode rsa keytype not constructedtoo longtime not ascii formattag value too highstring too shortstring too longstreaming not supportedsig invalid mime typeshort linesequence or set needs configsequence not constructedsequence length mismatchsecond number too largeprivate key header missingodd number of charsobject not ascii formatnull is wrong lengthno sig content typeno multipart boundaryno multipart body failureno matching choice typeno content typenot enough datanot ascii formatnon hex charactersnested asn1 stringmstring wrong tagmstring not universalmissing valuemissing second numbermissing eocmime sig parse errormime parse errormime no content typelist errorlength errorinvalid utf8stringinvalid universalstring lengthinvalid time formatinvalid separatorinvalid numberinvalid modifierinvalid mime typeinvalid digitinvalid bmpstring lengthinteger too large for longinteger not ascii formatillegal time valueillegal tagged anyillegal options on item templateillegal optional anyillegal objectillegal null valueillegal nullillegal nested taggingillegal integerillegal implicit tagillegal hexillegal formatillegal charactersillegal booleanillegal bitstring formatheader too longfirst num too largefield missingexplicit tag not constructedexplicit length mismatchexpecting a timeexpecting a booleanexpecting an objectexpecting an integererror setting cipher paramserror parsing set elementerror getting timedepth exceededdecoding errordata is wrongcipher has no object identifierboolean is wrong lengthbn libbmpstring is wrong lengthbad tagbad password readbad object headerbad classaux errorasn1 sig parse errorasn1 parse erroradding objectX509_PKEY_newX509_NEWX509_NAME_EX_NEWX509_NAME_EX_D2IX509_NAME_ENCODEX509_INFO_newX509_CRL_add0_revokedX509_CINF_NEWSMIME_textSMIME_read_ASN1PKCS5_pbe_setPKCS5_pbe2_setPARSE_TAGGINGOID_MODULE_INITLONG_C2Ii2d_RSA_PUBKEYi2d_RSA_NETi2d_PublicKeyi2d_PrivateKeyi2d_EC_PUBKEYi2d_DSA_PUBKEYI2D_ASN1_TIMEi2d_ASN1_SETd2i_X509_PKEYD2I_X509_CINFD2I_X509D2I_RSA_NET_2d2i_RSA_NETd2i_PublicKeyd2i_PrivateKeyD2I_NETSCAPE_RSA_2d2i_Netscape_RSAD2I_ASN1_UTCTIMEd2i_ASN1_UINTEGERd2i_ASN1_type_bytesd2i_ASN1_SETd2i_ASN1_OBJECTD2I_ASN1_INTEGERd2i_ASN1_HEADERD2I_ASN1_GENERALIZEDTIMEd2i_ASN1_bytesd2i_ASN1_BOOLEAND2I_ASN1_BIT_STRINGCOLLECT_DATAc2i_ASN1_OBJECTc2i_ASN1_INTEGERc2i_ASN1_BIT_STRINGBN_to_ASN1_INTEGERBN_to_ASN1_ENUMERATEDBITSTR_CBBIO_NEW_NDEFB64_WRITE_ASN1B64_READ_ASN1ASN1_verifyASN1_UTCTIME_setASN1_unpack_stringASN1_TYPE_get_octetstringASN1_TYPE_get_int_octetstringASN1_TIME_setASN1_TEMPLATE_NOEXP_D2IASN1_TEMPLATE_NEWASN1_TEMPLATE_EX_D2IASN1_STRING_type_newASN1_STRING_TABLE_addASN1_STRING_setASN1_STR2TYPEASN1_signASN1_seq_unpackASN1_seq_packASN1_PKCS5_PBE_SETASN1_PCTX_NEWASN1_pack_stringASN1_OUTPUT_DATAASN1_OBJECT_newASN1_mbstring_ncopyASN1_item_verifyASN1_item_unpackASN1_item_signASN1_item_packASN1_item_i2d_fpASN1_item_i2d_bioASN1_ITEM_EX_D2IASN1_ITEM_EX_COMBINE_NEWASN1_item_dupASN1_item_d2i_fpASN1_INTEGER_to_BNASN1_INTEGER_setASN1_i2d_fpASN1_i2d_bioASN1_HEADER_newASN1_get_objectASN1_generate_v3ASN1_GENERALIZEDTIME_setASN1_FIND_ENDASN1_EX_C2IASN1_ENUMERATED_to_BNASN1_ENUMERATED_setASN1_dupASN1_DO_ADBASN1_digestASN1_D2I_READ_BIOASN1_d2i_fpASN1_D2I_EX_PRIMITIVEASN1_COLLECTASN1_COLLATE_PRIMITIVEASN1_CHECK_TLENASN1_CBASN1_BIT_STRING_set_bitAPPEND_EXPa2i_ASN1_STRINGa2i_ASN1_INTEGERa2i_ASN1_ENUMERATEDa2d_ASN1_OBJECT.\crypto\asn1\a_bytes.cdefaultutf8onlypkixnombstrMASK:.\crypto\asn1\a_strnid.c.\crypto\asn1\evp_asn1.c.\crypto\asn1\asn_pack.cPBEPARAMitersalt ç ð‚ç p(ç  ç .\crypto\asn1\p5_pbe.cPBKDF2PARAMprfkeylengthPBE2PARAMencryptionkeyfunc¸ç û¬ç ûÀç  ç  è „ç  ç ‰ç p”ç p ç û.\crypto\asn1\p5_pbev2.cPKCS8_PRIV_KEY_INFOpkeypkeyalg°ëü¦ p¨è û  è ‰‹³ @ Èè °è Œè .\crypto\asn1\asn_moid.coid_section.\crypto\pem\pem_sign.c.\crypto\pem\pem_seal.cEC PRIVATE KEYDSA PRIVATE KEYRSA PRIVATE KEYX509 CRLTRUSTED CERTIFICATEX509 CERTIFICATECERTIFICATE.\crypto\pem\pem_info.cstrlen(objstr)+23+2*enc->iv_len+13 <= sizeof bufPEM part of OpenSSL 0.9.8l 5 Nov 20090123456789ABCDEF.\crypto\pem\pem_lib.cphrase is too short, needs to be at least %d chars Enter PEM pass phrase:Proc-Type: 4,BAD-TYPEMIC-ONLYMIC-CLEARENCRYPTEDDEK-Info: PKCS #7 SIGNED DATAPKCS7CERTIFICATE REQUESTNEW CERTIFICATE REQUESTPRIVATE KEYANY PRIVATE KEYENCRYPTED PRIVATE KEY-----END ----- -----BEGIN enc->iv_len <= (int)sizeof(iv)Proc-Type: Expecting: RSA PUBLIC KEYPUBLIC KEYDSA PARAMETERSEC PARAMETERSDH PARAMETERSunsupported encryptionshort headerread keypublic key no rsaproblems getting passwordno start linenot proc typenot encryptednot dek infoerror converting private keybad iv charsbad end linebad base64 decodePEM_X509_INFO_write_bioPEM_X509_INFO_read_bioPEM_X509_INFO_readPEM_write_bioPEM_writePEM_SignFinalPEM_SealInitPEM_SealFinalPEM_READ_PRIVATEKEYPEM_READ_BIO_PRIVATEKEYPEM_read_bioPEM_readPEM_PK8PKEYPEM_get_EVP_CIPHER_INFOPEM_F_PEM_WRITE_PKCS8PRIVATEKEYPEM_do_headerPEM_def_callbackPEM_ASN1_write_bioPEM_ASN1_writePEM_ASN1_read_bioPEM_ASN1_readLOAD_IVDO_PK8PKEY_FPDO_PK8PKEYd2i_PKCS8PrivateKey_fpd2i_PKCS8PrivateKey_bioCERTIFICATE PAIR.\crypto\pem\pem_oth.c.\crypto\pem\pem_pk8.c.\crypto\pem\pem_pkey.cc:/MailRoot/bin/ssl/privatec:/MailRoot/bin/sslc:/MailRoot/bin/ssl/certsc:/MailRoot/bin/ssl/cert.pemSSL_CERT_DIRSSL_CERT_FILE.\crypto\x509\x509_r2x.c.\crypto\x509\x509_cmp.c.\crypto\x509\x509_obj.cNO X509_NAME.\crypto\x509\x509_req.c.\crypto\x509\x509spki.cX.509 part of OpenSSL 0.9.8l 5 Nov 2009.\crypto\x509\x509_vfy.cOPENSSL_ALLOW_PROXY_CERTSwrong lookup typeunsupported algorithmunknown trust idunknown purpose idunknown key typeunable to get certs public keyunable to find parameters in chainshould retryno cert set for us to verifyloading defaultsloading cert dirkey values mismatchkey type mismatchinvalid trustinvalid field nameinvalid directoryerr asn1 libcert already in hash tablecant check dh keybase64 decode errorbad x509 filetypeX509_verify_certX509_TRUST_setX509_TRUST_addX509_to_X509_REQX509_STORE_CTX_purpose_inheritX509_STORE_CTX_newX509_STORE_CTX_initX509_STORE_CTX_get1_issuerX509_STORE_add_crlX509_STORE_add_certX509_REQ_to_X509X509_REQ_print_fpX509_REQ_print_exX509_REQ_check_private_keyX509_PUBKEY_setX509_PUBKEY_getX509_print_ex_fpX509_NAME_printX509_NAME_onelineX509_NAME_ENTRY_set_objectX509_NAME_ENTRY_create_by_txtX509_NAME_ENTRY_create_by_NIDX509_NAME_add_entryX509_load_crl_fileX509_load_cert_fileX509_load_cert_crl_fileX509_get_pubkey_parametersX509_EXTENSION_create_by_OBJX509_EXTENSION_create_by_NIDX509_CRL_print_fpX509_check_private_keyX509_ATTRIBUTE_set1_dataX509_ATTRIBUTE_get0_dataX509_ATTRIBUTE_create_by_txtX509_ATTRIBUTE_create_by_OBJX509_ATTRIBUTE_create_by_NIDX509v3_add_extX509at_add1_attrNETSCAPE_SPKI_b64_encodeNETSCAPE_SPKI_b64_decodeGET_CERT_BY_SUBJECTDIR_CTRLCHECK_POLICYBY_FILE_CTRLADD_CERT_DIR.\crypto\x509\x509name.c.\crypto\x509\x509_v3.c.\crypto\x509\x509_att.c.\crypto\x509\x509_lu.cerror number %ldRFC 3779 resource not subset of parent's resourcesno explicit policyinvalid or inconsistent certificate policy extensioninvalid or inconsistent certificate extensionunhandled critical CRL extensionkey usage does not include digital signaturekey usage does not include CRL signingunhandled critical extensionunable to get CRL issuer certificatekey usage does not include certificate signingauthority and issuer serial number mismatchauthority and subject key identifier mismatchsubject issuer mismatchapplication verification failurecertificate rejectedcertificate not trustedunsupported certificate purposeproxy certificates not allowed, please set the appropriate flagproxy path length constraint exceededpath length constraint exceededinvalid non-CA certificate (has CA markings)invalid CA certificatecertificate revokedcertificate chain too longunable to verify the first certificateunable to get local issuer certificateself signed certificate in certificate chainself signed certificateout of memoryformat error in CRL's nextUpdate fieldformat error in CRL's lastUpdate fieldformat error in certificate's notAfter fieldformat error in certificate's notBefore fieldCRL has expiredcertificate has expiredCRL is not yet validcertificate is not yet validCRL signature failurecertificate signature failureunable to decode issuer public keyunable to decrypt CRL's signatureunable to decrypt certificate's signatureunable to get certificate CRLunable to get issuer certificateokOCSP requestOCSP responderObject SignerS/MIME emailSSL ServerSSL Clientcompatible.\crypto\x509\x509_trs.cLoad file into cache.\crypto\x509\by_file.cLoad certs from files in a directory.\crypto\x509\by_dir.c%s%c%08lx.%s%dssl_serverssl_clientsmime_signŒæ d˜Ž ÿÿÿÿ¤þ ÿÿÿÿ˜þ ÿÿÿÿŒþ ÿÿÿÿ.\crypto\x509\x509_vpm.cBASIC_CONSTRAINTSpathlencaW€©ª@ª°ÿ 0‹¨ÿ pìÿ ”ÿ CAsection:,name:,value:.\crypto\x509v3\v3_bcons.cdecipherOnlyDecipher OnlyencipherOnlyEncipher OnlycRLSignCRL SignkeyCertSignCertificate SignkeyAgreementKey AgreementdataEnciphermentData EnciphermentkeyEnciphermentKey EnciphermentnonRepudiationNon RepudiationdigitalSignatureDigital SignatureobjCAObject Signing CAemailCAS/MIME CAsslCASSL CAreservedUnusedobjsignObject SigningemailserverclientGp‚ «ð«ÁSp‚ «ð«€Á.\crypto\x509v3\v3_bitst.c.\crypto\x509v3\v3_conf.ccritical,ASN1:DER:,section=value=EXTENDED_KEY_USAGE~P¸иP¹pP¸иP¹ð ðƒÿÿÿÿt ð .\crypto\x509v3\v3_extku.cH€… ººI€… ººJ€… ººK€… ººL€… ººM€… ººN€… ººÿÿÿÿ.\crypto\x509v3\v3_ia5.c.\crypto\x509v3\v3_lib.c%s:%s %*s%*s%*s%s%*s%s: 0123456789ABCDEF.\crypto\x509v3\v3_utl.cFALSETRUEnoNONfalseyesYESyYtrueuser too longunsupported optionunknown extension nameunknown extensionunknown bit string argumentunable to get issuer keyidunable to get issuer detailssection not foundpolicy when proxy language requires no policypolicy syntax not currently supportedpolicy path length alreadty definedpolicy path lengthpolicy language alreadty definedothername erroroperation not definedodd number of digitsno subject detailsno public keyno proxy cert policy language definedno policy identifierno issuer detailsno issuer certificateno config databaseneed organization and numbersissuer decode errorinvalid syntaxinvalid sectioninvalid safiinvalid purposeinvalid proxy policy settinginvalid policy identifierinvalid optioninvalid object identifierinvalid numbersinvalid null valueinvalid null nameinvalid null argumentinvalid nameinvalid ipaddressinvalid inheritanceinvalid extension stringinvalid boolean stringinvalid asrangeinvalid asnumberincorrect policy syntax tagillegal hex digitillegal empty extensionextension value errorextension setting not supportedextension not foundextension name errorextension existsexpected a section nameerror in extensionerror creating extensionerror converting zoneduplicate zone iddirname errorbn to asn1 integer errorbn dec2bn errorbad objectbad ip addressX509_PURPOSE_setX509_PURPOSE_addX509V3_parse_listX509V3_get_value_boolX509V3_get_stringX509V3_get_sectionX509V3_EXT_nconfX509V3_EXT_i2dX509V3_EXT_confX509V3_EXT_add_aliasX509V3_EXT_addX509V3_add_valueX509V3_add1_i2dV3_GENERIC_EXTENSIONV3_ADDR_VALIDATE_PATH_INTERNALV2I_SUBJECT_ALTV2I_POLICY_MAPPINGSV2I_POLICY_CONSTRAINTSV2I_NAME_CONSTRAINTSV2I_ISSUER_ALTV2I_IPADDRBLOCKSv2i_GENERAL_NAME_exv2i_GENERAL_NAMESV2I_EXTENDED_KEY_USAGEV2I_CRLDV2I_BASIC_CONSTRAINTSV2I_AUTHORITY_KEYIDV2I_AUTHORITY_INFO_ACCESSv2i_ASN1_BIT_STRINGV2I_ASIDENTIFIERSSXNET_get_id_ulongSXNET_get_id_ascSXNET_add_id_ulongSXNET_add_id_INTEGERSXNET_add_id_ascstring_to_hexS2I_SKEY_IDS2I_ASN1_SKEY_IDs2i_ASN1_OCTET_STRINGs2i_ASN1_INTEGERS2I_ASN1_IA5STRINGR2I_PCIR2I_CERTPOLPROCESS_PCI_VALUEPOLICY_SECTIONNREF_NOSNOTICE_SECTIONI2V_AUTHORITY_INFO_ACCESSi2s_ASN1_INTEGERI2S_ASN1_IA5STRINGi2s_ASN1_ENUMERATEDhex_to_stringDO_I2V_NAME_CONSTRAINTSDO_EXT_NCONFDO_EXT_I2DDO_EXT_CONFDO_DIRNAMECOPY_ISSUERCOPY_EMAILASIDENTIFIERCHOICE_IS_CANONICALASIDENTIFIERCHOICE_CANONIZEGENERAL_NAMESGeneralNamesGENERAL_NAMEd.registeredIDd.iPAddressd.uniformResourceIdentifierd.ediPartyNamed.directoryNamed.x400Addressd.dNSNamed.rfc822Named.otherNameEDIPARTYNAMEpartyNamenameAssignerOTHERNAMEtype_id  ðƒÔµ ‰¨ ” ‰„ Љx Šì h ˆ\ ÙˆL €…ˆ@ €…ˆ0 ‰  àˆ €Ùˆô €…ˆè ð‚ˆØ ðƒ0  È ¸ Úÿÿÿÿ ¨ U€Ú°âÐæV€Ú°â°åRegistered IDIP Address%XDirNameURIDNSEdiPartyNameX400NameothernameIP Address::%XIP Address:%d.%d.%d.%dDirName: URI:%sDNS:%semail:%sEdiPartyName:X400Name:othername:.\crypto\x509v3\v3_alt.csection=otherNamedirNameIPRIDcopymoveRð‚àèpé.\crypto\x509v3\v3_skey.chashZàêpëserial.\crypto\x509v3\v3_akey.calwaysPKEY_USAGE_PERIODTî± ‡‰ˆ± ‡ Ð Not After: Not Before: XpÐÆŒpÐÆìpÐÆïremoveFromCRLRemove From CRLcertificateHoldCertificate HoldcessationOfOperationCessation Of OperationsupersededSupersededaffiliationChangedAffiliation ChangedCACompromiseCA CompromisekeyCompromiseKey CompromiseunspecifiedUnspecifiedð°ï°ÆSXNETidsSXNETIDuserzone€ðõñ„ p| ð‚Ä t ü¦ pp ð h  %*sZone: %s, User: %*sVersion: %ld (0x%lX).\crypto\x509v3\v3_sxnet.cNOTICEREFnoticenosorganizationUSERNOTICEexptextnoticerefPOLICYQUALINFOpqualidd.usernoticed.cpsurid.otherPOLICYINFOqualifierspolicyidCERTIFICATEPOLICIESY°õ @ 0öÿÿÿÿŒ @ 4 ðƒ( Àö¼   ‰¤ €…¥ø @÷  ð ðƒÿÿÿÿà °ö` à Ô À÷Ì Š¤ À ° Ф pè ˜ .\crypto\x509v3\v3_cpols.c%*sExplicit Text: %s %*sNumber%s: %*sOrganization: %s noticeNumbersexplicitText%*sCPS: %s %*sUser Notice: %*sUnknown Qualifier: %*sNo Qualifiers %*s%s Non CriticalCritical%*sPolicy: userNoticeCPSpolicyIdentifieria5orgCRL_DIST_POINTSCRLDistributionPointsDIST_POINTCRLissuerreasonsdistpointDIST_POINT_NAMEname.relativenamename.fullnamegp°ðŒÈ ÚŠ´ 0 ¤ ‘˜ p‰ p‚„ ÚT  x ` ðÿÿÿÿ¬ P RelativeName.\crypto\x509v3\v3_crld.cocsphelperOCSP helperanyAny PurposecrlsignCRL signingsmimeencryptS/MIME encryptionsmimesignS/MIME signingnssslserverNetscape SSL serversslserverSSL serversslclientSSL client.\crypto\x509v3\v3_purp.cAUTHORITY_INFO_ACCESSACCESS_DESCRIPTIONlocationmethod±€Ž€8 ðƒ, Ú°  ¸ €ÿÿÿÿô   - .\crypto\x509v3\v3_info.co0.r‡އ®ðƒ@n€PÐ`qpƒ ûs°.°%*scrlTime: %*scrlNum: %*scrlUrl: .\crypto\x509v3\v3_ocsp.c %*s%*sIssuer: AUTHORITY_KEYID‰¬¸ ð‚· Ú‰¤ p4#  $# POLICY_MAPPINGSPOLICY_MAPPINGsubjectDomainPolicyissuerDomainPolicyë `À# ðƒ¬# ðƒ $ œ# Œ# ÿÿÿÿP$ Œ# .\crypto\x509v3\v3_pmaps.cPOLICY_CONSTRAINTSinhibitPolicyMappingrequireExplicitPolicy‘°ð0 ‰È$ p‰°$ p% œ$ Inhibit Policy MappingRequire Explicit Policy.\crypto\x509v3\v3_pcons.cNAME_CONSTRAINTSexcludedSubtreespermittedSubtreesGENERAL_SUBTREEmaximumminimumšÐ!@"p% # Ú‰ü% p‰ô% p<&  ä% Ð% À!¼% À!”& ¨% .\crypto\x509v3\v3_ncons.cexcludedpermitted%d.%d.%d.%d/%d.%d.%d.%dIP:ExcludedPermittedPROXY_CERT_INFO_EXTENSIONproxyPolicypcPathLengthConstraintPROXY_POLICYpolicypolicyLanguage˜' ðƒ' ð‚¨' €' h' p\' °%ì' @' —0&°&,%*sPolicy Text: %s %*sPolicy Language: infinite%*sPath Length Constraint: text:file:hex:.\crypto\x509v3\v3_pci.clanguage.\crypto\x509v3\pcy_cache.c.\crypto\x509v3\pcy_node.c.\crypto\x509v3\pcy_data.c.\crypto\x509v3\pcy_map.c.\crypto\x509v3\pcy_tree.cvariable has no valueunknown module nameunable to create new sectionno valueno sectionno conf or environment variableno confno close bracemodule initialization errormissing init functionmissing finish functionmissing equal signmissing close square bracketerror loading dsoSTR_COPYNCONF_newNCONF_load_fpNCONF_load_bioNCONF_loadNCONF_get_stringNCONF_get_sectionNCONF_get_number_eNCONF_get_numberNCONF_dump_fpNCONF_dump_bioMODULE_RUNMODULE_LOAD_DSOMODULE_INITDEF_LOAD_BIODEF_LOADCONF_modules_loadCONF_load_fpCONF_load_bioCONF_loadCONF_dump_fpCONF part of OpenSSL 0.9.8l 5 Nov 2009.\crypto\conf\conf_lib.cgroup= name=ENV.\crypto\conf\conf_api.cWIN32OpenSSL defaultCONF_def part of OpenSSL 0.9.8l 5 Nov 2009.\crypto\conf\conf_def.c[[%s]] [%s] %s=%s line .\crypto\conf\conf_mod.copenssl.cnfOPENSSL_CONFmodule=, path=OPENSSL_finishOPENSSL_init, retcode=%-8dopenssl_confAuto configuration failed TXT_DB part of OpenSSL 0.9.8l 5 Nov 2009OPENSSL_malloc failure wrong number of fields on line %ld (looking for field %d, got %d, '%s' left) failure in sk_push .\crypto\txt_db\txt_db.cPKCS7_ATTR_VERIFYPKCS7_ATTR_SIGNPKCS7_ATTRIBUTESPKCS7_DIGESTmdPKCS7_ENCRYPTPKCS7_SIGN_ENVELOPEPKCS7_ENC_CONTENTcontent_typePKCS7_RECIP_INFOenc_keykey_enc_algorPKCS7_ENVELOPEenc_datarecipientinfoPKCS7_ISSUER_AND_SERIALPKCS7_SIGNER_INFOunauth_attrenc_digestdigest_enc_algauth_attrdigest_algissuer_and_serialPKCS7_SIGNEDsigner_infocertcontentsmd_algsd.encryptedd.digestd.signed_and_envelopedd.envelopedd.signd.data‘ ‰€0 P0 ‘H0 @‹‘@0 ðl‘40 n‘0 0p‘0 0q‘0 °p # ðƒÿÿÿÿHë  l1 Hë p1 Ì/ ü¦ pü/ ûð/ 0lè/  ‹  ¹  Ü/ mpmü¦ p¸/ n¬/ û  / @ / û„/ ð‚‹x/ @ 2 è1  d/ · ठp¨2 L/ ü¦ p Ð= žÔ< ð‚ Ä< ð‚Ÿ´< €… # ðƒÿÿÿÿ¨< ð¹H> ¨< ä< ‰–˜< àë—ˆ< `›’|< º˜p< º™p< ºšp< º > Œ>  # ðƒÿÿÿÿ`< €ºX< @ L?  `< H< ºÿÿÿÿ¤? H< 4< 0lÿÿÿÿÔ? 4< .\crypto\pkcs12\p12_crpt.c.\crypto\pkcs12\p12_crt.c.\crypto\pkcs12\p12_decr.c.\crypto\pkcs12\p12_init.c.\crypto\pkcs12\p12_key.c.\crypto\pkcs12\p12_kiss.c.\crypto\pkcs12\p12_mutl.c.\crypto\pkcs12\p12_utl.c.\crypto\pkcs12\p12_npas.cunsupported pkcs12 modeunknown digest algorithmpkcs12 pbe crypt errorpkcs12 cipherfinal errorpkcs12 algor cipherinit errorparse errormac verify failuremac verify errormac string set errormac setup errormac generation errormac absentkey gen erroriv gen errorinvalid null pkcs12 pointererror setting encrypted data typeencrypt errorcontent type not datacant pack structurePKCS8_encryptPKCS8_add_keyusagePKCS12_verify_macPKCS12_unpack_p7dataPKCS12_unpack_authsafesPKCS12_set_macPKCS12_setup_macPKCS12_PBE_keyivgenPKCS12_pbe_cryptPKCS12_parsePKCS12_pack_p7encdataPKCS12_pack_p7dataPKCS12_newpassPKCS12_MAKE_SHKEYBAGPKCS12_MAKE_KEYBAGPKCS12_key_gen_uniPKCS12_key_gen_ascPKCS12_item_pack_safebagPKCS12_item_i2d_encryptPKCS12_item_decrypt_d2iPKCS12_initPKCS12_gen_macPKCS12_createPKCS12_add_localkeyidPKCS12_add_friendlyname_uniPKCS12_add_friendlyname_ascPKCS12_ADD_FRIENDLYNAMEPARSE_BAGSPARSE_BAG.\crypto\pkcs12\p12_p8e.c.\crypto\comp\comp_lib.czlib not supportedzlib inflate errorzlib deflate errorBIO_ZLIB_WRITEBIO_ZLIB_READBIO_ZLIB_NEWBIO_ZLIB_FLUSH(undef)version incompatibilityunimplemented digestunimplemented cipherrsa not implementedprovide parametersno unload functionno such engineno referenceno load functionno indexno control functionnot loadednot initialisedinvalid stringinvalid init valueinvalid cmd numberinvalid cmd nameinternal list errorinit failed'id' or 'name' missingcould not obtain hardware handlefinish failedfailed loading public keyfailed loading private keyengine section errorengine is not in the listengines section errordso not foundDSO failuredsa not implementeddh not implementedctrl command not implementedconflicting engine idcommand takes no inputcommand takes inputcmd not executableargument is not a numberalready loadedLOG_MESSAGEINT_ENGINE_MODULE_INITINT_ENGINE_CONFIGUREINT_CTRL_HELPERENGINE_up_refENGINE_UNLOCKED_FINISHENGINE_UNLOAD_KEYENGINE_TABLE_REGISTERENGINE_set_nameENGINE_set_idENGINE_SET_DEFAULT_TYPEENGINE_set_default_stringENGINE_removeENGINE_newENGINE_load_ssl_client_certENGINE_load_public_keyENGINE_load_private_keyENGINE_LIST_REMOVEENGINE_LIST_ADDENGINE_initENGINE_get_prevENGINE_get_nextENGINE_get_digestENGINE_GET_DEFAULT_TYPEENGINE_get_cipherENGINE_FREE_UTILENGINE_finishENGINE_ctrl_cmd_stringENGINE_ctrl_cmdENGINE_ctrlENGINE_cmd_is_executableENGINE_by_idENGINE_addDYNAMIC_SET_DATA_CTXDYNAMIC_LOADDYNAMIC_GET_DATA_CTXDYNAMIC_CTRL.\crypto\engine\eng_lib.c.\crypto\engine\eng_list.cid=LOADDIR_ADDDIR_LOADIDc:/MailRoot/bin/lib/enginesOPENSSL_ENGINES.\crypto\engine\eng_init.c.\crypto\engine\eng_ctrl.c.\crypto\engine\eng_table.c.\crypto\engine\eng_pkey.cDIGESTSCIPHERSRANDECDSAECDHALLstr=.\crypto\engine\eng_fat.c.\crypto\engine\tb_cipher.c.\crypto\engine\tb_digest.cSoftware engine supportopensslP ° aP ° @A``Ð`P_H J@d(TEST_ENG_OPENSSL_RC4) test_init_key() called (TEST_ENG_OPENSSL_PKEY)Loading Private key %s default_algorithmsinitEMPTYLIST_ADDSO_PATHdynamic_pathsoft_loadengine_id.\crypto\engine\eng_cnf.cenginesLoad up the ENGINE specified by other settingsAdds a directory from which ENGINEs can be loadedSpecifies whether to load from 'DIR_ADD' directories (0=no,1=yes,2=mandatory)Whether to add a loaded ENGINE to the internal list (0=no,1=yes,2=mandatory)Specifies an ENGINE id name for loadingSpecifies to continue even if version checking fails (boolean)NO_VCHECKSpecifies the path to the new ENGINE shared libraryDynamic engine loading supportÈN \P ÉPP P ÊèK èO Ë„N ˜O ÌÜK HO ÍÔK O ÎÌK äN bind_enginev_check.\crypto\engine\eng_dyn.cpadlock¢°` $ÀˆPˆ£°` $ÀˆPˆ¥°` $ÀˆPˆ¤°` $ÀˆPˆ¦°` $ÀˆPˆ§°` $ÀˆPˆ©°` $ÀˆPˆ¨°` $ÀˆPˆª °` $ÀˆPˆ« °` $ÀˆPˆ­ °` $ÀˆPˆ¬ °` $ÀˆPˆVIA PadLock (%s, %s)no-RNGno-ACEACEOCSP_SERVICELOClocatorOCSP_CRLIDcrlTimecrlNumcrlUrlOCSP_BASICRESPtbsResponseDataOCSP_RESPDATAresponseExtensionsresponsesproducedAtresponderIdOCSP_SINGLERESPsingleExtensionsthisUpdatecertStatuscertIdOCSP_CERTSTATUSvalue.unknownvalue.revokedvalue.goodOCSP_REVOKEDINFOrevocationReasonrevocationTimeOCSP_RESPIDvalue.byKeyvalue.byNameOCSP_RESPONSEresponseBytesresponseStatusOCSP_RESPBYTESresponseresponseTypeOCSP_REQUESToptionalSignaturetbsRequestOCSP_REQINFOrequestExtensionsrequestListrequestorNameOCSP_ONEREQsingleRequestExtensionsreqCertOCSP_CERTIDissuerKeyHashissuerNameHashhashAlgorithmOCSP_SIGNATUREsignatureAlgorithmÜV ûಠp‚•¤¼  ðV  ÌV ¼V û¬V ð‚œV ð‚ † pHW V ˆV 0(•pV ¤´W dV ‘ü¦ p‘TV ÚHV °(• 4V ¤øW $V V 0)‘V °'dX ôU äU ðƒØU ð‚¨X ÈU ¸U ð‘¨U 0*ìX ˜U ˆU à|U ð‚0Y pU `U ‡‘LU ðtY 8U ˆ,U pƒˆU °+ˆ U pƒ¸Y üT ôT 0(èT 0,ÜT ‡‘ ¼¹ ‡•ÈT ¤Z ¸T ‘ü¦ p¬T 0+ T ‡ ”T °,•€T ¤Z pT `T 0-ÜV ûಠp‚• ¤¼  [ PT ‘HT €…‘@T p‘8T ‡|[  ,T · à$T €Ô[ T .\crypto\ocsp\ocsp_ext.c.\crypto\ocsp\ocsp_ht.c,Reason=Code=.\crypto\ocsp\ocsp_lib.c80443.\crypto\ocsp\ocsp_cl.c.\crypto\ocsp\ocsp_srv.cgoodunauthorizedsigrequiredtrylaterinternalerrormalformedrequestsuccessful %*sSerial Number: %*sIssuer Key Hash: %*sIssuer Name Hash: %*sHash Algorithm: %*sCertificate ID: (UNKNOWN)cACompromiseRequest ExtensionsRequest Single Extensions Requestor List: Requestor Name: Version: %lu (0x%lx)OCSP Request Data: Response ExtensionsResponse Single Extensions Next Update: This Update: Revocation Reason: %s (0x%lx) Revocation Time: Cert Status: %s Responses: Produced At: Responder Id: Version: %lu (0x%lx) (unknown response type) Response Type: OCSP Response Status: %s (0x%lx) OCSP Response Data: .\crypto\ocsp\ocsp_vfy.cunsupported requestorname typeunknown message digeststatus too oldstatus not yet validstatus expiredserver write errorserver response parse errorserver response errorserver read errorroot ca not trustedresponse contains no revocation datarequest not signedno revoked timeno response datano certificates in chainnot basic responsenextupdate before thisupdatemissing ocspsigning usageerror parsing urlerror in thisupdate fielderror in nextupdate fielddigest errbad dataREQUEST_VERIFYPARSE_HTTP_LINE1OCSP_sendreq_bioOCSP_response_get1_basicOCSP_request_verifyOCSP_request_signOCSP_parse_urlOCSP_MATCH_ISSUERIDOCSP_check_validityOCSP_CHECK_ISSUEROCSP_CHECK_IDSOCSP_CHECK_DELEGATEDOCSP_cert_id_newOCSP_basic_verifyOCSP_basic_signOCSP_basic_add1_statusD2I_OCSP_NONCEASN1_STRING_encodeunknown control commandresult too smallresult too largeno result bufferindex too smallindex too largecommon ok and cancel charactersUI_set_resultUI_new_methodUI_get0_resultUI_dup_verify_stringUI_dup_input_stringUI_dup_input_booleanUI_dup_info_stringUI_dup_error_stringUI_ctrlGENERAL_ALLOCATE_STRINGGENERAL_ALLOCATE_PROMPTGENERAL_ALLOCATE_BOOLEAN.\crypto\ui\ui_lib.c for Enter You must type in to charactersOpenSSL default user interfacecon.\crypto\ui\ui_openssl.cVerify failure Verifying - %sKRB5_AUTHENTKRB5_AUTHENTBODYauthorizationseqnumsubkeyctimecuseccksumcnamecrealmavnoKRB5_AUTHDATAaddataadtypeKRB5_ENCKEYkeyvaluektypeKRB5_CHECKSUMchecksumctypeKRB5_APREQKRB5_APREQBODYauthenticatorticketapoptionsmsgtypepvnoKRB5_TICKETKRB5_TKTBODYencdatasnamerealmtktvnoKRB5_PRINCNAMEnamestringnametypeKRB5_ENCDATAkvnoetypeg p‘g pÀ£ ð‚g  ðf äf p”Øf †hg Èf Èg ˜f Àf p¸f †°f @w ¨f ÀvPŒf Àwÿÿÿÿh Œf „f p|f ppf p‚ hf @xXf ÀvHh Hf P or C to cancel CcInsert card "%s"Current card: "%s" nFast HWCryptoHook RSA key handleNuron hardware engine supportnuronNuron DH methodNuron DSA methodNuron RSA methodSpecifies the path to the 'nuronssl' shared librarynuron_mod_expnuron enginedso function not foundNURON_MOD_EXPNURON_INITNURON_FINISHNURON_CTRLÈN °„ nuronssl.\engines\e_nuron.cSureWareHook_Mod_ExpSureWareHook_Dsa_SignSureWareHook_Rsa_SignSureWareHook_Rsa_Priv_DecSureWareHook_FreeSureWareHook_Load_Dsa_PubkeySureWareHook_Load_Rsa_PubkeySureWareHook_Info_PubkeySureWareHook_Load_PrivkeySureWareHook_Rand_SeedSureWareHook_Rand_BytesSureWareHook_FinishSureWareHook_InitSureWareHookSureWare hardware engine supportsurewareSureWare DSA methodSureWare DH methodSureWare RSA methodsureware engineSUREWARE_LOAD_PUBLICSUREWAREHK_RSA_SIGNSUREWAREHK_RSA_PRIV_DECSUREWAREHK_RAND_SEEDSUREWAREHK_RAND_BYTESSUREWAREHK_MODEXPSUREWAREHK_LOAD_PUBKEYSUREWAREHK_LOAD_PRIVKEYSUREWAREHK_INITSUREWAREHK_FINISHSUREWAREHK_EX_FREESUREWAREHK_DSA_DO_SIGNSUREWAREHK_DH_EX_FREESUREWAREHK_CTRL.\engines\e_sureware.cENGINE_rand_bytesENGINE_rand_seedsureware_load_publicENGINE_load_privkeyENGINE_load_pubkeyENGINE_rsa_priv_decENGINE_rsa_signENGINE_dsa_do_signENGINE_modexpSureWareHook DSA key handleSureWareHook RSA key handleubsec_max_key_len_ioctlrng_ioctlmath_accelerate_ioctldsa_verify_ioctldsa_sign_ioctlrsa_mod_exp_crt_ioctlrsa_mod_exp_ioctldiffie_hellman_agree_ioctldiffie_hellman_generate_ioctlubsec_closeubsec_openubsec_bits_to_bytesubsec_bytes_to_bitsUBSEC hardware engine supportubsecUBSEC DH methodUBSEC DSA methodUBSEC RSA methodSpecifies the path to the 'ubsec' shared libraryubsec engineUBSEC_RSA_MOD_EXP_CRTUBSEC_RSA_MOD_EXPUBSEC_RAND_BYTESUBSEC_MOD_EXP_CRTUBSEC_MOD_EXPUBSEC_INITUBSEC_FINISHUBSEC_DSA_VERIFYUBSEC_DSA_DO_SIGNUBSEC_DH_GENERATE_KEYUBSEC_DH_COMPUTE_KEYUBSEC_CTRLÈN ‹ /dev/ubskey.\engines\e_ubsec.c€ØþÿÿÿÐÿÿÿþÿÿÿ¬S xS ŒS þÿÿÿÔÿÿÿþÿÿÿýT U þÿÿÿÌÿÿÿþÿÿÿGV þÿÿÿØÿÿÿþÿÿÿÛW ïW    " ¨ ´  ˜ þ Œ d‘ ô! XŽ Ê“ À Ô B— < Ö ¾ æ ’ ‚ h X J @ 0  ¨ ø• è• Ø• È• º• – œ• Œ• z• f• V• (– >– L– \– v– Œ– ”– ²– Æ– ö– Ú– — (— ®• H• :• *• • • à” î” „‘ Ž‘ ˜‘ ¦‘ ²‘ À‘ È‘ Б Ú‘ ä‘ î‘ ø‘ ’ ’ ’ z‘ (’ 2’ <’ F’ N’ X’ d’ n’ x’ ‚’ Š’ ”’ ž’ ¦’ °’ º’ Â’ Î’ Ø’ à’ è’ ð’ ø’ “ “ “ “ *“ 4“ >“ J“ T“ ^“ h“ r“ |“ †“ “ ˜“ ¢“ ¬“ ¶“ À“ Ö“ è“ ö“ ” ” $” 2” @” P” b” x” œ” ¦” ´” ¼” Æ” p‘ V‘ B‘ (‘ ‘ €€€ €€€ €q€t€s€4€€7€€ €€€€€€p€€o€€€WSOCK32.dllÍDeleteDCÐDeleteObject‘GetBitmapBitsBitBltâGetObjectA^SelectObject-CreateCompatibleBitmapµGetDeviceCaps.CreateCompatibleDC/CreateDCAGDI32.dll×DeregisterEventSourceˆReportEventA|RegisterEventSourceAADVAPI32.dllzGetUserObjectInformationWYGetProcessWindowStationGetDesktopWindowøMessageBoxAUSER32.dllFsprintffstrtoulôgetenvšwcsstr _vsnprintfxvfprintf¡__iob_funcµabortäfree:reallocmalloc&memcpy$memchrt_localtime64Ê_time64*memsetõ_gmtime64[strncpyp_errno(memmove5_readˆ_writeisxdigitþisdigitÜfprintfastrstrßfputsÏfcloseÑferrorâfreadïfwriteÒfflushÚfopenf_setmodeŠ_filenoìftellÐfeofêfseekÕfgets¿atoi,perror5qsortOstrcmp_stat64i325_chmodNstrchrTstrerrorûisalnumisspaceZstrncmprtolowerisupper_strrchrJsscanfÌexitestrtolCsignalÛ_getch.printfè_getpidMSVCR90.dllj_encode_pointer‡_malloc_crtk_encoded_null`_decode_pointer_initterm_initterm_e_amsg_exit _adjust_fdivj__CppXcptFilterK_crt_debugger_hookŒ__clean_type_info_names_internalæ_unlock–__dllonexitv_lock_onexits_except_handler4_commonExitProcess GetProcAddressöGetModuleHandleA­GetCurrentThreadIdæGetLastErrortGetVersion×GetFileType;GetStdHandle¬GetCurrentThreaddGetThreadTimes.FindNextFileAFindFirstFileAFindCloseLFreeLibraryñLoadLibraryAìSetLastErrorfGetTickCountTQueryPerformanceCounterªGetCurrentProcessId‘GlobalMemoryStatusCCloseHandleuGetVersionExA@FlushConsoleInputBuffer½InterlockedExchange!SleepºInterlockedCompareExchange-TerminateProcess©GetCurrentProcess>UnhandledExceptionFilterSetUnhandledExceptionFilterÑIsDebuggerPresentOGetSystemTimeAsFileTimeKERNEL32.dll|„.K¦ ýß x— l× è Ð8@8àÕPžðÐÕ`ÉpÈ Ê@¶е€µ ËPÑàÔ Ñ@Õð*ÐÏÐÐp‰`‰àË`»0-½@΀ÕÀÖÐäÒ`Ò0×ÀØ ÏàÍ€ÓPàÀå6Ë ðB Bà ðDB @Ø/ ¬/ À±€h l m ­l@s@À{Ào@x`x°jpdk´p³@­€j°Ã°€gÀkP¾ÀŽ0vpP€ €0j°¨àiÐfPe`¸ˆ v€yq€u€ðcг °Я °p‚‚À°fПpŸðò`ö0ó sÐÀ´@—`±0˜–0š “™p•@xÀpœ€“Pò€Õà$À– š€%0½à»àš@‘@ Š ÖÀ®0õ°¿Àªà“ð’ ’€+·°·À¹ìp¾€¼ ™à–`éÐrÀɰ˜’`` ` `c@G°FÀE FàH°. ,0à#0 ðð€0"€%ð3p7ð5°" $ @0P¦ðž`¤àžÀ§ð¥Ð¥ð<ÐK | zP‰ ~ BÀMP€ € >0Lû ``  þþ€ Àà  ÕÐpÐæÀc`B§ €@‚à.`#Og  0`Ð` úð  @BÐZð@P:°@@0p1 0 3à@;=8Ð7Ð60/à2/À1Ð@:p;bð`PmðkÐnpg@i@gðfj c@bÐce@S€S I°IÐIÀI0TàGðGH@NOPN`NpNN N0NHPTp`€`p‚T T@AKK0K Kp^_ ^ðUV VV O`AA@_p_ÀI€HGIðF@VàTVàSðàp` ˆЇÀ $@P.P#ð, ) p!@ Ð À%p*,ýÐ% ð Ðñ0ïððî`î€î°ú óÀø`üðûp!`ð°Ð2`À#ðÐ@!ÀÀ€°/#À  Ð!`PP" $P0 !  à"Àð# q€qqqppðnànPpn`no€oPm@mðmàmp€pÐll€lPîíPëðèúí0ê "'°€ð(€¿ à*ð*°jÐk°kÀ+ nðkq0mp?`M@E0EPE E°lH@M`E J@N`pÐpoP½nÀlP½ÀkÀ‚‡ðgk g@j°dðhüðû   0 p` rp=pEàPE q0EÀq€qÐ`ˆ ‡ qppФp¤0pàk p`¤ÀoðoPu Ð`}@} }ð|À|@™P|@ž€|| |mk°ðk p€0jài°h@9h `@g@Àgpk`glðj°:0P> .@`€@€    Pþ@@þpþp `  ð €Bà  (@(ðfÐf°f0ˆ€4p‡àsÐsÀss s°s€sðÀ°PR@]ЃP ~ ‚4Ð} 3°ý ýsÀ0{<0]ðrŽ €P3`3€3p33@3Ðrprr°rPrð[Ð;O`‹p6ðUð<50==P™p05P5àc€d dàdcdPcˆP=°=°A@‡_’ðnpt@tPp n€nn€°PŒÀÀÏPÔ¹þ 0•ú ¨ü °p€qØý p€‚`£ž…€p·ƒ ‰„pÐ… ‰†ØðՀЌPŒ€À  Й@l@qÀpÀo n n@om m@pŠЉ@ @0k‹Њpk0°ûP à ‰P‰ ¤ð@ ¡þ   ŠPаp`ý‰Ј @á`æñÈ® €åàÀ± PèÐ÷úý !Ÿ ¤­ ð ÀÙ€àì¯ ÿð°Ø@À ° °àаv v àÙààà P‹p´àŽ ‚£`°… ° ƒÀ‰ Î@‰°†`×  ðŒpŒ0€àÀ@˜`l`qàpàoÀn@n`o mÀm`p0Šð‰ "À!Pk°‹ðŠkPÐûp °@°‰p‰@¤`P þÀ @ °ŠpŠÐ€ý0‰ðˆ4€9€=0,€;p=@0>Üà× Ø0×pÛ Úß°Ý@ßÞpÜÀÞ Ü@Ú ÓÀÕ Õ Ö@ÔpÒÒðÓàÖpÓàѰÓÓÔ¿€Ì ÌÐ|Ð=p;Ðq s rpwuvÀv0|À•ð} y`{z@ ЋŒpЋP‹0k@p „ðš@V°O0Z@¼ð»ÀºÐº  ÀgPlÄÈàÆ0H€EP´ÐÃÐÂÀYÐYðYàYÇ àFÎ ¢Ò  ZB× p[p]À P$ |`ÂÁ µ0²>?ð>PE`fÀTðn l°æ€P`P€‹PP@e0^pP@P0>Ð= p0pðoÀO0QÀRT0PàQpSðTÐþ p=P½ðÕðÖ@ØÐÖ÷ø»ºkPk€kpo o°z€|Pz {ðàpßÐß ß¼ üû0ŒŒPˆÀˆàш°ˆÀ“Àà áP° ³0V@ÀððÐô€ß ìPp| ëPëëÀëÀîà}pìPŸ°ò`ìР`Š€€‰`Pááâpâ0DÀC´ DD‹€Šà À P¿À+@ÁÀÀ/à©ЩÐØ @+p@Р ¾p¿p·Àð¶0·°»0»ÀÁ°ÄûðÄ Æ@ÈÐÅÈ€ËàЇP©Ð0‡p°©ð: ‚‚ÙpÚÐÚ Ûð™К0ÚÚPÚ`ÚÐÚàÚÚ°Ú°âàèé`ÌÍpV°XP97ÛåÀî îàîðî0èÐÆð»°Îpưï`ŒƒÀ·°‘P’À`ÀÂÀ àðpâÀâ€ãÀã`µðß µ¶ð¶0»»À» ¼°ÅàÈ@Í€ÉpÓ@Õ`×0ÖØÙ0ºPºº`º ¹¹@¹P¹ ¹À¹€¹йÀºàº ºðºßÀ¾`» ¼ ÒÂpÙÙ°ÙÐÙ°åÐååàåì0ìðë@ì`•À¥`› §æ §°ððÐðàð0ððPð`ðÀ‰ð‰€pð~°‡‡0„„ÀŠ Š@Š Š è@èèPè çÀç€çÐçpô°ôò óô°ñ€±àõööÀõ`ö€ö@ööðö÷Ðö ÷p÷÷P÷ ÷ð÷øÐ÷ ø°P°°À°0±0Ç  p!ð!ðø@ÿÐà¼`ü ÀЀ @P ÀЀÀÅp® À¿‰Ð¥PÆ Ç€ÔpÔ ÔÐÔ ª0( (Àð((‘€`(À(Ð' )À§à  ‘ Ápè`«0­À+€/ Ç iÀi0ÆÇà`E@I`ŒàlPÒÀl [p&~@FÀCPÈ€C°Ç°CÈÐC`ÇðDq°¥°¢ÐÀ¥€¥@{£Ÿ°}¢à}€¢ð}¸pOGðG G@G°ÞÜ_àÄ@Ç`Š`‡t°m`mP€$0#Ð  @•Ї@à„ÐiЈ`ïP„Ðz`…ðz^ ÂËÀ‚@sP$`Û`PÄ0‹0Wàm°ŒœÂ Q0 p5Ð0ŒÐQ0à†Àz0à "PÞÀ pŠPÙð– làq ^Ð"00ÙPƒpRÐðÞp”^À Єp¼P‚ðàV@ÛàQiðŠà$¸Œà*@”`Ð…€@@‚ð‹ÐÀ ^àˆP…І0mVà…°$0lPÛ`PÒ°Ђ0@˜ €ÐÜ`„Ù0஀n˸ ”Ð`Ùp‹ËÐ#à‡P PëP‡Pj@ƒÀ€@Q€6pjàŠÀߨp°àßpžP›Ú𪰄°™€œP´ ¤À£ð–£ 'Ð$!À&€°$$p$P/+p&Ѓ€ƒÀƒP-ð. ƒ /p'À.@@‘€ ‘ €‘Д@!wu@t0tpzPuÐvPw pPp t`xpt nàí°k kPpï°î qPEàE0Eàz°EEEpEàxFðwpyà¹À%P   @¤@Ý0'P€$À `i ïïÙÚù‘Š`‹PŒ`ŠpŠÀ €Š ‘°Œ’ ’P0’0ŠPPCÐGÐBDCI€C`H°C0E€G0CÀBÀШ°ðdðŽÀŽà?P[† ï Ö`ÖÏ ’°˜0°°Õ`àPÀÐ0°ð¸ ¸Ðñ Åݬζpúðú0úÐúpS R@R@QVÀ^À‘Àà‘û€§`¨àðSðR€…p€àR0R€N¾ÐðjPºP »€â® æ ®°î0ïü ^Ðòp© æà^Ðç€èPÒÐýð®çê ® ûÀðèÐãèÀåÐð€åà°âÀ @íà* ¯@æÀ»°¥Ðá DŽРÀ-Àyð³ `0(@*`½npc °´`†@,pfÐ/À0pðç ¸ð¸@?På°1°' 2@zpkp‚0†ÀFà.° ªp/À…À pyÐà‰¹Ð{ 7¯P1€³@2piðùЀ_`f€‚`bPy08ÐJ`) z`GÚ‡@‚0²pOÀ+ÀL€ð@€,=€G`­Àe f@/p°P€ð cð»Pµ`¯Àö°°Ž[ xy€¶àô`-05°¸°qe z°/K î ¸0å€ð2ÀP |p1 OÀ)0eð¸p2,p f>° ÀæÐúÐ<` ð;^P0¤ð{ðÀ,ÐÙ0ÚP`¸P€®Ðx°kðý@°pà*0© ¶Ðz°5{€-Pë,0j y^Pj±àÇ`smwº©@+0[D*-àà(00€*P5`Hû@ÂàD`0 o »ÐQp¸€…àk€»0(À°õ°ìà@ p0`¸À{0f kà)Ú°.âePà-`*¸P» RÀw€npç€Úðl0 `.-ðóÀo†`°µÀ®À߀Š@.°µ@Ðy Ó °­ {p@ç °Ð à PÃPÒ€»€} €ˆÀf0k (Àv@¯ÐgÐ/À )€„pe°)°-p_@¯À€Ú0‹ j €Pw0*Ѐ ÙÀ.Ð ð-PxÙ`7†Pc@®P20å*0Pýà¶·@¶À”r`Š e.ð1P{09w`ŒÐO lP†`Ð0l 0À ðx`P påÐjØ€0°R‰Q(À €‡°2@(PÖp€Ý2»À'Ð4€æ/p¸p‚ € 0pàÙ)pîð/дàf° à+@€ð_ nÐ:PŽà´ M`+5@ôPz0B€2.Ð1k°ÙP±€.°æ°(Php\ p00°œÐ?€©ð­@­à9*P 2ð­P¥0ði€®à0ÀEà6à €A°p·@Pµ‰@j ï kp ûåð°,Ðw¶,`,ð4t°¯pj€JàÊ€¹ w°`20D€+0-@-€ÐHº 8`ZÀ2@{Ð ðzk`å€P€ xy@ªz°p ðG –0öæp0+0¨ Qpwàðàë0)€å{@€Ù@l P`®pÈ0Àk1ð lpxÀ4@@À*€†P+Öô @GzPüÀ °À÷`¶°+€ä *‰°<ðw ®@ð 0€l€(ÐkÐv@J0] {@~ W€¸à'À° p¹à6à~ÀqÀxà,VÀb€à@w@;`(àÕp´ ~ðy°ö`_ ÐA.P/@y¯Bð‰01pPÃ@ t€xð‚p_pz°V( Ù w0oP¸Àæ¸`Jk|@Ž„÷ 0qðÙ@6à°*°oD€¶€Ž0,@EðkcаÀzÀ~`K+°€ b0.p{0/ðâà@÷€)1à8€äðv ðj [‹ ö€jÐ0Ù@)d`lpƒ€¯À()@x`Q x oàJ 0l/`æÀÐF09°0 ‹`W€Ãp ³ð 0¯+Pk0…0¯@_³ yðƒ6pc`+Àÿà®@îp` dðaPÒ@^Ð^ð]P^à*À °b^ ^0^àðp`u v€ØÐ7 °‚Dd c`d _@ɰÀQ€Q P°Q°PpQ bN d NPˆ@N0ˆ`ˆˆˆO€"Àë`a0#Ðb0hbàð$€ PRàQ`R°RpêNP`Ðb0R0H@R H b€NÕ0À»@&°%à%`&À%€&&0&&&Àö@`P`Ð_à_`‚€fe°_eàbPU )àË`ðü`+`®P€®€Ç "’ ^`SP•Ðࣰ pjð!Ð!pK€¿P, æPÀ¶ 0P}à°` °” ³À°†0#Ð%­ðk@«$0,0×à­ÐRp¨P‘PŒ ï°­ j à®@‹ …€£0‹ÐæÀ PT FÐ  °¥,À +^°— ¯@®šà` ¤Àà ¦¥¥Pªp^P`'@ @¥`%à  pà*æð´@¸ N@p%phàAМ°…P¤`Mp£°^ ÀMp+Юà!p‰PBðˆ0n 0Ž0N ´`T@À®0†ð*À ð« §@BÀ0Ã= À |ð™@P"ððÛ@®@®" qPÒ€ ° ¨0šL`®`ŸÄ@b Ð ŽÀ¢ © ¥@­à @£PÀª`©°æ„à®Ћ@%P‚°S†`¬°*0c  B@¯@| à‚QÏ S@¨ €À¤À `îÀ•p'`©ð® ®Šà® ¡`FÐËP¯ÀÖ€ªÐÀ `K'°·À ^`Ž + ¯¯ˆ ®ð‡€€fÐ ý€B°l«ÀÐ’ðk°^ ¦@¤`@ಔ^ Šðp‚ æКpˆM°Ãð«Pž "0S€€ pðƒ 0¯ðªÐú p­°Dà*° `©€Mã@M  0# A©P 0T€Tà‡ ^@΀£Q ²0¼ð}P¯@qà °ˆð—P›ð_° `¥ « Œð0pPŽ€´p°}`£à¥€@‡°ÀA°E€à§À±@»%ƒ`+P_`¯p¸À]_€~À·‚@¯p|à0¯@} +PPðD@yO0У@‡`‚ À!p© %0©`ƒÀÏpÀ`§´ðİRÐpp“0ä°ƒÀž€PÒà®TPàà^P@P£0}°Ãà`°ÃÐÀpŒÐP0'p@ÐSà×"ঀýˆpAS°¶pyÐI@æ`Sà·0€S€©Ð(PÐt% µ¯°£À¥à³Ð@œpÁ P ର‚ ´´0  `+`+p¥ *§à*@+À*+ +€*à® :À?ðÖ^p‹@e e‹Ðd‹à*À €‹PÒÀ‹e^°‹ ^pi^ePÒ@[À `‹ ‹À  S@¯à[À `‹ð[PÒ0e¤€ÓP9°¤ <€9¤ ûý€ü`oPnÀyðÌÐ@ü`¯ üð¦°ðúûðüàà‹ÐipЋÐ)°)Àfð‹À7(àE°&à*`¯8³ Ë á ø   . ? P g z † – ¢ ² Å Ñ å ù   ! ; P h { – ª Â Ö î ! ! ,! ?! O! d! x! ‹! Ÿ! ³! É! Ú! õ! " '" @" [" t" ”" ¬" Â" Ù" ê" ú" # '# 9# L# ]# n# €# ‘# ¡# ²# Ã# Ö# å# ò# $ $ $$ 3$ C$ ]$ s$ ‰$  $ µ$ Ë$ á$ û$ % ,% @% R% e% y% Š%  % º% Ð% à% ñ% & & %& B& U& l& |& Ž& £& »& Ë& Ü& ó& ' 1' E' V' k' ' ‘' ¤' µ' Å' Ô' á' ï' ÿ' ( *( 9( G( e( ( ( ›( ª( È( â( ü( ) -) L) _) w) ‰) ™) ª) ½) Î) æ) û) * "* :* P* g* {* “* ±* ¾* Ê* Ö* ß* ó* + + !+ -+ ;+ M+ ^+ o+ }+ Ž+  + ±+ Â+ Ñ+ ß+ ñ+ , , #, 2, A, R, c, v, Š, ›, ¬, ·, Ç, Û, î, û, - - )- 3- @- M- _- r- „- –- ©- µ- Ð- é- . . +. ?. V. k. . . ¡. ¬. ». Æ. ×. â. í. ÷. / / $/ 8/ A/ [/ x/ ‰/ ¥/ ·/ Ê/ ä/ í/ ù/ 0 0 (0 ;0 I0 V0 c0 p0 y0 ‰0 ”0 £0 º0 Î0 Ü0 å0 ò0 1 1 .1 >1 S1 c1 p1 ‚1 —1 ©1 ²1 ½1 Ê1 Ú1 ê1 ò1 2 2 "2 02 ;2 H2 S2 c2 r2 {2 …2 2  2 ³2 ¾2 Ê2 Ò2 Ý2 ê2 ó2 ü2 3 3 3 *3 93 B3 M3 W3 b3 o3 w3 ˆ3 3 ¬3 ¼3 Ê3 Ý3 ê3 û3 4 4 14 G4 X4 h4 w4 4 4 ›4 ¥4 ¹4 Ð4 é4 ú4 5 *5 =5 S5 c5 y5 “5 ¦5 ±5 ½5 È5 Ô5 ß5 ì5 ú5 6 6 #6 36 C6 W6 g6 {6 ‹6 Ÿ6 ¯6 Ã6 Ú6 õ6 7 7 *7 ?7 P7 a7 r7 ƒ7 “7 £7 º7 Ë7 Ü7 ì7 ü7 8 )8 C8 J8 V8 `8 j8 t8 ~8 ˆ8 —8  8 ­8 »8 Â8 Ê8 Ô8 Û8 ç8 ó8 ú8 9 9 9 #9 59 J9 a9 x9 9 ¦9 ½9 Ë9 ×9 á9 é9 ÷9 : : ': ?: L: V: a: n: y: Š: •: ¦: ¶: Ð: å: õ: ; ; $; 3; H; \; g; }; “; ž; ª; µ; Æ; Ò; Ü; ã; ï; ö; < < &< 6< F< O< [< l< w< €< Œ< ›< °< ¸< Æ< Ô< Þ< é< ô< = = = %= ,= 8= @= V= i= q= y= = Ž= ›= ¨= »= Ç= Ò= Ý= é= õ= > > %> 2> C> P> c> p> {> ”> «> Ã> Ñ> Þ> ò> ? ? ? )? 7? D? N? l? |? ? ? ´? Ì? â? ü? @ *@ D@ N@ \@ i@ y@ ’@ «@ ¿@ Ñ@ ã@ ú@ A A 6A EA ZA mA A ‘A ¬A ¼A ÓA åA ùA B !B ] N] ^] ‚] š] ±] ½] Ñ] á] ô] ^ !^ 7^ J^ ^^ p^ „^ ˜^ °^ Ç^ ã^ ø^ _ _ (_ <_ Q_ g_ |_ _ ¦_ ½_ Õ_ î_ ` !` 9` S` o` Œ` ¨` À` Ù` ñ` ÿ` a a ,a =a Ma \a ma €a •a ®a Áa ×a îa b b 7b Nb ib „b žb ºb Íb àb ûb c c 3c Tc tc c ­c Äc Ùc ïc d d 5d Kd cd }d —d ¥d ¸d Èd Ùd ìd ýd e +e 9e Le de {e –e ¤e ¹e Îe äe ùe f "f 8f Nf ff zf f ¤f ºf Ñf åf ýf g 'g € N€ c€ v€ Š€ š€ ¨€ ·€ Ѐ ä€ û€ % 9 T o © ¸ È Ú ê û ‚ *‚ B‚ T‚ n‚ ƒ‚ Ÿ‚ »‚ Ü‚ ÷‚ ƒ ƒ +ƒ =ƒ Qƒ cƒ vƒ ‰ƒ šƒ ¬ƒ ½ƒ ̃ ܃ ïƒ „ „ &„ <„ P„ e„ z„ „ ¡„ µ„ Ç„ Ú„ ÷„ … *… ?… \… t… “… ²… Ö… ô… † † 5† M† b† x† † Ÿ† ±† † ׆ ç† ø† ‡ ‡ +‡ ?‡ K‡ ]‡ p‡ „‡ “‡ ¨‡ ¿‡ ׇ î‡ ˆ !ˆ 8ˆ Jˆ ^ˆ nˆ }ˆ “ˆ ¢ˆ ·ˆ Ј åˆ þˆ ‰ !‰ 2‰ J‰ ^‰ n‰ ‰ Ÿ‰ Á‰ щ à‰ ô‰ Š Š %Š BŠ TŠ eŠ yŠ ˆŠ •Š £Š ®Š ÆŠ ÞŠ íŠ úŠ ‹ ‹ "‹ /‹ @‹ O‹ _‹ m‹ ‹ Ž‹ ¡‹ ¯‹ ¼‹ Ë‹ Ù‹ æ‹ õ‹ Œ Œ 7Œ JŒ [Œ hŒ vŒ ŽŒ œŒ ¥Œ ·Œ ÎŒ ⌠õŒ # 6 V e t ‘ ¡ µ Ì â ö Ž Ž .Ž @Ž RŽ _Ž uŽ Ž ¨Ž ¿Ž ÛŽ õŽ 0 C V w ‹ £ ¾ Ø ð   4 J ` j } • ª ¾ × î ‘ #‘ 3‘ C‘ ]‘ {‘ ™‘ ª‘ ¿‘ ב î‘ ’ ’ %’ >’ Q’ d’ {’ ‰’  ’ ¼’ Õ’ í’ “ %“ =“ b“ v“ Š“ ¨“ Ê“ ì“ ” ” 6” Q” j” }” ”” ±” È” ß” ú” • • .• >• S• f• z• • ¢• ±• Å• Ø• ì• þ• – (– 8– T– p– – •– ¥– ¶– Ê– á– ï– — — — 2— J— V— `— x— — ©— ¼— Ï— Ú— é— ÿ— ˜ (˜ 5˜ F˜ U˜ f˜ ~˜ “˜ «˜ ½˜ ј è˜ ó˜ ™ ™ +™ :™ H™ ^™ q™ †™ ˜™ ¨™ ¹™ Ì™ Ý™ ï™ š š 1š Eš Wš jš ‰š ¦š Áš Ýš óš › › 1› C› S› d› {› › ¦› ¼› Õ› ì› œ œ 2œ Hœ Vœ jœ ƒœ —œ ²œ Ü ßœ ñœ üœ  , = K h r € ‹ ž ² Î é ÿ ž ž %ž ;ž Pž až sž „ž  ž ¯ž ºž О æž óž Ÿ #Ÿ ;Ÿ NŸ \Ÿ jŸ {Ÿ ’Ÿ §Ÿ ½Ÿ ÍŸ ÛŸ êŸ þŸ   #  ;  Q  h  {    ¡  ´  Ó  ð  ¡ ¡ 0¡ A¡ M¡ V¡ a¡ n¡ w¡ †¡ ‘¡  ¡ µ¡ Ä¡ Ρ à¡ õ¡ ¢ ¢ ¢ 5¢ A¢ Q¢ a¢ s¢ ¢ ¢ ›¢ ­¢ ¹¢ ½¢ É¢ Õ¢ ߢ ï¢ þ¢ £ #£ ;£ M£ ^£ o£ £ £ ££ ¼£ Í£ Þ£ î£ ü£ ¤ ¤ ¤ 4¤ K¤ [¤ p¤ ¤ ¤ —¤ ¦¤ ¶¤ Ѥ ë¤ ¥ %¥ <¥ Q¥ f¥ ƒ¥ ¢¥ Á¥ Ú¥ ñ¥ ¦ ¦ ¦ 3¦ G¦ Z¦ m¦ „¦ ”¦ £¦ ¶¦ ¿¦ Ú¦ ã¦ î¦ ù¦ § +§ /§ 4§ ?§ I§ X§ d§ k§ x§ „§ ’§ ™§ ¦§ ²§ ç ѧ ا å§ ñ§ ÿ§ ¨ ¨ ¨ 0¨ >¨ H¨ Q¨ _¨ j¨ z¨ Ѝ ›¨ ¦¨ ¸¨ ¿¨ Ψ æ¨ û¨ © -© I© f© y© © ¨© Ä© Þ© ü© ª /ª Hª _ª zª –ª £ª µª ƪ Úª åª üª « &« :« S« k« €« ‹« ž« ±« Å« Û« é« û« ¬ #¬ 4¬ J¬ _¬ z¬ –¬ ²¬ Ϭ ⬠ö¬ ­ ­ :­ V­ r­ ­ ©­ Ä­ ß­ û­ ® <® ]® €® ž® î æ® ¯ /¯ T¯ u¯ –¯ ¶¯ ݯ ° &° E° f° ‰° §° ̰ ï° ± 8± ]± ~± Ÿ± ¿± æ± ² $² =² N² b² {² “² ¤² µ² ˲ â² ù² ³ *³ C³ [³ m³ ~³ ”³ ¬³ ¼³ ϳ ç³ þ³ ´ ´ "´ 7´ H´ [´ f´ {´ Œ´ Ÿ´ ¨´ ²´ Æ´ Ò´ æ´ ô´ µ µ µ (µ ?µ Sµ fµ {µ µ  µ µµ ɵ Úµ âµ ôµ ¶ ¶ 0¶ D¶ Y¶ a¶ w¶ ¶ œ¶ ²¶ ƶ ض î¶ ý¶ · $· 2· H· ^· q· †· œ· ±· Æ· Û· ð· ¸ ¸ 0¸ E¸ L¸ Z¸ e¸ {¸ Џ ˜¸ ¦¸ ¶¸ ĸ Ó¸ ݸ ç¸ ÿ¸ ¹ 0¹ I¹ X¹ m¹ ¹ •¹ ª¹ ¹ Õ¹ å¹ ù¹ º º *º 9º Jº _º pº „º —º °º Àº ߺ 𺠻 » 4» K» \» t» ƒ» –» ¨» ¾» Ó» å» ù» ¼ ¼ /¼ B¼ Q¼ `¼ p¼ €¼ ޼ ¼ ­¼ ¼ ؼ õ¼ ½ /½ B½ V½ o½ н £½ µ½ Ƚ á½ ü½ ¾ ¾ 2¾ F¾ Z¾ l¾ ¾ ޾ ›¾ ©¾ ¼¾ ; ß¾ õ¾ ¿ ¿ )¿ =¿ M¿ Z¿ h¿ y¿ ‘¿ ©¿ Æ¿ Ý¿ ò¿ þ¿ À À ,À EÀ ]À uÀ ŠÀ ˜À ¦À ¶À ÉÀ æÀ Á Á *Á FÁ ^Á xÁ ŠÁ Á ¹Á ÑÁ ëÁ úÁ   8 U l } ŽÂ ŸÂ ´Â Å Õ ê à &à Dà Xà mà †Ã ¡Ã ´Ã Èà áà üà Ä +Ä FÄ aÄ oÄ †Ä —Ä ¥Ä »Ä ÊÄ ÞÄ ùÄ Å .Å HÅ WÅ dÅ rÅ „Å ”Å §Å ½Å ËÅ åÅ Æ Æ ;Æ TÆ cÆ qÆ ˆÆ ™Æ ©Æ ¸Æ ÈÆ ØÆ éÆ þÆ Ç 'Ç ?Ç VÇ pÇ ‡Ç ›Ç ²Ç ÃÇ ÖÇ çÇ ùÇ È &È @È ZÈ rÈ ŽÈ ©È ¾È ÎÈ ÛÈ òÈ É É &É ?É XÉ pÉ ŒÉ ¤É ¸É ÄÉ ÑÉ àÉ òÉ Ê Ê 4Ê NÊ cÊ qÊ ‚Ê ’Ê ¬Ê ÁÊ ÙÊ ëÊ Ë Ë 8Ë YË tË Ë Ë ®Ë ÎË ìË úË Ì Ì *Ì >Ì XÌ xÌ ’Ì ­Ì ÆÌ æÌ ÿÌ Í 9Í YÍ |Í Í £Í ÂÍ ÛÍ õÍ Î &Î AÎ ZÎ sÎ ŽÎ §Î ÂÎ ÚÎ óÎ Ï -Ï AÏ TÏ jÏ zÏ ”Ï ®Ï ½Ï ÓÏ ðÏ Ð Ð 1Ð FÐ UÐ hÐ xÐ Ð ¢Ð ·Ð ÌÐ áÐ ðÐ Ñ Ñ !Ñ .Ñ LÑ iÑ ‡Ñ žÑ ºÑ ÖÑ ðÑ Ò Ò 6Ò RÒ rÒ ŽÒ ªÒ ÈÒ ãÒ ÿÒ Ó 1Ó IÓ `Ó mÓ }Ó Ó œÓ ²Ó ÀÓ ÒÓ éÓ üÓ Ô Ô ,Ô :Ô JÔ VÔ _Ô oÔ ŽÔ £Ô ­Ô ÅÔ ÕÔ äÔ ÿÔ Õ 7Õ RÕ qÕ ŽÕ ŸÕ µÕ ÂÕ ÖÕ êÕ Ö Ö 'Ö <Ö LÖ gÖ }Ö “Ö £Ö ¾Ö ÚÖ ïÖ × × × -× E× Y× l× u× ‡× ™× µ× Ò× ï× Ø -Ø CØ _Ø ~Ø ¢Ø ¿Ø ÊØ ØØ éØ ÷Ø Ù Ù -Ù BÙ TÙ gÙ wÙ Ù £Ù ´Ù ¾Ù ÓÙ éÙ Ú Ú 'Ú 8Ú IÚ UÚ fÚ „Ú •Ú ­Ú ÅÚ ÝÚ ðÚ Û Û /Û FÛ \Û kÛ }Û ŒÛ ¢Û ¸Û ÓÛ èÛ ñÛ Ü Ü 3Ü MÜ iÜ ƒÜ —Ü ®Ü ÉÜ ãÜ Ý #Ý DÝ [Ý sÝ ‰Ý  Ý ·Ý ÌÝ æÝ þÝ Þ 5Þ OÞ eÞ €Þ ™Þ ²Þ ÌÞ êÞ ß ß 9ß Oß lß Šß ¦ß Áß ×ß ëß ûß à à 0à >à Oà Yà aà mà ~à à Ÿà «à ¸à Æà Ôà åà óà ÿà á $á 7á Pá ]á já xá ƒá ”á ¡á ®á »á Ïá àá ðá â â .â ?â Sâ l⠃⠓⠦⠷â Åâ Õâ ëâ þâ ã $ã 7ã Eã Sã eã ~ã 㠣㠺ã Éã Ýã ÷ã ä ä 4ä Lä `ä mä ä ‘ä  ä ´ä Æä Üä ñä å å $å 6å Bå På ^å qå ‚å “å ¨å ¼å Êå Üå íå þå æ &æ 8æ Gæ Zæ læ }æ ’æ ¤æ µæ Åæ Øæ èæ ùæ ç 'ç 9ç Gç Xç kç {ç ç žç ®ç ¿ç Ðç ãç õç è è ,è @è Sè gè uè ƒè è  è «è »è Ïè âè ñè ÿè é é ,é Bé Ué qé †é —é ­é Åé Óé àé øé ê 'ê Cê ^ê lê yê ê žê ±ê Ïê àê ëê úê ë ë *ë <ë Jë \ë rë ‡ë ˜ë ­ë Áë Íë Üë ïë ì ì ì &ì /ì >ì Nì aì nì €ì “ì ¡ì ®ì Àì Ñì áì ôì í í *í 8í Hí Uí gí xí ˆí ™í ¦í ³í Àí Ìí ãí ùí î 'î >î Uî lî ƒî ‘î ¨î ¼î Íî Ýî íî ï ï )ï =ï Pï aï uï Žï ¥ï µï Èï Ùï çï ÷ï ð ð 9ð Fð Yð gð uð Žð Ÿð ³ð Êð Ùð óð ñ ñ 5ñ Iñ Vñ jñ zñ ‰ñ ñ ¯ñ Åñ Úñ ëñ úñ ò ò +ò 9ò Gò Zò kò |ò ‘ò ¥ò ³ò Åò Öò çò þò ó !ó 0ó Có Uó fó {ó ó žó ®ó Áó Ñó âó ýó ô "ô 0ô Aô Tô dô xô ‡ô —ô ¨ô ¹ô Ìô Þô îô õ õ )õ <õ Põ ^õ lõ yõ ‰õ ”õ ¤õ ¸õ Ëõ Úõ èõ òõ ö ö +ö >ö Zö iö ~ö ö ¥ö ½ö Ëö Øö ôö ÷ '÷ >÷ Z÷ u÷ ÷ ©÷ Ä÷ Ò÷ ß÷ õ÷ ø ø 5ø Fø Qø `ø nø }ø ø ¢ø °ø Âø Øø íø þø ù 'ù 3ù Bù Uù gù qù }ù Œù •ù ¤ù ´ù Çù Ôù æù ùù ú ú &ú 7ú Gú Zú nú |ú ú žú ®ú »ú Íú Þú îú ÿú û û &û 2û Bû Vû pû û —û §û »û Ìû Þû ïû ü ü ü 3ü @ü Uü jü ü ¢ü ¬ü µü Âü Êü Ôü Ûü éü ûü ý 'ý 4ý @ý Iý Vý aý mý zý ‡ý “ý Ÿý ¨ý ¸ý Ãý Íý Ùý åý óý þ þ þ &þ 1þ >þ Oþ eþ oþ }þ „þ Œþ —þ Ÿþ ©þ ¶þ ½þ Éþ Ðþ ×þ ãþ ëþ òþ ÿ ÿ ÿ ÿ 'ÿ /ÿ =ÿ Eÿ Yÿ jÿ |ÿ ɾ „b Î ¼ » ß ð Ø ôŽ  ! Ï XYÚ #= U¤Á<à$â E êµÆ ´·õ „s" M…†‡ì È  ¡ ªA>a RwM y k < ¢;ß Q÷ì è , ~ Äã* R æW } \Ë柳 ž™ ^ Ý ¡š ´ˆä` “34”[56  ¡ – ÃÌ 7+Þ ‘E0 ‹q &Ÿ ò  !é ü 3 ÷ Ó Œ D ä ö > ^ )  ë _ ? ´ O Ø J"ì#z ê +  $êé%ã pª   ë&ÿô Æè@ ç‰i Š'(Ú)*+,-a 2˺3 q56³) y p¶ 789:;’<Û>?@ABD=%&FGHIJK© 49ñMN O PQRYSœ SWš™QUTUÈVWXYZÕ [\^_ac>ëd'îeófghijkM Š ‹ l̈ xÔŒ Í ÓR ¹ÎÀmÂnnÁ‘ õ ß º f [   ·¡ % DX D Ó Û z ‹ Toopqí ighjôü Ûrsuwév!Ÿ xyz{|è}m~倂ƒ} Ž , {à„tF…†® ¿… ‡ˆ‰Õ j ‹éŒõ ` lŽ/ N < ‘kñ  t “"”æ• û u8- –—˜™š¾Ú ›¡ œžŸ2ß ¡¢ç­ ¶£Ã¤Ä¥¦§¦ ¨  ©¨ ª ¸ ßàÝÞÜáÛ¥ ͧ ÌHGwxyz_ïêªy «¬­z { }  u € n ®  x p v r ™ | m t w ñ 4 ¯+ °Å±Þæ²ùll Û ´ëèµs q p r ì> ¶·Ü æ¸nÇ& ¹i oº»åç¼½¾¿ qrÀ§ ÁmÂn k o î ÃÑ åÄpsÙ ÅÔüÆ   ÏÈ È¸  !… † '_b()*+aǽÈÉÊË€c]^Ì`eZ[Íq ÎÏõÎ XÍ r  … \5467NÐÑÒf”fbÔ_ÕÖÄdœרÙà ÚÛÜâßÝÞ àh Ü9 ôÕÔØ* ª ÙÛ±ÒÓ×= Ú  q ; m Ü #~ B o VWÁ ´ Ÿ(š’†J W yQ| œ g™€ È  â + õ *‘ L< „ 4z « ¨ nñ Œ P L ¼  d  ² ~5 D  ¤Ø  Ì £ ¥ ¥( ] Ý ö — ; %I ä N - e G r P· ‚ aY Ç ã E Þ ˆ Á ý s p Ú K\ ²O 7 Ð ) #  k  2 Ri   2 )$ g { v B ¼ n Õ ¼ „ Æ ° S C ­ Å ¯ × ƒŠº ¸ Sà ¿ à a Ø · É : MÌ ¥  »  ÿ ' ¤ » ^ Ó ± µ c ç ´ Ç ¶ Ì@ F ª ‘ ‰ 9 “  8 Ò ò î ` Ë Á ® ÍŠ K Ò  É   0 g dZ e =Iñ ø î À ™ L ; | H Ä ¨ £ ” Î À  s : Ù ¹ Ñ ³ ®Ù Â Ë Ô d o ¯ x £ ½ Y Ï ² b Ë ËÈ d h p ¸ã ê 7 ß ü ¥ 8ÝÞòßàáâãê( ÅäåæçèéêÜ ëðìíá3 ¢ îïðh ñ–œó½  ‹ôõö÷øë„ ‚ ƒ í ùr úûü® ý9  @ þ&/ÿÑ_ 2Æ0À:Åö‘êÚ^ Ê ä:ç<û $;=p!) b _ ú \ w $  c M  ± — l E 7*1 üq)+%&Ãi «Q ñh Æ-'.OŽ8 ñn ˆB© :±y  !ì#$n ² • ¯ S — R ¿ ˜ ³ - ” ³ Æ – ¶ Ÿ “ %&'(ÖרÙ)*Ì + ,-./Ï 0¹ £ 123ž 45678‹9:;<=>?@A… BC¾NDEFGH¿IãJKLñ ò ï ð F  ô ¿ó ¾½! ¼5  mt Áß º × Ä Ã ô A j  § Ö 0 ~ è Ÿ º T ®  I â Ñ ’ æ   ü ©  ù Š S Q ¦ ? ½  / MNOPQ€ ‚ „ ƒ RSTòU  • œ š îìèð íçãëåæŒò ZP [lj\k½ ]hi^_ÞÕ ÜLOz ¶ PQRS`a bcdäefghijkMlmŽ û ø  X =  U Å ï  ¥ å â \ + * W 6 ] H u ] ë ð " ¬ * f œ _ P C ¸ < • é E J   X 8 î Ù ¤ Pm ú –  —  3 ± – d & Î ¼ × ‰ ; ³ 1  ù . 1 ž 6 ’ o V  ” [  † Å ñ ' ‹ 2 P ç h V • R š } l   y Ó U ( , 9  æ  › v Ž Ð , ˜ U [ % ö RS¬ œ C HŒ ‹ ¬ s Š úÏ  › ./? Ϋ üý{À y ¹ wó unopqrstuvwxyzÍ ƒ {|}~€¿‚b/!ƒõùÛ„…²¸†|² ‡ˆ‰Š‹'ŒO ¾ úñÊŽ® ¦¨‘’“”•4–:^‘—øtû€˜™´.šöo›œÊžŸ¯  _ ˜ ’¡ïuôD¢£¯¨¤g ¥¦Éž › ð îðì7 ‹ 6 ôõ°ó ‡ o Á ­ ýöúZ Ý ‡ F ûü \  ñò÷ÿN { ¹ þ# ² û îü*G ó §" ¨©x ª«' ¬­è ®¯°¿ ±² ³/´ µ¶‰ ·¡¸A ¹kq£¤01©r¢ª¥žÝܨ§fsºa»etuv«iW ¼§€2 œŸj4h`$· "Ì ï'ÒM ÑÒ® ÐÖ: Ô @Ú lZ ¡é ê è ë ä ì X˜ÏÐÌa ÑÑpÒv € ÓÔ© YÍÕÖ×âØÙÚÛÜÝÞßàY á° âàÕö ÑÐL»ãäe76ZåæoÉú ù Ê   ÷ çèéêëìí5Ô îïðÇ ñòø óôõöó÷µ ç .é E– O´ ›˜Þ Tü 0Z øùôúc°^g] § ?£ 9 <N › ó ý ! |ª ™ 3 Ö 7ŽŒ ± Y$ÿ ì = 6 ]÷ „ U–`AH V ¨ > •¢ž ¹ x u š ¿ r¤ k & 5k ‚\-a à þ ª¢ å Î Ñ _ á € “ Ï / b ^  žÉ ¬ M è ?  jÐ Å j ¯K 1Ê  +ú ¯ ‰ … ­ Ò ø 3l 2ÆÄÅ/ÉÇÈ4 .þÿ‚ ‡ ˆ H K é 5 è ÷  G  ( ¯ X 5  . K ! -  ¾ Þ … ‚ s ¢ ê á L c ä u ¢ Ä ý ä C e  T L `  ö Ž Ç Ú; ØnmÞÖ gB “”•o Ê –—˜Õ™šmë } ›œnhç žŸr  ¡ éàߢ£¤âÊㆠáUíV™ W‚Ž‘©ƒ•’Š« ‹…¦ нù Í cû   »   V Øú Ì˵  í  . Nj !"#$%&'()*+,-./0123456r 789:y×w;<=>?@ABCDEF: GHI~ | JK‘ L MNO—PQv RS)FzÚ8ÅŸÌåA TB U¥ £¨XV» ¦9 VRWb Ÿž¡¤TOX> YZ¤ [P\]^_`a bcdefghitQ j/ î k lm°° £› õö÷øùKà nð· ûü 0 ýþ’ Ž íÛ “ o¼pqrst[u³ # þ  ŠÖþýä= ˆv wCv»Æ æ Ä1 Jl T S F \ U ¬¦ Ä ˆ ![xŒyzÕ • {"V| }~d —˜€e c O‚ƒ„…†â‡ˆ‰Š‹¥ŒŽ‘’“”•Ô " › ³–½—å ‡ï i * † w ‰ 4 Gô ˜ï É ™N ‡uš›œžŸ ¡‘ ¢£  ” ¤‡¥¦§”¢§ª–ZŒ“—¨¯°±²³´Û ’ Æ× ? “ ] % Z ¨ á à w Í µ ¶   i Ü p  3 ï «  "#$%&ø ¤ ÷ V I  º¹»¼. “ä½¾Bs ò ° à J í G f þ 4 1 ¿g ÀÁÂÅ[t w { †ÇCȳ¥ ÉÊËxÌÍÎÏÐѦÒs¢ Ó=;ÔÕ}执ÎÖ?A רÙÚ,ø8Û„’ ”ê ã X` z¦ý q »À t |  Ò å T ù  ‡ ¨ÜÝÝÞá 2 í Ï O J W æ ˜ Ë & þ 8 m /zv ßàáâãäåæçèéêv~#öóò÷ÐÑÕã ç ˆ Œ ë„…ìíîïð°·g û«-1Ùñò`ó»Bqôõö÷øùTúûüýþÿ¼ÃÀ¾Á¿ºÆ% ¸./0u x 1D2²¬ÿ 345|678d9f ­:Ÿ ;<:< å®Ë=>@>?@A¼Ý²9B"  { FÀ t[ ë ºÁ $ ¡ k 7 ÿ @  ´ È Ý ¯CDÛE· û Š Ä ”  ± ¸ D Q y I  ì õ Þxt FGHIJKð LMNOPQ€z{}!ÿþýðÏÏÓæ å † ‡ R†ƒSTUVW±¹e µÀ@,0×XY]ZSë9[\]^_`Qabcdefghijklm, ØÙÔÃÒ6ÍÂnopqrstuØŠvwxyz{|}~Ѐ‚ƒ~{}|Ö' ¶$ } wµA ­©ƒ >c äÄ„…†‡× ˆ‰Ô Šj u‹Œvކt‘ÇÎÓLIBEAY32.dllACCESS_DESCRIPTION_freeACCESS_DESCRIPTION_itACCESS_DESCRIPTION_newAES_bi_ige_encryptAES_cbc_encryptAES_cfb128_encryptAES_cfb1_encryptAES_cfb8_encryptAES_cfbr_encrypt_blockAES_ctr128_encryptAES_decryptAES_ecb_encryptAES_encryptAES_ige_encryptAES_ofb128_encryptAES_optionsAES_set_decrypt_keyAES_set_encrypt_keyAES_unwrap_keyAES_wrap_keyASN1_ANY_itASN1_BIT_STRING_asn1_methASN1_BIT_STRING_freeASN1_BIT_STRING_get_bitASN1_BIT_STRING_itASN1_BIT_STRING_name_printASN1_BIT_STRING_newASN1_BIT_STRING_num_ascASN1_BIT_STRING_setASN1_BIT_STRING_set_ascASN1_BIT_STRING_set_bitASN1_BMPSTRING_freeASN1_BMPSTRING_itASN1_BMPSTRING_newASN1_BOOLEAN_itASN1_ENUMERATED_freeASN1_ENUMERATED_getASN1_ENUMERATED_itASN1_ENUMERATED_newASN1_ENUMERATED_setASN1_ENUMERATED_to_BNASN1_FBOOLEAN_itASN1_GENERALIZEDTIME_checkASN1_GENERALIZEDTIME_freeASN1_GENERALIZEDTIME_itASN1_GENERALIZEDTIME_newASN1_GENERALIZEDTIME_printASN1_GENERALIZEDTIME_setASN1_GENERALIZEDTIME_set_stringASN1_GENERALSTRING_freeASN1_GENERALSTRING_itASN1_GENERALSTRING_newASN1_HEADER_freeASN1_HEADER_newASN1_IA5STRING_asn1_methASN1_IA5STRING_freeASN1_IA5STRING_itASN1_IA5STRING_newASN1_INTEGER_cmpASN1_INTEGER_dupASN1_INTEGER_freeASN1_INTEGER_getASN1_INTEGER_itASN1_INTEGER_newASN1_INTEGER_setASN1_INTEGER_to_BNASN1_NULL_freeASN1_NULL_itASN1_NULL_newASN1_OBJECT_createASN1_OBJECT_freeASN1_OBJECT_itASN1_OBJECT_newASN1_OCTET_STRING_NDEF_itASN1_OCTET_STRING_cmpASN1_OCTET_STRING_dupASN1_OCTET_STRING_freeASN1_OCTET_STRING_itASN1_OCTET_STRING_newASN1_OCTET_STRING_setASN1_PRINTABLESTRING_freeASN1_PRINTABLESTRING_itASN1_PRINTABLESTRING_newASN1_PRINTABLE_freeASN1_PRINTABLE_itASN1_PRINTABLE_newASN1_PRINTABLE_typeASN1_SEQUENCE_itASN1_STRING_TABLE_addASN1_STRING_TABLE_cleanupASN1_STRING_TABLE_getASN1_STRING_cmpASN1_STRING_dataASN1_STRING_dupASN1_STRING_encodeASN1_STRING_freeASN1_STRING_get_default_maskASN1_STRING_lengthASN1_STRING_length_setASN1_STRING_newASN1_STRING_printASN1_STRING_print_exASN1_STRING_print_ex_fpASN1_STRING_setASN1_STRING_set0ASN1_STRING_set_by_NIDASN1_STRING_set_default_maskASN1_STRING_set_default_mask_ascASN1_STRING_to_UTF8ASN1_STRING_typeASN1_STRING_type_newASN1_T61STRING_freeASN1_T61STRING_itASN1_T61STRING_newASN1_TBOOLEAN_itASN1_TIME_checkASN1_TIME_freeASN1_TIME_itASN1_TIME_newASN1_TIME_printASN1_TIME_setASN1_TIME_to_generalizedtimeASN1_TYPE_freeASN1_TYPE_getASN1_TYPE_get_int_octetstringASN1_TYPE_get_octetstringASN1_TYPE_newASN1_TYPE_setASN1_TYPE_set1ASN1_TYPE_set_int_octetstringASN1_TYPE_set_octetstringASN1_UNIVERSALSTRING_freeASN1_UNIVERSALSTRING_itASN1_UNIVERSALSTRING_newASN1_UNIVERSALSTRING_to_stringASN1_UTCTIME_checkASN1_UTCTIME_cmp_time_tASN1_UTCTIME_freeASN1_UTCTIME_itASN1_UTCTIME_newASN1_UTCTIME_printASN1_UTCTIME_setASN1_UTCTIME_set_stringASN1_UTF8STRING_freeASN1_UTF8STRING_itASN1_UTF8STRING_newASN1_VISIBLESTRING_freeASN1_VISIBLESTRING_itASN1_VISIBLESTRING_newASN1_add_oid_moduleASN1_check_infinite_endASN1_const_check_infinite_endASN1_d2i_bioASN1_d2i_fpASN1_digestASN1_dupASN1_generate_nconfASN1_generate_v3ASN1_get_objectASN1_i2d_bioASN1_i2d_fpASN1_item_d2iASN1_item_d2i_bioASN1_item_d2i_fpASN1_item_digestASN1_item_dupASN1_item_ex_d2iASN1_item_ex_freeASN1_item_ex_i2dASN1_item_ex_newASN1_item_freeASN1_item_i2dASN1_item_i2d_bioASN1_item_i2d_fpASN1_item_ndef_i2dASN1_item_newASN1_item_packASN1_item_signASN1_item_unpackASN1_item_verifyASN1_mbstring_copyASN1_mbstring_ncopyASN1_object_sizeASN1_pack_stringASN1_parseASN1_parse_dumpASN1_primitive_freeASN1_primitive_newASN1_put_eocASN1_put_objectASN1_seq_packASN1_seq_unpackASN1_signASN1_tag2bitASN1_tag2strASN1_template_d2iASN1_template_freeASN1_template_i2dASN1_template_newASN1_unpack_stringASN1_verifyAUTHORITY_INFO_ACCESS_freeAUTHORITY_INFO_ACCESS_itAUTHORITY_INFO_ACCESS_newAUTHORITY_KEYID_freeAUTHORITY_KEYID_itAUTHORITY_KEYID_newBASIC_CONSTRAINTS_freeBASIC_CONSTRAINTS_itBASIC_CONSTRAINTS_newBF_cbc_encryptBF_cfb64_encryptBF_decryptBF_ecb_encryptBF_encryptBF_ofb64_encryptBF_optionsBF_set_keyBIGNUM_itBIO_acceptBIO_callback_ctrlBIO_clear_flagsBIO_copy_next_retryBIO_ctrlBIO_ctrl_get_read_requestBIO_ctrl_get_write_guaranteeBIO_ctrl_pendingBIO_ctrl_reset_read_requestBIO_ctrl_wpendingBIO_debug_callbackBIO_dgram_non_fatal_errorBIO_dumpBIO_dump_cbBIO_dump_fpBIO_dump_indentBIO_dump_indent_cbBIO_dump_indent_fpBIO_dup_chainBIO_f_base64BIO_f_bufferBIO_f_cipherBIO_f_mdBIO_f_nbio_testBIO_f_nullBIO_f_reliableBIO_fd_non_fatal_errorBIO_fd_should_retryBIO_find_typeBIO_freeBIO_free_allBIO_get_accept_socketBIO_get_callbackBIO_get_callback_argBIO_get_ex_dataBIO_get_ex_new_indexBIO_get_host_ipBIO_get_portBIO_get_retry_BIOBIO_get_retry_reasonBIO_gethostbynameBIO_getsBIO_indentBIO_int_ctrlBIO_method_nameBIO_method_typeBIO_newBIO_new_acceptBIO_new_bio_pairBIO_new_connectBIO_new_dgramBIO_new_fdBIO_new_fileBIO_new_fpBIO_new_mem_bufBIO_new_socketBIO_nextBIO_nreadBIO_nread0BIO_number_readBIO_number_writtenBIO_nwriteBIO_nwrite0BIO_popBIO_printfBIO_ptr_ctrlBIO_pushBIO_putsBIO_readBIO_s_acceptBIO_s_bioBIO_s_connectBIO_s_datagramBIO_s_fdBIO_s_fileBIO_s_memBIO_s_nullBIO_s_socketBIO_setBIO_set_callbackBIO_set_callback_argBIO_set_cipherBIO_set_ex_dataBIO_set_flagsBIO_set_tcp_ndelayBIO_snprintfBIO_sock_cleanupBIO_sock_errorBIO_sock_initBIO_sock_non_fatal_errorBIO_sock_should_retryBIO_socket_ioctlBIO_socket_nbioBIO_test_flagsBIO_vfreeBIO_vprintfBIO_vsnprintfBIO_writeBN_BLINDING_convertBN_BLINDING_convert_exBN_BLINDING_create_paramBN_BLINDING_freeBN_BLINDING_get_flagsBN_BLINDING_get_thread_idBN_BLINDING_invertBN_BLINDING_invert_exBN_BLINDING_newBN_BLINDING_set_flagsBN_BLINDING_set_thread_idBN_BLINDING_updateBN_CTX_endBN_CTX_freeBN_CTX_getBN_CTX_initBN_CTX_newBN_CTX_startBN_GENCB_callBN_GF2m_addBN_GF2m_arr2polyBN_GF2m_modBN_GF2m_mod_arrBN_GF2m_mod_divBN_GF2m_mod_div_arrBN_GF2m_mod_expBN_GF2m_mod_exp_arrBN_GF2m_mod_invBN_GF2m_mod_inv_arrBN_GF2m_mod_mulBN_GF2m_mod_mul_arrBN_GF2m_mod_solve_quadBN_GF2m_mod_solve_quad_arrBN_GF2m_mod_sqrBN_GF2m_mod_sqr_arrBN_GF2m_mod_sqrtBN_GF2m_mod_sqrt_arrBN_GF2m_poly2arrBN_MONT_CTX_copyBN_MONT_CTX_freeBN_MONT_CTX_initBN_MONT_CTX_newBN_MONT_CTX_setBN_MONT_CTX_set_lockedBN_RECP_CTX_freeBN_RECP_CTX_initBN_RECP_CTX_newBN_RECP_CTX_setBN_X931_derive_prime_exBN_X931_generate_XpqBN_X931_generate_prime_exBN_addBN_add_wordBN_bin2bnBN_bn2binBN_bn2decBN_bn2hexBN_bn2mpiBN_bntest_randBN_clearBN_clear_bitBN_clear_freeBN_cmpBN_copyBN_dec2bnBN_divBN_div_recpBN_div_wordBN_dupBN_expBN_freeBN_from_montgomeryBN_gcdBN_generate_primeBN_generate_prime_exBN_get0_nist_prime_192BN_get0_nist_prime_224BN_get0_nist_prime_256BN_get0_nist_prime_384BN_get0_nist_prime_521BN_get_paramsBN_get_wordBN_hex2bnBN_initBN_is_bit_setBN_is_primeBN_is_prime_exBN_is_prime_fasttestBN_is_prime_fasttest_exBN_kroneckerBN_lshiftBN_lshift1BN_mask_bitsBN_mod_addBN_mod_add_quickBN_mod_expBN_mod_exp2_montBN_mod_exp_montBN_mod_exp_mont_consttimeBN_mod_exp_mont_wordBN_mod_exp_recpBN_mod_exp_simpleBN_mod_inverseBN_mod_lshiftBN_mod_lshift1BN_mod_lshift1_quickBN_mod_lshift_quickBN_mod_mulBN_mod_mul_montgomeryBN_mod_mul_reciprocalBN_mod_sqrBN_mod_sqrtBN_mod_subBN_mod_sub_quickBN_mod_wordBN_mpi2bnBN_mulBN_mul_wordBN_newBN_nist_mod_192BN_nist_mod_224BN_nist_mod_256BN_nist_mod_384BN_nist_mod_521BN_nnmodBN_num_bitsBN_num_bits_wordBN_optionsBN_printBN_print_fpBN_pseudo_randBN_pseudo_rand_rangeBN_randBN_rand_rangeBN_reciprocalBN_rshiftBN_rshift1BN_set_bitBN_set_negativeBN_set_paramsBN_set_wordBN_sqrBN_subBN_sub_wordBN_swapBN_to_ASN1_ENUMERATEDBN_to_ASN1_INTEGERBN_uaddBN_ucmpBN_usubBN_value_oneBUF_MEM_freeBUF_MEM_growBUF_MEM_grow_cleanBUF_MEM_newBUF_memdupBUF_strdupBUF_strlcatBUF_strlcpyBUF_strndupCAST_cbc_encryptCAST_cfb64_encryptCAST_decryptCAST_ecb_encryptCAST_encryptCAST_ofb64_encryptCAST_set_keyCBIGNUM_itCERTIFICATEPOLICIES_freeCERTIFICATEPOLICIES_itCERTIFICATEPOLICIES_newCOMP_CTX_freeCOMP_CTX_newCOMP_compress_blockCOMP_expand_blockCOMP_rleCOMP_zlibCOMP_zlib_cleanupCONF_dump_bioCONF_dump_fpCONF_freeCONF_get1_default_config_fileCONF_get_numberCONF_get_sectionCONF_get_stringCONF_imodule_get_flagsCONF_imodule_get_moduleCONF_imodule_get_nameCONF_imodule_get_usr_dataCONF_imodule_get_valueCONF_imodule_set_flagsCONF_imodule_set_usr_dataCONF_loadCONF_load_bioCONF_load_fpCONF_module_addCONF_module_get_usr_dataCONF_module_set_usr_dataCONF_modules_finishCONF_modules_freeCONF_modules_loadCONF_modules_load_fileCONF_modules_unloadCONF_parse_listCONF_set_default_methodCONF_set_nconfCRL_DIST_POINTS_freeCRL_DIST_POINTS_itCRL_DIST_POINTS_newCRYPTO_add_lockCRYPTO_cleanup_all_ex_dataCRYPTO_dbg_freeCRYPTO_dbg_get_optionsCRYPTO_dbg_mallocCRYPTO_dbg_pop_infoCRYPTO_dbg_push_infoCRYPTO_dbg_reallocCRYPTO_dbg_remove_all_infoCRYPTO_dbg_set_optionsCRYPTO_destroy_dynlockidCRYPTO_dup_ex_dataCRYPTO_ex_data_new_classCRYPTO_freeCRYPTO_free_ex_dataCRYPTO_free_lockedCRYPTO_get_add_lock_callbackCRYPTO_get_dynlock_create_callbackCRYPTO_get_dynlock_destroy_callbackCRYPTO_get_dynlock_lock_callbackCRYPTO_get_dynlock_valueCRYPTO_get_ex_dataCRYPTO_get_ex_data_implementationCRYPTO_get_ex_new_indexCRYPTO_get_id_callbackCRYPTO_get_lock_nameCRYPTO_get_locked_mem_ex_functionsCRYPTO_get_locked_mem_functionsCRYPTO_get_locking_callbackCRYPTO_get_mem_debug_functionsCRYPTO_get_mem_debug_optionsCRYPTO_get_mem_ex_functionsCRYPTO_get_mem_functionsCRYPTO_get_new_dynlockidCRYPTO_get_new_lockidCRYPTO_is_mem_check_onCRYPTO_lockCRYPTO_mallocCRYPTO_malloc_debug_initCRYPTO_malloc_lockedCRYPTO_mem_ctrlCRYPTO_mem_leaksCRYPTO_mem_leaks_cbCRYPTO_mem_leaks_fpCRYPTO_new_ex_dataCRYPTO_num_locksCRYPTO_pop_infoCRYPTO_push_info_CRYPTO_reallocCRYPTO_realloc_cleanCRYPTO_remallocCRYPTO_remove_all_infoCRYPTO_set_add_lock_callbackCRYPTO_set_dynlock_create_callbackCRYPTO_set_dynlock_destroy_callbackCRYPTO_set_dynlock_lock_callbackCRYPTO_set_ex_dataCRYPTO_set_ex_data_implementationCRYPTO_set_id_callbackCRYPTO_set_locked_mem_ex_functionsCRYPTO_set_locked_mem_functionsCRYPTO_set_locking_callbackCRYPTO_set_mem_debug_functionsCRYPTO_set_mem_debug_optionsCRYPTO_set_mem_ex_functionsCRYPTO_set_mem_functionsCRYPTO_set_mem_info_functionsCRYPTO_strdupCRYPTO_thread_idDES_cbc_cksumDES_cbc_encryptDES_cfb64_encryptDES_cfb_encryptDES_check_key_parityDES_cryptDES_decrypt3DES_ecb3_encryptDES_ecb_encryptDES_ede3_cbc_encryptDES_ede3_cbcm_encryptDES_ede3_cfb64_encryptDES_ede3_cfb_encryptDES_ede3_ofb64_encryptDES_enc_readDES_enc_writeDES_encrypt1DES_encrypt2DES_encrypt3DES_fcryptDES_is_weak_keyDES_key_schedDES_ncbc_encryptDES_ofb64_encryptDES_ofb_encryptDES_optionsDES_pcbc_encryptDES_quad_cksumDES_random_keyDES_read_2passwordsDES_read_passwordDES_set_keyDES_set_key_checkedDES_set_key_uncheckedDES_set_odd_parityDES_string_to_2keysDES_string_to_keyDES_xcbc_encryptDH_OpenSSLDH_checkDH_check_pub_keyDH_compute_keyDH_freeDH_generate_keyDH_generate_parametersDH_generate_parameters_exDH_get_default_methodDH_get_ex_dataDH_get_ex_new_indexDH_newDH_new_methodDH_set_default_methodDH_set_ex_dataDH_set_methodDH_sizeDH_up_refDHparams_printDHparams_print_fpDIRECTORYSTRING_freeDIRECTORYSTRING_itDIRECTORYSTRING_newDISPLAYTEXT_freeDISPLAYTEXT_itDISPLAYTEXT_newDIST_POINT_NAME_freeDIST_POINT_NAME_itDIST_POINT_NAME_newDIST_POINT_freeDIST_POINT_itDIST_POINT_newDSA_OpenSSLDSA_SIG_freeDSA_SIG_newDSA_do_signDSA_do_verifyDSA_dup_DHDSA_freeDSA_generate_keyDSA_generate_parametersDSA_generate_parameters_exDSA_get_default_methodDSA_get_ex_dataDSA_get_ex_new_indexDSA_newDSA_new_methodDSA_printDSA_print_fpDSA_set_default_methodDSA_set_ex_dataDSA_set_methodDSA_signDSA_sign_setupDSA_sizeDSA_up_refDSA_verifyDSAparams_printDSAparams_print_fpDSO_METHOD_dlDSO_METHOD_dlfcnDSO_METHOD_nullDSO_METHOD_opensslDSO_METHOD_vmsDSO_METHOD_win32DSO_bind_funcDSO_bind_varDSO_convert_filenameDSO_ctrlDSO_flagsDSO_freeDSO_get_default_methodDSO_get_filenameDSO_get_loaded_filenameDSO_get_methodDSO_loadDSO_mergeDSO_newDSO_new_methodDSO_set_default_methodDSO_set_filenameDSO_set_methodDSO_set_name_converterDSO_up_refECDH_OpenSSLECDH_compute_keyECDH_get_default_methodECDH_get_ex_dataECDH_get_ex_new_indexECDH_set_default_methodECDH_set_ex_dataECDH_set_methodECDSA_OpenSSLECDSA_SIG_freeECDSA_SIG_newECDSA_do_signECDSA_do_sign_exECDSA_do_verifyECDSA_get_default_methodECDSA_get_ex_dataECDSA_get_ex_new_indexECDSA_set_default_methodECDSA_set_ex_dataECDSA_set_methodECDSA_signECDSA_sign_exECDSA_sign_setupECDSA_sizeECDSA_verifyECPKParameters_printECPKParameters_print_fpECParameters_printECParameters_print_fpEC_GF2m_simple_methodEC_GFp_mont_methodEC_GFp_nist_methodEC_GFp_simple_methodEC_GROUP_checkEC_GROUP_check_discriminantEC_GROUP_clear_freeEC_GROUP_cmpEC_GROUP_copyEC_GROUP_dupEC_GROUP_freeEC_GROUP_get0_generatorEC_GROUP_get0_seedEC_GROUP_get_asn1_flagEC_GROUP_get_basis_typeEC_GROUP_get_cofactorEC_GROUP_get_curve_GF2mEC_GROUP_get_curve_GFpEC_GROUP_get_curve_nameEC_GROUP_get_degreeEC_GROUP_get_orderEC_GROUP_get_pentanomial_basisEC_GROUP_get_point_conversion_formEC_GROUP_get_seed_lenEC_GROUP_get_trinomial_basisEC_GROUP_have_precompute_multEC_GROUP_method_ofEC_GROUP_newEC_GROUP_new_by_curve_nameEC_GROUP_new_curve_GF2mEC_GROUP_new_curve_GFpEC_GROUP_precompute_multEC_GROUP_set_asn1_flagEC_GROUP_set_curve_GF2mEC_GROUP_set_curve_GFpEC_GROUP_set_curve_nameEC_GROUP_set_generatorEC_GROUP_set_point_conversion_formEC_GROUP_set_seedEC_KEY_check_keyEC_KEY_copyEC_KEY_dupEC_KEY_freeEC_KEY_generate_keyEC_KEY_get0_groupEC_KEY_get0_private_keyEC_KEY_get0_public_keyEC_KEY_get_conv_formEC_KEY_get_enc_flagsEC_KEY_get_key_method_dataEC_KEY_insert_key_method_dataEC_KEY_newEC_KEY_new_by_curve_nameEC_KEY_precompute_multEC_KEY_printEC_KEY_print_fpEC_KEY_set_asn1_flagEC_KEY_set_conv_formEC_KEY_set_enc_flagsEC_KEY_set_groupEC_KEY_set_private_keyEC_KEY_set_public_keyEC_KEY_up_refEC_METHOD_get_field_typeEC_POINT_addEC_POINT_bn2pointEC_POINT_clear_freeEC_POINT_cmpEC_POINT_copyEC_POINT_dblEC_POINT_dupEC_POINT_freeEC_POINT_get_Jprojective_coordinates_GFpEC_POINT_get_affine_coordinates_GF2mEC_POINT_get_affine_coordinates_GFpEC_POINT_hex2pointEC_POINT_invertEC_POINT_is_at_infinityEC_POINT_is_on_curveEC_POINT_make_affineEC_POINT_method_ofEC_POINT_mulEC_POINT_newEC_POINT_oct2pointEC_POINT_point2bnEC_POINT_point2hexEC_POINT_point2octEC_POINT_set_Jprojective_coordinates_GFpEC_POINT_set_affine_coordinates_GF2mEC_POINT_set_affine_coordinates_GFpEC_POINT_set_compressed_coordinates_GF2mEC_POINT_set_compressed_coordinates_GFpEC_POINT_set_to_infinityEC_POINTs_make_affineEC_POINTs_mulEC_get_builtin_curvesEDIPARTYNAME_freeEDIPARTYNAME_itEDIPARTYNAME_newENGINE_addENGINE_add_conf_moduleENGINE_by_idENGINE_cleanupENGINE_cmd_is_executableENGINE_ctrlENGINE_ctrl_cmdENGINE_ctrl_cmd_stringENGINE_finishENGINE_freeENGINE_get_DHENGINE_get_DSAENGINE_get_ECDHENGINE_get_ECDSAENGINE_get_RANDENGINE_get_RSAENGINE_get_STOREENGINE_get_cipherENGINE_get_cipher_engineENGINE_get_ciphersENGINE_get_cmd_defnsENGINE_get_ctrl_functionENGINE_get_default_DHENGINE_get_default_DSAENGINE_get_default_ECDHENGINE_get_default_ECDSAENGINE_get_default_RANDENGINE_get_default_RSAENGINE_get_destroy_functionENGINE_get_digestENGINE_get_digest_engineENGINE_get_digestsENGINE_get_ex_dataENGINE_get_ex_new_indexENGINE_get_finish_functionENGINE_get_firstENGINE_get_flagsENGINE_get_idENGINE_get_init_functionENGINE_get_lastENGINE_get_load_privkey_functionENGINE_get_load_pubkey_functionENGINE_get_nameENGINE_get_nextENGINE_get_prevENGINE_get_ssl_client_cert_functionENGINE_get_static_stateENGINE_get_table_flagsENGINE_initENGINE_load_4758ccaENGINE_load_aepENGINE_load_atallaENGINE_load_builtin_enginesENGINE_load_chilENGINE_load_cryptodevENGINE_load_cswiftENGINE_load_dynamicENGINE_load_nuronENGINE_load_opensslENGINE_load_padlockENGINE_load_private_keyENGINE_load_public_keyENGINE_load_ssl_client_certENGINE_load_surewareENGINE_load_ubsecENGINE_newENGINE_register_DHENGINE_register_DSAENGINE_register_ECDHENGINE_register_ECDSAENGINE_register_RANDENGINE_register_RSAENGINE_register_STOREENGINE_register_all_DHENGINE_register_all_DSAENGINE_register_all_ECDHENGINE_register_all_ECDSAENGINE_register_all_RANDENGINE_register_all_RSAENGINE_register_all_STOREENGINE_register_all_ciphersENGINE_register_all_completeENGINE_register_all_digestsENGINE_register_ciphersENGINE_register_completeENGINE_register_digestsENGINE_removeENGINE_set_DHENGINE_set_DSAENGINE_set_ECDHENGINE_set_ECDSAENGINE_set_RANDENGINE_set_RSAENGINE_set_STOREENGINE_set_ciphersENGINE_set_cmd_defnsENGINE_set_ctrl_functionENGINE_set_defaultENGINE_set_default_DHENGINE_set_default_DSAENGINE_set_default_ECDHENGINE_set_default_ECDSAENGINE_set_default_RANDENGINE_set_default_RSAENGINE_set_default_ciphersENGINE_set_default_digestsENGINE_set_default_stringENGINE_set_destroy_functionENGINE_set_digestsENGINE_set_ex_dataENGINE_set_finish_functionENGINE_set_flagsENGINE_set_idENGINE_set_init_functionENGINE_set_load_privkey_functionENGINE_set_load_pubkey_functionENGINE_set_load_ssl_client_cert_functionENGINE_set_nameENGINE_set_table_flagsENGINE_unregister_DHENGINE_unregister_DSAENGINE_unregister_ECDHENGINE_unregister_ECDSAENGINE_unregister_RANDENGINE_unregister_RSAENGINE_unregister_STOREENGINE_unregister_ciphersENGINE_unregister_digestsENGINE_up_refERR_add_error_dataERR_clear_errorERR_error_stringERR_error_string_nERR_free_stringsERR_func_error_stringERR_get_err_state_tableERR_get_errorERR_get_error_lineERR_get_error_line_dataERR_get_implementationERR_get_next_error_libraryERR_get_stateERR_get_string_tableERR_lib_error_stringERR_load_ASN1_stringsERR_load_BIO_stringsERR_load_BN_stringsERR_load_BUF_stringsERR_load_COMP_stringsERR_load_CONF_stringsERR_load_CRYPTO_stringsERR_load_DH_stringsERR_load_DSA_stringsERR_load_DSO_stringsERR_load_ECDH_stringsERR_load_ECDSA_stringsERR_load_EC_stringsERR_load_ENGINE_stringsERR_load_ERR_stringsERR_load_EVP_stringsERR_load_OBJ_stringsERR_load_OCSP_stringsERR_load_PEM_stringsERR_load_PKCS12_stringsERR_load_PKCS7_stringsERR_load_RAND_stringsERR_load_RSA_stringsERR_load_STORE_stringsERR_load_UI_stringsERR_load_X509V3_stringsERR_load_X509_stringsERR_load_crypto_stringsERR_load_stringsERR_peek_errorERR_peek_error_lineERR_peek_error_line_dataERR_peek_last_errorERR_peek_last_error_lineERR_peek_last_error_line_dataERR_pop_to_markERR_print_errorsERR_print_errors_cbERR_print_errors_fpERR_put_errorERR_reason_error_stringERR_release_err_state_tableERR_remove_stateERR_set_error_dataERR_set_implementationERR_set_markERR_unload_stringsEVP_BytesToKeyEVP_CIPHER_CTX_block_sizeEVP_CIPHER_CTX_cipherEVP_CIPHER_CTX_cleanupEVP_CIPHER_CTX_clear_flagsEVP_CIPHER_CTX_ctrlEVP_CIPHER_CTX_flagsEVP_CIPHER_CTX_freeEVP_CIPHER_CTX_get_app_dataEVP_CIPHER_CTX_initEVP_CIPHER_CTX_iv_lengthEVP_CIPHER_CTX_key_lengthEVP_CIPHER_CTX_newEVP_CIPHER_CTX_nidEVP_CIPHER_CTX_rand_keyEVP_CIPHER_CTX_set_app_dataEVP_CIPHER_CTX_set_flagsEVP_CIPHER_CTX_set_key_lengthEVP_CIPHER_CTX_set_paddingEVP_CIPHER_CTX_test_flagsEVP_CIPHER_asn1_to_paramEVP_CIPHER_block_sizeEVP_CIPHER_flagsEVP_CIPHER_get_asn1_ivEVP_CIPHER_iv_lengthEVP_CIPHER_key_lengthEVP_CIPHER_nidEVP_CIPHER_param_to_asn1EVP_CIPHER_set_asn1_ivEVP_CIPHER_typeEVP_CipherEVP_CipherFinalEVP_CipherFinal_exEVP_CipherInitEVP_CipherInit_exEVP_CipherUpdateEVP_DecodeBlockEVP_DecodeFinalEVP_DecodeInitEVP_DecodeUpdateEVP_DecryptFinalEVP_DecryptFinal_exEVP_DecryptInitEVP_DecryptInit_exEVP_DecryptUpdateEVP_DigestEVP_DigestFinalEVP_DigestFinal_exEVP_DigestInitEVP_DigestInit_exEVP_DigestUpdateEVP_EncodeBlockEVP_EncodeFinalEVP_EncodeInitEVP_EncodeUpdateEVP_EncryptFinalEVP_EncryptFinal_exEVP_EncryptInitEVP_EncryptInit_exEVP_EncryptUpdateEVP_MD_CTX_cleanupEVP_MD_CTX_clear_flagsEVP_MD_CTX_copyEVP_MD_CTX_copy_exEVP_MD_CTX_createEVP_MD_CTX_destroyEVP_MD_CTX_initEVP_MD_CTX_mdEVP_MD_CTX_set_flagsEVP_MD_CTX_test_flagsEVP_MD_block_sizeEVP_MD_pkey_typeEVP_MD_sizeEVP_MD_typeEVP_OpenFinalEVP_OpenInitEVP_PBE_CipherInitEVP_PBE_alg_addEVP_PBE_cleanupEVP_PKCS82PKEYEVP_PKEY2PKCS8EVP_PKEY2PKCS8_brokenEVP_PKEY_add1_attrEVP_PKEY_add1_attr_by_NIDEVP_PKEY_add1_attr_by_OBJEVP_PKEY_add1_attr_by_txtEVP_PKEY_assignEVP_PKEY_bitsEVP_PKEY_cmpEVP_PKEY_cmp_parametersEVP_PKEY_copy_parametersEVP_PKEY_decryptEVP_PKEY_delete_attrEVP_PKEY_encryptEVP_PKEY_freeEVP_PKEY_get1_DHEVP_PKEY_get1_DSAEVP_PKEY_get1_EC_KEYEVP_PKEY_get1_RSAEVP_PKEY_get_attrEVP_PKEY_get_attr_by_NIDEVP_PKEY_get_attr_by_OBJEVP_PKEY_get_attr_countEVP_PKEY_missing_parametersEVP_PKEY_newEVP_PKEY_save_parametersEVP_PKEY_set1_DHEVP_PKEY_set1_DSAEVP_PKEY_set1_EC_KEYEVP_PKEY_set1_RSAEVP_PKEY_sizeEVP_PKEY_typeEVP_SealFinalEVP_SealInitEVP_SignFinalEVP_VerifyFinalEVP_add_alg_moduleEVP_add_cipherEVP_add_digestEVP_aes_128_cbcEVP_aes_128_cfb1EVP_aes_128_cfb128EVP_aes_128_cfb8EVP_aes_128_ecbEVP_aes_128_ofbEVP_aes_192_cbcEVP_aes_192_cfb1EVP_aes_192_cfb128EVP_aes_192_cfb8EVP_aes_192_ecbEVP_aes_192_ofbEVP_aes_256_cbcEVP_aes_256_cfb1EVP_aes_256_cfb128EVP_aes_256_cfb8EVP_aes_256_ecbEVP_aes_256_ofbEVP_bf_cbcEVP_bf_cfb64EVP_bf_ecbEVP_bf_ofbEVP_cast5_cbcEVP_cast5_cfb64EVP_cast5_ecbEVP_cast5_ofbEVP_cleanupEVP_des_cbcEVP_des_cfb1EVP_des_cfb64EVP_des_cfb8EVP_des_ecbEVP_des_edeEVP_des_ede3EVP_des_ede3_cbcEVP_des_ede3_cfb1EVP_des_ede3_cfb64EVP_des_ede3_cfb8EVP_des_ede3_ecbEVP_des_ede3_ofbEVP_des_ede_cbcEVP_des_ede_cfb64EVP_des_ede_ecbEVP_des_ede_ofbEVP_des_ofbEVP_desx_cbcEVP_dssEVP_dss1EVP_ecdsaEVP_enc_nullEVP_get_cipherbynameEVP_get_digestbynameEVP_get_pw_promptEVP_idea_cbcEVP_idea_cfb64EVP_idea_ecbEVP_idea_ofbEVP_md2EVP_md4EVP_md5EVP_md_nullEVP_rc2_40_cbcEVP_rc2_64_cbcEVP_rc2_cbcEVP_rc2_cfb64EVP_rc2_ecbEVP_rc2_ofbEVP_rc4EVP_rc4_40EVP_read_pw_stringEVP_ripemd160EVP_set_pw_promptEVP_shaEVP_sha1EVP_sha224EVP_sha256EVP_sha384EVP_sha512EXTENDED_KEY_USAGE_freeEXTENDED_KEY_USAGE_itEXTENDED_KEY_USAGE_newGENERAL_NAMES_freeGENERAL_NAMES_itGENERAL_NAMES_newGENERAL_NAME_freeGENERAL_NAME_itGENERAL_NAME_newGENERAL_NAME_printGENERAL_SUBTREE_freeGENERAL_SUBTREE_itGENERAL_SUBTREE_newHMACHMAC_CTX_cleanupHMAC_CTX_initHMAC_CTX_set_flagsHMAC_FinalHMAC_InitHMAC_Init_exHMAC_UpdateKRB5_APREQBODY_freeKRB5_APREQBODY_itKRB5_APREQBODY_newKRB5_APREQ_freeKRB5_APREQ_itKRB5_APREQ_newKRB5_AUTHDATA_freeKRB5_AUTHDATA_itKRB5_AUTHDATA_newKRB5_AUTHENTBODY_freeKRB5_AUTHENTBODY_itKRB5_AUTHENTBODY_newKRB5_AUTHENT_freeKRB5_AUTHENT_itKRB5_AUTHENT_newKRB5_CHECKSUM_freeKRB5_CHECKSUM_itKRB5_CHECKSUM_newKRB5_ENCDATA_freeKRB5_ENCDATA_itKRB5_ENCDATA_newKRB5_ENCKEY_freeKRB5_ENCKEY_itKRB5_ENCKEY_newKRB5_PRINCNAME_freeKRB5_PRINCNAME_itKRB5_PRINCNAME_newKRB5_TICKET_freeKRB5_TICKET_itKRB5_TICKET_newKRB5_TKTBODY_freeKRB5_TKTBODY_itKRB5_TKTBODY_newLONG_itMD2MD2_FinalMD2_InitMD2_UpdateMD2_optionsMD4MD4_FinalMD4_InitMD4_TransformMD4_UpdateMD5MD5_FinalMD5_InitMD5_TransformMD5_UpdateNAME_CONSTRAINTS_freeNAME_CONSTRAINTS_itNAME_CONSTRAINTS_newNCONF_WIN32NCONF_defaultNCONF_dump_bioNCONF_dump_fpNCONF_freeNCONF_free_dataNCONF_get_number_eNCONF_get_sectionNCONF_get_stringNCONF_loadNCONF_load_bioNCONF_load_fpNCONF_newNETSCAPE_CERT_SEQUENCE_freeNETSCAPE_CERT_SEQUENCE_itNETSCAPE_CERT_SEQUENCE_newNETSCAPE_SPKAC_freeNETSCAPE_SPKAC_itNETSCAPE_SPKAC_newNETSCAPE_SPKI_b64_decodeNETSCAPE_SPKI_b64_encodeNETSCAPE_SPKI_freeNETSCAPE_SPKI_get_pubkeyNETSCAPE_SPKI_itNETSCAPE_SPKI_newNETSCAPE_SPKI_printNETSCAPE_SPKI_set_pubkeyNETSCAPE_SPKI_signNETSCAPE_SPKI_verifyNOTICEREF_freeNOTICEREF_itNOTICEREF_newOBJ_NAME_addOBJ_NAME_cleanupOBJ_NAME_do_allOBJ_NAME_do_all_sortedOBJ_NAME_getOBJ_NAME_initOBJ_NAME_new_indexOBJ_NAME_removeOBJ_add_objectOBJ_bsearchOBJ_bsearch_exOBJ_cleanupOBJ_cmpOBJ_createOBJ_create_objectsOBJ_dupOBJ_ln2nidOBJ_new_nidOBJ_nid2lnOBJ_nid2objOBJ_nid2snOBJ_obj2nidOBJ_obj2txtOBJ_sn2nidOBJ_txt2nidOBJ_txt2objOCSP_BASICRESP_add1_ext_i2dOCSP_BASICRESP_add_extOCSP_BASICRESP_delete_extOCSP_BASICRESP_freeOCSP_BASICRESP_get1_ext_d2iOCSP_BASICRESP_get_extOCSP_BASICRESP_get_ext_by_NIDOCSP_BASICRESP_get_ext_by_OBJOCSP_BASICRESP_get_ext_by_criticalOCSP_BASICRESP_get_ext_countOCSP_BASICRESP_itOCSP_BASICRESP_newOCSP_CERTID_freeOCSP_CERTID_itOCSP_CERTID_newOCSP_CERTSTATUS_freeOCSP_CERTSTATUS_itOCSP_CERTSTATUS_newOCSP_CRLID_freeOCSP_CRLID_itOCSP_CRLID_newOCSP_ONEREQ_add1_ext_i2dOCSP_ONEREQ_add_extOCSP_ONEREQ_delete_extOCSP_ONEREQ_freeOCSP_ONEREQ_get1_ext_d2iOCSP_ONEREQ_get_extOCSP_ONEREQ_get_ext_by_NIDOCSP_ONEREQ_get_ext_by_OBJOCSP_ONEREQ_get_ext_by_criticalOCSP_ONEREQ_get_ext_countOCSP_ONEREQ_itOCSP_ONEREQ_newOCSP_REQINFO_freeOCSP_REQINFO_itOCSP_REQINFO_newOCSP_REQUEST_add1_ext_i2dOCSP_REQUEST_add_extOCSP_REQUEST_delete_extOCSP_REQUEST_freeOCSP_REQUEST_get1_ext_d2iOCSP_REQUEST_get_extOCSP_REQUEST_get_ext_by_NIDOCSP_REQUEST_get_ext_by_OBJOCSP_REQUEST_get_ext_by_criticalOCSP_REQUEST_get_ext_countOCSP_REQUEST_itOCSP_REQUEST_newOCSP_REQUEST_printOCSP_REQ_CTX_freeOCSP_RESPBYTES_freeOCSP_RESPBYTES_itOCSP_RESPBYTES_newOCSP_RESPDATA_freeOCSP_RESPDATA_itOCSP_RESPDATA_newOCSP_RESPID_freeOCSP_RESPID_itOCSP_RESPID_newOCSP_RESPONSE_freeOCSP_RESPONSE_itOCSP_RESPONSE_newOCSP_RESPONSE_printOCSP_REVOKEDINFO_freeOCSP_REVOKEDINFO_itOCSP_REVOKEDINFO_newOCSP_SERVICELOC_freeOCSP_SERVICELOC_itOCSP_SERVICELOC_newOCSP_SIGNATURE_freeOCSP_SIGNATURE_itOCSP_SIGNATURE_newOCSP_SINGLERESP_add1_ext_i2dOCSP_SINGLERESP_add_extOCSP_SINGLERESP_delete_extOCSP_SINGLERESP_freeOCSP_SINGLERESP_get1_ext_d2iOCSP_SINGLERESP_get_extOCSP_SINGLERESP_get_ext_by_NIDOCSP_SINGLERESP_get_ext_by_OBJOCSP_SINGLERESP_get_ext_by_criticalOCSP_SINGLERESP_get_ext_countOCSP_SINGLERESP_itOCSP_SINGLERESP_newOCSP_accept_responses_newOCSP_archive_cutoff_newOCSP_basic_add1_certOCSP_basic_add1_nonceOCSP_basic_add1_statusOCSP_basic_signOCSP_basic_verifyOCSP_cert_id_newOCSP_cert_status_strOCSP_cert_to_idOCSP_check_nonceOCSP_check_validityOCSP_copy_nonceOCSP_crlID_newOCSP_crl_reason_strOCSP_id_cmpOCSP_id_get0_infoOCSP_id_issuer_cmpOCSP_onereq_get0_idOCSP_parse_urlOCSP_request_add0_idOCSP_request_add1_certOCSP_request_add1_nonceOCSP_request_is_signedOCSP_request_onereq_countOCSP_request_onereq_get0OCSP_request_set1_nameOCSP_request_signOCSP_request_verifyOCSP_resp_countOCSP_resp_findOCSP_resp_find_statusOCSP_resp_get0OCSP_response_createOCSP_response_get1_basicOCSP_response_statusOCSP_response_status_strOCSP_sendreq_bioOCSP_sendreq_nbioOCSP_sendreq_newOCSP_single_get0_statusOCSP_url_svcloc_newOPENSSL_DIR_endOPENSSL_DIR_readOPENSSL_add_all_algorithms_confOPENSSL_add_all_algorithms_noconfOPENSSL_cleanseOPENSSL_configOPENSSL_ia32cap_locOPENSSL_initOPENSSL_isserviceOPENSSL_issetugidOPENSSL_load_builtin_modulesOPENSSL_no_configOSSL_DES_versionOSSL_libdes_versionOTHERNAME_freeOTHERNAME_itOTHERNAME_newOpenSSLDieOpenSSL_add_all_ciphersOpenSSL_add_all_digestsPBE2PARAM_freePBE2PARAM_itPBE2PARAM_newPBEPARAM_freePBEPARAM_itPBEPARAM_newPBKDF2PARAM_freePBKDF2PARAM_itPBKDF2PARAM_newPEM_ASN1_readPEM_ASN1_read_bioPEM_ASN1_writePEM_ASN1_write_bioPEM_SealFinalPEM_SealInitPEM_SealUpdatePEM_SignFinalPEM_SignInitPEM_SignUpdatePEM_X509_INFO_readPEM_X509_INFO_read_bioPEM_X509_INFO_write_bioPEM_bytes_read_bioPEM_def_callbackPEM_dek_infoPEM_do_headerPEM_get_EVP_CIPHER_INFOPEM_proc_typePEM_readPEM_read_DHparamsPEM_read_DSAPrivateKeyPEM_read_DSA_PUBKEYPEM_read_DSAparamsPEM_read_ECPKParametersPEM_read_ECPrivateKeyPEM_read_EC_PUBKEYPEM_read_NETSCAPE_CERT_SEQUENCEPEM_read_PKCS7PEM_read_PKCS8PEM_read_PKCS8_PRIV_KEY_INFOPEM_read_PUBKEYPEM_read_PrivateKeyPEM_read_RSAPrivateKeyPEM_read_RSAPublicKeyPEM_read_RSA_PUBKEYPEM_read_X509PEM_read_X509_AUXPEM_read_X509_CERT_PAIRPEM_read_X509_CRLPEM_read_X509_REQPEM_read_bioPEM_read_bio_DHparamsPEM_read_bio_DSAPrivateKeyPEM_read_bio_DSA_PUBKEYPEM_read_bio_DSAparamsPEM_read_bio_ECPKParametersPEM_read_bio_ECPrivateKeyPEM_read_bio_EC_PUBKEYPEM_read_bio_NETSCAPE_CERT_SEQUENCEPEM_read_bio_PKCS7PEM_read_bio_PKCS8PEM_read_bio_PKCS8_PRIV_KEY_INFOPEM_read_bio_PUBKEYPEM_read_bio_PrivateKeyPEM_read_bio_RSAPrivateKeyPEM_read_bio_RSAPublicKeyPEM_read_bio_RSA_PUBKEYPEM_read_bio_X509PEM_read_bio_X509_AUXPEM_read_bio_X509_CERT_PAIRPEM_read_bio_X509_CRLPEM_read_bio_X509_REQPEM_writePEM_write_DHparamsPEM_write_DSAPrivateKeyPEM_write_DSA_PUBKEYPEM_write_DSAparamsPEM_write_ECPKParametersPEM_write_ECPrivateKeyPEM_write_EC_PUBKEYPEM_write_NETSCAPE_CERT_SEQUENCEPEM_write_PKCS7PEM_write_PKCS8PEM_write_PKCS8PrivateKeyPEM_write_PKCS8PrivateKey_nidPEM_write_PKCS8_PRIV_KEY_INFOPEM_write_PUBKEYPEM_write_PrivateKeyPEM_write_RSAPrivateKeyPEM_write_RSAPublicKeyPEM_write_RSA_PUBKEYPEM_write_X509PEM_write_X509_AUXPEM_write_X509_CERT_PAIRPEM_write_X509_CRLPEM_write_X509_REQPEM_write_X509_REQ_NEWPEM_write_bioPEM_write_bio_DHparamsPEM_write_bio_DSAPrivateKeyPEM_write_bio_DSA_PUBKEYPEM_write_bio_DSAparamsPEM_write_bio_ECPKParametersPEM_write_bio_ECPrivateKeyPEM_write_bio_EC_PUBKEYPEM_write_bio_NETSCAPE_CERT_SEQUENCEPEM_write_bio_PKCS7PEM_write_bio_PKCS8PEM_write_bio_PKCS8PrivateKeyPEM_write_bio_PKCS8PrivateKey_nidPEM_write_bio_PKCS8_PRIV_KEY_INFOPEM_write_bio_PUBKEYPEM_write_bio_PrivateKeyPEM_write_bio_RSAPrivateKeyPEM_write_bio_RSAPublicKeyPEM_write_bio_RSA_PUBKEYPEM_write_bio_X509PEM_write_bio_X509_AUXPEM_write_bio_X509_CERT_PAIRPEM_write_bio_X509_CRLPEM_write_bio_X509_REQPEM_write_bio_X509_REQ_NEWPKCS12_AUTHSAFES_itPKCS12_BAGS_freePKCS12_BAGS_itPKCS12_BAGS_newPKCS12_MAC_DATA_freePKCS12_MAC_DATA_itPKCS12_MAC_DATA_newPKCS12_MAKE_KEYBAGPKCS12_MAKE_SHKEYBAGPKCS12_PBE_addPKCS12_PBE_keyivgenPKCS12_SAFEBAGS_itPKCS12_SAFEBAG_freePKCS12_SAFEBAG_itPKCS12_SAFEBAG_newPKCS12_add_CSPName_ascPKCS12_add_certPKCS12_add_friendlyname_ascPKCS12_add_friendlyname_uniPKCS12_add_keyPKCS12_add_localkeyidPKCS12_add_safePKCS12_add_safesPKCS12_certbag2x509PKCS12_certbag2x509crlPKCS12_createPKCS12_decrypt_skeyPKCS12_freePKCS12_gen_macPKCS12_get_attr_genPKCS12_get_friendlynamePKCS12_initPKCS12_itPKCS12_item_decrypt_d2iPKCS12_item_i2d_encryptPKCS12_item_pack_safebagPKCS12_key_gen_ascPKCS12_key_gen_uniPKCS12_newPKCS12_newpassPKCS12_pack_authsafesPKCS12_pack_p7dataPKCS12_pack_p7encdataPKCS12_parsePKCS12_pbe_cryptPKCS12_set_macPKCS12_setup_macPKCS12_unpack_authsafesPKCS12_unpack_p7dataPKCS12_unpack_p7encdataPKCS12_verify_macPKCS12_x5092certbagPKCS12_x509crl2certbagPKCS1_MGF1PKCS5_PBE_addPKCS5_PBE_keyivgenPKCS5_PBKDF2_HMAC_SHA1PKCS5_pbe2_setPKCS5_pbe_setPKCS5_v2_PBE_keyivgenPKCS7_ATTR_SIGN_itPKCS7_ATTR_VERIFY_itPKCS7_DIGEST_freePKCS7_DIGEST_itPKCS7_DIGEST_newPKCS7_ENCRYPT_freePKCS7_ENCRYPT_itPKCS7_ENCRYPT_newPKCS7_ENC_CONTENT_freePKCS7_ENC_CONTENT_itPKCS7_ENC_CONTENT_newPKCS7_ENVELOPE_freePKCS7_ENVELOPE_itPKCS7_ENVELOPE_newPKCS7_ISSUER_AND_SERIAL_digestPKCS7_ISSUER_AND_SERIAL_freePKCS7_ISSUER_AND_SERIAL_itPKCS7_ISSUER_AND_SERIAL_newPKCS7_RECIP_INFO_freePKCS7_RECIP_INFO_itPKCS7_RECIP_INFO_newPKCS7_RECIP_INFO_setPKCS7_SIGNED_freePKCS7_SIGNED_itPKCS7_SIGNED_newPKCS7_SIGNER_INFO_freePKCS7_SIGNER_INFO_itPKCS7_SIGNER_INFO_newPKCS7_SIGNER_INFO_setPKCS7_SIGN_ENVELOPE_freePKCS7_SIGN_ENVELOPE_itPKCS7_SIGN_ENVELOPE_newPKCS7_add_attrib_smimecapPKCS7_add_attributePKCS7_add_certificatePKCS7_add_crlPKCS7_add_recipientPKCS7_add_recipient_infoPKCS7_add_signaturePKCS7_add_signed_attributePKCS7_add_signerPKCS7_cert_from_signer_infoPKCS7_content_newPKCS7_ctrlPKCS7_dataDecodePKCS7_dataFinalPKCS7_dataInitPKCS7_dataVerifyPKCS7_decryptPKCS7_digest_from_attributesPKCS7_dupPKCS7_encryptPKCS7_freePKCS7_get0_signersPKCS7_get_attributePKCS7_get_issuer_and_serialPKCS7_get_signed_attributePKCS7_get_signer_infoPKCS7_get_smimecapPKCS7_itPKCS7_newPKCS7_set0_type_otherPKCS7_set_attributesPKCS7_set_cipherPKCS7_set_contentPKCS7_set_digestPKCS7_set_signed_attributesPKCS7_set_typePKCS7_signPKCS7_signatureVerifyPKCS7_simple_smimecapPKCS7_verifyPKCS8_PRIV_KEY_INFO_freePKCS8_PRIV_KEY_INFO_itPKCS8_PRIV_KEY_INFO_newPKCS8_add_keyusagePKCS8_decryptPKCS8_encryptPKCS8_set_brokenPKEY_USAGE_PERIOD_freePKEY_USAGE_PERIOD_itPKEY_USAGE_PERIOD_newPOLICYINFO_freePOLICYINFO_itPOLICYINFO_newPOLICYQUALINFO_freePOLICYQUALINFO_itPOLICYQUALINFO_newPOLICY_CONSTRAINTS_freePOLICY_CONSTRAINTS_itPOLICY_CONSTRAINTS_newPOLICY_MAPPINGS_itPOLICY_MAPPING_freePOLICY_MAPPING_itPOLICY_MAPPING_newPROXY_CERT_INFO_EXTENSION_freePROXY_CERT_INFO_EXTENSION_itPROXY_CERT_INFO_EXTENSION_newPROXY_POLICY_freePROXY_POLICY_itPROXY_POLICY_newRAND_SSLeayRAND_addRAND_bytesRAND_cleanupRAND_egdRAND_egd_bytesRAND_eventRAND_file_nameRAND_get_rand_methodRAND_load_fileRAND_pollRAND_pseudo_bytesRAND_query_egd_bytesRAND_screenRAND_seedRAND_set_rand_engineRAND_set_rand_methodRAND_statusRAND_write_fileRC2_cbc_encryptRC2_cfb64_encryptRC2_decryptRC2_ecb_encryptRC2_encryptRC2_ofb64_encryptRC2_set_keyRC4RC4_optionsRC4_set_keyRIPEMD160RIPEMD160_FinalRIPEMD160_InitRIPEMD160_TransformRIPEMD160_UpdateRSAPrivateKey_asn1_methRSAPrivateKey_dupRSAPrivateKey_itRSAPublicKey_dupRSAPublicKey_itRSA_PKCS1_SSLeayRSA_X931_derive_exRSA_X931_generate_key_exRSA_X931_hash_idRSA_blinding_offRSA_blinding_onRSA_check_keyRSA_flagsRSA_freeRSA_generate_keyRSA_generate_key_exRSA_get_default_methodRSA_get_ex_dataRSA_get_ex_new_indexRSA_get_methodRSA_memory_lockRSA_newRSA_new_methodRSA_null_methodRSA_padding_add_PKCS1_OAEPRSA_padding_add_PKCS1_PSSRSA_padding_add_PKCS1_type_1RSA_padding_add_PKCS1_type_2RSA_padding_add_SSLv23RSA_padding_add_X931RSA_padding_add_noneRSA_padding_check_PKCS1_OAEPRSA_padding_check_PKCS1_type_1RSA_padding_check_PKCS1_type_2RSA_padding_check_SSLv23RSA_padding_check_X931RSA_padding_check_noneRSA_printRSA_print_fpRSA_private_decryptRSA_private_encryptRSA_public_decryptRSA_public_encryptRSA_set_default_methodRSA_set_ex_dataRSA_set_methodRSA_setup_blindingRSA_signRSA_sign_ASN1_OCTET_STRINGRSA_sizeRSA_up_refRSA_verifyRSA_verify_ASN1_OCTET_STRINGRSA_verify_PKCS1_PSSSHASHA1SHA1_FinalSHA1_InitSHA1_TransformSHA1_UpdateSHA224SHA224_FinalSHA224_InitSHA224_UpdateSHA256SHA256_FinalSHA256_InitSHA256_TransformSHA256_UpdateSHA384SHA384_FinalSHA384_InitSHA384_UpdateSHA512SHA512_FinalSHA512_InitSHA512_TransformSHA512_UpdateSHA_FinalSHA_InitSHA_TransformSHA_UpdateSMIME_crlf_copySMIME_read_ASN1SMIME_read_PKCS7SMIME_textSMIME_write_PKCS7SSLeaySSLeay_versionSTORE_ATTR_INFO_compareSTORE_ATTR_INFO_freeSTORE_ATTR_INFO_get0_cstrSTORE_ATTR_INFO_get0_dnSTORE_ATTR_INFO_get0_numberSTORE_ATTR_INFO_get0_sha1strSTORE_ATTR_INFO_inSTORE_ATTR_INFO_in_exSTORE_ATTR_INFO_in_rangeSTORE_ATTR_INFO_modify_cstrSTORE_ATTR_INFO_modify_dnSTORE_ATTR_INFO_modify_numberSTORE_ATTR_INFO_modify_sha1strSTORE_ATTR_INFO_newSTORE_ATTR_INFO_set_cstrSTORE_ATTR_INFO_set_dnSTORE_ATTR_INFO_set_numberSTORE_ATTR_INFO_set_sha1strSTORE_MemorySTORE_OBJECT_freeSTORE_OBJECT_newSTORE_create_methodSTORE_ctrlSTORE_delete_arbitrarySTORE_delete_certificateSTORE_delete_crlSTORE_delete_numberSTORE_delete_private_keySTORE_delete_public_keySTORE_destroy_methodSTORE_freeSTORE_generate_crlSTORE_generate_keySTORE_get_arbitrarySTORE_get_certificateSTORE_get_crlSTORE_get_ex_dataSTORE_get_ex_new_indexSTORE_get_methodSTORE_get_numberSTORE_get_private_keySTORE_get_public_keySTORE_list_certificate_endSTORE_list_certificate_endpSTORE_list_certificate_nextSTORE_list_certificate_startSTORE_list_crl_endSTORE_list_crl_endpSTORE_list_crl_nextSTORE_list_crl_startSTORE_list_private_key_endSTORE_list_private_key_endpSTORE_list_private_key_nextSTORE_list_private_key_startSTORE_list_public_key_endSTORE_list_public_key_endpSTORE_list_public_key_nextSTORE_list_public_key_startSTORE_method_get_cleanup_functionSTORE_method_get_ctrl_functionSTORE_method_get_delete_functionSTORE_method_get_generate_functionSTORE_method_get_get_functionSTORE_method_get_initialise_functionSTORE_method_get_list_end_functionSTORE_method_get_list_next_functionSTORE_method_get_list_start_functionSTORE_method_get_lock_store_functionSTORE_method_get_modify_functionSTORE_method_get_revoke_functionSTORE_method_get_store_functionSTORE_method_get_unlock_store_functionSTORE_method_get_update_store_functionSTORE_method_set_cleanup_functionSTORE_method_set_ctrl_functionSTORE_method_set_delete_functionSTORE_method_set_generate_functionSTORE_method_set_get_functionSTORE_method_set_initialise_functionSTORE_method_set_list_end_functionSTORE_method_set_list_next_functionSTORE_method_set_list_start_functionSTORE_method_set_lock_store_functionSTORE_method_set_modify_functionSTORE_method_set_revoke_functionSTORE_method_set_store_functionSTORE_method_set_unlock_store_functionSTORE_method_set_update_store_functionSTORE_modify_arbitrarySTORE_modify_certificateSTORE_modify_crlSTORE_modify_numberSTORE_modify_private_keySTORE_modify_public_keySTORE_new_engineSTORE_new_methodSTORE_parse_attrs_endSTORE_parse_attrs_endpSTORE_parse_attrs_nextSTORE_parse_attrs_startSTORE_revoke_certificateSTORE_revoke_private_keySTORE_revoke_public_keySTORE_set_ex_dataSTORE_set_methodSTORE_store_arbitrarySTORE_store_certificateSTORE_store_crlSTORE_store_numberSTORE_store_private_keySTORE_store_public_keySXNETID_freeSXNETID_itSXNETID_newSXNET_add_id_INTEGERSXNET_add_id_ascSXNET_add_id_ulongSXNET_freeSXNET_get_id_INTEGERSXNET_get_id_ascSXNET_get_id_ulongSXNET_itSXNET_newTXT_DB_create_indexTXT_DB_freeTXT_DB_get_by_indexTXT_DB_insertTXT_DB_readTXT_DB_writeUI_OpenSSLUI_UTIL_read_pwUI_UTIL_read_pw_stringUI_add_error_stringUI_add_info_stringUI_add_input_booleanUI_add_input_stringUI_add_user_dataUI_add_verify_stringUI_construct_promptUI_create_methodUI_ctrlUI_destroy_methodUI_dup_error_stringUI_dup_info_stringUI_dup_input_booleanUI_dup_input_stringUI_dup_verify_stringUI_freeUI_get0_action_stringUI_get0_output_stringUI_get0_resultUI_get0_result_stringUI_get0_test_stringUI_get0_user_dataUI_get_default_methodUI_get_ex_dataUI_get_ex_new_indexUI_get_input_flagsUI_get_methodUI_get_result_maxsizeUI_get_result_minsizeUI_get_string_typeUI_method_get_closerUI_method_get_flusherUI_method_get_openerUI_method_get_readerUI_method_get_writerUI_method_set_closerUI_method_set_flusherUI_method_set_openerUI_method_set_readerUI_method_set_writerUI_newUI_new_methodUI_processUI_set_default_methodUI_set_ex_dataUI_set_methodUI_set_resultUSERNOTICE_freeUSERNOTICE_itUSERNOTICE_newUTF8_getcUTF8_putcX509V3_EXT_CRL_add_confX509V3_EXT_CRL_add_nconfX509V3_EXT_REQ_add_confX509V3_EXT_REQ_add_nconfX509V3_EXT_addX509V3_EXT_add_aliasX509V3_EXT_add_confX509V3_EXT_add_listX509V3_EXT_add_nconfX509V3_EXT_add_nconf_skX509V3_EXT_cleanupX509V3_EXT_confX509V3_EXT_conf_nidX509V3_EXT_d2iX509V3_EXT_getX509V3_EXT_get_nidX509V3_EXT_i2dX509V3_EXT_nconfX509V3_EXT_nconf_nidX509V3_EXT_printX509V3_EXT_print_fpX509V3_EXT_val_prnX509V3_NAME_from_sectionX509V3_add1_i2dX509V3_add_standard_extensionsX509V3_add_valueX509V3_add_value_boolX509V3_add_value_bool_nfX509V3_add_value_intX509V3_add_value_ucharX509V3_conf_freeX509V3_extensions_printX509V3_get_d2iX509V3_get_sectionX509V3_get_stringX509V3_get_value_boolX509V3_get_value_intX509V3_parse_listX509V3_section_freeX509V3_set_conf_lhashX509V3_set_ctxX509V3_set_nconfX509V3_string_freeX509_ALGORS_itX509_ALGOR_dupX509_ALGOR_freeX509_ALGOR_get0X509_ALGOR_itX509_ALGOR_newX509_ALGOR_set0X509_ATTRIBUTE_countX509_ATTRIBUTE_createX509_ATTRIBUTE_create_by_NIDX509_ATTRIBUTE_create_by_OBJX509_ATTRIBUTE_create_by_txtX509_ATTRIBUTE_dupX509_ATTRIBUTE_freeX509_ATTRIBUTE_get0_dataX509_ATTRIBUTE_get0_objectX509_ATTRIBUTE_get0_typeX509_ATTRIBUTE_itX509_ATTRIBUTE_newX509_ATTRIBUTE_set1_dataX509_ATTRIBUTE_set1_objectX509_CERT_AUX_freeX509_CERT_AUX_itX509_CERT_AUX_newX509_CERT_AUX_printX509_CERT_PAIR_freeX509_CERT_PAIR_itX509_CERT_PAIR_newX509_CINF_freeX509_CINF_itX509_CINF_newX509_CRL_INFO_freeX509_CRL_INFO_itX509_CRL_INFO_newX509_CRL_add0_revokedX509_CRL_add1_ext_i2dX509_CRL_add_extX509_CRL_cmpX509_CRL_delete_extX509_CRL_digestX509_CRL_dupX509_CRL_freeX509_CRL_get_extX509_CRL_get_ext_by_NIDX509_CRL_get_ext_by_OBJX509_CRL_get_ext_by_criticalX509_CRL_get_ext_countX509_CRL_get_ext_d2iX509_CRL_itX509_CRL_newX509_CRL_printX509_CRL_print_fpX509_CRL_set_issuer_nameX509_CRL_set_lastUpdateX509_CRL_set_nextUpdateX509_CRL_set_versionX509_CRL_signX509_CRL_sortX509_CRL_verifyX509_EXTENSIONS_itX509_EXTENSION_create_by_NIDX509_EXTENSION_create_by_OBJX509_EXTENSION_dupX509_EXTENSION_freeX509_EXTENSION_get_criticalX509_EXTENSION_get_dataX509_EXTENSION_get_objectX509_EXTENSION_itX509_EXTENSION_newX509_EXTENSION_set_criticalX509_EXTENSION_set_dataX509_EXTENSION_set_objectX509_INFO_freeX509_INFO_newX509_LOOKUP_by_aliasX509_LOOKUP_by_fingerprintX509_LOOKUP_by_issuer_serialX509_LOOKUP_by_subjectX509_LOOKUP_ctrlX509_LOOKUP_fileX509_LOOKUP_freeX509_LOOKUP_hash_dirX509_LOOKUP_initX509_LOOKUP_newX509_LOOKUP_shutdownX509_NAME_ENTRY_create_by_NIDX509_NAME_ENTRY_create_by_OBJX509_NAME_ENTRY_create_by_txtX509_NAME_ENTRY_dupX509_NAME_ENTRY_freeX509_NAME_ENTRY_get_dataX509_NAME_ENTRY_get_objectX509_NAME_ENTRY_itX509_NAME_ENTRY_newX509_NAME_ENTRY_set_dataX509_NAME_ENTRY_set_objectX509_NAME_add_entryX509_NAME_add_entry_by_NIDX509_NAME_add_entry_by_OBJX509_NAME_add_entry_by_txtX509_NAME_cmpX509_NAME_delete_entryX509_NAME_digestX509_NAME_dupX509_NAME_entry_countX509_NAME_freeX509_NAME_get_entryX509_NAME_get_index_by_NIDX509_NAME_get_index_by_OBJX509_NAME_get_text_by_NIDX509_NAME_get_text_by_OBJX509_NAME_hashX509_NAME_itX509_NAME_newX509_NAME_onelineX509_NAME_printX509_NAME_print_exX509_NAME_print_ex_fpX509_NAME_setX509_OBJECT_free_contentsX509_OBJECT_idx_by_subjectX509_OBJECT_retrieve_by_subjectX509_OBJECT_retrieve_matchX509_OBJECT_up_ref_countX509_PKEY_freeX509_PKEY_newX509_POLICY_NODE_printX509_PUBKEY_freeX509_PUBKEY_getX509_PUBKEY_itX509_PUBKEY_newX509_PUBKEY_setX509_PURPOSE_addX509_PURPOSE_cleanupX509_PURPOSE_get0X509_PURPOSE_get0_nameX509_PURPOSE_get0_snameX509_PURPOSE_get_by_idX509_PURPOSE_get_by_snameX509_PURPOSE_get_countX509_PURPOSE_get_idX509_PURPOSE_get_trustX509_PURPOSE_setX509_REQ_INFO_freeX509_REQ_INFO_itX509_REQ_INFO_newX509_REQ_add1_attrX509_REQ_add1_attr_by_NIDX509_REQ_add1_attr_by_OBJX509_REQ_add1_attr_by_txtX509_REQ_add_extensionsX509_REQ_add_extensions_nidX509_REQ_check_private_keyX509_REQ_delete_attrX509_REQ_digestX509_REQ_dupX509_REQ_extension_nidX509_REQ_freeX509_REQ_get1_emailX509_REQ_get_attrX509_REQ_get_attr_by_NIDX509_REQ_get_attr_by_OBJX509_REQ_get_attr_countX509_REQ_get_extension_nidsX509_REQ_get_extensionsX509_REQ_get_pubkeyX509_REQ_itX509_REQ_newX509_REQ_printX509_REQ_print_exX509_REQ_print_fpX509_REQ_set_extension_nidsX509_REQ_set_pubkeyX509_REQ_set_subject_nameX509_REQ_set_versionX509_REQ_signX509_REQ_to_X509X509_REQ_verifyX509_REVOKED_add1_ext_i2dX509_REVOKED_add_extX509_REVOKED_delete_extX509_REVOKED_freeX509_REVOKED_get_extX509_REVOKED_get_ext_by_NIDX509_REVOKED_get_ext_by_OBJX509_REVOKED_get_ext_by_criticalX509_REVOKED_get_ext_countX509_REVOKED_get_ext_d2iX509_REVOKED_itX509_REVOKED_newX509_REVOKED_set_revocationDateX509_REVOKED_set_serialNumberX509_SIG_freeX509_SIG_itX509_SIG_newX509_STORE_CTX_cleanupX509_STORE_CTX_freeX509_STORE_CTX_get0_paramX509_STORE_CTX_get0_policy_treeX509_STORE_CTX_get1_chainX509_STORE_CTX_get1_issuerX509_STORE_CTX_get_chainX509_STORE_CTX_get_current_certX509_STORE_CTX_get_errorX509_STORE_CTX_get_error_depthX509_STORE_CTX_get_ex_dataX509_STORE_CTX_get_ex_new_indexX509_STORE_CTX_get_explicit_policyX509_STORE_CTX_initX509_STORE_CTX_newX509_STORE_CTX_purpose_inheritX509_STORE_CTX_set0_crlsX509_STORE_CTX_set0_paramX509_STORE_CTX_set_certX509_STORE_CTX_set_chainX509_STORE_CTX_set_defaultX509_STORE_CTX_set_depthX509_STORE_CTX_set_errorX509_STORE_CTX_set_ex_dataX509_STORE_CTX_set_flagsX509_STORE_CTX_set_purposeX509_STORE_CTX_set_timeX509_STORE_CTX_set_trustX509_STORE_CTX_set_verify_cbX509_STORE_CTX_trusted_stackX509_STORE_add_certX509_STORE_add_crlX509_STORE_add_lookupX509_STORE_freeX509_STORE_get_by_subjectX509_STORE_load_locationsX509_STORE_newX509_STORE_set1_paramX509_STORE_set_default_pathsX509_STORE_set_depthX509_STORE_set_flagsX509_STORE_set_purposeX509_STORE_set_trustX509_TRUST_addX509_TRUST_cleanupX509_TRUST_get0X509_TRUST_get0_nameX509_TRUST_get_by_idX509_TRUST_get_countX509_TRUST_get_flagsX509_TRUST_get_trustX509_TRUST_setX509_TRUST_set_defaultX509_VAL_freeX509_VAL_itX509_VAL_newX509_VERIFY_PARAM_add0_policyX509_VERIFY_PARAM_add0_tableX509_VERIFY_PARAM_clear_flagsX509_VERIFY_PARAM_freeX509_VERIFY_PARAM_get_depthX509_VERIFY_PARAM_get_flagsX509_VERIFY_PARAM_inheritX509_VERIFY_PARAM_lookupX509_VERIFY_PARAM_newX509_VERIFY_PARAM_set1X509_VERIFY_PARAM_set1_nameX509_VERIFY_PARAM_set1_policiesX509_VERIFY_PARAM_set_depthX509_VERIFY_PARAM_set_flagsX509_VERIFY_PARAM_set_purposeX509_VERIFY_PARAM_set_timeX509_VERIFY_PARAM_set_trustX509_VERIFY_PARAM_table_cleanupX509_add1_ext_i2dX509_add1_reject_objectX509_add1_trust_objectX509_add_extX509_alias_get0X509_alias_set1X509_asn1_methX509_certificate_typeX509_check_caX509_check_issuedX509_check_private_keyX509_check_purposeX509_check_trustX509_cmpX509_cmp_current_timeX509_cmp_timeX509_delete_extX509_digestX509_dupX509_email_freeX509_find_by_issuer_and_serialX509_find_by_subjectX509_freeX509_get0_pubkey_bitstrX509_get1_emailX509_get1_ocspX509_get_default_cert_areaX509_get_default_cert_dirX509_get_default_cert_dir_envX509_get_default_cert_fileX509_get_default_cert_file_envX509_get_default_private_dirX509_get_ex_dataX509_get_ex_new_indexX509_get_extX509_get_ext_by_NIDX509_get_ext_by_OBJX509_get_ext_by_criticalX509_get_ext_countX509_get_ext_d2iX509_get_issuer_nameX509_get_pubkeyX509_get_pubkey_parametersX509_get_serialNumberX509_get_subject_nameX509_gmtime_adjX509_issuer_and_serial_cmpX509_issuer_and_serial_hashX509_issuer_name_cmpX509_issuer_name_hashX509_itX509_keyid_get0X509_keyid_set1X509_load_cert_crl_fileX509_load_cert_fileX509_load_crl_fileX509_newX509_ocspid_printX509_policy_checkX509_policy_level_get0_nodeX509_policy_level_node_countX509_policy_node_get0_parentX509_policy_node_get0_policyX509_policy_node_get0_qualifiersX509_policy_tree_freeX509_policy_tree_get0_levelX509_policy_tree_get0_policiesX509_policy_tree_get0_user_policiesX509_policy_tree_level_countX509_printX509_print_exX509_print_ex_fpX509_print_fpX509_pubkey_digestX509_reject_clearX509_set_ex_dataX509_set_issuer_nameX509_set_notAfterX509_set_notBeforeX509_set_pubkeyX509_set_serialNumberX509_set_subject_nameX509_set_versionX509_signX509_signature_printX509_subject_name_cmpX509_subject_name_hashX509_supported_extensionX509_time_adjX509_to_X509_REQX509_trust_clearX509_verifyX509_verify_certX509_verify_cert_error_stringX509at_add1_attrX509at_add1_attr_by_NIDX509at_add1_attr_by_OBJX509at_add1_attr_by_txtX509at_delete_attrX509at_get0_data_by_OBJX509at_get_attrX509at_get_attr_by_NIDX509at_get_attr_by_OBJX509at_get_attr_countX509v3_add_extX509v3_delete_extX509v3_get_extX509v3_get_ext_by_NIDX509v3_get_ext_by_OBJX509v3_get_ext_by_criticalX509v3_get_ext_countZLONG_it_ossl_096_des_random_seed_ossl_old_crypt_ossl_old_des_cbc_cksum_ossl_old_des_cbc_encrypt_ossl_old_des_cfb64_encrypt_ossl_old_des_cfb_encrypt_ossl_old_des_crypt_ossl_old_des_decrypt3_ossl_old_des_ecb3_encrypt_ossl_old_des_ecb_encrypt_ossl_old_des_ede3_cbc_encrypt_ossl_old_des_ede3_cfb64_encrypt_ossl_old_des_ede3_ofb64_encrypt_ossl_old_des_enc_read_ossl_old_des_enc_write_ossl_old_des_encrypt_ossl_old_des_encrypt2_ossl_old_des_encrypt3_ossl_old_des_fcrypt_ossl_old_des_is_weak_key_ossl_old_des_key_sched_ossl_old_des_ncbc_encrypt_ossl_old_des_ofb64_encrypt_ossl_old_des_ofb_encrypt_ossl_old_des_options_ossl_old_des_pcbc_encrypt_ossl_old_des_quad_cksum_ossl_old_des_random_key_ossl_old_des_random_seed_ossl_old_des_read_2passwords_ossl_old_des_read_password_ossl_old_des_read_pw_ossl_old_des_read_pw_string_ossl_old_des_set_key_ossl_old_des_set_odd_parity_ossl_old_des_string_to_2keys_ossl_old_des_string_to_key_ossl_old_des_xcbc_encrypt_shadow_DES_check_key_shadow_DES_rw_modea2d_ASN1_OBJECTa2i_ASN1_ENUMERATEDa2i_ASN1_INTEGERa2i_ASN1_STRINGa2i_IPADDRESSa2i_IPADDRESS_NCa2i_ipaddasc2uniasn1_Finishasn1_GetSequenceasn1_add_errorasn1_const_Finishasn1_do_adbasn1_do_lockasn1_enc_freeasn1_enc_initasn1_enc_restoreasn1_enc_saveasn1_ex_c2iasn1_ex_i2casn1_get_choice_selectorasn1_get_field_ptrasn1_set_choice_selectorbn_add_wordsbn_div_wordsbn_dup_expandbn_expand2bn_mul_add_wordsbn_mul_wordsbn_sqr_wordsbn_sub_wordsc2i_ASN1_BIT_STRINGc2i_ASN1_INTEGERc2i_ASN1_OBJECTd2i_ACCESS_DESCRIPTIONd2i_ASN1_BIT_STRINGd2i_ASN1_BMPSTRINGd2i_ASN1_BOOLEANd2i_ASN1_ENUMERATEDd2i_ASN1_GENERALIZEDTIMEd2i_ASN1_GENERALSTRINGd2i_ASN1_HEADERd2i_ASN1_IA5STRINGd2i_ASN1_INTEGERd2i_ASN1_NULLd2i_ASN1_OBJECTd2i_ASN1_OCTET_STRINGd2i_ASN1_PRINTABLEd2i_ASN1_PRINTABLESTRINGd2i_ASN1_SETd2i_ASN1_T61STRINGd2i_ASN1_TIMEd2i_ASN1_TYPEd2i_ASN1_UINTEGERd2i_ASN1_UNIVERSALSTRINGd2i_ASN1_UTCTIMEd2i_ASN1_UTF8STRINGd2i_ASN1_VISIBLESTRINGd2i_ASN1_bytesd2i_ASN1_type_bytesd2i_AUTHORITY_INFO_ACCESSd2i_AUTHORITY_KEYIDd2i_AutoPrivateKeyd2i_BASIC_CONSTRAINTSd2i_CERTIFICATEPOLICIESd2i_CRL_DIST_POINTSd2i_DHparamsd2i_DIRECTORYSTRINGd2i_DISPLAYTEXTd2i_DIST_POINTd2i_DIST_POINT_NAMEd2i_DSAPrivateKeyd2i_DSAPrivateKey_biod2i_DSAPrivateKey_fpd2i_DSAPublicKeyd2i_DSA_PUBKEYd2i_DSA_PUBKEY_biod2i_DSA_PUBKEY_fpd2i_DSA_SIGd2i_DSAparamsd2i_ECDSA_SIGd2i_ECPKParametersd2i_ECParametersd2i_ECPrivateKeyd2i_ECPrivateKey_biod2i_ECPrivateKey_fpd2i_EC_PUBKEYd2i_EC_PUBKEY_biod2i_EC_PUBKEY_fpd2i_EDIPARTYNAMEd2i_EXTENDED_KEY_USAGEd2i_GENERAL_NAMEd2i_GENERAL_NAMESd2i_KRB5_APREQd2i_KRB5_APREQBODYd2i_KRB5_AUTHDATAd2i_KRB5_AUTHENTd2i_KRB5_AUTHENTBODYd2i_KRB5_CHECKSUMd2i_KRB5_ENCDATAd2i_KRB5_ENCKEYd2i_KRB5_PRINCNAMEd2i_KRB5_TICKETd2i_KRB5_TKTBODYd2i_NETSCAPE_CERT_SEQUENCEd2i_NETSCAPE_SPKACd2i_NETSCAPE_SPKId2i_NOTICEREFd2i_Netscape_RSAd2i_OCSP_BASICRESPd2i_OCSP_CERTIDd2i_OCSP_CERTSTATUSd2i_OCSP_CRLIDd2i_OCSP_ONEREQd2i_OCSP_REQINFOd2i_OCSP_REQUESTd2i_OCSP_RESPBYTESd2i_OCSP_RESPDATAd2i_OCSP_RESPIDd2i_OCSP_RESPONSEd2i_OCSP_REVOKEDINFOd2i_OCSP_SERVICELOCd2i_OCSP_SIGNATUREd2i_OCSP_SINGLERESPd2i_OTHERNAMEd2i_PBE2PARAMd2i_PBEPARAMd2i_PBKDF2PARAMd2i_PKCS12d2i_PKCS12_BAGSd2i_PKCS12_MAC_DATAd2i_PKCS12_SAFEBAGd2i_PKCS12_biod2i_PKCS12_fpd2i_PKCS7d2i_PKCS7_DIGESTd2i_PKCS7_ENCRYPTd2i_PKCS7_ENC_CONTENTd2i_PKCS7_ENVELOPEd2i_PKCS7_ISSUER_AND_SERIALd2i_PKCS7_RECIP_INFOd2i_PKCS7_SIGNEDd2i_PKCS7_SIGNER_INFOd2i_PKCS7_SIGN_ENVELOPEd2i_PKCS7_biod2i_PKCS7_fpd2i_PKCS8PrivateKey_biod2i_PKCS8PrivateKey_fpd2i_PKCS8_PRIV_KEY_INFOd2i_PKCS8_PRIV_KEY_INFO_biod2i_PKCS8_PRIV_KEY_INFO_fpd2i_PKCS8_biod2i_PKCS8_fpd2i_PKEY_USAGE_PERIODd2i_POLICYINFOd2i_POLICYQUALINFOd2i_PROXY_CERT_INFO_EXTENSIONd2i_PROXY_POLICYd2i_PUBKEYd2i_PUBKEY_biod2i_PUBKEY_fpd2i_PrivateKeyd2i_PrivateKey_biod2i_PrivateKey_fpd2i_PublicKeyd2i_RSAPrivateKeyd2i_RSAPrivateKey_biod2i_RSAPrivateKey_fpd2i_RSAPublicKeyd2i_RSAPublicKey_biod2i_RSAPublicKey_fpd2i_RSA_NETd2i_RSA_PUBKEYd2i_RSA_PUBKEY_biod2i_RSA_PUBKEY_fpd2i_SXNETd2i_SXNETIDd2i_USERNOTICEd2i_X509d2i_X509_ALGORd2i_X509_ALGORSd2i_X509_ATTRIBUTEd2i_X509_AUXd2i_X509_CERT_AUXd2i_X509_CERT_PAIRd2i_X509_CINFd2i_X509_CRLd2i_X509_CRL_INFOd2i_X509_CRL_biod2i_X509_CRL_fpd2i_X509_EXTENSIONd2i_X509_EXTENSIONSd2i_X509_NAMEd2i_X509_NAME_ENTRYd2i_X509_PKEYd2i_X509_PUBKEYd2i_X509_REQd2i_X509_REQ_INFOd2i_X509_REQ_biod2i_X509_REQ_fpd2i_X509_REVOKEDd2i_X509_SIGd2i_X509_VALd2i_X509_biod2i_X509_fpget_rfc2409_prime_1024get_rfc2409_prime_768get_rfc3526_prime_1536get_rfc3526_prime_2048get_rfc3526_prime_3072get_rfc3526_prime_4096get_rfc3526_prime_6144get_rfc3526_prime_8192hex_to_stringi2a_ACCESS_DESCRIPTIONi2a_ASN1_ENUMERATEDi2a_ASN1_INTEGERi2a_ASN1_OBJECTi2a_ASN1_STRINGi2c_ASN1_BIT_STRINGi2c_ASN1_INTEGERi2d_ACCESS_DESCRIPTIONi2d_ASN1_BIT_STRINGi2d_ASN1_BMPSTRINGi2d_ASN1_BOOLEANi2d_ASN1_ENUMERATEDi2d_ASN1_GENERALIZEDTIMEi2d_ASN1_GENERALSTRINGi2d_ASN1_HEADERi2d_ASN1_IA5STRINGi2d_ASN1_INTEGERi2d_ASN1_NULLi2d_ASN1_OBJECTi2d_ASN1_OCTET_STRINGi2d_ASN1_PRINTABLEi2d_ASN1_PRINTABLESTRINGi2d_ASN1_SETi2d_ASN1_T61STRINGi2d_ASN1_TIMEi2d_ASN1_TYPEi2d_ASN1_UNIVERSALSTRINGi2d_ASN1_UTCTIMEi2d_ASN1_UTF8STRINGi2d_ASN1_VISIBLESTRINGi2d_ASN1_bytesi2d_AUTHORITY_INFO_ACCESSi2d_AUTHORITY_KEYIDi2d_BASIC_CONSTRAINTSi2d_CERTIFICATEPOLICIESi2d_CRL_DIST_POINTSi2d_DHparamsi2d_DIRECTORYSTRINGi2d_DISPLAYTEXTi2d_DIST_POINTi2d_DIST_POINT_NAMEi2d_DSAPrivateKeyi2d_DSAPrivateKey_bioi2d_DSAPrivateKey_fpi2d_DSAPublicKeyi2d_DSA_PUBKEYi2d_DSA_PUBKEY_bioi2d_DSA_PUBKEY_fpi2d_DSA_SIGi2d_DSAparamsi2d_ECDSA_SIGi2d_ECPKParametersi2d_ECParametersi2d_ECPrivateKeyi2d_ECPrivateKey_bioi2d_ECPrivateKey_fpi2d_EC_PUBKEYi2d_EC_PUBKEY_bioi2d_EC_PUBKEY_fpi2d_EDIPARTYNAMEi2d_EXTENDED_KEY_USAGEi2d_GENERAL_NAMEi2d_GENERAL_NAMESi2d_KRB5_APREQi2d_KRB5_APREQBODYi2d_KRB5_AUTHDATAi2d_KRB5_AUTHENTi2d_KRB5_AUTHENTBODYi2d_KRB5_CHECKSUMi2d_KRB5_ENCDATAi2d_KRB5_ENCKEYi2d_KRB5_PRINCNAMEi2d_KRB5_TICKETi2d_KRB5_TKTBODYi2d_NETSCAPE_CERT_SEQUENCEi2d_NETSCAPE_SPKACi2d_NETSCAPE_SPKIi2d_NOTICEREFi2d_Netscape_RSAi2d_OCSP_BASICRESPi2d_OCSP_CERTIDi2d_OCSP_CERTSTATUSi2d_OCSP_CRLIDi2d_OCSP_ONEREQi2d_OCSP_REQINFOi2d_OCSP_REQUESTi2d_OCSP_RESPBYTESi2d_OCSP_RESPDATAi2d_OCSP_RESPIDi2d_OCSP_RESPONSEi2d_OCSP_REVOKEDINFOi2d_OCSP_SERVICELOCi2d_OCSP_SIGNATUREi2d_OCSP_SINGLERESPi2d_OTHERNAMEi2d_PBE2PARAMi2d_PBEPARAMi2d_PBKDF2PARAMi2d_PKCS12i2d_PKCS12_BAGSi2d_PKCS12_MAC_DATAi2d_PKCS12_SAFEBAGi2d_PKCS12_bioi2d_PKCS12_fpi2d_PKCS7i2d_PKCS7_DIGESTi2d_PKCS7_ENCRYPTi2d_PKCS7_ENC_CONTENTi2d_PKCS7_ENVELOPEi2d_PKCS7_ISSUER_AND_SERIALi2d_PKCS7_NDEFi2d_PKCS7_RECIP_INFOi2d_PKCS7_SIGNEDi2d_PKCS7_SIGNER_INFOi2d_PKCS7_SIGN_ENVELOPEi2d_PKCS7_bioi2d_PKCS7_fpi2d_PKCS8PrivateKeyInfo_bioi2d_PKCS8PrivateKeyInfo_fpi2d_PKCS8PrivateKey_bioi2d_PKCS8PrivateKey_fpi2d_PKCS8PrivateKey_nid_bioi2d_PKCS8PrivateKey_nid_fpi2d_PKCS8_PRIV_KEY_INFOi2d_PKCS8_PRIV_KEY_INFO_bioi2d_PKCS8_PRIV_KEY_INFO_fpi2d_PKCS8_bioi2d_PKCS8_fpi2d_PKEY_USAGE_PERIODi2d_POLICYINFOi2d_POLICYQUALINFOi2d_PROXY_CERT_INFO_EXTENSIONi2d_PROXY_POLICYi2d_PUBKEYi2d_PUBKEY_bioi2d_PUBKEY_fpi2d_PrivateKeyi2d_PrivateKey_bioi2d_PrivateKey_fpi2d_PublicKeyi2d_RSAPrivateKeyi2d_RSAPrivateKey_bioi2d_RSAPrivateKey_fpi2d_RSAPublicKeyi2d_RSAPublicKey_bioi2d_RSAPublicKey_fpi2d_RSA_NETi2d_RSA_PUBKEYi2d_RSA_PUBKEY_bioi2d_RSA_PUBKEY_fpi2d_SXNETi2d_SXNETIDi2d_USERNOTICEi2d_X509i2d_X509_ALGORi2d_X509_ALGORSi2d_X509_ATTRIBUTEi2d_X509_AUXi2d_X509_CERT_AUXi2d_X509_CERT_PAIRi2d_X509_CINFi2d_X509_CRLi2d_X509_CRL_INFOi2d_X509_CRL_bioi2d_X509_CRL_fpi2d_X509_EXTENSIONi2d_X509_EXTENSIONSi2d_X509_NAMEi2d_X509_NAME_ENTRYi2d_X509_PKEYi2d_X509_PUBKEYi2d_X509_REQi2d_X509_REQ_INFOi2d_X509_REQ_bioi2d_X509_REQ_fpi2d_X509_REVOKEDi2d_X509_SIGi2d_X509_VALi2d_X509_bioi2d_X509_fpi2o_ECPublicKeyi2s_ASN1_ENUMERATEDi2s_ASN1_ENUMERATED_TABLEi2s_ASN1_INTEGERi2s_ASN1_OCTET_STRINGi2t_ASN1_OBJECTi2v_ASN1_BIT_STRINGi2v_GENERAL_NAMEi2v_GENERAL_NAMESidea_cbc_encryptidea_cfb64_encryptidea_ecb_encryptidea_encryptidea_ofb64_encryptidea_optionsidea_set_decrypt_keyidea_set_encrypt_keyint_CRYPTO_set_do_dynlock_callbackint_smime_write_ASN1lh_deletelh_doalllh_doall_arglh_freelh_insertlh_newlh_node_statslh_node_stats_biolh_node_usage_statslh_node_usage_stats_biolh_num_itemslh_retrievelh_statslh_stats_biolh_strhashms_time_cmpms_time_diffms_time_freems_time_getms_time_newname_cmpo2i_ECPublicKeypitem_freepitem_newpqueue_findpqueue_freepqueue_insertpqueue_iteratorpqueue_newpqueue_nextpqueue_peekpqueue_poppqueue_prints2i_ASN1_INTEGERs2i_ASN1_OCTET_STRINGsk_deletesk_delete_ptrsk_dupsk_findsk_find_exsk_freesk_insertsk_is_sortedsk_newsk_new_nullsk_numsk_popsk_pop_freesk_pushsk_setsk_set_cmp_funcsk_shiftsk_sortsk_unshiftsk_valuesk_zerostring_to_hexuni2ascv2i_ASN1_BIT_STRINGv2i_GENERAL_NAMEv2i_GENERAL_NAMESv2i_GENERAL_NAME_exÀà @`€ Àà @`€ Àà @`€ À|M ðvM pM |M  pM à; <p<À?A€Bd@P* p4* P* `* €ø) è)  Ø) °Ä) À´) d˜) ).CÉ¢Ø|=6T¡ìðb§óÀÇsŒ˜“+Ù¼L‚Ê›W<ýÔàgBoŠå¾NÄÖÚžÞI ûõŽ»/îz©hy‘²?”‰ "_!€]šZ2'5>Ìç¿÷—ÿ0³H¥µÑ×^’*¬VªÆO¸8Ò–¤}¶vükâœtñEpYdq‡ †[Ïeæ-¨`%­®°¹öFai4@~UG£#ÝQ¯:Ã\ùκÅê&,S n…(„ ÓßÍôAMRjÜ7ÈlÁ«ú$á{ ½±Jxˆ•‹ãcèméËÕþ;9òï·fXÐä¦wrøëuK 1DP´íÛ™3ŸƒÙxùÄݵí(éýyJ ØÆ~7ƒ+vSŽbLdˆD‹û¢šYõ‡³OaEm }2½@놷{ ð•!"\kN‚TÖe“Î`²sVÀ§ŒñÜuÊ;¾äÑB=Ô0£<¶&o¿ÚFiW'ò›¼”CøÇöï>çÃÕ/Èf×èêÞ€Rî÷„ªr¬5Mj*–ÒqZItKŸÐ^¤ìÂàAnQËÌ$‘¯P¡ôp9™|:…#¸´zü6[%U—1-]ú˜ãŠ’®ß)glºÉÓæÏឨ,c?X≩ 84«3ÿ°»H _¹±Í.ÅóÛG奜w ¦ hþÁ­€ðøŠ @àŠ ÄŠ P¬Š `œŠ pˆŠ €|Š pŠ @dŠ  XŠ HŠ °@Š  ,Š   Š °Š À Š €ø‰ 0ì‰ @܉ P̉ `´‰ p˜‰ €ˆ‰ t‰ ``‰ ÐP‰ À4‰ P‰ Ð ‰ àøˆ àèˆ °̈ p¸ˆ ð ˆ ”ˆ ˆˆ €ˆ  xˆ  hˆ 0`ˆ dPˆ e@ˆ r0ˆ fˆ gˆ hø‡ i؇ nć j´‡ s¤‡ o”‡ k„‡ lx‡ tl‡ p\‡ qH‡ m(‡ pŒ Ð+À7€004€:@°?À?Àè¥ ÐØ¥ @Ì¥ ¸¥ °¨¥ P¥ `x¥ p`¥ €H¥ 4¥  $¥  ¥ À¥ 0ô¤ @ؤ P¼¤ `¤¤ pŒ¤ °t¤ X¤ Ð<¤ À¤ Ðü£ àä£ ðÌ£ ð´£  ”£ t£ T£  8£  £ 0£ @£ 𢠠ܢ €È¢ °°¢ à ¢ P”¢ `x¢ pl¢ €L¢ à4¢ d ¢ e¢ fø¡ gä¡ hÔ¡ j¼¡ k¤¡ lˆ¡ mx¡ n\¡ „@¡ o0¡ z¡ pø  |à  }È  {°  …œ  ‰Œ  ƒt  Šd  ‹T  ~<  x(  †  i  🠌ܟ qÀŸ ¨Ÿ y”Ÿ ŽpŸ rXŸ €LŸ @Ÿ ‚ Ÿ ˆŸ ‡èž sО tœž u„ž vlž wTž p¦  _€_@_`_ûûPk0kq nà ¬ @ €¬ P l¬ p X¬ ` @¬  4¬  $¬ P ¬ p ü« € ð«  à« 0 È« @ ¸«   ¬« ° œ« Ð « À „« ð x«   p« f d« d \¡ j (  e P« g   h ðŸ i pŸ œ¬ àðƒp† ‰0‰È @%ذ P%Ȱ `%¼°  %¬° °%”° p%„° €%t° %h°  %`° 0%T° À%@° °%4° À%$° Ð%° à%ü¯ à%ð¯ ð%ä¯ ð%Я %¸¯ %¬¯ @% ¯ %¯ %|¯  %d¯  %X¯ 0%H¯ @%<¯ P%0¯ P%$¯ `%¯ p%¯ p%ô® €%è® `%Ø® Ð%À® €%°® % ® d%ˆ® n%t® q%\® r%T® e%@® f% ® s%® g%ä­ m%Ì­ o%À­ t%¨­ h%€­ p%l­ i%L­ j% ­ k%ü¬ l%ଠ± ± @’@“”à”З›,² Ÿ  ð¡P¢`¢`„³ @t³ P`³  H³ °8³ À(³ г ³ pð² €ܲ e̲ f¸² h(  g  d¤² ðüà  èà  Ôà  Àà 0 ¬Ã @ ”à P |à ` dà ° Pà À <à Ð (à à à  à   è ° Ì À °Â Ð ” à x 0 d  @ ð  0 øÁ  ÜÁ  ÀÁ  ”Á 0 hÁ @ <Á P Á `Á 0ìÀ  ÌÀ @´À Ð ˜À pxÀ € `À  HÀ   ,À P À ` ä¿ @À¿ Pœ¿ `€¿ ph¿ €P¿ ,¿ p ¿ о € ¤¾ t¾  H¾ ¾   ¾ ° ì½  ܽ °Ľ À¬½ À ”½  |½ Ð h½ ÐT½  4½  ½ À½ à è¼ ð м à´¼  œ¼ Є¼ àl¼ ðT¼  @¼  4¼ 0  ¼ ` ¼ @ ¼ P ô» €Ü»  Ì» ¼» ¬»  œ» 0Œ» p d» @@» P»  » `ìº pÔº €¼º € ¬º œº  ˆº °tº  Lº À(º   ü¹ ÐÔ¹ ਹ ðŒ¹ ð |¹ @ l¹ ° `¹ À H¹ à 4¹ ð  ¹   ¹ p ü¸ € ì¸ sภt̸ d¸¸ uœ¸ v„¸ wd¸ ŠT¸ x8¸ y¸ e¸ pð· nÔ· m¼· f¨· g˜· hˆ· zt· „X· {D· ‰,· |P« }· ‡· ˆè¶ ~ض o„‡ …ȶ †°¶ ”¶ j€¶ kh¶ l\¶ qH¶ €8¶ (¶ r¶ ƒ¶ ‚øµ CP" Ü( ÐM@+L) P+4) f+() d+¤² e+ ) ô) pWT@Z@*¸* P*¨* `*˜* p*„* d*Ô¡ e*\¡ f*x* g*P« j*`* h*@* i*(* pP+ @@+ ,+ P + `+ €+ @ Œ0 P €0 ` l0 0 X0 p L0 € 80 € ,0  0   0 ° ô/  ä/ À Ü/ Ð Ì/ à ¼/ ° °/ À ¤/ Ð ˜/   Œ/ à €/ ð t/  d/  X/   L/ ð @/ 0 4/ @ (/   /  /  / P ô. ` ì. p à. d Ð. e À. f ¬. |  . g .  |. h h. i @. j . k ø- } ð· l ä- { Ü- m Ð- n ¼- o  - p ˆ- q x- r d- € T- s D- t 4- u - v - w ì, x Ü, y È, ~ °, z ¤, ˜0 rrPuàt0s€q°qÀ0 °uPvPÀuu0È0 ðxxPyÀv`v€vØ0 Àzz°~{y°y 1 0ƒÀ‚ƒ@Ѐð€ (1 ЉŽpŠ ˆ‰pŽh1 €@ÁàÀÐ0ÀÀ t1 ’`‘™0˜”P‘ÀÀ ”2 »0» ¾ð»¾ð¸¼2 À¿ÁàÀпP¿ÀÀð2  ÃpÁÐÄÉ0Á È3  ÌÑpÐ ÍÌ Ð0ã`ãßàß çðçÀ$h8 p$\8 `$L8 Ð$08  $8 €$8 °$ü7 $è7 P$Ð7 @$¼7 i$ðŸ j$¨7 k$œ7 e$€7 l$t7 m$h7 f$T7 g$@7 d$07 n$7 h$7 €ˆ@ x@ h@ X@ @@ $@  @ ð?  à?  Ð?  ´?  œ? €? d? L?  $à> %È> &¸> '¨> -˜> .ˆ> /x> p>  h> 0$ @ 1 P\> `T> pL> €D> 8>  0> °(> > >  > > ü= ô= ì=  ä=  Ü=  Ð=  Ä= ¸= ¬= ¤= œ=  ”= !ˆ= "|= #p= $d= %\= &P= 'D= :0= ;= <ü< =à< >È< ?´< @¬< Aœ< Bt< C\< DL< E< *†H†÷ *†H†÷ *†H†÷ *†H†÷ *†H†÷ *†H†÷ *†H†÷ *†H†÷ *†H†÷ *†H†÷ UUUUUUU U U*†H†÷ *†H†÷ *†H†÷ *†H†÷ *†H†÷ *†H†÷ *†H†÷ *†H†÷ *†H†÷ ++ +++<*†H†÷ ++*†H†÷ +*†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  `†H†øB`†H†øB`†H†øB+*†H†÷ + + *†H†÷  *†H†÷  +`†H†øB`†H†øB`†H†øB`†H†øB`†H†øB`†H†øB`†H†øB `†H†øB `†H†øBUUUUUUUUU U#+—UUeUdU*UU+U+UU U *†H†ö}B *†H†ö}B *†HÎ8+*†HÎ8+$+$*†H†÷ )…*†H†÷  U%++++++++‚7+‚7+‚7 +‚7 +‚7 `†H†øBUUU+e*†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷ *†H†÷ ++*†H†÷  *†H†÷ *†H†÷ *†H†÷  +‚7*†H†÷  U)U.++0++0+0+ (**†H*†HÎ8*†HÎ8*†H†÷ *†H†÷ *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷   *†H†÷   *†H†÷   *†H†÷   *†H†÷   *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷  *†H†÷ ++++++++ + + + +++++++++ + + + + +++++++++++ +++++ +++++++++ + + + + +++++++++++++++++++++++++ + + +++++++++++ + + + + + + + + + + + + + +0+0+0+0+0+0+0+0+0+0+0 +0 +0 ++ U++++++++++++‹:‚X ’&‰“ò,d ’&‰“ò,d UU7*†H†÷ + + + UHU$U7U8*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=+‚7`†He`†He`†He`†He`†He`†He`†He`†He`†He)`†He*`†He+`†He,U*†HÎ8*†HÎ8*†HÎ8 ’& ’&‰“ò, ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d ’&‰“ò,d% ’&‰“ò,d& ’&‰“ò,d' ’&‰“ò,d( ’&‰“ò,d) ’&‰“ò,d* ’&‰“ò,d+ ’&‰“ò,d- ’&‰“ò,d. ’&‰“ò,d/ ’&‰“ò,d0 ’&‰“ò,d1 ’&‰“ò,d2 ’&‰“ò,d3 ’&‰“ò,d4 ’&‰“ò,d5 ’&‰“ò,d6 ’&‰“ò,d7 ’&‰“ò,d8U-+++++U,UAg*g*g*g*g*g*g*g*g*g*g*g*g*g*g*g*g* g* g* g* g* g*g*g*g*g*g*g*g*g*g*g*g*g*g*g*g*g*g* g*!g*"g*#g*$g*%g*&g*'g*(g*)g**g*+g*,g*-g*.g*/g*0g*1g*2g*3g*4g*5g*6g*7g*8g*9g*:g*;g*g*?g*@g*Ag*Bg*Cg*Dg*Eg*Fg*Gg*Hg*Ig*Jg*Kg*Lg*Mg*Ng*Og*Pg*Qg*Rg*g*g*g*g*g*g*g*g*g*g*g*g*g*g*g*g* g* g* g*g*g*g*g*g*g*g*g*g*g*g*g*g*g*g*g*g*g*"g*#g*g*g*®{*†H†÷  *†H†÷ Pg+‚7+‚7U U++++U+*†H†÷  *†H†÷  *†H†÷  *†H†÷ `†He`†He`†He`†He++g+g+ *†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ= *†HÎ= *†HÎ= *†HÎ= *†HÎ= *†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=+++++ ++++ +!+ +"+#+++++++++++++++$+%+&+'g+ g+ g+ g+ g+ g+ g+ g+  g+  g+  g+  U U!U6*ƒŒšK=*ƒŒšK=*ƒŒšK=¢1 ¢1 ¢1 )¢1 ¢1 ¢1 ,¢1 ¢1 ¢1 +U UU*ƒŒšD*ƒŒšD*ƒŒšD*ƒŒšD*ƒŒšD++*†H†ö}B *†H†ö}B++0*†H†÷   *†H†÷  `†He`†He`†He-*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†HÎ=*†H†÷ *†H†÷ *†H†÷  *†H†÷  *†H†÷  `†He`†He(Ï7*…*… *…*…*… *… *…*…*…*…*…*…b*…c*…*…*…*…*…*…*…*…*…*…*…*…*… *… *… *… *… *…!*…!*…!*…#*…#*…#*…#*…$*…$*…*…*…*…*… *… *… *… *… *… +‚7U.+P D X< $ Y ü _ø ô fð ì nè ä vÔ Ô  ~Ì ´  ‡¬ ”  ˆ p  ™d L  ¢D (  «   ¬   ®  ±üŽ ìŽ ´èŽ ÔŽ ·ÐŽ ¼Ž º¸Ž  Ž ½̦ œ$ À˜Ž ˜Ž ÄŒŽ ŒŽ  ÌxŽ xŽ  ÕdŽ dŽ  ÞDŽ DŽ  ç0Ž 0Ž  ðŽ Ž  ùŽ Ž Ž Ž  ü ô ì ä Ü Ô Ì Ä  "¸ ¬ !  ” " 'ˆ | #p d $\ T %2L D &< 4 ', $ (  ): üŒ *?ðŒ äŒ +ÔŒ ÄŒ ,D¼Œ ´Œ -L¨Œ œŒ .”Œ ”Œ /Q„Œ „Œ 0 YpŒ pŒ 1 bdŒ dŒ 2 kTŒ TŒ 3 tHŒ HŒ 4 }4Œ 4Œ 5 † Œ  Œ 6  Œ  Œ 7 ˜ì‹ ì‹ 8 ¡à‹ À‹ 9ª´‹ ”‹ :±ˆ‹ t‹ ;¹h‹ \‹ <L‹ <‹ =0‹ $‹ >‹ ‹ ?üŠ ôŠ @ÁèŠ Њ A ÆÈŠ ¼Š BÏ´Š  Š CÔŠ xŠ D ÙpŠ pŠ E â`Š PŠ FëDŠ 0Š G ð$Š Š H ùŠ è‰ I Ô‰ ¸‰ J ¨‰ ‰ K €‰ h‰ L X‰ <‰ M &0‰ ‰ N / ‰ ìˆ O 8àˆ Ôˆ P̈ ̈ QA´ˆ ”ˆ RCˆˆ tˆ SF\ˆ <ˆ TI,ˆ  ˆ ULü‡ ܇ VOȇ ¬‡ WR ‡ Œ‡ XUx‡ \‡ YXD‡ $‡ Z[‡ ‡ [ ^ ‡ ‡ \ü† ô† ]ì† ä† ^܆ Ô† _gȆ ¼† `k´† ¬† a † ”† b† „† co€† x† drl† l† euT† 4† gx(† † h{ †  † i€† † jƒø… ø… k†ì… à… l ‰Ô… È… m¼… °… n¤… ˜… o€… €… p ’t… h… q›\… P… rD… 8… s¢̨ (… t§… … u®… ì„ w³ä„ Ü„ x¹Ô„ Ì„ yÄ„ ¼„ z´„ ¬„ {¨„ „ |Áˆ„ t„ } Ç`„ D„ ~Ò<„ <„ Õ4„ 4„ €Û(„ „ âüƒ ܃ ‚êЃ Àƒ ƒò°ƒ œƒ „úŒƒ |ƒ …pƒ Lƒ † @ƒ ƒ ‡ ƒ ð‚ ˆ è‚ È‚ ‰ (À‚  ‚ Š 2˜‚ x‚ ‹ <l‚ P‚ ŒED‚ ,‚ H‚  ‚ ŽK‚ ð NÜ Ä  S´ œ ‘ ]Œ h ’ gX 4 “ q  ” {ô€ Ø€ • …Ѐ Ѐ – ¼€ ¼€ — š´€ ´€ ˜ ¥¬€ ¬€ ™ ° €  € 𠻀 € › Æ€€ €€ œ Ñt€ t€  Úd€ d€ ž ãT€ T€ Ÿ íL€ L€   ÷D€ D€ ¡  <€ <€ ¢ ,€ ,€ £  € € ¤ ø Ø ¥# Ì À ¦´   § +  x ¨ 4 h P © = @ ( ª F   « O ø~ ä~ ¬ Y Ü~ Ü~ ­b Ð~ Ð~ ®e È~ È~ ¯h À~ À~ °o ¬~ Œ~ ±v „~ „~ ²~ x~ l~ ³† `~ P~ ´Ž L~ H~ µ– <~ ,~ ¶— $~ ~ ·˜ ~ ~ ¸› ø} ì} ¹  ä} ä} º¦ Ü} Ü} »® Ô} Ì} ¼ ¶ ¼} ¼} ½ ¿ °} °} ¾ É ¤} ¤} ¿ Ó ”} ”} À Ý ˆ} ˆ} Á ç x} x}  ñ h} h} à û T} T} Ä !@} @} Å !,} ,} Æ !} } Ç &!ø| ø| È 1!Ø| Ø| É  „%Øq Øq ? %¼q ¼q @ –%¤q ¤q A Ÿ%q q B ¨%€q €q C±%lq lq D¹%Tq Tq EÁ%Dq Dq FÉ%0q 0q GÑ%q q HÙ%q q Iá%ìp ìp Jé%Ôp Ôp Kñ%Àp Àp Lù%¨p ¨p M&p p N &|p |p O&hp hp P&Pp Pp Q!&@p @p R)&0p 0p S1&p p T9&p p UA&ôo ôo VI&ào ào WQ&Èo Èo XY&°o °o Ya&o o Zi&|o |o [q&ho ho \y&To To ]&Do Do _‰&(o (o `‘& o  o a™&ðn ðn b¡&Øn Øn c©&Àn Àn d±&°n °n e¹&¤n ¤n fÁ&Œn Œn gÉ&€n €n hÑ&pn pn iÙ&\n \n já&Ln 8n ké&0n (n lñ&n n m ù&øm ìm n 'äm Øm o 'Äm ¨m p ' m m q '€m lm r &'\m Dm s /'4m m t 8'm m u A' m  m v J'm ôl w S'èl èl x\'Øl Øl y`'Èl ¨l ze'¤l  l {g'œl ˜l |h'l ˆl }j'|l pl ~m'hl \l q'Ll *Le Le Û H*8e 8e Ü R*(e (e Ý \* e  e Þ f*e e ß p*üd üd à z*ðd ðd á „*äd äd â Ž*Ød Ød ã ˜*Äd Äd ä ¢*´d ´d å ¬* d  d æ ¶*d d ç À*xd xd è Ê*`d `d é Ô*Ld Ld ê Þ*4d 4d ë è*$d $d ì ò* d  d í ü*üc üc î +ðc ðc ï +Üc Üc ð +Äc Äc ñ $+¬c ¬c ò .+˜c ˜c ó 8+Œc Œc ô B+„c „c õ L+pc pc ö V+Xc Xc ÷`+Lc @c øc+,c ,c ùh+c c ún+c c ût+èb èb ü{+Ôb Ôb ý‚+Èb Èb þ…+Àb  b ˆ+”b „b Š+xb db +Xb Xb +Lb Lb “+@b (b –+b b ™+ b  b œ+üa üa  +ìa ìa  ¤+Üa Üa  ¨+Ða Ða  ¬+Àa Àa  °+¨a ¨a  ´+˜a ˜a ¸+€a €a ¼+ha ha À+Pa Pa Ä+x,¤] ¤] ?|,Œ] Œ] @€,x] x] A„,d] d] Bˆ,L] L] CŒ,<] <] D,(] (] E”,] ] F˜,] ] Gœ,ð\ ð\ H ,Ü\ Ü\ I¤,È\ È\ J¨,´\ ´\ K¬, \  \ L°,Œ\ Œ\ M´,t\ t\ N¸,`\ `\ O¼,H\ H\ PÀ,0\ 0\ QÄ,\ \ RÈ,\ \ SÌ,ô[ ô[ TÐ,à[ à[ UÔ,Ä[ Ä[ VØ,¨[ ¨[ WÜ,Œ[ Œ[ Xà,|[ h[ Yä,X[ @[ Zè,,[ ,[ [ì,[ [ \ð, [  [ ]ô,[ èZ ^ø,ØZ ØZ _ü,ÄZ ÄZ `-°Z °Z a-œZ œZ b-„Z „Z c -pZ pZ d-`Z `Z e-LZ LZ f-0Z 0Z g-Z Z h -Z Z i$-ðY ðY j(-ÔY ÔY k,-ÄY ÄY l0-´Y ”Y m4-€Y €Y n8-pY \Y o<-HY HY p@-8Y 8Y qE-$Y $Y rJ- Y  Y sO-øX øX tT-äX äX uY-ÐX ÐX v^-¼X ¨X wc-˜X „X xi-pX \X yo-HX 0X zu-X X {{-ðW ðW |-ÜW ÜW }…-ÀW ÀW ~‰-°W °W - W  W €‘-ˆW ˆW •-xW xW ‚™-lW `W ƒž-HW HW „ ¦-@W 8W …¯-(W W †°-üV àV ‡±-ÌV °V ˆ ²-¨V „V ‰ ¼-tV dV ŠTV DV ‹4V $V ŒV V ôU äU ŽÔU ÄU ¸U ¬U  U ”U ‘„U tU ’dU TU “DU DU ”Æ-8U 8U •É-0U 0U –Ì- U U —Ó-ìT ÜT ˜Û-ÈT ¼T ™ã-¬T ”T šë-€T tT ›î-hT PT œ ö-DT ,T  ÿ- T T ž .üS äS Ÿ .ÜS ÔS   .ÌS ÄS ¡ #.¼S ´S ¢ ,.¬S ¤S £ 5.ŒS ŒS ¤>.|S |S ¥?.xS xS ¦B.pS pS §D.TS TS ¨G.LS LS © O.DS DS ª X.è1@E @E ?ï1E E @ö1ðD ðD Aý1ÈD ÈD B2 D  D C 2xD xD D2PD PD E2(D (D F 2D D G'2àC àC H.2¸C ¸C I52C C J<2dC dC KC28C 8C LJ2$C $C MQ2 C  C NX2øB øB O_2àB àB Pf2ÌB ¨B Qm2œB „B Ru2xB \B S}24B B T…2ÜA ¨A U2ˆA \A V•2TA LA W@A (A X 2A A Y¦2ì@ Ô@ Z©2ØTZ0Z¨oðoèYZ`ZZÀopHZxZÀZðZØo p¨ZØZ@;p;X;ˆ;4 y°yøy@zhyˆz8yÈyzXz€y zPyày(zpz˜y¸zØ<=ð< =ð3ð?ÐY U`W 5oˆ58pPpp5¸5À6X8ˆ8Ð5Ø6p8hp€p 8ð68:XV˜=è8P=H99N<à‚Ø{ð{pVè5667°CàC0oHo0{ 4ø‚3ÐJ3h= ;WW˜X8UP4hC˜C@Vh4ðxy3xB¨3B€@h@¨B˜@°@98@P@ÐA09èA >è;HB06`6H6x603Ð;ø=(>>@>°=X>€4`3ØWx3¸;x<à=¨6Ð8€= qXqpqˆq{À{x{¨{6¸8r¸qÐqèqXD`B<84 @¨]¸2À3(VØ3øCDp>ˆ_ÐM MðW¸M8Uˆ\ÀTøU°X¨xhU`0`°aPC(;à:ðTpMa€s˜st(tØrðrs s°s@tXtˆt8sPshsÈsàsøspt t`€CP|@\ø@0r{;È7àXÀWè>?h7°7A`<ø:H~0~˜a] ah[HWØ?À<X5ˆVC \à^˜^ø^ÈaÐ\°^È^xW]è}~à|¸Y}(}@}X}ø|87?0W¸VØBø7ˆ>˜U^ƒ0]¨`XApb À~€‚ð~Ø~h‚p}Bˆ} }¸}Ð}8[[ [P[H`_h^(\ |ø€(€@€€p€X€ˆ€˜àP‚x¨ÀØÈ‚`P¸€Ѐè€0H €ð‚ ‚8‚hȰ`~°‚x~˜‚¨~|¨KTèST X0THT8C˜|°|È|HKQHQ0QQØKT¨TxTP:xr`KR(S¨Q8R R€RhRxQQPRøRSàRðQ°RÈR˜RØQ`QÀQ€|øXXb@bKO¨NàO OØNÈO˜O€OøOðN°OÀNPOhO8|8O¸>øLhL°LXMPL@M€L˜L(MÈLàLMxK(ƒ@SK¸SÐSXS SpS C0KèJðK LL8LÈpøp@qqÀK`TKB0BPXP PˆPpP¸P@P(PèPÐP¸b DàF(GpG8IGˆGXGxHHIðH¨HH`HØHHHÀHèG0HH@GÈFøF˜F°F I G¸GÐG¸D€IÈIàI°IPIhI˜IÐDøIˆDhF€F8F FðEh|PFFØEE J¸JpJ@JXJˆJpDE0E¨EÀExEE`EHEèD(JJrð]Øx0<`o@HN`NxNÈ:èzØ`È@€:p_X_pA¸_Ø]ð`€^~ÈC€7 Vøa(bbx`x?`?H?¨?ÀB?xooÐ_ðB(qPU€Xx9Ø9¨9(8 :`9:@8À99À?ð9rÀ`@_`ÈU8=€a``8^°[à[È[ _x]\X\ø[`]p\è2(D@5@D˜4°45(5à4ø4È4à@ 7PXÀx°pÀr8ÈXY(Y@YXYpYˆY YÐV˜:àpˆb€[ˆM]è\8X¸\ ^H3oVÐ2è_@ANèMN A¸tÐtètuu0uHu`uxuu¨uÀuØu(A(_ðuv v8vPvhv€v˜v°vÈvàvøvw(w@wXwpwˆwèV¨W<Ð>€UPmcHcˆnpnXn nÐnèn¸n0cÐbèbc k8mØlàm m˜mÈm°mðl@nømn(n€mhmmÀl`lxl¨lllÐk¸kèk0lHllXe¸h(hÈd d@hXhàdød8dÐhpePdˆeèhi epheøjg8j gPjàjÈji0i¸eÐeèeHi`ixiff0fi(ehdˆh h@e8gÈg€g€j˜j˜g°g°j¨iÀiHf`fxfØiðijf¨fÀf jàgdPg¨c`ccxcØfðfÀc˜dØcðcøgh€d°dhjhgˆkk(kXk@kpk˜7H]8aW˜p°:ÐzXh:haPahXÀ]0N0?¨<¨ràU˜[à7P7P^°UHr`r w`xxxx¸wÐwèwxx0xHx~àaˆA¸AÀT°X8UøpPCðTpM€CP|? |ˆVxW?0W¸V˜UØBð~P‚ €‚h‚À~PØ~h~8`~°‚x~˜‚È‚¨~8[[ [P[(nHN`NxNÈCàC@qq`o@øaW VÐY`?¨?ÀBH?ø‚?xox?oW˜Xx9Ø9¨9`9(8 ::8@8À99ð9À?hChU UPUU€U˜CÐA09èA >(ƒB0BÐVàpÐ2è2XD`BW¸bèV¨W @Xè>Ð>0?àUØ3hX¨x(;à:`<ø:ð?{;Ø?ˆ>ƒØxÈ:èz€:(q€XPXÀx˜:°:Ðzh:øCDˆ_ÐM MðW¸Mˆ\ØTˆkZ0Z¨oðoèYZ`ZZÀopHZxZÀZðZØo p¨ZØZøU`0`°a@;p;X;ˆ;a€s˜st(tØrðrs s°s@tXtˆt8sPshsÈsàsøspt t` y°yøy@zhyˆz8yÈyzXz€y zPyày(zpz˜y¸z@\Ø<=ð< =ø@0r0cÈ7àXÀWnð3Ðbh7°74AH~0~˜a] ah[HW 5oˆ58pPpp5¸5À6X8ˆ8Ð5Ø6p8hp€p 8ð6À<8:X5À3(VC \à^˜^ø^ÈaÐ\°^È^XV`W]˜=9è8P=H9è}~Nà|¸Y}(}@}X}ø|87ømø7^0]¨`XAàmpbk<à‚Ø{ð{p}Bˆ} }¸}Ð}H`_h^(\pVø€(€@€€p€X€ˆ€˜àx¨ÀØ`¸€Ѐè€0H €ð‚ ‚8‚Ȱ¨KTèST X0THT8C˜|°|È|HKQHQ0QQØKT¨TxTP:xr`KR(S¨Q8R R€RhRxQQPRøRSàRðQ°RÈR˜RØQ`QÀQ€|øXXb@bKO¨NàO OØNÈO˜O€OøOðN°OÀNPOhO8|8O¸>øLhL°LXMPL@M€L˜L(MÈLàLMxK@SK¸SÐSXS SpS C0KèJðK LL8LÈpÀK`TKPXP PˆPpP¸P@P(PèPÐP DàF(GpG8IGˆGXGxHHIðH¨HH`HØHHHÀHèG0HH@GÈFøF˜F°F I G¸GÐG¸D€IÈIàI°IPIhI˜IÐDøIˆDhF€F8F FðEh|PFFØEE J¸JpJ@JXJˆJpDE0E¨EÀExEE`EHEèD(JJè5667rð]0<ðxy°C m0oØ`HoÈ@0{p_X_pA 4¸_ð`€^3`3ÐJØW3h=x<x3 ;¸;(kèb€7(bbx`Ð_ðBr@VP4À`h4@_`|ÈUðl3xB8=¨3B˜@8@€@h@°@P@¨B9€a``8^°[à[È[ _x]\X\ø[`]p\(D@5@D˜4°45(5à4ø4È4à@ 7°pÀrÈXY(Y@YXYpYˆY Yˆb€[ˆM]è\è;HB06`6H6x603Ð;ø=(>>@>Ø]°=à=8X¸\ ^€4H3oVX>è_@ANèMN A¸tÐtètuu0uHu`uxuu¨uÀuØu(A(_ðuv v8vPvhv€v˜v°vÈvàvøvw(w@wXwpwˆw@n{À{x{¨{<PmcHcˆnpnXn nÐnèn¸nc k8mØl˜mÈm°m€mhmmÀl`lxl¨lllÐk¸kèk0lHllXe¸h(hÈd d@hXhàdød8dÐhpePdˆeèhi epheøjg8j gPjàjÈji0i¸eÐeèeHi`ixiff0fi(ehdˆh h@e8gÈg€g€j˜j˜g°g°j¨iÀiHf`fxfØiðijf¨fÀf jàgdPg¨c`ccxcØfðfÀc˜dØcðcøgh€d°dhjhgXk@kpk6¸8€=Ð8r q¸qXqÐqpqèqˆq¨6˜7H]8a84˜phaPa<À]0N¨<¨r˜[¸2à7P7P^¨]°UHr`r w`xxxx¸wÐwèwxx0xHx~àaˆA¸Ap>¸2W˜X0oh[°CÈC@VrHoÀ3`oXVØ3(VP:¸bHr€[àCpV0r¨Wð3<<4 484˜pP4h4¨<À<°pðB<0<pbàaCˆb8XÐzh:€:˜:°:È:à:ø:ð?[@Ø?èz{(q`<;Àx(;PXˆ>ƒØxhX€XÐbèbcc0cHc`rˆV V¸VÐVèVWWøUÀW€4¸; ;¨x`cxcc¨cÀcØcðcd d8dPdhd€d˜d°dÈdàdøde(e@eXepeˆe e¸eÐeèeff0fHf`fxff¨fÀfØfðfg g8gPghg€g˜g°gÈgàgøgh(h@hXhphˆh h¸hÐhèhii0iHi`ixii¨iÀiØiðij j8jPjhj€j˜j°jÈjàjøjk(k@kXkpkˆkØlðlm m k¸kÐkèkll0lHl`lxll¨lÀlXn¸nÐnpnˆn n0~H~øC°X0Wøax<p5 5ð6ˆ5V9è8¨6¸56¸8H9€=°= @Pvhvøvðuv¸tÐt0uu¨u€vw(w v8v˜v°vÈvàvètuHu`uxuuÀuØu@wXwpwˆw8mPmhm€m˜m°mÈmèn w¸wÐwèwxx0xHx`xxxx~X>0{`~x~~¨~À~Ø~ð~ 8PhÐ2D >b(bà=àmømn(n@n˜[˜€ð‚ ‚8‚°Èàø€(€@€X€p€ˆ€ €¸€Ѐè€0H`x¨ÀØè2 [8[P[˜=P=ÈXàXøX¸Yà|ø|èJ CK¸>K0KHK`KxKK¨KÀKØKÈp8C@bXb8hyˆz°y€y zÈy˜y¸zày°[x{{À{¨{˜‚°‚h‚€‚P‚È‚(D@5@D˜4 73ÐJ3p}Bˆ} }¸}Ð}0603Ø6ø=oxrØrðrs s8sPshs€s˜s°sÈsàsøst(t@tXtptˆt tY(Y@YXYpYˆY Y}(}@}X}ðKL L8LPLhL€L˜L°LÈLàLøLM(M@MXMPCpMˆM M¸MÐMèMNNðWXàpB0B0NÐ>è>??HN`NxN0?˜CN¨NÀNØNðNO O8OPOhO€O˜O°OÈOàOøO8|P(PQQ0QHQ`QxQQ¨QÀQØQðQR R8RPRhR€R˜R°RÈRàRøRS(S@S(ƒXSpS S¸SÐSèSTT0THT X`TxTT¨Tøpq@qhC€CÀTØTP|Ø{ð{(8@8È[à[ø[\Ø<8=| |H3`3ØWx3Ð8oXqpqˆq qX53¨3xBB¨B909ÐAèA°4È4à4ø45(587P7h7€7˜7°7È7à7ø7ØB`BXDXApAr¨rÀrÐYø‚HW@;@PXPpPˆP P¸PÐPèPðTU U8UPUhU€U˜U°UÈUàUèYZZ0Z˜|HZ`ZxZZ°|¨ZÀZØZðZÈ|¸qÐqèqrè}~`9x99¨9À9Ø9ð9: :À?¨]À]Ø]ð]^ ^8^P^h^€^˜^°^È^à^ø^_(_@_X_p_`Wˆ_ _¸_Ð_è_``0`H```x``¨`À`Ø`ð`a a8aPaha€a˜a°aÈa(\@\X\p\ˆ\ \¸\Ð\xWè\]]0]H]`]x]]pDˆD D¸DÐDèDEˆA A¸A8@P@h@€@˜@°@ÀBH?`?x??¨?xoo y8yPyE0EHE`ExEE¨EÀEØEðEF F8FPFhF€Fh|€|˜F°FÈFàFøFG(G@GXGpGˆG G¸GÐGèGHH0HHH`HxHH¨HÀHØHðHI I8IPIhI€I˜I°IÈIàIp>øIJ(J@JXJpJˆJ J¸JÈ@à@ø@A(A@Aè5[ð @ä PÜ  È `¼ p° €¤ dœ< e˜ ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ÿÿÿÿÿÿÿÿÿàðÿÿñÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿàÿÿÿÿÿÿÿÿÿÿ>ÿòÿ?456789:;<=ÿÿÿÿÿÿ ÿÿÿÿÿÿ !"#$%&'()*+,-./0123ÿÿÿÿÿ`£ °p@ps qÐopÀÀ p£  wàs yPs sÀÀ À£  ~€|`Ð{0|ÀÀPˆ«  x« ð d« @X« ÀD« Ð,« °« à« `ðª pઠ̪ @¸ª ¨ª °”ª À€ª  `ª PLª €<ª (ª ðª ઠ`ð© 0à© @Ì© 𼩠¤© pˆ© €t© `© pL© €8©  $© 0 © ø¨  è¨ àب °Ȩ À¸¨ P¤¨ `Œ¨ x¨ Ðd¨ ÐX¨ @¨ Œ4¨ ˆ ¨ d¨ ‰¨ pô§ qä§ ȧ z°§ „˜§ …x§ ŠT§ rD§ e0§ § s § ‘ô¦ ’ܦ wÀ¦ ¨¦ €”¦ €¦ h¦ ŽT¦ “<¦ †$¦ o ¦ ”ø¥ ‚ä¥ fÔ¥ xÄ¥ gP« ƒ´¥ ‹¤¥ t¥ ht¥ iT¥ u8¥ j$¥ ¢ ¥ •ü¤ yä¤ ‡Ȥ k´¤ {œ¤ |x¤ l`¤ }P¤ v,¤ ~¤ mø£ n࣠ ü¬ P’ ‘ “pŒàŒÀÀc ;; ;cc ;; ;x(   ° P ð à     P0p€H¿ D¿ @¿ <¿ 8¿ 4¿ 0¿ ,¿ (¿ $¿  ¿ ¿  à ð Ü P" P" P" DÓ <Ó À0 8Ó 0Ó (Ó  Ó  Ó Ó Ó Ó ôÒ ìÒ èÒ ÜÒ  ÔÒ ÈÒ  ¸Ò °Ò ¬Ò  Ò  ˜Ò  ŒÒ  ˆÒ |Ò  lÒ  dÒ TÒ HÒ  DÒ 8Ò  (Ò  Ò  Ò Ò Ò üÑ øÑ ìÑ èÑ ÜÑ ÔÑ ÌÑ ÄÑ ¼Ñ ´Ñ ¬Ñ `Ô <Ó 0Ó TÔ DÔ À0 Ó 0Ô $Ô Ô Ó Ô Ô øÓ ìÓ àÓ Ò üÑ ÐÓ TÒ 8Ò ÀÓ  Ò Ó ôÒ °Ó lÒ  Ó ¸Ò ”Ó |Ò @ dæ P Pæ ` <æ p ,æ  æ p æ  æ € ðå  Øå   Èå À °å Ð ¤å ° å € „å à xå ð lå  Xå  @å À 4å à $å  å  ôä   ää 0 Ôä @ Ää P ¸ä ` ¤ä p ä à |ä ð lä  Pä € <ä  (ä  ä ` ä 0 ôã p àã P Ìã   ¸ã ° ¨ã ð ”ã À €ã Ð pã Ð \ã à Lã ð <ã  0ã 0 ã   ã  øâ   àâ @ Èâ P ´â 0 œâ ð Œâ ` lâ p Pâ € <â ° (â  â  â  üá @ ìá @ àá   Èá ° ´á Ð  á  Œá @ |á À lá Ð Xá à Dá ð 4á  á  á  ôà 0 äà @ Ôà P Àà ` ¬à p ˜à € „à  pà   `à ° Pà € Dà  4à À (à Ð à ð à À øß  èß  Øß P Èß 0 ¸ß @ ¨ß  œß P Œß ` €ß à pß ` `ß p Pß   @ß  0ß 0 $ß € ß  üÞ   ìÞ ° ØÞ à ÄÞ ° °Þ À ¤Þ Ð ”Þ « „Þ Æ pÞ Ç XÞ d LÞ e @Þ f ,Þ g Þ h Þ Ò ôÝ i ìÝ j ÔÝ k ¸¸ l ´Ý m ¤Ý n D§ o ”Ý ® „Ý p § ­ pÝ ¬ ô¦ q TÝ r 8Ý s Ý t Ý u øÜ v äÜ w ÈÜ x ¨Ü y ˜Ü z „Ü { tÜ ¯ XÜ ° HÜ | 4Ü ± $Ü ² Ü ³ Ü ´ ðÛ µ ØÛ } ÈÛ ¶ ´Û · ¤Û ~ ŒÛ ª hÛ  TÛ ¸ @Û ¹ $Û € Û  ìÚ ‚ ÜÚ È ÈÚ º ´Ú » ¤Ú ƒ Ú „ |Ú … \Ú † HÚ ‡ Ô¥ ˆ 8Ú ¼ ,Ú É Ú Ê Ú Ë èÙ ‰ ÜÙ Š ÄÙ ½ ´Ù ‹ œÙ Œ ˆÙ Å tÙ  `Ù ¾ LÙ Ž <Ù Ì ,Ù  Ù Í øØ Î àØ Ï ÌØ  ´Ø ¿ œØ ‘ ˆØ ’ lØ “ TØ ” 8Ø • Ø À ü× – ð× Ð Ø× Ñ À× — °× ˜ œ× ™ ˆ× š œž Á p× › d× œ L×  0× ž × Ÿ üÖ Ó ÜÖ   ÌÖ ¡ ¨Ö ¢ ”Ö £ |Ö  pÖ à `Ö ¤ @Ö ¥ ´¤ ¦ Ö § Ö Ä ìÕ ¨ àÕ © ÔÕ °……@Õ Ñ ‚€‚@Õ Ñÿÿÿÿ @(€(€(@(@(0€1ÿÿÿÿ(6ÿÿÿÿ(7ÿÿÿÿ(c€(d€(e€(i@œÿÿÿÿÿÿÿÿ­€(®ÿÿÿÿÿÿÿÿ‡ÿÿÿÿ¡ÿÿÿÿÿÿÿÿ€ ï  øî à ìî Ð Üî P Ôî ` Äî p °î €  î  Œî @ xî   hî ` Hî ° 0î p $î À î Ð î ° ðí À Üí à Ìí ð ¼í  ¬í   í   í 0 |í @ dí P Lí d 8í e ¨ f (í g í h Þ s øì i èì j Øì k Èì l ¸ì m œì n ˆì o |ì p lì q ´¤ r Tì 0123456789ABCDEF¬«Ì½@ Èö P ¸ö  ¨ö ` œö p ˆö  lö   Pö p <ö € ,ö € ö  ìõ À Ìõ ° °õ   ”õ  |õ 0 hõ À Hõ Ð (õ à õ @ ôô ð àô  Ìô  ¸ô   ˜ô 0 xô 0 \ô @ Hô P 8ô ` $ô p ô € ô  èó  Ôó   Àó ° ¬ó À ˜ó Ð „ó  hó ð Tó à @ó ` ó à ó P üò Ð ìò ð Øò d Äò v °ò r œò e €ò f pò q \ò w Hò { 8ò s $ò t ò g üñ h èñ i Èñ j ¸ñ k ”ñ l tñ u `ñ m ˜ y Lñ x 8ñ o ñ p ñ z ÔÕ €—P—äý À˜Øý ‚À˜Ìý À˜¼ý „À˜¬ý ƒ™œý ´™Œý ² þ <þ Pž°žУ0¡Øý  Ìý  Ì}  ð è à Ô Ì Ä ¸ ° œ ” ÿÿÿÿ€ l \ L 8 (   ð à Ì À ´ ¬ œ Œ | l ÿÿÿÿð°±`±p± À ø 0 h   Ø   P ä 0 h ´ÿ | T l Ø  ´ 0 ´! Œ @ $" D! < \" |! ”" x à$ ì! 0( & Ô# ì À "Œ Ð "l  "` °"T  "H À"< p"0 p "  @ " ð"ø "ä P "Ð €"¼  "  @" P"„ 0"t ` "`  "T ° "L @"8 À"$ "   "ø 0"ì "Ü Ð"È à"° ð"œ "ˆ "t à "` P"L °"0 p" `" `"ø p"à `"Ì P"¸ ð "¤  "” 0 "|  "d  "P   "@  " @" À"ø "ä €"Ô  "¼ °"¬ €"œ € "ˆ à"t ð"` à"H Ð"4 " Ð" v"ü w"ð d"à e"Ä •"´ …"  ƒ"ˆ "l €"X ‰"@ ‘", s" f" g"à t"È —"° q"œ ˜"€  "l ¡"\ h"D i"( ¢" £" j"ð k"Ø l"Ä m"° Œ"¤Ú "  n"„ Š"t †"X ™"8 ’"( ¤" ‡" "ø ~"ä |"´Ù Ž"Ä ˆ"° y"˜ "„ ‹"l š"D r"4 }"  p" ”"ð “"à ›"¼ œ"¨ "„ ž"\ Ÿ", –" z"ø {"Ü o"À "¬ ‚"” x"ü¤ u"€ „"p $   ø è Ø Ä ° ¤ ˜ € h T D 4 $ ÿÿÿÿ Ø Ì `À ´    ” ð„ x Pd T °H @ ÿÿÿÿû4 0 ð$  GSUWY~‘—ì€ð+ @ä+ `Ô+ pÄ+ @°+ €¤+ ”+ 0ˆ+ Px+ `l+ \+  L+ °8+ $+ À+ Ðü* ð* àà*  Ð* ðÄ* P¸* n¤* d„* ep* oX* p@* m$* f* i * jì) kà) rT- lÔ) g´) q ) hˆ) @€@ @ |, °NðN TPOpUPTpTT@[t, °N O TPOpUPTpTT@[€!8; !(; `! ; @!ô: P!ä: `!È: p!´: Ð!œ: €!: !|: !l: !\:  !L: °!8:  !(: 0!: ð!: À!ð9 À!Ü9 Ð!È9 à!´9 à!¤9 @!˜9 !€9 p!h9 P!X9  !D9 °!$ß u!(9 !´Ý t!9 v!ô8 ‚!D§ d!Ô8 w!Ä8 e!´8 x!œ8 y!„8 ƒ!ÈÚ !l8 „!Ú …!Ú †!èÙ g!T8 z!H8 ‡!,Ù ˆ!øØ ‰!àØ s!$8 ’!8 {!ð7 Ž!ä7 Š!ÌØ h!¼7 |! 7 ~!7 }!x7 ‘!h7 ‹!T7 Œ!<7 !7 i!7 €!à6 !Ø× !Ì6 j!°6 k!˜6 l!x6 m!d6 n!P6 o!86 p!6 q!6 r!ô5 #äD p#ØD @#ÀD ð#¤D `#ˆD €#pD #`D °#PD Ð#DD  #,D À#D P#øC à#äC ð#ÐC #¼C #¤C #”C  #€C 0#hC `#XC p#DC €#0C  #C °# C  #ôB 0#ÜB à#ÈB À#´B Ð#¤B d#B y#xB e#D§ f# § g#hB x#DB h#Ø i#(B j#B k#B l#üA m#äA n#ÔA o#¼A p#¨A q#”A r#ˆA s#hA t#LA u#4A v#A w#A 0)”E @)„E P)tE `)dE c)PE d) PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXÜ00090>0F0L0R0W0a0v0€0†0‹0“0œ0¨0Å0Ê0×0ä0ë0ô0ú0111101G1L1R1Z1o11†1Ã1Ñ1ã1ñ122#212C2Q2c2q2ƒ2‘2£2±2Ã2Ñ2ã2ñ233#313C3Q3c3q3ƒ3‘3£3±3Ã3Ñ3ã3ñ344#414C4Q4c4q4ƒ4‘4£4±4Ã4Ñ4ñ455%515E5Q5[5u5‰5˜5±5¼5Ô5ô5ý5!626:6@6J6\6i6y6Ê6î6ü677'7X7o7z7Ë7Ü7ç78 8C8T8j8r8–88º8Ç8ð8þ8979C9Q99²9¿9Ú9ì9ù9::6:I:c::‹:¥:Â:Ð:é:ý:;/;6;r;ƒ;‘;«;É;ã;<<'>2>R>W>]>c>g>m>s>w>}>ƒ>‡>¤>È>Í>Ò>Ø>Þ>ä>ê>ð>?? ?&?*?B?Z?`?j?‚?™?£?¬?²?¸?Ý?ã?é?ü? ¬0 00 0*0:0Y0a0v0~0”0¬0°0º0Ê0é0ñ011*1:1J1Z1€1‘1 1®1µ1Ø1ñ1 22@2Q2`2n2u2˜2á23 3a3…3¬3´3á3ù3þ3*4=4B4`4q44‘4±4Ñ4ø4*5;5D5ƒ55­5³5½5Í5Ò5Ý5ê5ø566*696G6M6U6^6g6p6{6‘6¨6¬6°6´6Ä6Ò6ä6ò67%717ž7¬7Ò7$8;8C8Q8]8p8ƒ8’8 8¦8±8Ä8Ú8â8ç8ô89I9\9d9m9u9€9–9Ç9Þ9æ9ó9ÿ9:%:4:B:H:R:l:„:Œ:•::¨:¾:÷:;;#;/;B;U;d;r;x;‚;±;Ã;Ë;Ô;Ü;ç;ý;b<>D>L>T>_>u>Á>Ó>ê>ò>? ??2?A?O?U?_?n?©?»?Ã?Ì?Ô?ß?õ?0y0‹0“0¡0­0À0Ó0â0ð0ö01141G1Y1a1j1r1}1“1»1ã1ð12A2c2v2ª233ÿ344/474D4P4c4v4…4“4™4¤4²4Ó4ï455551565L5[5e5o55”5œ5¤5¬5·5Í5ò566$626>6Q6d6s66‡6‘6¯6Ã6Ë6Ô6Ü6ç6ý6r77Ž7˜7¨7Á7Æ7Ë7Ð7Õ7ß7ä7é7I8T8Y8`8m8x8}8‡8”8Ÿ8¤8«8¸8Á8È8á8ï89 999&979K9V9e9‡9ž9¦9«9¸9È9é9 :':::Y:‹:¡:»:è:;.;¢;½;ç;õ;ÿ; <"<3<8=H=Y=r==‘=š=ž=¨=¹=Ò=ß=ñ=ú=þ=>>2>?>Q>Z>^>h>y>’>Ÿ>±>º>¾>È>Ù> ?n?â?@h0K0i091s1¬1Ê1Ÿ2Ë2ÿ23Ç3ç3&4}4„4¿4Ô4Ú455Q5c5n5‡5Í5æ5616V6q6Ž6¸6Á6×6ñ6’7Ã7Ò7á7ð7ÿ788,8Ë9í9P „3T6pt0ä0»;€©6Y7l9 Ø?° ë7 8{8œ8 9m9t9Â9É9Û:K<ˆ<ÐxT8²8º8¿8Ä8É8Î8Õ8ã8ì899'959C9Q9_9m9{9¨9È9 ;t;’;¦;¸;î;ø;<<£<Á<Õ<ç<='=6=B=Ó=ñ=>>M>W>f>r>??1?C?i?}?Œ?˜?Ê?à<"0•2ø4<5@5D5H5L5P5T5X5\5`5d5h5l5p5t5x5{:i;Ê;Ô<1>a?ðøv0 11111 1$1(1,1014181<1@1D1H1L1P1T1X1\1`1d1h1l1p1t1x1|1€1„1ˆ12â2t3Õ4‡5¿6P7T7X7\7`7d7h7l7p7t7x7|7€7„7ˆ7Œ77”7˜7œ7 7¤7¨7¬7°7´7¸7¼7À7Ä7È7Ì7Û7ñ9::#:3:<:N:W:b:t:€:’:®:´:¼:×:Þ:;;1;N;¨;É;æ;ø; <#<2>²>Á>Ï> ?`2†2”3˜3œ3 3¤3¨3¬3°3´3¸3¼3À3Ä3È3Ì3Ð3ë3ë4!79x9|9€9„9ˆ9Œ99”9˜9œ9 9¤9¨9¬9°9´9û:2;[;–<É<ç>lÐ1T2X2\2`2d2h2l2p2t2x2|2€2„2ˆ2Œ22b3H4L4P4T4X4\4`4d4‹5õ8: ::::: :$:(:,:0:4:8:<:@:D:k< =ï>"?;? 4„346¼6À6Ä6È6Ì6Ð6Ô6Ø6Ü6à6ä6è6ì6ð6ô6ø6û8á:;00ü5¨889<9@9D9H9L9P9T9X9\9`9d9h9l9p9t9‹;q=@ü¶02û4º7Á7Ë7í7ø78%8,8L8V88©8¼8Ê8à8929A9H9V9•9§9µ9À9Ç9å9 ::!:/:M:T:b:p:‰::—:ž:µ:È:Ø:ã: ;;$;5;F;f;;‘;œ;£;Ð;ß;æ;ö;<<"<)<4 >>>W>^>l>s>z>ˆ>¡>¯>½>Ô>â>é>???7?>?E?s?z?„?‘?˜?·?Ç?Î?â?PD0/0:0H0O0Œ0“00¨0¯0Ë0ã0î0111*151<1C1[1b1i1‘1œ1£1³1Á1ì122242o2€2‹2™2Ñ2ê2ñ2û23'3G3N3\3j3q33–3¤3²3Ë3Ò3Ù3à3û34(4/4N4U4h4y4Š4ª4Å4Õ4à4ç45#5*5:5T5[5f5m5x5ˆ5“5š5«5Á5È5Ï5Ö5á5ó5ú56/6:6A6Q6_6–6¡6¹6Æ6Í6 77&7=7D7O7‹7’7 7§7®7¼7Ç7Ü7ê7ø7ÿ78$8+8D8R8`8y8€8‡8¤8´8¾8Ë8Ò8ý899 9A9S9^9u9‚9£9²9¼9Ï9î9õ9::%:,:3:::A:T:[:{=a?`,[0þ455&5<5C5{9¼9Æ9à9ê9ü9:[>«>k?pP0«1M4e8£8Ã<>€£2˜3¶6ÿ9E:@"1Ë1Ð1ï1õ12282>2Y2d2o22‘2¸2Æ2Û2æ2æ34F4h4ˆ4£4W=o>v?? 8,0³03<6@6D6H6L6P6T6X6\67˜:œ: :¤:¨:¬:°:´:¸:š=¡=°8ª0ü01t11ò1ý1•2§2;3l3 3A4Ë5757r7b88¤8G:N:b;;À0Š3×3ñ3Î45!5e6[7Þ7O8{99:a=>>€>‘>§>ÿ>Ðã1<5•;ë<=G=a>g>Ä?Ê?àå12Ñ6ã6î6T;k>ðg6Í6ì6þ6T7o78c89,Ï3á3ó344/4A4N4?6’6?9œ9ï9G:>ì>¿?P0§13Ÿ3÷314A4Q4a4q4Ö4í4=6X6Ë677¼8Ò8ú899*9œ9æ9ý9 ==6=N=S=f=Û=>0> d52E2d2|22”23T3k3]4Ì4ˆ:«:Ë:ë: ;+;K;k;‚;Ž;•;›;¬;Á;<4<Â<=’=/>=>€>„>ˆ>Œ>˜>µ>È>7?J?ƒ?ž?ß?ÿ?0@?0_0õ0>1Å12Ò3¡4ß4$5`5Å6797S7¨7¬7°7´7ð7$8°8ê8#9À9:-:@HÔ1Ö2Ø67Ø7û8G9k9Ù9::Î:;;;q;å;t<Š<<š<þ<‘=³=É=l>Š> >O?‘?£?®?Ó?P`r0”0¶0à0 1F1&2H2r2¢2Ó2|3÷3!4Q4k4Ÿ4¹45[5›6Ï6ý6)7E7»89)9t:Ü:Ç;>Ž>?#?C?c?†?»?`X00]0œ0½0â0ü0z1­1é1Ž2d3ƒ3Ê3ú3N4$5Ý56,6_6±:;!;=;Y;};™;¶;Ö;µ<Á<Ï<8=T=l=z==å=³>Ê?p4È0ç0«1Å:Ñ:ß:H;d;|;Š;­;õ;³<Š=º>ý>??©?Í?é?€l0090y0%1¡1³1¾1Ñ13Ø5J6½6á6­89Ã91:C:N:e:q:’:Ÿ:§:¾:;';o;‹;À;ï;n<‰<Ï<õ<=O=u==¾=>N>Ž>Ö>??w?Ý?°090ˆ0¡0î0E1t1˜1¬1Ã1Û1212`2|2Œ2œ2¢2¸2Ò2ó2"3O3–3²3À314i4†4”4¤4ª4Ã45I5f5t5„5Š5£5Õ5ö56q6x6>7\7`7d7h7é7ñ78858O8m8t8‚8‰8¹8%959N9q9{99Ã9*:£:Ò:;U;l;£;º;ö;< =)=¤=¼=? \F0Ó01—1¹1…2‘2Ÿ23363D3d3¬3s4Z5‘7£7®7?8^8y8“8Û9#:S:“:Ó:;S;È;å;O=s==ª=t>˜>D?h?¤?È?°T080„0¨0ô01d1ˆ1Ô1û1D2h2´2Û2$3H3”3¸34Q4„4Ã4ò45d5ˆ5Ä5è5$6c6”6¸6õ6E7“9¸9È:;À$©0/2º67ƒ8æ;Da>w?Œ?è?ðP0o01)1w1–1€253Õ3æ3 444œ4È4Þ4õ4 5„6¤6-7¥7%8J8[8…859í;Ó<Ø<â<5=—=G>þ?Œ00U01 1111C1N12ž2À2 3w3ž3¬3º3È3Ö34©4º4Ð45!5K5˜5â5626s6²6A7Ê7Ÿ8Ö89:B:u:È:ñ:;;!;1;A;Q;a;y;÷;4>?‚?Ÿ?½?¤‹0œ0¹01G1X1«1Î1æ1 2+2K2}2Ž2©2Ñ2ô263…3¦3ø34N44Q5Ä5ò5,6y6®6j7”7´7é78b8˜8Ù8ó8ˆ9±9å9„:­:È:Ù:ù:;9;n;«;ì;7>>Ô>?N?\?…?Ö?î? X+0H0j00¶0ö0&1>1r1š1à12^2¿2é23p3³3ç34h44Æ455l57j7¥8E9r9à9:M:’:ª;ô;r>ò?0$ÿ1@2v2ó2G3Ù3‰45Ô5<6¥6;738@8q1Ž6e;q;;—;±;È;Ü;<·<¼<Á<ç<ì<ñ<Á=ö=X>‘>É>b??Í?Px0Ñ0ã0î011141K1b1v1©1W2\2a2‡2Œ2‘2494Q4e44Ü4U5y5ê5L6Z6h6v6„6É6K7Ø7;8d8Œ8S9a9o9}9‹9™9:¬:ú:#;U;Z<Ž<Ø< =Y=¥=ñ?`t00#0:0ñ011Ò1ç12U2i2G3]3Á3Ó3Þ3€4™5è5Y6¨67^7Å7 8Q8ô89Ä;Û;µ<_=«=Þ=> >>F>e>œ>Á>ã>?/?I?[?m?u?‡?™?Ü?ë?p0000 0$0(0,0004080<0Ñ0ã0î011M1©2Ï2R3Y3 4$4(4,4044484<4@4D4H4L45Í5Ô5ä5è5!626Ÿ6Ù6à6ù67ˆ7Œ77”7˜7œ7 7¤7¨7¬7r8Ÿ8³8Ñ8ö89,99Ü9ä9D:L:h:t:…:‹:Ÿ:ë:û:4;;;R;h;‚;’;¬;¼;Ú;<$<:>> >>>>>Ô>æ>M?]???•?¤?ª?°?À?Ï?ð?€ 00R0‘0¢0U1\1Ì1Ð1Ô1Ø1Ü1à1ä1ó35¸5¾5Ï5ˆ6©6½6Ú6õ6û6 7)7@7F7_7z7€7‘7·7Í7Ó7ä78 8$8(8,8084888F8‘8{:ª:±:E;ñ;K<¸=¼=À=Ä=È=Ì=Ð=Ô=Ø=Ü=à=ä=è=Â>?PA0U0n0—0#4*4ç4‡5´5Ý5ˆ7Œ77”7˜7œ7 7¤7¨7¬7°7h9¡9:Ë:û:f;u;–;;{=>>>¬>þ> ”1³1º12|2í2ô2¡3¨3l6p6t6x6|6€6„6ˆ6Œ66”6˜6œ6´6¸6¼6À6Ä6ð6ô6ø6ü6777 77777‹7º7¿7;9>:ƒ:¯:í:);g;Á;SX>š>Ú>?X?Ÿ?³?¹?°"01070H0e0y0¢0«0á0Ò1×1Ü1á1ë1282^2o2‡2Ÿ2Ü2I3•3Ë3ë3 4U4k4›475ƒ5ž687L7R7c7€7“7™7ª7Õ7í7ó78a8::±:þ:<<\=`=d=h=l=p=t=x=|=€=„=ˆ=Œ==R>›>??ÀŒ!161o31425L5y5“5Ü546O6p7Á78a89 9/9U9ä:è:ì:ð:ô:ø:ü:;;; ;;;;; ;$;(;,;0;4;Ñ;â;Á>ÿ> ?¤?¨?¬?°?´?¸?¼?À?Ä?È?Ì?Ð?Ô?Ø?Ü?à?Ðd 122—2î4C5X6Ñ8Y9¥:¾:ø:;³;¯<¾<Í<Ü<ë<ú< ==*=9=H=W=i=x=‡=–=Û=R>^>­>?—?¥?«?±?Á?Ç?Í?Ó?ë?÷?à<0'040R0d0i0o0y0‡0‘0¥0¯0½0à0æ011>1L1¿1Ý1G2ˆ2§2·2½2Í2Ó2á2ç2ü23k3Å3á3ù3444)4/4?4E4p44¢4º4Ä4É4Ï4Ù4ã4í4÷4555'5-575A5½5Þ5686W6s6’6ÿ67'777d7t7ò7 8 8-8I8\8t8}8‹8‘8Ÿ8¥8«8Â8Ì89?9p9w9µ9ý9;:d:i:p:Š::ö:`;i;±;Á;ï;û;!<4<=I>Q>o>†>š>±>Ï>æ>ú>?/?F?Z?q?ƒ?Ž?¼?Ê?Ó?ù?ð°0A0P0s0y0‚0ˆ0®0¼0Î0ç0,1=1ž1¥1«1á1222"2-2;2F2N2{2“2¿2Ù2û2 33*3¶3ê3494?4N4V4b4Ø4%525B5L5X5d5p5|5ˆ5”5 5¬5¸5R6‰6Ü67j7Ö7?8†88 8Ç879E9Z9d9l9w9}9‚9ˆ9•99¥93<Ž<ë>›?ú?„¨01E1Ê1*2W222¡2ª2®2¸2Æ2×2ë2ö23&343J3X3r33‘3š3ž3¨3¹3Õ3ó34414:4>4H4Y4u4“4²4¿4Ñ4Ú4Þ4è4ù4535d5m5œ5©5»5Ä5È5Ò5ã56#646\6i6{6„6ˆ6’6£6Á6ã6ô67%7/7;7¢7¯7Á7Ê7Î7Ø78>8b8o88Š8Ž8˜8©8Â8Ï8á8ê8î8ø8 9"9/9A9J9N9X9i9‚99¡9ª9®9¸9Ê9ì9ù9 :::":8:l:y:‹:”:˜:¢:Í:ü: ;;$;(;2;H;t; <<+<4<8>.>3>=>B>O>Y>i>‡>—>®>³>½>Â>Ï>Ù>ã>ï>?)?;?D?H?R?c?ƒ?¤?®?Å?Ô?â?ð?ø³0Ë0,1K1h1¦1Ý1*2[2Ã2Ù2f3†3˜3¥3¼3Ï3á3î3444#4D4Q4]4g44“4ž4ª4»4Ö4û455+5;5K5[5z55’5ª5¶5í5!6:6‘6¯6û637M7Ó7Ø7[8j88˜8­8Ã8Í89A9S9Z9r9~9ƒ9“99©9Â9×9Ü9è9ø9 :5:v:²:Á:Æ:Ò:â:ö:';E;^;Ž;Â;„<ˆ<Œ<<È<Ä=È=Ì=Ð=A>J>\>a>m>r>~>>¢>®>ß>æ>ë>ÿ>/?U?u?–?²?ÿ? h_0s0}0·0ï01 1I11£1­1ê1ˆ3¡3Î3×3[4–4À4Ù4è5-6{6Î8³9ü9 :ƒ:Ì:Ù:¬;i<=:=‘=Ï=å=á>ó>þ>u?†?™?¦?Ê?Û?ö?0Pd00š0ä0ö01 1õ1ÿ1s3¯3Å3Ï3V5³5 6¨6ï6ù6`8Ä8 9$:å;ï;á<ëþ>?u?“?@l!01"1(111C1L1k11˜1K2 2§2¹2À2Ì45Y5{5˜5ž5Ë5ã5è5á7ñ788!818¡9±9Á9Ñ9;;!;1;>!>1>A>Q>a>q>>‘>‘?¡?±?P€‘0¡0±0Á0a1q11‘1¡1±1Á1Ñ1á112A2Q2a2±23Q4ñ566!616A6ý6+7`7j7Á9Ñ9á9ñ9j:`;…;½;<©<ë<=@=J=r=€=Š=> >>>>!>q>Á>?A?q?Ñ?á?`\A0Q0q00Á0á0E1{1‘1K2Û34N45V5‡5F9`9 9à9#:`:¦:­:à:ä:è:ì:D;K;”;˜;œ; ;?/?€?Á?p@E1L1P2T2X2\2`2d2h2l2A3S3[4e4Å9Ì98;<;@;D;H;L;P;T;Á;Õ;…?Œ?€Ð 1$1(1,1014181<1@1A2S2^2q2$3.383B3Z3d3n3x3˜3¢3¬3¶3&404:4D4“44§4±4ç4ñ4þ4555R5\5f5p5}5‡5‘5›5ç5ñ5û56T6^6h6r6Á6Ë6Õ6ß6"7,767@7k7u77‰7¡7«7µ7¿7É7Ó7ó7ý788q8x8â8é879>9`9g9¬9°9´9¸9`:d:h:l:p:a[>Á>w?p0È1¿3Æ3Ä4È4Ì4Ð4Ô4Ø4Ü4à4ä4k5Ó5+6J6l6à6Á7ì7l8Ã8È8Û9ø9:C:f:Œ:©:;t;å;þ;H<œ<ò<=&===¯=ý=g>›>À>š?¶?Ð?Ô?Ø?Ü? „v0Õ0æ0ÿ0*1y1Ø1û12d2ž2â23R4†4í4\5s5Û56)6F6h6±6ß6"7*777>7S7…7¡7¦7µ7Ë7F8Œ9–9Ç9Ñ9j:¡:¼:×:õ:;1;I;k;;=Ÿ=Þ= >D>`>j>å>?'?§?ã?°H‹01Í2¤3ö344#4{4Ë4 5`5†5 5ë6 7Ã7R9p9p:…: :è;õ;aQ?j?t?‘?Ð<¶01A1r1(2¹2Ï2Z3Æ3%5:5H5k6Ø6W7m7=8Ø889›9É9î9õ::;R;Æ;à€1<1µ1Ç1Ø12w3½3Þ3O4Ä4æ4ü46B6X6é6…7Ë788Á:Ç:[;Á;Ì;ç;>$>6>K>`>|>‹>µ> ?8?)>A>U>’>?g?œ 0m0~0¹0þ0@11Õ1ì1m2·23•3Ò3u4¬4Ú4ú4j5v5ž5Ã5?6Ž6³6/7~7£78a8}8™8±8Å89-9I9a9u9‘9­9É9á9õ9:1:A:]:y:‘:¥:Æ:ã:2;q;;Á<Ñ< =1>M>i>>•>¶>Ñ>á>ý>?1?E?f?„?²?¬0|0Ç0Ù1œ2Ä2Ô2þ23X3m3Ñ3í3 4!454!5=5Y5q5…5¦5Á536a6Œ6Á6Ý6ù67%7‚78æ8V9´9ä9::9:Q:e::‘:¡:½:Ù:ñ:;-;I;a;u;;¹;Ñ;å;->I>a>u>Á>Ý>ù>?%?^?ž? ¨0^0ž01S1X1¡1Ú1^2Þ2ö23$3L3Q3x3«3Î3ä3é34A4F4s4x4”4ž4Á4Ý4þ4575<5w5|5¨5­5Ý5ä5ê56646X6–677S7o7”7Í7X8«8Â8ì8<9^9§9¿9:ƒ:›:¤:²:Ï:û:Ô<Û<é<ö<=;>B>U>b>‡>9?Y?º?0ì10I0s0x0œ0Ò0Ù0â01111L1v1{1¬1Ï12+2C2t2¦2É23%3;3@3s3˜33Ê3Ï3ë3õ3444a4Ø4{5¡5°5¶5Þ5)6:6L6[6a6Š6×6è6777!787A7O7g7™7µ7º7×7è7í7 88 8%8?8D8d8r88ª8±8Ø8î899h9×9Þ9:E:m:t:{:ã:;!;+;D;{;ý;‡<Ž<˜<¾±>Õ>î> ?&?U?{?@|¸0Ô0*1K1m1™1 1É1è12292T2g3ƒ3Ê3ê34 4;4X44D5Z5£6 8W8¥8»8Â8å89 9(939V9r9•9:;!;;;z;ë;K<ö<4=x=Û=K>»>+?y??®?Ì?ó?PŒ070S0x0˜0©0è0ÿ011'1L1R1ˆ1­1è2ï2B3ˆ3Œ33”3˜304±415±5×5ð5ô5ø5ü5666#6l6p6t6x6|6€6„6 7ñ7ø7X8\8`8d8h8Ò8D:H:L:P:T:X:\:™>x?|?€?„?ˆ?Œ?`X1¼3À3Ä3È3Ì3Ð3Ô34845,56Ì6ž7Ê7"8}88Ç8"9 9¤9¨9¬9°9´9“:Ã:‚;<±?è?ph 0%0G0X0}01Z1ƒ1C2ñ2|3q4²415T5…546h6­6å6]7r78f88¥9À9å9•:Á:Ç:å:ö:;;;; ;$;(;¼;2<Æ<ì<"=U=æ=?€ð0G1q11©1Á1Õ1ñ1 2)2A2U2q22©2Á2Õ2ñ2 3)3A3U3q33©3Á3Õ3ñ34494Q4e444¹4Ñ4å45595Q5e555¹5Ñ5å56696Q6e666¹6Ñ6å67797Q7e777¹7Ñ7å78898Q8e888¹8Ñ8å899-9I9a9u9‘9­9É9á9õ9:-:I:a:u:‘:­:É:á:õ:;!;1;A;s;”;ã;ü;u=’=K>p>>´>?S?p?|µ0Î0‰1®1¿1ò1)2E2i2…2«233o3ø34H4i4´4»4á4=5C5I5,676{66Ã6777ë78F8_8¾8ã899<9_9‰9¢9¸9:c:€:õ;<É<î<ÿ<2=ô= >œ? ¨%0>0¯0£2¿344-4I4a4u44¹4Ö45‹5Ï5G66†66«6¼6Ã6û6<7D7S7X7d7¬7¼7Ì7×7ó788^8j8v8‚888¼8Ø8î89 999"9-9:9J9]9m9z9¡9ó9:A:û:¤;<¦<´<ç<õ<='=[=o=¶=ÿ=þ>[?ð?ô?ø?ü?°à00H0t0¨0Þ0 1Y1o1‡1©1Ú1 2242@2X2€2º2Ò2â2ö233$3Z33©3µ3Í3ï34"4[4Œ4É4ý405J5V5f5»5Ñ56C6‹6’6Ï6ó67 7$7(7,7h7•71868;8U8^8q8“8»8ñ8h99¶9ê9ý9R:ƒ:;;E;k;‘;º;È;Ì;Ð;Ô;Ø;Ü;à;ä;<76>e>®>¿>û>??«?Æ?×?Àt0!0D0H0L0P0T0X0\0`0©0!1;2Ë3Ý3ð3X4ÿ4551585{5Ÿ5½5É5í5È6î67Z7J8ç89•9¬94:s:š:º:;š;»;ß;< <]<~<©<Ë<í<*=l=”=Ðx010O0Ö0ð0ë1û12'2123N3F5^5¡5³5¾5Ñ5á5¡6¼69J9ú:E;Q;r;y;—;±;æ;ó;/<<‹>´>ñ>ú>?¨?Û?àŒ`1¤2ð2 3#3¦3á3494T4¡4ù4_555¹5Ñ5å566W6m66ÿ6@7q77©7Á7Õ7ñ7 8)8A8U8{8À8Ò8x9§9ç9½:;0;F;W;á;ý;<1A>F>K>¤>È>;?¼?Ò?ì?ðtû0õ132L2+33å34R4‚4¶4ê4ü4,5ƒ5º56E6©6'7Ë839¹9Ã9:È:e;¡;§;±;È;ü;<<<'J>~>®>â>?F?z?®?Þ?x0B0v0ª0Þ01B1r1¦1Ú1223h4›4þ4.5f5~5¿5¡6Õ6 7Ñ7à78N8t8¹8>9E9ž9Ñ9G:N:Ø:L;^;”;Ö;¾>È>Y?c?|?›?²?Ð.151I1s1‡1¼1Ø1ì1S2»2+3‹3Y4;5µ5º5å5ê566E6J6u6z6¥6ª6Õ6Ú67 757:7e7j7•7š7Å7Ê7õ7ú7%8*8U8Z8…8Š8µ8º8å8ê8ä9é9$:):U:Z:…:Š:µ:º:å:ê:;;E;J;u;z;¥;ª;D >5>:>e>j>õ>ú>%?*?U?Z?…?Š?Ä?É? Ì0 050:0e0j0•0š0Å0Ê0U1Z1…1Š1µ1º1å1ê1 222B2\2f2m2’2µ2º2å2ê233E3J3a3s3~3¥3ª3Õ3Ú34 454:4e4j4•4š4Å4Ê4õ4ú4%5*5U5Z5…5Š5µ5º5A6{6å6Œ7å7ê788E8J8u8z8¥8ª8Õ8Ú89 959:9[9¤9O:ß:ä:<;Ë;+<ª<==[=»=:>»?ê?0\I0˜0è0;1…1 2w2ë2A3Q3a3q33‘3’4›5!7‡7¦7È7è788A8R8g8†8»:Nè>ï>@X 11\1À1è1Þ2ü2 3!343B3h3l3p3t3‚3±3Å34!4A4Q6Ü6á6e7{7¨78!8c8W9Ÿ9¹9¶<Ô<À=¡>~?œ?P@Í0(1˜1ç12>2™2û326•6ý68E8“=Ð= >$>;>R>i>€>—>®>¼>Ø>2?~?»?` O0)37#7.7q9:­<Á<=?n?p,‘0:1³45ï5Ÿ6q7 8!8À8ó8Š:<Ø=ô=?”?€p)0G0›0—3¨3ë34#4b4Š4»4Õ4ó465^5é5;;@;{;û;<;<[<`<{<›< <»<Û<à<û<= =;=[=`={=›= =»=Û=à=û=> >;>‹??«?Ë?Ð?ë?P 00+0^0‹0«0°0Ë0ë0ð0 11+1^1‹1«1°1Ë1ë1ð1222!2'2-23292?2E2K2Q2W2]2c2i2o2u2{22‡22“2™2Ÿ2¥2«2±2·2½2Ã2É2Ï2Õ2Û2á2ç2í2ó2ù2ÿ23 3333$3+383@3D3H3L3P3T3X3\3`3d3h3l3p3t3x3|3€3„3ˆ3Œ33”3˜3œ3 3¤3¨3¬3°3´3¸3¼3À3Ä3È3Ì3Ð3Ô3Ø3Ü3à3ä3è3ì3ð3ô3ø3ü344444!4V4`44Ý4 5j5 5º5õ5ü5g6p6}6ó62777F7j8†8Ž8A9C:s:¯:Ì:ã;X>¦?â?þ? Œ†0µ0è0 1;1º1á1÷1{2’2ë2133±3ô34U4§4é496a7o7|7™7¬7½7ò78!8.8A8J8Y899¹9Ñ9å9:!:L:e:¦:ç:O;h;n;t;‡;<=H=a=g=m=Ö=7>ˆ>Ù>à>õ>9?G?s?Œ?°x50u01‹1²1æ1E2`2o2—23D3^3°3Á34*4P45/555Ò6Q8m8‰8¡8µ8Û8_9Ò9â9û9::4:J:œ:ì:P;];y;–;ú=z>¡>ª>·>Â>??'?S?‡?£?»?Àœ000L0R0j0˜0ž0²0ò01S1[1o1Œ2’2ú2ˆ3Ž3Ù3ß3 444C4I4c4+5r5+686[6¤67Q7ê7#8¢8Ö89B9v9®9â9:N:‚:¶:ê:;8;>;D;¡;§;­;Ó;…<ž<É<Ø<=F=c=±=¿=Ð=Þ=T>ˆ>Ô>?C?J?мÇ1Õ12&2‡2ë45ˆ6Ê6×6ú6;7P7ë78Ñ8ã8î89999Q9e999¹9Ñ9å9::9:Q:e:::¹:Ñ:å: ;8;B;G;^;c;z;;;»;Ù;<04>N>—>·>Þ>ô>?)?H?L?P?T?X?\?`?d?h?à” 0'0D081F1T1‹1Þ1ï1G2^2&3J3ž3Æ3à3ú3494J4e4™4ª4Â4ô4 555]5n5Ð56.6¸6â617J7€7™7Ú7P8É89{99ò9:®:;J;Ä; g>‘>­>É>á>õ>?!?:?Y?o?ðÜ0090Q0e000¹0Ñ0å01!1b1h1Y2}2Ã2à283H3S3„3¼3E4‰4ó4†5±5Í5é56616M6i66•6±6Á6Ý6ù67%7A7]7y7‘7¥7Á7Ý7ù78%8’8£8¹8ð8ö8999#9T9‹9­9³9ß9:X:ª:á:;;G;…;Ê;<8V>¦>Å>+?Ì?å?ÿ?À0!0'0=0N0_0p0À0Æ0Ü0@1|1Ù1Q2`22Ò2ñ233353I3i3ˆ3Ž3”344 4%4=4B4q44©4Á4Õ4ñ4 5)5A5U5q55©5Á5Õ5r6™6Õ6è6717l7s7š7¡7¶7á7O8ª8à8 9'9¤9­9º9ñ9Q:X:f:¬:÷:;á<è<+=¾=Ë= >>>>> >$>(>,>D?\?¨Q3f3À3Ç3Û34G444¹4Ñ4å45595Q5e5‹5Q6r6µ67p7¦7ô78_8w8‹8§8Á899G9c9i9Ž9¦9¬9Ñ9 ::J:P:;j;p;½;Ã; <&¨>é>ù>?+?G?M?Y?i?…?‹?‘?±?Á?Õ?þ? à0<0U0 0×0B1_1{11‡1š1Á1Ñ1á1õ12%2O2•2œ2»2Â2ì2o3Œ3¯3Á3ì3&4N4d4p4Œ4Ù4ß455J5‚5”5±5Í5é56616M6i66•6¼6Â6ã6ñ6ü67797?7k7Ÿ7Ù7ù7ÿ78H8e8k8s8µ8Õ8ä819I9P99â9û9:€:˜:é: ;;;M;…;¥;«;±;"=E=d=j=p=‘=—==¶=Õ=Û=á=>4> >à>Ì?04ƒ0œ0Ò0‘2©2ñ2¤3þ3Š4›4Þ4å5î6j7ƒ7=I=y=×>ü>?@Œ’0„1ˆ1Œ11”1˜1œ1a2s2~2‘2Ÿ2Å2ð2^3Ž3¾3á384V4g4m4Ÿ4>5k5y5Û5é5P6j6x6æ6ô6K7Y7‹7™7ì78|8¡8æ8ü8Y9¶9Ð9Þ9n; ;¸;â;9=h=>>^>m>‘>¡>·>û>?+?2?Pd´2Â2(4>4]4{5Ã5à56>6¾78Ä89¼9:P:l:°:Æ:F;p;Œ;Ò;ß;ï;<]<}<’<§<³<êW>ˆ>­>¹>Ô> ?·?õ?`¤0@0P0V0q0…0Â0Õ0ä0û0<1M11ž1´1º1À1÷1242l2€22Ù2"4W4n4‹4¢45D5c536µ6»6Å6ò6ø67-737=7!<1->I>a>u>‘>­>É>á>õ>1?M?i??•?±?Í?é?px0010M0i00•0±0Í0é01111M1i11•1±1Á1ò112Á2=3¢4¸4¼4À4Ä4È4Ì4"5Ú516c6„6á6747ù7¦9ò9q:9;Á;ý;Ñ<ã<îˆ>a?€H11-1ø12ô2333 3t3Î3%5B5Æ5ò5 6„6¨6æ6€7G9c9Ž:;k<È<[=•=?6?h 0c0‰0x1þ1‰4Ë4ñ45¨5¬5°5´56V6Š6Ê67F7¦7S8Ý8+9W9m9É9ú9-:]: ;e;©;<Ï>ô>?Ë? ˜²0Ã0í01g1ü1¸2Ò23)3?3_3ù3þ3/4œ4ø4k5§5l6Õ637H77<8C8g8›8Ã8Ò8×8ã8$949D9V9c9w9š9¦9²9Á9Ì9Ù9ó9:>:G:M:X:d:t:‡:–:£:¶:ë:<¶<Ä<÷<==7=Œ=»=Ï=>_>^?»?°´P0T0X0\0`0d0¨0Ñ01>1j1¹1Ì1ä12:2j2z2‘22µ2Ø2ë2.3F3V3j3}3•3¥3´3ê3464B4Z4w4—4§4ß4.5o5¯5"6z6¼67-7l7è7¿8ñ8 9)9A9U9q99©9Á9Õ9ñ9::9:Q:e::‘:­:É:á:õ:;!;ëš>Á>ß>ý>?9?W?À@ 2¦2µ3Á4û4Z5r5»5)6I6q6¿6_7¸7 8H8Š8ï8,9P9²9Æ9ß97:=Ô=õ>?Ð`¬0°0´0¸0¼0À0’1¾1ê12,2^2Í2ß2ý23V3{3È3I4š4K5g5«5¢627k7°7ù7D8´839K<~=Ä=w>‚>¥>?M?k?‘?£?®?àÔ0P0˜0Ä0Ñ1ã1î12q22“2ž2´2Ë2\3|3Ü3õ3B4V4f4‚4’4¦4¶4Ð45 55Ž5Î5Ñ6ê67'7`7f7q7—7¥7»7×7å7û78<8\88¬8Ì89"9C9]9:,:::­:Ç:ÿ:;;;.;B;G;\;r;; ;Î;ì;<'f>Œ>¼>Ù>???\?€?–?¾?Û?õ?ð°è0-1…1ÿ1/2E2[222°2´2¸2¼2À2Ä2È2ß2ÿ23A3‘3µ34¥4Ç425Z5v5¬5Þ5ð5#6[6~6¡6µ6Ï6î6ó6W78>8Ö8ö8 9W9r9“9Ô9N:­:,;H;a;q;;§;Ü;<.“>¶>Ö>ö>?6?V?v?–?Õ?ø?0&1A1_1e1j1›1¡1¦1ß1å1ê1262Q2o2u2z2«2±2¶2ï2õ2ú23&3A3_3e3j3›3¡3¦3ß3å3ê3464Q4o4u4z4«4±4¶4ï4õ4ú45&5A5_5e5j5›5¡5¦5ß5å5ê56616O6U6Z6‹6‘6–6Ï6Õ6Ú6ó6&7A7_7e7j7›7¡7¦7Ö7ñ7)8.8Š88Ù8Þ89Y9†9¡9Ù9Þ9::?:‰:Ž:¶:);R;X;b;î;ó;<<>g>’>å>÷>3?w?ª?Ä?Ü?á?û?Ä10c0§0ß0ý0„1’1&2‘2ª2½2Ì2á2æ2ë2P3}3™3×3Þ3û3"404F4_4œ4¥4Æ4é4û4555h6½67Æ78j88Ÿ8…9½9ö9:-:H:L:P:T:X:\:`::•:¨:º:Ì:í:B;K; <<<˜<¾<Ã<Þ<ä<ð<ü<== =,=8=D=P=\=h=|=€=„=ˆ=Œ==”=˜=œ= =¤=¨=R? ÐH0L0P0T0n0]1126 6$6(6Ç6Î6×6Þ6ä6é6ð6ú6 7727:7M7U7±7Í7é78818M8i88•8±8Í8é89919M9i99•9±9Í9é9::1:M:i::•:±:Í:é:;;1;M;i;;•;±;Í;é;<<1>1>M>i>>•>±>Í>é>??0H3r3Ú394§6T7o7‚7æ79‰9Ñ9ê9:#:m: :;-;»;Ô;ì;ò;#<<«=$?(?,?0?Û?@h10¬0n2„2Â23*3[3p3w3§3È3•56â67ê8 9<9…9¸9ï9:Ù;Þ;(<ø<+=i=Ò>Ú>å>î>? ?$?*?A?G?\?u?ˆ??¥?¸?¿?é?ù?P€ 00)090I0Y0p0ž0Ä0â01\1–1,2U2m2t2{2•2Ñ2(3>3ˆ3³3'4E4Š4 4Ñ4þ4575u56)7Ë78µ9¯:N;­;>¨>?!?A?S?^?q?ƒ?Ž?ý?`p-0\0x031Y1|1”1}23#4¦4Å4M5¦5Å5M6›6Ü6â6è6ô6þ6f7|8~9¨9E:Q:_:‡:«<"=£=¸=Ú=ê=ô=þ=3>C>M>e>¤>»>Ú>è>/?`?¤?»?Ò?à?pH070H0N0U0{0ˆ00È0×0Ü0á0ç0ó0û01 111(1C1L1R1e1|1¡1¨1³1¾1È1Ó1Þ1õ1262=2c2h2q2x22†22”2›2¢2©2°2º2Ë2Þ2æ2ñ23-393@3M3T3h3‚3§3¾3Ã3Ê3Ó394F4R4h4o4ž4¤4©4²4¸45"5*5G5X5^5e5+6Á6Ý6ù67%7A7]7y7‘7¥7Á7Ý7ù78%8A8]8y8‘8¥8Á8Ý8ù89%9A9]9y9‘9¥9Á9Ý9ù9:%:A:]:y:‘:¥:Á:Ý:ù:;%;A;];y;‘;¥;Á;Ý;ù;<%?>c>›>Ì>í>+?\?w?«?Õ?ö?€°+0[00»01(1[11­1ë12=2{2¬2Ç2û2%3F3{3«3Ï3 4Q4x4«4ß4ý4;5l55Ë5ü56K6u6–6Ë6û67[7¡7È7û7,8M8‹8¼8×8 959V9‹9»9ß9:a:ˆ:»:ì: ;K;‘;¸;ë;"l>Ÿ>ü>/?Œ?¿?€0W00å0'1_1µ1ò12u2²2ß234¿4`55Ÿ56 66V66¿6 7s7Œ77”7˜7Ò78c;j; <$<(<,3>s>“>¶>û>?=?ƒ?¸?à?ü? ¤C00§0Ã01?1g1ƒ1Ã1à1292w2›2ã23@3\3£3ß34#4c4ƒ4³4ß45D5ƒ5¸5à5ü5C66§6Ã67?7g7ƒ7Ã7à78H8e8‡8Ã8ø8 9<9ƒ9 9ï9 :1:k:¸:Ô:;6;…;¨;Ð;a>k>>Ø>õ>)?š?À|›0¦0¬0²0ñ021•1œ1ª1´1À1É1Ú1ã1ñ1222#222@2F2U2b2h2w22†2•2Ÿ2¥2´2½2Ã2Ò2Û2â2ð2ü2 33#393?3E3K3Q3W3]3c3{3Ô3â3ì3$4<4J4T4š4¥4³4½45X5„5 6b6p6z6Æ6Þ6ì6ö6<7G7U7_7±7á7Q8i8€8–8¬8¾8Ð8â8ô89999•99¤9²9·9Ñ9ß9:):A:b:i:w:::–:§:°:¾:Î:ê:ï: ;;*;0;J;O;e;k;€;†;¢;©;°;·;¼;Â;È;Ù;ç;ñ;<<<#<)>>%>1>E?L?Z?d?~?—?¬?·?Å?Ï?ç?õ?ÿ?Ѐ0&0>0U0o0u0{00‡00“0™0½0Ó0Ù0ä0ê0ñ0ÿ0 11*14191>1D1R1`1j1s1€1‰1—1¥1¯1¼1È1Ø1ó12(2/2?2M2[2e2{2‰2Å2Ì2Ú2ä23)333e3q33‰3Ê3 44#4g4s44‹4½4Ë4Õ4õ4ü4 55º5È5Ò5ñ6 7#797O7e7{7‘7§7½7Ý7æ7ï7÷7888'8/83898=8K8T8\8Á8Ï8Õ8Ý8ä8ò8÷89 9919?9q9‰9¡9±9Ä9Ë9Ö9Û9ç9ì9÷9 :1:8:F:P:\:e:v::::³:¸:Î:Ô:ç:ó:ù: ;.;<;F;X;m;s;y;;‘;¦;¬;µ;Ã;Í;ð;þ;<<%<+<12T2f22Š2“2›2©2²2º2È2Ñ213?3E3M3T3b3g3t3|3„3¡3¯3á3ù34!444;4F4K4W4\4g4{4¢4©4·4Á4Í4Ö4ç4ð4þ45(5-5G5M5b5h55‡55’5¢5»5Ë5Ù5ã5õ56666"616F6L6U6c6m66ž6¨6¿6Å6Ë6Ñ6×6ô6777;7I7S7l7z7„7»7õ7þ7 88`8n8x8X9t9Š9‘9ž9 ::3:::t:‹:™:£:»:;[;Ë;Ô;â;ì; =&=<=C=P=¿=Ï=å=ì=ù=.>F>Y>g>q>?ð$=0K0U0+1`1i1w11Ô1â1ì1#3?3R3Y3f3Ð3à3ó3ú34S4f4t4~4–4Û45%535=5‘5Ÿ5©5÷67)707=7-8=8S8Z8g8Œ8Ÿ8­8·8Ï8+9N9W9e9o9Ð9:2:E:L:V:g:u::“:š:¤:Ò:;);@;V;l;‚;˜;®;Ä;Ö;è;< <<<+<4<‘<Ÿ<¥<­<´<Â<Ç<Ô<Ü<ä<==A=Y=q=‹=¬=¾=ñ=> >>>'>,>7>K>a>}>ƒ>Š>˜>¢>«>²>¸>Ê>Ø>â>ö> ????!?'?-?3?9???i?p?v?ƒ?¥?Ê?Ø?î? ð00&0<0W0j0t0Ž0 0±0Ä0Õ0î0÷011+1?1\1f1t1~1˜1œ1 1¤1¨1¬1°1´1¸1›2ª2æ2ô2þ2313?3I3c3~3Š3˜3¢3Ñ3ô3X4j4å4ö4§5µ5¿56+656W66»6Ê6ð6þ67‚7Š7Á7Ñ7Û7í7÷7[8•8œ8ª8´8Î8î8ü8@9}99—9©9³9Á:É:;;>;L;V;Û;ø; <<$<^ >*>e>;?¬?º?Ä?  0>0Y0^0c0æ0 11B1I1W1a1m1v1‡11ž1®1Ê1Ï1ë1ñ1 22.232M2S2l2r2Œ2‘2«2±2É2Ø2â2ì2ò2ø2þ23 332363<3@3F3J3P3T3Y3^3t3Š3’3›3ª3¾3Ì3Ö3è3ü344444 4&4,424A4Y4p4†4œ4²4È4Þ4ô4 55.5I5R5[5c5q5z5Ñ5ß5å5í5ô56666$6A6Y6q66”6›6¦6«6·6¼6Ç6Û6ò6ú677'707D7M7[7e7{7Š7“7¡7«7Ñ7ã7é7ö78808>8H8^8h8„8–8¤8®8Ë8Ù8ã8ü8 99B9T9b9l9Š9¬9³9Á9Ë9:::*:4:Y:¢:ª:¸:Â:ì:; ;;";L;a;y;;¦;¼;Ò;è;þ;<&7H7l7x7†77Õ7ã7í7[8f8l8r8†8™8£8Ä8Ð8Þ8è8(969@9¡9ª9¸9Â9û9: ::3:=:Y:d:r:|:®:å:ú:;;J;s;‡;•;Ÿ;Ý;)<{<‡<Œ<’<³<Ï<Ö<ä<î<=)=7=A=q==‰=Å= >>>">6>I>S>p>w>…>>¶>Ë>Ù>ã>÷>??‹?0 ø+060E0S0]0{0ƒ0‘0›01;2G2Q2f2‚2‰2—2¡2®2¿2È2Ö2æ233!3'3B3H3d3i3…3‹3¦3¬3È3Í3é3ï3 44*4/4I4O4h4n4Ž4˜4¢4¬4¶4À4Æ4Ë4Ñ4á4ç4í4ó4ù4 5&525]5d5m5|5‚5‰5’5¡5À5Î5Ø5ê566 6666%6+61676=6C6I6O6q6‰6 6¶6Ì6â6ø67$7:7L7^7}7…7—7©7±788%8-848B8G8T8\8d888Á8Ù8ñ8999&9+979<9G9[9‚9‰9—9¡9­9¶9Ç9Ð9Þ9î9 ::+:1:J:P:l:q::“:®:´:Ð:Õ:ñ:÷:;;2;7;Q;W;p;v;–; ;ª;´;¾;È;Ñ;×;Ý;ã;é;ï;õ;ú; <<<9>+>9>C>\>j>t>¬>Á>Ï>Ù>ú>???^?l?v?Ž?”?§?@ 00)0I0¤0¯0½0Ç011151;1I1W1a1æ1÷122`243›3®3´3Ç3›4¬4¼4à45#515;5ž5¬5¶5÷5ü566"6,6ß6ë6ù67747p7z7ˆ7–7 788)838D8`8k8;9A9O9]9g9Í9Ù9ç9ñ9::q:‰: :¶:Ì:â:ø:; ;2;M;V;_;g;u;~;2<@þ>P (060?0F0K0a0m0‹0“00¨0¾0Ç0ß0÷0 1112171C1S1Y1`1w1}1ž1£1´1Ì1ä1ê1þ1202;2C2n2u2z22†2“2¤2Á2Î2æ293f3®3æ3ì3ò3ø3þ34 444 4'4.454=4E4M4Y4b4g4m4w4€4‹4—4œ4¬4±4·4½4Ó4Ú4ã4˜5 5®5¹5¿5Ó5è5ó5 6!6.6k6p6‘6–6X7]7o77¡7§7888"8)8F8“8˜8¯8Ò8ß8ë8ó8û89+939>9D9J9P9V9\9‰:˜:; i0G>P>Y>‡>Ž>—> >Î>Õ>Þ>ç>??%?.?\?c?l?u?£?ª?³?¼?ê?ñ?ú?Ð Ô01080A0J0x00ˆ0‘0¿0Æ0Ï0Ø01 111M1T1]1f11¤1­1¶1ä1ë1ô1ý1+222;2D2r2y2‚2‹2é2ð2ù230373@3I3w3~3‡33¾3Å3Î3×34 444L4S4\4e4“4š4£4¬4Ú4á4ê4ó4!5(515:5h5o5x55¯5¶5¿5È5ö5ý566=6D6M6V6„6‹6”66Ë6Ò6Û6ä677"7+7ð ": s8 \t2€2„2ø4ü4555 55555 5$5(5,5054585<5@5D5H5L5P5T5X5\5`5d5h5l5p5t5x5|5€5„5ˆ5Œ55€ ?¬?À?Ô?è?ü? 0$080L0  ¬7,707@7D7T7X7h7l7|7€77”7¤7¨7¸7¼7Ì7Ð7Ü7ä7ì7888(8,888@8H899 90949@9H9P9d9t9|9„9”9˜9¨9¬9¼9À9Ð9Ô9ä9è9ø9ü9:$:(:8:<:L:P:\:d:l:|:€::”:¤:¨:¸:¼:È:Ø:ì:;;;$;,;4;° Ø´1È1Ì1Ü1à1ð1ô1222Ô3Ø3Ü3à3ä3è3ì3ð3ô3ø3ü3444 44444 4$4(4,4044484<4@4P4T4„4ˆ4Œ44”4˜4œ4 4¤4¨4¬4°4´4¸4¼4À4Ä4È4Ì4Ð4Ô4Ø4Ü4à4ä4è4ì4ð455 5554585<5@5D5H5L5P5T5X5\5`5d5h5l5p5t5x5|5€5„5ˆ5Œ55”5˜5œ5 5°5´5 ˜Ø2Ü2à2ä2è2ì2ô2ü233 3$3(3,343<3X3\3`3d3h3l3t3|3˜3œ3 3¤3¨3¬3´3¼3Ø3Ü3à3ä3è3ì3ô3ü344 4$4(4,444<4X4\4`4d4h4l4t4|4˜4œ4 4¤4¨4¬4´4¼4Ø4Ü4à4ä4è4ì4ô4ü455 5$5(5,545<5X5\5`5d5h5l5t5|5˜5œ5 5¤5¨5¬5´5¼5Ø5Ü5à5ä5è5ì5ô5ü566 6$6(6,646<6D6H6L6P6T6X6h6„6ˆ6Œ66”6˜6 6¨6Ä6È6Ì6Ð6Ô6Ø6à6è6ð6ô6ø6ü67777 7$7(7,707@7H7L7P7T7X7\7l7t7x7|7€7„7ˆ7˜7 7¤7¨7¬7°7´7Ä7Ì7Ð7Ô7Ø7Ü7à7ð7 88888 8(808L8P8T8X8\8`8h8p8Œ88”8˜8œ8 8¨8°8Ì8Ð8Ô8Ø8Ü8à8è8ð8ø8ü8999 9989<9@9D9H9L9\9x9|9€9„9ˆ9Œ9œ9¸9¼9À9Ä9È9Ì9Ô9Ü9ø9ü9::: :::$:(:,:0:4:8:H:d:h:l:p:t:x:€:ˆ::”:˜:œ: :¤:´:¼:À:Ä:È:Ì:Ð:à:ü:;;; ;;; ;(;,;0;4;8;<;L;h;l;p;t;x;|;„;Œ;”;˜;œ; ;¤;¨;¸;Ô;Ø;Ü;à;ä;è;ð;ø;<<< <$<(<0<8>>,>0>4>8><>@>H>P>l>p>t>x>|>€>ˆ>>˜>œ> >¤>¨>¬>¼>Ä>È>Ì>Ð>Ô>Ø>è>?? ???? ?(?0?4?8?> >$>ð>ô>ø>8?>>$>4>à L4787H7L7X7h7Ì7Ð7à7ä7ð78 88,808@8D8T8X8h8l8À8Ô8Ø8è8ì8ü8999 9(909ð °>Ø>?(?P?¼?Ø?Ü?ø?ü? ` 000,0 2<2@2L2X2t2x2„2 3(3,3D3`3d3€3„33 3È3Ü3à344484L4P4p4„4ˆ4¨4¼4À4à4ô4ø45,505 $´1¸1È1Ì1Ø1è1ø1ü1 222,2<2@2P2T2d2h2x2|2Œ22 2¤2´2¸2È2Ì2Ü2à2ì2ü2 333,383T3X3p3Œ335,505t55”5ì56(6,6<6@6L6\6„6˜6¼6Ð6ô67 788L8d8”8´8¸8Ð8Ô8ä8è8ô8999(9,989H9\:€:„:˜:œ:¨:¸:È:Ì:Ü:à:ì:ü: ;;$;(;<;@;P;X;l;p;€;„;; ;°;´;Ä;È;Ô;ä;ô;ø;< <<(<à=ü=>> >0>4>@>P>`>d>t>x>ˆ>Œ>˜>¨>¸>¼>È>Ø> ÈH0d0h0€0œ0 0¼0À0Ð0Ô0à0ð0111 1L1p1„1¨1¼1à1ô12024282<2P2d2|2ˆ2œ2À2@3D3T3X3h3l3x3ˆ3Ü3ø3ü344,404<4L4\4`4l4|4è455$5(585<5H5X5 6,606H6L6\6`6p6t6€66 6¤6´6¸6Ä6Ô6´7¸7È7Ì7Ø7è7ø7ü7 888,888\8`80 ˆ\0`0p0x00”0¨0¬0À0Ä0Ø0Ü0ð0ô01 11 10141@1P1\1l1|1€11”1¤1¨1¸1¼1Ì1Ð1à1ä1ø1 22 2$24282H2L2\2`2p2t2„2ˆ2”2œ2¤2´2¸2È2Ì2Ø2è2ø2ü2 33 3$303@3T3d3l3t3„3ˆ3˜3œ3¬3°3À3Ä3Ô3Ø3è3ì3ü34 44,404@4D4T4X4h4l4|4€44”4¤4¨4´4Ä4Ô4Ø4è4ì4ø455$54585H5L5\5`5p5t5„5ˆ5”5¤5´5¸5Ä5Ô5,=0=@=D=T=X=d=t=„=ˆ=˜=œ=¬=°=¼=Ì=Ü=à=ð=ø=>>(>,>@>D>T>X>h>l>x>ˆ>˜>œ>°>´>È>Ì>à>ä>ø>ü>??(?,? >>>$>,>4><>D>L>T>\>d>l>t>|>„>>¸>¼>À>Ä>È>Ð>Ô>à>ä>è>ì>ð>ô> ???$?,?4?>>(>,>@>D>X>\>h>p>t>€>ˆ>Œ>˜> >¤>°>¸>¼>È>Ð>Ô>à>è>ì>ø>?????(?0?4?@?H?L?X?`?d?p?x?|?ˆ??”? ?¨?¬?¸?À?Ä?Ð?Ø?Ü?è?ð?ô?@00 00 0$00080<0H0P0T0`0h0l0x0€0„00˜0œ0¨0°0´0À0È0Ì0Ø0à0ä0ð0ø0ü0111 1(1,181@1D1P1X1\1h1p1t1€1ˆ1Œ1˜1 1¤1°1¸1¼1È1Ð1Ô1à1è1ì1ø122222(20242@2H2L2`2d2p2x2|2ˆ22”2 2¨2¬2¸2À2Ä2Ð2Ø2Ü2è2ð2ô233 33 3$30383<3H3P3T3`3h3l3x3€3„33˜3œ3¨3°3´3À3È3Ì3Ø3à3ä3ð3ø3ü3444 4(4,484@4D4P4X4\4h4p4t4€4ˆ4Œ4˜4 4¤4°4¸4¼4È4Ð4Ô4à4è4ì4ø455555(50545@5H5L5X5`5d5p5x5|5ˆ55”5 5¨5¬5¸5À5Ä5Ð5Ø5Ü5è5ð5ô566 66 6$60686<6H6P6T6`6h6l6x6€6„66˜6œ6¨6°6´6À6È6Ì6Ø6à6ä6ð6ø6ü6777 7(7,787@7D7P7X7\7h7p7t7€7ˆ7Œ7˜7 7¤7°7¸7¼7È7Ð7Ô7à7è7ì7ø788888(80848@8H8L8X8`8d8p8x8|8ˆ88”8 8¨8¬8¸8À8Ä8Ð8Ø8Ü8è8ð8ô899 99 9$90989<9H9P9T9`9h9l9x9€9„99˜9œ9¨9°9´9À9È9Ì9Ø9à9ä9ð9ø9ü9::: :(:,:8:@:D:P:X:\:h:p:t:€:ˆ:Œ:˜: :¤:°:¸:¼:È:Ð:Ô:à:è:ì:ø:;;;;;(;0;4;@;H;L;X;`;d;p;x;|;ˆ;;”; ;¨;¬;¸;À;Ä;Ð;Ø;Ü;è;ð;ô;<< << <$<0<8<<>>>>(>0>4>@>H>L>X>`>d>p>x>|>ˆ>>”> >¨>¬>¸>À>Ä>Ð>Ø>Ü>è>ð>ô>?? ?? ?$?0?8?> >> >$>0>8><>H>P>T>`>h>l>x>€>„>>˜>œ>¨>°>´>À>È>Ì>Ø>à>ä>ð>ø>ü>??? ?(?,?8?@?D?P?X?\?h?p?t?€?ˆ?Œ?˜? ?¤?°?¸?¼?È?Ð?Ô?à?è?ì?ø?`ü00000(00040@0H0L0X0`0d0p0x0|0ˆ00”0 0¨0¬0¸0À0Ä0Ð0Ø0Ü0è0ð0ô011 11 1$10181<1H1P1T1`1h1l1x1€1„11˜1œ1¨1°1´1À1È1Ì1Ø1à1ä1ð1ø1ü1222 2(2,282@2D2P2X2\2h2p2t2€2ˆ2Œ2˜2¸2¼2È2Ð2Ô2à2è2ì2ø233333(30343@3H3L3X3`3d3p3x3|3ˆ33”3 3¨3¬3¸3À3Ä3Ð3Ø3Ü3è3ð3ô344 44 4$40484<4H4P4T4`4h4l4x4€4„44˜4œ4¨4°4´4À4È4Ì4Ø4à4ä4ð4ø4ü4555 5(5,585@5D5P5X5\5h5p5t5€5ˆ5Œ5˜5 5¤5°5¸5¼5È5Ð5Ô5à5è5ì5ø566666(60646@6H6L6X6`6d6p6x6|6ˆ66”6 6¨6¬6¸6À6Ä6Ð6Ø6Ü6è6ð6ô677 77 7$70787<7H7P7T7`7h7l7x7€7„77˜7œ7¨7°7´7À7È7Ì7Ø7à7ä7ð7ø7ü7888 8(8,888@8D8P8X8\8h8p8t8€8ˆ8Œ8˜8 8¤8°8¸8¼8È8Ð8Ô8à8è8ì8ø899999(90949@9H9L9X9`9d9p9x9|9ˆ99”9 9¨9¬9¸9À9Ä9Ð9Ø9Ü9è9ð9ô9:: :: :$:0:8:<:H:P:T:`:h:l:x:€:„::˜:œ:¨:°:´:À:È:Ì:Ø:à:ä:ð:ø:ü:;;; ;(;,;8;@;D;P;X;\;h;p;t;€;ˆ;Œ;˜; ;¤;°;¸;¼;È;Ð;Ô;à;è;ì;ø;<<<<<(<0<4<@>> >(>,>8>@>D>P>X>\>h>p>t>€>ˆ>Œ>˜> >¤>°>¸>¼>È>Ð>Ô>à>è>ì>ø>?????(?0?4?@?H?L?X?`?d?p?x?|?ˆ??”? ?¨?¬?À?Ä?Ø?Ü?ð?ô?pØ0 0 0$080<0P0T0h0l0€0„0˜0œ0¨0°0´0À0È0Ì0Ø0à0ä0ð0ø0ü0111 1(1,181@1D1P1X1\1h1p1t1€1ˆ1Œ1˜1 1¤1°1¸1¼1È1Ð1Ô1à1è1ì1ø122222(20242@2H2L2X2`2d2p2x2|2ˆ22”2 2¨2¬2¸2À2Ä2Ð2Ø2Ü2è2ð2ô233 33 3$30383<3H3P3T3`3h3l3x3€3„33˜3œ3¨3°3´3À3È3Ì3Ø3à3ä3ð3ø3ü3444 4(4,484@4D4P4X4\4h4p4t4€4ˆ4Œ4˜4 4¤4°4¸4¼4È4Ð4Ô4à4è4ì4ø455555(50545@5H5L5X5`5d5p5x5|5ˆ55”5 5¨5¬5¸5À5Ä5Ð5Ø5Ü5è5ð5ô566 66 6$60686<6H6P6T6`6h6l6x6€6„66˜6œ6¨6°6´6À6È6Ì6Ø6à6ä6ð6ø6ü6777 7(7,787@7D7P7X7\7h7p7t7€7ˆ7Œ7˜7 7¤7°7¸7¼7È7Ð7Ô7à7è7ì7ø788888(80848@8H8L8X8`8d8p8x8|8ˆ88”8 8¨8¬8¸8À8Ä8Ð8Ø8Ü8è8ð8ô89 9 9$90989<9H9P9T9`9h9l9x9€9„99˜9œ9¨9°9´9À9È9Ì9Ø9à9ä9ð9ø9ü9::(:,:@:D:X:\:p:t:ˆ:Œ:˜: :¤:°:¸:¼:È:Ð:Ô:à:è:ì:ø:;;;0;4;@;x;|;ˆ;;”; ;¨;¬;¸;À;Ä;Ð;Ø;Ü;è;ð;ô;<< << <$<0<8<<>>>>(>0>4>@>H>L>X>`>d>p>x>|>ˆ>>”> >¨>¬>¸>À>Ä>Ð>Ø>Ü>è>ð>ô>?? ? ?$?0?8?>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>€>„>ˆ>Œ>>”>˜>œ> >¤>¨>¬>°>´>¸>¼>À>Ä>È>Ì>Ð>Ô>Ø>Ü>à>ä>è>ì>ð>ô>ø>ü>??? ????? ?$?(?,?0?4?8?>> >>>>> >$>(>,>0>4>8><>@>D>H>L>P>T>X>\>`>d>h>l>p>t>x>|>€>„>ˆ>Œ>>”>˜>œ> >¤>¨>¬>°>´>¸>¼>À>Ä>È>Ì>Ð>Ô>Ø>Ü>à>ä>è>ì>ð>ô>ø>ü>??? ????? ?$?(?,?0?4?8? >>>$>,>4><>D>L>T>\>d>l>t>|>„>Œ>”>œ>¤>¬>´>¼>Ä>Ì>Ô>Ü>ä>ì>ô>ü>? ??$?(?,?8? >>>$>,>4><>D>L>T>\>d>l>t>|>„>Œ>”>œ>¤>¬>´>¼>Ä>Ì>Ô>Ü>ä>ì>ô>ü>? ???$?,?4? >>>$>,>4><>D>L>T>\>d>l>t>|>„>”>œ>¤>¬>´>¼>Ä>Ì>Ô>Ü>ä>ì>ô>ü>? ???$?,?4? >>0>4>T>d>h>„>>¨>¬>´>¸>¼>À>Ä>È>Ì>Ô>Ü>ä>ì>ô>? ???$?,?4?÷€²ALªP؈©@Pô.text4>@ `.rdataÁ~P€D@@.data°'Ð&Ä@À.rsrcØê@@.relocÔò@B3Àƒ|$•ÀH%ÐÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸ÐÃÌÌÌÌÌÌÌÌÌÌ3Àƒ|$•ÀH%xÐÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èÆ4~4 ¸ u dž‰F4‹N¹ +NDƒÄ ;Á}PjjVè?ƒÄ _YÃÇFD ŠG€útP€ÿt)jVèl2h'hUhÔjjjèæ-ƒÄƒÈÿ_YÃh*hUhÈjjjèÅ-ƒÄƒÈÿ_Yö¶OÁà ÁƒÇ;}‰¶¶W‹NTÁà ‰¶G¶W‹NTƒÇÁà ‰¶G¶W‹NTƒÇÁà ‰AdƒÀðƒøwXÇF4 ‹FT‹V<‹ˆˆS‹Z‹PdUl ýÿ?vTjVè”1hBhUh(jjjè-ƒÄ][ƒÈÿ_YÃjVèi1h6hUhžjjjèã,ƒÄƒÈÿ_YËFD‹ý+øWÃPVè=ƒÄ ;ÇtPjjVè'>ƒÄ ][_YËFd…Àt‹Nh‹QVUSjRjÿЃÄ‹NT‹ƒÃ …À„ƒøt(jVèä0hShUj}jjjèa,ƒÄ][ƒÈÿ_YÃ…À„ÎjP‹ÃPVèŠÉƒÄƒøu{‰Flƒ~l…G‹Ž¼‹VT‹‚Á´QPSVèg‹øƒÄ…ÿt(V踃Ä÷†ô@„“PèÛ+‹èƒÄ…íu~h´hUjAjjjèÃ+ƒÄ][3À_YÃøÿtGƒ¾”u+jVè0hqhUh³jjjè‹+ƒÄ][ƒÈÿ_YÃjVè&ÃąÀ…<ÿÿÿjVèÓ/ƒÄ][ƒÈÿ_YÉ|$ ë‹ï‰D$ U3ÿè:+ƒÄ…À~2WUè&+‹L$PQè+ƒÄ…À} WUè+ƒÄOUGè+ƒÄ;ø|Î÷†ô@t!‹–¼‹‚´PèË*‹Ž¼ƒÄ‰©´‹FT‹‹HdÚƒù v(jVè-/h®hUjDjjjèª*ƒÄ][ƒÈÿ_YÃQƒÀhSPè1ƒÄ ][¸_YÃÌÌÌÌ̸èÆ04 ‹G‹NTÇF4A‹‘ˆƒÄ B‰VDÇFHVèŽ'ƒÄÃÌÌÌÌÌÌÌÌÌ̸$èÖ~4P‹FƒÄh Vè´Vè*ƒÄ ÇGT^_ÃÌÌÌÌÌSUVW‹|$‹wT‹^0‹n4h jVèR‰^0‰n4ƒÄ ÇF‰_LÇÇGP_^][ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ3Àƒ|$u‹D$‹@lÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌ̸(見D$,¶¶P¶@ÉÁá Êh@ Ááj( Èj‰L$L$ hhÑQèÝÿƒÄ…Àtƒ8u3ÀƒÄ(ÃÌÌÌÌÌÌÌÌÌ‹L$…Ét,‹D$‹@‹Ðâÿút3ÀËÐÁúˆ‹ÐÁúˆQˆA¸ÃÌÌÌÌÌ̸èSVWÆD$0èƒÿ‹øD$Pèíþ‹t$(‹Ž¼‹I‹FTƒÄ˜ …ÉŒ@ƒù07U3í9¨œ†éd$Wè.ÿ‹Ó+VTƒÄ„`ÿÿÿƒø0ájL$WQèþ‹–¼‹BƒÄ …À|ƒø0|hÀUh›h¬UèÚþƒÄ ‹†¼‹HQƒÀPT$Rè5þjD$#PL$(Qè$þ‹FTþD$+‹PdRƒÀhPD$4Pè þ‹FT‹ˆˆQŒPT$@RèñýjD$HSPèhþWènþƒÄ@WØècþ‹NTèƒÄ;©œ‚ÿÿÿT$Rè‘ýƒÄ]_^¸[ƒÄÃh“h¬UjDhñjèKýƒÄ]_^3À[ƒÄÃh‰h¬UjDhñjè&ýƒÄ_^3À[ƒÄÃÌÌÌÌÌÌÌ̸èVV‹t$ ‹†ÔŠŽÔW‹¾ÐÁøÆD$ˆD$ ˆL$ džЃÿvh,VhÂh¬Uè‰ýƒÄ T$ W+×RVè* ƒÄ …À} ‰¾Ð_^YÃ+ø‰¾Ðu‹Fd…Àt‹NhQ‹VjT$RjQjÿЃÄ_^YÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$Ç@0¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌVhöh¬Uh èiü‹ðƒÄ …ötrh jVè¥hþh¬Uh€è?üƒÄ‰F0…Àthh¬Uh€è!üƒÄ ‰F4…Àu-‹F4…Àt PèüƒÄ‹F0…Àt PèôûƒÄVèëûƒÄ3À^ËD$P‰pTè¿ûÿÿƒÄ¸^ÃÌÌÌÌÌ‹D$ƒ¸Ðu‹L$PǀЉˆÔèYþÿÿYÃÌÌÌÌÌÌ̸ è¦V‹t$‹–¼jD$PL$QRè)žƒÄ…Àu'jVèšÿÿÿjJhÀVhÎj|jèûƒÄ3À^ƒÄ Ã~|‹D$‰†€‰†ŒujShÀVhŒè"ûƒÄ ‰F|…Àt7‹F|P‰D$è¹ûƒÄƒ¾ˆu:j]hÀVhŒèîúƒÄ ‰†ˆ…ÀujshÀVjAj|jè“úƒÄ3À^ƒÄ ˆˆUP‰D$èbû‹D$‹h‹VTL-‰Šœ‹FTƒÄƒ¸œ0vh„VjehÀVèûƒÄ VèyûÿÿƒÄ…À]3À^ƒÄ ËL$ƒy ~hTVjjhÀVèÝúƒÄ ‹–¼‹FTSW‹|$$‹ß÷ÛÛƒÂR‹T$$#ÝŒ ‹D$QjRPè¾ú‹Ž¼‹VT÷ßÿ÷׃ÁQ‹L$8#ý„ ‹T$0PjQRèŠú‹FTŒ ƒÄ(‰H\‹vT_”3 []‰V`¸^ƒÄ Ã|$‹D$t‹ˆˆ‹PT‹RHƒÀTë ‹H|‹PT‹R@ƒÀT…Ét'V‹1ƒ~^u ƒÂÁêÒÒÒ‹‹@XRPPQè"úƒÄÃÌÌÌÌÌÌÌÌÌÌÌ̸èfÿƒ|$SUV‹t$ ‹NTWt‹Ô‹y`‹YL‹iTë‹Ð‹y\‹YD‹iP‹ÈÁé‹ÐÁêˆL$$ˆT$%‹ÈT$ÁéRˆL$*ˆD$+è ù‹†€jPL$Qèòø‹V|Rè—ùPD$(WPè×øSL$4UQèËøjT$TRD$DPèºø‹L$`jQT$PRè-ùD$TƒÄDPèxøƒÄ_^][ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹ñ‹FTW‹x(;û|2ƒ|$t^P)X(‹vT^,_‹Ã^ËH0H,‰^P‰NL)X(‹vT^,_‹Ã^Ã~`u‰\$ ¹€9L$ v‰L$ U3í…ÿu9nPt9l$u 3ÿëG9l$t‹NL‹@0‹nP;Èt*/RQPè/þë‹H,…Ét‹@0WÈQPèþ‹VT‰j,ƒÄ ‹FTÇ@(;û‹NT‹Q0‰VL}=jÿ‹È‹AX‹IHÁéƒè€á?ˆ‹VTƒzt€É@ˆ‹NT¶QHˆP‹NT¶Q<ˆP‹NTƒA ë#‹ø‹OH‹GXÁé€É€ƒèˆ‹VTŠJHˆH‹NTƒA ‹VT‰B8‹FTÿ€Ô‹NT‹D$‰A‹VT‰j‹NT‰Y$‹VTPUÇBèþüÿÿƒÄ]_^[ƒÄÃÌÌÌ‹D$Hƒøwÿ$…PK¸ËøÊøÉøÌøýÃ1K7KIK=KIKCKÌÌÌÌÌÌÌ̸è¦ù¡ô3ĉD$‹D$ SUW‰D$ 3íVèfƒÄ©0t9nu‹N VÿуÄ;ÅŒC„†Uÿ‹È~F»9žt9¶¶oÁà ÅhƒÇ;Õt!…žôuhhüVhêé>ƒïë‹ÐjQWWRèºàƒÄƒø0u3‹†¶‹ÐÁú;Êu8GtK÷†ô€t‹‹ÐÁú;Êu8Gt/è€à‹†ÁøˆŠŽWj.RˆOèû߃ąÀŽÑ‹–¼‹F‹Hd‹A j0WƒÂRVÿÐ‹Ž¼j0W‰AèzàƒÄ_[^¸]ƒÄÃh hüVh¨éY¨„¶¶_Áà ÃXƒÇ;Ót"ö†ô€uhbhüVh”é9ƒï‹Â;ÕuhohüVhìé‹™L;ÝuhwhüVh«éãUPWè¤à‹èƒÄ …íuhhüVh‚éÙSUWèyà‹ØƒÄ …Ûh‰hüVjé·‹VX‹‚LPèÞß‹NXUÇLè7à‹Ž¼‹V‹Bd‹P SWƒÁQVÿÒ‹Ž¼SW‰AèO៎ _[^¸]ƒÄË؃ã@u„ÀxhòhüVhùé#ÇD$èÍ߉D$;ÅuhghüVjAé;Ýt‹–”‹BT‹h ë ‹NX‹©PUèßU‹Øèß‹T$SR‹èèl߃ąÀ„Ë‹D$UPèP߃ąÀ„µSè9ß‹èƒÄ‰l$ …íuhˆhüVjAéƒ|$0…˜öD$(€th“hüVh7ë_‹Ž¼‹‘”RèÀ݃ĉD$…Àt38˜u+‹@ PèÄÞPUè·ÞƒÄ …Àu h¯é-ÇD$ësh§hüVh9h‹jè7݃Äj(jVèh{ƒÄ é èaÞ‰D$…Àuh¼hüVjAéܶPQGWUSè4ރąÀu hÇé¶‹N<‹ySèރąÀhÕhüVj+陋T$jRƒÀ™ƒâÂUÁøPWèØÝ‹ØƒÄ…ÛhÜhüVj+ëg‹D$Pè©ÜUè«Ý‹L$Qè›Ý‹T$$Rè‹Ý‹–¼‹F‹Hd‹A SWƒÂRVÿÐ‹Ž¼SW‰AèýÜ‹D$DƒÄ(_[^]ƒÄÃh€hüVjh‹jè܃ċT$Rè3Ü‹D$$Pè1Ý‹D$ƒÄ…Àt Pè݃ċL$Qè݃Ä_ƒÈÿ[^]ƒÄÃÌÌÌÌÌÌ̸ èâS‹\$‹C‹P0WL$ Qhjÿh¡!3ÿh !S‰|$ ‰|$(ÿ҃ĉD$9|$ „΋ƒ¼UV‹°”;÷tVè Û‹èUVè ÝƒÄ ë‹D$3ö3í‹KXƒ¹DtPº‰‘X;÷t(ƒÈt#h* hüVh®hˆjr èÛé?U‰T$è1Û‹D$ƒÄ^]_[ƒÄ Ã;÷u%h3 hüVhºhˆjèßÚ¾ éý¨u%h: hüVhÜhˆjè¶Ú¾/éÔ9¹”thA hüVh…먋{@¶7¶O‹D$ Áæƒè ñƒÇ;ð‰D$ ~hL hüVhŸéuUèöÛƒÄ;ðU‹L$ ;ÈI…ÉŽA‹Eƒøui‹U ‹CXRVWj$¸Pjrè±ÛƒÄ…À}"hb hüVjvhˆj¾3èõÙé…¶hh hüVjzhˆj¾3èÍÙéðƒøtuD‹M ‹SX‹EQVWjÂÈRPè:ۃąÀmhx hüVjphˆj¾3è„Ùé§=˜ua‹M ‹SX‹EQVWjÂÈRPèéڃąÀ"h‰ hüVh1hˆj¾3è6Ùë\UÇD$èJÙ‹D$ƒÄ^]_[ƒÄ Ãh hüVjDhˆjèÿؾ+ë hT hüVh hˆjèÝØ¾2ƒÄVjSè wƒÄ UèçØ‹D$ƒÄ^]_[ƒÄ ÃÌ̸èöÞS‹\$‹“ü‹C‹@0VWL$QRjÿh!3ÿh€!SÇD$,ÿÿÿÿ‰|$(‰|$$ÿЃÄ‹ð9|$„Ö‹CX‹ˆDUƒù…Ÿ‹‹ÄöÁt9öÁt4h¸ hüVhÇh‰jè!؃ľ(VjSèNvƒÄ éS;~<9¸ˆt4h¿ hüVhéh‰jèÝ׃ľ VjSè vƒÄ é]_^Ç€X¸[ƒÄÃù t4hÊ hüVhh‰j¾ èˆ×ƒÄVjSèºuƒÄ é¿‹K@‰L$(èÂ׋è‰l$;ïu hÑ hüVjAh‰jèF׃Äéš‹D$(¶¶x¶HÁâ úÁç ùƒÀW‰D$(;Öt4hÙ hüVhŸh‰j¾2è÷ÖƒÄVjSè)uƒÄ é.3É…ÿw_UèËփąÀz;…Vh hüVh°h‰j¾(è ÖƒÄVjSèÒtƒÄ é×ë¤$‹D$(¶¶pÁâ ò¶PÁæ òƒÀl‰D$(;ïwY‰D$ VD$,Pjè©ÖƒÄ ‰D$…Àtn‹L$ Î9L$(…¬‹T$PRèwփąÀ„ ‹ÍÇD$;Ïrˆ‹l$é$ÿÿÿhâ hüVh‡h‰j¾2èáÕƒÄVjSètƒÄ ëhê hüVj h‰jè¸ÕƒÄ‹D$…Àt Pè¿ÕƒÄ‹D$…Àthê>PèA׃ċD$]_^[ƒÄÃhð é|ÿÿÿhõ hüVjA릋ƒÄ¨tY¨tUh éýÿÿUSè _ƒÄ…À=‹ƒàPèV‘h hüVh²h‰j‹ðèÕƒÄVjSèMsƒÄ éRÿÿÿ‹‹¼‹”…Àt Pè ÕƒÄUè’Ö‹“¼‰‚”‹ƒ¼‹‹à‰ˆ˜‹“¼ƒÄƒºu*èA]‹‹¼‰‹“¼ƒºu h% é5ýÿÿ‹ƒ¼‹€ƒ8t‹hê>Qè փċ“¼‹‚‰(]_ÇD$‹D$^[ƒÄÃÌÌÌÌÌÌÌÌÌV‹t$~4@!uaVèŒ@ƒÄ…Àu9‹NX‹‘H‹J áÿù thK hüVjDhšjèõÓƒÄ3À^ÃPV赉ƒÄÇF4A!‰FDÇFHjVè ‡ƒÄ^ÃÌÌÌÌ‹D$=Ä$t-™tƒè…«¸øøÃ;ýÿÿƒø‡‹ÿ$…Ük¸øøøøøøøø ø ø ø ø øøøøøøøøøÃ3Àèk®k´kºkÀkÆkÌkÒkØkØkØkØkTkZk`kfklkrkxk~k„kŠkk–kœk¢kÌÌÌÌÌÌÌÌÌÌÌ̸tèÆØ¡ô3ĉ„$pSUV‹´$„~4ð!…q‹†¼jPè“­‹èƒÄýÿ¿‹V<ŠQRèœÒƒÄ…À„¤h· hüVUèEÒ‹ØƒÄ …Û„‡‹Ž¼D$ PQ‰\$è5­‹V<‹B‰D$ƃD$D$ PèµÒŒ$°Qè°Ó‹–Ø‹‚4ƒÄ…ÀtQjŒ$¨QT$ RŒ$xQ”$lRVÿЃÄ…À½Sè®ÑƒÄ^]ƒÈÿ[‹Œ$p3Ìèõ×ÄtÄ$ljPèQÑ‹–؃ÄŒ$lQÂ$RjèÓPD$(PèÒƒÄjèýÒ‹ŽØPjÁQ”$´RèÚÒ‹†Ø‹ˆƒÄ‰Œ$\‹P‰”$`‹H‰Œ$d‹P ‰”$h‹T$ ‹†¼Šˆ×ˆ ‹D$ ‹Ž¼@‰D$ ¶‘Öˆ‹D$ ‹Ž¼@‰D$ ‹‘ÔÁúˆ‹D$ ‹Ž¼@‰D$ ¶‘Ôˆ‹D$ ‹Œ$\ƒÀ‰D$ ‰‹”$`W‹ø‹D$‰P‹T$‹Œ$h‰J‹L$‹„$lT$‰A ƒD$RèïÑ‹L$P„$xPQè|ÖT$,RèÒÑ‹L$$ÈUSD$0PQ‰L$4L$@Qè°Ñ‹D$8D$Ä‹Œ$ƒÄ_^][3̃ÈÿèœÊƒÄ|ÃÌ̸ èFÊSUVW3íUÿèT‰D$3ÿƒÄE‰|$‰l$è ÊÙîÝ$D$ jPèWăÄè%ÄUÿ‹ÑÁú‰t$;ú…È8N…¿ƒÆ‰t$$¸˜¹ó¥‹|$$ƒÇ ‰|$$¶/G‰|$$ƒý ‡g…í„æ‹‹¼;iD…׋ÅqHƒýr‹;…ÃèƒÆƒÇƒøsè…Àt,Š:…§ƒøvŠV:W…–ƒøv ŠF:G……‹ƒ˜;AhuO³œylƒør‹;u;ƒèƒÆƒÇƒøsì…Àt Š:u#ƒøvŠN:OuƒøvŠV:Wu ÇClë{hh Whh’jÇD$$/è]¶ƒÄéÛ‹ƒ¼ÇClƒxDvjSèèMƒÄ…Àu ÇD$P鬋‹¼‰iD‹T$$‹ƒ¼URƒÀHP肼ƒÄ ‹D$$‹KʼnD$$‹QHPÿÒ‹ðƒÄ…öu+hh Whøh’jÇD$$/èÆµƒÄéD‹C‹HLjjÿÑD$,Sè–VP艵ƒÄ…À}+h(h Whh’jÇD$$/èwµƒÄéõ‹ƒ¼‹ˆ¬…Ét ‹Q‰°ƒ{ltE‹ƒ¼‹ˆ°;Nt4öƒôu+h7h WhÅh’jÇD$$/赃Äé‘‹SX‰²H‹L$$¶A‰L$$…ÀuY‹SX‰‚„;Ž¿‹L$‹T$D$PQRD$0PSèÁ‘ƒÄ…Àuhh_h Whßh’jè¡´ƒÄéP‹ƒØ‹ˆ˜QèôhƒÄ…ÀuhPh Whh’jÇD$$/è\´ƒÄéÚSèl”ƒÄ…À)hdh Whàh’jè,´ƒÄ_^]ƒÈÿ[ƒÄËL$‹T$Ê9L$$„)üÿÿhoh Wjsh’jÇD$$2è곃Ä_^]ƒÈÿ[ƒÄÃhöh Wh,h’jÇD$$/è¹³ƒÄë:häh Wh h’j虳‹D$8¶H‹âÿƒÄ ʉ ÇD$F‹D$PjSè«QƒÄ _^ƒÈÿ][ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸è–¹SU‹l$$‹•ü‹E‹@0VL$QRjÿh13Ûh0UÇD$0ÿÿÿÿ‰\$$‰\$(‰\$,ÿЃÄ‹ð9\$„ò‹EX‹ˆDƒù „Ñ‹H÷B t ƒù„¹Wƒù thšh W¾ jr醋}@賉D$;Ãu h¡h WjAhj貃Äé;¶¶O¶WÁã ÙÁã ÚKƒÇ;Îth©h W¾2hŸé3É…Û†ƒ¶7¶W¶GÁæ òÁæ ðDƒÇ‰D$$;ǶVL$0Qj‰|$8èi²ƒÄ ‰D$…À„¯÷9t$,…¹‹T$PRè7²ƒÄ…À„¼‹L$$‹|$,ÇD$;Ër‚‹D$PUèw;ƒÄƒ½Ä„—…À‹…àPè³mh×h Wh†hj‹ðèx±ƒÄVjUèªOƒÄ éh²h W¾2h‡éh»h W¾*j éhÁh W¾2h‡éíhÆérþÿÿèy±è–9‹ð…ö„´‹¼‹…Àt PèÖ9ƒÄ‹•¼‹D$j‰²P‰è¹°‹øWÇD$ èë°‹Ø‹EX‹ˆH‹Q 3ÀâÿƒÄ ú •À‰\$‰D$$…Àt*…Ût SèÛ²ƒÄ…Àthüh WÇD$hïë/SWèl3ɃÄ‹Ø9L$$„¶;Ù}8hh W‰L$h÷¾hjè#°ƒÄVjUèUNƒÄ éÅh h WjGjP‰^è°‹DÞ \Þ ƒÄ…Àt Pèø¯ƒÄ‰;‰^‹…¼‹€”…Àt PèÚ¯ƒÄhh WjGjP躯‹¼ƒÄ‰¹”3Éë-‰^‰N‹•¼‹‚”;Át P葯ƒÄ3É‹…¼‰ˆ”‹•¼‹…à‰‚˜‰L$ÇD$‹L$Qèd¯‹T$RèN¯‹D$hê>Pè×°‹D$,ƒÄ_^][ƒÄÃÇ€X¸^][ƒÄËD$‹‰L$‹T$‹‰D$éG±ÌÌÌÌÌÌÌW‹|$‹G‹P0L$Qh@jÿháhàWÿ҃ă|$„‹OX‹‘DƒúuÇXBí_ÃSVƒúth¬h W¾ jr醃ø}h³ëk‹w@¶‹—¼ÁቊԶV‹¼FÁâ ‘Ô¶V‹¼FÁâ ‘Ô¶V‹¼ ‘ÔF¶^¶NFÁã ÙSƒÆ;Ðt6h½h WhŸ¾hjèä­ƒÄVjWèLƒÄ ^[ƒÈÿ_ˇ¼‹€Ì…ÀtPèî­‹¼ƒÄÇÐhÅh WSèÑ­‹—¼‰‚Ì‹‡¼ƒÄ ƒ¸Ìu"hÈh WjAhjè_­ƒÄ^[ƒÈÿ_ÃS‹È‹‘ÌVR迳‹‡¼ƒÄ ‰˜Ð^¸[_ÃÌÌÌÌÌÌÌÌÌÌÌW‹|$‹G‹P0L$Qh@jhñhðWÿ҃ă|$„ƒøSV}héh W¾2hŸéÕ‹_@Š C€ùthðh W¾2hIé±¶3¶S¶KÁæ òÁæ ñVƒÃ;Ðth÷h W¾2hŸë|‹‡(…Àt P謃ÄVSèÁ®ƒÄ‰‡(…ÀuhëB‹‡Ø‰·,‹ˆ8…ÉtZ‹€<PWÿуÄ…Àuh h Wpqh<ë}3hh WjA¾Ph jè遲ÄVjWè!JƒÄ ^[ƒÈÿ_Ã^¸[_ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$‹F‹P0L$Qjjhah`Vÿ҃ă|$t6…À~-j2jVèÇIh-h WhŸh‘jèn«ƒÄ ƒÈÿ^ø^ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸Pè–±¡ô3ĉD$LSU3ÛV‹t$`~4€W‰\$‰\$‰\$ ‰\$…ò‹F<‹x‹NX‹‘H‹B ‰|$(ƒÇ¨„6‹†¼‹€‹H<;Ët‹Ùë3‹H Q諃Ä;ă8…ø‹H ;Ë„íP‹ÙèÒªƒÄ‹–ІL$.Áúj.QˆT$4ˆD$5è6«ƒÄ…Àާ‹–¼ÇB0>‹ï~ƒÇjSWD$8Pj0èõªƒÄ÷†ô‹ØtþG÷†ôtÆD$,p…Ûh|h Wjwé4>~‹ËÁùˆ]ˆMƒÃ‹V‹Bd‹–¼‹@ j0L$0QƒÂRVÿÐ‹Ž¼T$…ä¶FHÿƒù‡Ô‹…`Ô…À„ÅPè‹èƒÄ…íu h&h WjhjèÌšƒÄé‹T$$UR蜃ąÀu h+h WjhjèššƒÄéçUè‹D$(Pèð›‹OX‹‘HƒÄöB‹è‰l$Ht)U蜛ƒÄ=£~h6h W¾<h6é{UƒÆ莛ƒÄ‰D$(…À„ñèh›‰D$0…À„à¶.‰l$,ƒÅF;ë´‹L$,‹T$(P‹D$LQVRPè-›ƒÄ…À„“‹D$t$,+Ý©t‹¼‹‘‹B ë©@t‹¼‹‘‹B4PèÖ™‰D$ƒÄ‹L$(‹T$$QR蜋‡¼‹ˆ‹T$,‹D$8P‰QDÇD$0苚‹L$4Q蚃ÄÇD$(é1üÿÿhLh W¾2h2érh@éæúÿÿhh W¾Ph:éO¨@„ñûÿÿhkh W¾ hôé.ƒ|$„°¶¶F‹L$Áâ ЃëQ‰T$ƒÆ‰\$LècšƒÄ9\$…i;Øa…ÛŽY‹T$‹ƒø…D$PÇD$,‰D$»‹ÿL$4jQ耚ƒÄƒûu‹—Ø‹‚Œë ‹‡Ø‹€jPL$F‰|$(ƒÿv ÇD$(‹|$(3À;ývd$Š0‹KXˆ”d@;Çrî¶>¶l>÷Áà èL/ƒÆ;L$ tJj2jSè×1hKh WhŸh‡jè~“ƒÄ ‹D$…Àth„AP蕃ċD$_^][ƒÄÃ3À…ívj¶¶~Áâ úD8ƒÆ‰D$ ;Ň£WD$Pj‰t$ èΕƒÄ …À„±÷9t$…Ö‹L$PQèT“ƒÄ…À„Þ‹D$ ;År›‹|$(‹SXÇ‚\‹CX‰¸`‹KXƒ¹lt‹Ñ‹‚lh„APèd”ƒÄ‹KX‹T$_^ÇD$‹D$]‰‘l[ƒÄÃ÷ƒô u*j2jSè¸0hWh Wh„éÜþÿÿ÷ƒô t èÁ’écÿÿÿj2jSè„0heh Wj é«þÿÿj2jSèi0hmh WhƒéþÿÿhréþÿÿÌÌÌÌÌÌÌÌÌÌ̸èF˜UV‹t$3í~4pW‰l$‰l$ u%‹†”;Åt‹9(t9ht ÇF4rëÇF4q~4q…ðD$ PL$QVèjñÿÿ‹øƒÄ ;ý}_ÇF^ƒÈÿ]ƒÄÃÇFƒÿuV9l$ t3‹D$;Åt+PVÇF4qèXdƒÄ…Àt‹T$ RVè¦\ƒÄ…Àu!3ÿëh­ h Wjjh—j3ÿè#‘ƒÄ‹D$;Åt Pè*‘ƒÄ‹D$ ;Åt Pè%‘ƒÄ;ýu7>u"‹FXj)jV‰¨\è/ƒÄ _^¸]ƒÄËNXÇ\ÇF4r~4ru1‹VXÇF4sƒº\u3Àë ‹†”‹‹PVèYFƒÄ‰FD‰nHjVè¸CƒÄ_^]ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸視UV3íWU‰l$ÿèT‰D$3ÿƒÄE‰|$ ‰l$è}–ÙîÝ$D$ jPè´ƒÄè‚UÿQPè–‘ƒÄ‰Fé,VèuÖÿÿ‹øƒÄ;ýŽ‹Nl÷ÙÉá Á0‰N4éûèèíÿÿ‹ø;ýŽôƒÿu"‹–0÷ÚÒƒâÂÐÇFl‰V4éÅ‹FX‹ˆH÷A u1VèÿÚÿÿ‹øƒÄ;ýލ‹–÷ÚÒâ°Â@‰V4é‚ÇD$ÇF4@énVèJîÿÿ‹øƒÄ;ýŽcVÇF4P‰nDè]êÿÿƒÄ…À„Eé>Vè·øÿÿ‹øƒÄ;ýŽ0ÇF4`éVèøáÿÿ‹øƒÄ;ýŽ‹FX‹ˆ\÷ÙɃáðÁ€‰N4éëVè‡ûÿÿ‹øƒÄ;ýŽàÇF4€éÌVèâÿÿ‹øƒÄ;ýŽÁ‹FXƒ¸\u ÇF4é¡ÇF4 ‰¨”éVè«çÿÿ‹øƒÄ;ýŽ„‹VXÇF4 ‰nD‰ª”égh¡h Vè†B‹øƒÄ ;ýŽO‹FX‹Ž¼ÇF4°‰nD‹H‰‘¬‹FX‹€„;Åu‹Ž¼‰©¨ë‹–¼‹‰‚¨‹N‹Qd‹BVÿЃÄ…À„í‹N‹Qd‹BjVÿЃÄ…À„ÔéÍ‹N‹Ad‹P$‹@ RPh±h°Vè@‹øƒÄ;ýާ‹FXÇF4ƒ û9nlt+‹VX¹‰ŠT‹FXö„s‰N4ƒ‹FX‰héb9®0t‹NXÇTàéH‹VXÇ‚TÐé6VèòÜÿÿ‹øƒÄ;ýŽ+ÇF4ÐéVè“Þÿÿ‹øƒÄ;ýŽ ÇF4@éøhÑhÐVè @‹øƒÄ ;ýŽã‹Fl÷ØÀ%ƒÀ‰F4éÄ‹†Ø‰N(ÇF4H8ë=@t =P…v‰n$;ýt jjVÿ×ƒÄ ‹áÿù…bÇF9nÁ„ÂOÁbÁqÂá¿   ‹D$‹L$‹‘°ƒÀûƒøCwe¶€ÌÃÿ$…°Ã‹L$ ‰J¸ËD$ ‰B¸ËL$ ‰J$¸ËT$ ‰‘ü¸ËD$ ‰8¸ËT$ ‰‘4¸Ã3ÀËÿTÃaÃnÃ{ËÛëø(è‹D$,¶¶Ph@ j(ÉjBÁáD$ ÊhÈÔP‰L$èF{ƒÄ…Àtƒ8u3ÀƒÄ(ÃÌÌ‹L$…Ét$‹D$‹@‹Ðâÿút3ÀËÐÁúˆˆA¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$SUV3ö÷€ô@W‹¸”t‹D$‹\$‰D$ë ‹L$‹\$‰L$S3íèèyƒÄ…À~nUSèÔy‹ðVWè â‹F ƒÄ%ÿ3ÉöFt‹W ë‹W#Ð;ДÁ‹Á…ÀtV‹t$Vè’yƒÄ…À}SEèyƒÄ;è|¨_^]3À[ÃPVèuyƒÄ_^][Ã_‹Æ^][ÃÌÌÌÌÌÌV‹t$‹NX‹‘H‹R ‹L$ 3ÀöÂt ÆÆA¸>uöÂt Æ@Æ@Æ@Æ@öÂ@t>|ÆA@ÆB@>|Æ@@^ÃÌV‹t$ƒ~,um~4@td‹F0¨ujƒÈjV‰F0èƒÄ ë2‹NXƒ¹ t‹V‹Bh<\jDhjè%qƒÄ_^]3À[‹L$d3Ìè¥wƒÄhÃD$,PèQq‹L$@‹T$$‹D$,QRPèiwƒÄƒ|$„ªjè²qPL$4QèqWT$jÿ‹Øu ƒûFuXâë…Û|\ƒ|$u‹†¼…Àt‹ŽØPQèAþƒÄ‹VXŠL$Ç‚ ‹FXˆˆ¤‹VXˆš¥‹FXƒ¸üu ‹N‹QßÿÿƒÄ…À„cþÿÿ‹N VÿуÄ;ÃŒf„¿ö†ø…?þÿÿ‹VX9šì…0þÿÿVÇF裮‹ðjVèOZj VèAZƒÄé‹FXƒ¸T‚£¶¨P¶¸Q‰˜T‹Fd;Ãt‹Nh‹VXQ‹VjÂPRjQSÿЃÄ‹†Ì;Ãu‹–Ø‹‚œ;Ãt‰D$9\$t‹ÅÁà ÇPh@VÿT$ƒÄ ƒý…‹NX‰¹˜;û…_ýÿÿƒN0_]^3À[‹L$ 3Ìè]ƒÄ$ÃöF0…~‹ƒúue9o…9_…”‹O €9…ˆ9˜H„h‰_‹Fd;Ãt‹VhRVUQ‹jQSÿЃÄ‹VXV‰ª”èPóÿÿƒÄ…À…åüÿÿéñƒ¸\re9^u`‹V4âÿƒúu ‹¨u¨t÷ÙÉáÁ‰N4‰n(‹F VÿЃÄ;ÃŒ§„ö†ø…€üÿÿ‹NX9™ìé<þÿÿƒú|ƒúŽ8ƒú„Ü>…1‰_éGüÿÿhhhL\h‘é$‰__‰n]^3À[‹L$ 3ÌèÂ[ƒÄ$ÃVèòǃÄ©0tƒ|$<u9^|uh~hL\jdéÜ‹D$D;ÃŽó‹O‹é;Áw‹è‹W W‹D$URPèN[ƒÄ 9\$Hu)o‹Go;Ãu ÇF8ð‰__‹Å]^[‹L$ 3Ìè7[ƒÄ$ÃhæéLûÿÿhÓhL\¿2jiécƒý…}‹NXh%hL\—èRh”ÇFj‰¹œèITWhp\D$LƒÄPWè.LƒÄPèMKƒÄ…ÀtWD$PWèLƒÄPL$,jQèýKƒÄ…À~5‹|$ WèÔHUWèÁHTRV‰D$(èºIƒÄ…À…Iÿÿÿh/éPD$$Pè±KƒÄ‹Œ$œ‹‘Ø‹‚”…À„¹P3ÿèUHƒÄ…Àަd$‹„$œ‹ˆØ‹‘”WRè&H‹èjUè:H‰D$$DPV‰D$0è/IƒÄ…À„Ê‹F‹L$ÉD$‹ÑÁúˆ‹T$‹ÁÁøˆB‹D$ˆHƒD$L$QUèåG‹”$¤‹‚Ø‹ˆ”‹\$ QGè¯GƒÄ ;øŒ^ÿÿÿ‹FƒëƒÀ‰D$‹ÓÁꈋL$‹ÃÁèˆA‹T$ˆZƒD$‹v‰t$ƒÃÆ ‹D$@‰D$‹ËÁ鈋D$‹Ó_ÁêˆP‹L$ ^]ˆYC[ĈÃhQht\jh“jè.GƒÄ_^]3À[ĈÃÌÌÌÌÌÌÌÌÌÌÌÌSUV‹t$‹FXƒ¸XWt]Ç€X‹D$ …À|$‹NX9Dthwht\¿ hôéU‹T$(Ç‹F<‹H‹VXƒÁ‰N@‹‚@_‰FD^][Ël$‹F<‹x9n4…¬»9^D})‹ÿ‹FD‹Nj‹Ó+ÐRÇP‹A4jVÿЃÄ…À~HFD9^D|Ùƒ~$uP€?uK€uE€u?€u9‹FdÇFD…Àt¢‹Nh‹QVSWjRjÿЃÄë‹L$(_ÇF^]Ç[ËD$ ‹\$…À|¶;Ðt4h¬ht\¿ hôëi€?uý€!uû!u VèŸ×ÿÿƒÄ¶‹NXG‰D¶¶o¶GÁâ êÁå è;l$$vhÁë ýûÿÿvAhÇht\h˜¿/hŽjègEƒÄWjVè™ãÿÿ‹D$4ƒÄ _^]ǃÈÿ[Ã…ítA‹V¶€dûÿ$…@û¸0ø*ø3ø-ø,øPø(ø+ø.à ûûûû(û"û4û.û:ûÌÌÌÌÌÌÌÌÌÌÌV‹t$‹FXƒ¸àWu<¶†ôƒà Áà hZ¸Hht\Wè9CƒÄ …Àt9‹NX‰à‹VX‰ºä‹FXƒ¸ðuQhdht\h IèCƒÄ …Àu hlht\jAhœjè¥BƒÄ_3À^ËNX‰ð‹VXÇ‚ô I‹FX‹ˆà_‰NL¸^ÃÌ‹D$ƒøué²ÿÿ=uéÖTÿÿ=uéª3ÀÃÌÌÌÌÌÌ̸0àÃÌÌÌÌÌÌÌÌÌÌ‹D$ƒøué‚*ÿÿ=uéf‡ÿÿ=uéš3ÀÃÌÌÌÌÌÌ̸$èFH¡ô3ĉD$ SUVW‹|$83Û4"‰\$‰\$½"…%Wè‘þÿÿƒÄ…À„¹j WènƒÄ‰D$ƒø …¤‹wL‹‰D$$‹N‰L$(f‹Vf‰T$,¶F ˆD$.Š„À‰Š€~…€ŠF„Àu#€~u÷‡ô…ªÇD$é<…•€~‹‡ôr©uljo4ét©uljo4é_©…TÇD$éG<…º€~…°€~…¦ŠF„Àu€~r €~ …„Àu€~r ¶F ƒø|>‹‡ô©uÇÇD$éá©…ÖÇÇD$éˇô©uÇÇD$飩…˜ÇÇD$é…‹ØTjVh¸\ÿÓƒÄ …ÀtXjVh°\ÿÓƒÄ …ÀtGjVh¨\ÿÓƒÄ …Àt6jVh \ÿÓƒÄ …Àt%jVh˜\ÿÓƒÄ …Àu(h€h„\h›é¯h{h„\hœé›3Û9o4…Ø‹OL¶¶Q¶IƒàÁà Á=ÇD$‰T$‰D$~h›h„\hÖéOƒÀPWèƒÄ;ÃŽI‹WP‹GLƒêRƒÀPWèoÑÿÿ‹GdƒÄ ;Ãt‹Oh‹WPQ‹OLWƒêRƒÁQSjSÿЃÄ‹oL¶U¶]ƒÅ¶M¶EƒÅƒÅÁá ȶEÁã Ú¶UÁà ‹W<‹rT ƒÅ;WPth®h„\hÕ養T$ÆF‰t$ ƒÆÆFˆFº ƒø w‹Ð3À‰‰F‰F‰F ‰F‰F‰F‰FËR‹ÆÍ+ÂQƒÀ PèÛDƒÆ ÆF‹ÖƒÄ 3ɃÆ3À‰T$…Ûv(d$€<(u¶T(ˆ¶T(FˆFƒÁƒÀ;Ãrà‹T$ˆJ‹ÁÁøˆÆ½Æ.‹O<õ+q‹L$ ƒî‹Æ‹ÐÁúˆˆA‹ÐÁúˆQ‹OX‰©X‹WX‰ªD‹OX‰@3Ûéî‹l$ƒý…ÓW9_TuèiAÿÿƒÄ…À„¡ëè·=ÿÿƒÄ9_Xt Wè)¶ÿÿƒÄ‹WƒÄ…À„p‹‡ôÇG4 ©t©t‹GT‰X ë ‹OTÇA ‹t$‹WTVL$(ÇG8ð‰wP‹B0QP‰GLè™C‹WT‰r(‹GTƒÄ ‰X,èi%ÿÿ‰G‹HW‰O ‰_DèwÀƒÄ_^][‹L$ 3Ìè{CƒÄ$Ãýt ƒý…’jWè‹­ƒÄ…À„Ël$ÇG4!ƒýu=‹t$‹WXVL$(ÇG8ð‰wP‹‚àQP‰GLèC‹WX‰²ì‹GXƒÄ ‰˜èë‹OX‰_P‰™ì‹WX‰šè?uèáëèšÿÿ‰G‹H‰O ƒý|$ƒýW‰_D访ƒÄ_^][‹L$ 3Ìè²BƒÄ$Ãh;h„\hüjvjè<ƒÄƒÈÿ‹L$0_^][3ÌèBƒÄ$ÃÌÌÌÌÌÌ̸è&BSVWjÿèT‰D$3ÛƒÄCè BÙîÝ$D$jPèA<ƒÄè<SÿÇD$(ÇD$ëZ©u ÇD$é]ÿÿÿ©…RÿÿÿÇD$ébÿÿÿ=uÇD$(ÇD$ëƒø…øÇD$(‰D$‰……ÿ„ŠT$(ŠD$sÆ~ ‰t$ FˆjFWˆUFèUšƒÄPUè{œƒÄ…Àu&h/hÀ\hµjtjèn8ƒÄ_^]ƒÈÿ[ƒÄÈF‹ÈÁùˆÆFÆFŠ•ôƒÆ€âø¶ÚƒÆ÷ÛÛƒãðƒÃ ˆ^3É‹ÃÁøˆ‹EX¸‰‰H‰H‰H ‰H‰H‰H‰H‹MX+ËÁØSQèù7ƒÄ…ÀŽ%‹UX+ÓSÂØRWèO>‹D$(+Ø\;þ‹ËÁù€É€ˆˆX‹D$,SPSU‰UDÇEHèãÉÿÿƒÄéjŠL$(ŠT$ˆK ƒÃ ‰\$ ˆS‹uXCC‹ûƸ¹ƒÃ ó¥ÆCh`ÄCPU虃ÄPUèB›ƒÄ…Àu hléÂþÿÿ‹ÈÁùˆ ˆC‹•Øt‹‚˜…Àu3Ûë Pè7ƒÄ‹ØŠÃþÀˆF3ÿ…Û~'¤$‹Ø‹‘˜WRèÝ6ŠˆGƒÄF;û|à‹|$@ÆQFVUèú ‹ðƒÄ …öuhhÀ\jDé;þÿÿ‹Ö+T$ Æ*_‹ËÆA‹ÂÁ舋ˆQÁèƒÂˆAú@vh’hÀ\jDéûýÿÿ¶D$(ƈG¶D$OˆAA‹ÂÁøˆAA‹Æ+LjQ‰EDƒÀûPSUÇEHètÈÿÿƒÄ ‹|$ÇE4ÇEHUèi‹ðƒÄƒþ|r‹Ed…Àtk‹MhQ‹MPT$$R‰t$(jðè(ƒÄ ‰D$(…À„;t$ …&ƒ» uèê$‰ƒ …À„'‹D$(P‹ƒ PèÅ$ƒÄ…À„,…ímÿÿÿ¶.¶NÇþÿÁå·× éƒÆ;ê%‰t$ …í~6UD$$Pjèƒ'ƒÄ ‰ƒ$…À„©î;l$ …ë ǃÿÿÿÿ‹D$,·ÏñƒÀü;ð†ªüÿÿ‹T$$‰2]_^¸[ƒÄ Ë“¼‹‚ÈPèý#‹‹¼‹T$4ƒÄ]_^ÇÈÇp3À[ƒÄ ËD$0]_^Çp3À[ƒÄ ËT$0]_^Ç23À[ƒÄ ÃPèÆ&ƒÄ‹L$0]_^Ç23À[ƒÄ ËT$(Rè¥&‹D$4ƒÄ]_^ÇP3À[ƒÄ ËL$(Qè„&‹T$4ƒÄ]_^ÇP3À[ƒÄ ËD$0]_^Ç23À[ƒÄ ÃÌÌ̸èF)‹L$‹D$ ‹T$ÑV‹0BþÇD$‰T$;ðr¸^YÃSUƒÆBüW‹|$;ð‡ôëI¶¶FfÁáf ȶFƒÆ·Ù¶fÁáf È·é·ÅƒÆ 0‰L$$;ʇs‹…Ét‹— RPV·ÃP¾VWÿÑ‹T$8ƒÄë¾f…Ûuƒ¿„åf…í‡Ü‰t$ëWfƒû#u/jjj WèÕœƒÄ©@…Èf…퇿‹T$ ‰·0ë"fƒûuƒ¿ÿ„²f…퇩‰·‹t$$Bü;ð†ÿÿÿ;ò…žƒl…¦ƒ|$…›‹‡…À„‹—¼ƒºÈulPèG$‹¼‰È‹—¼ƒÄƒºÈuZ‹D$(_][Çp3À^YËL$(_][Çp3À^YËT$(_][Çn3À^YËD$(_][Çn3À^YËL$(_][Ç23À^YËT$‰2_][¸^YÃÌÌÌÌÌÌÌ̸è6'V‹t$ ‹†ØW¿ÇD$p…Àt ‹ˆü…Éu‹†4…Àt‹ˆü…Ét‹€PT$ RVÿÑ‹øƒÄ ƒ¾ÿt,‹†Ø‹ˆ8…Ét‹€<PVÿуăètCƒèt/ƒèu dž‹ÇƒètRƒèt6ƒèuX‰†_¸^YÿÇD$PëÑ3É9Ž(•Á‰Ž뾋T$RjVèI¾ÿÿƒÄ _ƒÈÿ^YËD$PjVè2¾ÿÿƒÄ _¸^YÃÌÌÌÌÌ̸è&&V‹t$ ‹†ØW¿ÇD$p…Àt ‹ˆü…Éu‹†4…Àt‹ˆü…Ét‹€PT$ RVÿÑ‹øƒÄ ƒ¾ÿtuƒ¾ul‹†Øƒ¸8t]‹†(…ÀtP莃Ädž(‹†ØÇ†,ÿÿÿÿ‹ˆ<‹8QVÿ҃ąÀu ÇD$që } ÇD$P¿‹Çƒèt0ƒètƒèu6‰†_¸^YËD$PjVè½ÿÿƒÄ _ƒÈÿ^YËL$QjVè½ÿÿƒÄ _¸^YÃÌÌÌÌÌÌÌÌ̸ èö$¡ô3ĉ„$œ‹„$¨UV‹´$¬ƒþ0W‹ú‰D$‰L$ ÇD$Œ’”$°RèS D$(PèA‹ƒØ‹ˆ4ƒÄ…Ét7j”$´RD$,PWRWSÿуÄ…ÀŒu„@ƒøuyÇD$ëo‹×¹+Ћ,;(…ƒéƒÀƒùsêjèÈP‹ƒØjPŒ$ÀQ見ƒØƒÄWR$Pjè˜PL$4QèƒÄ‹”$°Rèc+ðV‰D$„$¸WPè>jŒ$|Q”$ÈRè!„$ÌPè‹D$0ƒÄ >¬$hƒør‹U;…[ƒèƒÁƒÅƒøsç…Àt-Š:U…>ƒøvŠQ:U…-ƒøv ŠA:E…L$$QèÈT8D$(P‰T$è¶¹ðÿÿÿ+ÈhIñh,]Vèÿ‹øƒÄT$$…ÿu$RèxƒÄ_^ƒÈÿ]‹Œ$œ3Ìè-#Ä ËD$VPL$QWRèì‹L$ D$$PÏQT$@RèÐƒÄ …ÀŽƒ‹D$D$ L$$Qè‹T$RD$Pj‰|$$èvþW‹ðèfƒÄ…ötM‹¼$¸…ÿt‹L$WQVHRè‰"ƒÄ ‹D$ ‹L$‰~D‰0_^‰‹0¸]‹Œ$œ3Ìèw"Ä ËŒ$¨_^]3Ìǃ03ÀèS"Ä ÃÌÌÌÌÌÌ‹D$ S‹\$U‹l$Vjjj S4(èR–ƒÄ©@t ^]¸[Ã;~ï‹D$…Àtç;ðr^]ƒÈÿ[Ãf¶fÁá·Ñ¶N ÑL;Èsà¶L;ÈwÕQ;Ðs±JW;ÈwA¶ ¶rfÁáf ζrƒÂ·ù¶ fÁáf ηɷñƒÂò;ðwfƒÿ#t‹ÖJ;ÈvÀ_^]¸[Ãf…Éu_^]ǃ03À[ËD$P·ÉUQ‹L$0è üÿÿƒÄ _^][ÃÌÌÌÌ̸Äèö ¡ô3ĉ„$À‹„$ÈSU‹¬$ÜV‹ñV‰D$‹ÚèML$ Q‰D$è_”$ÜRèRD$(jPèÆŒ$èjQè·‹”$ô‹D$,jVRPL$HQè ‹”$‹D$@jVRPŒ$Qèî‹´$ ƒÄDVT$ WRèºD$PŒ$œQT$0RèjjjD$@jPè¯jjjŒ$ jQèš‹T$LƒÄ@R„$PL$$Qèb‹T$R„$œPŒ$èQèHVT$8WRè<ƒÄ$;l$ަD$PL$ SQè‹D$$T$Ø+èR„$œPŒ$èQè÷jjjT$@jRè jjj„$ jPèô‹L$LƒÄ@Q”$RD$$P輋L$Q”$œR„$èPè¢VL$8WQè–ƒÄ$;l$ZÿÿÿT$ R„$PL$$QèlU”$œRSèD$4PèMŒ$ðQè@”$¬j@Rè5‹Œ$ôƒÄ(^][3ÌèûÄÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸è–U‹l$VW‹ú‹Á™+‹ðƒáÑþ>ñ‹L$ SQ‹L$VW‹|$,‹Õ‰D$èaýÿÿ‹T$0‹D$‹L$(SRV‹t$DP‹ÖèFýÿÿƒÄ …Û~‹Î‹Å+Í‹ó¤$Š0@ƒîuõ_^]YøXè¡ô3ĉD$T‹@]‹D$\S‹Ù‹ <]‰T$ŠH]U‹l$hV‰L$ ‹ D]WˆT$‹PX‰L$²˜U¹|$!ó¥S‹\$|²¸¹|$E󥋈¼‹€ØjMt$V‹°‹€ŒQ‹IVPèÞþÿÿ‹L$|ƒÄ_^][3Ì貃ÄXÃÌÌÌÌÌÌÌ̸üèV¡ô3ĉ„$øSU‹¬$‹EX‹ˆH‹|‹YV‹°„W‹¸€ƒã¸ÇD$‰\$0‰T$„„$„èƒ}|t‰D$ë+hh€]hŒèÈƒÄ ‰E|…À„êPèbƒÄ‹E|‰D$ ‹…„‰½€…ÀtPè@ƒÄÇ…„…ötb‹NQè ƒÄ‰…„…Àuh%h€]hŽéJ‹UXƒºu h*h€]hHè9‹MXƒÄ ‰‹UXƒºtQ}ÿþt ‹EX3ɃÀ‰‰H‹EXƒÀéÁƒ½ˆt‰D$ë;h8h€]hŒèÝƒÄ ‰…ˆ…ÀuhÁh€]jAé°PègƒÄ‹…ˆ‰D$ ‹…‰½Œ…ÀtPèBƒÄÇ……öt*‹NQè"ƒÄ‰……ÀuhJh€]hŽéL}ÿþt ‹EX3ɃÀP‰‰H‹EXƒÀXƒ|$‰D$,t ‹T$ R趃ċEX‹°xW讋L$Q‹øèBƒÄ‰D$…Ût\‹UX‹’H‹Bƒàt¹ë‹J á€?é€÷ÙɃÁ9L$}‹D$ë"…Àt ÇD$ë‹B %€?-€÷ØÀƒÀ‰D$‹L$Q苌$ƒÄ‰D$(ƒùt5ƒù!t0‹L$ y1‰\$‹\$ØË7ñ‰t$Ⱦl]ÇD$$ë) ?1‰\$‹\$ Y‹Öñ‰t$ A¾X]ÇD$$‹EX;ˆt~"hxh€]jDhÑjèǃÄ3ÀéÇ‹L$,WRQè+ƒÄ ƒ|$0„6‹F‹‹N‰D$8‹EX‰T$4‹V ‰L$<°¸‰T$@¹|$Dó¥°˜‹D$¹|$d󥋵ØPèÅŒ$ìQ”$°R‹–jPL$DQ‹ŽŒR‹T$(Q‹L$0‹ØèÍúÿÿ”$ĉT$,‹T$DƒÄ…ÒŽ˜¡L]‹ P]‰D$4‹EX‰L$8°¸¹|$<ó¥°˜‹…ع|$\ó¥”$ÈRŒ$ŒQ‹ˆjHT$@R‹ŒQR3ɺ;]èAúÿÿƒÄƒ|$$t „$ˆ‰D$ë‹L$(” ˆ‰T$‹…¼‹L$‹T$Ç@‹„$ƒàP‹D$Q‹L$(RjPQè”$Àj Rèå„$j PèÖŒ$°j QèÇ”$øj R踃Ä8¸‹Œ$_^][3ÌèxÄüÃÌÌÌÌÌÌÌÌÌÌ̸èV‹t$‹FXƒ¸tt ¸^ƒÄÃL$Q‹Ž¼T$RD$PQ耴ƒÄ…Àu%h×h€]hŠhÓjèpƒÄ3À^ƒÄËVX‹D$‰‚|‹NX‹T$SU‰‘€‹D$WP豋L$ Q‹øèç‹T$Rèø‹øûVÿèX¡ÿÿhãh€]WèF‹èƒÄ…íthåh€]Wè-‹ØƒÄ …Ûu%hh€]jAhÓjèЃÄ_][3À^ƒÄËFX‰¸t‹NXW‰©xSV‹ÍèÕøÿÿWSèZSèЃÄ÷†ôu_‹VXǂ؋†¼‹€¬3É;Át@‹P â€?ú u ‹FX‰ˆØ‹–¼‹‚¬‹P â€?úu ‹FX‰ˆØ_][¸^ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸èVƒ|$ S‹\$ UVWt6‹ƒŒ…Àt P軃ċ«ˆ‹sXÆ(‰l$…íu3Àë@Uè¹ë5‹ƒ€…Àt P腃ċC|‹sXƉD$…Àu‹èë P膋l$ƒÄƒ»¼„‹…턃…À„{‹E‹~PèP‹èƒÄ‰l$ƒýtFƒ|$tF‹Ç™÷ý‹Í+Ê÷ƒôQÿt ‹CXötB,9;ý‹Ç} ‹~ˆ8@;Å|õN‹ý‹l$ƒ|$u>…ÿt 3Ò‹Ç÷õ…Òt0hmh€]hhÒjèÞjjSè­ÿÿƒÄ _^]3À[YËN‹V ‹D$WQRP覃ăý„Òƒ|$…Ç‹N ¶L9ÿ‰L$A÷ƒô‰L$tLƒ»„uC‹kX¸]ƒÅ¹+èëI‹(;uƒéƒÀƒùsîöD$u‹CXƒ‹CXö‹L$tI‹n;Í~ _^]ƒÈÿ[YËÇ+Á;Ç}‹V ë¤$¶;\$uÙ@;Ç|ñ+é_‰n^]¸[YËN‹V‹F QRPÿÜT‹N ƒÄ ‰N_^]¸[YÃÌÌÌÌÌÌÌÌÌÌ̸èD$Pèü ‹L$ QT$ R蟋L$,D$ PQT$RèQD$PèŸ ‹D$ƒÄ0ÃÌÌÌÌÌÌ̸`è¶¡ô3ĉD$\‹D$p‹L$xS‹\$lU‹l$tV‹´$€W‹|$tVPT$ÿþuu¾ti‹¬$ô‹F\…ít·xJë·xH‹ÏÁùˆŒ$Ü…ít·@Jë·@H‹|$‹WjŒ$à‰”$∄$áf‹GQT$$Rf‰„$îèÅ ë‹D$jPL$$Qè² ‹|$ƒÄ j”$ØRD$$Pè— ‹K‹SQRD$0Pè… ‹T$0L$,QRD$h[h¬]jh jèîD$LƒÄPèÿƒÄ_^]ƒÈÿ[‹L$l3Ìè` ƒÄpËNX‰©L‹G;Ãt<9_t7÷†ôu+PèÛ‰E‹WRèσĉE9]t;Ãu!hré{ÿÿÿU誃ąÀu hgédÿÿÿ‹E‹U‹M ‰D$(‰T$0‰L$,‰\$;Ãt<›PèR‹L$ƒÀ™ƒâ‹T$Áø‰DŒLDA‰D$‹DŒ,ƒÄ‰L$;ÃuÊ‹NX‹H÷@ u'PVèo‹ØƒÄ‰\$ …Ûux2éêSèvƒÄë3À‰\$ ‹Ø‹T$‹L$D PQè̃ąÀuh™h¬]jé¦þÿÿ‹V<‹j3À‰l$} ‰D$9D$(tFëI‹DHÁøˆ‹L$ŠTŒHˆW‹D$‹L„(ƒÇWQèl‹D$|„P@‰D$ÀÀƒÄƒ|(u¿…Û„‹ƒø…\l$XÇD$$»ƒûu‹–Ø‹‚Œë ‹†Ø‹€jPL$@Qè9‹VXj ¸RD$LPè‹NXj Á˜QT$XRè‹D$8P‹D$@ƒÀ PL$dQèðT$@RD$lUPèd‹D$LD$`KƒÄ<è…Ûkÿÿÿ‹L$ ‹Q R‹T$(D$ POQRD$hPjrèjƒÄ…ÀhÀh¬]jéTýÿÿ‹L$‹l$Á鈊T$‹L$ˆW‹D$T‰T$‹|$WjWj UVèJjƒÇ V‰~DÇFHèÂ?ƒÄ L$8QÇF4Q!èjVèöAƒÄ _^][‹L$l3ÌèjƒÄpÃøt…¡jèÀPD$@Pèÿÿ‹NXj Á¸QT$LRèãÿ‹FXj ˜PL$XQèÎÿ‹T$8RE PD$dPè»ÿSL$DQWRD$tPèƒÄ@…ÀuhÓh¬]j éSüÿÿ‹L$ÁùˆŠT$‹L$ˆW‹D$T‰T$éþþÿÿhÞh¬]hûëh~h¬]húh j¿(è÷þƒÄWjVè)ÿÿD$DƒÄ Pèüþ‹Œ$€ƒÄ_^][3̃ÈÿèZƒÄpøèSUV‹t$(~4`!W…ú‹~<‹GƒÀ ‹è@PV‰D$4è…ÿÿ‹Øˆ]‹D$4ÃCƒÀ‰\$,V‰D$8ƒÃèjŠ‹è3ÀƒÄ ‰l$‰D$;ètU‰D$èCþƒÄ…À¶‹O‹T$$D ‹L$‰D$,‹ÑÁúˆ‹D$,ˆHƒD$,‹GÆ ˆX@‹ËÁùˆ‹ÓÁúˆP‹N\¶‘ˆP‹N\¶‘€ƒÀˆP‹F\fÿ€€ƒÃ CôPjP‹F<‰^DÇFH‹Hj QVè¹GjVèq=ƒÄ ÇF4a!jVè¯?ƒÄ_^][ƒÄÃd$‹l$‹D$PUèqý‹èjUè“þLQW‰D$,è~þƒÄ…À„¦÷†ô ‹WD ‰D$,u;‹L$‹ÑÁúˆ‹D$,ˆHƒD$,L$,QUè@þ‹D$‹T$\DƒÄ‰D$ë1L$,QU‰D$(èþ‹D$‹l$(ƒè‹ÐˆEƒÀÁúƒÄØD$ˆU‹l$‹D$EP‰l$è½üƒÄ;èŒ,ÿÿÿéuþÿÿhh¬]jhjè¡üƒÄ_^]ƒÈÿ[ƒÄÃÌV‹t$~4@!uiVèÜhƒÄ…Àu9‹NX‹‘H‹J áÿù thlh¬]jDh jèEüƒÄ3À^ÃPVèEIjVÇF4A!‰FDÇFHèÜ;ƒÄjVè!>ƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌ̸ èFSUVW3íUÿèT‰D$3öƒÄE‰t$‰l$è ÙîÝ$D$ jPèWüƒÄè%üUÿ‹ðƒÄ ;õŽd‹OÇG4à!‰oD‹Qd‹Bj"WÿЃÄ…À„>jW莃ÄéH‹O‹Ad‹P,‹@(RPhá!hà!WèxB‹ðƒÄ;õŽÇG4!9olt‹OXÇTÀ!‰oDéü‹WXÇ‚T‰oDéç‰_(ë=@t =`…˜‰_$;õt SjWÿÖƒÄ ‹%ÿ=þ…¸ÇG 9o‹ï~ƒÇjSWD$ Pj0è÷îƒÄ÷†ô‹ØtþG÷†ôtÆD$p…Û1h÷h¼]jwhjèîƒÄ_^]ƒÈÿ[‹L$43Ìè“ôƒÄ8Ã>~‹ËÁùˆ]ˆMƒÃ‹V‹Bd‹–¼‹@ j0L$QƒÂRVÿÐ‹Ž¼T$$j0R‰AèmîƒÄé-hÝh¼]jDhjè“íƒÄ_^]ƒÈÿ[‹L$43ÌèôƒÄ8è„]‹†¼‹ˆ‹Y@…Û„+ShAhAè‹ï‹èƒÄ …íu1hŸh¼]jhjè*íƒÄ_^]ƒÈÿ[‹L$43Ìè©óƒÄ8ÃUè?ïƒÄ…Àuh¤ëÀ‹SURWèrî‹ØƒÄ …Ûh¯륋–¼‹F‹Hd‹A SWƒÂRVÿÐ‹Ž¼SjW‰AèFó‹URèÅîƒÀ™ƒâ‹ØÁû‹ÃÁøˆˆ_‹MƒÇWQèšîUƒÃèíƒÄ,‹T$SjSjRVèk6jƒÃ VÇF4‰^DÇFHè,ƒÄ jVèT.ƒÄ_^][‹L$43ÌèÈòƒÄ8Ãj(jVèdŠÿÿh˜h¼]hîëj(jVèIŠÿÿhÈh¼]jDhjèóëƒÄ ‹L$D_^][3̃ÈÿèròƒÄ8ÃÌÌÌÌÌÌÌ̸0èò¡ô3ĉD$,SV‹t$<~4WÇD$ …‹F<‹x‹Ž”‹‹F‹Hd‹Z‹FX‹IT$$R„PVÿÑ‹ƒÄ ƒøue‹V‹Bd‹VX‹@L$QÂtRVÿЋK QT$RGPj$L$0Qjrè:íƒÄ$…Àhh¼]jé¿‹T$ ÁêˆW ŠD$ ˆG ‹\$ ëPƒøt…“‹K QT$R‹SGPjL$4QRèQíƒÄ…Àuhh¼]j ëm‹D$ÁøˆG ŠL$ˆO ‹\$ƒÃSjSjWVè¥4jƒÃ V‰^DÇFHèP*ƒÄ ÇF4‘jVèŽ,ƒÄ_^[‹L$,3ÌèñƒÄ0Ãhh¼]jDhjèSê‹L$LƒÄ_^[3̃ÈÿèÓðƒÄ0ÃÌÌÌÌÌÌÌÌ̸èvðUV‹t$3í~4pW‰l$‰l$ u%‹†”;Åt‹9(t9ht ÇF4rëÇF4q~4q…ðD$ PL$QVèšIÿÿ‹øƒÄ ;ý}_ÇF^ƒÈÿ]ƒÄÃÇFƒÿuV9l$ t3‹D$;Åt+PVÇF4q舼ƒÄ…Àt‹T$ RVèÖ´ƒÄ…Àu!3ÿëh[h¼]jjhj3ÿèSéƒÄ‹D$;Åt PèZéƒÄ‹D$ ;Åt PèUéƒÄ;ýu7>u"‹FXj)jV‰¨\èM‡ÿÿƒÄ _^¸]ƒÄËNXÇ\ÇF4r~4ru8‹VXÇF4sƒº\u3Àë ‹†”‹‹PVèÉ5UV‰FD‰nHèl(ƒÄjVè±*ƒÄ_^]ƒÄÃÌÌÌÌÌÌ̸èÖîUV3íWU‰l$ÿèT‰D$3ÿƒÄE‰|$ ‰l$è­îÙîÝ$D$ jPèäèƒÄè²èUÿïÿÿƒÄÇGPé/þÿÿhh^h hþjèfÌ·Ö‰¾FëEh)h^h hþjè?̃Ä[^_3À]Ãh0h^hÆhþj¾è̃ÄVjWèGjÿÿƒÄ [^_3À]Ãè¨ùÿÿ…Àtð‹\3ÀÇÔ‰‰G‰G¸[^_]ÃÌÌÌÌÌÌ̸,èÒ¡ô3ĉD$(S‹\$…'öG0…@‹9D$D„Oƒøu)Hö‹G\¨èô‰D$9Ns6ÇG8ð‰^éSÿÿÿƒøuHí‹G\¨àäëЃøt7h$é3À;ËvI‹^‹V Šˆ(ÿFÿN@;Áré3Û‹D$‰½9_$…‹G\ƒ¸ô ‚ 8˜è…‹¼;Ë„ó9™¬„牘ô‹G\8˜é…%8˜ê…8˜ë… ‹Od;Ët‹WhRWjèP‹jPSÿуÄWè+<ƒÄƒø…oþÿÿ‹GXö…cþÿÿ9˜¨…WþÿÿWèÁPÿÿWèëPÿÿƒÄ…À„@þÿÿ‹O WÿуÄ;ÃŒ+„sö‡ø…þÿÿ‹WX9šì… þÿÿWÇGèP ‹ðjVèüËj Vèî˃Äéß‹G\º9䂪¶¨à¶°á‰˜ä‹Gd;Ãt‹OhQ‹WR‹W\ÂàRjQSÿЃÄ‹‡Ì;Ãt‰D$ë‹—Ø‹‚œ;Ãt‰D$ë‹D$;Ãt‹ÍÁá ÎQh@WÿÐƒÄ ƒý…ß‹WX‰²˜;ó…4ýÿÿƒO0^]_3À[‹L$(3Ìè¢ÎƒÄ,ÃöG0…F‹ƒù…©‹N D$PQèÕ ‹‡ƒÄ=uƒ~….;Àt 9n…!9^…‹N €9… ‰^‹Gd;Ãt‹WhRWUQ‹jQSÿЃÄ‹WXW‰ª”èÎdÿÿƒÄ…À„ŒUWèŒïÿÿƒÄ¿…yüÿÿ‹G\f¨„éjüÿÿƒ¸ô ‚µ9_…¬‹N D$ PQ膋W\·BHƒÄ9Ft‰^é/üÿÿ‹O4áÿƒùu‹WXöu‹G$÷ØÀ%‰G4‰o(‹O WÿуÄ;ÃŒí„Nö‡ø…Þûÿÿ‹WX9šì…ÏûÿÿWÇGè‹ðjVè¾Éj Vè°ÉƒÄ顃ù|ƒùŽVƒù„þ?…O‰^é}ûÿÿhØh^h‘hjèDƃÄéS‰^^‰o]_3À[‹L$(3Ìè¹ÌƒÄ,ÃWèé8ƒÄ©0tƒ|$Du9_|uhîh^jdéë‹D$L;ÃŽ‹n;Åw‹è‹F F‹L$UPQèGÌƒÄ 9\$Pu)n‹Fn;Ãu ÇG8ð‰^^‹Å]_[‹L$(3Ìè0̃Ä,Ãhlh^håhjè}ŃÄéŒhWh^jihjè]ŃÄélƒýu}‹WXhÃh^†èPhÇGj‰²œè#ÅVhp\L$‹ðƒÄ …öuÉ_^[ÃÌÌÌÌÌ‹L$3À‰‰A‰A‰A ‰A‰A‹D$Šˆ¶PÁâ@V¶p Ö¶pÁâ Ö‰Qf¶Pf¶pƒÀfÁâf Öf‰Q¶P¶pƒÀÁâ Ö¶pÁâ Ö‰Q ¶P¶pƒÀ¶@Áâ ÖÁâ ЉQ^ÃÌÌÌÌ‹D$‹L$ÇŠˆÃÌÌÌÌÌÌÌÌÌÌÌÌÌSUV‹t$W3ÛSSj Vèœ8ƒÄ©…ˆSSj(VèDƒÄPèG¾‹N\‰ ‹F\‹ ƒÄ;DæsX‰˜ ‹V\‹Š ;Ëu¡<æë3À‹ÿ; …<æ‡@ƒørí‹Á‰‚ ‹F\‹ˆ SQj*VèÒƒÄPèÕ½ƒÄ9^Hu/ƒ|$u(‹V\‹‚¨ƒÀ 9FDthp_hãhH^èã½ƒÄ 9^D„¦jjj Vè}ƒÄP耽‹V\‹È‹‚ +Áƒè ƒÄƒø ,jjj VèPƒÄPèS½ƒÄ…ÀŽ[‹F\‹€ ƒè ‹~D;ø~‹øƒ|$…Ö‹FH…Àt,ƒø hH_hÿhH^èJ½ƒÄ ƒFHôƒFD ƒÿ wƒÇ ‹F\‰˜°¤Oô‰H‹V<‹B‹N\FH¶‘¤ˆ¶‘ªÁ¤ˆP¶QˆP¶Q@ˆP¶Q ˆP¶QˆP¶QƒÀˆP¶Q ƒÀˆP¶Q ˆP¶QƒÀˆ¶QˆPŠIˆHƒÿ sh(_h hH^è—¼ƒÄ ‹V<‹BFH‹L$WPQVèàäÿÿ‹èƒÄ…í}Rjjj+VèƒÄP較ąÀ„+jjj(VèûƒÄPèþ»‹V\ƒÄ‰‚ éô‹…<æéêýÿÿ;ýth _h&hH^è ¼ƒÄ ƒ|$…¯‹N\ƒ¹ø…Ÿ‹F<‹@FH…Û…}¾tq¶‘¤ˆ¶‘ªˆP¶‘©ˆP¶‘¨@ˆP¶‘­ˆP¶‘¬ƒÀˆPˆXˆXˆX¶‘ªƒÀƒÀˆ¶‘©ˆPЉ¨ˆHƒè ‹ÍëƒÀ MôQPVèÃLÿÿƒÄ ‹FD;èt%nH+ʼnFD\+ôƒ~D…Zýÿÿ3À_^][Ã_^]ƒÈÿ[ËFd…Àt"‹Vh‹NDNHR‹V„Ç‹MD;Os‰G 뮋U<‹r‹_Šˆˆ^F‹ÃÁ舋ËÁéˆN¶W ˆV¶WƒÆˆVƒÆÆÆFÆFƒÆˆˆNˆ^ƒÆ½tƒî ƒÃ SVUèwFÿÿ‹EdƒÄ …Àt‹Mh‹UQUSVjRjÿЃÄ3À‰‰G‰G‰G ‰G‰G‹E\fÿ€„Uèöôÿÿ‹E<‹H‹EDƒÄƒÁ ‰M@_^[]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$‹F4;D$ …·‹N<‹FX‹VS‹Y‹JdW8R‹T$$R‹T$$R„RtP‹AVƒÃ ÿЋNX‹ø‰¹¸‹VXWÂ8RSèæ¹‹F\f‹ˆ‚f‰ˆ€‹F\fÿ€‚‹F\·ˆ€f‰ˆ¬3ɉ¸¨‰¸´QÆ€¤‰ˆ°ƒÇ V‰~D‰NHèÓòÿÿ‹T$DƒÄ,_‰V4[jVèõÿÿƒÄ^ÃÌÌÌÌÌÌÌÌÌ̸ˆè6¹SU‹¬$”V‹uhœ`h¾h¨jè8£ƒÄ3À˰‹‹H‹QRè §ƒÄÃh9hœ`h±h¨jèÿ¢ƒÄ3ÀÃÌÌÌÌÌÌÌ‹L$…ÉuhIhœ`jCh£jèÒ¢ƒÄ3ÀË”…Àu!hNhœ`h±h£jè§¢ƒÄ3À˃8u!hShœ`h±h£j袃Ä3ÀÃxu!hXhœ`h¾h£jèX¢ƒÄ3ÀË”‹‹H‹QRè@¦ƒÄÃÌÌÌÌÌÌÌÌ‹D$‹H‹Q`ÿâÌÌÌÌ‹D$ƒx u"hzhœ`hhßjèý¡ƒÄƒÈÿÃö@0t Ç@3ÀËH‰D$‹AÿàÌÌÌÌÌÌÌÌ‹D$ƒx u"hŠhœ`hhjè­¡ƒÄƒÈÿÃö@0t3ÀËH‰D$‹AÿàÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$ƒx u"h™hœ`hhÐjè]¡ƒÄƒÈÿù„H0t%h hœ`hÏhÐj‰Hè.¡ƒÄƒÈÿËH‰D$‹A ÿàÌÌÌÌÌÌÌÌÌ‹D$ƒx(uÇ@(‹H‰D$‹Q(ÿâÌÌÌ‹L$3À9A(•ÀÃÌÌÌ‹L$ƒùt‹D$‹PV‹t$VQP‹BlÿÐƒÄ ^ËL$ ‹T$‰Jd¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$Aðƒø#‡¶€ÜŸÿ$…|Ÿ‹L$‹´Ã‹L$‹T$ ‹´‰‘´Ã‹D$‹L$‰¼¸ËT$‹‚¬Ã‹L$‹T$ ‹¬‰‘¬Ã‹L$‹T$ ‹A‰QËD$‹@ËL$‹T$ ‹A ‰Q ËD$‹@ ËL$‹Q‹B$ËD$‹@4ËL$‹A<ËT$‹B8ËD$‹@@ËL$‹AHËT$‹BDËD$‹@XËL$‹A\ËT$‹BLËD$‹@PËL$‹ATËD$‹T$ ¤‹€¤Ã‹D$‹L$ ˆ¨‹€¨Ã‹D$‹V‹t$V‹t$VQP‹BDÿЃÄ^ËÿnžОÛžãžëžóžûžŸ ŸŸŸ#Ÿ+Ÿ3ŸHŸNžYž¢ž±ž¹žÈž‚žž]Ÿ ‹L$ƒùt‹D$‹V‹t$VQP‹BpÿÐƒÄ ^ËL$ ‹T$‰Š¸¸ÃÌÌÌÌÌÌÌÌÌÌÌ‹D$‹@‹L$+AuÃ3Ò…ÀŸÂTÿ‹ÂÃÌ‹D$‹‹T$‹‹A+BuÃ3É…ÀŸÁL ÿ‹ÁÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$…Ét‹At…Àu‹Ø…Àt‹@…Àu3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$…Ét‹Ax…Àu‹Ø…Àt‹@…Àu3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$…ÀuÃV‹pt…öu‹€Ø…Àt1‹@…Àt*‹ð…öt$V訋L$ƒÄ;Á~QVèƒÄ…Àt‹@^Ã3À^ËD$P‹D$HQP‹RPè×JƒÄ…Àt+Pè`ƒÄ…Àu!h´hœ`h¹h jèJƒÄ3ÀøÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$P‹D$HxQPt‹€Ø‹RQèqJƒÄ…Àt+PèúœƒÄ…Àu!hÆhœ`h¹hjè䜃Ä3ÀøÃÌÌÌÌÌÌ‹D$‹€¼U…À„š‹¨´…턌ƒ|$ŒSVW‹|$U3Û苜ƒÄ…À~MSUèwœ‹P‹ÂƒÄpŠ@„Éuù+ÆH;L$6‹÷Š ˆBF„ÉuöøƒÊÿ+ÐT$Æ:UGCè>œƒÄ;Ø|³‹D$ÆGÿ_^[]ËD$;øtOÆ_^[]Ã3À]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$ …Ûu3À[ÃV‹t$WS‰t$3ÿè盃Ä…À~>U‹l$ ëIWSèÉ›ƒÄVP…ítÿÕë ‹L$‹Q‹BLÿЃÄSðG誛ƒÄ;ø|Í]_‹Æ+D$^[ÃÌÌU‹l$‹E‹HLVjjÿÑ‹ð‹D$™÷þƒÄ…Òt#hhœ`h—h¡jèe›ƒÄ^3À]ÃW‹|$…ÿt‹…ÀtP‰D$èLŸƒÄë è”›‰D$S3Û9\$~;‹|$¤$‹U‹BHWÿЃÄþ…Àt‹L$PQèY›ƒÄ…ÀtÞ;\$|Ô‹|$ …ÿt‹D$‰‹D$[_^]Ãh(hœ`jAh¡jèÇš‹D$4ƒÄ…Àtƒ8u ‹T$R艚ƒÄ[_^3À]Ã̃|$t3ÀËD$‹ˆ¼…Étƒ¸u‹ÈË€ÃÌ‹D$‹ˆ¼…Ét‹€…Àu ‹È…Àt3ÀÃÈÿÃÌÌÌÌÌÌÌ‹L$¶AK¶QJÁà ¶QI¶IHÁà ÂÁà ÁÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹‹T$; t¸ËHD;JDuòVƒÂHWpHƒùr¤$‹;uƒéƒÂƒÆƒùsì…ÉtD¶¶:+Çu1ƒùv5¶F¶z+Çu ƒùv$¶F¶z+Çuƒùv¶F¶J+ÁÁø_ƒÈ^Ã_3À^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌé[ÿÿÿÌÌÌÌÌÌÌÌÌÌÌV‹t$…ö„h!hœ`j F`jÿPèP™ƒÄ…Àß‹†ð…Àt PèIƒÄƒ~t jVè4ƒÄŽ€QVjè ‹FƒÄ …Àt Pè ƒÄ‹F …Àt PèôœƒÄ‹F…Àt P謘ƒÄ‹F…Àt P蜘ƒÄ‹†°…Àt Pè; ƒÄ‹† …Àth„APèEšƒÄ‹†”…Àthê>Pè-šƒÄ‹†øÇ†˜…Àt PènœƒÄV蘃Ä^ËD$‹L$‰AlÃÌÌÌÌ‹D$‹L$‰ApÃÌÌÌÌ‹D$‹L$‹T$ ‰Hd‰PhÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‹T$ ‰ˆÀ‰èÃÌÌÌÌÌÌÌ‹L$‹‘ð‰T$éÛ›ÌÌÌÌÌÌÌÌÌÌÌÌ̸,èžSW‹|$83Û‰\$,;û„8‹D$<‹H‹GUV€á¶ñ÷ÞöæþÿÿÆk;Ãu 9_u3ɉL$ë‹Í‰l$9_u;ËtPèå™ÀÀÀƒÄ;Æ~‰\$ ë‰l$ ‹G;Ãu 9_u3ɉL$(ë‹Í‰l$(9_u;ËtP蟙ÀÀÀƒÄ;Æ~‰\$$ë‰l$$9_ u ‰\$89_$t‰l$89_(tZ‹G,;ÃtSP‰l$舘ÀÀÀƒÄ;Ɖl$~‰\$9_0t ‰l$9_4u‰\$9_8t ‰l$09_t ‹Pè:™ƒÄë‹D$4…ítBƒøt =Œtƒøu¹@ L$û£ L$= u¸@@ D$û£ D$ƒ|$0t ¸@ D$ D$ƒ|$8^]t ¸€ D$ D$ ‹D$8‹L$‹T$ ‰H‰P Ç@_[ƒÄ,ÃÌÌÌÌ‹D$S‹X UV‹t$3íö@W‰\$t,V蔋øƒÄ…ÿt}Wèt˜W‹Øè^”ƒÄû£d‹\$jjÿVèY˜‹FƒÄ …Àt9(t ‹Pè7˜ƒÄ‹èöÃ@t=öF(töF,t*÷Ã@tý u÷Ãt-ƒýt(ýŒt ƒýt_^]3À[Ã÷Ã@t öF(töF,€tå_^]¸[ÃÌÌÌÌV‹t$‹FX‹ˆHW‹¾”QWè´ûÿÿ‹VX‹‚H‹@ %ÿƒÄ¨@u©@t ¸‹DÇ(_^èt ¸‹DÇ(_^èt ¸‹DÇ(_^ét ¸‹DÇ(_^ét3À9G(”À‹DÇ(_^é uh‘hœ`jDh¶jèó’ƒÄ_3À^ÃÌÌÌÌÌÌÌÌÌ‹D$‹P ‹L$‹‰”÷Ât‹A<…Àu?÷Ât ‹A4…Àu0‹A,Ã÷Â@t‹AT…Àuh²hœ`jDh·j舒ƒÄ3ÀøèƘUV‹t$‹®¼ƒ}D„Ê‹†ØS‹X W‹û#|$ tqƒ~luk÷ÃuUPè¸-ƒÄ…ÀtU‹†Øƒx(tI‹Ž¼hÅhœ`jÁœjQè’‹†¼‹–Ø‹J(PVÿуÄ…Àu‹–¼Rèß$ƒÄ„Ûx@‹D$ ;øu8¨t ‹†Ø‹@<ë ‹ŽØ‹AH<ÿujÿèT‰T$‹–ØPRè›,ƒÄ _[^]ƒÄËD$‹@ÃÌÌÌÌÌÌÌÌSV‹t$ ‹NW‹|$ƒËÿC;ÏtGU‹n …ít3Û;i”Ë];u‰~ë‹A VÿЉ~‹OVÿуăûu ‹W_‰V ^[Ã…Ûu‹O‰N _^[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌhyhœ`jBhÅjèúƒÄ3ÀÃÌÌhhœ`jBhôjèÚƒÄ3ÀÃÌÌh…hœ`jBhój躃Ä3ÀÃÌÌh‹hœ`jBh j蚃Ä3ÀÃÌÌ‹D$‹=u¸ì`Ã=u¸ä`Ãø¸Ü`t¸Ô`ÃV‹t$‹F|W3ÿ;ÇtPè’‹F|PèzƒÄ‰~|‹†ˆ;ÇtPèö‘‹ŽˆQèXƒÄ‰¾ˆ‹†„;ÇtPèñ’ƒÄ‰¾„‹†;ÇtPèØ’ƒÄ‰¾_^ÃÌÌ‹D$‹€”…Àt‹‹Ã3ÀÃÌÌÌÌÌÌÌÌÌÌ‹D$‹€”…Àt‹‹AÃ3ÀÃÌÌÌÌÌÌÌÌÌ‹D$‹€¼…Àt ‹€¬…Àu3ÀÃÌÌÌÌÌ‹D$‹€…Àt‹Ã3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹€„…Àt‹Ã3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌVW‹|$ ‹w…öuèn“Pè“‹ðƒÄ…ötR‰wë‹G;ðu P蓃ĉGjjjVè‡jjjuVèÏ’ƒÄ …Àu h hœ`jh¸jèÒŽƒÄ_3À^Ã|$t‹G;Æt&PVès‘ƒÄ‰G_¸^Ã9wu Vè ƒÄ‰G_¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌV‹t$‹F…Àt&‹N;Áu Qè펃ĉF‹FPèž’ƒÄÇF^ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‰ôÃÌ‹D$‹€ôÃÌÌÌÌÌ‹D$‹L$‰A,ÃÌÌÌÌ‹D$‹ÃÌÌÌÌÌÌÌÌÌ‹D$‹€ØÃÌÌÌÌÌV‹t$ W‹|$ ‹‡Ø;Ætd…öu‹·4‹‡”…Àt PèRƒÄ‹†°PèÓhÒ hœ`j N`jQ‰‡”誋‡ØƒÄ…Àt Pè#ôÿÿƒÄ‰·Ø‹Æ_^ÃÌÌÌÌÌ‹D$‹H ‰L$鬑‹T$‹B ‰D$频‹D$‹L$‰ÌÃÌ‹D$‹€ÌÃÌÌÌÌÌ‹D$‹@4ÃÌÌÌÌÌÌÌÌ‹D$‹L$‰àÃÌ‹D$‹€àÃÌÌÌÌÌ‹D$‹L$‹T$ P‹D$ Q‹L$ RPQjè8‘ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ‹T$Âä‰T$é‘ÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$Áä‰L$é‘ÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‹T$ P‹D$ Q‹L$ RPQjèȃÄÃÌÌÌÌÌÌÌÌÌÌÌÌ‹T$ƒê€‰T$鮋L$ƒé€‰L$餸ÃÌÌÌÌÌÌÌÌÌÌV‹t$‹F …ÀtPè4‹D$ƒÄ‰F ^ËL$ ‰N ^ÃÌÌÌÌÌÌÌÌÌ‹D$‹@ÃÌÌÌÌÌÌÌÌ‹T$‹D$‹RjP‹ApÿÐƒÄ ÃÌÌÌÌÌÌÌÌÌ‹T$‹D$‹HRjP‹AlÿÐƒÄ ÃÌÌÌÌÌÌÌÌ‹T$‹D$‹RjP‹ApÿÐƒÄ ÃÌÌÌÌÌÌÌÌÌ‹T$‹D$‹HRjP‹AlÿÐƒÄ ÃÌÌÌÌÌÌÌÌ‹T$‹D$‹RjP‹ApÿÐƒÄ ÃÌÌÌÌÌÌÌÌÌ‹T$‹D$‹HRjP‹AlÿÐƒÄ ÃÌÌÌÌÌÌÌÌ‹D$‹L$‰¸ÃÌ‹D$‹L$‰AdÃÌÌÌÌV‹t$W3ÿ9~u#h¡hœ`h¼h¤jèꊃÄ_3À^ÃVèÊ'ƒÄ…Àt‹†¼Pèǃĉ¾¼‰¾Ð‰~l‰~09~(t h·hœ`jDh¤jè—ŠƒÄ_3À^ËN$‹V÷ÙÉáÁÉ@‰~‰N4‹‰‰†‹F<ÇFÇF8ð;Çt PèØŠƒÄ‰~u _^¸]ÃöF0t‹VXƒº˜¸t¸_^]ÃV‹t$ƒ~ W¿u$hThœ`hh´j趃Ä_ƒÈÿ^ËF‹H,VÿуÄ÷F4pt ‹V Vÿ҃ċø‹Ç_^ÃÌÌÌÌÌÌ‹D$‹HÇ@$Ç@0Ç@4`‹Q‰P ‰D$éõîÿÿÌÌÌÌÌ‹D$3ɉH$‰H0‹HÇ@4P‹Q‰P ‰D$éËîÿÿÌÌÌÌÌÌÌÌÌÌÌSVW‹|$‹‡ØPè-õÿÿ‹ð3ÛƒÄ;óu_^3À[ˉ‹O‰N‹G‰FU9Ÿ¼t WVèŒÚÿÿƒÄëd‹P VÿÒ‹G‰F‹@VÿЃÄ9Ÿ”t0‹†”;Ãt Pè:ƒÄ‹”Q軃ĉ†”;Äö‹—˜R‡œPVèVÓÿÿƒÄ ‹ô‰Žô‹—ø‰–ø‹‡ü‰†ü‹G`‰F`‹Od‰Nd‹Wh‰Vh‹‡È‹Ä‰ŽÄ;Ãt‰†È‹WpRè‚P‹FpPè ‚‹À‰ŽÀ‹—̉–Ì‹‡ÜäQ–äRj‰†Ü臂ƒÄ…À„6‹G ;ÃtN QSj PèB~ƒÄ…À„‹G;Ãt%;G tVRSj Pè~ƒÄ…À„óë‹F ‰F‹O‰N‹W‰V‹G ‰F ‹O$‰N$‹W(‰V(‹G,‰F,‹O0‰N0‹W4‰V4‹G8‰F8‹Fp‰^D‹Ol‰Nl‹WpRP裋GtƒÄ;ÃtPè}ƒÄ‰Ft;Ä‹Gx;ÃtPè}ƒÄ‰Fx;Ãtj‹¿ì;ûtkWèê|‹øƒÄ;ûtQW‰¾ìèÏ|ƒÄ…À~I‹ÿSWè¹|‹èUèmPSWè_ƒÄ…ÀtWCè¡|ƒÄ;Ø|Ô]_‹Æ^[ÃUèKƒÄVè>õÿÿƒÄ3ö]_‹Æ^[ÃÌÌV‹t$ƒ~ u'‹FÇF$ÇF0ÇF4`‹HV‰N èñëÿÿƒÄ‹V‹BVÿЃÄ^ÃV‹t$3À9F u‰F$‰F0‹FÇF4P‹HV‰N è¸ëÿÿƒÄ‹V‹BVÿЃÄ^ÃÌÌÌÌÌÌÌè³€é¦{ÌÌÌÌÌÌhŒhXaj j虡€æƒÄ…À}ihhXaj jèzh‘hXaj j èg‹ €æƒÄ …É}jjjh@ajèJ€ƒÄ£€æhœhXaj j è-¡€æƒÄÃhžhXaj jè¡€æƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌVh§hXaj\èl{‹ðƒÄ …öuhªhXajAh¢jè{ƒÄ3À^Ãj\jVèŒF(‰ƒÄ ÇFX‹Æ^ÃÌÌÌÌÌÌÌÌÌVhºhXaj\è {‹ðƒÄ …öuh½hXajAhÝjè¯zƒÄ3À^ÃSj\jVè+‹\$‹+Ãè(ÁøLÆ(‰‹S‰V‹C‰F‹K ‰N ‹CƒÄ …ÀtPè¹|‹SƒÄ‰V‹C‰F‹CW…À„PhAhAè||ƒÄ ‰F…ÀuhÚhXaj釋K‹A…Àt!PèK|ƒÄ…ÀuhâhXajëb‹V‰B‹C‹@…Àt!Pè |ƒÄ…ÀuhìhXajë7‹N‰A‹S‰V‹C …À„•Pè„|ƒÄ‰F …À…hûhXajhÝjèŽy‹FƒÄ…Àt Pè$|ƒÄ‹F…Àt Pè|zƒÄ‹F …Àt Pè„zƒÄƒÆ,¿‹Fü…Àt Pè]yƒÄ‹…Àt PèZyƒÄƒÆƒïuÙ_[3À^ËC$‰F$3ÿ‹Dû(…ÀthhXaj‰Dþ(ƒÀjPè yƒÄ‹Dû,…ÀtOhhXaj ‰Dþ,ƒÀjPèæxƒÄƒÿw¶PÆÿ$LÆh+hXahhÝjè£xƒÄGƒÿŒyÿÿÿ_[ÇFX‹Æ^ÃI2ÆÌÌÌÌÌÌÌÌÌÌS‹\$…Û„ŠhZhXaj CXjÿPè`xƒÄ…Àl‹C…Àt PèàzƒÄ‹C…Àt Pè8yƒÄ‹C …Àt Pè@yƒÄVWs,¿‹Fü…Àt PèxƒÄ‹…Àt PèxƒÄƒÆƒïuÙSèxƒÄ_^[ÃÌÌÌÌÌÌÌV‹t$…öuhhXajChÞjè±wƒÄ3À^Ã>u*è^üÿÿ‰…Àuh”hXajAhÞjè‚wƒÄ3À^ø^ÃÌÌVh hXajLèœw‹ðƒÄ …öuh£hXajAhájè?wƒÄ3À^ÃjLjVè¼}F ‰FƒÄ ÇFH‹Æ^ÃÌÌÌÌÌÌÌÌW‹|$…ÿ„•hµhXajGHjÿPèwƒÄ…Àw‹…Àthê>Pè†xƒÄSVw »¤$‹…Àt PèÎvƒÄƒÆƒëué‹G<^[…Àt PèByƒÄ‹G@…Àt PèšwƒÄ‹GD…Àt Pè¢wƒÄWè©vƒÄ_ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‰A¸ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸tè†|W‹¼$€…ÿ„WèvƒÄ…À„VjWèüu‹´$ˆWP‹†Ø‹H QT$Rè3yƒÄ…Àu#hôhXaj hÏjèÒuƒÄ^3À_ƒÄtËFp…ÀtPD$ PèzƒÄPèzƒÄVè±ùÿÿPL$QèlzƒÄ ƒ~$¸xau¸laPT$ RèHz‹†ÈƒÄ…ÀtPD$ Pè*zƒÄ‹†Ø‹Hd…Ét‹PhRD$ PÿуÄë L$QèúyƒÄ‹T$d‹øD$P‰–àèIxƒÄ^‹Ç_ƒÄtÃ3À_ƒÄtÃÌÌÌÌÌÌÌÌÌÌÌSVWèTu‹|$W‹Ø3öèàtƒÄ…À~3IVWèÉtPèyƒÄ …Àt"PSèuƒÄ…ÀtWFè­tƒÄ;ð|Ð_^‹Ã[Ãh„ASèQvƒÄ_^3À[ÃÌÌÌÌÌÌV‹t$‹†ì…Àth„APè(v‹D$ƒÄ‰†ì^ËL$ ‰Žì^ÃÌÌÌÌÌÌÌÌÌÌÌV‹t$‹† …Àth„APèèu‹D$ƒÄ‰† ^ËL$ ‰Ž ^ÃÌÌÌÌÌÌÌÌÌÌÌ‹D$‹€ ÃÌÌÌÌÌ‹L$yu‹%ÿÿÿ=u‹IX…Ét‹lÃ3ÀËì…Àu ‹‰Ø‹ ÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹ñ…öt>ƒ?u èûs‰…Àt.VèËvPè9x‹ðƒÄ…öt‹VPèÑsƒÄ…Àu Vè"vƒÄ3À^ø^ËL$W‹|$Çìèœÿÿÿ_ÃÌÌÌÌÌÌÌÌÌÌ‹L$W‹|$Ç è|ÿÿÿ_ÃÌÌÌÌÌÌÌÌÌ̸èfySUVWhÐÇD$3ÿè¸u‹ØèßwPè×vƒÄ‹è…Û„…í„ ‹D$PjjlUèYsƒÄ…À„µWWL$QUè—wƒÄ…À„Ÿ…ÿu èýr‹ø…ÿta‹T$RèÉuƒÄ…ÀtkPè0w‹ðƒÄ…öt\VSè^rƒÄV…À| èuƒÄëSè²rVWè«rƒÄjjD$PUè%wƒÄ…Àu’ë/h§hXajAh¹jè$rƒÄ…ÿth„AWèÂsƒÄ3ÿ…Ût SèßqƒÄ…ít Uè:vƒÄ‹D$…Àt PèýqƒÄ…ÿtèEr‹Ç_^][YÃh—hXajAh¹jè¹qƒÄë¥Ì̸èöwS‹\$UVWhÐSÇD$½è0r‰D$èevPè]u‹øƒÄ …ÿuShßhXajAhØjèXqƒÄ3í…ÿt WèuƒÄ‹D$…Àt PèPqƒÄ‹L$QSèÒqƒÄ_^‹Å][ƒÄËD$ PjjlWè˜qƒÄ…Àt²jjL$QWèØuƒÄ…Àtž‹T$RètƒÄ…Àt‹Pè„u‹ðƒÄ…ö„xÿÿÿVSè®pƒÄV…À| èksƒÄë SèqƒÄjjD$PWè|uƒÄ…Àu¤é=ÿÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌ̸ èÆv¡ô3ĉ„$S‹œ$U‹¬$VWhhXa3öjj ‰t$ ‰t$$èõsD$ SPè"uƒÄ;Æ„‰I‹ËqŠA„Òuù+΋ñ‹ÈyŠA„Òuù+ÏL1ù‡¬PSh¤aT$$hRèörƒÄ…À޳=¨D$PUè þÿÿƒÄ…À„’L$SQè™tƒÄ…À…zÿÿÿÿÌTƒ8tih0hXaÿPPj jèwoh aSh„ajèwrh2hXajh×jèMoƒÄ8ë(hhXahh×jè-oƒÄëÇD$ƒ|$_^][t $RèøsƒÄh:hXajj è°r‹Œ$‹D$ƒÄ3ÌèuuÄ ÃÌÌÌÌÌÌÌÌ‹D$‹€¼ÃÌÌÌÌÌVjTh¬ajj èkr‹D$‹°¼ƒÄ…ötÿ†œjXh¬ajj èDrƒÄ‹Æ^ÃÌ‹D$‹L$‹T$ P‹D$ Q‹L$ RPQjè¸rƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ‹T$¸‰T$é›rÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$Á¸‰L$érÌÌÌÌÌÌÌÌÌÌÌÌÌVWjqh¬ahØè;n‹ð3ÿƒÄ ;÷ujth¬ajAh½jèßmƒÄ_3À^ÃhØWVèYt¸W‰†˜‰†œÇ† 0ÿèT‰†¤†¸PVj‰¾À‰¾Ä‰¾¨‰¾ÈèäqƒÄ_‹Æ^ÃÌÌ‹L$‹D$…Ét‹PD‰ƒÀHÃÌÌÌÌÌÌÌÌÌÌÌS‹\$ U‹l$ VW‹|$3ö‹PSè=mƒÄ…À~‹QSUèÔÂÿÿƒÄ …Àt Fƒþ rÙ_^]3À[Ãþ sô_^]¸[ÃÌV‹t$…ö„Ëh?h¬aj†œjÿPèílƒÄ…À¦Ž¸QVjèápVjRèpmFj0PèemNHj QèZm‹†ƒÄ$…Àt Pè{õÿÿƒÄ‹†”…Àt Pè’lƒÄ‹†´…Àt PèClƒÄ‹†È…Àt PèŠlƒÄ‹†Ì…Àt PèwlƒÄhØVèílVèclƒÄ ^ÃÌÌÌÌÌÌV‹t$W‹|$…ÿ„Å‹†Ø‹‹‹A\RÿЃÄ…Àu5‹N‹‹A\RÿЃÄ…Àu#hhh¬ahðhÃjèÌkƒÄ_3À^Ã;Ft*PVè6ÚÿÿƒÄ…Àt苎؋A$…Àu VèlÉÿÿƒÄ‰‡ h‚h¬aj—œjRèk‹†¼ƒÄ…Àt PèfþÿÿƒÄ‰¾¼‹‡˜‰†à_¸^ˆ¼…ÀtPè9þÿÿƒÄdž¼‹ŽØ‹;FtPVè˜ÙÿÿƒÄ…À„Fÿÿÿ_¸^ÃÌÌÌÌÌ‹D$…ÀuËL$‰ˆ ¸ÃÌÌÌÌÌÌÌ‹D$…ÀuË€ Ã‹D$…ÀuË€¤Ã‹L$…Éu3ÀËD$‰¤ÃÌÌÌÌÌÌÌÌÌÌ‹L$…Éu3ÀËT$‹A$‰Q$ÃÌÌÌÌÌÌÌÌÌÌ‹D$…ÀuË@$ÃÌÌÌ‹D$‹Ä…Òt{‹ˆÀ…ÉtqVw;Öu%W;ÊuÇÇë?‰‹ˆÀ‰±Äë/w;Îu‰‹Ä‰²À뉊À‹ˆÀ‹Ä‰‘ÄÇ€ÄÇ€À^ÃÌÌÌÌÌ̃¾ÄW‹ùtƒ¾Àt VèUÿÿÿƒÄ‹OG…ÉuO‰0‰1‰†À‰ŽÄ_Ɏĉ±À‰†À‰0_ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$‰A(ÃÌÌÌÌ‹D$‹@(ÃÌÌÌÌÌÌÌÌ‹D$‹@,ÃÌÌÌÌÌÌÌÌ‹D$‹L$‰A0ÃÌÌÌÌ‹D$‹@0ÃÌÌÌÌÌÌÌÌ‹D$‹L$‰œÃÌ‹D$‹€œÃÌÌÌÌÌ‹D$‹L$‰AtÃÌÌÌÌ‹D$‹@tÃÌÌÌÌÌÌÌÌV‹t$ VèåmƒÄ…Àuhqh¬aj&hjèÈhƒÄ3À^ÃVè³mƒÄ…Àu(hvh¬ah=hjè™hVè¡lƒÄ3À^ËD$‰°ø¸^ÃÌÌÌÌÌÌÌÌÌ‹D$‹L$‰AxÃÌÌÌÌ‹D$‹L$‰A|ÃÌÌÌ̸è–nSUV½€Ñè)úÿÿ‹ð3Û;óu^]3À[YÃW‹|$‹‡Ø‹@$;Ãu WèâÅÿÿƒÄ‰† ‹‡¼;ÃtPèùúÿÿƒÄ‰Ÿ¼9\$„W‹ƒøu ‰ÇFDë*=u‰ë=u‰ë =ÿþ…‰ÇFD 9Ÿ0t‰^DéÅhêh¬aj jèCk‹‡ÀƒÄ;Ãu‹Ø‹ì;Ãt‹èhïh¬aj jèk‹VDD$ P^HSW‰T$,ÿՃąÀuhöh¬ah-鲋L$…Étn‹FD;Èwgsƒ?u+ÁPL1HjQè’mƒÄ ë‰ND‹VDRSW蟼ÿÿƒÄ …Àthh¬ah.ëb3Û‹‡;Ãt?Pè‹iƒÄ‰†È;Ãu,hë5hh¬ah/ë+hÝh¬ahë‰^D‹‡˜ƒø v)h%h¬ajDhµjèkfVècùÿÿƒÄ_^]3À[YÃP‡œPNlQèÃl‹—˜ƒÄ ‰Vh‹‰·¼_‰‰ž˜^]¸[YÃU3íW‹ù…ö„›9nD„’9l$ th!h¬aj j è¬iƒÄ‹GSVPè¤i‹ØƒÄ;Þu‹OVQ½èÐjV‹ØèRûÿÿƒÄ ƒ|$th)h¬aj j èaiƒÄ…ít!ǃŒ‹G,…ÀtSWÿЃÄSè€øÿÿƒÄ[_‹Å]Ã_3À]ÃÌÌS‹Ù‹C…Àt‹Ž¤Ž ;Á~:‹SWVRèQj‹;VèÓúÿÿdžŒ‹‹C,ƒÄ _…ÀtVSÿЃÄVèøÿÿƒÄ[ÃÌÌÌÌÌÌÌÌÌÌ‹L$V‹t$è’ÿÿÿ^ø èFk‹D$‰$‹@‰D$…Àt\‹D$Vhçh¬aj j ‰D$è„h‹D$‹p L$QÇ@ ‹T$ hÀÙRè²i‹D$(hìh¬aj j ‰p èHhƒÄ,^ƒÄ ÃÌÌÌÌSUV‹t$WhÜh¬aj½†œUPèndhßh¬aj j èh‹|$8‹OVQèKi‹ØƒÄ,…Ût;ÞtSè¶ùÿÿSè ÷ÿÿƒÄ3Û‹Ïè4úÿÿ…ÛtSè ÷ÿÿƒÄ3íé©jjj+WèTÃÿÿƒÄ…ÀŽ’jjj+Wè=ÃÿÿjjjW‹ðè/ÃÿÿƒÄ ;Æ~q‹w…ötjƒ~Dtd‹WVRèsgƒÄ;ÆuS‹GVPè¦hV‹Øè(ùÿÿ‰«Œ‹G,ƒÄ …ÀtSWÿЃÄSè{öÿÿoTjjj+WèÌÂÿÿjjjW‹ðè¾ÂÿÿƒÄ$;Æhh¬aj j ègƒÄ_^‹Å][ÃÌÌÌÌÌÌÌÌÌÌ‹L$V‹t$ jèýÿÿƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌW‹|$ƒ¿¼tEöG0u?WèÆÕÿÿƒÄ©0u/Wè¶ÕÿÿƒÄ©@u‹ØV‹·¼jè¨üÿÿƒÄ^¸_Ã3À_ÃÌÌÌÌÌÌÌÌ̸ìèöh¡ô3ĉ„$è‹„$üS‹œ$øUV‹´$üW‹¼$3íƒÿ ‰l$‰l$QL$QPWSVè§FÿÿƒÄƒøÿu,ÇD$‹l$…ít Uè9õÿÿƒÄƒ|$„ƒÈÿé;ÅtØ‹l$…í…G…ÿ„÷‹–4÷B …†‹WL$dSQ‰D$$‰|$hè^hhUh¬aj jè‹e‹†Ø‹HT$4RQè}eƒÄ$‰D$…ÀthYh¬ajœjPè«aƒÄhZh¬aj jè=e‹l$ ƒÄ…í…¦‹†Ø½‰¬$ðhL‹–ØÇD$‹B0…À„0Œ$ðQWSVÿЃÄ‰D$…À„‹†Øh\ƒ¼$ðt ‹T$hoh¬ajœURè aƒÄ‹†Ø÷@ u‹L$QPè[üÿÿƒÄ‹l$…털‹Eh;†˜…zþÿÿŽœ}lƒør‹;…bþÿÿƒèƒÁƒÇƒøsè…Àt2Š:…Fþÿÿ»;Ãv$ŠQ:W…1þÿÿƒøvŠA:G… þÿÿë»ö†Ät0ƒ¾˜u'h˜h¬ahhÙjè1`ƒÄ‰\$éÜýÿÿƒ½¬…Œ‹…°‹ÈÁ鈌$ð‹ÐÁê‹ÈÁ鈔$ñˆŒ$òˆ„$ó‹Uâÿÿÿúu‹F‹PHŒ$òQÿÒ‹L$‰¬ë‹V‹JH„$ñPÿÑ‹T$‰‚¬‹l$ƒÄƒ½¬„GýÿÿjÿèT‹L$+¤ƒÄ9 ‹†Ø‰”$ô}XP‹D$‹ŽØPQèüÿÿƒÄéýüÿÿXX‹†¼…Àt Pè1òÿÿƒÄ‹D$‰†¼‹˜‰–à‹Ãë3À‹Œ$ø_^][3Ìè–eÄìÃÌÌÌÌÌÌÌÌÌh0kèþch k£(ôèïchb£,ôèàchk£0ôèÑch k£4ôèÂchk£8ôè³chôj£Dôè¤chàj£Hôè•chÌj£Lôè†chÀj£PôèwchXb£TôèÒbhPb£\ôèÃbƒÄ0£`ôÃÌÌÌÌÌÌÌÌ‹D$‹‹T$‹‹ +‹ÁÃÌÌÌÌÌÌÌÌÌÌÌÌÌhh8kjjè¹aƒÄƒ=Xô…Ähh8kjjè–ahh8kjj èƒaƒÄ ƒ=Xôu{jèØbh àèd`ƒÄ£Xô…ÀtTVh$h8kj èÊ]‹ðƒÄ …öt8èœb‰F…Àtƒ8u Vè¤]ƒÄë‹ XôÇ‹@VQ‰Fè¤]ƒÄ^jègbƒÄh8h8kjj èé`ƒÄÃh:h8kjjèÒ`ƒÄÃÌ̸ èVcSW‹|$‹Ÿ¬…Ûu_3À[ƒÄ ÃV‹t$(…ötJèÐþÿÿÇ‹‡¨‰D$ ¡Xô…Àt,L$ QPè¦\ƒÄ…À|‹XôPRè˜\ƒÄ‰ëÇ‹t$ …ö„™‹|$$…ÿ„‹C %€?=‡„to=wJt5=€t=…¸‹…(ô‰éû3À‹…(ô‰é븋…(ô‰éØ=…Ǹ‹…(ô‰麸‹…(ô‰é§=wztG= „„=…‚‹C=€t=uq¸‹…(ô‰ëg¸‹…(ô‰ëW‹C=€t=u@¸ ‹…(ô‰ë6¸ ‹…(ô‰ë&=u¸ ‹…(ô‰ëèy`‰ëÇ‹C %À=@t=€u¸‹ …\ô‰ë3À‹ …\ô‰ëǃ>tƒ?t ^_¸[ƒÄ Ã^_3À[ƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹ Tô¡`ô÷ÙÉ‹\ôáðÁ÷ØÀ%€ÿ€ È÷ÚÒâÀÿÂ@ Ê¡<ô÷ØÀ‹8ô%ðÿ È÷ÚÒ¡4ôâøÿ ʋ0ô÷ØÀ%üÿ È¡,ô÷ÚÒâþÿ ʋ(ô÷ØÀ%ÿÿ È¡Lô÷ÚÒâ€ÿÿ€ Ê‹DôÉ( ÷ØÀ%ø÷ÚÒâü ‹Pô Á÷ÚÒ‹5HôâøÂ÷ÞöæüÆ Ö Ñ^ÃSU‹l$VW3Û3ÿ9\$~Fu‹D$‹HXSÿÑ3ÒƒÄ;Ât)9t%x‹L$ t‹L$…H u‰Fð‰Vü‰‰VôGƒÆC;\$|½Oÿƒù~E$IP܉P‰PüƒÀƒéuí3Ò;ú~.‹D$(‰(‰U‹M‰H ¿Dì‹L$,t¿ö‰tµ‰p‹‰P _^][ËD$…Àt‹‰‹@ ƒÁ…Àuò3À…ö~º@c…Àt…z u‰ƒÁ@ƒÂ(;Æ|êÇÃÌ̸ è_‹L$4S‹V‹t$8‹‰T$‹Â‰T$ ‰\$…Ò„¦UWë‹T$;D$„€‹D$‹H ‹0x ‰L$‹L$ …Ét‹n å;l$$u9Në<‹L$<ƒùÿu0‹N #L$,‹V#T$4…Éu…Òt§‹é#l$(;éu‹Ê#L$0;Ê‹T$të‘;NuŒ‹L$8ƒùueƒx…yÿÿÿ¹À@…N t…L$,u ƒ|$ „^ÿÿÿ;Ãt0;Âu‹‰T$‹H…Ét‹7‰q ‹…Ét‹p‰q‰C ‰XÇ‹ØÇ@éÿÿÿƒùuGƒx„ÿÿÿ;Äÿÿÿ;Âu‹‰T$‹H…Ét‹7‰q ‹…Ét‹p‰q‰C ‰XÇ‹ØéÒþÿÿƒùu Ç@éÁþÿÿƒù…¸þÿÿ;Ðu‹‰T$ë‹H‹7‰q ;Øu‹X‹3ö‰p;Ît‹h‰i‹H;Ît‹/‰i ‰7‰pévþÿÿ‹D$@‹L$D_]‰^‰[ƒÄ É^‰[ƒÄ ÃÌÌSU‹l$ ‹EV3öW…Àtƒxt ‹‹I;Î~‹ñ‹@ …Àuèhèµh8kSèÞV‹øƒÄ …ÿu"hëh8kjAhçjèVƒÄ_^]3À[ÃSjWèü\‹EƒÄ …Àt‹ÿƒxt ‹‹Jÿ ‹@ …Àuè…ö|,d$ƒ<·~‹T$RUVjjjjjjjè`ýÿÿƒÄ(ƒîyØWèJVƒÄ_^]¸[ÃÌÌÌÌ̸4èF\S‹ÙŠW3ÿ¹‰|$0‰|$,‰L$ „À„ UVI<-u ÇD$CëU<+u ÇD$CëFt:‹ÿ‹‹H‹T$@UQRÿØTƒÄ …Àu‹‹H€<)„œ‹T$PGƒ<º4ºuÊ3ÿ‹D$ƒø…kƒý…?‹D$@UhLkPÿØTƒÄ …À…#‹L$L‹T$HQRè—ýÿÿƒÄ;Çu‰|$Š„Àt.›<:„Q< „I<;„A<,„9ŠCC„ÀuØ‹D$^]_[ƒÄ4ËD$P‹¸‹P ‹\$ ‹t$0‹H T$ ÷Ó#Ù‹ê‹P$÷Õ#î Ý#΋t$, Ù‹H‰\$0‹\$ T$÷Ó#Ù‹ê÷Õ#î Ý#Î Ùƒ8‰\$,‹\$ÇD$(uA3ÿ9|$<…`þÿÿ‹l$$éûþÿÿhGh8khhæjèšSƒÄ‰|$(‰|$CéÏþÿÿ‹L$P‹<¹‹W‹ ‹l$$ç‰T$8‰|$4é©þÿÿhh8khhæjèJSƒÄéÐþÿÿ9|$(tB‹L$L‹T$HQ‹L$0R‹T$(jÿP‹D$,P‹D$DQ‹L$LR‹T$TPQRèJúÿÿƒÄ(€;„Æþÿÿ‹L$ë/Š„À„¶þÿÿ<:tã< tß<;tÛ<,t׊CC„Àuè‹D$^]_[ƒÄ4ÃCŠ„À…ïüÿÿ^]_‹Á[ƒÄ4Ã_‹Á[ƒÄ4ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸èæX3À‰$‰D$9D$$„09D$„&9D$ „SUVWè†÷ÿÿ‹l$(‹Ø‹ET‰T$ ÿЋð ¶háÉÉh8kQè|R‹øƒÄ ‰|$…ÿu%häh8kjAh¦jèRƒÄ_^]3À[ƒÄËL$ T$RD$PWQSVUèDøÿÿhöµÄh8kRèR‹èƒÄ(…íu+WèRhúh8kjAh¦jè¸QƒÄ_^]3À[ƒÄËD$‹|$ P#û¾0‹Íè’øÿÿj~Ñ‹t$:‹øuF…ÿt'‹ÆPŠ@„Éuù+ÂtUD$PL$Q‹Îè-ûÿÿƒÄ ‹øUèZQƒÄ…ÿu‹T$RèIQƒÄ_^]3À[ƒÄÃè[Q‹ø…ÿu‹D$Pè'QƒÄ_^]3À[ƒÄËt$…ötƒ~t ‹QWè!QƒÄ‹v …öuç‹T$RèïPWè­P‹ðƒÄ…öuWè€PƒÄ_^]3À[ƒÄË\$,‹…Àt PècPƒÄ‰;‹\$0‹…Àt PèNPƒÄh` V‰3è QƒÄ‹Ç_^][ƒÄÃ3ÀƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸è†V‹T$‹B‹J ‰D$‹BSUV‹ð$¶Àƒæ÷ØÀ%þÿÿöBW‰L$t¿ë‹ùç€?ï€÷ßÿƒÇÇD$Ìl…öuÇD$Él÷Át ÇD$Ü`ëÇD$ä`÷ÁuÇD$Ô`¶É½àb»ÇD$ bëLÇD$8bëB=u#ÇD$hlë1‰l$ë+- t ƒè t-àt ÇD$Ô`ëÇD$`lë‰\$‹Á%€?=‡Í„½=wst9=€t=…)¿Tlé+…ötƒÿu ¿Llé¿Dlé…ötƒÿu ¿‡µVjè"PhIh8kj è+K‹ðƒÄ‰‰~èÎìÿÿ¡Xô…ÀtiVPè¸JƒÄ…À|4VèùJjèÞOhRh8kh5h¥jè¡JƒÄ^[¸_áXô…ÀtVPèÙJƒÄ…Àtjè™OƒÄ^[3À_ÃVèžJjèƒOhZh8kjAë¦hDh8kh3h¥jè8JƒÄ[3À_ø_ÃÌÌÌÌÌÌÌ‹D$…Àt‹@Ã3ÀÃÌ‹D$‹@4= «„Ÿ=´„A=tƒø…a¸zøøyÃ-=‡E¶ˆÀøÿ$pø¸Øyø¸yøœyø€yødyøHyø(yøyøèxøÈxø¤xø€xø\xø8xøxøxøàwøÀwøœwÃ=®„¢-=ч¤¶Ìùÿ$•Pù¸€wødwøHwø,wø wøìvøÈvø¤vø|vøTvø0vø vøðuøÔuø°uøŒuøhuøDuø uøütøØtø´tø”tÃ-tƒètƒè…÷¸ttøTtø4tøtÃ=!®„¢- =ý‡¾¶€üúÿ$… ú¸ôsøÔsø¸søœsø€sødsøHsø(søsøìrøÐrø´rø”røtrøTrø4rørøìqøÈqø¤qø€qølqøPqÃ="䄨-!=à‡¶ˆ|üÿ$üû¸,qøqøðpøØpø¸pø˜pø€pøhpøLpø0pøpøøoøÜoøÀoø¤oøˆoøloøPoø4oøoøìnøÌnø¬nønøtnøTnø4nønøìmøÌmø¬møŒmÃ=@"t="t =0u ¸tmøTmø8mÃ=Pt=`t¸(mømøèlËÿ%õ1õ7õ=õCõIõOõUõ[õaõgõmõsõyõõ…õ‹õ+õ‘õ\ø  ‹ÿÆõÌõÒõØõÞõäõêõðõöõüõööö ö&ö,ö2ö8ö>öDöe÷k÷q÷w÷}÷ƒ÷‰÷÷öö\ø   ‹ÿ¬ö¸ö¾öÄöÊöÐöÖöÜöâöèöîöôöúö÷÷ ÷÷÷÷²ö$÷*÷\ø   ‹ÿ•÷›÷¡÷§÷­÷³÷¹÷¿÷Å÷Ë÷Ñ÷×÷Ý÷ï÷õ÷û÷øø øøø}÷ƒ÷‰÷÷e÷k÷q÷w÷ã÷é÷\ø   ÌÌÌ‹D$‹@8-ðtƒètƒèt¸Ô`øXzøLzø@zËD$‹@4= “„‡=®„=tƒø…¸l}ød}Ã-=€‡ì¶ˆ4ÿ$è¸\}øT}øL}øD}ø<}ø4}ø,}ø$}ø}ø}ø }ø}øü|øô|øì|øä|øÜ|øÔ|Ã=¢„–-=Á‡Q¶,ÿ$•¸¸Ì|øÄ|ø¼|ø´|ø¬|ø¤|øœ|ø”|øŒ|ø„|ø||øt|øl|ød|ø\|øT|øL|øD|ø<|ø4|ø,|Ã-tƒèt ƒè…°¸$|ø|ø|Ã=!¢„–- =ð‡}¶€Dÿ$…ð¸ |ø|øü{øô{øì{øä{øÜ{øÔ{øÌ{øÄ{ø¼{ø´{ø¬{ø¤{øœ{ø”{øŒ{ø„{ø|{øt{øl{Ã="Ø„Ì-!=Їжˆ°ÿ$8¸d{ø\{øT{øL{øD{ø<{ø4{ø,{ø${ø{ø{ø {ø{øüzøôzøìzøäzøÜzøÔzøÌzøÄzø¼zø´zø¬zø¤zøœzø”zøŒzø„zø|zÃ="t=@t¸tzølzødzÃIûýþþ þþþþ%þ+þ1þ7þ=þCþIþOþUþõý[þÓ  Iþ–þœþ¢þ¨þ®þ´þºþÀþÆþÌþÒþØþÞþäþêþðþöþüþÿ#)/5;Ó   ‹ÿjÿpÿvÿ|ÿ‚ÿˆÿŽÿ”ÿšÿ ÿ¦ÿ¬ÿ²ÿ¸ÿ¾ÿÄÿÊÿdÿÐÿÖÿÓ   ISYAGM_ekqw}ƒ‰•›¡§­³¹)/5;#Ó   ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$Áøƒøu¸|}Ãø¸t}t¸Ô`ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$Áøƒøu¸Œ}Ãø¸ˆ}t¸„}ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$%ÿƒød‡ž¶€ ÿ$…¨¸ð}øì}øè}øä}øà}øÜ}øØ}øÔ}øÐ}øÌ}øÈ}øÄ}øÀ}ø¼}ø¸}ø´}ø°}ø¬}ø¨}ø¤}ø }øœ}ø˜}ø”}ø}ËÿX^"(.4:@FLRdjpv|‚ˆŽ”š  ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$%ÿƒød‡ž¶€œÿ$…8¸ øŒø|ødøPø@ø0øøøð~øÜ~øÈ~ø´~ø¤~ø˜~øˆ~øx~øh~øT~ø@~ø(~ø~ø~øô}øÔ`Ëÿ ¦¬è¾ÄÊÐÖÜâôú $*0 ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹@8-ðtƒètƒèt¸Ô`ø¸ø´ø°øèÖ;SWjè=ñþÿ‹ØƒÄ…Û}#h½h¼h÷hÁjè[5ƒÄ3À[YËDÞ(UlÞ(…ÀtbPèp5WP‰D$èi:‹D$PèO5ƒÄè5ƒ?u‹O QèC:ƒÄ¨u*‹UWRè9ƒÄ…Àu‹EPè 5ƒÄÇE]3À[YËDÞ,…Àt Pèú4ƒÄhÛh¼j OjQèÎ4‰|Þ,ƒÄ‰.]ÇF¸[YÃÌW‹|$ …ÿuh-h¼jChÉjè4ƒÄ3À_ÃV‹t$ Æ”Vè—¼ÿÿƒÄ…Àu h2h¼jAhÉjèJ4ƒÄ^3À_Ë6è©þÿÿ^_ÃÌÌÌÌÌ̸èv:V3öW‰t$è9Pèù7‹øƒÄ…ÿu!hCh¼jhËjèô3ƒÄ_‹Æ^YËD$PjjlWèf4ƒÄ…À,hIh¼jhËjè½3ƒÄWèø7‹D$ ƒÄ_^YËD$SU‹l$ƒøu ‹…Ø‹Hp‹PlQRjW» è¿8ƒÄëƒøuHjWX è¤8ƒÄ‹ð…öu h^h¼Së3VUè«þÿÿV‰D$èg3ƒÄ ][Wè|7‹D$ ƒÄ_^YÃhYh¼j|hËjè3ƒÄ][WèN7‹D$ ƒÄ_^YÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹D$ VQT$R‰D$‹D$jPè8‹ðƒÄ…öuhrh¼j hÊjè²2ƒÄ3À^ËL$ WVQèýýÿÿV‹øè»2ƒÄ ‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌSU‹l$ Uè¦2‹ØƒÄ…Ûu#h’h¼h h¿jèR2ƒÄ]3À[ÃVSUèîþÿ‹ðƒÄ…ö}*h™h¼h÷h¿jè2Sè<2ƒÄ^]3À[ËD÷,…ÀtTPSè47ƒÄèd2‹D÷,ƒ8u‹@ Pè7ƒÄ¨u,‹L÷,QUèÖ5ƒÄ…Àu‹T÷,Rèç1ƒÄÇD÷,è2SèÑ1‹D÷(t÷(ƒÄ…Àt Pè°1ƒÄh½h¼jEjPè1‰.ƒÄ‰7^]ÇG¸[ÃÌÌÌÌÌV‹t$ …öuhh¼jCh±jèA1ƒÄ3À^ÃS‹\$ ðSèW¹ÿÿƒÄ…Àu hh¼jAh±jè 1ƒÄ[3À^ÃWèN6‹ø…ÿu!hh¼jh±jèÞ0ƒÄ_[3À^ÃVè!3VjWè6‹3è-ûÿÿW‹ðèÛ0ƒÄ_[‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌ̸èæ6V3öW‰t$èq5Pèi4‹øƒÄ…ÿu!h0h¼jh³jèd0ƒÄ_‹Æ^YËD$PjjlWèÖ0ƒÄ…À,h6h¼jh³jè-0ƒÄWèh4‹D$ ƒÄ_^YËD$S‹\$UƒøujW½ è[5ƒÄëƒøuP‹Kp‹SlQRjWhè85ƒÄ‹ð…öu hKh¼Uë3VSèaþÿÿV‰D$è_2ƒÄ ][Wèò3‹D$ ƒÄ_^YÃhFh¼j|h³jè‹/ƒÄ][WèÄ3‹D$ ƒÄ_^YÃÌÌÌ‹L$ ‹D$VQT$Rj‰D$è¼4‹ðƒÄ …öuh_h¼j h²jè7/ƒÄ3À^ËD$WVPèÂýÿÿV‹øèÂ1ƒÄ ‹Ç_^ÃÌÌW‹|$ …ÿuhmh¼jCh®jèñ.ƒÄ3À_ÃV‹t$ ưVè·ÿÿƒÄ…Àu hrh¼jAh®jèº.ƒÄ^3À_Ë6èùÿÿ^_ÃÌÌÌÌÌ̸èæ4V3öW‰t$èq3Pèi2‹øƒÄ…ÿu!h‚h¼jh°jèd.ƒÄ_‹Æ^YËD$PjjlWèÖ.ƒÄ…À,hˆh¼jh°jè-.ƒÄWèh2‹D$ ƒÄ_^YËD$S‹\$Uƒøu‹Kp‹SlQRjW½ è53ƒÄëƒøuHjWh è3ƒÄ‹ð…öu hh¼Uë3VSè±þÿÿV‰D$èÝ-ƒÄ ][Wèò1‹D$ ƒÄ_^YÃh˜h¼j|h°jè‹-ƒÄ][WèÄ1‹D$ ƒÄ_^YÃÌÌÌ‹L$‹D$ VQT$R‰D$‹D$jPè™2‹ðƒÄ…öuh²h¼j h¯jè2-ƒÄ3À^ËL$ WVQè þÿÿV‹øè;-ƒÄ ‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌW‹|$ …ÿujIh¼jChÆjèä,ƒÄ3À_ÃV‹t$ Æ”Vèú´ÿÿƒÄ…ÀujNh¼jAhÆjè°,ƒÄ^3À_ÃW‹>èúÿÿƒÄ^_ÃÌÌÌÌÌÌÌ̸èÖ2V3öW‰t$èa1PèY0‹øƒÄ…ÿuj_h¼jhÈjèW,ƒÄ_‹Æ^YËD$PjjlWèÉ,ƒÄ…À)jeh¼jhÈjè#,ƒÄWè^0‹D$ ƒÄ_^YËD$SU‹l$ƒøujW» è]1ƒÄë!ƒøuvX‹…Ø‹Hp‹PlQRjWè°0ƒÄ‹ð…öu*jzh¼ShÈjè³+ƒÄ][Wèì/‹D$ ƒÄ_^YÃVUè”þÿÿƒÄV‰D$è¡+ƒÄ][WèÂ/‹D$ ƒÄ_^YÃjth¼j|hÈjè^+ƒÄ][Wè—/‹D$ ƒÄ_^YÃÌÌÌÌÌÌ‹D$ VPL$Qjè+‹ðƒÄ …öuhŽh¼j hÇjè+ƒÄ3À^ËT$WVRèúýÿÿV‹øè +ƒÄ ‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌV‹t$ …öuhŸh¼jChÌjèÁ*ƒÄ3À^ÃS‹\$ ÔSèײÿÿƒÄ…Àu h¤h¼jAhÌjèŠ*ƒÄ[3À^ÃWèÎ/‹ø…ÿu!h©h¼jhÌjè^*ƒÄ_[3À^ÃVè¡,VjWè’/‹3è­ôÿÿW‹ðè[*ƒÄ_[‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌ̸èf0V3öW‰t$èñ.Pèé-‹øƒÄ…ÿu!hîh¼jhÎjèä)ƒÄ_‹Æ^YËD$PjjlWèV*ƒÄ…À,hôh¼jhÎjè­)ƒÄWèè-‹D$ ƒÄ_^YËD$SU‹l$ƒøujW» èÛ.ƒÄë!ƒøuVX‹…Ø‹Hp‹PlQRjWè².ƒÄ‹ð…öu h h¼Së3VUè[þÿÿV‰D$èÙ+ƒÄ ][Wèl-‹D$ ƒÄ_^YÃhh¼j|hÎjè)ƒÄ][Wè>-‹D$ ƒÄ_^YÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$ ‹D$VQT$Rj‰D$è,.‹ðƒÄ …öuhh¼j hÍjè§(ƒÄ3À^ËD$WVPè²ýÿÿV‹øè2+ƒÄ ‹Ç_^ÃÌÌW‹|$ …ÿuhh¼jCh«jèa(ƒÄ3À_ÃV‹t$ ưVèw°ÿÿƒÄ…Àu h„h¼jAh«jè*(ƒÄ^3À_ÃW‹>è˜õÿÿƒÄ^_ÃÌ̸èV.V3öW‰t$èá,PèÙ+‹øƒÄ…ÿu!hÐh¼jh­jèÔ'ƒÄ_‹Æ^YËD$PjjlWèF(ƒÄ…À,hÖh¼jh­jè'ƒÄWèØ+‹D$ ƒÄ_^YËD$S‹\$UƒøujW½ è×,ƒÄëƒøus‹Kp‹SlQRjWhè0,ƒÄ‹ð…öu-hëh¼Uh­jè0'ƒÄ][Wèi+‹D$ ƒÄ_^YÃVSè‘þÿÿƒÄV‰D$è'ƒÄ][Wè?+‹D$ ƒÄ_^YÃhåh¼j|h­jèØ&ƒÄ][Wè+‹D$ ƒÄ_^YËD$VPL$Qjè'‹ðƒÄ …öuhÿh¼j h¬jè&ƒÄ3À^ËT$WVRèúýÿÿV‹øèŒ&ƒÄ ‹Ç_^ÃÌÌÌÌÌÌÌÌÌ̸è¦,SU3íè»&è0+Pè(*‹ØƒÄ…Ûu!hÌh¼jhÜjè#&ƒÄ‹Å][YËD$PjjlSè•&ƒÄ…À*hÒh¼jhÜjèì%ƒÄSè'*ƒÄ‹Å][YÃV‹t$‹Np‹VlWQRjSè¤*‹øƒÄ‰|$…ÿu hÙh¼j hÜjèŸ%ƒÄéÀWVèýÿÿƒÄ‹èè$*…À…¥…턟‹†”…Àthê>Pè'ƒÄdž”‹Fp‹NlPQjSè$*‹øƒÄ…ÿt+WjjV莄ÿÿƒÄ…ÀtC‹Vp‹FlRPjSèù)‹øƒÄ…ÿuÕè{*‹Èáÿù u%ÿƒøluèX%‹|$ëWèø$ƒÄ‹|$3í…ÿt Wèå$ƒÄ_^Sè)ƒÄ‹Å][YÃÌÌÌÌÌÌ̸,èö*¡ô3ĉ„$(‹„$4U3íV‹´$8‰D$‰l$$‰l$,‰l$ ‰l$‰l$(‰l$‰l$;õu^3À]‹Œ$(3Ìèæ*Ä,Ã9®¬u9®°t×SWT$8Œ$j»¿R‰\$@‰|$D‰L$Hèž)‹QT$T„$<R‰\$X‰|$\‰D$`è~)D$$‰D$p‹†¬ƒÄ¿‰|$\;Åu‹†°ë‹@¹‹Ð9uÁúˆT$‹ÐÁúÇD$XˆT$ˆD$ëÁú‰L$XˆT$ˆD$‹F‰D$h‹FDV‰D$x‹Fh‰T$pVH‰„$ˆ‹F‰”$€Vl‰„$˜‹†¤‰”$V‰|$l‰|$|‰¼$Œ‰¼$œ‰”$ ;Åt2‰Œ$¬P”$¬Œ$R‰œ$°‰Œ$¸èŒ(ƒÄ¹‹† ;Åt2‰Œ$¼P”$¼Œ$,R‰œ$À‰Œ$ÈèP(ƒÄ¹‹†˜;Åt-‰Œ$ÌP”$ÌŒ$R‰œ$ЉŒ$Øè(ƒÄ‹–È;Õt.‹Âx‹ÿŠ@„Éuù+lj„$ØÇ„$܉”$à¿‹ŽÌ;Ít,‹†Ð‰„$ø‰¼$ü‰Œ$;Åt ƒ¾Ôÿt‰l$x‹†Ô;Å~1P”$ìŒ$$R‰œ$ðÇ„$ô‰Œ$øèk'ƒÄD$8UPèW'L$PUQ‹øèJ'T$hURøè7'ø„$UPè''Œ$ˆUQøè'ƒÄ(ø9nv”$˜URèÿ&ƒÄø9®¤t!„$¨UPèê&jPj‰D$@èÐ&ƒÄø9® t!Œ$¸UQèÁ&jPj‰D$Hè§&ƒÄø‹†”;ÅtUPè!!jPj‰D$<èƒ&ƒÄø”$ˆURèv&‹ØjSjèd&ƒÄø9®˜t!„$ÈUPèU&jPj‰D$8è;&ƒÄø9®Ô~!Œ$èUQè,&j Pj‰D$4è&ƒÄø9®Ìt!”$øURèý%j Pj‰D$,èé%ƒÄø9®Èt!„$ØUPèÔ%jPj‰D$DèÀ%ƒÄøjWjè±%‹è‹D$(ƒÄ …À„A‹jjWT$jR‰L$$èƒ%D$$PL$PQè†%T$,RD$hPèw%L$4Q”$€Rè_%D$jUè  ‹D$,PSWèNhÿÿ‹ØSWèe‰ÿÿƒÄƒø‡ÿ$…¤5…ÛŽ ‹F…Àv"^ 9F vÿFWÇF èiÿÿƒÄ¸ë‹D$ƒ~†Ó…À…ËPÿèT‹NNƒÄ;Á†³ÿFW‰Fè×hÿÿ‹T$ƒÄ_^‰U]‹Ã[ƒÄÃj Uèë ‹T$ƒÄ_^‰U]‹Ã[ƒÄÃj UèÏ ‹T$ƒÄ_^‰U]‹Ã[ƒÄÃj Uè³ ƒÄ_ÇD$ ‹T$ ^‰U]‹Ã[ƒÄÃj Uè ƒÄ_ÇD$ ‹T$ ^‰U]‹Ã[ƒÄÃj Uèk ÇD$ƒÄ‹T$_^‰U]‹Ã[ƒÄÃI~45ý455555}5Y5ÌÌÌÌÌÌÌ̸èF3ÀS‹\$‰D$‰D$;Øu[ƒÄÃU‹l$V‹u W‹>jUèð ‹D$,PSWè>gÿÿ‹ØSW赇ÿÿƒÄƒø‡õÿ$…07…ÛŽæ‹F…Àv"^ 9F vÿFWÇF èkgÿÿƒÄ¸ë‹D$ƒ~†¯…À…§PÿèT‹NNƒÄ;Á†ÿFW‰Fè'gÿÿ‹T$ƒÄ_^‰U]‹Ã[ƒÄÃj Uè; ‹T$ƒÄ_^‰U]‹Ã[ƒÄÃj Uè ‹T$ƒÄ_^‰U]‹Ã[ƒÄÃj Uè ƒÄ_ÇD$ ‹T$ ^‰U]‹Ã[ƒÄÃj Uèß ÇD$ƒÄ‹T$_^‰U]‹Ã[ƒÄÃI.67É6­6å677 7‹D$SUVW‹|$‹o ‹u»…öu ƒømt_^]3À[ÃHÿƒù~‡¨¶‰œ;ÿ$L;Vè©ÿÿ‹F‹N ƒÄ;HuVèÕ‡ÿÿë ;Hu V蘇ÿÿƒÄVèÿ{ÿÿ‹$ƒÄ…ÿt‹T$ ‹D$‹L$RPQWè|ƒÄ_^]‹Ø[Ëv …ö„O‹T$ ‹D$‹L$RPQVèRƒÄ_^]‹Ø[Ã_^3Û]‹Ã[Ã|$VtèV‡ÿÿƒÄ_^]‹Ã[Ãè‡ÿÿƒÄ_^]‹Ã[ËD$ƒø<‹]}¸j‰EÿèTƒÄ_^‰E]‹Ã[ËD$=‹]ŒÆ_^‰E]‹Ã[Ë]_^]‹Ã[Ã…öt WèûÿÿƒÄ‹D$ ‹T$‹O ‰WP‰è‹]ÿÿ‹ðƒÄ…öt.‹G$…Àt PVèăÄhih ‚j‰w$jƒÆ,VèûƒÄ‰_ _^]‹Ã[ËD$ …À„ÿÿÿ_‰0^]‹Ã[Ë__^]‹Ã[ËT$‰W_^]‹Ã[ËL$ ‹T$QRP‹FPè%ƒÄ_^]‹Ø[ÃVè¹`ÿÿ‹ØƒÄ…Û…ð‹N PPj QèûƒÄ_^]‹Ø[ÃjW胋T$(‹D$$‹L$ R‹VPQRèÑW‹Øèc ƒÄ_^]‹Ã[ËG$…À„œ;F „“PPVè\ÿÿ‹G$hh ‚jƒÀ,jPèƒÄ _^]‹Ã[ËF9F t P蹃ċ$…ÿth˜h ‚jjƒÇ,WèØƒÄ3À_‰F‰F ^]‹Ã[ÃjWèÐVÇG轄ÿÿ‹ØSV蔃ÿÿƒÄƒèt;ƒèt$ƒè…òj Wè–‹O$‹QƒÄ‰W_^]‹Ã[Ãj Wè{ƒÄ_^]‹Ã[Ãj WèiƒÄ_^]‹Ã[Ë\$ ‹C ƒ8t ‹PèÛ|ÿÿƒÄVè…ÿÿ‹K ‰‹W ‹J‹C ‰H‹W ‹C ‹J ‰H ‹W ‹C ‹J‰H‹W ‹C ‹J‰H‹S ƒÄ3Û9_•Ã^]‹Ã[ËL$ ‹T$QRP‹F PèQƒÄ_^]‹Ø[ÃVèuvÿÿ‹L$$ƒÄ_^‰]‹Ã[ËT$ ‹L$R‹V QPRè‹ØƒÄ_^]‹Ã[Ñ789Ý9 99A9k9‘:#9;:÷:’8ö88l8ˆ8C8+;     ÌÌÌÌÌ‹D$‹H ‹‹L$V¾ƒùt^‰L$‹@ ‰D$鳋L$QPè,uÿÿƒÄ‹Æ^ÃÌÌÌÌÌ‹T$‹ÂVp›Š@„Éuù+ÆP‹D$ RPèOƒÄ ^ÃÌÌÌÌÌÌWhˆæè‹øƒÄ…ÿu_ËD$VPè?xÿÿ‹ðƒÄ…öuWèVƒÄ^3À_Ã|$Vtè«‚ÿÿëèt‚ÿÿƒÄVjjmWèrƒÄ^‹Ç_ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$VhPèš‹L$hQ‹ð艃ąöt)…Àt%‹v ƒ>t‹@ ƒ8t‹‹RPè9]ÿÿƒÄ¸^Ã3À^ÃÌÌÌÌÌÌÌÌÌÌÌ‹D$…Àt뛋9t‹@$…ÀuïËP ‹‰D$é°{ÿÿUV3öèiPè‹èƒÄ…íu^]ÃSWhˆæèÿ‹ØƒÄ…Ût?‹D$Pè&wÿÿ‹øƒÄ…ÿu Sè=ƒÄë!WèœÿÿWjjmSèmUSèš‹ðƒÄ…öuUèƒÄ…öt VèƒÄ3À_[^]ÃÌÌÌÌWèêP芋øƒÄ…ÿu_ËD$VPèNÿÿÿ‹ðƒÄ…ötVWè>ƒÄ…ÀuW跃ąöt V誃Ä3À^_ÃÌÌÌÌÌÌÌÌÌÌÌÌ¡°æP胃ąÀuh°æPèkhpìjè_ƒÄÃÌÿ%„Tÿ%|Tÿ%xTÿ%tTÿ%pTÿ%lTÿ%hTÿ%dTÿ%`Tÿ%\Tÿ%XTÿ%TTÿ%PTÿ%LTÿ%HTÿ%DTÿ%DRÿ%DPÿ%HPÿ%LPÿ%PPÿ%TPÿ%XPÿ%\Pÿ%`Pÿ%dPÿ%hPÿ%lPÿ%pPÿ%tPÿ%xPÿ%|Pÿ%€Pÿ%„Pÿ%ˆPÿ%ŒPÿ%Pÿ%”Pÿ%˜Pÿ%œPÿ% Pÿ%¤Pÿ%¨Pÿ%¬Pÿ%°Pÿ%´Pÿ%¸Pÿ%¼Pÿ%ÀPÿ%ÄPÿ%ÈPÿ%ÌPÿ%ÐPÿ%ÔPÿ%ØPÿ%ÜPÿ%àPÿ%äPÿ%èPÿ%ìPÿ%ðPÿ%ôPÿ%øPÿ%üPÿ%Qÿ%Qÿ%Qÿ% Qÿ%Qÿ%Qÿ%Qÿ%Qÿ% Qÿ%$Qÿ%(Qÿ%,Qÿ%0Qÿ%4Qÿ%8Qÿ%²T²± €% €F €Ž€k €ò€ê€Þ€!€¨€©€U€4€§€™€!€í€€Ð€ü€­ €b€x €¬ €€C€û €N €Á€"€€Y€m€'€Ê€§ €b€n€^ €q €<€ò € €o€Â €˜ €l €ƒ €¸ €€÷ €O€{€É€v€R€Û€ò€€{€€€à €Å€Ä€€€€;€ €ó €o €» €Œ€9€ï€+€x€—€j €o€Þ €Z €Ë€€€€>€×€È €€<€¡ €‡€Ø€Î€ñ€Î€b€= €€Í€æ€ä€û€A€‹€W€ª€á€‘€M€c €H€I€è€0€8€ €y€x€9€ô€ï€€n€s€‘€€¼€R€R €4 €U€Ž €€ €Ø €x€®€·€?€¶€% €€„ €~ €ª€B €»€€V €§ €C€A€5€N€b€ò€ç €G €|€’€® €r€z€ì€Ç €l€ò€€:€B€v€t€€ï€í€€2 €m €€<€u€|€J€€ø€w€?€€ö€L€§€Ü € €ÿ€± €‘€]€D €I€Í€« €w€y€{€;€{€½€:€¼€€…€€ì€€€€ï€î€€… €%€#€8€6€€C€t€¹ €'€ €Î€€Ì€¿€¨€z €V€X€M€%€B€´ €S €E€I€>€0€$€+€»€Ì€[€÷€á€µ€Ž€"€€ €€°€Y€ž€ü€‡€v€u€ˆ€…€o€‰€€°’°¨°̰Ö°ä°ì°ö°b°T°H°6°&°°°þ¯è¯Ú¯ЯƯ¼¯²¯¨¯ž¯p°ŸE.\ssl\s2_srvr.c.\ssl\s2_clnt.cDES-CBC3-MD5DES-CBC-MD5IDEA-CBC-MD5EXP-RC2-CBC-MD5RC2-CBC-MD5EXP-RC4-MD5RC4-MD5SSLv2 part of OpenSSL 0.9.8l 5 Nov 2009.\ssl\s2_lib.cs->session->master_key_length >= 0 && s->session->master_key_length < (int)sizeof(s->session->master_key)error >= 0 && error <= (int)sizeof(buf)c->iv_len <= (int)sizeof(s->session->key_arg)s->s2->key_material_length <= sizeof s->s2->key_material.\ssl\s2_enc.c.\ssl\s2_pkt.cmac_size <= MAX_MAC_SIZE.\ssl\s3_srvr.c.\ssl\s3_clnt.cSRVRCLNTAECDH-AES256-SHAAECDH-AES128-SHAAECDH-DES-CBC3-SHAAECDH-RC4-SHAAECDH-NULL-SHAECDHE-RSA-AES256-SHAECDHE-RSA-AES128-SHAECDHE-RSA-DES-CBC3-SHAECDHE-RSA-RC4-SHAECDHE-RSA-NULL-SHAECDH-RSA-AES256-SHAECDH-RSA-AES128-SHAECDH-RSA-DES-CBC3-SHAECDH-RSA-RC4-SHAECDH-RSA-NULL-SHAECDHE-ECDSA-AES256-SHAECDHE-ECDSA-AES128-SHAECDHE-ECDSA-DES-CBC3-SHAECDHE-ECDSA-RC4-SHAECDHE-ECDSA-NULL-SHAECDH-ECDSA-AES256-SHAECDH-ECDSA-AES128-SHAECDH-ECDSA-DES-CBC3-SHAECDH-ECDSA-RC4-SHAECDH-ECDSA-NULL-SHAADH-AES256-SHADHE-RSA-AES256-SHADHE-DSS-AES256-SHADH-RSA-AES256-SHADH-DSS-AES256-SHAAES256-SHAADH-AES128-SHADHE-RSA-AES128-SHADHE-DSS-AES128-SHADH-RSA-AES128-SHADH-DSS-AES128-SHAAES128-SHAFZA-FZA-CBC-SHAFZA-NULL-SHAADH-DES-CBC3-SHAADH-DES-CBC-SHAEXP-ADH-DES-CBC-SHAADH-RC4-MD5EXP-ADH-RC4-MD5EDH-RSA-DES-CBC3-SHAEDH-RSA-DES-CBC-SHAEXP-EDH-RSA-DES-CBC-SHAEDH-DSS-DES-CBC3-SHAEDH-DSS-DES-CBC-SHAEXP-EDH-DSS-DES-CBC-SHADH-RSA-DES-CBC3-SHADH-RSA-DES-CBC-SHAEXP-DH-RSA-DES-CBC-SHADH-DSS-DES-CBC3-SHADH-DSS-DES-CBC-SHAEXP-DH-DSS-DES-CBC-SHADES-CBC3-SHADES-CBC-SHAEXP-DES-CBC-SHAIDEA-CBC-SHARC4-SHANULL-SHANULL-MD5SSLv3 part of OpenSSL 0.9.8l 5 Nov 2009.\ssl\s3_lib.cCCCBBA.\ssl\s3_enc.c.\ssl\s3_pkt.cSSL alert number %d.\ssl\s3_both.c.\ssl\s23_srvr.cCONNECTPUT HEAD POST GET .\ssl\s23_clnt.c.\ssl\s23_lib.cserver finishedclient finishedTLSv1 part of OpenSSL 0.9.8l 5 Nov 2009.\ssl\t1_lib.ckey expansionIV blockclient write keyserver write key.\ssl\t1_enc.cmaster secret.\ssl\d1_srvr.c.\ssl\d1_clnt.cDTLSv1 part of OpenSSL 0.9.8l 5 Nov 2009.\ssl\d1_lib.c.\ssl\d1_pkt.c0s->packet_length == DTLS1_RT_HEADER_LENGTH.\ssl\d1_both.cs->d1->w_msg_hdr.msg_len + DTLS1_HM_HEADER_LENGTH == (unsigned int)s->init_nums->d1->w_msg_hdr.msg_len + DTLS1_CCS_HEADER_LENGTH <= (unsigned int)s->init_nums->init_off == 0len == (unsigned int)retlen >= DTLS1_HM_HEADER_LENGTHs->init_off > DTLS1_HM_HEADER_LENGTHs->init_num == (int)s->d1->w_msg_hdr.msg_len + DTLS1_HM_HEADER_LENGTHi == (int)frag_leni == DTLS1_HM_HEADER_LENGTHretransmit: message %d non-existant dtls1_retransmit_message() failed invalid state reached %s:%d%s:%d: rec->data != rec->input .\ssl\d1_enc.cOpenSSL 0.9.8l 5 Nov 2009.\ssl\ssl_lib.cAES:ALL:!aNULL:!eNULL:+RC4:@STRENGTHunknownSSLv2SSLv3TLSv1s->sid_ctx_length <= sizeof s->sid_ctxssl3-sha1ssl3-md5ssl2-md5SSL for verify callback.\ssl\ssl_cert.cssl_serverssl_clientOPENSSL_DIR_read(&ctx, '')%s/%s.\ssl\ssl_sess.c%-23s %s Kx=%-8s Au=%-4s Enc=%-9s Mac=%-4s%s FIPSHIGHMEDIUMLOWEXPORT56EXPORT40EXPORTEXPFZAADHRSAKRB5NULLSHASHA1MD5CAMELLIAAESeFZAeNULLSEEDIDEARC2RC43DESDESDSSaDHaNULLaFZAaDSSaRSAaKRB5EDHECCdraftDHkFZAkEDHkDHdkDHrkRSAkKRB5COMPLEMENTOFDEFAULTCOMPLEMENTOFALLALL8c?ÿßÿÿÿÿÿÿÿÿÿÿÿÿÿ(c €?c c ÿcÿübÿôbÿìbÿäbÿàbÿÔbÀÿÐbwÿÈb Àb¸b°b¨b¤b bœb€€?”b€?b€?Œb€?„b€?|b€?tb €?lb€?hb€?\b€?Xb@ÀPb€ÀLb€ÀDb €?session_id)%ld (%s) Verify return code: Timeout : %ld (sec) Start Time: %ld Compression: %d (%s) Compression: %d TLS session ticket: TLS session ticket lifetime hint: %ld (seconds) Key-Arg : Master-Key: Session-ID-ctx: %02X Session-ID: Cipher : %s Cipher : %04lX Cipher : %06lX Protocol : %s SSL-Session: .\ssl\ssl_txt.cdss1DSS1DSA-SHA1-oldDSA-SHA1RSA-SHA1-2RSA-SHA1ssl.\ssl\bio_ssl.cx509 verification setup problemsx509 libwrong version numberwrong ssl versionwrong signature sizewrong signature lengthwrong number of key bitswrong message typewrong cipher returnedwrite bio not setunsupported status typeunsupported ssl versionunsupported protocolunsupported elliptic curveunsupported compression algorithmunsupported cipherunknown ssl versionunknown remote error typeunknown protocolunknown pkey typeunknown key exchange typeunknown cipher typeunknown cipher returnedunknown certificate typeunknown alert typeuninitializedunexpected recordunexpected messageunable to load ssl3 sha1 routinesunable to load ssl3 md5 routinesunable to load ssl2 md5 routinesunable to find ssl methodunable to find public key parametersunable to find ecdh parametersunable to find dh parametersunable to extract public keyunable to decode ecdh certsunable to decode dh certstried to use unsupported ciphertls rsa encrypted value length is wrongtls peer did not respond with certificate listtls invalid ecpointformat listtls client cert req with anon ciphertlsv1 alert user cancelledtlsv1 alert unknown catlsv1 alert record overflowtlsv1 alert protocol versiontlsv1 alert no renegotiationtlsv1 alert internal errortlsv1 alert insufficient securitytlsv1 alert export restrictiontlsv1 alert decrypt errortlsv1 alert decryption failedtlsv1 alert decode errortlsv1 alert access deniedssl session id is differentssl session id has bad lengthssl session id context too longssl session id conflictssl session id callback failedssl library has no ciphersssl handshake failuressl ctx has no default ssl versionsslv3 alert unsupported certificatesslv3 alert unexpected messagesslv3 alert no certificatesslv3 alert illegal parametersslv3 alert handshake failuresslv3 alert decompression failuresslv3 alert certificate unknownsslv3 alert certificate revokedsslv3 alert certificate expiredsslv3 alert bad record macsslv3 alert bad certificatessl3 session id too shortssl3 session id too longssl3 ext invalid servername typessl3 ext invalid servernamessl2 connection id too longssl23 doing session id reusesignature for non signing certificateshort readsession id context uninitializedserverhello tlsextreuse cipher list not zeroreuse cert type not zeroreuse cert length not zerorequired cipher missingrecord too smallrecord too largerecord length mismatchread wrong packet typeread timeout expiredread bio not setpublic key not rsapublic key is not rsapublic key encrypt errorprotocol is shutdownproblems mapping cipher functionspre mac length too longpeer error unsupported certificate typepeer error no cipherpeer error no certificatepeer error certificatepeer errorpeer did not return a certificatepath too longparse tlsextpacket length too longonly tls allowed in fips modeold session cipher not returnednull ssl method passednull ssl ctxno verify callbackno shared cipherno publickeyno protocols availableno private key assignedno privatekeyno method specifiedno compression specifiedno client cert receivedno client cert methodno cipher matchno cipher listno ciphers specifiedno ciphers passedno ciphers availableno certificate specifiedno certificate setno certificate returnedno certificate assignedno certificates returnednon sslv2 initial packetmissing verify messagemissing tmp rsa pkeymissing tmp rsa keymissing tmp ecdh keymissing tmp dh keymissing rsa signing certmissing rsa encrypting certmissing rsa certificatemissing export tmp rsa keymissing export tmp dh keymissing dsa signing certmissing dh rsa certmissing dh keymissing dh dsa certmessage too longlibrary has no cipherslibrary buglength too shortlength mismatchkrb5 server tkt skewkrb5 server tkt not yet validkrb5 server tkt expiredkrb5 server rd_req (keytab perms?)krb5 server initkrb5 server bad ticketkrb5 client mk_req (expired tkt?)krb5 client initkrb5 client get credkrb5 client cc principal (no tkt?)krb5key arg too longinvalid trustinvalid ticket keys lengthinvalid status responseinvalid purposeinvalid commandinvalid challenge lengthillegal paddinghttp requesthttps proxy requestgot a fin before a ccsextra data in messageexcessive message sizeerror in received cipher listerror generating tmp rsa keyencrypted length too longecgroup too large for cipherduplicate compression iddigest check faileddh public value length is wrongdecryption failed or bad record macdata length too longdata between ccs and finishedcookie mismatchconnection type not setconnection id is differentcompression library errorcompression id not within private rangecompression failurecompressed length too longclienthello tlsextcipher table src errorcipher or hash unavailablecipher code wrong lengthchallenge is differentcert length mismatchcertificate verify failedccs received earlyca dn too longca dn length mismatchbn libblock cipher pad is wrongbio not setbad write retrybad statebad ssl session id lengthbad ssl filetypebad signaturebad rsa signaturebad rsa modulus lengthbad rsa e lengthbad rsa encryptbad rsa decryptbad response argumentbad protocol version numberbad packet lengthbad message typebad mac decodebad lengthbad hello requestbad ecpointbad ecdsa signaturebad ecc certbad dsa signaturebad digest lengthbad dh p lengthbad dh pub key lengthbad dh g lengthbad decompressionbad data returned by callbackbad checksumbad change cipher specbad authentication typebad alert recordattempt to reuse session in different contextapp data in handshakeWRITE_PENDINGTLS1_SETUP_KEY_BLOCKTLS1_ENCTLS1_CHANGE_CIPHER_STATESSL_writeSSL_VERIFY_CERT_CHAINSSL_use_RSAPrivateKey_fileSSL_use_RSAPrivateKey_ASN1SSL_use_RSAPrivateKeySSL_use_PrivateKey_fileSSL_use_PrivateKey_ASN1SSL_use_PrivateKeySSL_use_certificate_fileSSL_use_certificate_ASN1SSL_use_certificateSSL_UNDEFINED_VOID_FUNCTIONSSL_UNDEFINED_FUNCTIONSSL_UNDEFINED_CONST_FUNCTIONSSL_shutdownSSL_set_wfdSSL_set_trustSSL_set_session_id_contextSSL_set_sessionSSL_set_rfdSSL_set_purposeSSL_SET_PKEYSSL_set_fdSSL_set_cipher_listSSL_SET_CERTSSL_SESS_CERT_NEWSSL_SESSION_print_fpSSL_SESSION_newSSL_RSA_PUBLIC_ENCRYPTSSL_RSA_PRIVATE_DECRYPTSSL_readSSL_PREPARE_SERVERHELLO_TLSEXTSSL_PREPARE_CLIENTHELLO_TLSEXTSSL_peekSSL_newSSL_load_client_CA_fileSSL_INIT_WBIO_BUFFERSSL_GET_SIGN_PKEYSSL_GET_SERVER_SEND_CERTSSL_GET_PREV_SESSIONSSL_GET_NEW_SESSIONSSL_do_handshakeSSL_CTX_use_RSAPrivateKey_fileSSL_CTX_use_RSAPrivateKey_ASN1SSL_CTX_use_RSAPrivateKeySSL_CTX_use_PrivateKey_fileSSL_CTX_use_PrivateKey_ASN1SSL_CTX_use_PrivateKeySSL_CTX_use_certificate_fileSSL_CTX_use_certificate_chain_fileSSL_CTX_use_certificate_ASN1SSL_CTX_use_certificateSSL_CTX_set_trustSSL_CTX_set_ssl_versionSSL_CTX_set_session_id_contextSSL_CTX_set_purposeSSL_CTX_set_client_cert_engineSSL_CTX_set_cipher_listSSL_CTX_newSSL_CTX_check_private_keySSL_ctrlSSL_CREATE_CIPHER_LISTSSL_COMP_add_compression_methodSSL_clearSSL_CIPHER_STRENGTH_SORTSSL_CIPHER_PROCESS_RULESTRSSL_CHECK_SERVERHELLO_TLSEXTSSL_check_private_keySSL_CERT_NEWSSL_CERT_INSTANTIATESSL_CERT_INSTSSL_CERT_DUPSSL_BYTES_TO_CIPHER_LISTSSL_BAD_METHODSSL_ADD_SERVERHELLO_TLSEXTSSL_add_file_cert_subjects_to_stackSSL_add_dir_cert_subjects_to_stackSSL_ADD_CLIENTHELLO_TLSEXTSSL3_WRITE_PENDINGSSL3_WRITE_BYTESSSL3_SETUP_KEY_BLOCKSSL3_SETUP_BUFFERSSSL3_SEND_SERVER_KEY_EXCHANGESSL3_SEND_SERVER_HELLOSSL3_SEND_SERVER_CERTIFICATESSL3_SEND_CLIENT_VERIFYSSL3_SEND_CLIENT_KEY_EXCHANGESSL3_SEND_CLIENT_CERTIFICATESSL3_SEND_CERTIFICATE_REQUESTSSL3_READ_NSSL3_READ_BYTESSSL3_PEEKSSL3_OUTPUT_CERT_CHAINSSL3_NEW_SESSION_TICKETSSL3_GET_SERVER_HELLOSSL3_GET_SERVER_DONESSL3_GET_SERVER_CERTIFICATESSL3_GET_RECORDSSL3_GET_NEW_SESSION_TICKETSSL3_GET_MESSAGESSL3_GET_KEY_EXCHANGESSL3_GET_FINISHEDSSL3_GET_CLIENT_KEY_EXCHANGESSL3_GET_CLIENT_HELLOSSL3_GET_CLIENT_CERTIFICATESSL3_GET_CERT_VERIFYSSL3_GET_CERT_STATUSSSL3_GET_CERTIFICATE_REQUESTSSL3_GENERATE_KEY_BLOCKSSL3_ENCSSL3_DO_CHANGE_CIPHER_SPECSSL3_CTX_CTRLSSL3_CTRLSSL3_CONNECTSSL3_CLIENT_HELLOSSL3_CHECK_CERT_AND_ALGORITHMSSL3_CHANGE_CIPHER_STATESSL3_CALLBACK_CTRLSSL3_ACCEPTSSL2_WRITESSL2_SET_CERTIFICATESSL2_READ_INTERNALSSL2_READSSL2_PEEKSSL2_GENERATE_KEY_MATERIALSSL2_ENC_INITSSL2_CONNECTSSL2_ACCEPTSSL23_WRITESSL23_READSSL23_PEEKSSL23_GET_SERVER_HELLOSSL23_GET_CLIENT_HELLOSSL23_CONNECTSSL23_CLIENT_HELLOSSL23_ACCEPTSERVER_VERIFYSERVER_HELLOSERVER_FINISHREQUEST_CERTIFICATEREAD_Ni2d_SSL_SESSIONGET_SERVER_VERIFYGET_SERVER_HELLOGET_SERVER_FINISHEDGET_CLIENT_MASTER_KEYGET_CLIENT_HELLOGET_CLIENT_FINISHEDDTLS1_WRITE_APP_DATA_BYTESDTLS1_SEND_SERVER_KEY_EXCHANGEDTLS1_SEND_SERVER_HELLODTLS1_SEND_SERVER_CERTIFICATEDTLS1_SEND_HELLO_VERIFY_REQUESTDTLS1_SEND_CLIENT_VERIFYDTLS1_SEND_CLIENT_KEY_EXCHANGEDTLS1_SEND_CLIENT_CERTIFICATEDTLS1_SEND_CERTIFICATE_REQUESTDTLS1_READ_FAILEDDTLS1_READ_BYTESDTLS1_PROCESS_RECORDDTLS1_PROCESS_OUT_OF_SEQ_MESSAGEDTLS1_PREPROCESS_FRAGMENTDTLS1_OUTPUT_CERT_CHAINDTLS1_GET_RECORDDTLS1_GET_MESSAGE_FRAGMENTDTLS1_GET_MESSAGEDTLS1_GET_HELLO_VERIFYDTLS1_ENCDTLS1_CONNECTDTLS1_CLIENT_HELLODTLS1_BUFFER_RECORDDTLS1_ACCEPTDO_SSL3_WRITEDO_DTLS1_WRITEd2i_SSL_SESSIONCLIENT_MASTER_KEYCLIENT_HELLOCLIENT_FINISHEDCLIENT_CERTIFICATEhôÀôHôЩUMþÿÿÿÐÿÿÿþÿÿÿIëHÿHþÿÿÿÌÿÿÿþÿÿÿûJþÿÿÿØÿÿÿþÿÿÿ‹LŸLયDP(¯ò¯ŒTœªn²P ±0±F±N±l±€±”±°±αâ±þ±²(²>²T²± €% €F €Ž€k €ò€ê€Þ€!€¨€©€U€4€§€™€!€í€€Ð€ü€­ €b€x €¬ €€C€û €N €Á€"€€Y€m€'€Ê€§ €b€n€^ €q €<€ò € €o€Â €˜ €l €ƒ €¸ €€÷ €O€{€É€v€R€Û€ò€€{€€€à €Å€Ä€€€€;€ €ó €o €» €Œ€9€ï€+€x€—€j €o€Þ €Z €Ë€€€€>€×€È €€<€¡ €‡€Ø€Î€ñ€Î€b€= €€Í€æ€ä€û€A€‹€W€ª€á€‘€M€c €H€I€è€0€8€ €y€x€9€ô€ï€€n€s€‘€€¼€R€R €4 €U€Ž €€ €Ø €x€®€·€?€¶€% €€„ €~ €ª€B €»€€V €§ €C€A€5€N€b€ò€ç €G €|€’€® €r€z€ì€Ç €l€ò€€:€B€v€t€€ï€í€€2 €m €€<€u€|€J€€ø€w€?€€ö€L€§€Ü € €ÿ€± €‘€]€D €I€Í€« €w€y€{€;€{€½€:€¼€€…€€ì€€€€ï€î€€… €%€#€8€6€€C€t€¹ €'€ €Î€€Ì€¿€¨€z €V€X€M€%€B€´ €S €E€I€>€0€$€+€»€Ì€[€÷€á€µ€Ž€"€€ €€°€Y€ž€ü€‡€v€u€ˆ€…€o€‰€€°’°¨°̰Ö°ä°ì°ö°b°T°H°6°&°°°þ¯è¯Ú¯ЯƯ¼¯²¯¨¯ž¯p°LIBEAY32.dllÊ_time64&memcpy*memset(memmoveZstrncmpÜfprintf¡__iob_funcp_errnoMSVCR90.dllj_encode_pointer‡_malloc_crtäfreek_encoded_null`_decode_pointer_initterm_initterm_e_amsg_exit _adjust_fdivj__CppXcptFilterK_crt_debugger_hookŒ__clean_type_info_names_internalæ_unlock–__dllonexitv_lock_onexits_except_handler4_commonìSetLastErroræGetLastError½InterlockedExchange!SleepºInterlockedCompareExchange-TerminateProcess©GetCurrentProcess>UnhandledExceptionFilterSetUnhandledExceptionFilterÑIsDebuggerPresentËDisableThreadLibraryCallsTQueryPerformanceCounterfGetTickCount­GetCurrentThreadIdªGetCurrentProcessIdOGetSystemTimeAsFileTimeKERNEL32.dll„.Kp¼%Þ¨²<·´º€>îËPÚ`›0žÐÙp¥ÀÊ ™p™°º ÛhÑ@¡€Ê€¦ÈÔ“À¦À`0p `0PÀÐÑÀÐ`. 1PÂpËð€Àà›À³Â€š¹°¿ÐÉ€·ð®ð  ÐÊ œн`–Pšš@–ð™¢@­`™@™@®P–°ËÐÂð´š°œÀ `ýP¿Е ¡@Ê€¿—à™˜°ÒP­°™`—@¹ýÀô0 à   ðð°Ð@PÐü 0> 0'¶PQ „! @3<=ð¾¯0¯ óÐòó`=À¤¤ÔÔðÓÐÓ€² °p±`±p²° Ð€Ðа ²pÕÐÕÀ±²€±°°€Õ°±À°± ±@²PÐб0` >=à ³à²0ÔPÔ@– ²в2 ó ͳ@³Pΰ“pà¦Й€™P™`“ ¦¦• •p•À•À˜™Ð ðP–`–°–€”@””à ³°³ ^`³€³°ôP¯à6p¯ðKó`ÑPÕÕ€ÕpÖ°Õ`ÖÀÕ°° Õ`ÕÐÕpÕà°0¤`¤àÕ}¼‡¼¢¼®¼¼Ú¼ë¼½½#½8½O½c½w½޽®½Ͻá½÷½ ¾!¾;¾H¾_¾l¾ƒ¾ž¾¹¾;澿¿/¿K¿d¿|¿š¿¦¿½¿Õ¿í¿À À8ÀSÀdÀ{ÀœÀ´ÀÏÀêÀ Á(ÁEÁcÁŠÁ«Á¿ÁßÁùÁÂ&ÂAÂ`ÂxÂŒÂ¨ÂÆÂãÂõÂÃ!Ã8ÃTÃpÊéÃÈÃàÃýà Ä=ÄMÄ^ÄvēĦĻÄÓÄäÄôÄÅÅ3ÅHÅ`ÅkÅ}Å ÅÄÅÚÅõÅ Æ&Æ8ÆNÆXÆdÆxÆÆ’ƚƪƳÆÄÆÔÆèÆüÆ Ç#Ç:ÇVÇpLjǖǦÇÉÇÞÇéÇúÇÈ(ÈAÈWÈjÈȎȡȭÈÀÈØÈèÈÿÈÉ#É;ÉPÉdÉzɊɗɣɿÉÐÉèÉÿÉÊÊÊ%Ê5ÊMÊ_ÊvʆʛʧʻÊÒÊèÊøÊËË5ËJËZËqË„ËË Ë»ËÌËßË÷ËÌ*Ì8ÌGÌ\ÌrÌ~̦̼̋̕ÌÏÌçÌÿÌÍ0ÍKÍ_ÍxÍ‘ÍͦͰÍÅÍÓÍèÍüÍ ÎÎ1Î>ÎRÎfÎs·ΗΧδÎx¬y­{‚ €·ò³‰¦‹² ã Œ  ô´ç$êŽ íæ±¯ °ìà݃‘§…‡„ !“†ˆ"#»¸$%&'ó()*+,|-./ñ•0367~89–®¨:ï¤;<ð}˜>?õ"#™@šADäEœFGöø¶HIJKLMNOP!QRSTUVŸ ë WXY¼¡Zº ¹î]á¢^_¥`abcdefghij£µkmnopqrstu«©ªvw SSLEAY32.dllBIO_f_sslBIO_new_buffer_ssl_connectBIO_new_sslBIO_new_ssl_connectBIO_ssl_copy_session_idBIO_ssl_shutdownDTLSv1_client_methodDTLSv1_methodDTLSv1_server_methodERR_load_SSL_stringsSSL_CIPHER_descriptionSSL_CIPHER_get_bitsSSL_CIPHER_get_nameSSL_CIPHER_get_versionSSL_COMP_add_compression_methodSSL_COMP_get_compression_methodsSSL_COMP_get_nameSSL_CTX_add_client_CASSL_CTX_add_sessionSSL_CTX_callback_ctrlSSL_CTX_check_private_keySSL_CTX_ctrlSSL_CTX_flush_sessionsSSL_CTX_freeSSL_CTX_get_cert_storeSSL_CTX_get_client_CA_listSSL_CTX_get_client_cert_cbSSL_CTX_get_ex_dataSSL_CTX_get_ex_new_indexSSL_CTX_get_info_callbackSSL_CTX_get_quiet_shutdownSSL_CTX_get_timeoutSSL_CTX_get_verify_callbackSSL_CTX_get_verify_depthSSL_CTX_get_verify_modeSSL_CTX_load_verify_locationsSSL_CTX_newSSL_CTX_remove_sessionSSL_CTX_sess_get_get_cbSSL_CTX_sess_get_new_cbSSL_CTX_sess_get_remove_cbSSL_CTX_sess_set_get_cbSSL_CTX_sess_set_new_cbSSL_CTX_sess_set_remove_cbSSL_CTX_sessionsSSL_CTX_set_cert_storeSSL_CTX_set_cert_verify_callbackSSL_CTX_set_cipher_listSSL_CTX_set_client_CA_listSSL_CTX_set_client_cert_cbSSL_CTX_set_client_cert_engineSSL_CTX_set_cookie_generate_cbSSL_CTX_set_cookie_verify_cbSSL_CTX_set_default_passwd_cbSSL_CTX_set_default_passwd_cb_userdataSSL_CTX_set_default_verify_pathsSSL_CTX_set_ex_dataSSL_CTX_set_generate_session_idSSL_CTX_set_info_callbackSSL_CTX_set_msg_callbackSSL_CTX_set_purposeSSL_CTX_set_quiet_shutdownSSL_CTX_set_session_id_contextSSL_CTX_set_ssl_versionSSL_CTX_set_timeoutSSL_CTX_set_tmp_dh_callbackSSL_CTX_set_tmp_ecdh_callbackSSL_CTX_set_tmp_rsa_callbackSSL_CTX_set_trustSSL_CTX_set_verifySSL_CTX_set_verify_depthSSL_CTX_use_PrivateKeySSL_CTX_use_PrivateKey_ASN1SSL_CTX_use_PrivateKey_fileSSL_CTX_use_RSAPrivateKeySSL_CTX_use_RSAPrivateKey_ASN1SSL_CTX_use_RSAPrivateKey_fileSSL_CTX_use_certificateSSL_CTX_use_certificate_ASN1SSL_CTX_use_certificate_chain_fileSSL_CTX_use_certificate_fileSSL_SESSION_cmpSSL_SESSION_freeSSL_SESSION_get_ex_dataSSL_SESSION_get_ex_new_indexSSL_SESSION_get_idSSL_SESSION_get_timeSSL_SESSION_get_timeoutSSL_SESSION_hashSSL_SESSION_newSSL_SESSION_printSSL_SESSION_print_fpSSL_SESSION_set_ex_dataSSL_SESSION_set_timeSSL_SESSION_set_timeoutSSL_acceptSSL_add_client_CASSL_add_dir_cert_subjects_to_stackSSL_add_file_cert_subjects_to_stackSSL_alert_desc_stringSSL_alert_desc_string_longSSL_alert_type_stringSSL_alert_type_string_longSSL_callback_ctrlSSL_check_private_keySSL_clearSSL_connectSSL_copy_session_idSSL_ctrlSSL_do_handshakeSSL_dupSSL_dup_CA_listSSL_freeSSL_get1_sessionSSL_get_SSL_CTXSSL_get_certificateSSL_get_cipher_listSSL_get_ciphersSSL_get_client_CA_listSSL_get_current_cipherSSL_get_current_compressionSSL_get_current_expansionSSL_get_default_timeoutSSL_get_errorSSL_get_ex_dataSSL_get_ex_data_X509_STORE_CTX_idxSSL_get_ex_new_indexSSL_get_fdSSL_get_finishedSSL_get_info_callbackSSL_get_peer_cert_chainSSL_get_peer_certificateSSL_get_peer_finishedSSL_get_privatekeySSL_get_quiet_shutdownSSL_get_rbioSSL_get_read_aheadSSL_get_rfdSSL_get_servernameSSL_get_servername_typeSSL_get_sessionSSL_get_shared_ciphersSSL_get_shutdownSSL_get_ssl_methodSSL_get_verify_callbackSSL_get_verify_depthSSL_get_verify_modeSSL_get_verify_resultSSL_get_versionSSL_get_wbioSSL_get_wfdSSL_has_matching_session_idSSL_library_initSSL_load_client_CA_fileSSL_load_error_stringsSSL_newSSL_peekSSL_pendingSSL_readSSL_renegotiateSSL_renegotiate_pendingSSL_rstate_stringSSL_rstate_string_longSSL_set_SSL_CTXSSL_set_accept_stateSSL_set_bioSSL_set_cipher_listSSL_set_client_CA_listSSL_set_connect_stateSSL_set_ex_dataSSL_set_fdSSL_set_generate_session_idSSL_set_info_callbackSSL_set_msg_callbackSSL_set_purposeSSL_set_quiet_shutdownSSL_set_read_aheadSSL_set_rfdSSL_set_sessionSSL_set_session_id_contextSSL_set_shutdownSSL_set_ssl_methodSSL_set_tmp_dh_callbackSSL_set_tmp_ecdh_callbackSSL_set_tmp_rsa_callbackSSL_set_trustSSL_set_verifySSL_set_verify_depthSSL_set_verify_resultSSL_set_wfdSSL_shutdownSSL_stateSSL_state_stringSSL_state_string_longSSL_use_PrivateKeySSL_use_PrivateKey_ASN1SSL_use_PrivateKey_fileSSL_use_RSAPrivateKeySSL_use_RSAPrivateKey_ASN1SSL_use_RSAPrivateKey_fileSSL_use_certificateSSL_use_certificate_ASN1SSL_use_certificate_fileSSL_versionSSL_wantSSL_writeSSLv23_client_methodSSLv23_methodSSLv23_server_methodSSLv2_client_methodSSLv2_methodSSLv2_server_methodSSLv3_client_methodSSLv3_methodSSLv3_server_methodTLSv1_client_methodTLSv1_methodTLSv1_server_methodd2i_SSL_SESSIONi2d_SSL_SESSIONssl2_ciphersssl3_ciphersBð> >À" :O0OPOpB²²@?`?p?Ð?p>@>P>àLæà­`?`?Bð> >À"À­O0OPOpB²²@?`?p?Ð?p>@>P>0àLæà­`?`?Bð> >À­ :O0OPOpB²²@?`?p?Ð?p>@>P>@'àLæà­`?`?|U€BA€€ÿÿÿÿpU€B (€ÿÿÿÿdU€DA€€ÿÿÿÿTU€D (€ÿÿÿÿDU€HA€€ÿÿÿÿ8U@@!88ÿÿÿÿ(UÀA¨¨ÿÿÿÿBð> >À­À­O0OPOpB²²@?`?p?Ð?p>@>P> ®àLæà­`?`?·P¸p·Ðzp®@È`ÈÇÐÅ`ÆÆÀ÷0äîðë¹`¿Ä`Äà¶°¶À¶0Q ¶ßà­p¾0÷P¸p·ÐzÀ­@È`ÈÇÐÅ`ÆÆÀ÷0äîðë¹`¿Ä`Äà¶°¶À¶`Q ¶ßà­p¾0÷P¸p·À­p®@È`ÈÇÐÅ`ÆÆÀ÷0äîðë¹`¿Ä`Äà¶°¶À¶0„ ¶ßà­p¾0ÃÑÒÓÔÕÖרÙÚÛÜÝÞÄÅÆÇ™ÈÉÊŸËÌì[`ÿÿÿÿà[ ÿÿÿÿpUB (€ÿÿÿÿ|UBA€€ÿÿÿÿØ[‚A€€ÿÿÿÿTUD (€ÿÿÿÿÈ[ˆA€€ÿÿÿÿ¸[€ (8ÿÿÿÿ¬[ €!88ÿÿÿÿœ[ ¨¨ÿÿÿÿ„[ € (8ÿÿÿÿp[ €!88ÿÿÿÿ\[ ¨¨ÿÿÿÿD[€ (8ÿÿÿÿ0[€!88ÿÿÿÿ[¨¨ÿÿÿÿ[‚€ (8ÿÿÿÿðZ‚€!88ÿÿÿÿØZ¨¨ÿÿÿÿÀZ€ (8ÿÿÿÿ¬Z€!88ÿÿÿÿ”Z¨¨ÿÿÿÿ„ZB (€ÿÿÿÿxZBA€€ÿÿÿÿdZˆ€ (€ÿÿÿÿTZˆ€!88ÿÿÿÿ@Z¨¨ÿÿÿÿ0Z ÿÿÿÿ ZÿÿÿÿZ/€€€ÿÿÿÿZ0€€€ÿÿÿÿìY1€€€ÿÿÿÿØY2€€€ÿÿÿÿÄY3€€€ÿÿÿÿ´Y4€€€ÿÿÿÿ¨Y5€ÿÿÿÿ”Y6€ÿÿÿÿ€Y7€ÿÿÿÿlY8€ÿÿÿÿXY9€ÿÿÿÿHY:€ÿÿÿÿ4YÀ@@ ÿÿÿÿ YÀ@@‚€€ÿÿÿÿYÀ@@¨¨ÿÿÿÿðXÀ@@€€€ÿÿÿÿØXÀ@@€ÿÿÿÿÀXÀ€@ ÿÿÿÿ¬XÀ€@‚€€ÿÿÿÿXÀ€@¨¨ÿÿÿÿxX À€@€€€ÿÿÿÿ`X À€@€ÿÿÿÿLX À@ ÿÿÿÿ8X À@‚€€ÿÿÿÿ X À@¨¨ÿÿÿÿ XÀ@€€€ÿÿÿÿøWÀ@€ÿÿÿÿäWÀ€ ÿÿÿÿÐWÀ€‚€€ÿÿÿÿ¸WÀ€¨¨ÿÿÿÿ WÀ€€€€ÿÿÿÿˆWÀ€€ÿÿÿÿxWÀ€ ÿÿÿÿhWÀ€‚€€ÿÿÿÿTWÀ€¨¨ÿÿÿÿ@WÀ€€€€ÿÿÿÿ,WÀ€€ÿÿÿÿpÏ0×0ÕÀÒÊðÖ$ÐÖ$WW0Ô·P¸p·À­À­@È`ÈÇÐÅ`ÆÆÀ÷0äîðë¹`¿Ä`Äà¶°¶À¶ ® ¶ßà­p¾0Ã666666666666666666666666666666666666666666666666\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\8\4\0\ àÐð€    À­À­²À÷0äîðë¹`¿@p®ð`üàLæà­p¾0ààÐðÀ­   À­À­²À÷0äîðë¹`¿@p®ð üàLæà­p¾0ààÐÀ­€    À­À­²À÷0äîðë¹`¿@p®ð°àLæà­p¾0ààÐÀ­À­   À­À­²À÷0äîðë¹`¿@p®ð ®àLæà­p¾0ààÐÐzp®@È`ÈÇÐÅ`ÆÆÀ÷0äîðë¹`¿Ä`Äà¶°¶À¶ ¶xãà­p¾0ààÐÐzÀ­@È`ÈÇÐÅ`ÆÆÀ÷0äîðë¹`¿Ä`Äà¶°¶À¶@ ¶xãà­p¾0ààÐÀ­p®@È`ÈÇÐÅ`ÆÆÀ÷0äîðë¹`¿Ä`Äà¶°¶À¶p ¶xãà­p¾0ÃÀ.`2-p4À'`1 1ô\ä\@5 àÐÀ­À­@È`ÈÇÐÅ`ÆÆÀ÷0äîðë¹`¿Ä`Äà¶°¶À¶ ® ¶xãà­p¾0Ãÿþ0^À`P_ÐB@V@È`ÈÇÐÅ`ÆÆ@‰spnc¹`¿Ä`Äà¶°¶à`À6 ¶åà­p¾0Ãÿþ0^À`P_ÐBÀ­@È`ÈÇÐÅ`ÆÆ@‰spnc¹`¿Ä`Äà¶°¶à`ð6 ¶åà­p¾0Ãÿþ0^À`P_À­@V@È`ÈÇÐÅ`ÆÆ@‰spnc¹`¿Ä`Äà¶°¶à`L ¶åà­p¾0Ã@`2-p4À'`1 1ô\ä\@5ÿþ0^À`P_À­À­@È`ÈÇÐÅ`ÆÆ@‰spnc¹`¿Ä`Äà¶°¶à` ® ¶åà­p¾0ÃÀää€`À­À­À­À­À­À­À­À­ÿÿÿÿÀa‚Ð5 4`<P7P3°3 <@d©p T©PD©`0©p ©P©€©`ð¨pܨ€Ȩ¸¨ ¬¨°”¨À€¨Ðd¨àP¨ð8¨P¨ø§à§ ̧0¸§@˜§Px§`X§p<§€§ü¦ ä¦°ĦÀ¨¦”¦ €¦°h¦ÀT¦Ð@¦à,¦ð¦¦¦ðð¥ à¥Ð¥0À¥@¬¥Pœ¥`„¥pl¥Ð`¥€T¥H¥ <¥°,¥À¥¥ ô¤Ðè¤ÀԤ༤𰤤¤¤t¤ T¤0@¤@0¤P $¤P¤pø£`ì£àÔ£p´£œ£€„£h£ P£°0£À£Ð£àð¢°Ô¢ðÄ¢ ¨¢ ¢ x¢À`¢0 H¢°<¢@ ,¢P  ¢` ¢p à¡€ À¡ ¨¡  ˆ¡ p¡° P¡À <¡Ð $¡à ¡ð ü à p ¼ € ˜ |  l  P Ð @ à 0 `    0 ðŸ П`´Ÿp˜Ÿ@ ŒŸP lŸ` TŸ€HŸ€ ,Ÿ  ŸÐŸ`èž Ôž° ´ž  œžPˆž° pžÀ PžÀ ,žÐ  žà ôð Ø ¼   €0 `@ LP 8  ` p 𜀠؜ Àœ  ¸œà¬œ0Œœ@lœð `œ° HœÀ 0œÐ  œà œô›ð ä›ðЛ Ä› ´›0¤› ˜›0 ˆ›  l›@\›@ P›@›0 ›P ›@ìš` Øšp ¼š€  š Œš  tš° \šÀ DšÐ (šà  šð ô™ è™ Ì™ À™0 ¨™@ ˜™d€™P™e<™f$™g ™hü˜jܘkȘl¸˜m ˜n˜o|˜ph˜0X˜1D˜28˜i$˜˜q˜rô—sà—tÄ—u¬—vœ—wŒ—xx—y`—zL—{<—|(—} —~—ð–€ä–È–‚À–ƒ¨–„˜–…„–†h–‡P–ˆ8–‰–Š–‹è•Ô•Œ¸•¤•3|•Ž`•D•,•4•‘ü”’䔓´~À”” ”•Œ”5p”6P”–4””—ô“˜Ü“™Ä“𬓛˜“œˆ“x“ž\“L“<“<$““ø’ä’Ü’¸’ ’ Œ’!h’"P’#<’$’%’&à‘'È‘Ÿ¸‘ ¤‘˜‘¡€‘(l‘¢X‘£H‘¤4‘¥‘¦ü§à¨È©¬ª«|7d¬P­8® ¯°è±Ð²¸³¤´ˆµp¶\·D¸4¹$= ºôŽ»ØŽ¼Ä޽´Ž¾œŽ¿„ŽÀtŽ>ô}Á`ŽÂLŽÃ<ŽÄ$ŽÅŽ)äÆÌß¼¬ÇˆÈ|ÉdÊHË0ÌÍðŒÎ̌ϴŒÐ˜ŒÑ€ŒÒlŒÓXŒ8@ŒÔ(ŒÕŒÖü‹*è‹×ЋØ´‹Ù˜‹Ú|‹àh‹D‹Û8‹Ü‹ÝðŠ+ԊḊ┊,xŠÞ\Š@Šü$ŠŠä‰ĉ ‰€‰`‰D‰ò$‰‰ä܈åĈ樈-ˆˆ.pˆPˆ/0ˆçˆø‡܇ý¼‡ ‡$€‡/\‡8@‡L ‡.‡þä†̆B°†èˆ†ãh†é8†ê†ëð…ìÔ…9¸…혅îx…:X…ï0…ð…ñð„òÌ„ó¨„ô”„õ€„p„ö\„÷@„ø(„ù„úøƒûäƒüЃý´ƒþ ƒÿ(mŒƒhƒ;Lƒ4ƒƒIƒð‚؂è‚‚ x‚ d‚ L‚ @‚ ‚Næ@»±¿Dÿÿÿÿÿÿÿÿ €8€P€h€ €  àä€Väà4VS_VERSION_INFO½ïþ  ?@StringFileInfo040904b0z-CompanyNameThe OpenSSL Project, http://www.openssl.org/VFileDescriptionOpenSSL Shared Library.FileVersion0.9.8l2 InternalNamessleay32B OriginalFilenamessleay32.dllHProductNameThe OpenSSL Toolkit2ProductVersion0.9.8l tLegalCopyrightCopyright © 1998-2007 The OpenSSL Project. Copyright © 1995-1998 Eric A. Young, Tim J. Hudson. All rights reserved.DVarFileInfo$Translation ° PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXP 0!0<0Ú0û0²1Ý1b23534Ã4ó4Ä6ä6;7ö7C8¶8i: :Î:E;m;ï;’b>ô>?O?Ý? L0p01˜1l2Ó23d3446C6x6|6€6„6ˆ6Œ66”6˜6œ6 617L7ä7æ8Î9ƒ< =+=>¦>Æ>0h0v0Ó0T1k1•1282a2ó23Û3Z44¿4\5±5Ì5ß5N6Å6#7n7æ7L8û8€93:h:X;_;Ó<=l=p=t=x=|=€=„=ˆ=Œ==1>e>•?«?@\±0»0u1š12 2—2Á2ß2©3Þ3404~4…4±4¸4W7ª798q8Á8-;P;T;X;\;`;d;{;Á;6<'=L=V=J>Ä>Õ>ã>„?½?PHs0¥0?1Q1o1w2l3 494«45@5l5m6‰6É6707#8i8–9&:?=ð=^>(?c?€?ž?Ã?è?`„^0‡01%1†1Ã12;2¤2ž3Þ3444f4Æ4î475‚5Á5à5œ6à607z7Á78×8979`9 9X:Ë:P;Ü;à;ä;è;ì;ð;ô;ø;ü;<<< <<<<< <$<(<,<0<4<8<<<@<[<¿<pD 1Ã1ÿ1V2|2˜22µ2Š3¿3ì3H4¼4ö435Œ5i6$8(9Ü9:*:G:d:ã:;‹;G9¢9:Y:‘:Î:ü:$; <3‘>É>?¡?dL0Ô031a1ï12K2¶2Ì2O3‹3®4;5e5j5‚5 5Å5I6z6757S7q7¦78Ò8ç8[9ù9M: : ;‡;ã;+¿>º?Á?° í4 55h5l5p5t5x5|5€5„5ˆ5Œ55”5˜5œ5 5‘6Õ678{8Ê9ô9û9—:·:ò: ;;;5;e;°;É;ç;>> >>>>> >>Â>É>??? ?$?|?ƒ?Ì?Àd 00040[0ž0·0×01D1€1À2Ä2È2Ì2Ð2Ô2Ø2Ü2à2ä2è2ì2I3P3°3´3¸3¼3À3Ä3È3&4>47É7›8a:›: ;r;‘;æ;1O1b1š2!3;4”4Š59Ê9C:e:‹:¡:ß:;';š;¨;ñ<í>ðT°1¾1’3Ç34ò4Q5’7÷7æ8Q9ª9ÿ:;@;D;H;L;P;T;X;\;`;Ë;<<‘<Û<«>³>Ä>Õ>æ>÷> ??j?<0¾2323m4¡4_5R6f78U8ú8K9·9H:Å;7ˆ>Ñ>¥?Ø? %0X0¥0Ø0212O2a22‘2¢8@9 <+02+4 77$7.7>7Ë788§8Ç8#9D9¥9±:Ü:ù:Î;Ô;6z?°?Á?@L2{2ã23‹3G4N4M:€:Â:Ð:Ô:Ø:Ü:à:ä:è:ì:ð:ô:ø:ü:;;; ;ñ;<š<(=W=¢=D?›?PP¬0-1y1~1–1²2Í2 3©3þ3m4k5V66Š7‘7<¼<Í<== =$=(=,=0=4=8=<=@=D=H=L=!>H>`(‘1ž2ë2Ô3Þ3õ4i8s8¦9‹<¿<—=À=Þ=ø= >pD»0Å0W2~2£2 3h3Ö3y8Ó8@9c9‹9±9Ç9:9:²:À:;(;v;È;+=¦>°>õ>ÿ> ?*?€H,1F1S1¨1²1A2K2ô2þ2r3€3Š3Ë4%5/5 6Ã6Í6ø7þ78t9R?X?b??„?Š?”?„0£0¨0®0¸0Ç1C2Þ2 3=3o3¿34!4F4a4‹45>57É7y87:Î:;…;¾;î;<>J>|?€?„?ˆ?Œ??”?˜?œ? ?¤?¨?¬?°?´?¸?¼?À?Ä?È?Ì?Ð?Ô?Ø? 0s1Ù1X3ù3ƒ536K6Í;8<·< =Æ=æ=>&>N>[>d>k>î?°`#1Ó3)4ÿ4'5L56 6k6…6(7V7“7Ô8ì89P9£9ª9\:`:d:h:l:p:t:x:|:Å:ò:;!;â;ç; 7g77Ó7ò7î8B9I9':P::¿;œ<¶<=3=h=[>€>á>8?G?M?\?b?s??Ï?ÐT0;0Å0á0%1ã1ñ2C3ø5$6Ž6<7n7›7î7%868U8Ó89÷9 :4:^:|:;+<ô<&=B=Å=Œ>J?á?ë?ð?ú?ÿ?àÀ 0000'0,060;0E0J0T0Y0c0h0r0w00†0“0Æ0Ø0é0ü011*191k1–1­122…2•2¨2Æ2Ù23,3M3]3t3©3¶3ó3ø3454?4T4h4}4•4ª4Â4î4ú4í5&8?8î94:;:#;s;ˆ<¥<é<=H=O=f=d>ñ>ý> ??'?/?4?P?c?p?}?Š?”?ž?³?½?å?ï?ðÌ0:0D0U0x0‚0À0Ó0Ý0ð0ú0 1111D1N1X1b1—1ž1¥1¬1³1Í1Ô1Û1é1ð1 22202G2`2ˆ2¤2¨2¬2°2´2¸2¼2À2Ù2è2ñ2ø2 3–3Ø3ó34>4w4…4ü455!5&5,52585>5D5J5P5V5\5b5h5n5t5z5€5†5Œ5’5»5Â5Ç5Í5Ó5Ù5ß5å5ë5ñ5÷5ý56 6666!6'6-63696?6E6K6f6l6r6x6¡6¨6­6³6¹6¿6Å6Ë6Ñ6×6Ý6ã6é6ï6õ6û677 7777%7+717Z7a7f7l7r7x7~7„7Š77–7œ7¢7¨7®7´7º7À7Æ7Ì7Ò7Ø7Þ7ä7ê7ð7ö7ü788888 8=8C8I8]8c8i8p8t8x8|8€8„8ˆ8Œ88”8˜8œ8 8¤8¨8¬8°8´8¸8¼8P9T9X9\9`9d9h9l9p9t9x9|9€9„9ˆ9Œ99”9˜9œ9 9¤9¨9¬9°9´9¸9¼9À9Ä9È9 :¤:¨:¬:°:´:¸:¼:À:Ä:È:Ì:Ð:Ô:Ø:Ü:à:ä:è:ì:ð:ô:ø:ü;<<< <<<<< <$<(<,<0<4<8<<<@>>>> >&>,>2>8>>>D>J>P>V>\>…>Œ>‘>—>>£>©>¯>µ>»>Á>Ç>Í>Ó>Ù>ß>å>ë>ñ>÷>ý>? ?$?*?0?Y?`?e?k?q?w?}?ƒ?‰??•?›?¡?§?­?³?¹?¿?Å?Ë?Ñ?×?Ý?$0 0000$0*00060<0B0H0N0T0Z0`0f0l0r0x0~0„0Š00–0œ0¢0¨0®0´0º0À0Ô0Ú0à0è0ì0ð0ô0ø0ü0111 11111 1$1(1,101¸1¼1À1Ä1È1Ì1Ð1Ô1Ø1Ü1à1ä1è1ì1ð1ô1ø1ü1222 22222 2$2(2ð2ô2ø2ü2333 33333 3$3(3,3034383<3@384<4@4D4H4L4P4T4X4\4`4d4h4l4p4t4x4|4€4„4ˆ4Œ44”4˜4œ4 4¤4¨4¬45¦5­5Í5Ö5Ý56 6666#6)6/656;6A6G6M6S6Y6_6e6k6q6w6}6ƒ6‰66•6›6¡6¨6¬6°6´6¸6¼6À6Ä6È6Ì6Ð6Ô6Ø6Ü6à6ä6è6ì6ð6ô6ø6ü6777•7œ7¡7§7­7³7¹7¿7Å7Ë7Ñ7×7Ý7ã7é7ï7õ7û788 8888%8+81888<8@8D8H8L8P8T8X8\8`8d8h8l8p8t8x8|8€8„8ˆ8Œ88”8˜8)9/959;9b9:?:v:Ì:;w;«;“>?5?‰?Ï?L0\0“0151Ž1Ü12i223b3±3ÿ364b4Ü45‡5»56_6–6ì6#7‘7è7188Ô8!9g9+: 4œ3¦3ã5ú8Î=<>t>‘>Ÿ>«>²>¸>ô>ÿ> ? ?G?c?‡?£?Ç?ã?00'0N0m0Ö0ð01.1@1R1x1¸1o2y2ƒ22¥2¯2¹2Ã2Ø2â2ì2ö23 3A3S3j3z4È4¤5¨5¬5°5´5¸5¼5À5Ä5*6x6074787<7@7D7H7L7†77[8Õ8Â9û9L;P;T;X;\;`;d;h;l;p;t;x;|;€;„;ˆ;Œ;;”;˜;’<®=>“>ž>°>¶>¼>Â>È>Î>Ô>Ú>à>æ>ì>ò>ø>þ>? ????"?(?.?4?:?@?F?L?R?X?^?d?j?p?v?|?‚?ˆ?Ž?”?š? ?¦?¬?²?¸?¾?Ä?Ê?Ð?Ö?Ü?â?è?î?ô?ú?@¼00 0000$0*00060<0B0H0N0T0Z0`0f0l0r0x0~0„0Š00–0œ0¢0¨0®0´0º0À0Æ0Ì0Ò0Ø0Þ0ä0ê0ð0ö0ü011111 1&1,12181>1D1J1P1V1\1b1h1n1t1z1€1†1Œ1’1˜1ž1¤1ª1°1¶1¼1Â1È1Î1Ô1Ú1à1æ1ì1ò1ø1þ12 2222"2(2.242:2@2F2L2R2X2^2d2j2p2v2|2‚2ˆ2Ž2”2š2 2¦2¬2²2¸2¾2Ä2Ê2Ð2Ö2Ü2â2è2î2ô2ú233 3333$3*30363<3B3H3N3T3Z3`3f3l3r3x3~3„3Š33–3œ3¢3¨3®3´3º3À3Æ3Ì3Ò3Ø3Þ3ä3ê3ð3ö3ü344444 4&4,42484>4D4J4P4V4\4b4h4n4t4z4€4†4Œ4’4˜4ž4¤4ª4°4¶4¼4Â4È4Î4Ô4Ú4à4æ4ì4ò4ø4þ45 55N5b5h5©5²5¹5¾5Ô5à5þ566616:6R6j66„6Š6¥6ª6¶6Æ6Ì6Ó6ê6ð677'7?7W7]7q7’7£7®7¶7á7è7í7ò7ù78848A8Y8¬8Ù8!9Y9_9e9k9q9w9~9…9Œ9“9š9¡9¨9°9¸9À9Ì9Õ9Ú9à9ê9ó9þ9 :::$:*:0:F:M:T:b:m:s:‡:œ:§:¿:Õ:â:;$;E;J;< <<=>>>$>*>0>P 5`hD3l3”3¼3ä3 444\4„4¬4Ô4ü4$5L5t5œ5Ä5ì56<6d6Œ6´6Ü67,7T7|7¤7Ì7ô78D8l8”8¼8ä8 949\9„9¬9Ô9ü9$:L:t:œ: |9€9Ä9È9:: :(:D:H:ÐP00 00000 0$0(0,0@0D0H0L0P0T0X0\0`0d0h0l0p0|0€0„0ˆ0Œ00”0˜0œ0 0¤0¸0¼0À0Ä0È0Ì0Ð0Ô0Ø0Ü0à0ä0è0ô0ø0ü0111 11111014181<1@1D1H1L1P1T1X1\1`1l1”1¼1ä1 242\2„2ˆ2Œ22”2˜2œ2 2¤2¨2¬2À2Ä2È2Ì2Ð2Ô2Ø2Ü2à2ä2è2ì2ð2ü2333 33333 3$3(3,3034383<3@3D3H3L3P3T3X3\3`3d3h3t3x3|3€3„3ˆ3Œ33”3˜3œ3 3¤3¨3¬3°3´3¸3¼3À3Ä3È3Ì3Ð3Ô3Ø3Ü3à3ì3ð3ô3ø3ü3444 44444 4$4(4,4044484<4@4D4H4L4P4T4X4Ì4ô45D5l5”5¼5ä5 646\6„6¬6Ô6ü6$7L7t7œ7Ä7ì78<8d8Œ8´8Ü89,9T9|9¤9Ì9ô9:D:l:”:¼:ä: ;4;\;„;¬;Ô;ü;$,>T>|>¤>Ì>ô>?? ?$?(?,?4?8?@?H?T?X?\?`?d?h?l?p?t?x?|?€?„?ˆ?Œ??”?˜?œ? ?¤?¨?¬?°?´?¸?¼?À?àL$0(0,04080<0@0D0H0L0P0T0X0\0`0d0h0l0p0t0x0|0€0„0ˆ0Œ00”0˜0œ0 0¬0°0´0¸0¼0À0Ä0È0Ì0Ð0Ô0Ø0Ü0à0ä0è0ì0ð0ô0ø0ü0111 1111$1(1,1014181<1@1D1H1L1P1T1X1\1`1d1h1l1p1t1x1|1€1„1ˆ1Œ11œ1 1¤1¨1¬1°1´1¸1¼1À1Ä1È1Ì1Ð1Ô1Ø1Ü1à1ä1è1ì1ð1ô1ø1ü1222222 2$2(2,2024282<2@2D2H2L2P2T2X2\2`2d2h2l2p2t2x2|2€2Œ22”2˜2œ2 2¤2¨2¬2°2´2¸2¼2À2Ä2È2Ì2Ð2Ô2Ø2Ü2à2ä2è2ì2ð2ô2ø233 33333 3$3(3,3034383<3@3D3H3L3P3T3X3\3`3d3h3l3p3x3|3€3„3ˆ3Œ3”3˜3 3¨3´3¸3¼3À3Ä3È3Ì3Ð3Ô3Ø3Ü3à3ä3è3ì3ð3ô3ø3ü3444 44444 4,4044484<4@4D4H4L4P4T4X4\4`4d4h4l4p4t4x4|4€4„4ˆ4Œ44”4˜4¤4¨4¬4°4´4¸4¼4À4Ä4È4Ì4Ð4Ô4Ø4Ü4à4ä4è4ì4ð4ô4ø4ü4555 555 5$5(5,5054585<5@5D5H5L5P5T5X5\5`5d5h5l5p5t5x5|5€5„5ˆ55”5˜5œ5 5¤5¬5°5¸5À5Ì5Ð5Ô5Ø5Ü5à5ä5è5ì5ð5ô5ø5ü5666 66666 6$6(6,6064686H6L6P6T6X6\6`6h6|6„6Œ66”6˜6 6¤6¨6¬6´6¼6Ä6Ì6Ô6Ü6ä6ì6ô6ü67 777$7,747<7D7L7T7\7d7l7t7|7„7Œ7”7œ7¤7¬7´7¼7Ä7Ì7Ô7Ü7ä7ì7ô7ü78 888$8,848<8D8L8T8\8d8l8t8|8„8Œ8”8œ8¤8¬8´8¼8Ä8Ì8Ô8Ü8ä8ì8ô8ü89 999$9,949<9D9L9T9\9d9l9t9|9„9Œ9”9œ9¤9¬9´9¼9Ä9Ì9Ô9Ü9ä9ì9ô9ü9: :::$:,:4:<:D:L:T:\:d:l:t:|:„:Œ:”:œ:¤:¬:´:¼:Ä:Ì:Ô:Ü:ä:ì:ô:ü:; ;;;$;,;4;<;D;L;T;\;d;l;t;|;„;Œ;”;œ;¤;¬;´;¼;Ä;Ì;Ô;Ü;ä;ì;ô;ü;< <<<$<,<4<< >>>$>,>4><>D>L>T>\>d>l>t>|>„>Œ>”>œ>¤>¬>´>¼>Ä>Ì>Ô>Ü>ä>ì>ô>ü>? ???$?,?4?‚ `.rdataÞ8 :†@@.dataH7à$À@À.rsrc° ä@@éßxÌÌÌÌÌÌÌÌÌÌÌÿ%0¬CÌÌÌÌÌÌÌÌÌÌÿ0¬CƒÀ ÃÌÌÌÌÌÌÿ0¬CƒÀ@ÃÌÌÌÌÌÌÿ%,¬CÌÌÌÌÌÌÌÌÌÌÿ%(¬CÌÌÌÌÌÌÌÌÌÌÿ%$¬CÌÌÌÌÌÌÌÌÌÌÿ%ìªCÌÌÌÌÌÌÌÌÌÌ‹L$3À€|$b•ÀH%@@PQÿìªCƒÄPÿðªCƒÄÃ̃=àD„ø¡(«C‹ $«C‹ «C£àD¡«C‰ àD‹ «C‰ àD‹«C£$àD¡«C‰ 0àD‹ «C‰4àD‹«C£8àD¡«C‰ <àD‹ «C‰@àD‹üªC£PàD¡øªC‰ TàD‹ ôªCÇ àD@ÇàD @ÇàD0@Ç(àD€@Ç,àD@@ÇDàDP@ÇHàD`@ÇLàDp@‰XàD£\àD‰ `àDÇàD¸àDÃÌÌÌÌÌ‹D$SU‹l$ VWh4®CP3ÛS‹ñ‹ ÌEjVQèzƒ‹øƒÄ…ÿ„¶…öu¾,®CVh$®Cÿ0¬CƒÀ Pÿ(«CƒÄ ètf‹ð…ötz¡´EPUè\f‹L$ QWUVèIfƒÄ…ÀtZ‹D$…Àt PVè-fƒÄ‹D$ …À| PVèfƒÄVèfV‹èèøeƒÄ3Û…í~.h ®Cÿ0¬CƒÀ Pÿ(«CƒÄ»ë‹ÌERè¾eƒÄ¡ÌEPè°eƒÄ…ÿt WèeƒÄ_^]‹Ã[ÃÌÌÌÌ̸è&vSUW3í3ÿ‰l$ èàe‹Ø;Ýu¡ÌEh¤®CPèÄeƒÄéÒV‹t$h ®CVè¦e‹èƒÄ…íu‹ ÌEVh„®CQè‘eƒÄ éžjjjUèqe‹øƒÄ…ÿu‹ÌEVhh®CRèbeƒÄ ërWèEeƒÄ…Àt8Wè2e‹ð‹ƒÄ…ÀtPSèeƒÄÇVèeWèeƒÄ…ÀuÌ‹t$SèeƒÄ…Àu¡ÌEVhH®CPèúdSèÊdƒÄë‰\$^Uè´dWè´d‹D$ƒÄ_][YÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èöt¡E3ĉ„$V‹´$ W‹¼$…ö…¸‹G`S‹,«C…Àt(hL$QPè”dƒÄPè…dT$Rhà®CÿӃċG\Pègd‹OX‹W\PQRhÀ®CÿÓ‹G\ƒÄ[ƒø up÷ƒøupïƒøupéƒø%up܃øupèƒøupçƒøupïƒø upõƒø upöƒø"up߃ø+u1WjèݘƒÄë$ƒ\uƒþu WjèŘƒÄƒ=°EuèÄc‹Œ$_‹Æ^3Ìè tÄÃÌÌÌÌÌÌÌÌÌÌ̸,èÆsS3ÛUVWÇD$8‰\$$‰\$,‰\$‰\$0‰\$4‰\$‰\$ ‰\$‰\$(è×c‰D$;ĨÇ@@è¹c¡ÌE;Ãu9è¥cPè™cƒÄ£ÌE;Ãt"ÿ0¬C‹ ÌEƒÀ@PjjjQèmc¡ÌEƒÄSPè^‰ƒÄ…À„H‹|$@‹l$DOƒÅƒÿ‰|$@‰l$DŒ•›‹u¹°C‹Æ›Š:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu#‹×Oƒú‰|$@ŒÜƒÅ‰l$D‹E‰D$,é¹ °C‹ÆŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu#‹ÏOƒù‰|$@Œ‰ƒÅ‰l$D‹U‰T$龋 ÌED$PQT$,RD$LPL$TQèÑ’ƒÄ…Àt9\$$…E‹l$D‹|$@錋l$D‹u¹°C‹ÆëIŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu'‹|$@‹×Oƒú‰|$@ŒèƒÅ‰l$D‹E‰D$0é¹ô¯C‹ÆŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu'‹|$@‹ÏOƒù‰|$@Œ‘ƒÅ‰l$D‹U‰T$4鯹ì¯C‹Æ‹ÿŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu"‹|$@Oƒÿ‰|$@Œ:ƒÅ‰l$D‹E‰D$(ër¹ä¯C‹ÆŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Äö¹Ø¯C‹ÆŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu%‹|$@ǰEOƒÅ‰|$@‰l$Dƒÿ~ýÿÿë ‹Î€9-„–‹T$(¡ÌESRPèp…‹ø‹D$(ƒÄ ;Ãt‹L$PQèr`ƒÄèd`‹T$PRèS`‹-0«C‹ðƒÄ;óuÿÕS9\$„‹D$jPjVè"`ƒÄ…À… ‹L$QhÀ¯C‹ÌERè­_¡ÌEPèB_ƒÄ‹ ÌEhh¯CQèŽ_‹ÌEhX¯CRè}_¡ÌEhD¯CPèm_‹ ÌEh0¯CQè\_ƒÄ 3öè _…À~:Vè_‹øWè‚_ƒÄPWèr_‹ÌEƒÄPh$¯CRè!_ƒÄFèf_;ð|Æ‹D$;Ãt Pè<_ƒÄ‹D$_^];Ã[t Pè!_ƒÄ‹D$h^xCPè _‹L$h^xCQèú^‹D$8ƒÄ<ÃjSjVè_ƒÄèÙ^‹L$PQè_‹ðƒÄ;óuÿÕ‹l$,S;ëtjUjVèß^ƒÄ…ÀuUh¯CéÀþÿÿjSjVèÂ^ƒÄèr^‹t$0;ót/VèdøÿÿƒÄ‰D$;Ãu‹ ÌEVhä®CQè;^‹ÌERéˆþÿÿ‹t$4;ót0Vè-øÿÿ‹èƒÄ‰l$ ;ëu¡ÌEVhä®CPè^‹ ÌEQéPþÿÿ‹ë‹D$@ƒø}!‹T$‹D$WjÿURP3ÉèÓöÿÿƒÄ‰\$8é·þÿÿ3ö;Ã~%‹L$‹T$‹D$DWjÿUQ‹ °Rè¦öÿÿFƒÄ;t$@|܉\$8éƒþÿÿÌÌ̸èÆmSU‹l$VW‹Ù3ö3ÿ…ÛtWè&^‹ðD$PSVè^ƒÄ…Àu2‹D$S…À~‹L$ Phh°CQèD]ƒÄë‹T$ hH°CRè0]ƒÄ ëk…íu.h@°Ch8°CVè¿]‹èƒÄ …íu‹D$Sh°CPèþ\ƒÄ ë9VUè”]V‹øè†]ƒÄ …ÿt2jWèq]‹ØƒÄ…Û~‹l$$SUèW]ƒÄ…ÀuVèV]Wè>]ƒÄ_^]ƒÈÿ[ƒÄËMT$RW‰L$è*]Wè]ƒÄ _^]‹Ã[ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌ̸Tè¦l¡ÌEV3öW3ÿ‰t$$ÇD$P‰t$D‰t$ ‰t$0‰t$4‰t$,‰t$L‰t$H‰t$(‰t$8‰t$‰t$<‰t$‰t$‰t$‰t$ÇD$@;Æu8è~\Pèr\ƒÄ£ÌE;Æt!ÿ0¬CƒÀ@P¡ÌEjjjPèG\¡ÌEƒÄVPè8‚ƒÄ…À„† S‹\$h‹ U‹l$h‰L$\MƒÃè®[‹ø‰|$(;þu‹ÌEh¬´CRè[ƒÄéH ƒýŒë›‹3¹¤´C‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu"MƒýŒt‹CƒÃPèkƒÄ‰D$H霹 ´C‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuMƒýŒ"‹KƒÃ‰L$@éS¹˜´C‹ÆëIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuMƒýŒÔ‹SƒÃ‰T$Dé¹”´C‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$TéÁ¹Œ´C‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$P鹄´C‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuMƒýŒ‹CƒÃ‰D$é5¹|´C‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu#MƒýŒ´‹KƒÃQÿ8«CƒÄ‰D$,éÛ¹t´C‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu+MƒýŒa‹SƒÃRÿ8«CƒÄ‰D$L…À„E逹l´C‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$0ÿÿÿÿéA¹d´C‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu+MƒýŒÄ‹CƒÃPÿ8«CƒÄ‰D$0…Àލéã¹X´C‹ÆëIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuMƒýŒd‹KƒÃQWèöWƒÄé¹P´C‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuMƒýŒ‹SƒÃ‰T$ ëH¹D´C‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À…½MƒýŒÊ‹CƒÃ‰D$$MƒÃƒýüûÿÿ3öèçWèÜWPèÐW‹Ø‰\$èËWPè¿WƒÄ‹è‰l$8;Þ„ð;î„èÿ0¬CƒÀ PjjjUèŒWƒÄ9t$„Ž‹l$UjjlSèpWƒÄ…Àk¡ÌEUh,´CPèèV‹ ÌEQè|VƒÄé—‹ÌE‹ÎQh´CRèÀVƒÄ ‹D$\‹ ÌEPh´CQè§V‹ÌEhì³CRè–V¡ÌEh¼³CPè†V‹ ÌEh ³CQèuV‹ÌEhd³CRèdV¡ÌEh8³CPèTV‹ ÌEh³CQèCV‹ÌEhè²CRè2V¡ÌEƒÄDhȲCPèV‹ ÌEh˜²CQèV‹ÌEhP²CRèýU¡ÌEh²CPèíU‹ ÌEh²CQèÜU‹ÌEhÀ±CRèËU¡ÌEh˜±CPè»U‹ ÌEh`±CQèªU‹ÌEƒÄ@h(±CRè–UƒÄéQSèŠVƒÄ‹l$@;îuVÿ0¬CPVjjSèÙUƒÄ‹l$D;îtYh$±CUèQUƒÄ‰D$4;ÆuC‹ÌEUh,´CRè:U¡ÌEPèÏTƒÄéêUjjlSèˆUƒÄ…À«Uÿ4«CéÉèV‰D$;Æ„»hPè}UƒÄ…À„¥9t$ …Ÿ9t$$…•ƒ|$Hu0è¸UPè.U‹èƒÄ‰l$<;î„nSUè”U‹ÃƒÄ‰l$‰D$<‹L$hQ3öèUƒÄ…À„>‹\$I‹S‹D$hÖRPèIUƒÄ …À~F‹\$ðŽQSèÕTƒÄ…ÀuÊéü‹T$‹D$ ‹ ÌERPQ‹L$0è‹öÿÿ‹ðƒÄ …öŒÆ‹D$‹hWèóSƒÄ…À„§W3ÛèàSƒÄ…ÀŽ”ISWèÁTPÿ8«CƒÄ …ÀuSWè¬T‹ ÌEPh±CQè¶SƒÄëL‹|$+ð(VD$dPj‰T$lèuT‹ðW‰t$(èTƒÄ…ötRVèVTƒÄƒøttƒøth‹F‹h‹0‹|$(WCèLSƒÄ;ØŒoÿÿÿ‹D$,;Æ|w‹ÌEhì°CRè:SƒÄéõ‹ ÌEhаCQè!S‹ÌERèµR‹|$4ƒÄ é̸ȰCë¸À°CP¡ÌEh¨°CPèìR‹ ÌEQè€R‹|$8ƒÄé—‹\$L+ð…Ût;Þ~‹Þ‹L$4…Ét7SÅPQè„SƒÄ ;Ãt"‹ ÌEh°CQèšR‹ÌERè.RƒÄ ëL‹D$,ƒ|$Pu(‹L$0‹T$TQRè‹D$@SUPè2SƒÄ…Àu ‹ ÌEQëÇD$Xë‹ÌERèàQƒÄ][‹D$,PèR‹D$ƒÄ…Àt PèðQƒÄ‹D$0…Àt PèÕRƒÄ‹D$4…Àt PèÎQƒÄ‹t$P…öt‹ ÌEQè‡QƒÄ‹D$…Àt Pè–RƒÄ‹D$…Àt PèORƒÄ…ÿt WèŽQƒÄèjR_‹Æ^ƒÄTÃÌÌÌÌ‹D$VPQRèC‹ðƒÄ …öt‹D$VPè‘RƒÄV…Àu è~RƒÄ3À^ÃèrRƒÄ¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹S‹YU‹l$VWU3ÿè)QƒÄ…À~iWUèR‹p‹ÖŠ ƒÄ„Ét!€ù:t€ù,t€ù.t ŠJB„ÉuéëB€:t‹ò3É€:+‹P‹D$$•ÁIQjÿjÿRPVSèRƒÄ…Àt/UGèÀPƒÄ;ø|—SèßQƒÄ…Àu‹ ÌEhÈ´CQè­PƒÄ_^]3À[Ã|$ tM‹|$W3öè~PƒÄ…À~:ëIVWèaQ‹P‹L$,jÿR‹P‹D$$QRPèxQƒÄ…Àt³WFèDPƒÄ;ð|Ë_^]¸[Ã̸èv`‹D$±*ˆL$…ÀuÆD$.ë!ƒøuÆD$+ëƒøuˆL$ë ƒøuÆD$ V‹t$‹NjD$ PQèÁP‹Vjjj RèLPƒÄ¸^YÃ̸è`¡E3ĉ„$ ‹„$SU‹¬$$‰D$‰L$3Û9¼Eu‹T$¡ÌEVRhˆµCPè„OƒÄ‹ ÌESSj QèÝOƒÄ;û„‚hT$WRèˆPhD$$h„µCPènP‹ ÌEWhà®CQè0OƒÄ$ŠD$:Ä< ul;ó„Õ8„ÍhD$VPè/PhL$$h„µCQèPƒÄë>ˆ\$9¼Euÿ0¬CPT$hRÿ$«CƒÄ ëÆD$ ˆ\$ë”<.u€|$ tfD$PŠ@:Ëuù+€| ukH;ëˆ\~;Å}‹ÌEUh4µCRèpNƒÄ éÆþÿÿ‹Œ$(;Ë|f;Á~b¡ÌEQhô´CPèHNƒÄ éžþÿÿ]¸[‹Œ$ 3Ìè’^ÄË ÌEhpµCQèNƒÄ]3À[‹Œ$ 3Ìèe^ÄË”$0‹Œ$,R‹”$$jÿjÿD$ P‹D$QRPèòNƒÄ…À¸u‹Ã‹Œ$][3Ìè^ÄÃÌÌÌSU‹l$3Û9¼Eu‹D$‹ ÌEWPhˆµCQè}MƒÄ‹ÌESSj RèÖMƒÄ;ó„‚hVh¸EèNhh„µCh¸EègN¡ÌEVhà®CPè*MƒÄ$ ¸E:ÄQ< ur;û„J8„BhWh¸Eè(Nhh„µCh¸EèNƒÄëJˆ¸E9¼Euÿ0¬CPhh¸Eÿ$«CƒÄ ëŒÆ¸E ˆ¹EëŽ<.u €=¹E „ϸ¸EP¤$Š@:Ëuù+€¸·E uOH;눘¸E~;Å}‹ ÌEUh4µCQèQLƒÄ é­þÿÿ‹L$;Ë|6;Á~2‹ÌEQhô´CRè+LƒÄ é‡þÿÿ¡ÌEhpµCPèLƒÄ]3À[ËL$ ‹T$‹D$ jÿh¸EQRPè(MƒÄ…Àu%‹ ÌEh”µCQèØK‹ÌERèlKƒÄ ]3À[Ã]¸[ÃÌÌÌÌÌÌÌ̸èæ[¡E3ĉ„$Œƒ=¼E‹„$”‰T$ ‹U‹¬$œ‰D$(‹B‰L$‹Œ$ ‰l$$‰L$ ‰D$ux‹ ÌEh¨·CQèOK‹ÌEhˆ·CRè>K¡ÌEh8·CPè.K‹ ÌEhø¶CQèK‹ÌEhȶCRè K¡ÌEh”¶CPèüJ‹ ÌEhŒ¶CQèëJƒÄ8UèÐJƒÄ…À„ASVWƒËÿë ‹\$‹l$0ICU‰\$è§JƒÄ;ÃŽ×SUè‹K‹ø‹w‹ÆƒÄ‰|$$P‹ÿŠ@„Éuù+ƒø|2¹„¶CD0üŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àt‹ÆPŠ@„Éuù+ƒø|:¹|¶CD0üd$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„Cÿÿÿ‹ÆPŠ@„Éuù+ƒø|=¹p¶CD0ø¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„óþÿÿ‹ÆPŠ@„Éuù+ƒø|=¹h¶CD0ú¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„£þÿÿ‹ÎŠ„Àt<:t<,t<.t ŠAA„ÀuìëA€9t‹ñ€>+uƒÍÿFë3íVèxJ‹ØƒÄ…Û„Rþÿÿ‹WRh\¶CD$@jdPèPJƒÄƒødX‹T$ ¡¸EL$8QRPè“I‹ðƒÄ …öu èéH¾Y¶C‹L$$‹QRhP¶CD$@jdPèJ‹T$0¡¸EL$HQRPèRI‹øƒÄ…ÿuè¨H‹L$$‹QRhH¶CD$@jdPèÇI‹D$0L$$Q‹ ¸ET$LRPQè¦IƒÄ …Àu èhHÇD$ÿÿÿÿ‹T$$‹BPh@¶CL$@jdQèI‹L$0T$ R‹¸ED$LPQRè^IƒÄ …Àu è HÇD$ÿÿÿÿ‹„$´‹L$‹T$UP‹D$0Q‹L$0‹IRSPèøÿÿƒÄ…À„éýÿÿ‹T$(RèçHƒÄ…Àu¡ÌEhÈ´CPè¶GƒÄé䃼$°„ñ‹|$…ÿt;Wè€GƒÄ…À~.ƒ=¼Eu%‹ ÌEh¶CQèqG‹ÌEhäµCRè`GƒÄƒÎÿ›F‰t$…ÿ„˜Wè/GƒÄ;Æއ‹D$VPèH‹ø‹_SèjHƒÄ ‰D$(…À„&Sh\¶CL$@jdQèCHƒÄƒød‹D$,‹ ¸ET$8RPQè…G‹èƒÄ …íu èÛF½Y¶CShP¶CT$@jdRèüG‹L$<‹¸ED$HPQRèJG‹ðƒÄ…öuè FShH¶CD$@jdPèÆG‹D$tu‹V Rh”{ChŽ{CèQ?ƒÄ ‰D$0Vè>?Wè<ƒÄ9\$0„ ‹t$0Uè3<‹F P‰\$@è?‹¬$`‹¼$\ƒÄ‰D$ ÇD$lé‡jVhìÆCÿ×ƒÄ …À…ƒÆh ®CVÇD$0è<‹èƒÄ‰l$8;ë„[è¥>‹ø‰|$,;û„•SSSUèˆ>‹ðƒÄ;ó…YWèo>èÐ;SSjUè&<SSSUè>‹ðƒÄ$;ó„eVèt>‹øƒÄ;ûtE?˜u‹O Qè$>ƒÄ‰D$,Wè5>Vè ;ƒÄ9\$,… hÀÆC‹ ÌEQèS;ƒÄ‹ÌERèä:‹´$¸ƒÄ‹l$$‹|$¡¸E;Ãt;ÈEt Pè·;ƒÄ‹D$8PèÞ:UèÎ;‹L$Qè¼=Wè’=‹T$(Rèˆ:‹„$œPèu=ƒÄ_]9œ$ˆt‹D$@;Ãt PèS=ƒÄ9œ$t‹D$8;Ãt Pè9=ƒÄè];‹D$(;Ãt Pè=ƒÄ‹D$$;Ãt Pè*=ƒÄ‹Æ^[Ä@ÃVWèñ<ƒÄ…À„ÿÿÿVèÚ<ƒÄUè%:‹T$0R‰\$@è½<Pè±<‹¬$d‹¼$`ƒÄ ‰D$ ÇD$lérjVh¼ÆCÿ×ƒÄ …À…ñ‹¼$TÇD$(ÇD$léAÇD$(;ûuƒÆVÿ8«C‹¼$XƒÄ‰D$ ÇD$lé¹´ÆC‹Æ‹ÿŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;ÃuǼEéϹ¬ÆC‹ÆŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;ÃuÇ„$¬é޹ ÆC‹ÆŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu ÇD$téQ¹˜ÆC‹ÆIŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;ÃuÇ„$È鹯C‹ÆŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;ÃuÇ„$¸éιŒ´C‹ÆŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu ÇD$x鑹دC‹ÆIŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu ÇD$\éQ¹ˆÆC‹ÆIŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu ÇD$Lé¹|ÆC‹ÆIŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu+OƒÿŒh‹EƒÅPL$8QèLzƒÄ…À„Lé³¹tÆC‹ÆëIŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu.OƒÿŒ‹UƒÅR„$ˆPèÉyƒÄ…À„ééP¹hÆC‹Æ‹ÿŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;ÃuÇ„$”é¹`ÆC‹ÆŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;ÃuÇ„$œéιXÆC‹ÆŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu ÇD$鑹HÆC‹ÆIŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu ÇD$héQ¹8ÆC‹ÆIŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu ‰\$hé¹0ÆC‹Æ¤$Š:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;ÃuOƒÿŒh‹MƒÅ‰L$XéŹ ÆC‹Æ¤$Š:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;ÃuÇ„$Œé~¹ÆC‹ÆŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu9OƒÿŒØ‹UƒÅRÿ8«CƒÄ‰„$ ;Ã…%Ç„$ é¹ ÆC‹Æ¤$Š:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu.OƒÿŒh‹EƒÅPSèÞ6ƒÄ‰„$ˆ;ÄIé°FVèº6ƒÄ‰D$|;Ãt ‹È‰L$<é“‹u¹ÆC‹Æ‹ÿŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;ÃuOƒÿŒè‹UƒÅ‰T$DëH¹ôÅC‹ÆŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ã…’OƒÿŒž‹EƒÅ‰D$`OƒÅƒÿŒñÿÿè4‹„$˜L$@Q‹Œ$”T$LR‹ÌEPQRèiƒÄ…À…¡ÌEhØÅCPéøÿÿh¬ÅCéñ÷ÿÿ‹ÌEh|ÅCRéç÷ÿÿ¡ÌEhTÅCPé×÷ÿÿ¡ÌE‹ÖRh´CPè3ƒÄ ‹Œ$ЋÌEQh4ÅCRè3¡ÌEh ÅCPèð2‹ ÌEhôÄCQèß2‹ÌEhÈÄCRèÎ2¡ÌEh¬ÄCPè¾2‹ ÌEhŒÄCQè­2‹ÌEhdÄCRèœ2¡ÌEh@ÄCPèŒ2‹ ÌEƒÄDhÄCQèx2‹ÌEhðÃCRèg2¡ÌEhÐÃCPèW2‹ ÌEh ÃCQèF2‹ÌEhdÃCRè52¡ÌEh4ÃCPè%2‹ ÌEhÃCQè2‹ÌEhÌÂCRè2¡ÌEƒÄ@h¨ÂCPèð1‹ ÌEh|ÂCQèß1‹ÌEj;j;hdÂCRèÊ1¡ÌEh ÂCPèº1‹ ÌEhìÁCQè©1‹ÌEh°ÁCRè˜1¡ÌEh`ÁCPèˆ1‹ ÌEƒÄ@hÁCQèt1‹ÌEhÈÀCRèc1¡ÌEhœÀCPèS1‹ ÌEhlÀCQèB1‹ÌEh4ÀCRè11¡ÌEhÀCPè!1‹ ÌEhÔ¿CQè1‹ÌEh¿CRèÿ0¡ÌEƒÄ@h@¿CPèì0‹ ÌEhð¾CQèÛ0‹ÌEh¸¾CRèÊ0¡ÌEhh¾CPèº0‹ ÌEh0¾CQè©0‹ÌEhؽCRè˜0¡ÌEh€½CPèˆ0‹ ÌEhD½CQèw0‹ÌEƒÄ@h ½CRèc0¡ÌEhؼCPèS0ƒÄéûôÿÿ‹t$P;ót`ÇD$Pÿÿÿÿ9\$\t‹ ÌEVh¸¼CQè#0ƒÄ SèÎ0T$TRVP£¸Eè·0ƒÄ…Àut‹D$P‹ ÌEVPhœ¼CQèë/ƒÄé“ôÿÿ¡ÈE£¸E;Ãu&‹ÄE¡ÌERhx¼CPè¾/ƒÄ 9\$l…aôÿÿë!9\$\t‹ ÄE‹ÌEQh¸¼CRè‘/ƒÄ ¡¸E;ÃtZP¡ÌEPèåUƒÄ…À„ôÿÿ‹ ¸Ehl¼CSQè0ƒÄ ;Ãuè\/ë#h ®CPè=/‹ðƒÄ;ótVè60Vèþ.ƒÄ‹¸E¡ÌERPè•IƒÄ…À„¾óÿÿ9\$|u5‹ ¸Eh`¼ChT¸CQèš/ƒÄ ;Ãuèò.ëPèB1ƒÄ;Ãt‰D$<‹t$D;ó…勸EhP¼ChT¸CRèY/‹ðƒÄ ‰t$D;ó…¾è§.9\$Hu%¡¸Eh@¼ChT¸CPè(/ƒÄ ‰D$H;Ãuè|.9\$@u&‹ ¸Eh0¼ChT¸CQèü.ƒÄ ‰D$@;ÃuèP.‹¸Eh$¼ChT¸CRèÖ.‹ðƒÄ ;ó…¡è(.¾9t$L„é‹ ¸Eh¼ChT¸CQèŸ.ƒÄ ;Ã…–èó-é¾jSSS„$(SPè-0‹ ¸EQ”$4Rè0‹ ¸ESV„$@PQè÷/ƒÄ0…À…ÿþÿÿ‹ÌEVhø»CRèˆ-ƒÄ é0òÿÿVèÆ/ƒÄ…À…Sÿÿÿ¡ÌEVhлCPè^-ƒÄ éòÿÿ¹Ì»CŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu‰t$L‹t$`;ó…Eh¼»ChT¸CRèª-‹ðƒÄ ‰t$`;ó…Çèø,è_-PèS-‹ø‰|$<èN-PèB-ƒÄ‰D$$;û„qñÿÿ;Äiñÿÿ‹„$°‹ ÌESPQèðQ‹Œ$ÈƒÄ ;˄ʋT$Hh°»CP‹„$¬RSPQ‹ ÌEQè­b‹èƒÄ‰l$;ë„ñÿÿ‹¸Eh¤»ChT¸CRèò,‹ðƒÄ ;óuèH,¡ÌESPVèK‚ƒÄ ëdjSSS„$ðSPèu.‹ ¸EQ”$üRè[.‹ ¸ESV„$PQè?.ƒÄ0…À…öþÿÿ‹ÌEVhx»CRèÐ+ƒÄ éxðÿÿ‹ë9\$l„õ;ë…¢‹ ¸Eh¤»ChT¸CQèF,‹èƒÄ ;ëuèœ+‹ÌESRUèž‹„$ÐƒÄ ;Ãt P蚃ƒÄ‹L$ ;Ë?‹ ¸ED$ Phh»ChT¸CQè†,ƒÄ…Àu¹‰L$ ‹D$(ƒøuU¸d»Cë]‹L$ ù€}ä‹D$(ƒøtƒøuÚ‹ÌEh@»CRèý*‹D$(‹ ÌEPh€h»CQèâ*ƒÄéŠïÿÿƒø¸»Ct¸ »C‹ÌEPQhäºCRè¸*ƒÄèö,‰D$;ÄTïÿÿ¡ÌE‰„$Ø‹D$(Ç„$ÔÇ„$Ü€(@ƒø…„è°,‹ðè£,‹ø;ût\;ótOhWèˆ,ƒÄ…Àt=‹T$ Œ$ÔQWRVèg,ƒÄ…Àt"‹D$VjPèM,ƒÄ …ÀtWè:,ƒÄé˜Wè,,ƒÄ;ó„¯îÿÿVè,ƒÄé¡îÿÿƒøu7‹L$0Qèø+ƒÄ…À„‡îÿÿ‹T$0‹D$RjtPèî+ƒÄ …À„kîÿÿ‰\$0ë=ƒøu8‹L$,Qè¶+ƒÄ…À„Kîÿÿ‹T$,‹D$Rh˜Pè¯+ƒÄ …À„,îÿÿ‰\$,‹ ÌEQUè瀋t$lƒÄ;ó…—‹¸EhÔºChT¸CRèî)‹ðƒÄ ‰t$d;óutè@)¡ÌEh°ºCPè$)ÿ0¬C‹|$,ƒÀ PSjjWèy)ƒÄ‹¸Eh ºChT¸CRèœ)ƒÄ ;Ãu_èô(¡¸Eh”ºChT¸CPè{)ƒÄ ;Ãu>èÓ(ën‹ ÌEVhpºCQè³(‹|$0VjjlWè)ƒÄ…À“Vÿ4«CƒÄé>íÿÿ¹P¸CëIŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu‰\$T9œ$¸t‰\$T‹L$@‹T$T‹l$QSSSRUW3öè:*ƒÄ…ÀuJëIè#*%ÿƒøm…Áìÿÿƒþ¸ìÿÿè(‹D$@‹L$T‹l$‹T$$PSSSQURFèð)ƒÄ…Àt»¡ÌEhŒ¶CPèÏ'ƒÄé¡‹´$ÌÇD$hÿÿÿÿ;óu+ÿ0¬CPSjjWè(ƒÄ‹„$Àƒøu-SWèŒ)ƒÄë2VjjlWèê'ƒÄ…ÀÖVÿ4«CƒÄéìÿÿƒøuSSSWèR)ƒÄ‰D$;ÃuhPºCéæëÿÿ‹ÌEh ºCRéÜëÿÿ9\$„æ‹l$;ëu¡ÌEhü¹CPéºëÿÿ‹l$ƒ}tu èõ(‰D$<}˜u èÝ(‰D$<‹|$;ûu~èÆ(‰D$;Ä„ëÿÿ‹L$L‹„$Œ‹l$‹|$3Ò9\$Q‹L$\”ÂRPQUWèEáÿÿƒÄ9\$h‹ð‰\$X~%‹‹BPè}&ƒÄ…Àu‹‹QRèS&‹ƒÄ‰X;óu hÔ¹Céëÿÿ9\$„˜è8(‰D$;Äüêÿÿ9\$Dt‹ÐjRè(ƒÄ…À„áêÿÿ‹„$ˆ;ÃtP‹D$Pèï'ƒÄë‹L$QèÚ'PSè±OƒÄ …À„ªêÿÿ‹T$‹‹H‹T$QRè®'ƒÄ…À„‹êÿÿ‹D$‹‹Q‹SPè‹'ƒÄ…À„nêÿÿ‹„$ ‹L$iÀ€Q‹P‹B‹HQè`'ƒÄ…À„Cêÿÿ‹T$‹‹H‹T$QRè;'ƒÄ…À„$êÿÿ‹D$Pè '‹ðƒÄ;ó„ êÿÿ‹L$VQè'ƒÄ…À„÷éÿÿVèÿ'‹t$SSSV”$VRè‰'¡¸EPŒ$Qèp'‹|$hƒÄ$;ût6¡¸EVW”$RPèJ'ƒÄ…Àu‹ ÌEWhø»CQèß$ƒÄ é‡éÿÿ‹T$<‹D$RPVèq&ëvSSWSŒ$DSQè'‹¸ER„$PPè÷&‹´$€ƒÄ ;ót6‹¸EWVŒ$<QRè&ƒÄ…Àu¡ÌEVhø»CPèc$ƒÄ é éÿÿ‹L$u‹F ‹HQUèn"ëhиCÿ0¬CƒÀ Pÿ׃ÄVè#ƒÄh„µCÿ0¬CƒÀ Pÿ׋t$$‹|$ƒÄ9\$x…­;óuY‹„$€ƒøu WUè "ëƒøu/WU9œ$´tèï!ëèâ!ƒÄ;Ãuq‹ÌEh°¸CRéåÿÿ¡ÌEh„¸CPéôäÿÿ9\$tJ‹„$€ƒøu ‹L$QUè—!ëƒøu"‹T$RUè!ƒÄ;Ãu¡ÌEh`¸CPé®äÿÿh„¸Céäÿÿ3öéÃäÿÿ̸Üè&0¡E3ĉ„$Ø‹„$à‹Œ$‹”$S‹œ$øU‹¬$V‹´$ô‰D$‹„$‰L$(‹Œ$W‹¼$ô‰T$‰L$ ‰D$…ÀtoD$$PjjpQèÞL$@Qè€"‹D$,ƒÄPŠ@„Éuù+‹T$$jRP‹D$$PL$@QèP"‹D$4T$…ÛtQL$QjjxVè„‹D$$ST$$RWPè !ƒÄ …Àuc‹ ÌEhpÇCQèï‹ÌERèƒƒÄ ¸ééƒ|$tD$PL$4WQè¿ T$-…¹œÌC‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu ÇD$`éD¹ÇC‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;ÃuOƒÿŒ‹UƒÅ‰T$léû¹˜´C‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;ÃuOƒÿŒÆ‹EƒÅ‰D$<髹”ÌC‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;ÃuOƒÿŒv‹MƒÅ‰L$ é[¹ÇC‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;ÃuOƒÿŒ&‹UƒÅ‰T$Lé ¹˜ÆC‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu&OƒÿŒÖ‹EƒÅ‰D$ ¸‰D$‰D$X鮹ˆÌC‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu!OƒÿŒ€‹MƒÅ‰L$ ÇD$Xé]¹€ÌC‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu ÇD$\é ¹pÌC‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;ÃujOƒÿŒò‹UƒÅRÿ8«CƒÄƒøÿu¸þÿÁàƒÈ ‰D$\齃øþu¸ÿÿÁàƒÈ ‰D$\é¤Hùÿÿ‡èÁàƒÈ ‰D$\醹dÌC‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;ÃuOƒÿŒV‹UƒÅ‰T$,é;¹,ÇC‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu"OƒÿŒ‹EƒÅPè1(ƒÄ‰D$héâ¹ì¯C‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;ÃuOƒÿŒ´‹MƒÅ‰L$p陹\ÌC‹ÆëIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu ‰\$é[¹TÌC‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu ÇD$é¹PÌC‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu ÇD$té×¹@ÌC‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu ÇD$Hé—¹,ÌC‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu ÇD$0ÌCëZ¹ÌC‹Æ›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;ÃuOƒÿ|*‹UƒÅ‰T$0ëFVèVƒÄ;Ãt‰D$@OƒÅ;ûgúÿÿ‰¼$¨‰l$9\$@u è‰D$@9\$Xt@9\$,u:‹ ÌEhÜËCQ褃ÄÇD$éP¡ÌEhÀËCPèƒƒÄ é;ûŽ8‹E€8-…,‹ÌEPh¨ËCRèU¡ÌEh˜ËCPèE‹ ÌEhXËCQè4‹ÌEh0ËCRè#¡ÌEh ËCPè‹ ÌEhäÊCQè‹ÌEh¬ÊCRèñ¡ÌEhlÊCPèá‹ ÌEƒÄDh,ÊCQèÍ‹ÌEhøÉCR輡ÌEhÐÉCP謋 ÌEhäÊCQ蛋ÌEh¤ÉCR芡ÌEhhÉCPèz‹ ÌEhdÉChdÉCh(ÉCQè_‹ÌEƒÄ@h$ÉCh$ÉChôÈCRèA¡ÌEhðÈChðÈChôÈCPè'‹ ÌEhèÈChèÈChôÈCQè ‹ÌEhäÈChäÈChôÈCRèñ¡ÌEƒÄ@hÜÈChÜÈChôÈCPèÔ‹ ÌEhÔÈChÔÈChôÈCQ蹋ÌEhÌÈChÌÈChôÈCRèž¡ÌEhÄÈChÄÈChôÈCPè„‹ ÌEƒÄ@h¼ÈCh¼ÈChôÈCQèf‹ÌEh°ÈCh°ÈChôÈCRèKƒÄ ÇD$é‹D$p‹ ÌEjPQèt8‹ðè™Pè‹ø‰|$Dè^Pè|ƒÄƒ|$t‹Ø‰\$Dth |CWè1‹ÌERWèƒÄ‹L$L‹ÌEjD$XPjQRèQHƒÄ…Àu¡ÌEh˜ÈCP讃Äé-…ÿ„…Û„ƒ|$ÿu 3É9L$ •Á‰L$ƒ|$lt‹ÌE‹D$ljRPè„hƒÄ ƒ|$<t)ƒ|$t‹L$ ¡ÌEƒÄDhŒÏCPè+ ‹ ÌEhpÏCQè ‹ÌEh4ÏCRè ƒÄ‹D$][_^ƒÄ4ÃVjjlSè[ ƒÄ…À¾þÿÿVÿ4«Cé6VjjlWè9 ƒÄ…À¾þÿÿVÿ4«Céƒø…éjjjSè+ ƒÄ‰D$…Àu$‹ÌEhÏCRè…¡ÌEPèƒÄ éÓƒ|$,t PWèè ƒÄƒ|$0‹5,«Ctv‹T$L$QRèà ƒÄ…Àu ¡ÌEPéŒöD$t hüÎCÿÖƒÄöD$t hÜÎCÿÖƒÄöD$t h´ÎCÿÖƒÄöD$t h”ÎCÿփă|$u htÎCÿփă|$4„’‹l$‹MQè~ ƒÀ™ƒâ‹U‹øRÁÿèg h!hhÎCW‹èè÷ ‹øƒÄ…ÿuhXÎCÿ4«C‹|$$éÞ‹D$‹HWQèê Uh8ÎC‹ØÿÖ3ɃĉL$…Û~N¤$¸«ªª*÷éÑú‹ÂÁèÂ@ÒÒ‹Á+Âuh4ÎCÿÖ‹L$ƒÄ¶ Qh,ÎCÿÖ‹L$AƒÄ;ˉL$|¹h$ÎCÿÖ‹T$‹B WPèp UhÎC‹ØÿÖ3ɃĉL$…Û~G¸«ªª*÷éÑú‹ÂÁèÂ@ÒÒ‹Á+Âuh4ÎCÿÖ‹L$ƒÄ¶ Qh,ÎCÿÖ‹L$AƒÄ;ˉL$|¹hüÍCÿÖUhèÍCÿÖhÜÍCÿÖh°ÍCÿÖUUh€ÍCÿÖUUhPÍCÿÖh$ÍCÿÖhÍCÿÖhüÌCÿÖWèÞ‹\$|‹l$t‹|$\ƒÄ<ƒ|$<ulƒýu‹T$RWh6|Cè‘ ƒÄ ëƒýu8‹D$PWèv ƒÄ‰D$…Àu7‹ ÌEhÜÌCQèô‹ÌERèˆƒÄ ëD¡ÌEh„¸CPèÓƒÄë/ÇD$ë%‹ ÌEhÀÌCQ賃Äë‹ÌERèBƒÄ…Ût SèeƒÄ…ÿt WèNƒÄ‹D$…À„süÿÿPèÓ‹D$ƒÄ][_^ƒÄ4ËÇ_^ƒÄ4ÃÌÌÌÌÌÌÌ̸T膡ÌEUV3öW3í¿‰t$<‰t$‰t$‰t$ ‰t$@‰t$H‰t$D‰|$‰t$(‰t$0‰t$‰t$$;Æu8èxPèlƒÄ£ÌE;Æt!ÿ0¬CƒÀ@P¡ÌEjjjPèA¡ÌEƒÄVPè2+ƒÄ…À„ ‹|$h‹3ÀS‹\$h‰D$0‰D$<¸KƒÇƒû‰D$8‰D$P‰L$TŒ!d$‹7¹¤´C‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu"KƒûŒ‹WƒÇR葃ĉD$8é^¹XÇC‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu"KƒûŒ>‹GƒÇPè?ƒÄ‰D$Pé ¹ ´C‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒûŒì‹OƒÇ‰L$0éù˜´C‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒûŒ ‹WƒÇ‰T$<éw¹ì¯C‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒûŒP‹GƒÇ‰D$4é'¹\ÐC‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$Déã¹`ÆC‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$@飹0ÔC‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$éc¹XÐC‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$Hé#¹Œ´C‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$Léã¹,ÔC‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$(飹(ÔC‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$(ëf¹ÇC‹Æ›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒû|D‹OƒÇ‰L$,ëT$Rh$ÔCVÿ@«CƒÄ …Àt 9l$~KƒÇƒû:üÿÿ‹t$(‹\$,éL‹D$T‹ ÌEPh ÔCQ蛋ÌEhì³CR芡ÌEh¼³CPèz‹ ÌEh(ÐCQèi‹ÌEh ³CRèX¡ÌEh ÐCPèH‹ ÌEhÌÓCQè7‹ÌEhäÏCRè&¡ÌEƒÄDh¬ÏCPè‹ ÌEhŒÏCQè‹ÌEhˆÓCRèñÿ¡ÌEh@ÓCPèáÿ‹ ÌEhÓCQèÐÿ‹ÌEh4ÏCRè¿ÿ¡ÌEj;j;hdÂCPè«ÿ‹ ÌEƒÄ@h¸ÒCQè—ÿ‹ÌEhˆÒCRè†ÿ¡ÌEhpÏCPèvÿ‹D$4ƒÄ[_^]ƒÄTËދ|$0èÚÿ‹L$4‹ÌEjQRè•$‹D$ ƒÄ …öt …Àu ¸‰D$9l$t#…öt0¡ÌEhXÒCPèÿ‹D$$ƒÄ[_^]ƒÄTÃ…À„¾…öu¾…À„­¡ÌEjPjÇD$d‰D$hÇD$l€(@èèTƒÄ …Àu…Ûu‹ ÌEhÒCQè°þƒÄë…ÛtSèÍV‹ÌEPhðÑCRèþƒÄ9l$„”è1‹ ÌE‹ð‹D$PhÀÑCQèeþƒÄ …ötU‹D$T$XRjjjjPVèôƒÄV…Àt-èá‹èV‰l$ 赃ą텆‹ ÌEQè¶ýé@蔃ċÌERèýƒÄ‹D$[_^]ƒÄTÃè‹ ÌE‹è‰D$‹D$VPh€ÑCQèÌý‹ÌEhXÑCRè»ýƒÄ…ítb‹L$D$XPVQUèEƒÄ…ÀtA‹ÌERjè UƒÄèþýPèòý‹øƒÄ‰|$$…ÿ…‹ ÌEQèýƒÄékU赃ġÌEPèçüéqèµýPè©ý‹ðƒÄ‰t$ …öu‹ ÌEQè¾üƒÄé&…ÿu:ÿ0¬CPWjjVènýƒÄ‹D$8ƒøt?ƒøt:‹ÌEhÀÌCRèàüƒÄéèWjjlVè9ýƒÄ…ÀÇWÿ4«CƒÄéÇj9l$„‡ƒøu‹D$$Ph”{Chx|Cè"ë‹L$$jjQèdÿ‹ðƒÄ…öu$h8ÑC‹ÌERèhü¡ÌEPèýûƒÄ éeVè÷ÿ‹èV‰l$ èËþƒÄ…í…­þÿÿ‹ ÌEQèÌûƒÄé4ƒøuVh`|ChZ|CèŸÿ‹è‰l$(ëjjVè‡ÿ‹è‰D$(ƒÄ…í…aþÿÿhÏCénÿÿÿ‹t$<…öu]ÿ0¬CƒÀ PVjjWè3üƒÄƒ|$@t UWè:ÿƒÄƒ|$D‹5,«C„›T$RUèÿƒÄ…Àu4¡ÌEPè%ûƒÄéVjjlWèÞûƒÄ…À§Vÿ4«CƒÄélöD$t hüÎCÿÖƒÄöD$t hÜÎCÿÖƒÄöD$t h´ÎCÿÖƒÄöD$t h”ÎCÿփă|$u htÎCÿփă|$H„¤‹MQè«ýƒÀ™ƒâ‹U‹øRÁÿè”ýhÖh$ÑCW‹Øè$þ‹øƒÄ…ÿuhXÎCÿ4«CƒÄé¾hðÐCÿÖShèÍCÿÖ‹D$$‹HWQè þShÌÐC‹èÿÖ3ɃĉL$…í~M›¸«ªª*÷éÑú‹ÂÁèÂ@ÒÒ‹Á+ÂuhÈÐCÿÖ‹L$ƒÄ¶ Qh,ÎCÿÖ‹L$AƒÄ;͉L$|¹hÀÐCÿÖ‹T$‹B WPèýShœÐC‹èÿÖ3ɃĉL$…í~G¸«ªª*÷éÑú‹ÂÁèÂ@ÒÒ‹Á+ÂuhÈÐCÿÖ‹L$ƒÄ¶ Qh,ÎCÿÖ‹L$AƒÄ;͉L$|¹hÀÐCÿÖhÜÍCÿÖh°ÍCÿÖSSh€ÍCÿÖSShPÍCÿÖh$ÍCÿÖhxÐCÿÖ‹T$D‹BƒÄ,…Àt PhdÐCÿÖƒÄhüÌCÿÖWèíû‹l$ ƒÄƒ|$LuY‹D$Pƒøu‹D$$UPh6|Cè¤üƒÄ ëƒøu ‹L$$UQè‰üƒÄ‰D$…Àu hÜÌCéšüÿÿ‹ ÌEh„¸CQèýøƒÄëÇD$‹D$ …Àt Pè²øƒÄ‹D$$…Àt Pè—ùƒÄ…í„ÌúÿÿUè ü‹D$ ƒÄ[_^]ƒÄTËÇ_^]ƒÄTÃÌÌÌÌV‹t$‹F¶QÿD«CƒÄ…ÀtN‹V‹t$ RhLÔCVèxø¡ÀE@ƒÄ £ÀEƒøuh„µCVèZøƒÄÇÀE^ÃhHÔCVè@øƒÄ^ÃÌÌÌÌÌÌÌU‹l$‹ÅWPëIŠ@„Éuù+‹ø‹D$ ;ù~‹ÌEhdÔCRèý÷ƒÄ_3À]ÃSV‹t$PjVè\ƒÄ 3Û…ÿ~QŠMÆEE„ÉtEŠÁ,0< wŠÈëŠÁ,A<w€ÁÉë ŠÑ€êa€úw,€Á©‹Ã™+ÂöÃtÑøÆëÀáÑøˆ 0C;ß|¯^[_¸]áÌEhTÔCPèr÷ƒÄ^[_3À]ÃÌÌÌ̸°è–¡E3ĉ„$¬S‹œ$¼U3í¸V‰D$4‰D$¡ÌEW3ö3ÿ‰\$‰l$\‰l$`‰t$ÇD$H ‰l$d‰l$p‰l$$‰l$t‰l$h‰l$X‰l$x‰l$l‰l$‰l$@‰|$4‰l$T‰l$|‰l$P‰l$<‰l$D‰¬$ˆ‰l$(‰l$,‰l$L‰l$0‰¬$„‰¬$€;Åu8è÷Pè÷ƒÄ£ÌE;Åt!ÿ0¬CƒÀ@P¡ÌEjjjPèäö¡ÌEƒÄUPèՃąÀ„’‹j(Œ$ÐQRè(ƒÄ ¹´ÙC„$Ì»d$Š:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu ¿‰|$4„$ÌPèúƒÄ‰D$;ýuP;ÅuL¹°ÙC„$ÌŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åt‹ÌEŒ$ÌQh”ÙCRéö‹¼$ăD$OƒÿŒi ‹ÿ‹D$‹0¹ÙC‹ÆIŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu ÇD$ éG¹ ´C‹ÆëIŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu!OƒÿŒe‹D$‹HƒÀ‰D$‰L$Dé󹘴C‹ÆŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu$OƒÿŒ‹D$‹PƒÀ‰D$‰”$ˆé ¹ˆÙC‹ÆŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu OƒÿŒÃ‹D$ƒÀ‰D$‹‰D$téR¹ì¯C‹ÆŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu$OƒÿŒu‹D$‹HƒÀ‰D$‰Œ$„é¹PÌC‹ÆŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu ‰l$ éɹ„ÙC‹Æ¤$Š:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu ÇD$@釹€ÙC‹ÆëIŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu ÇD$déG¹xÙC‹ÆëIŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu ÇD$pé¹pÙC‹ÆëIŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu ‰l$Pé˹hÙC‹ÆŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu ÇD$Pé¹`ÙC‹ÆŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu ÇD$TéU¹\ÙC‹ÆIŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu ‰\$@é¹XÙC‹ÆŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu ÇD$|éà¹TÙC‹ÆŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu ÇD$4饹LÙC‹ÆIŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu ÇD$4ég¹@ÙC‹ÆëIŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu!OƒÿŒ…‹D$‹PƒÀ‰D$‰T$é¹<ÙC‹ÆŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu OƒÿŒ5‹D$ƒÀ‰D$‹‰D$$éĹ4ÙC‹Æ‹ÿŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Å…ÄOƒÿ‰¼$ČڋD$‹xƒÀh ®CW‰D$ÿ«C‹ðƒÄ;õ„tVh€hÈEÆÈEÿ$«CVÿ«C¸ÈEƒÄPIŠ@„Éuù+Â;Å~5¹ÈEŠTÿI€ú t€ú uHÆ€ÈE;Å~Š €ù t€ù uHÆ€ÈEƒøŒ ‹¼$ÄÇD$$ÈEé̹0ÙC‹ÆŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu!OƒÿŒï‹D$‹HƒÀ‰D$‰L$Xé}¹,ÙC‹ÆŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu!OƒÿŒ ‹D$‹PƒÀ‰D$‰T$lé.¹(ÙC‹ÆŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu OƒÿŒQ‹D$ƒÀ‰D$‹‰D$xéà¹$ÙC‹ÆŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu!OƒÿŒ‹D$‹HƒÀ‰D$‰L$鑹@ÌC‹ÆŠ:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;Åu Ç„$€ëV€>-uFVèQòƒÄ;Åt‰D$ë=‹T$‹¹ÙC¤$Š:u„ÒtŠP:Qu ÃË„Òuæ3ÀëÀƒØÿ;ÅuD‰l$ƒD$Oƒÿføÿÿ‹|$‹t$é¡ÌEWhüØCPë)‹ ÌEhäØCQè¾íƒÄë‹T$‹‹ ÌEPh¨ËCQè¡íƒÄ ‹ÌEh˜ËCRèí¡ÌEhØØChÄØCPèxí‹ ÌEh¸ØCh¤ØCQèbí‹ÌEh˜ØCh|ØCRèLí¡ÌEhÙChlØCPè7í‹ ÌEhPÌCh\ØCQè!í‹ÌEƒÄDhPØChØCRèí¡ÌEh<ÙChì×CPèóì‹ ÌEh4ÙCh°×CQèÝì‹ÌEh$ÙCht×CRèÇì¡ÌEhY¶Ch8×CPè²ì‹ ÌEh0×Ch×CQèœì‹ÌEƒÄHhüÖChÐÖCRèƒì¡ÌEhÀÖCh¬ÖCPènì‹ ÌEh ÖChlÖCQèXì‹ÌEh\ÖCRèGì¡ÌEPh €@Sè>ð‹ ÌEh„µCQè%ìƒÄ@éQ ‹þ‹”$„¡ÌEURPèSƒÄ ;ýtWè^îƒÄ‰D$;Åu#Wh0ÖCé 9-ÐEtèÅîëè$ï‰D$;õt_Š3É„Àt)¶ÀPЃú w ‰LHÐë ƒøk„¡ŠFF„ÀuÛ‰t$9l$4t ƒùPs¹P‰L$H9l$dt¡ÌEQh$ÖCPèlëƒÄ hchÖChè¯î‹t$T‹ØN¸VUUU÷é‹ÊÁéʸ«ªª*÷îÁú‹ÂÁèÂ4Hhdt6RhÖCV‰\$tèlîƒÄ‰D$`;Å„";Ý„ènëPèbë‹ø‰|$,è]ëPèQëƒÄ‹è‰l$,…ÿ„Ý…í„Õƒ|$Tt3h |CWèöíh |CUèëí‹ ÌEQWèØí‹ÌERUèËíƒÄ ƒ|$D‹5L«C…£ƒ|$tjjjÿ0¬CPÿÖƒÄÿ0¬CPjjjWè½êƒÄƒ|$$…K‹D$t…À„œjT$lRjP¡ÌEP讃ąÀup‹ ÌEh˜ÈCQè êƒÄé6FÁá €>‰t$„Zþÿÿ‹ÌEhôÕCRèàéƒÄé ‹D$DPjjlWè5êƒÄ…Àpÿÿÿ‹L$DQÿ4«CƒÄéß‹D$h‰D$$…À…£ƒ|$„˜ƒ|$X…‹|$ ¸èÕC…ÿu¸ÜÕC‹T$PRèjíPè^íƒÄPhÄÕC„$hÈPè‹êWŒ$ QhSÆè&íƒÄ$…Àt}¦‹ÌEh°ÕCRèéƒÄéB€;u ÇD$8é0‰\$$‹¼$ˆ…ÿ…¬‹=0¬Cÿ׃À PjjjUè?éƒÄƒ|$tjjjÿ׃À Pÿփă|$4‹l$(‹\$,„è–éPè éƒÄ‰D$L…À„¿ƒ|$T‹ðth |CVè¹ë¡ÌEPVè§ëƒÄƒ|$|thVèFìƒÄƒ|$ t4‹L$,QVè1鋨ë2WjjlUèžèƒÄ…ÀoÿÿÿWÿ4«CƒÄéL‹T$(RVèýè‹èƒÄƒ|$„T‹|$$…ÿ„aƒ|$Pt3öéƒ|$ j„ž‹D$p…Àt.Œ$QPèŒïÿÿƒÄ …Àu1‹ÌEh˜ÕCRè¨çƒÄéÔ„$Pè}ëƒÄ…ÀŒ¼ƒ|$@„šjh<ÔCSèBèƒÄ ƒøuPŒ$QSè+èƒÄ ƒøtn‹ÌEh|ÕCRè@çƒÄél„$˜PUèèƒÄ ƒø…÷PŒ$QUèùçƒÄ ƒø…Ü3É‹” ”;‘<ÔC…žƒèƒÁƒøsâ´$Œ‹ÇPIŠ@„Éuù+ÂŒ$œQ‹L$”$°RjP‹D$(WVPQè‹êƒÄ ;|$\ufhWè±éƒÄ‹D$x…À„vjŒ$ QPè@îÿÿƒÄ …À…‰‹ÌEhdÕCRèXæƒÄé„¡ÌEhPÕCPè@æƒÄél‹ÇPŠ@„Éuù+ÂP뎋ÌEh4ÕCRèæƒÄéB…ÿu*‹D$PèÞéƒÄ…Àt‹ ÌEh$ÕCQèèåƒÄé‹D$X…Àt/j ”$°RPè”íÿÿƒÄ …Àu¡ÌEh ÕCPè±åƒÄéÝè|éPèæƒÄ‰D$0…À„ÃL$ƒ|$pt‹L$ãƒÄ‹D$ …Àt Pè7âƒÄ‹D$<…Àt Pè&âƒÄ‹D$X…Àt PèÓäƒÄ‹Œ$¬‹D$(3Ìè—òİÃÌÌÌÌ̸PèVò¡E3ĉD$L‹D$TSW‹ù‰D$‹ÚHŠ@„Òuù+ÁU‹è‹ÇˆIEVÆHE$PŠ@„Éuù+ƒøvhCh ÛChøÚCÿT«CƒÄ ‹5P«CjWhHEÿÖjhôÚChHEÿÖjShHEÿÖ¸HEƒÄ$P‹ÿŠ@„Éuù+ƒøvhGh ÛChÀÚCÿT«CƒÄ ‹ÇPëIŠ@„Éuù+˜JE‹Ã‰\$4PŠ@„Éuù+‹ð‰t$8ƒþvhJh ÛCh¤ÚCÿT«CƒÄ D$$Pè2åƒÄjèPäPL$,Qèå‹T$URD$8PèåjL$@hôÚCQèðä‹ÇƒÄ$Hd$Š@„Òuù+ÁPT$(WRèÏäjD$4hôÚCPè¾äVL$@SQè²äT$8Rè´äƒÄ(jèÒãPD$Pè™ä‹|$UL$$WQèƒäVT$0SRèwäUD$ãƒÄ ¹…ÿ…¥‹Í‹ÃQPT$RèãjD$LPL$(QèãFƒÄþè‚)ÿÿÿT$RèçâƒÄ3É3Ò뛊D<ˆD LB™¾A÷þƒù|çŠL$A‹D$8ŠT$GˆL$Z‹L$44¸HEˆT$[Pd$Š@„Éuù‹T«C+ÂHE;òth‡h ÛChXÚCÿÓƒÄ Æ$F3ÿ¶DÊƒÄ éž‹Š·ƒÄé6…ö„ˆ‹ÌEhxíCRè}·ƒÄër‹t$t„$VPè¾¹WSŒ$ QV訹ƒÄ…Àu%‹ÌESh¤íCRè=·¡ÌEPèÒ¶ƒÄéʃ¼$t‹ ÌEhLíCQè·ƒÄë‹|$‹”$ ‹D$DRPWèÏØƒÄ …Àu%‹ ÌEh$íCQèÛ¶‹ÌERèo¶ƒÄ égƒ¼$ðu‹D$HPWèn¸ƒÄ…À„G‹|$ƒ¼$u5‹ ÌEh íCQ舶‹„$‹”$  P¡ÌERWPèó·ƒÄ‹ ÌEhäìCQèS¶‹‹B‹H‹ÌEQRèúº‹„$ ƒÄ…ÀtP¡ÌEhØìCPè¶ƒÄ ‹ ÌEh„µCQè ¶ƒÄƒ¼$uq‹ÌEh¸ìCRèíµ¡ÌEjjj PèH¶Æ„$Äÿ0¬CPŒ$ÈjQÿ$«CŠ„$ЃÄ$ƒÄéÒ3ÿ9¼$¤u‹D$@‰D$(‹ |Eh(üChÔüCQèµƒÄ ;Çuè ëŠmè3mPè'm‹Øè&mPèmƒÄ‹è;ß„3;ï„+9|$$…t;÷…ôÿ0¬CPWjjSèÝlƒÄ‹D$(ƒø…öWSè´rƒÄéø‹ÌE‹ÎQh´CRè>lƒÄ ‹D$<‹ ÌEPh4ÅCQè%l‹ÌEhì³CRèl¡ÌEhôÄCPèl‹ ÌEhÈÄCQèók‹ÌEh¬ÄCRèâk¡ÌEhŒÄCPèÒk‹ ÌEhôDQèÁk‹ÌEhÄDRè°k¡ÌEƒÄDh„DPèkƒÄ_^]¸[ƒÄ$ÃVjjlSèîkƒÄ…À ÿÿÿVÿ4«Céƒøu9WWWSè±qƒÄ‰D$;Çu=‹ ÌEhpDQèAk‹ÌERèÕjƒÄ éÔ¡ÌEhDDPèkƒÄé¼è^q‰D$;Ç„«èGq‹ð…ö„œjèòo‹L$j‰A‰qèáo‹N‰A‹jRè•oƒÄ…À„ièÃj…À„\‹L$‰F …ÉtQPè…jƒÄÇD$è™j‹ø…ÿ„0ƒ|$‰~t?‹D$P3öèajƒÄ…À~,‹L$VQèEkW‹ÈèåùÿÿƒÄ …À|S‹T$RFè5jƒÄ;ð|Ô‹T$Rè j‹t$0ƒÄ…öuPÿ0¬CƒÀ PVjjUè„jƒÄ‹D$0ƒøuL‹D$PUè+pëO¡ÌEh(DPèïi‹ ÌEQèƒiƒÄ é‚VjjlUè9\$Pt ‰\$ é/¡ÌEhDDPèñS‹D$\ƒÄƒøu$9\$0u9\$u WUèŒZé»WUèzZ鯃øuy‹L$‹T$QSSRèYZhh‹øh4DWèóVƒÄ‰D$\;Ãu¡ÌEh¬´CPè~S‹|$é ‹L$QST$d‹ð‹D$RPè ZWVUè(TVèÞU‹|$0ƒÄ ‰\$ ëqƒøuX9\$0u9\$u‹L$4‹T$XQSSSRWUèÆYƒÄë WUè´YƒÄ;Ã…ýþÿÿ¡ÌEhDPè÷R‹ ÌEQè‹RƒÄ ë‹ÌEh„¸CRèÕRƒÄ;ët UèŽSƒÄ;ût Wè×TƒÄ_^]‹D$;Ãt Pè5UƒÄ‹D$(;Ã[t Pè#UƒÄ‹D$ƒÄPÃÌÌÌÌÌÌ¡ÌEhÈ DPètR‹ ÌEh¬ DQècR‹ÌEhŒ DRèRR¡ÌEhp DPèBR‹ ÌEh< DQè1R‹ÌEh DRè R¡ÌEhÐ DPèR‹ ÌEh¨ DQèÿQ‹ÌEƒÄ@hˆ DRèëQ¡ÌEhT DPèÛQ‹ ÌEh0 DQèÊQ‹ÌEh DRè¹Q¡ÌEhà DPè©Q‹ ÌEh´ DQè˜Q‹ÌEhˆ DRè‡Q¡ÌEhd DPèwQ‹ ÌEƒÄ@hhÉCQècQ‹ÌEh@ DRèRQƒÄÃÌÌÌÌÌÌÌÌÌ̸<èva¡ÌESU‹l$HV3öW‹|$T2ÛMƒÇ‰t$,‰t$‰t$<‰t$@‰t$4‰t$(ÆD$ÆD$ÇD$$ˆ\$ˆ\$ˆ\$‰t$‰t$D‰t$ ‰t$8‰t$0ÇD$H;ÆuVÿ0¬CƒÀ@PèñSƒÄ£ÌEVPèwƒÄ…À„ èQè™WƒýÆD$PŒëI‹7¹ ´C‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuMƒýŒ=‹GƒÇ‰D$<éþ¹˜´C‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuMƒýŒí‹OƒÇ‰L$@鮹 D‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuMƒýŒ‹WƒÇ‰T$(é^¹ÇC‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuMƒýŒM‹GƒÇ‰D$8é¹,ÇC‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu"MƒýŒý‹OƒÇQèQ_ƒÄ‰D$$éµ¹ì¯C‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuMƒýŒ«‹WƒÇ‰T$4él¹0 D‹ÆëIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÆD$é-¹ D‹Æ›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÆD$éí¹ü D‹Æ›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÆD$é­¹ð D‹Æ›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÆD$ém¹è D‹Æ›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÆD$Pé-¹à D‹Æ›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÆD$Péí¹Ø D‹Æ›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÆD$P魹РD‹Æ›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÆD$Pém¹€ÌC‹Æ›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÆD$Pé-¹”ÌC‹Æ›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÆD$é빘ÆC‹Æ›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÆD$é­¹È D‹Æ›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuÆD$ëp¹¼ D‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuÆD$ë9¹° D‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu7ÆD$³MƒÇƒý£úÿÿ„Ût)€|$t"¡ÌEh„ DPè KƒÄémè{øÿÿéc‹L$4‹ÌEjQRè3p‹L$D‹ÌEj‹ðD$@PjQRèW€ƒÄ …Àu¡ÌEh˜ÈCPè´JƒÄé‹ ÌEjQj踠¾D$ ƒÄ ƒètiƒètBƒè…‡‹T$$‹ ÌEhx DVP‹D$4RPQèg‹øƒÄ…ÿtaWè+MW‹ðèçIƒÄëJ‹T$$‹D$(‹ ÌEhxDVjjRPQèT‚ë#‹T$0‹D$$‹L$(h°»CVR‹ÌEjPQRè?€‹ðƒÄ…öu _^]¸[ƒÄ<ÃVè¿P‹øV‰|$ è™LƒÄ…ÿu!h` D¡ÌEPèÄI‹ ÌEQèXIé‹D$<…Àt9hXÈCPèšI‹ØƒÄ‰\$,…Ûu8‹ÌEhD DRè‚I¡ÌEPèIéØjÿ0¬CPèšLƒÄ‹Ø‰D$,‹D$@…Àt8h$±CPèBIƒÄ‰D$…Àu:‹ ÌEh( DQè,I‹ÌERèÀHéjÿ0¬CƒÀ Pè@LƒÄ‰D$WèùO‹ðh<6h DWèBLh‹èh DV‰l$`è,LWUS‰D$Hè°I‹ðƒÄ(…ö¡ÌEhü DPè­HƒÄjÿt«C€|$t'‹Æ™+‹øÑÿ3É…ÿ~T.ÿd$ŠŠ)ˆ)ˆAJ;Ï|ð¾D$Hƒøwpÿ$…1A¶L$P‹T$‹|$ QRWUVèAOëI¶D$P‹L$‹|$ PQWUVè"Oë0¶T$P‹D$‹|$ RPWUVèOë¶L$P‹T$‹|$ QRWUVèäNƒÄ…À hä Dé þÿÿ€|$ÇD$Ht'‹T$jÿjPWRèœHƒÄ…Àu2¡ÌEPè^GƒÄë"€|$PWt ‹L$$Qè„Në ‹T$$RèlHƒÄ ‹D$Pè©I‹L$0QèSG‹T$$Rè?H‹D$PƒÄ …Àt PèöIƒÄ‹D$ …Àt PèåIƒÄ‹D$0…Àt PèÔIƒÄ‹D$H_^][ƒÄ<ÃI{0Ab0A”0A­0A¸HèVW¡ÌES3ÛÇD$‰\$D‰\$4‰\$<‰\$‰\$‰\$(‰\$$‰\$‰\$‰\$8;Ãu8èQGPèEGƒÄ£ÌE;Ãt!ÿ0¬CƒÀ@P¡ÌEjjjPèG¡ÌEƒÄSPè mƒÄ…À„´U‹l$TVW‹|$`‹¸MƒÇƒý‰\$,‰\$‰\$<‰D$‰D$L‰L$TŒ‹‹7¹¤´C‹ÆŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu"MƒýŒÁ‹WƒÇRèqVƒÄ‰D$é*¹XÇC‹ÆŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu"MƒýŒo‹GƒÇPèVƒÄ‰D$L騹 ´C‹ÆŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;ÃuMƒýŒ‹OƒÇ‰L$鹘´C‹ÆIŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;ÃuMƒýŒÑ‹WƒÇ‰T$<éC¹ÇC‹Æ¤$Š:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;ÃuMƒýŒ‹GƒÇ‰D$4éó¹ÇC‹Æ¤$Š:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;ÃuMƒýŒ1‹OƒÇ‰L$0飹ì¯C‹Æ¤$Š:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;ÃuMƒýŒá‹WƒÇ‰T$,éS¹Œ´C‹Æ¤$Š:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu ÇD$Hé¹`ÆC‹ÆIŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu ÇD$@éϹ ÆC‹ÆIŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu ÇD$Dé¹0 D‹ÆIŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu ÇD$ëR¹( D‹Æ›Š:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ãu ÇD$ ëFVèøFƒÄ‰D$P;ÃthMƒÇƒýuüÿÿèKC‹T$,¡ÌESRPèhL$0Q‹L$DT$$R‹ÌE‹ð‹D$DPQRè&xƒÄ …À…]¡ÌEhØÅCPèBƒÄ锋‹ ÌEPh´CQècBƒÄ ‹T$T¡ÌERh4ÅCPèKB‹ ÌEhì³CQè:B‹ÌEhÜ DRè)B¡ÌEh¬ DPèB‹ ÌEhœDQèB‹ÌEh@DRè÷A¡ÌEh DPèçA‹ ÌEhìDQèÖA‹ÌEƒÄDh¨DRèÂA¡ÌEh¸DPè²A‹ ÌEhpDQè¡A‹ÌEh8DRèA¡ÌEhDPè€A‹ ÌEhèDQèoA‹ÌEhÀDRè^A¡ÌEh˜DPèNA‹ ÌEƒÄ@h| DQè:AƒÄéOè¥APè™A‹øƒÄ;ûu‹ ÌEQè²@ƒÄ‹ëé ‹ÌEhl DRè÷@ƒÄ9\$t$‹D$‹L$‹T$hxDVP¡ÌEjQRPèøxë#‹L$‹T$‹D$h°»CVQ‹ ÌEjRPQèãv‹ðƒÄ;ót Vè¾GƒÄ‹èë‹ëVèGCƒÄ;ëu$‹ÌEhX DRèq@¡ÌEPè@ƒÄ éa‹t$<;óuCÿ0¬CƒÀ PSjjWè¯@ƒÄ9\$@tHSUWèRGƒÄ …Àu9Vÿ4«C‹ ÌEQè¸?éVjjlWèt@ƒÄ…ÀÁVÿ4«CƒÄéõ9\$Dt8hL Dÿ0¬C‹5(«CƒÀ PÿÖ‹URWèKAƒÄh„µCÿ0¬CƒÀ PÿÖƒÄ9\$H…­¡ÌEh8 DPèš?‹D$TƒÄƒøu9\$u9\$ u UWè•Fë:UWè†Fë1ƒøuZ9\$u9\$ u‹L$$‹T$PQSSSRUWèYFƒÄë UWèGFƒÄ;Ãu!¡ÌEh DPè(?‹ ÌEQè¼>ƒÄ ë‰\$(ë‹ÌEh„¸CRè?ƒÄ;ût Wè¹?ƒÄ;ët UènAƒÄ_^]‹D$;Ãt Pè`AƒÄ‹D$;Ã[t PèNAƒÄ‹D$ƒÄHÃ̸PèæN¡ÌEVW3ÿ¾‰|$‰|$4‰|$<‰|$8‰t$‰|$(ÇD$,ÿÿÿÿ‰|$@‰|$‰|$$;Çu8èß>PèÓ>ƒÄ£ÌE;Çt!ÿ0¬CƒÀ@P¡ÌEjjjPè¨>¡ÌEƒÄWPè™dƒÄ…À„= S‹\$d‹ U‹l$d3ö¸MƒÃƒý‰t$‰t$(‰D$8‰D$$‰L$LŒ‹3¹¤´C‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu"MƒýŒ$‹SƒÃRèNƒÄ‰D$8鬹XÇC‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu"MƒýŒÒ‹CƒÃPè¯MƒÄ‰D$$éZ¹ ´C‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuMƒýŒ€‹KƒÃ‰L$鹘´C‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuMƒýŒ4‹SƒÃ‰T$(éŹì¯C‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuMƒýŒä‹CƒÃ‰D$,éu¹`ÆC‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$<é1¹XÐC‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$@éñ¹˜D‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu¿‰|$H鬹ÇC‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuMƒýŒÔ‹KƒÃ‰L$0ë_¹Œ´C‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$Dë.T$ Rh$ÔCVÿ@«CƒÄ ƒø…Z‹D$ ‰D$4¿‰|$MƒÃƒýòüÿÿ‹t$èU;èJ;Pè>;‹è‰l$Pè9;Pè-;ƒÄ‹Ø‰\$P…í„{…Û„s…ö…ýÿ0¬CPVjjUèö:ƒÄ‹t$(…ö…ÿ0¬CƒÀ PVjjSèÔ:ƒÄ‹T$,¡ÌEjRPèŸ_ƒÄ …ÿt;‹t$0‹ÌE3É…ö•ÁQRjèNƒÄ …ötVèQ’P¡ÌEhðÑCPè:ƒÄƒ|$4Ž ‹ ÌEÇD$T‰L$XÇD$\€(@…ÿuh(htDh`DÿT«CƒÄ è=‹ð‰t$…ö…d‹ÌEh@DRè¬9ƒÄé„‹ ‹ÌEQh´CRè9ƒÄ ‹D$L‹ ÌEPhDQèw9‹ÌEhì³CRèf9¡ÌEhÌÿCPèV9‹ ÌEh ÿCQèE9‹ÌEh ³CRè49¡ÌEh ÐCPè$9‹ ÌEhøDQè9‹ÌEhŒÏCRè9¡ÌEƒÄDhpÏCPèï8‹ ÌEhÔDQèÞ8‹ÌEhœDRèÍ8¡ÌEh4ÏCPè½8‹ ÌEhXDQè¬8ƒÄ(‹D$][_^ƒÄPÃVjjlUèþ8ƒÄ…ÀþÿÿVÿ4«CéXVjjlSèÜ8ƒÄ…ÀþÿÿVÿ4«Cé6‹D$ ‹ ÌEPhÀÑCQèC8‹ÌEh8DRè28‹L$4D$hPjjjjQVèÈ;ƒÄ0…ÀuZ‹ÌEhDRè8ƒÄéÚ‹D$8ƒøujUh”{Chx|Cèo;‹ð‰t$ ëƒø…‰jjjUè¤:‹ð‰D$ ƒÄ…öu$¡ÌEh8ÑCPè¥7‹ ÌEQè97ƒÄ éqƒ|$<t VSèµ>ƒÄƒ|$@„û‹|$‹W Rè :ƒÀ™ƒâ‹ð‹G PÁþè :‹OQ‰D$Lèü9‹WRèó9hnhDƒÆVè‚:‹øƒÄ…ÿuhXÎCÿ4«Céì‹D$‹H WQèy:‹T$H‹5,«CRhÜD‹èÿÖƒÄ3Û…í~5¸«ªªª÷ãÁêRÀÀ‹Ë+Èu h4ÎCÿփĶ;Rh,ÎCÿÖCƒÄ;Ý|Ëh$ÎCÿÖ‹D$‹HWQè:‹l$LUh¸D‰D$(ÿÖ3ÛƒÄ9\$~7¸«ªªª÷ãÁêRÒÒ‹Ã+Âu h4ÎCÿփĶ ;Qh,ÎCÿÖCƒÄ;\$|Éh$ÎCÿÖ‹T$‹BWPè«9Uh”D‰D$(ÿÖ3ÛƒÄ9\$~?뛸«ªªª÷ãÁê RÉÉ‹Ó+Ñu h4ÎCÿփĶ;Ph,ÎCÿÖCƒÄ;\$|ÉhüÍCÿÖUh|DÿÖhlDÿÖh<DÿÖUUhDÿÖUUhÔDÿÖUUh DÿÖh`DÿÖh<DÿÖƒÄ@h(DÿÖ‹l$P‹\$T‹|$‹t$ƒÄƒ|$Duj‹D$$ƒøuVShŽ{CèÊ8ƒÄ ëƒøu3VSèy<ƒÄ…Àu=‹ ÌEhDQè55‹ÌERèÉ4ƒÄ é¡ÌEh„¸CPè5ƒÄééƒ|$H„……ÿuh³htDh`DÿT«CƒÄ ‹L$Qh”{ChŽ{Cè’7‹ðƒÄ …ö„¡VèÑ6ƒÄ…À„‹D$$ƒøu VSèº;ƒÄëƒøu;jjjjjVSè“;ƒÄVè7ƒÄ…ÿt¡ÌEPjè䋃ÄÇD$ë;‹ÌEh„¸CRèJ4ƒÄë%‹ ÌEhÀÌCQè44ƒÄë‹ÌERèÃ3ƒÄ…ít Uèæ3ƒÄ…Ût SèÏ4ƒÄ‹D$…À„QûÿÿPè|6‹D$ ƒÄ][_^ƒÄPÃ_‹Æ^ƒÄPÃÌÌÌÌÌÌÌÌ̸XèD¸S3Û‰D$‰D$¡ÌE‰\$‰\$T‰\$L‰\$P‰\$‰\$$‰\$ ‰\$8‰\$4‰\$(‰\$,ÇD$ ‰\$D‰\$H;Ãu8èè3PèÜ3ƒÄ£ÌE;Ãt!ÿ0¬CƒÀ@P¡ÌEjjjPè±3¡ÌEƒÄSPè¢YƒÄ…À„Ÿ U¸VW‹|$p‹‰D$L‰D$(‹D$lHƒÇƒø‰\$<‰\$H‰\$$‰L$d‰D$lŒŒ½¤$‹7¹¤´C‹Æ¤$Š:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ãu*‹D$lHƒø‰D$lŒ¨‹WƒÇRèëBƒÄ‰D$Lé ¹XÇC‹ÆŠ:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ãu*‹D$lHƒø‰D$lŒP‹GƒÇPè“BƒÄ‰D$(é²¹ ´C‹ÆŠ:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ãu!‹D$lHƒø‰D$lŒø‹OƒÇ‰L$Héc¹˜´C‹ÆŠ:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ãu!‹D$lHƒø‰D$lŒ¨‹WƒÇ‰T$$é¹ÇC‹ÆŠ:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ãu!‹D$lHƒø‰D$lŒX‹GƒÇ‰D$DéùÇC‹ÆŠ:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ãu!‹D$lHƒø‰D$lŒ‹OƒÇ‰L$@és¹ì¯C‹ÆŠ:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ãu!‹D$lHƒø‰D$lŒ¸‹WƒÇ‰T$<é#¹Œ´C‹ÆŠ:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ãu ÇD$\éç¹`ÆC‹ÆëIŠ:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ãu ÇD$Xé§¹¼D‹ÆëIŠ:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ã…Ý‹D$lHƒø‰D$lŒä‹wƒÇÇD$P¹°D‹ÆŠ:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ãu ‰l$é¹ D‹Æ¤$Š:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ãu ÇD$é×¹˜D‹ÆëIŠ:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ã…&ÇD$铹ŒD‹ÆŠ:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ã…™‹D$lHƒø‰D$lŒÔ‹wƒÇÇD$T¹€D‹ÆŠ:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ãu ÇD$ é¹tD‹ÆIŠ:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ã…V‰\$ éǹhD‹ÆëIŠ:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ãu ÇD$,釹0 D‹ÆëIŠ:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ãu ÇD$ëJ¹( D‹ÆŠ:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ãu ÇD$0ëFVè’1ƒÄ‰D$`;Ãto‹D$lHƒÇƒø‰D$l€úÿÿèÝ-‹D$<‹ ÌESPQè™R‹L$LT$DR‹T$TD$DP¡ÌEQRPèºbƒÄ …À…¡‹ ÌEhØÅCQè-ƒÄé{‹‹ ÌEPh´CQèö,ƒÄ ‹T$d¡ÌERh4ÅCPèÞ,‹ ÌEhì³CQèÍ,‹ÌEhÜ DRè¼,¡ÌEh¬ DPè¬,‹ ÌEhœDQè›,‹ÌEh@DRèŠ,¡ÌEh DPèz,‹ ÌEhìDQèi,‹ÌEƒÄDh¨DRèU,¡ÌEhèDPèE,‹ ÌEhÄDQè4,‹ÌEh˜DRè#,¡ÌEhŒDPè,‹ ÌEhTDQè,‹ÌEh$DRèñ+¡ÌEhèDPèá+‹ ÌEƒÄ@h¼DQèÍ+‹ÌEhxDRè¼+¡ÌEhLDPè¬+hD‹ ÌEQè›+‹ÌEhäDRèŠ+ƒÄ(éóèõ+Pèé+‹èèè+PèÜ+ƒÄ‹ø;ë„”;û„Œ‹t$H;óuBÿ0¬CPSjjUè©+ƒÄ‹ÌEhÔDRè)+‹D$TƒÄƒøu:SU9\$t(è2ƒÄëRVjjlUèl+ƒÄ…À¿Vÿ4«Cé0èb2ƒÄë*ƒø…ü9\$t SSSUè?2ë ‹D$4PSSUè*2ƒÄ‰D$;Ãu%‹ ÌEhX DQè *‹ÌERè4*ƒÄ éÒ‹t$$;ó…ÿ0¬CƒÀ PSjjWèÙ*ƒÄ‹D$PèÖ,ƒÄ‹ð9\$Pt‹L$‹T$QRè®1ƒÄ9\$Tt‹D$ ‹L$PQè1ƒÄ9\$XtT‹T$SRWèu1ƒÄ …ÀuA‹D$$Pÿ4«C‹ ÌEQè›)ƒÄé9VjjlWèT*ƒÄ…ÀsÿÿÿVÿ4«Cé9\$\t ‰\$é‹ÌEhÄDRè±)ƒÄƒ|$(u=9\$,tVWh€Cè-ƒÄ ës9\$u9\$0u ‹D$PWèÉ0ëW‹L$QWè¶0ëJƒ|$(uo9\$,t VWèš0ë49\$u#9\$0u‹T$8‹D$`‹L$RSSSPQWèn0ƒÄë‹T$RWèX0ƒÄ;Ã…Jÿÿÿ¡ÌEh DPè)‹ ÌEQè™(ƒÄ ë:‹ÌEh„¸CRèã(ƒÄë$¡ÌEh DPèÎ(ƒÄë‹ ÌEQè](ƒÄ;ët Uè€(ƒÄ;ût Wèi)ƒÄ‹D$;Ãt Pè8+ƒÄ_^]‹D$(;Ãt Pè +ƒÄ‹D$,;Ã[t Pèú*ƒÄ‹D$ ƒÄXÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$U‹l$ VPQhØDW‹òè;(ƒÄƒ~uhÐDWè'(ƒÄé—SUVè+XÿƒÄ3ö…Û~D¤$¸«ªªª÷æÁêRÒÒ‹Æ+Âuh4ÎCWèâ'ƒÄ¶ .Qh,ÎCWèÏ'FƒÄ ;ó|ø«ªª*÷îÑú‹ÂÁèÂ@ÒÒ‹Æ+Â[uh4ÎCWèž'ƒÄ¶ .QhÈDWè‹'ƒÄ hüÍCWè}'ƒÄ^¸]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸xè–7¡ÌES3ÛU½‰\$ÇD$ ‰\$P‰l$$‰\$T‰\$H‰\$l‰\$D‰\$X‰\$`‰\$\‰\$‰\$p‰\$8‰\$<‰\$h‰\$d‰l$0‰\$@‰\$(‰\$‰\$‰\$‰\$ ‰\$,‰\$t;Ãu8èO'PèC'ƒÄ£ÌE;Ãt!ÿ0¬CƒÀ@P¡ÌEjjjPè'¡ÌEƒÄSPè MƒÄ…À„-¸VW‹¼$‹‰D$T‰D$<‹„$Œ+ŃÇ;ʼnŒ$€‰„$ŒŒ6d$‹7¹¤´C‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu0‹„$ŒHƒø‰„$ŒŒÜ‹WƒÇRèS6ƒÄ‰D$T鮹XÇC‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu0‹„$ŒHƒø‰„$ŒŒ|‹GƒÇPèó5ƒÄ‰D$<éN¹ ´C‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu'‹„$ŒHƒø‰„$ŒŒ‹OƒÇ‰L$@é÷¹˜´C‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu'‹„$ŒHƒø‰„$ŒŒÅ‹WƒÇ‰T$Dé ¹`ÆC‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu ‰l$dée¹XÐC‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu ‰l$lé%¹\ÐC‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu ‰l$héå¹”þC‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu'‹„$ŒHƒø‰„$ŒŒ¬‹GƒÇ‰D$P釹¤ D‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu ‰l$LéN¹¼D‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ã…Ý‹„$ŒHƒø‰„$ŒŒ‹wƒÇ‰l$X¹°D‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu ÇD$黹 D‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu ÇD$é~¹˜D‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ã…`ÇD$é=¹ŒD‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ã…˜‹„$ŒHƒø‰„$ŒŒ‹wƒÇ‰l$\¹€D‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu ‰l$,鮹tD‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ã…‰\$,éq¹˜ D‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu ‰l$`é5¹Œ´C‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu ‰l$péõ¹˜D‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu‹Å‰D$x‰D$鯹ÇC‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu(‹„$ŒHƒø‰„$ŒŒ|‹OƒÇ‰L$t‰l$ëV¹ì¯C‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ã…!‹„$ŒHƒø‰„$ŒŒ ‹WƒÇ‰T$H‹„$ŒHƒÇƒø‰„$ŒÎùÿÿè› è Pè„ ‹ð‰´$ˆè| Pèp ƒÄ‹ø;ó„| ;û„t ‹l$@;ë…aÿ0¬CPSjjVè9 ƒÄ‹l$D;ë…dÿ0¬CƒÀ PSjjWè ƒÄ‹D$H‹ ÌESPQèâDƒÄ 9\$L„¯SSèh'hbÅh„ DR‰D$`èÁ"‹èƒÄ;ë„G‹\$LSUè5'ƒÄ…À… Ué#‹ ÌE‹ÆPh´CQè*ƒÄ ‹”$€¡ÌERh4ÅCPè‹ ÌEhì³CQèþ‹ÌEhH DRèí¡ÌEh DPèÝ‹ ÌEhèDQèÌ‹ÌEh´DR軡ÌEh€DPè«‹ ÌEhDDQèš‹ÌEƒÄDhDR膡ÌEhÐDPèv‹ ÌEhˆDQèe‹ÌEh0DRèT¡ÌEhôDPèD‹ ÌEhÄDQè3‹ÌEhˆDRè"¡ÌEh\DPè‹ ÌEƒÄ@hDQèþ‹ÌEhäDRèí¡ÌEh¨DPèÝhxD‹ ÌEQèÌ‹ÌEh(DR軡ÌEhDPè«‹ ÌEhÈDQèš‹ÌEhˆDR艃Ä@_^‹Å][ƒÄxÃUjjlVè݃ąÀœýÿÿUÿ4«CéDUjjlW軃ąÀœýÿÿUÿ4«Cé"3ö…ÛvE‹Dõ‹\õPèH ƒÄ…Ûu»hD…Àu¸Y¶CPh\DWèShà®CWè÷FƒÄ;t$Lr»UèuÇD$<éÄ‹l$P;넹PD‹ÅIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;ÃuJ‹ ÌEhDQ芃ĸ™Pè\$‹ðƒÄ‰t$;󅘋 ÌEUhüDQèYƒÄ é>¹ðD‹Å›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu‹ÌEh¼DRè ƒÄ¸Ÿé{ÿÿÿUèÑ#ƒÄ;Ã…jÿÿÿ¡ÌEUh DPèÛƒÄ éÀ‹T$,RVèœ#‹D$PVè‹#ë6‹D$TƒøuSVhŒ€CSè5‹ð‰t$ ëƒø…SSSVè7‹ð‰D$ ƒÄ;óu%‹ ÌEhtDQèm‹ÌERèƒÄ éF9\$Xt‹D$PVè#ƒÄ9\$\t‹L$,QVè#ƒÄ9\$`t SSVèå"ƒÄ 9\$dtSVWèÎ"ƒÄ …À„ô‹t$3Û9\$htT‹ÌEhLDRèêSVè™"ƒÄ…Àu!¡ÌEhDDPèÌ‹ ÌEQè`ƒÄ ë‹ÌEh@DR誃Ä9\$l„Š‹t$V3ÛèA"ƒÄ‰„$€è¼‹è‰l$0…í„Ü詉D$…À„Ë蘉D$ …À„ºè‡‰D$$…À„©èv‰D$(…À„˜èe‰D$4…À„‡‹„$€Pè¼!3ɃÄ=–”Á‹Á…À„q‹T$ ‹D$SRPUVè!ƒÄ…À„TVèv!‹èƒÄ…í„A‹L$$SQVèW!ƒÄPUVèF!ƒÄ…À„‹T$(SRVè)!ƒÄ …À„‹D$4SPVè !ƒÄ …À„ñ‹l$(Uè)‹L$4Q‹ðèƒÀ™ƒâÂÁøƒÄ…Àv‹Ø‹T$RèþƒÀ™ƒâÂÁøƒÄ;Ãv‹Ø‹D$ Pè߃À™ƒâÂÁøƒÄ;Ãv‹Ø‹L$$QèÀƒÀ™ƒâÂÁøƒÄ;Ãv‹ØU襃À™ƒâÂÁøƒÄ;Ãv‹Ø‹l$4U膃À™ƒâÂÁøƒÄ;Ãv‹Øhh„ DSè‹ØƒÄ ‰\$|…Û…ÃhXÎCÿ4«CƒÄ‹D$0…Àt P螃ċD$…Àt PèƒÄ‹D$ …Àt Pè|ƒÄ‹D$$…Àt PèkƒÄ‹D$(…Àt PèZƒÄ‹D$4…Àt PèIƒÄ‹D$|…Àt P褃ċ„$„…Àt Pè҃ąÿt W軃ċD$…Àt Pè`ƒÄ‹D$8_^][ƒÄxËT$0SV¹8Dèqïÿÿ‹T$$SV¹0Dèaïÿÿ‹T$0SV¹(DèQïÿÿ‹T$¹ ÆC‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuý‰¼$éþ¹HÇC‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuý‰¼$ðé¾¹0D‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuý‰¼$¤é~¹`ÆC‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuý‰¼$Œé>¹D‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„ÿ¹0D‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„˹ð/D‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuý‰¼$é–¹hÆC‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuý‰¼$éX¹ D‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuý‰¼$Èé¹äD‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuý‰¼$Äéܹè/D‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuý‰¼$ˆý‰¼$œé•¹Ü/D‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuý‰¼$èéW¹xþC‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuý‰¼$ˆé¹lþC‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuý‰¼$œéÛ¹Ð/D‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu;‹„$”+Å;ʼn„$”ŒR‹CƒÃPÿ8«CƒÄ‰„$ü‰¬$ôép¹Œ´C‹Æd$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ý‰|$hé1¹Ä/D‹ÆëIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ‰l$@éó¹¸/D‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuý‰¼$À鮹¬/D‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ý‰|$Xéq¹¤/D‹ÆëIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuý‰¼$é.¹”/D‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuý‰¼$Üé/D‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ‰l$xé³¹„/D‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu‹ ÌEhd/DQèúûƒÄ‰l$xëb¹\/D‹Æ›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ý‰¼$ìë!FVè þƒÄ…À„·‰D$ ë ý‰¼$¸‹„$”+ŃÃ;ʼn„$”Wïÿÿ‰|$‹L$,‹ÌEjQRè© ƒÄ ƒ|$0‹ø‰|$,t¡ÌEjPjèZQƒÄ è´û‹T$d¡ÌEjL$TQjRPè©0ƒÄ…À…h˜ÈCéÄ‹‹ ÌEPh9¬$u>jWèÃûƒÄ…Àt‹L$Phà®CQè6óƒÄ éZ‹T$hè-DRè¥÷ƒÄéC9¬$¸uWèxûP‹D$hDDPèøòƒÄé9¬$uWèKû‹L$PhDDQèÑòƒÄéõ9¬$èuL‹T$hÐ-DRè±òƒÄ3öèõò…ÀŽË‹|$‹\$IVèÖòW‹Èè‚ãÿÿƒÄFèËò;ð|åé 9¬$…vWè7õ‹ðƒÄ…ö„ü‹|$hè¸CWèEò‹ƒÄƒøu‹F ‹HQWè®óëƒøtu‹V ‹BPWèšóë hиCWè òƒÄh„µCWèÿñVè·ôƒÄ é9¬$ðu,Wè¸ô‹ðƒÄ…ö„‡‹L$VQè\óVè‚ôƒÄ éè9¬$…u‹t$h”$RVè¶ñƒÄPè§ñ‹\$ „$˜Ph¼-DSèxñƒÄhŒ$QVèÞùƒÄPèqñ”$˜Rh¨-DSèFñjVè¢ùhBh4+DPèˆô‹øƒÄ,D$PV‰|$$è8ñƒÄPèoù‹ðVh€-DSèñƒÄ3Û‰|$…ö~>‹ÿ‹L$¶ ‹D$Rh,ÎCPèÜð‹ËƒáƒÄ €ùu‹T$h„µCRèÀðƒÄC;Þ|Äã€yKƒËðCt‹D$h„µCPèšðƒÄ‹t$h|-DVèˆð‹T$ ‹L$$Q‹HQèÌø‹ØShX-DVèfðƒÄ3ö‰|$…Û~AëI‹T$¶‹L$Ph,ÎCQè<ð‹ÖƒâƒÄ €úu‹D$h„µCPè ðƒÄF;ó|Äæ€yNƒÎðFt‹L$h„µCQèúïƒÄ‹t$h|-DVèèï‹D$ T$$RPè=ø‹ØSh0-DVèËïƒÄ3ö‰|$…Û~Fë¤$‹L$¶‹D$Rh,ÎCPèœï‹ÎƒáƒÄ €ùu‹T$h„µCRè€ïƒÄF;ó|Äæ€yNƒÎðFt‹D$h„µCPèZïƒÄ‹L$h|-DQèHïWèÐñƒÄ éf9¬$Œu‹”$¼‹D$`RPWSè©ðƒÄéA9¬$ˆu‹t$h$-DVèƒó‹‹Q‹ë 9¬$œu1‹t$h-DVèbó‹‹Q‹BPVèEõh„µCVèHóƒÄéæ9¬$Ä… ‹D$ L$XQ”$PRPWèçöƒÄ…À„`‹L$ QèìôPèžñ‹T$PhDRèjî‹L$lƒÄ3Û…ÉŽ…‹|$¾„$L+ðI„L0¶+Ñ÷ÚÒƒâ0ƒÂ RPh DWèî‹L$hCƒÄ;Ù|Îé99¬$”…Úƒ¼$¤…Ì‹ ÌEh-DQèáí‹t$\ƒÄ…öu<‹T$,‹D$P‹Œ$Ìhô,DR‹”$ˆP¡ÌEVQRPèç#ƒÄ‰D$T…À„g‹ðƒ>tu è‚ï‰D$ >˜u èkï‰D$ ƒ|$0uh£hØ,Dh`DÿT«CƒÄ ‹L$<‹T$p‹D$ ‹\$T‹t$Q‹L$|R‹T$|PQRèòÜÿÿƒÄ…À„öéR9l$4…õ¡ÌEhÀ,DPè í‹D$tƒÄ…Àt<‹L$,‹T$Ph°,DQ‹Œ$ÜR‹ÌEjQPRè#ƒÄ‰„$˜…À„”‹|$‹´$˜ƒ>tu è¦î‰D$ >˜u èî‰D$ ƒ|$0uh»hØ,Dh`DÿT«CƒÄ ‹D$$‹L$<‹T$pP‹D$|Q‹L$|R‹”$èP‹„$ôQ‹Œ$¤R‹T$8P‹„$˜VQ‹L$pRPQèÙÿÿƒÄ0…À„÷éS9¬$¤…Õ‹ÌEh,DRè ì‹„$ˆƒÄ…À„׋L$,‹T$Ph„,DQRjjP¡ÌEPè"‹ðƒÄ…ö„–‹ ÌEhd,DQèºëƒÄƒ>tu èŸí‰D$ >˜u èˆí‰D$ ‹T$ ‹D$RVPè(ñ‹øV‰¼$è7îƒÄ…ÿ„îðÿÿƒ|$hu‹t$(WVèöðWVèÃìƒÄÇD$héq9¬$ì…dWSè}óƒÄëX‹L$Qèhóë ‹T$RèVó‹ØƒÄS3öè÷êƒÄ…À~%‹|$VSèÛëPhà®CWèëêSFèÒêƒÄ;ð|ßSèóƒÄ‹|$‹\$(E;l$Ž=öÿÿ3ö9´$ô„·Vÿx«C‹È‹„$‹ê™È‹ꉌ$°‰¬$´‹H”$°R‹QRè«òƒÄ …À}ahH,DSèeêÇD$@é hô¸CéXòÿÿh¹C‹ÌERè=ê¡ÌEPèÒéƒÄ éõh ÌCéÜ‹ÌEh(,DRéÒh,DSèê‰t$@éÃ9t$ht ‰t$8é·‹„$¬ƒøuWSèAëƒÄévƒøuWS9t$Ht èíñƒÄé\èëƒÄëRƒøu_„$ Ç„$(tüCÇ„$  ‰„$¬‰¼$°è ñŒ$¬QShæ€C‰„$ÀèÊìƒÄ ;Æ…^ÿÿÿhè+Déÿÿÿh„¸C‹ ÌEQè8éƒÄƒ|$0]t‹ÌERjè›@ƒÄèÑé‹D$lPè©é‹L$(QèÉé‹T$Rè¿é‹D$TPèé‹L$hQèë‹T$(Rèuè‹„$¤Pèhè‹L$lQè‚ë‹”$´Rèuë‹„$,PèDë‹L$HQè4ë‹T$lh>}CRè»è‹D$xh>}CPè¬è‹„$ˆƒÄ<_^[…Àt PèùêƒÄ‹Œ$|‹D$(3Ìè½øÄ€ÃÌÌÌÌÌÌÌÌÌÌ̸@èvøSU3íVW»3ÿ‰\$@ÇD$‰l$8‰l$ÇD$‰l$(‰l$0‰l$4‰l$$‰|$è2ê‹ð‰t$,è-ê‰D$ ;õ„²;Å„¡ÌEÇD$D‰D$HÇD$L€(@;Åu8è/èPè#èƒÄ£ÌE;Åt!ÿ0¬CƒÀ@P¡ÌEjjjPèøç¡ÌEƒÄUPèé ƒÄ…À„(èåçPèÙçƒÄ‰D$;Åu‹ ÌEhX3DQèKçƒÄéù‹\$T‹|$XKƒÇ;Ýަ‹7¹˜´C‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒûŒ–‹WƒÇ‰T$(éM¹T3D‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$é ¹P3D‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„ʹL3D‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„–¹€ÌC‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$8éa¹ì¯C‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒûŒa‹GƒÇ‰D$4é¹ÇC‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒûŒ‹OƒÇ‰L$$é͹D3D‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuèöí‰D$鈹<3D‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuèÎç‰D$éH¹43D‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuèpí‰D$é¹,3D‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuè*í‰D$éȹ$3D‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuèäì‰D$鈹3D‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu èžì‰D$ëK¹ÇC‹ÆëIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu"Kƒû|J‹oƒÇëÇD$KƒÇ…ÛZüÿÿƒûŒ‹T$Rh$ÔCPÿ@«CƒÄ …Àt ƒ|$ù‹ ÌEhü2DQèJã‹ÌEh¸2DRè9ã¡ÌEh`2DPè)ã‹ ÌEh2DQèã‹ÌEhDRèã¡ÌEhèDPè÷â‹ ÌEhì1DQèæâ‹ÌEhìDRèÕâ¡ÌEƒÄ@h¸1DPèÂâ‹ ÌEh1DQè±â‹ÌEh¨DRè â¡ÌEj;j;hdÂCPèŒâ‹ ÌEhH1DQè{â‹ÌEh1DRèjâƒÄ8éèÛâ‹ ÌED$0PjUjQèӃąÀu‹ÌEh˜ÈCRè/âƒÄéÝ‹D$4‹ ÌEjPQè`‹t$4ƒÄ …öuXÿ0¬C‹T$ƒÀ PVjjRè^âƒÄ‹ ÌEjQjèû7ƒÄ …À‹D$$uH…ÀuHè}ê…ÀuY‹ÌEhÒCRè¶áƒÄëC‹D$VjjlPèâƒÄ…À¬Vÿ4«CƒÄéB…ÀtPè®9P¡ÌEhðÑCPèqáƒÄ‹L$‹ÌEQhà0DRèXáƒÄ ƒ|$8tHèƒã‹ð‹D$PVèpãƒÄ…À„ç‹T$‹D$ L$DQVRPèÈéƒÄ…À„ÇVè-ãƒÄë>‹L$‹T$,QRè+ãƒÄ…À„¢‹L$,‹T$D$DP‹D$$QRPèãƒÄ…À„~‹ ÌEQjè68‹t$(‹N‹QƒÄ3À…Ò~ ‹ ‹ƒÁƒêuö‹ÌEPPhÌ0DRè‡à‹D$@‹L$8T$HRhBj‰D$T‹D$,jP‰L$`‹L$-„ÿ…í…÷‹îKƒÇ…Ûðüÿÿ…í„á‹T$,¡ÌEjRPèc‹T$<¡ÌEL$0QjRjPèŠƒÄ …Àu‹ ÌEh˜ÈCQèæÛƒÄéxèQÜPèEÜUj‹ðjlV‰t$4è.܃ąÀuUÿ4«CƒÄéFjjjVè‚ރĉD$…Àu‹ÌEh5DRè„ÛƒÄéVèFÛÇD$$èáÛPèÕۃĉD$…À„î‹t$4…öuNÿ0¬CƒÀ P‹D$VjjPè¡ÛƒÄ‹ÌEjRjè>1ƒÄ …À‹D$u>…Àu>¡ÌEhÒCPèÛƒÄëD‹L$VjjlQè[ۃąÀ¶Vÿ4«CƒÄés…ÀtPèû2‹ ÌEPhðÑCQè½ÚƒÄ‹t$‹V RèeÝP¡ÌEhô4DPèœÚVè¬ÜƒÄ…À„%‹ ÌEQjèù1‹T$,‹D$R‹T$ jjjP‹ÎQRènáƒÄ$…À„ïÇD$(é¡ÌEhÐ4DPè8Ú‹ ÌEh¨4DQè'Ú‹ÌEhh4DRèÚ¡ÌEh4DPèÚ‹ ÌEhØ3DQèõÙ‹ÌEhDRèäÙ¡ÌEhèDPèÔÙ‹ ÌEh´ßCQèÃÙ‹ÌEƒÄ@j;j;hdÂCRè«Ù¡ÌEhpßCPè›Ù‹ ÌEhDßCQèŠÙ‹ÌEhÈ3DRèyÙ¡ÌEh€3DPèiÙƒÄ0‹ ÌEQèúØ‹D$$ƒÄ…Àt PèكċD$_^][…Àt PèúكċD$…Àt Pè«ÛƒÄ‹D$…Àt Pè ÛƒÄ‹D$ƒÄ(ÃÌÌÌVè”Ü‹ð…öt3jj@hXâDèÀájjh˜âD‰Fè¯áƒÄƒ~‰F t…Àt‹Æ^Ã3À^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ3ÀÇ âDÿÿÿÿ£ E£¤E£°E£´EǨâD°5D£¨EǬâD¤5D£¬E£ÈE£¸E£¼E£ÄE£ÌE£ÐE£ÔE£àE£äE£èE£ìEÃÌÌÌÌÌÌÌÌÌÌ¡ÌEh´CDPè$Ø‹ ÌEh„µCQèØ‹ÌEhQh€CDRèýסÌEhTCDPèí׋ ÌEhCDQèÜ׋ÌEhÐBDRèËסÌEh¤BDPè»×‹ ÌEh°5Dh€BDQè¥×‹ÌEƒÄHhðADRè‘סÌEh(ADPè׋ ÌEhè@DQèp׋ÌEh¬@DRè_סÌEh°5Dh|@DPèJ׋ ÌEh<@DQè9׋ÌEh@DRè(סÌEhÀ?DPè׋ ÌEƒÄDhx?DQè׋ÌEh0?DRèóÖ¡ÌEhè>DPèãÖ‹ ÌEh¤>DQèÒÖ‹ÌEhX>DRèÁÖ¡ÌEh>DPè±Ö‹ ÌEh`=DQè Ö‹ÌEh0=DRèÖ¡ÌEƒÄ@høÓPhÄDDUèNÒƒÄé©‹…À…†‹OhDDQè´ÖƒÄUèÅуċt$4…öt'‹D$ PèžÔ‹L$Qè”Ô‹T$$RèŠÔVè0ڃċD$^…Àt PèðڃąÛt SèÝڃċD$(_][…Àt PèÃڃċ$ĤËW‹O ‰D$ ‹G‰T$‰D$‰L$(‹”$¸jjRèÏPèσÄPD$LPè6уąÀ„4L$8QVèÞÙƒÄPT$HjRèî׃ąÀh\DDUèÆÕD$HPè–×ƒÄ éÿÿÿè#Ú‹Ø…Û„æ‹L$…ýÿÿƒøt ƒøÿt3À븀>u!‹ ÔâDQWèeÊUh|HDWèÓŃÄévÆ…Àt!‹ÔâDRWè=ÊUh\HDWè«ÅƒÄéN€}/u ¡ÔâDPWèÊUh@HDWè…ŃÄé(L$QUÿ\«CƒÄ…À}'‹ÔâDRWèãÉUh(HDWèQÅWèëăÄéî‹D$"%ð=@u!‹ ÔâDQWè¬ÉUhHDWèŃÄé½h ®CUèŃĉD$…Àu'‹ÔâDRWèuÉUhøGDWèãÄWè}ăÄ逃=äEu¡ÌEUhìGDPè»ÄƒÄ ƒ=ÌE…Å‹ÅP‹ÿŠ@„Éuù+ƒø~2ºäGDL(ûŠ:u„ÛtŠY:ZuƒÁƒÂ„Ûuä3ÉëɃÙÿ…Étiƒø~kt(ü¹ÜGD‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àt0¹ÔGD‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuhœIDëh<5DWèoȃċ œâD‹T$‹D$QRPèºÄ‹ØƒÄ …Û~e‹l$3ö…Û~@‹Ë+ÎQ.RWè€ÄƒÄ …À$jWèÃ̃ąÀt6¡ÐEhÄGDPèˆÃƒÄëð;ó|À‹ œâD‹T$QURèUÄ‹ØƒÄ …ÛŸ‹D$Pè(ÃÄjjj WèµÃƒÄ…À"jWè^̃ąÀtjjj Wè“ÃąÀ~Þ‹L$jQèæÀƒÄ[^‹ÐEh¼GDRèþ‹D$Pè‚ÅƒÄ …ÿt Wè­ÃƒÄ_¸]ƒÄ<óµA´®A´®A´®A³µA³µAÌÌÌÌÌÌÌÌÌÌÌÌ¡E…À…óWèÛÄ‹ø…ÿu¡ÌEhLJDPè‹ÂƒÄ¡E…À…Æ…ÿ„¾V‹t$9äEu'‹ ÌEVh(JDQèT‹ÌEjjj Rè®ÂƒÄhWèhăąÀtèhÄ£E…Àt#jWVPèCăąÀu¡E…Àt PèăÄÇEƒ=äE^u%¡ÌEh„µCPèØÁ‹ ÌEjjj Qè2ƒÄWèßáEƒÄ_ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$ UV‹t$W3í‹ÿ‹PSèuÅ‹=ðE‹ÇƒÄPŠ@„Éuù‹+Â;Ás‹ÇPëIŠ@„Éuù+Âë‹ÁPWSèËÑ‹‹T$ QSRèm¿ƒÄ…Àt Eƒý r _^]3À[Ãý r_^]3À[Ã_^]¸[ÃÌÌ̸ èFÑ¡œâDUVWh>hJD¾P‰t$3íèAÄ‹øƒÄ ‰|$…ÿu‹ ÌEh ÌCQèÉÀƒÄéwS‹œ$89-¸EtF‰t$9-äEu‹ÌEhøIDRè”ÀƒÄD$Ph~f€Sè½ÉƒÄ …À}‹ ÌEQèÀƒÄ‹ÄER较ă=ØE‹èt h`ÅBj8Uè^¾¡ÐEPjj9U踽ƒÄƒ=ÜEt6‹ ÄEh°¥Aj?Qè}¾¡ÄE‹ÌEh°âDjj@P‰ÄâD葽ƒÄ‹”$<…Òt‹ÂpŠ@„Éuù+ÆPRUèå½ƒÄ Uè*¾U较ÄjS=ÿþ…Ÿèôȃă=ôE‹ðt>L$Qjj!»ÐVÇD$(‰\$,èê¿T$(Rjj#VÇD$8‰\$<èÏ¿ƒÄ ƒ=œEj~"hj Uè̼¡œEjPjUè¼¼ƒÄ ë jj'Vè•¿ƒÄjh j U蛼ƒÄë è=ȃċðƒ=¼Etè$ÈPèf¿VPèÝ¿ƒÄ ‹ðVVUèî¼Uè⼃ă=ÔEt:hà¾BUÇ…Ü軼ƒÄPèòÁ‹ ÐEƒÄQU袼ƒÄPèÓÁƒÄƒ=àEthPÀBUè|¼‹ÐERjjUèó»ƒÄƒ=ØEt h`ÅBj8Uèp¼¡ÐEPjj9UèÊ»ƒÄUÇD$苼‹ØƒÄ‰D$…Û…V‹´$8L$$QS¸ST$8‰D$8‰D$0RFP‰t$D‰\$<è§Í…À|¬u ÿ ¬C…Àt ÿ ¬C…ÀtÇD$D$,PVètÍ…Àt »‰\$ƒ|$„؃=ÀE„{¡œâD™+ÂÑøPWÿ0¬CPÿìªCƒÄPÿ«C‹ØƒÄ 3ö3À…Û~ €<8 uF@;Ã|ôCÿ…À|Š8 0ˆ9€<8 u N 0CÆ9 ƒèyã…öt;hòhðJDhØJDÿT«Cë!‹œâDRWÿ0¬CPÿìªCƒÄPÿ«C‹ØƒÄ ƒ=äE…Î…ÛŽøŠýÿÿÿ$…¿AVWÿ0¬CƒÀ PÿìªCƒÄPÿüªCU讹ƒÄ…Àu­é ýÿÿ¡ÐEh¤JDPè<»ƒÄéñüÿÿ‹ ÐEhœJDQè#»Uèy¹ƒÄ =ÿþ„Ä‹´$8jVè¨ÊVèœÊ骋ÐEhœJDRè事´$@ƒÄjVèzÊVènÊ¡ÌEhÔFDP輺¡ âDƒÄ…À|jPèPÊ‹  âDQè>ÊÇD$õÿÿÿëG‹ÐEh¬GDR躡ÌEPèºƒÄ ëÇD$ë‹ ÐEhœJDQèVºƒÄÇD$[‹ÐEhˆJDRè9ºjU踃ąít UèV¸ƒÄ¡ÐEhtJDP躃ąÿt‹ œâDQWè½Wè…¼ƒÄ ‹t$ …ö|‹ÐEh¼GDRèÛ¹ƒÄ_‹Æ^]Ä Ã2¾A̼A̼A̼A2¾A]¾AJ½A2¾Ax½Ax½Ax½A2¾A]¾AÌÌÌ̸ŒèÆÉ¸¹S3ÛU‰\$ÇD$PQ‰\$X‰\$‰\$@‰\$h‰\$x‰\$4‰L$0‰\$‰œ$€‰\$d‰\$p‰\$T‰\$\‰L$‰\$,‰D$8‰D$l‰œ$„‰\$‰\$`‰\$L‰D$t‰D$|‰\$H‰\$$‰\$<‰\$D‰\$(‰\$ ‰œ$ˆ‰œ$Œ‰Œ$è¶·‹¬$œ‰D$ ‹„$˜£üE‰-˜Eèàÿÿ¡ÌE;ÃuSÿ0¬CƒÀ@Pè×»ƒÄ£ÌESPèþރąÀ„‹„$˜HVƒÅƒøW‰E‰¸E‰¼E‰„$ ¿Œö‹u¹¸OD‹ÆëIŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Äm¹°OD‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ä;¹˜ÆC‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;ÃuN‹„$ HƒøÇ¤E‰„$ Œ³‹MƒÅQÿ8«C‹ÌEPhœODR£Eès·ƒÄéó¹”OD‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;ÃuN‹„$ HƒøÇ¤E‰„$ Œ7‹EƒÅPÿ8«C‹ ÌEPhdODQ£Eè÷¶ƒÄéw¹XOD‹Æd$Š:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu'‹„$ Hƒø‰„$ ŒÁ‹UƒÅ‰T$Hé¹PþC‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu(‹„$ Hƒø‰„$ Œl‹EƒÅ£¨âDéȹLOD‹ÆëIŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu0‹„$ Hƒø‰„$ Œ‹MƒÅQèEƃĉD$@ée¹PÇC‹Æ‹ÿŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu)‹„$ Hƒø‰„$ Œ±‹UƒÅ‰¨Eé ¹,ÇC‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu0‹„$ Hƒø‰„$ ŒZ‹EƒÅPèŽÅƒÄ‰D$t鮹ˆÙC‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu*‹„$ Hƒø‰„$ Œü‹MƒÅ‰Œ$ŒéV¹@OD‹ÆIŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu'‹„$ Hƒø‰„$ Œ¡‹UƒÅ‰T$péþ¹0OD‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu*‹„$ Hƒø‰„$ ŒL‹EƒÅ‰„$€é¦¹$OD‹ÆIŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu0‹„$ Hƒø‰„$ Œñ‹MƒÅQè%ăĉD$|éE¹OD‹Æ‹ÿŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu)‹„$ Hƒø‰„$ Œ‘‹UƒÅ‰°Eéì ¹OD‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu3‹„$ Hƒø‰„$ Œ:‹EƒÅPènÃĉ„$„é‹ ¹OD‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu'‹„$ Hƒø‰„$ ŒÙ ‹MƒÅ‰L$hé6 ¹OD‹ÆIŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu)‹„$ Hƒø‰„$ Œ ‹UƒÅ‰´EéÜ ¹øND‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu ÇD$\é¡ ¹°C‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu'‹„$ Hƒø‰„$ Œï ‹EƒÅ‰D$`éL ¹ìND‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu ƒL$é ¹ÜND‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu ƒL$ éÛ ¹ÐND‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu L$@é  ¹ÈND‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu)‹„$ Hƒø‰„$ Œî ‹MƒÅ‰  EéI ¹ °C‹Æ›Š:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu'‹„$ Hƒø‰„$ Œ‘ ‹UƒÅ‰T$éî ¹ÀND‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;ÃuǸEé± ¹´ND‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu¸£¸E£¼Eéo ¹`ÙC‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;ÃuÇÔEé2 ¹¤ND‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;ÃuÇØEéõ ¹´ýC‹Æ‹ÿŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;ÃuÇÜEé¶ ¹”ND‹ÆIŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu¸£ÜE£ÈâDéq ¹„ND‹ÆŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu<‹„$ HƒøÇÜE‰„$ Œµ ‹EƒÅPÿ8«CƒÄ£ÀâDé ¹xND‹Æd$Š:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãuk‹„$ HƒøÇÜE‰„$ ŒG ‹Mh¼âDh´âDh¸âDƒÅh°âDQ跃ąÀ…ˆ‹ÌEhdNDRèï­ƒÄè³Õÿÿéo¹\ND‹Æ¤$Š:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;ÃuÇàEé&¹TND‹ÆIŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;ÃuÇèEéæ¹LND‹ÆIŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;Ãu ÇD$d騹DND‹ÆëIŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;ÃuÇÀEéf¹ßC‹ÆIŠ:u:ÓtŠP:Qu ÇÏ:Óuæ3ÀëÀƒØÿ;ÃuÇäEé&¹¡ƒÄ é#¡ðEPhüKDQè…¡ƒÄ ‹ÄEjRè ƒÄ9\$¥‹ðƒÄ ;ó…¸þÿÿ¡ÌEhKDPèÓ›ƒÄéX‹ ¤E‹ÄEhÀ»BQRè9š¡ÄEjh¤âDPè!š¡ÈEƒÄ;ĉ‹ ¤EhÀ»BQPèš‹ÈEjh¤âDRè왋 ÈE¡ÐEh¥Aj5Q‰„$¸èµ™¡ÈE”$´RSj6PèÓ˜‹ ÄEh¥Aj5Q茙¡ÄEƒÄ@”$RSj6P觘ƒÄ‹t$;ót4Vèt™‹ ÄEPQèa™ƒÄ 9ÈEtVèV™‹ÈEPRèC™ƒÄ ¡ÐEh¼GDP輚‹L$P‹T$,¿D$`ƒÄQ9ÌEth°¬Aëh°·Ah âDRPèGï‹5ÄE‹=ÐEƒÄè“Êÿÿ‰\$8_^¡ÄE;Ãt PèИƒÄ‹D$H;Ãt Pè뙃ċD$$;Ãt PèÚ™ƒÄ‹D$<;Ãt Pè휃ċD$D;Ãt PèÜœƒÄ‹D$;Ãt P蛜ƒÄ‹D$L;Ãt P芜ƒÄ¡ÈE;Ãt PèX˜ƒÄ‹D$ ;Ãt Pès™ƒÄ‹D$(;Ãt P膜ƒÄ¡ÐE;ÃtP膙ƒÄ‰ÐE‹D$0][ÄŒÃÌÌÌÌÌÌÌÌÌÌÌÌ¡ÌEhìWDPè„™‹ ÌEh„µCQès™‹ÌEhÄWDRèb™¡ÌEhœWDPèR™‹ ÌEh”WDhˆWDhLWDQè7™‹ÌEhWDRè&™¡ÌEhÔVDP虋 ÌEƒÄ@hè@DQ虋ÌEh˜VDRèñ˜¡ÌEhdVDPèᘋ ÌEh,VDQèИ‹ÌEh@DR还¡ÌEhˆƒÄ‰„$¼;Å…4¡ÌEhè]DPèž~ƒÄƒ¼$ ‹|$t‹5 Ej‹ÏèºèÿÿƒÄ…ÿt Wè£|ƒÄ‹D$x…Àt PèÎ|ƒÄ‹„$€…Àt Pèæ}ƒÄ‹D$t…Àt Pèù€ƒÄ‹|$(‹\$‹t$<]‹D$h…Àt Pè«€ƒÄ…öth Vè)Vè“€ƒÄ …ÿth WèWè{€ƒÄ …Ûth Sèù€Sèc€ƒÄ ¡ E_^[…ÀtPè}ƒÄÇ E‹Œ$à‹D$l3ÌèŽÄäáÌE‹ÖRh´CPè‡}ƒÄ èëãÿÿéßþÿÿ‹”$À¡ÌEUL$pQURPè첃Ä…Àu‹ ÌEh˜ÈCQé¥þÿÿ‹„$¤‹\$4;Åu ‹Ã;Ý„€‹T$l‹Œ$¸hÄ]DVR‹ÌEUQPRèJ³ƒÄ‰D$t;Åu¡ÌEPè˜|ƒÄéUþÿÿ;Ýt=‹Œ$¨‹ÌEh¬]DVUQSRèl™ƒÄ‰„$€;Åu¡ÌEPèW|ƒÄéþÿÿ‹ ÌEjQUè¼ÒƒÄ …À‹D$,u#;Åu#è>……Àu4‹ÌEhÒCRèw|ƒÄë;ÅtPè”ÔP¡ÌEhðÑCPèW|ƒÄ9- Eu@9-$Et 9- Eu9-Eu胅Pè›|ƒÄëUÿ0¬CƒÀ PèJƒÄ£ E‹L$Qè¸z‹èƒÄ‰l$x…íu‹ÌERè‰{ƒÄéFýÿÿ‹´$¼…ötAVUè÷zƒÄ…Àu*¡ÌEhˆ]DPè>€‹ ÌEQèL{Vè…ƒÄéýÿÿV腃ă¼$œjt ‹D$ ÿPë‹T$Rj Uè yƒÄ9|$`ujjj)Uè÷xƒÄƒ¼$°th`¿BUèçyƒÄ‹D$d…Àt2PUè½yƒÄ…Àu$¡ÌEh\KDPè{‹ ÌEQè®zƒÄ éküÿÿ‹T$LhÀ»BRUè|y‹„$€‹Œ$ŒPQUèlÀƒÄ…À„:üÿÿ‹T$H‹D$DRPUècyƒÄ …Àt UèPyƒÄ…Àu‹ ÌEQèEzƒÄUè&x‹T$$RPèUz‹t$DƒÄ …öt.¡ÌEhâAj5U‰„$ÔèÕxŒ$ÔQjj6Uè÷wƒÄUèrx‹¼$ƒÄ‹Ø‰\$…ÿt|h ®CWè-z‹ðƒÄ…öu%W‹ÌEhl]DRèz¡ÌEPè­yƒÄéjûÿÿjjjVh€GDhæwCèaƒV‹øè·yƒÄ…ÿu ‹Œ$ŒQë­WSèëxWèßx‹t$DƒÄ …öt7Vjj7Sè7wƒÄ…Àu%‹ ÌEh@]DQè›y‹ÌERè/yƒÄ éìúÿÿ‹D$`¿L$\‹T$@PQRD$0Pèé̓Ä…À„à ë‹l$x‹\$‹L$$‹ E‹¼$„Qh,]DR¾è6yƒÄ ƒ=Et9¡ EhøIDP‰´$èy‹T$,Œ$Qh~f€Rè8‚ƒÄ…ÀŒîûÿÿöEt‰³ÜSè8wƒÄj=ÿþ…É‹D$(Pè ‚ƒÄŒ$ÄQ”$ä‹ð‹D$(RPècˆ…ÀŒM Œ$àQjj VèõxƒÄƒ¼$´tGT$dRjj!VÇD$tÇD$xÐèÉxD$tPjj#VÇ„$„Ç„$ˆÐè¤xƒÄ j…ÿ~hj Sè¦ujWjSè›uƒÄ ëjj'VètxƒÄë‹L$(Qè)ƒÄ‹ðƒ¼$”tèPèQxVPèÈxƒÄ ‹ðƒ= Et%hà¾BVǃÜè÷z‹ ERVèäzƒÄƒ=EthPÀBSèu¡ EPjjSèuƒÄƒ=Et!h`ÅBj8Sè‚u‹ EQjj9SèÛtƒÄƒ=Et-jjjASèÃth`çAj?Uèšu‹ ERjj@Uè½tƒÄ,‹|$VVWè uWèvWèv»ÉD$`3À‰D$$‰D$4‰D$@‰D$L‰D$H‹D$DƒÄ‹ë‰l$D‰\$;Ã…ð3Ûè€Pè1w‹øVWè¦w‹l$$ƒÄ h UWè—yƒÄ ƒø~€}-tæh]DWèŠvjjj WèêvƒÄ¤$‹D$h PWèXy‹L$$h]DQ‹èÿ|«CƒÄ…Àt»ƒý~ ‹T$€z-tÃjjj Wè—vWè‘WèïuƒÄ…Ûu¡ÌEhÈ\DPèvƒÄh¼\DVèúu‹L$0h QVèÔv‹l$XƒÄ‹ÝéXƒøu3‹T$h RVè±vh´\DVè¼u‹D$h˜[DWÿ|«CƒÄ…À…š‹|$h WVèÆth¬[DWÆ8ÿ|«CƒÄ…ÀtÂhd[DVèºs‹|$0h WVè”thX[DWÆ8ÿ|«CƒÄ…À„=‹T$Æd$‹t$3ÿV‰¼$܉¼$àè¨qƒÄ©0tWWj VèÚpƒÄ…Àu ÇD$péÖƒ|$p¿„ƃ|$PÇD$ptc‹D$Ph”ÈCPès‹ðƒÄ…öt3‹L$jjjjjQè·pƒÄPVh€GDh~vCèû{Vè­rƒÄ(ë‹T$P¡ÌERh8[DPèÃrƒÄ ‹L$X‹5 EQ‹L$èèÜÿÿƒÄƒ|$X~ÿL$Xƒ|$0t ‹T$¡ÌERh ýCPè‚rƒÄ ÇD$0ƒ|$T…}‹t$…öt‹L$Qè°pƒÄ…À…™…ÿt ƒ|$…Õ…öt,ƒ¼$Ø@s"‹T$Rè2q‹Œ$܃ĉ„ŒÜÿ„$Ø…Ût,ƒ¼$Ü@s"‹T$Rèq‹Œ$àƒÄ‰„Œàÿ„$܃|$un„$ÜŒ$Ø…ítB”$ÐR‹T$PjPQRÇ„$äÇ„$èèO‹ð…öu$ÿ ¬C…À„þÿÿë‹T$LjjPQRè)‹ð…öŒR‹t$„$ÜPVècpƒÄPèþ€…À„ï‹L$<‹|$ ‹T$,WÑR‹ÆPèo‹L$ ‹ðVQèoƒÄƒø‡“ýÿÿÿ$…È Bt$,+þ‰|$ …öŽcòÿÿ…ÿ ½3Ûéjýÿÿ3í]é`ýÿÿ‹ Eh([DRèÓpƒÄ»3íé@ýÿÿ¡ Eh[DPè´pƒÄ3Û‰\$ÇD$éýÿÿ‹ Eh[DQèpƒÄéýÿÿ…ÿ…ƒo3Ûéïüÿÿ…ö…Š…ÿ…‚n3ÛéÕüÿÿƒ|$t\‹T$(‹t$8‹D$4ÂVPÿ0¬CƒÀ PÿìªCƒÄPÿüªCƒÄ …ÀŽ`D$4+ð‰t$8…ö‡üÿÿÇD$ÇD$érüÿÿŒ$ØQVèònƒÄPè…À…!ÿ ¬C…À„Eüÿÿƒ¼$˜„‹|$ Bd B Ba B½ B2 BN BVèro‹ð…ötxjjhXôDè€tjjAh€ôD‰Fèotjj@hÈôD‰Fè^tjjhlôD‰F èMtjj@hõD‰Fè¡ÌEjjj Pèr>hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~@‹L$ ‹¼ ˆ‹÷‰|$jèKHP‹D$‹ˆúDj”$Ì!R‹T$4QRè%HƒÄƒïuÑh EƨEÿ€«C·Ø E· ˜ E+ȉL$‹ E¡” EÛD$ƒÄ+Ð EÜ5(aDÔ E‰T$(‰D$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸èKMÝ$‹0úD¡ÌERVQPèø<ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄûXE‰D$ ÚˆúDÝ[øŒyþÿÿƒ¼$(„š»€EÇD$ ƒ=¬E‹D$ ‹ˆúD‹¼°¸`aDu¸8aD‹ÌEQ‹ 8úDWQPRèu<¡ÌEjjj PèÐ<hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~F‹L$ ‹¼ °‹÷‰|$›jè—FP‹D$‹ˆúDj”$¼!R‹T$4QRè}FƒÄƒïuÑh EƨEÿ€«C·Ø E· ˜ E+ȉL$‹ E¡” EÛD$ƒÄ+Ð EÜ5(aDÔ E‰T$(‰D$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸è£KÝ$‹8úD¡ÌERVQPèP;ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄû¨E‰D$ ÚˆúDÝ[øŒsþÿÿƒ¼$,„ª»¨EÇD$ Iƒ=¬E‹D$ ‹ˆúD‹¼Ä¸`aDu¸8aD‹ÌEQ‹ <úDWQPRèÊ:¡ÌEjjj Pè%;hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~S‹L$ ‹¼ Ä‹÷‰|$ë ¤$‹ÿjhdÉCèÌ<ƒÄP‹D$‹ˆúDj”$ì!R‹T$4QRèÅDƒÄƒïuÉh EƨEÿ€«C·Ø E· ˜ E+ȉL$‹ E¡” EÛD$ƒÄ+Ð EÜ5(aDÔ E‰T$(‰D$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸èëIÝ$‹<úD¡ÌERVQPè˜9ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄûÐE‰D$ ÚˆúDÝ[øŒfþÿÿƒ¼$0„üŒ$PQèg<ƒÄjè™<Pj”$\høgDRèB<ƒÄ»ÐEÇD$ ƒ=¬E‹D$ ‹ˆúD‹¼Ø¸`aDu¸8aD‹ÌEQ‹ @úDWQPRèæ8¡ÌEjjj PèA9hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~i‹L$ ‹¼ Ø‹÷‰|$¤$jjj”$\jRè‘;‹D$ ‹ˆúD‹T$8QR„$lPèÖBjŒ$ô!Q”$xRèK;ƒÄ,ƒïu¯h EƨEÿ€«C·Ø E· ˜ E+ȉL$‹ E¡” EÛD$ƒÄ+Ð EÜ5(aDÔ E‰T$(‰D$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸èñGÝ$‹@úD¡ÌERVQPèž7ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄûøE‰D$ ÚˆúDÝ[øŒPþÿÿŒ$PQè]:ƒÄƒ¼$4„•»øEÇD$ ƒ=¬E‹D$ ‹ˆúD‹¼ì¸`aDu¸8aD‹DúDQWRP¡ÌEPè 7‹ ÌEjjj Qèe7hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~@‹T$ ‹¼ì‹÷‰|$jè¦9‹L$‹‘úDPj„$"P‹D$4RPèAƒÄƒïuÑh EƨEÿ€«C· Ø E·˜ E+щT$¡ E‹ ” EÛD$ƒÄ+Ð EÜ5(aD Ô E‰D$(‰L$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸è>FÝ$‹DúD¡ÌERVQPèë5ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄû E‰D$ ÚˆúDÝ[øŒyþÿÿƒ¼$|„“»È EÇD$ ƒ=¬E‹D$ ‹ˆúD‹¼T¸`aDu¸8aD‹ÌEQ‹ ŒúDWQPRèh5¡ÌEjjj PèÃ5hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~?‹L$ ‹¼ T‹÷‰|$ë¤$‹D$ ‹ˆúD”$"R‹T$(QRèe?ƒÄ ƒïuÛh EƨEÿ€«C·Ø E· ˜ E+ȉL$‹ E¡” EÛD$ƒÄ+Ð EÜ5(aDÔ E‰T$(‰D$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸èDÝ$‹ŒúD¡ÌERVQPèJ4ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄûð E‰D$ ÚˆúDÝ[øŒzþÿÿƒ¼$€„’»ð EÇD$ ƒ=¬E‹D$ ‹ˆúD‹¼h¸`aDu¸8aD‹ÌEQ‹ úDWQPRèÇ3¡ÌEjjj Pè"4hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~>‹L$ ‹¼ h‹÷‰|$뛋D$ ‹ˆúD”$8#R‹T$(QRè¿=ƒÄ ƒïuÛh EƨEÿ€«C·Ø E· ˜ E+ȉL$‹ E¡” EÛD$ƒÄ+Ð EÜ5(aDÔ E‰T$(‰D$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸èýBÝ$‹úD¡ÌERVQPèª2ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄû E‰D$ ÚˆúDÝ[øŒ{þÿÿƒ¼$8„”» EÇD$ ƒ=¬E‹D$ ‹ˆúD‹¼¸`aDu¸8aD‹ÌEQ‹ HúDWQPRè'2¡ÌEjjj Pè‚2hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~@‹L$ ‹¼ ‹÷‰|$jè7<P‹D$‹ˆúDj”$ü!R‹T$4QRè5<ƒÄƒïuÑh EƨEÿ€«C·Ø E· ˜ E+ȉL$‹ E¡” EÛD$ƒÄ+Ð EÜ5(aDÔ E‰T$(‰D$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸è[AÝ$‹HúD¡ÌERVQPè1ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄûH E‰D$ ÚˆúDÝ[øŒyþÿÿƒ¼$<„’»H EÇD$ ƒ=¬E‹D$ ‹ˆúD‹¼¸`aDu¸8aD‹ÌEQ‹ LúDWQPRè…0¡ÌEjjj Pèà0hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~=‹L$ ‹¼ ‹÷‰|$›‹D$$‹T$ PP‹‚úDPŒ$ Qèr:ƒÄƒïuÚh EƨEÿ€«C·Ø E·˜ E+‰D$‹ E‹” EÛD$ƒÄ+ Ð EÜ5(aDÔ E‰L$(‰T$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸è»?Ý$¡LúDPVQ‹ ÌEQèh/ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄûp E‰D$ ÚˆúDÝ[øŒ{þÿÿƒ¼$@„›»p EÇD$ ƒ=¬E‹D$ ‹ˆúD‹¼(¸`aDu¸8aD‹PúDQWRP¡ÌEPèæ.‹ ÌEjjj Qè@/hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~G‹T$ ‹¼(‹÷‰|$›‹T$ j„$¬!P‹‚úDŒ$ QP‹D$4PPèÂ8ƒÄƒïuÐh EƨEÿ€«C· Ø E·˜ E+щT$¡ E‹ ” EÛD$ƒÄ+Ð EÜ5(aD Ô E‰D$(‰L$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸è>Ý$‹PúD¡ÌERVQPè¿-ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄû˜ E‰D$ ÚˆúDÝ[øŒrþÿÿƒ¼$D„¨»˜ EÇD$ ‹ÿƒ=¬E‹D$ ‹ˆúD‹¼<¸`aDu¸8aD‹ÌEQ‹ TúDWQPRè:-¡ÌEjjj Pè•-hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~Q‹L$ ‹¼ <‹÷‰|$j”$¬!R„$!P‹D$Œ$” Q‹ˆúD‹D$4”$ RQPPè7ƒÄ ƒïuÀh EƨEÿ€«C·Ø E·˜ E+‰D$‹ E‹” EÛD$ƒÄ+ Ð EÜ5(aDÔ E‰L$(‰T$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸è\<Ý$¡TúDPVQ‹ ÌEQè ,ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄûÀ E‰D$ ÚˆúDÝ[øŒgþÿÿƒ¼$`„œ»° EÇD$ ƒ=¬E‹D$ ‹ˆúD‹¼È¸`aDu¸8aD‹púDQWRP¡ÌEPè‡+‹ ÌEjjj Qèá+hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~H‹T$ ‹¼È‹÷‰|$¤$‹T$ j„$Œ!P‹‚úDŒ$8QP‹D$4PPèV5ƒÄƒïuÐh EƨEÿ€«C· Ø E·˜ E+щT$¡ E‹ ” EÛD$ƒÄ+Ð EÜ5(aD Ô E‰D$(‰L$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸è²:Ý$‹púD¡ÌERVQPè_*ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄûØ E‰D$ ÚˆúDÝ[øŒqþÿÿƒ¼$d„¢»Ø EÇD$ ‹ÿƒ=¬E‹D$ ‹ˆúD‹¼Ü¸`aDu¸8aD‹ÌEQ‹ túDWQPRèÚ)¡ÌEjjj Pè5*hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~L‹L$ ‹¼ Ü‹÷‰|$ë ¤$‹ÿ‹L$ j”$Œ!R‹‘úD„$HP‹D$0RPPè¦3ƒÄƒïuÐh EƨEÿ€«C·Ø E· ˜ E+ȉL$‹ E¡” EÛD$ƒÄ+Ð EÜ5(aDÔ E‰T$(‰D$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸è9Ý$‹túD¡ÌERVQPè¯(ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄû E‰D$ ÚˆúDÝ[øŒmþÿÿƒ¼$h„¢3À» E‰D$ ë‹ÿ‹D$ ƒ=¬E‹ˆúD‹¼ð¸`aDu¸8aD‹ÌEQ‹ xúDWQPRè*(¡ÌEjjj Pè…(hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~L‹L$ ‹¼ ð‹÷‰|$ë ¤$‹ÿ‹L$ j”$Œ!R‹‘úD„$@P‹D$0RPPèö1ƒÄƒïuÐh EƨEÿ€«C·Ø E· ˜ E+ȉL$‹ E¡” EÛD$ƒÄ+Ð EÜ5(aDÔ E‰T$(‰D$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸èR7Ý$‹xúD¡ÌERVQPèÿ&ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄû( E‰D$ ÚˆúDÝ[øŒmþÿÿƒ¼$„„§» EÇD$ ‹ÿƒ=¬E‹D$ ‹ˆúD‹¼|¸`aDu¸8aD‹ÌEQ‹ ”úDWQPRèz&¡ÌEjjj PèÕ&hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~P‹L$ ‹¼ |‹÷‰|$ë ¤$‹ÿ‹L$ j”$Œ!R‹‘úD‹L$,„$8P‹D$DRPQè<0ƒÄƒïuÌh EƨEÿ€«C·Ø E·˜ E+‰D$‹ E‹” EÛD$ƒÄ+ Ð EÜ5(aDÔ E‰L$(‰T$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸è5Ý$¡”úDPVQ‹ ÌEQèJ%ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄû@ E‰D$ ÚˆúDÝ[øŒhþÿÿƒ¼$ˆ„¡»@ EÇD$ ƒ=¬E‹D$ ‹ˆúD‹¼¸`aDu¸8aD‹˜úDQWRP¡ÌEPèÈ$‹ ÌEjjj Qè"%hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~M‹T$ ‹¼‹÷‰|$뛋T$ j„$Œ!P‹‚úD‹T$,Œ$HQ‹L$DPQRèŒ.ƒÄƒïuÌh EƨEÿ€«C·Ø E· ˜ E+ȉL$‹ E¡” EÛD$ƒÄ+Ð EÜ5(aDÔ E‰T$(‰D$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸èî3Ý$‹˜úD¡ÌERVQPè›#ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄûh E‰D$ ÚˆúDÝ[øŒlþÿÿƒ¼$Œ„£»h EÇD$ ƒ=¬E‹D$ ‹ˆúD‹¼¤¸`aDu¸8aD‹ÌEQ‹ œúDWQPRè#¡ÌEjjj Pès#hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~N‹L$ ‹¼ ¤‹÷‰|$ë¤$‹L$ j”$Œ!R‹‘úD‹L$,„$@P‹D$DRPQèÜ,ƒÄƒïuÌh EƨEÿ€«C·Ø E·˜ E+‰D$‹ E‹” EÛD$ƒÄ+ Ð EÜ5(aDÔ E‰L$(‰T$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸è=2Ý$¡œúDPVQ‹ ÌEQèê!ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄû E‰D$ ÚˆúDÝ[øŒjþÿÿƒ¼$H„»À EÇD$ ƒ=¬E‹D$ ‹ˆúD‹¼P¸`aDu¸8aD‹XúDQWRP¡ÌEPèh!‹ ÌEjjj QèÂ!hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~I‹T$ ‹¼P‹÷‰|$뛋T$ j„$Œ!P‹‚úDŒ$0 QP‹D$4PPè*+ƒÄƒïuÐh EƨEÿ€«C· Ø E·˜ E+щT$¡ E‹ ” EÛD$ƒÄ+Ð EÜ5(aD Ô E‰D$(‰L$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸è’0Ý$‹XúD¡ÌERVQPè? ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄûè E‰D$ ÚˆúDÝ[øŒpþÿÿƒ¼$P„¢3À» E‰D$ ë‹ÿ‹D$ ƒ=¬E‹ˆúD‹¼x¸`aDu¸8aD‹ÌEQ‹ `úDWQPR躡ÌEjjj Pè hÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~L‹L$ ‹¼ x‹÷‰|$ë ¤$‹ÿ‹L$ j”$Œ!R‹‘úD„$ P‹D$0RPPèt)ƒÄƒïuÐh EƨEÿ€«C·Ø E· ˜ E+ȉL$‹ E¡” EÛD$ƒÄ+Ð EÜ5(aDÔ E‰T$(‰D$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸èâ.Ý$‹`úD¡ÌERVQPèÛD$(‹D$$ƒÀÜt$0ƒÃƒÄû8 E‰D$ ÚˆúDÝ[øŒmþÿÿƒ¼$X„¢»` EÇD$ ‹ÿƒ=¬E‹D$ ‹ˆúD‹¼ ¸`aDu¸8aD‹ÌEQ‹ húDWQPRè ¡ÌEjjj PèehÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~L‹L$ ‹¼  ‹÷‰|$ë ¤$‹ÿ‹L$ j”$Œ!R‹‘úD„$P‹D$0RPPè¾'ƒÄƒïuÐh EƨEÿ€«C·Ø E· ˜ E+ȉL$‹ E¡” EÛD$ƒÄ+Ð EÜ5(aDÔ E‰T$(‰D$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸è2-Ý$‹húD¡ÌERVQPèßÛD$(‹D$$ƒÀÜt$0ƒÃƒÄûˆ E‰D$ ÚˆúDÝ[øŒmþÿÿƒ¼$\„¢»ˆ EÇD$ ‹ÿƒ=¬E‹D$ ‹ˆúD‹¼´¸`aDu¸8aD‹ÌEQ‹ lúDWQPRèZ¡ÌEjjj PèµhÐ EƨEÿ€«C3öƒÄ(‰t$ǤE…ÿ~L‹L$ ‹¼ ´‹÷‰|$ë ¤$‹ÿ‹L$ j”$Œ!R‹‘úD„$ÀP‹D$0RPPè&ƒÄƒïuÐh EƨEÿ€«C·Ø E· ˜ E+ȉL$‹ E¡” EÛD$ƒÄ+Ð EÜ5(aDÔ E‰T$(‰D$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹´aDu¹ aD¸è‚+Ý$‹lúD¡ÌERVQPè/ÛD$(‹D$$ƒÀÜt$0ƒÃƒÄû° E‰D$ ÚˆúDÝ[øŒmþÿÿƒ¼$x„À‹\$@ÇD$  E¿úDƒ|$<„‹L$<‹RèÇ‹ƒÄƒ=¬E£ˆúD¹`aDu¹8aDRSP¡ÌEQP蟋 ÌEjjj Qèù”$tRè¦$‹L$d‹t$tƒÄ(„$ˆ!PhÔ`Dj”$\QR…ötèt$ëèg$ƒÄ„$PjPèhÐ EƨEÿ€«C¡úD‹¯ÃÀÀ™ƒÄ ÷ùǤE…öt\3ö‰t$…À~6‹D$$QPL$QP”$`Rèø#¡úD‹¯ÃÀÀ™÷ùFƒÄ;ð|Ήt$‹L$$D$ PQ”$XRè¾#éW3ö‰t$…À~6‹D$$QPL$QP”$`Rè#¡úD‹¯ÃÀÀ™÷ùFƒÄ;ð|Ήt$‹L$$D$ PQ”$XRèV#ƒÄ h EƨEÿ€«C·Ø E· ˜ E+ȉL$D‹ E¡” EÛD$DƒÄ+Ð EÜ5(aDÔ E‰T$(‰D$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØŒ$PÝ\$QèÏ"ƒÄƒ|$4„/‹T$4‹P赋ƒÄƒ=¬E£ˆúD¹`aDu¹8aDRSPQ‹ ÌEQ茋ÌEjjj RèæhÐ EƨEÿ€«C¡úD‹¯ÃÀÀ™÷ù3öƒÄ(‰t$ǤE…À~9‹D$4jP‹D$,j”$„#RQPè¤"¡úD‹¯ÃÀÀ™÷ùFƒÄ;ð|ˉt$h EƨEÿ€«C· Ø E·˜ E+щT$D¡ E‹ ” EÛD$DƒÄ+Ð EÜ5(aD Ô E‰D$P‰L$Tßl$PÞÁÝ aDØÑßàöÄAuÝÙëÝØÝ\$ƒ=¬E¹´aDu¹ aD¸èµ'ÝD$ ‹ˆúDÝ$¡ÌERVQPè^ÛD$(‹D$,ƒÇÜt$0ƒÀƒÄÿ0úD‰D$ÚOüÝXøŒQüÿÿ‹t$$j$VèƒÄ3Ûƒ|œh„ý‹„œ‹T$8PŒ$QRj$Vjrèî ƒÄ…Àu,¡ÌEhÈgDPèá‹ ÌEQèuƒÄ ÇD$ 顃=¬E‹ ¸úD‹¼Ü¸ŒaDu¸paD‹ÌEhpnDhÀgDQWPRè‹¡ÌEjjj PèæhÐ EƨEÿ€«C3öƒÄ,‰t$ǤE…ÿŽc‹|$8ëI‹„œ‹T$$PŒ$QWj$Rjrè ƒÄ…Àt F;´Ü|Ðë$¡ÌEh¬gDPè‹ ÌEQè–ƒÄ ¾‰t$h EƨEÿ€«C·Ø E·˜ E+‰D$D‹ E‹” EÛD$DƒÄ+ Ð EÜ5(aDÔ E‰L$P‰T$Tßl$PÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹˜gDu¹tgD¸è—%Ý$‹¸úDPVQ‹ ÌEQèBÛD$(‹ÓƒÄÜ|$Áâ‰t$ ‹t$$Ýš E‹„œ‹L$8P‹„$PQj$VjrèõƒÄ…À,‹ÌEh@gDRèí¡ÌEPè‚ƒÄ ÇDœh阃=¬E‹ ¸úD‹¼Ü”¸ŒaDu¸paDhpnDh8gDQ‹ ÌEWPQ蘋ÌEjjj RèòhÐ EƨEÿ€«C3öƒÄ,‰t$ǤE…ÿŽ_‹|$8‹„œ‹L$$P‹„$PWj$Qjrè%ƒÄ…À~ F;´Ü”|Ðë$‹ÌEh$gDRè¡ÌEPè¦ƒÄ ¾‰t$h EƨEÿ€«C· Ø E·˜ E+щT$D¡ E‹ ” EÛD$DƒÄ+Ð EÜ5(aD Ô E‰D$(‰L$,ßl$(ÞÁÝ aDØÑßàöÄAuÝÙëÝØƒ=¬EÝT$¹gDu¹ìfD¸è¨#Ý$‹¸úD¡ÌERVQPèTÛD$(‹t$<‹ËÜ|$0ƒÄÁáÝ™˜ Eƒ|$ Cƒû}º+Ó|œh3À‹Êó«ÚCƒûŒîûÿÿjVèòƒÄ貃øtj@h`DèÙƒÄÇ E3Ûƒ|œ\„ù‹„œP‹D$Ý$‹\$$ShøqDÿÖjÿ׋ȡüE‰T$<™÷ûP¡¼ûD+ÅÁPSh°qDÿÖƒÄ0ë‹=x«CöE„ÍhˆqDÿÖjèôúÿÿ‹ðƒÄ…öuhlqDÿ0¬CƒÀ@Pÿ(«CƒÄ錡øE…Àt\Ph@rDL$(h Qè¨óD$0ƒÄP›Š@„Éuù+ÂPT$$RVè)ðƒÄ ë›h D$$PVè\ðƒÄ …ÀéjVèçïƒÄjVèñƒÄPè©VèñƒÄPè”3íU‰l$ÿ׋ ¼ûDh`qD‰T$$ÿ,«Ch¸E‰-üEÿ€«CUÿ׃Ä;ØŒEVèøùÿÿƒÄ…À„«¡øE…ÀtqPh@rDT$(h RèÇòD$0ƒÄPëIŠ@„Éuù+ÂPD$$PVèIïh L$0QVè‡ïƒÄ…À~!d$üEh T$$RVèfïƒÄ …ÀãjVèñîƒÄjVèðƒÄPè³VèðƒÄPèžjjjVEèsîƒÄ…Àt¿rë6Vè7ïƒÄ=u¿të=u¿3ë3Ƀø”Á Í*‹ùÿ0¬CƒÀ PWÿ„«Cÿ0¬CƒÀ Pÿ«Cjÿx«CƒÄ;ØÅþÿÿ‹=x«C‰l$jèøÿÿÜ0aDÛD$‹üEƒÄRØñ¸è‚¸Ý$èuÝ$UhøqDÿ,«Cjÿ׋ȡüE‰T$<™÷ýP¡¼ûD+ÃÁPUh°qDÿ,«CƒÄ0ÇD$…öt VèîƒÄ_]¡ðE…ÀtPèFîƒÄÇðE‹Œ$ ‹D$ ^[3ÌèÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌSV‹t$ Š€ûD„]€ûd„T€ûT„C€ût„:€ûP„)€ûp„ €ûN„€ûn„€ûS„õ€ûs„ì€û1„Û¹ðvD‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„§¹èvD‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àtw¹ävD‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀtG¹àvD‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àt€ûEt €ûet^3À[Ã^¸[Ã^¸[Ã^¸[Ã^¸[Ã^¸[Ã^¸[Ã^¸[ÃÌÌÌÌÌÌÌÌÌÌV‹t$‹ÆP›Š@„Éuù+ÂH…À~#‹ÿŠ 0€ù/t€ù\t €ù:tH…ÀéëL0…Éu‹Î‹ÁpŠ@„Òuù+ƋЃú~.€| ü.u'ŠD ý„ØŠ„À„΋ÿ< t< t< u ŠFF„Àuìé³€>„ª‹_;ë|F‹h‚ƒÃhøvDPQèr÷ƒÄ…À„“;뉉_‹Å}d$‹Ç‚@;G|ñ‹‰4¨ŠE<'t$<"t „ÀtŠ< t< t < tF€>uì€>u#Në#‹ÿDªü¾ÈDªüF€>t ¾;ÁtF€>uóÆF€>…(ÿÿÿ‹L$‹D$ ‰)‹_^]‰¸[Ã_^]3À[ÃÌÌÌÌÌS‹\$ VWjjSèìƒÄPèòë‹t$h ¹CV‹øèOðWVèHðWèJîƒÄ jjSè+ôƒÄPè¾ëhwDV‹øèðWVèðh„µCVè ðWèîƒÄ(_^3À[ÃÌÌÌÌ‹D$PèJöPè>öƒÄÿЃÄÃÌÌÌÌÌÌÌVW‹|$WèFö‹t$ƒÄ¨tCVè/öƒÄ…Àt6WèöHƒÄƒøw'Vèö‹ƒÄ…Àt€8tPWVèñõƒÄ _¸^ÃWVèÓõPèÓõƒÄÿЃÄ_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌVW‹|$WèÆõ‹t$ƒÄ¨t8Vè¯õƒÄ…Àt+WèœõHƒÄƒøwVè“õ‹ƒÄ…Àt €8t_¸^ÃWVè^õPè|õƒÄÿЃÄ_^ÃÌÌÌÌÌÌÌÌÌ‹D$Pè:õPè^õƒÄÿЃÄÃÌÌÌÌÌÌÌhwDèbõhPBP£EèLõ¡EhpBPè6õ‹ EhðBQèõ‹Eh`ŽBRèõƒÄ$3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ¡E…ÀtPèõƒÄÇEÃÌÌ̸èöù‹D$SVW3ÿ3ÛÇD$ …ÀtJ‹…Ét‹Ù‹@…Àt‹ø…Ût5‹ÃPëIŠ@„Éuù+‹ð‹D$;ð~‹ð‹D$VSPèßùƒÄ _‹Æ^[YË EQè¥ô‹ðƒÄ…ö„AUWh\wDV3ÛèƒôSSj‹øjV‰|$Dèkô‹l$8hÿjUjWVèPô‹øƒÄ8…ÿŒ9\$ t1‹T$h5høvDRè=ìUhÿj‹Ø‹D$‹50¬CSjSÿÖPÿL«CÿÖPSjjWèiãƒÄ ‹D$(ƒøuHSWèxîƒÄ‰D$é„VjjlWè?ãƒÄ…ÀÒ‹L$4V‹t$$QhŒyDVè·âVèQâƒÄéOƒø…ð3öè•ã‹è;ë„5–(RUèãƒÄ…À„‹Eh(ÆPWèPãƒÄ ð;Ãt}ÌhxyDÿ4«CƒÄéî‹EVL$Qj‰D$$‹ØèºíƒÄ ‰D$…À„Ƀ8tZ‹‹H…ÉtQ‹RQhtüCÿ<«CƒÄ …Àu;‰\$èê‹L$VT$‰ARD$PègíƒÄ ‰D$…Àtz‹H‰L$Ç@ëj‹T$ hPyDRèµáƒÄëVƒøuShBSWè íƒÄ‰D$ë;ƒøu‹L$ SD$PSWQ‹L$H3Ò3Ûè²üÿÿƒÄë‹T$4‹D$ Rh,yDPè]áƒÄ ƒ|$u‹t$ hyDVèDáVèÞàƒÄ ‹D$…Àt Pè©ìƒÄ…ÿt WèðàƒÄ…ít UèÓáƒÄ‹D$_^][ƒÄ øè6ñUVWèîá‹ðè1ã3ÿ‹è…ö„­…í„¥h(VèlìƒÄ…À„‹Fh(ÇPSèšáƒÄ ø…Àt|W(QVè8ìƒÄ…ÀuÐë]‹V3Àƒ|$ L$ ”À‰T$ PjWQjèì‹øƒÄ…ÿt3VèáWUèìëƒÄ _^‹Å]YËT$‹D$‹L$RPh¤yDQè5àƒÄVèìàUèäâƒÄ_^3À]YÃÌÌÌÌÌÌÌ̸èFð‹D$SUV‹t$W3í‰D$‰t$ègàPè[à‹\$ ‹øƒÄ‰|$(…ÿuSèr߃Äé…öu7ÿ0¬CPVjjWè"àƒÄƒ|$$…Ñè©ß‹è…íu?Uèm߃ÄéËVjjlWèð߃Ä…ÀÊ‹L$0VQhŒyDSèlßSè߃ÄéšT$RhBjWè@ß‹øW3Ûè0߃Ä…À~7¤$SWèà‹ð‹ƒÄ…ÀtPUèýÞƒÄÇWCèùÞƒÄ;Ø|Ð…ÿth xCWè߃Ä‹|$(…ÿt Wè´ÞƒÄ_^‹Å][ƒÄËD$0Ph,yDSèÇÞƒÄ h¸yDSè¹ÞSèSÞƒÄ ëÀÌÌÌÌÌÌÌÌÌÌV‹t$ W‹=h«ChèyDVÿ׃Ä…Àu‹D$ _Ǹ^ÃhàyDVÿ׃Ä…Àu‹L$ _Ǹ^ÃhØyDVÿ׃Ä…Àu‹T$ _Ǹ^Ã_3À^ÃÌÌÌÌÌÌÌÌÌÌÌ̸ èVîVW‹|$3ö‰t$ ;þ„ó‹D$;Æ„ç9t$ „ÝSUPè¦éP‰D$‰t$(èÈ݃Ä…ÀŽ–‹D$ ‹L$PQè¤Þ‹èU‰l$$èl鋨jÿSWè[é‹ðƒÄƒþÿt8ƒ|$(tAd$VWè9éVW‹èèpåUè@âjÿSWè'é‹ðƒÄ ƒþÿu׋l$jÿUWèéƒÄ …Àt&‹t$ ‹T$FR‰t$$è2݃Ä;ðŒjÿÿÿÇD$‹D$h†}CPèLÝ‹D$ƒÄ][_^ƒÄ Ã_¸^ƒÄ ÃÌÌÌÌSU‹l$ VW‹úŠ‹ñ<-u2Ûë³<+uGƒ>t‹PWÿh«CƒÄ…ÀtƒÆ ƒ>uç_^]3À[ËN÷Ñ!M‹E„Ût‹V_ Ð^‰U]¸[ËN_÷Ñ#È^‰M]¸[ÃÌÌÌÌÌÌÌÌÌ‹D$SUV‹t$W2Û3ÿ…Àt PVèïàƒÄ‹l$ ‹Å%=u³¿…íu.‹L$UUQèUÜ‹øWVèºàh„µCVè¯àWè±ÞƒÄ _^][ÄÛth„µCVè’àƒÄ‹T$UWRVèÀçh„µCVèwàƒÄ_^][ÃÌÌÌÌÌVWèaÜ‹ø…ÿ„è.ÜPWè!܃Ä…Àtz‹t$j…ötjVjPèÿۃąÀu‹D$ VhÀ¯CPëIjjjPèßÛƒÄè§ÛPWèÖۃąÀt/‹t$j…öt3jVjPè´ÛƒÄ…Àu0‹L$ Vh¯CQèIÛƒÄ WèpÛƒÄ_3À^ÃjjjPè€ÛƒÄè0Û‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌVhzDè‡ä‹ðƒÄ…öt>‹D$jPhøyDVè¸æƒÄ…ÀtjjhðyDVè¢æƒÄ…Àu VèCäƒÄ3À^ËÆ^ÃÌÌÌÌÌÌÌÌÌÌÌÌVW‹|$3ö…ÿ„¹€zD‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu‹D$ h`zDPèeÚƒÄèEæ_3À^ÃWèÐã‹ðƒÄ…öu-Wè/ÿÿÿ‹ðƒÄ…öu‹t$ WhHzDVè*ÚVèÄÙƒÄ_3À^Ã|$‹|$ tjWjjVèæåƒÄ‹ EjjQjh4zDVèÅåhÿÿVè´åƒÄ …ÀuhzDWèÌÙWèfÙVè8ãƒÄ_3À^ÃVè‚åPhzDWè¦ÙVèãƒÄ_‹Æ^ÃÌÌÌÌV‹t$ …öu ‹5ÈE…öt2èpåjjVè`åƒÄ …À‹t$hˆzDVè\ÙVèöØƒÄ 3À^ø^ÃÌÌÌÌSVWèZß‹ØPIŠ@„Éuù+ÂhŽp høvDVèrÜV‹øSWè@ÚVh@ýCWè.ÚVh4ýCWè"ÚƒÄ0‹Ç_^[ÃÌÌÌÌÌÌÌÌÌ‹D$‹@ €80u d$@€80tú‹L$‹I €90uA€90túŠ:u„ÒtŠP:Qu ƒÀƒÁ„Òuä3ÀÃÀƒØÿÃÌÌÌ‹D$‹3À€9V”ÀÃÌ‹D$‹L$‹P‹I‹ÿŠ:u„ÀtŠA:Bu ƒÁƒÂ„Àuä3ÀÃÀƒØÿÃÌÌÌÌÌÌÌÌÌÌÌ‹D$‹@ €80u d$@€80tú‰D$éäÌé;ÿÿÿÌÌÌÌÌÌÌÌÌÌÌ‹D$‹H‰L$éþã¸è6è¡E3ĉ„$ ‹„$‹Œ$ SU‹¬$VW‹¼$(3Û‰D$‹Å‰L$‰\$P;ûuŠ@„Éuù+Âë"ëIŠ@„Éuù+‹ЋÇpŠ@„Éuù+ÆD=|‹ÌEhØzDRèo׃Ä‹Ãéë…ÿuhD$ UPèƒØƒÄ ëWUhÐzDL$(hQèz؃Äè¦×Pèš×‹ðƒÄ…öu‹ÌERè³ÖƒÄëvD$PjjlVèk׃Ä…À Uÿ4«CƒÄëT‹L$jQè´Û‹ØƒÄ…Ûu‹ÌEh¤zDRèÆÖƒÄë)SVè>Ýh„µCVè5Û‹D$(ƒÄÇD$…Àt‰3Û…öt VèT׃Ä…Ût SèكċD$‹Œ$_^][3ÌèÏæÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌSVW‹|$3Û…ÿt‹÷ëèxØ‹ð…öu_^3À[Ãjjj@Vè&âƒÄ…Àt‹D$…ÀtPVèäڃąÀt»…ÿu Vè؃Ä_^‹Ã[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$‹Fh  Bh€ BjjPèÎáƒÄ…Àu'‹v‹N‹V‹FQ‹ ÌERPh{DQè¡ÕƒÄ3À^Ã>tG‹Vh@ Bh° Bh0 BjRèáƒÄ…Àu&‹v‹F‹N‹VP¡ÌEQRhìzDPèUÕƒÄ3À^ø^ÃÌÌ̸èvå¡E3ĉ„$‹„$SV‹´$W‹¼$‰D$ èƒÕPèwՋ؃Ä…Ûu)‹ ÌEQèÔƒÄ_^3À[‹Œ$3ÌèAåÄËÆPŠ@„Éuù+‹ЋÇUhŠ@„Éuù+ÅTú]|-¡ÌEhØzDPè—ÔƒÄ_^3À[‹Œ$3ÌèèäÄÃVhˆ{DŒ$hQè¦ÕWVh|{D”$,hRèÕWVhÐzDD$@hPèwÕL$HQjjlSèÔƒÄH…À6Vÿ4«C‹ÌEVhd{DRèÔƒÄ_^3À[‹Œ$3ÌèUäÄË|$ ‹GPSèëكąÀ~VSèœÓè?ÔPè3ÔŒ$Qj‹ðjlVèԃąÀD”$Rÿ4«C‹ ÌE„$Phd{DQèÓƒÄ_^3À[‹Œ$3ÌèÐãÄÃ?¸Ì»Cu¸P¸CPhL{DVèGÓVèÓ‹Œ$ ƒÄ_^[3̸èãÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$…öt‹F…Àt Pè ߃ÄVèƒÕƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹D$…Ét!¾ ƒÁЃùIw¶‰¦Bÿ$¦B3ÀøËÿ¦B¦B ¦BÌÌÌÌÌÌÌÌÌ̸è†âS‹\$ UV‹ÃWHŠ@„Òuù+ÁhòphøvDVè{ÕÑîFhôö‹øöhøvDV‰|$4è^Õhõ‹èhøvDV‰l$PèHÕhöhøvDV‰D$Dè4Õ‹Ð3ÀƒÄ0‰T$$‹Ï‰D$‰D$;ø„ø;è„ð‹t$…ö„ä€;/t¡ÌEhl|DPè”уÄéåCÇ€8„âZ‹Õ+T$‹l$4‰T$ ëI‰ 2Š„Òt<¤$€ú\u!ŠP@„Òu‹ ÌEhH|DQè6уÄ郀ú=t'@ˆŠA„ÒuË‹T$¡ÌERhø{DPè ÑƒÄ éWÆ@A€8tÙ‰Š„Òt8€ú\u ŠP@„Òtœë€ú/t€ú+u…íu@ˆŠA„ÒuÙëÇëÇÿÿÿÿ@ÿD$ÆAƒÆƒÃ€8t ‹T$ é8ÿÿÿ‹l$,è£Õ‰D$…À„à3Û9\$Ž‘‹|$$‹õ+ý‹l$+l$,¤$‹Rè¦ÑƒÄ…Àu‹‹ ÌEPhÈ{DQèAÐƒÄ ë@‹ .€9u‹¡ÌERh{DPè!ÐƒÄ ë ‹7R‹T$jÿjÿQ‹L$@QPRè)уÄ…ÀtMCƒÆ;\$|Ž‹|$‹l$,‹D$PènÒUèhÒWèbÒ‹D$$ƒÄ _^][ƒÄË ÌEh8òCQè´ÏƒÄë‹|$‹l$,‹T$Rè¥Ð‹D$ƒÄ…Àt Pè҃ąít Uè ҃ąÿt WèÒƒÄ_^]3À[ƒÄÃÌV‹t$ Vÿ«CƒÄ…ÀtÿŒ«Cƒ8tƒÈÿ^ËD$VPÿˆ«CƒÄ^ÃÌÌÌÌÌÌÌÌÌÌÌ̸ èVß‹D$‹S‹UV‹pW3ÿ‰D$‰|$‰|$¹dþC‹Ã‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ‹l$(…Àu=…öt&jVè;ӃĉD$…Àu‹L$,Vh}DQè ÎƒÄ ÇE‹D$ ƒéh¹Ü/D‹ÃŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuh…öu‹D$ ÇEƒé!VègڃąÀ}%‹T$,hø|DRè'΋D$(ÇEƒÄƒéïPèSÎPè!Ö‰D$‹D$(ƒÄƒéйä|D‹Ã¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àux鑹Ô|D‹ÃŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuxéY¹ìND‹ÃŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuxé!¹ÜND‹ÃŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àux éé¹Ä|D‹ÃŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ¿€é¯¹°|D‹Ã›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu¿ër¹ |D‹ÃŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àux ë=¹|D‹Ãd$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À…¡¿ƒ}‹t$0t‹…Àt PèB̃ÄÇëTƒ>uè؉…Àu ÇEë;‹D$…Àt P‹Pèõ׃Ä…ÿt ‹WQèß׃ă|$t‹T$‹RPèÂ׃Ä‹D$ ƒ‹L$$‹…Ét +D$Áø)_^]¸[ƒÄ Ã_^]3À[ƒÄ ÃÌÌÌÌÌÌÌÌ‹D$Ph4}DSèdËƒÄ …ÿt;Vh„µCSè×ÏW3öè7ËƒÄ …À~VWèÌjPSèb×WFè˃Ä;ð|â^Ãh(}DSèσÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌS‹\$U3í…ÛuSÿ0¬CƒÀ@Pè΃ċؽVW‹|$Wè×W‹ðè ׃Ä…À¸€}Du¸x}DPhX}DSè­ÊVèãÖhL}D‹øè'ÿÿÿVèËÖhD}D‹øèÿÿÿƒÄ_^…ít SèJʃÄ][ËL$SVW‹|$…ÿt6…Ét2‹×‹ÁŠ:u„ÛtŠX:ZuƒÀƒÂ„Ûuä3ÀëÀƒØÿ…Àupë3ö‹\$…ÉtVè+âÿÿ‹L$ ƒÄ‰…Àu_^[ËD$…ÀtÇ…ÿt ÷ÞöƒæV‹Ïèùáÿÿ‹T$$ƒÄ‰…Àu_^[ËD$ …ÀtÇ_^¸[Ã̸ èöÙ‹D$ S‹\$ UW‹|$ ÇD$ ‰D$‰|$…ÿu$…Ût ‹l$$ƒýu`‹L$hà}DQè{ɃÄéj‹l$$ƒýu@‹D$0…Àu‹ÌEhÈ}DRèQɃÄé@‹EL$QRWPèՃĉD$ é!VèœÉPèÉ‹ðƒÄ…öu‹D$ Pè«ÈƒÄéì…ÿu;…Ût7‹0¬CWjWÿÓPÿL«CÿÓPWjjVèHÉƒÄ ƒýuBjVè ÕƒÄé©WjjlVè%ɃÄ…ÀÙ‹L$8W‹|$$QhŒyDWèÈWè7ȃÄë{ƒýuT$RhBjVèÉÔë[ƒýtCƒýt>ƒýu%‹D$ ‹L$8jjhBVPT$$\$(è†ãÿÿƒÄë.‹L$ hœ}DQè6ȃÄë‹T$8‹D$ URWP‹ÞèçÿÿƒÄ‰D$…öt VèÝǃÄ^‹D$ _][…Àu‹L$(‹T$Qhˆ}DRèêÇ‹D$ ƒÄ ƒÄ ÃÌÌÌÌÌÌÌÌÌÌ̸èØ‹D$UV‹t$W3ÿ‰D$ ‰t$…öu&9|$$t ‹l$ ƒýu`‹L$hà}DQè“ǃÄéCƒ|$ u>‹D$,…Àu‹ÌEhÈ}DRèkǃÄé‹EL$ QRVPè¼ÓƒÄ‹øéú‹l$ Sè´ÇPè¨Ç‹ØƒÄ…Ûu‹D$PèÃÆƒÄéÁ…öu>9|$(t8‹-0¬CVjVÿÕPÿL«CÿÕPVjjSè^Ç‹l$DƒÄ ƒýu?jSèDÓƒÄë}VjjlSè:ǃÄ…ÀÜ‹L$4V‹t$ QhŒyDVè²ÆVèLƃÄëMƒýuT$RhBjSèðÒë/ƒýtƒýt‹D$hœ}DPèuƃÄë‹L$4‹T$UQVRè[åÿÿƒÄ‹ø…Ût Sè ÆƒÄ[…ÿu‹D$0‹L$Phˆ}DQè4ÆƒÄ ‹Ç_^]ƒÄÃÌÌÌÌ‹D$U‹l$ÇD$ …Àu]ÃVWPè}Ò‹øW3öèéŃÄ…À~+VWèÑÆ‹PU‹ËèÞèÿÿƒÄ …Àu‰D$WFè¾ÅƒÄ;ð|Õh6…CWèèÅ‹D$ƒÄ_^]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èÖÕ¡E3ĉ„$‹„$S‹œ$VW‰D$ 3ÿè>Ê‹ð…ö„©UèØÅPèÌÅ‹èƒÄ…íu‹ ÌEQèåăÄëhSjjlUè¡ÅƒÄ…À‡9¼$ u Sÿ4«CƒÄë=èJÇ‹ø…ÿtVWè¯îÿÿƒÄ…Àu‹ÌEhD~DRèëăÄ…ÿt ‹D$…Àt‰03ö…ít UèžÄƒÄ]…öt VèTǃÄ‹Œ$‹Ç_^[3ÌèÕÄÃhD$PVUèуÄ…Àu‹ ÌESh$~DQèyÄƒÄ ëœjVèÖÉ‹øƒÄ…ÿ…{ÿÿÿ‹ÌEhø}DRèNăÄénÿÿÿÌ̸8èvÔ¡E3ĉ„$4SU‹¬$HV‹´$HW‹¼$T‹Æ‰|$P›Š@„Éuù+‹ЋÇxŠ@„Éuù+Ç‹ÆPŠ@„Éuù‹Í+ÂyŠA„Òuù+ÏÁ;Ø~‹Ã@=|¡ÌEhØzDPè«ÃƒÄ3Àé&UVhÐzDL$PhQèÏÄ‹T$$RVhÐzD„$dhPè²ÄL$‹„$ ‰^3Û…Àt‹‰ëÇ…ÿt;hÄüCjWè¢ÁƒÄ …Àt jPèîÿÿ‰ƒÄ…ÿt WèxÁƒÄ…Ût SèÛ̃Ä[Uè‹Á‹Œ$ƒÄ_‹Æ^]3ÌèÑÄÃÌÌÌ̸8èÖСE3ĉ„$4SU‹¬$HV‹´$HW‹¼$T‹Æ‰|$P›Š@„Éuù+‹ЋÇxŠ@„Éuù+Ç‹ÆPŠ@„Éuù‹Í+ÂyŠA„Òuù+ÏÁ;Ø~‹ÃƒÀ=|¡ÌEhØzDPè ÀƒÄ3Àé•Vhˆ{DŒ$LhQè+ÁUVh|{D”$`hRèÁUVhÐzDD$thPèüÀ‹|$HWVhÐzDŒ$ˆhQèßÀƒÄLWVh|{D”$PhRèÃÀ‹-\«CD$(PVÿÕ‹ˆ«CƒÄ…À}z‹=Œ«Cÿ׃8t ÿ׃8…nVÿ«CƒÄ…Àtÿ׃8uT$DVRÿӃąÀ¡‹ ÌEVD$HPh\~DQè ¿hT~Dÿ4«C”$XVRèïÿÿƒÄ3À逌$DQÿ«C‹=Œ«CƒÄ…Àtÿ׃8u”$DRVÿӃąÀfÿÿÿ‹ ÌE„$DPVh\~DQ蘾hT~Dÿ4«CƒÄ3ÀéD$PŒ$HQÿՃąÀÿ׃8tÿ׃8u}„$DPŒ$HQèâîÿÿƒÄ…ÀÌ‹ ÌE”$DR„$HPh\~DQè¾hT~Dÿ4«C”$XR„$\Pè–îÿÿL$`QVè‹îÿÿ”$hVRè}îÿÿƒÄ,3Àëp”$DR„$HPèaîÿÿƒÄ…À_ÿÿÿ¡ÌEŒ$DQ”$HRh\~DPèš½hT~Dÿ4«CL$XQVè îÿÿ”$`VRèîÿÿƒÄ$3À븋Œ$D_^][3Ìè¿ÍÄ8ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ‹D$‹L$SPQ»¨tDè ÷ÿÿƒÄ[ÃÌÌÌÌÌÌ‹D$‹L$SPQ»uDèëöÿÿƒÄ[ÃÌÌÌÌÌ̸è6Í¡E3ĉ„$SUV‹´$WVèßÄV‹ØèÝÄV‹èèÉÄƒÄ ‹øhD$PSèÔ¼ƒÄPèż‹ÌEL$QWhà~DRè–¼‹œ$4ƒÄ…Ûu@U蔼P¡ÌEUhÈ~DPèp¼ƒÄ9=E|»ÇEë 3ÛÇE‹F\ƒÀþƒø ‡­¶ˆx½Bÿ$h½B‹F`hT$RPè”ăÄPè'¼‹ÌEL$Qh¼~DRëh¡ÌEh$-DPè컋N`‹‹B‹‹ÌEQRèM¡ÌEh„µCPë4‹ ÌEh-DQè·»‹V`‹‹H‹Q¡ÌERPè‹ ÌEh„µCQ軃Ä‹ÌESh¨~DRèz»‹Œ$ƒÄ _^]‹Ã[3ÌèÊËÄÙ¼BȼBü¼B8½BÌÌÌÌÌÌÌÌÌÌÌSVW‹|$…ÿ„¡‹\$jWSèvºƒÄ …À&¡ÌEWhPDP軋 ÌEQ蔺ƒÄ_^3À[Ët$…öu‹÷jVSè0ºƒÄ …À&‹ÌEVh(DR迺¡ÌEPèTºƒÄ_^3À[ÃSè÷¹ƒÄ…Àu‹ ÌEhð~DQ躃Ä_^3À[Ã_^¸[ÃÌÌÌÌÌÌÌ‹D$…Àu¸ÃV‹t$PVèĹƒÄ…Àh”Dë‹T$RV襹ƒÄ…À#hxD¡ÌEPè*º‹ ÌEQè¾¹ƒÄ 3À^ÃVèc¹ƒÄ…Àu‹ÌEhð~DRèù¹ƒÄ3À^ø^ÃÌÌÌÌÌÌÌS‹\$VSèbÆ‹ðƒÄ…öu‹D$ ^[ËD$UW‹|$(=‚u‹D$ ‹l$WWPUShÜDë=ƒu#‹L$ ‹l$WWQUSh°DV脹WUVèZÀƒÄ(‹Ç_]^[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹L$‹Á%ðÿÿV©t¾x€Dë¾l€D© u¾`€DöÁt"‹D$P覸‹ ÌEPVhX€DQ蹃Ä^Ã÷Á@t@W¿P€DöÁu¿H€D‹t$Vèf¸ƒÄPVèV¸‹ÌEƒÄPWh0€DRèиƒÄ_^ÃöÁtK‹D$…Àu"‹D$Pè/¸‹ ÌEPVh€DQè ¸ƒÄ^Ã}‹T$Rè ¸P¡ÌEVh €DPè}¸ƒÄ^ÃÌÌÌ̸è¦Èƒ|$ ºY¶C‰$‹ÊÇD$°„DuÇD$¬„DSU‹l$ V‹t$‹ÆƒèW‹|$,tX-þtDƒèt2ÇD$¨„Dƒþ…ﺨ„D…ÿ†Ã¶Eƒø‡¶ÿ$…ÄBÇD$œ„DéÕÇD$„DéÈÇD$ˆ„D뻺|„D¹t„Dƒÿ‚x¶E¶]ÁàDÿƒø‡`ÿ$…8ÄB¹`„DéO¹H„DéE¹0„Dé;¹ „Dé1ºüƒDé'ºèƒDéºÔƒDéºÄƒDé º´ƒDéÿº ƒDéõºˆƒDéëºpƒDéáþt þ…Í‹t$$‹Æƒèt!ƒètƒèu$ÇD$dƒDéGÇD$\ƒDëÇD$HƒD锃þ…"º@ƒDƒÿ…}¶Eƒèt ƒèu º8ƒDëº,ƒD¶E¹t„Dƒød‡Q¶€°ÄBÿ$…PÄB¹ƒDé9¹ƒDé/¹ø‚Dé%¹ä‚Dé¹Ð‚D鹸‚D鹤‚Déý¹‚Déó¹t‚Déé¹\‚Déß¹D‚DéÕ¹,‚Dé˹‚DéÁ¹ ‚Dé·¹üDé­¹ìD飹ÜD陹ÈDé¹´Dé…¹œDë~¹ŒDëw¹|Dëp¹hDëiƒþudº¨„D…ÿv[¶EƒøwR¶€DÅBÿ$…ÅBºXDë=ºHDë6º8Dë/º(Dë(ºDë!ºü€Dëºè€DëºÔ€Dë ºÀ€D뺴€D‹D$‹t$4Q‹L$R‹T$$WQRPh˜€DVè$µƒÄ …ÿvVh”€DV赃Ä3Û…ÿv4ëIöÃu…ÛvhŒ€DVèð´ƒÄ¶ +Qh„€DVèÝ´CƒÄ ;ßrÑh„µCVèÊ´ƒÄjjj Vè'µƒÄ_^][ƒÄÃôÀBNÁBXÁBbÁBlÁBvÁB€ÁBŠÁB”ÁB&ÁB0ÁB¦ÁB:ÁB¦ÁBDÁB<ÂBFÂBPÂBZÂBdÂBnÂBxÂB‚ÂBŒÂB–ÂB ÂBªÂB´ÂB¾ÂBÈÂBÒÂBÜÂBæÂBðÂBúÂBÃBÃBÃBÃB I;ÃBBÃBIÃBPÃBWÃB^ÃBeÃBlÃBsÃBzÃBÃB  ÌÌÌÌÌÌÌ‹T$ ƒú#wM¶‚,ÆBÿ$…ÆB¸|…Dë=¸h…Dë6¸P…Dë/¸@…Dë(¸0…Dë!¸ …D븅Dë¸ü„Dë ¸ì„D브ìCƒ|$¹ä„Du¹Ü„DV‹t$W‹|$WRPQh´„DVèß²‹L$0WQVè±¹jjj Vè3³ƒÄ4_^ÃwÅB~ÅB…ÅBŒÅB“ÅBšÅB¡ÅB¨ÅB¯ÅB¶ÅB  ƒ=EtÇEè(ÂéÂÃÌ̃=EuZhPÆBjÿ”«Chjh€EÇEè™ÂƒÄh€EhèãÁ…ÀtèÂÁP¡ÌEhˆ…DPè÷±ƒÄ 3ÀøÃÌÌÌÌÌÌ̸è¡E3ĉD$V‹ñèsÿÿÿ…Àt}‹L$ 3À‰D$‰D$ ‰D$‰D$¸Qf‰D$ èÁ¶V¶Nf‰D$ ¶Áà ¶VÁà ÁÁà ÂPè^Á‰D$ ƒÿujWëjjjè?Á‹ðƒþÿu hÄ…Dÿ4«CƒÄ3À^‹L$3ÌèŸÁƒÄÃÿuDjD$PjhÿÿVÇD$èñÀ‰D$…À} h¸…Dÿ4«CƒÄ3À^‹L$3ÌèVÁƒÄÃjL$ QVè¶Àƒøÿu'VÿôªCh°…Dÿ4«CƒÄ3À^‹L$3ÌèÁƒÄËL$‰3^3̸èÁƒÄÃÌÌÌÌÌÌ̸èÆÀ¡E3ĉD$SU‹l$(V‹ñ3Ûèþÿÿ…Àu^][‹L$3ÌèÄÀƒÄËL$(3À‰D$‰D$‰D$‰D$¸Qf‰D$è#Àf‰D$…öu‰\$닉T$ƒýujUëjjjèí¿‹ðƒþÿt^jD$PjhÿÿVÇD$ èÄ¿jL$QVèÕ¿ƒøÿt0ƒýuh€V躿ƒøÿt‰7^»]‹Ã[‹L$3ÌèÀƒÄÃþÿtjVè?¿Vè3¿‹L$ ^]‹Ã[3Ìè迃ÄÃÌÌÌÌÌÌÌÌÌV‹t$Vÿ8«CƒÄ…Àu2hì…DVè^¿…Àu‹ÌEVhÌ…DRè@¯ƒÄ 3À^÷@Pè1¿‹L$ f‰¸^ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸èF¿SU‹l$VW3ÿ‰|$ƒËÿ¾°E‹;Øv‹Ø‰|$…Àvh€†pÿÿÿPUÿ<«CƒÄ …ÀtÆ”GþE|ǃÿ…•ÿEUè´¾…Àu_^][YËÍqIŠA„Òuù+Îù€ƒ‹‹T$iÒ”² E‹Í+õ¤$ŠˆA„Ûuö‹‹5E‰Š E‹H‰Š¤E‹H‰Š¨E‹H ‰Š¬E‹ Eñ_‰²°E^][YË E‹E‹ÇiÀ”A‰ Eʉˆ°E€ E_^][YÃÌÌÌÌÌÌÌÌÌ̸è¾èûÿÿ…ÀuYËL$3ÀU£pE£tE£xE£|ED$PhpEQÇD$è¶½‹èƒýÿuèJ½‹ÌEPhT†DRè~­ƒÄ 3À]YÃV…Ût)jjhtEèw½‹ð…öu$¡ÌEh@†DPèM­ƒÄ‰3‹L$^‰)¸]YËPŠ@„Éuù+Âh¿@h,†DPèt°ƒÄ ‰…ÀuhXÎCÿ4«CƒÄ^3À]YË6‹ÎWyŠA„Òuù+ÏAQVP讋 QèÆýÿÿƒÄ_…Àu‹ÌEh†DRèÁ¬ƒÄ^3À]YÃfƒx„eÿÿÿ¡ÌEhð…DP謃Ä^3À]YøèƼD$ PL$ QT$ RD$ Ph|†DVÿ@«CƒÄƒøuX3À¹ÿ¤$9 „w+@ƒø|õ¶$ŠD$ŠL$ˆ¶T$ ˆGˆOˆW¸ƒÄË ÌEhh†DQ謃Ä3ÀƒÄÃè±ùÿÿ…ÀtAVèçüÿÿƒÄ…Àu¡ÌEh†DPè䫃Ä3ÀƒÄÃfƒxt‹ ÌEhð…DQèëƒÄ3ÀƒÄËP ‹ ¶ˆ‹H ‹ŠJˆO‹P ‹ ¶QˆW‹@ ‹¶QˆW¸ƒÄøè¶»V‹t$W|$è×þÿÿ…Àu_^YËD$‹|$S‹\$PL$èhùÿÿƒÄ[_^Yøèv»‹D$‹L$ SWPQ3Û3É|$‰\$è‰úÿÿƒÄ…Àu_[ƒÄËD$U‹l$…Àt‰(Vƒ|$ u T$RU\$èýÿÿƒÄ…Àt^‹\$‹t$ë‹õ‰t$‹D$,PVSÿT$4ƒÄ ‹ø…Ût SèG­ƒÄƒ|$ ujVèOºVèCº…ÿ}jUè=ºUè1º^]‹Ç_[ƒÄÃjUè%ºUèº^]_3À[ƒÄÃÌÌÌÌÌÌÌÌÌSV‹t$ j:VÿX«C‹ØƒÄ…Ûu¡ÌEhˆ†DPè<ªƒÄ^3À[ÃW‹|$ÆC…ÿt èŽýÿÿ…Àt‹D$…Àt‰0‹L$QSè•úÿÿƒÄ…Àu_^3À[Ã_^¸[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸Ì躡E3ĉ„$ÈSV‹´$ÜW‹¼$Ü3Ûh´‡D…ÿV”Ãè©©jjj Vè ªè:¶h¬‡DVè©ƒÄ …ÿ…œD$ hÈP趃ċø…ÿtjÿWèøµƒÄ…À…¤è²…À…—9„$äuAhŒ‡DVè6©hH‡DVè+©h,‡DVè ©ƒÄ…Ûthà†DVè©hœ†DV詃Ä_^3À[‹Œ$È3ÌèT¹ÄÌÃWèpµƒÄ…ÀŽgÿÿÿ_¸^£ E[‹Œ$È3Ìè!¹ÄÌËŒ$Ô_^[¸3Ì£Eèÿ¸ÄÌÃÌÌÌÌÌÌÌÌÌÌÌÌ̸Ì趸¡E3ĉ„$ȃ= E‹„$ÐV‹´$ØuYƒ=EtP…ÀuD$hÈPèÔ´ƒÄ…Àt(PèÓ´ƒÄ…Àt¸^‹Œ$È3Ìèw¸ÄÌÃh܇DVèþ§ƒÄ‹Œ$Ì^3Ì3ÀèQ¸ÄÌÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌUW‹|$ S3íV›3Û‹Ç8t €8;t@€8uõ€8u»‹÷Æ€>xtVè$´ƒÄ…À jÿVè´ƒÄè…Ût¸ý^[‹Å~ ÇE_]ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸膷SU3ÛVW3í3ÿ‰\$ ‰\$‰\$‰\$9ÌEu3è›§P觃Ä£ÌE;Ãtÿ0¬CƒÀ@P¡ÌEjjjPèd§ƒÄ‹L$(¸;Èu‹è;ȉD$ŽÉ›‹L$,‹T$‹4‘º€ÙC‹ÎŠ:u„ÛtŠY:ZuƒÁƒÂ„Ûuä3ÉëɃÙÿ…É„lº\ˆD‹ÎŠ:u„ÛtŠY:ZuƒÁƒÂ„Ûuä3ÉëɃÙÿ…Éu ‰D$é5ºXˆD‹ÎŠ:u„ÛtŠY:ZuƒÁƒÂ„Ûuä3ÉëɃÙÿ…Éu ‰D$ éûºTˆD‹Î¤$Š:u„ÛtŠY:ZuƒÁƒÂ„Ûuä3ÉëɃÙÿ…Éu ‰D$黺„ÙC‹Î¤$Š:u„ÛtŠY:ZuƒÁƒÂ„Ûuä3ÉëɃÙÿ…Éu‰D$ë~ºPÌC‹ÎŠ:u„ÛtŠY:ZuƒÁƒÂ„Ûuä3ÉëɃÙÿ…Éu‹øëJºTÙC‹Î›Š:u„ÛtŠY:ZuƒÁƒÂ„Ûuä3ÉëɃÙÿ…ÉuS‹ø‰D$‰D$‰D$ ‰D$‹è‹L$È;L$(‰L$Œ?þÿÿ3Û‹5,«C;ëtTè°±S=Ï€u2è©®Phà®CÿÖƒÄ ë5¡ÌEh8ˆDPèØ¤ƒÄ_^]¸[ƒÄÃèw®PhˆDhˆDÿÖƒÄ9\$tjèZ®Phà®CÿÖƒÄ 9\$tjèB®Phà®CÿÖƒÄ 9\$t_hü‡DÿÖè®PhldDÿÖè ®PhldDÿÖèù­PhldDÿÖèæ­PhldDÿÖèÍ­PhldDÿÖ躭PhldDÿÖh„µCÿÖƒÄ89\$ tjèÅ­Phà®CÿÖƒÄ ;ûtj语Phà®CÿÖƒÄ _^]3À[ƒÄÃÌÌU‹l$VW3ÿèN¤PèB¤‹ðƒÄ…öu¡ÌEPè\£ƒÄ‹Ç_^]Ã…Ûu/ÿ0¬CPSjjVè ¤ƒÄƒýuBjVhæwChFxC觃ÄëISjjlVèᣃÄ…ÀÒSÿ4«CƒÄVè.£ƒÄ‹Ç_^]ÃýuNjjjVh€GDhæwC謬ƒÄ‹ø…ÿuB‹ ÌEh‰DQè £‹ÌERè´¢ƒÄ VèÛ¢ƒÄ‹Ç_^]áÌEhDDPèò¢ƒÄVè¹¢ƒÄ‹Ç_^]ÃÌÌÌÌÌÌÌÌÌÌÌ̸$è³SU3íVWÇD$‰l$0‰l$$‰l$,‰l$‰l$(‰l$9-ÌEu3è£P裃ģÌE;Åtÿ0¬CƒÀ@P¡ÌEjjjPèØ¢ƒÄ‹\$8‹|$<¸KƒÇƒû‰D$ ‰D$‰l$8Œ\‹7¹¤´C‹Æ›Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu"KƒûŒœ‹OƒÇQèQ²ÿÿƒÄ‰D$ éõ¹XÇC‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu"KƒûŒJ‹WƒÇRèÿ±ÿÿƒÄ‰D$飹 ´C‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒûŒø‹GƒÇ‰D$$éZ¹˜´C‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒûŒ¬‹OƒÇ‰L$,é¹`ÆC‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu‹D$8@‰D$8‰D$éŹPþC‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu‹D$8@‰D$8‰D$郹Œ´C‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu‹D$8@‰D$8‰D$(ëD¹XOD‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À…‰KƒûŒ•‹oƒÇKƒÇƒû¤ýÿÿè` ‹T$ ‹\$$Rèðûÿÿ‹ðƒÄ…ö„_…í„¥‹ÅP›Š@„Éuù+‰Fhƒø v{¡ÌEhp‰DP蓟ƒÄVè ž‹D$ƒÄ_^][ƒÄ$áÌE‹ÖRh´CPèhŸƒÄ ¡œýD¾œýD…À„ë‹ ÌEPh ýCQèAŸ‹FƒÆƒÄ …Àuá‹D$_^][ƒÄ$ÃPNlUQ虯ƒÄ ‹l$(…ít ƒ|$„¥èzŸPènŸ‹øƒÄ…ÿu‹ÌER臞ƒÄéa‹\$,…ÛuHÿ0¬CƒÀ PSjjWè0ŸƒÄƒ|$t\VW苜ƒÄƒ|$tK‹†”…Àu1hX‰DW裃Äë1SjjlWèðžƒÄ…À¼Sÿ4«CƒÄéðPWè½¢ƒÄë‹|$0…í…Ð9l$up‹D$ƒøuVWh~vCè§¡ƒÄ ë#ƒøu;jjjjjVWh€GDh~vCè.§ƒÄ$…À……¡ÌEh8‰DPèûƒÄëx‹ ÌEh„¸CQèåƒÄëb‹†”…ÀtP‹L$ƒùu PWè.Ÿë ƒùu$PW蟃ąÀu+‹ÌEh ‰DRè ƒÄë¡ÌEh„¸CP苃ÄëÇD$…ÿt Wè:žƒÄV蜃Ä‹D$_^][ƒÄ$ÃÌÌÌÌÌÌÌ̸膭¡E3ĉ„$SUV3íW‹¼$0»‰\$‰l$‰l$ èó›‹50¬C‰D$9-ÌEuUÿÖƒÀ@Pè1 ƒÄ£ÌEjÿÖƒÀ Pè ‰D$‹„$4+ÃăÇ;É„$,Œl‹7¹€ÙC‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ‰\$é¹ÌMD‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu膛‰D$éʹÄMD‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àuè@›‰D$銹¼MD‹Æ‹ÿŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu èúš‰D$ëMjhXŠDVÿ<«CƒÄ …À„©‹7¹TŠD‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àtw‹î‹„$,+ÃÇ;É„$,”þÿÿèš‹L$Qèÿ™‹ØƒÄ…Ût&…ít{USèÁ™ƒÄ…Àum‹ÌEh<ŠDR蛃ċl$ 胘¡ÌEP覚ƒÄé¡ÈýD¾ÈýD…À„ë›P¡ÌEh ýCPèÓš‹FƒÆƒÄ …ÀuâéäSèÛ˜‹èƒÄ…ítœƒ|$ub3ÿWUè0š‹ðƒÄ…öt<ëI…ÿt‹L$hlÇCQ蚃Ä‹T$Vh ýCRènšGWUèô™‹ðƒÄ…öuÉ‹D$h„µCPèNšƒÄëJUè'˜‹øW3öè'šƒÄ…À~3hL$(QVW蛃ÄPè ™‹T$PR蓞WFèô™ƒÄ;ð|ÍÇD$…Ût Sè[˜ƒÄ…ít U蘃ċD$_^][…Àt P葚ƒÄ‹Œ$‹D$3ÌèªÄÃÌÌÌÌÌÌÌÌÌÌ̸èÖ©SU3ÛVW3í3ÿ‰\$‰\$‰\$‰\$ ÇD$9ÌEuSÿ0¬CƒÀ@Pè–œƒÄ£ÌEèÑ™‹t$,ƒÆë›3Û‹;Äà€8-…׺h‹D‹Èd$Š:u„ÛtŠY:ZuƒÁƒÂ„Ûuä3ÉëɃÙÿ…Éu ÇD$ 鉺 ´C‹ÈIŠ:u„ÛtŠY:ZuƒÁƒÂ„Ûuä3ÉëɃÙÿ…Éu9ntL‹FƒÆ‰D$ëE¹˜´CŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu9nt ‹NƒÆ‰L$뿃ƅÿ„ÿÿÿë;ûtt‹ÌEh@‹DRèC˜¡ÌEh(‹DPè3˜‹ ÌEhì³CQè"˜‹ÌEh‹DR蘡ÌEhøŠDP蘋 ÌEhÔŠDQèð—ƒÄ0_^]¸[ƒÄËD$;Ãt1h ®CPèÇ—‹ØƒÄ…Ûu/‹T$¡ÌERh¸ŠDP诗ƒÄ é`Sÿ0¬CPèКƒÄ‹Ø‹|$…ÿt2h”ÈCWè|—‹ðƒÄ‰t$…öu4‹ ÌEWhœŠDQèc—ƒÄ éjÿ0¬CƒÀ P耚ƒÄ‰D$‹ð9l$ „‚èø£‹èè1—jjjS‰Eèø™ƒÄ…Àt‹UPRèì–jjjSèÚ™ƒÄ…Àuã‹EPèÜ–ƒÄ…Àu&‹L$Qh|ŠD‹ÌERèÑ–¡ÌEPèf–ƒÄëzUVèz£ƒÄëfjjjSèc£‹èƒÄ…íu ‹L$Qh\ŠDë·‹MQ3öèw–ƒÄ…À~3‹UVRè\—‹ø‹D$WPèwªÿÿ‹L$ WQè—‹URFèD–ƒÄ;ð|ÍÇD$Sè–‹D$Pèý–Uè墋D$$ƒÄ _^][ƒÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌSUVW‹|$W3öèò•ƒÄ…À~?‹\$(‹l$$‹D$ ‹L$SUPQVWèÅ–‹T$,ƒÄPRè?ƒÄ…ÀtWF賕ƒÄ;ð|Ê_^]¸[Ã_^]3À[ÃÌÌÌÌÌÌÌÌ̸tèÖ¥‹D$x‹L$|VW3öVPQT$Rè?•D$Pè#•ƒÄ…ÀL$Qèp‹ðƒÄ…öuƒÎÿ3ÿëT$R袃ċøD$P蛋Œ$ŒƒÄ‰9_‹Æ^ƒÄtÃÌÌÌÌÌVW‹|$‹G‹H‹Q‰T$‹@‹QT$RjèÝ¡‹ðƒÄ …öt9‹FPèÅ¡‹ƒÄPQèšPèט‹ÌEƒÄPhp‹DRèÆ”Vè’¡ƒÄ_¸^ÃÌVW‹|$3ö…ÿ~$S‹\$U‹l$¶Ph„‹DU莔FƒÄ ;÷|è][_^ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ 覤‹D$V3öP‰t$èO¡ƒÄ‰D$;Æu3À^ƒÄ ÃSUWP‰t$è(”ƒÄ…ÀŽÞ‹\$0‹|$,‹l$(‹L$‹T$QRèø”‹ð‹FPè+™ƒÄ ƒøu&Vè렃ċðöÃtV‹ ÌEh¤‹DQèà“ƒÄë@ƒøugöÃt)‹ÌEhŒ‹DRèÀ“‹F‹H‹Q¡ÌERPè‡þÿÿƒÄWUV芠ƒÄ ‹ð…ötN‹L$4‹T$ QSWUVRèpýÿÿƒÄh¨…CV…ÀtL蜓ƒÄ‹t$‹D$FP‰t$èJ“ƒÄ;ðŒ.ÿÿÿÇD$‹L$hú~CQèd“‹D$ ƒÄ_][^ƒÄ ÃèP“ƒÄëØÌÌÌÌÌÌÌÌÌÌÌÌÌW‹|$ …ÿu‹D$‹L$Phü‹DQè÷’ƒÄ G_ÃWè×’ƒÄ…Àu‹T$‹D$Rhä‹DPèÎ’ƒÄ ¸_ËL$UV‹t$Qhà®CVè®’W3íè”’ƒÄ…ÀŽSëd$‹|$UWèm“‹ø‹Rè¡—hÜ‹DV‹Øèr’ƒÄ…Ûu‹PVèî–hØ‹Dë SèQ–Ph$®CVèI’‹OƒÄQè+’ƒÄ…Àtz‹WjRè“‹‹ÊƒÄƒétCƒét>ƒétRhÀ‹DVè ’ƒÄ ëV‹@‹‹PQRèñž‹øWhà®CVèç‘Wèo”ƒÄë.‹@‹‹PQRVèýÿÿh„µCVèÁ‘ƒÄëh°‹DV豑ƒÄ‹D$PEè‘‘ƒÄ;èŒÿÿÿ[^]¸_ÃÌÌÌÌÌÌÌÌÌ̸ðè¶¡¡E3ĉ„$ì¸V‹´$üW3ÿ‰D$p‰D$(¸‰|$<‰|$‰¼$ˆ‰|$P‰|$\‰|$8‰|$x‰|$|‰|$l‰|$T‰|$‰|$ ‰|$X‰|$‰|$$‰|$dÇD$`’‰D$4‰D$L‰|$0‰|$‰|$ ‰|$‰¼$€‰|$H‰|$,‰|$@‰|$h‰¼$„‰|$tÇD$D•襓£,E¡ÌE;ÇuWÿ0¬CƒÀ@PèÕ“ƒÄ£ÌEWPèü¶ÿÿƒÄ…À„Œ‹~ƒÆS3ÛU‹ë;û„µ€?-…Ÿº@–D‹ÏŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ƒL$émº8–D‹ÏIŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ÇD$lé-º0–D‹ÏIŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ÇD$l€éíº$–D‹ÏIŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ƒL$é°º–D‹Ï›Š:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ƒL$épº –D‹Ï›Š:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ƒL$é0ºŒ´C‹Ï›Š:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ƒL$éðº–D‹Ï›Š:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ƒL$é°º˜MD‹Ï›Š:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ÇD$`émºø•D‹ÏIŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ÇD$,é-ºì•D‹ÏIŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ‰\$Téñºà•D‹Ï¤$Š:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ÇD$L’魺ؕD‹ÏIŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ÇD$ émºD3D‹ÏIŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;ÃuèÆ•£,Eé+º<3D‹ÏŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu螣,Eéëº43D‹ÏŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãuè@•£,E髺,3D‹ÏŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãuèú”£,Eékº$3D‹ÏŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãuè´”£,Eé+º3D‹ÏŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãuèn”£,EéëºÐ•D‹ÏŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ÇD$x魺ĕD‹ÏIŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ÇD$0émº¸•D‹ÏIŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ÇD$0é-º°•D‹ÏIŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ÇD$0ÿÿÿÿéíºÆC‹ÏIŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ‰,E鯺¤•D‹ÏëIŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ã…i9^ti‹~ƒÆ¹$D‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu ÇD$Lÿÿÿÿë0Wè5‹ƒÄ‰D$L;Ãu‹‹ ÌEPhˆ•DQè̉ƒÄ ÇD$‹~ƒÆ;û…Bùÿÿ‰l$9\$„é¡ÌEhl•DP蕉‹ ÌEhì³CQ脉‹ÌEhH•DRès‰¡ÌEh •DPèc‰‹ ÌEhô”DQèR‰‹ÌEhДDRèA‰¡ÌEh ”DPè1‰‹ ÌEht”DQè ‰‹ÌEƒÄ@hH”DRè ‰¡ÌEh”DPèüˆ‹ ÌEhà“DQè눋ÌEhÀ“DRèÚˆ¡ÌEhŒ“DPèʈ‹ ÌEhh“DQ蹈‹ÌEh<“DR計¡ÌEh “DP蘈‹ ÌEƒÄ@hà’DQ脈‹ÌEh´’DRèsˆ¡ÌEh€’DPècˆ‹ ÌEhP’DQèRˆ‹ÌEh’DRèAˆ¡ÌEhà‘DPè1ˆ‹ ÌEhÄ‘DQè ˆ‹ÌEh”‘DR舡ÌEƒÄ@hh‘DPèü‡‹ ÌEh8‘DQè뇋ÌEh‘DRèÚ‡¡ÌEhàDPèʇ‹ ÌEhDQ蹇‹ÌEhHDR訇¡ÌEhDP蘇‹ ÌEhàDQ臇‹ÌEƒÄ@h´DRès‡¡ÌEh€DPèc‡‹ ÌEhPDQèR‡‹ÌEh DRèA‡¡ÌEhäŽDPè1‡‹ ÌEj;j;hÌŽDQ臋ÌEhˆŽDRè ‡¡ÌEƒÄ@hXŽDPèø†‹ ÌEh4ŽDQè熋ÌEhðDRèÖ†ƒÄé´ ºäD‹ÏIŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãuu9^„Éüÿÿ‹~ƒÆ¹$D‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ãu ÇD$hÿÿÿÿéüÿÿWè’‡ƒÄ‰D$h;Ã…xüÿÿ‹¡ÌERhˆ•DPéUüÿÿºÇC‹ÏŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu9^„$üÿÿ‹NƒÆ‰L$Héüÿÿº D‹ÏIŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu9^„Ùûÿÿ‹VƒÆ‰”$éÏûÿÿº0D‹ÏëIŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu9^„‰ûÿÿ‹FƒÆ‰D$Xé‚ûÿÿº”þC‹ÏŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu9^„Aûÿÿ‹NƒÆ‰Œ$€é7ûÿÿºÜD‹ÏŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu ÇD$téúúÿÿºÔD‹ÏŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu9^„¹úÿÿ‹VƒÆ‰”$„é¯úÿÿºÌD‹ÏëIŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu(9^„iúÿÿƒÆ;ëuè,„‹è‹PUèýƒƒÄéRúÿÿº ´C‹ÏŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu9^„úÿÿ‹NƒÆ‰L$Dé úÿÿº˜´C‹ÏŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu9^„Éùÿÿ‹VƒÆ‰T$éÂùÿÿºÇC‹ÏŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu9^„ùÿÿ‹FƒÆ‰D$(ézùÿÿºÇC‹ÏŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu9^„9ùÿÿ‹NƒÆ‰L$$é2ùÿÿºÀD‹ÏŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu#9^„ñøÿÿ‹VƒÆ‰”$ˆÇD$8éßøÿÿº°C‹ÏëIŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu9^„™øÿÿ‹FƒÆ‰D$pé’øÿÿº °C‹ÏŠ:u„ÀtŠA:BuƒÁƒÂ„Àuä3ÀëÀƒØÿ;Ãu9^„Qøÿÿ‹NƒÆ‰Œ$ŒéGøÿÿ¹ì¯C‹ÇŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ;Ã… øÿÿ9^„øÿÿ‹VƒÆ‰T$|éû÷ÿÿ‹D$|‹ ÌESPQèö¦ÿÿ‰D$‹„$”ƒÄ ;Ãt9\$ t‰D$$ë‰D$(‹L$$T$4R‹T$,D$TP¡ÌEQRPèõ¶ÿÿƒÄ…Àu‹ ÌEhØÅCQèQƒÄé/9\$ ‹\$4u‹\$P‰\$(…Ût‰\$$ÇD$8ëœ$””$ȉ\$(‰T$$ƒ|$ ‹t$Hu…öt8‹ ÌE3À…ö•ÀPQjè×ÿÿƒÄ …ötVè Ùÿÿ‹ÌEPhðÑCRèË€ƒÄèA‹|$D…ÿuWÿ0¬CPè䃋ð‰t$lëhXÈCWè•€‹ð‰D$lƒÄ…öu+‹Ç…ÿu¸¸DP¡ÌEh˜DPèr€Wÿ4«CƒÄéIƒ|$ujÿ0¬CƒÀ P胋ø‰|$Hë‹L$h$±CQè.€‹ø‰D$HƒÄ…ÿu2‹D$…Àu¸ŒD‹ÌEPhhÈCR耋D$$Pÿ4«CƒÄéÛƒ|$,t8‹L$ QhxD”$Ðj2Rè˃ƒÄ…Àt¡ÌEh`DP较Ä霃|$ „‹D$‹È3ÿƒá3Û‰|$€ùu‹ÌEhPDR脃Äéb‹ðƒæt‰|$`¨u?‹„$…Àu‹D$D‹L$‹T$PhDDQRjjP¡ÌEPè{µÿÿ‹ØƒÄ…Û„‹l$…ö…©‹L$‹T$D¡ÌEh4DQVjRPèõžÿÿ‹øƒÄ…ÿ„'…ÛtwW3íèÞ~ƒÄ…À~RëIUWèÁ‹ðSVè섃Ä…ÀuWEè´~ƒÄ;è|Ûë&jjV‰t$$èÕ‹jjVè?‡UW辋ƒÄ …öu‹ ÌEhDQè†~é©‹l$ƒ|$Xt`‹T$‹D$X‹ ÌEhôŒDRjjPQèCžÿÿ‹ðƒÄ…ö„uVè2~ƒÄ…À~Vè~PWè~Vè~ƒÄ…ÀæVèó}‹l$ ƒÄƒ|$`„²èŠ~‹ð…öu‹ÌEhØŒDRèï}é‹D$p‹Œ$ŒPQVèñŠƒÄ …Àu Vèp†ƒÄ‹D$T$TRVPèèÿÿV‹èèß}ƒÄ…í… u‹l$TUè…}ƒÄ;Æ~VUèm~PWèd}UFèi}ƒÄ;ð|äjUèP~Pè}Uè6}‹l$,ƒÄU3öè?}ƒÄ…À~1›VUè!~ƒÄjÿPVWè~ƒÄPèÁ…UFè}ƒÄ;ð|Õ‹„$„…Àt…ÛtjÿPhh¡Sè ŠƒÄƒ|$tt…ÛtjÿjjhXSè쉃ă|$8uUjhÀŒD„$œj2P讀ƒÄ…Àt8‹ ÌEh`DQè |éÃ|}Uè¥|‹ ÌEPh¤ŒDQè|ƒÄ餃|$,uj2”$˜R„$ÐPè}ƒÄ ‹L$l‹T$x‹D$LQ‹L$ljÿR‹T$$P‹„$Q‹L${ƒÄéqjVè ‡‹ðƒÄ‰t$\…öu‹ÌERè{ƒÄéHƒ|$8u6jhŒŒD„$œj2PèLƒÄ…Àt‹ ÌEh`DQè>{ƒÄé ƒ|$,uj2”$˜R„$ÐPèJ|ƒÄ öD$t/‹N‹A…Àt PèÖ‡ƒÄ븋ÌEPhxŒDRèâzƒÄ ƒ|$Tt8‹l$$€}ujjjVè4†ƒÄ …ÀtYƒ|$,u3Û‹ÌEhdŒDRè£zƒÄ‹D$4‹L$PQjÿSVWèæÿÿƒÄ…ÀuR‹ÌEh<ŒDRètz¡ÌEPè zƒÄ ë9jÿUVèË…ƒÄ …Àu ¡ÌEhŒDPèDz‹ ÌEQèØyƒÄ ëÇD$<‹D$\…Àt P腃ă|$ ][uƒ|$@t‹ ÌEQjèxÑÿÿƒÄ‹T$\Rè¿y‹D$|ƒÄ‹Œ$ì‹D$,3ÌèŠÄðÃSV‹t$‹WPè§~jÿÿÿƒÄƒø‡Pÿ$…ÜCŠ\$ öÃt‹ ÌEhÄ–DQèSyƒÄöÃ…U‹V‹\$h´–DRSè æÿÿ‹vVèo†‹øƒÄ…ÿ„´‹Fh¤–DPSèûåÿÿ‹L$0‹,EQjjjRWSè{Wè®{ƒÄ,_^¸[Ê\$ öÃt$¡ÌEh–DPèËx‹N‹¡ÌERPè–ãÿÿƒÄöÃ…¼‹N‹\$h´–DQSè‡åÿÿ‹T$(‹D$$RPVèÉ…‹ðƒÄ…ötVèÀ…‹øƒÄ…ÿuV襅ƒÄ_^3À[ËNh¤–DQSèAåÿÿV臅‹T$4¡,ERjjjPWSèAzWèïzƒÄ0_^¸[Ê\$ öÃt‹ ÌEh|–DQè xƒÄöÃ… ‹VhRè#…ƒÄ…ÀtöÃt_^¸[ÃöÃ…á‹F‹|$h´–DPWè¬äÿÿ‹N‹Rè×|ƒÄ=ž…µVèÍ„‹ðƒÄ…ö„*ÿÿÿVW虋ÿÿVWèèxVèwƒÄ_^¸[Ë\$ öÃt¡ÌEhh–DPè[wƒÄ‹N‹|$h´–DQWè1äÿÿ‹T$0‹D$(‹L$$R‹VSPQRWèáÿÿƒÄ$_^[áÌEhH–DPèw‹‹ÌEQRè‘{¡ÌEh„µCPèõvƒÄ_^¸[ÃWÿBàÿBŸC C CPCÌÌÌÌÌÌÌÌÌÌÌ̸xèö†¡E3ĉD$t¡ÌESUV3ö3í3ÛW‹¼$‰t$0‰t$D‰t$4‰t$<‰t$8ÇD$ ÿÿÿÿ‰t$,ÇD$@‰t$‰t$(‰t$‰t$‰t$H;ÆuSÿ0¬CƒÀ@PèyƒÄ£ÌEjP襜ÿÿƒÄ…À„” ¸‰D$$‰D$èšvè}ƒÇ¾‹ëë¤$‹…Û„_€;-…VºàšD‹Ë›Š:u„ÀtŠA:Bu ÎÖ„Àuæ3ÀëÀƒØÿ…ÀuH9Gt.‹GƒÇPèºyƒÄ‰D$,…Àu‹QhÌšD‹ÌERèuƒÄ ½ƒÇ…í„vÿÿÿéâºÈšD‹ËŠ:u„ÀtŠA:Bu ÎÖ„Àuæ3ÀëÀƒØÿ…Àu&9Gt¸‹GƒÇPè€vƒÄ‰D$ …Àu¦‹Qhˆ•D눺¤´C‹Ë›Š:u„ÀtŠA:Bu ÎÖ„Àuæ3ÀëÀƒØÿ…Àu!9G„Zÿÿÿ‹GƒÇPè4…ÿÿƒÄ‰D$$éGÿÿÿºXÇC‹ËŠ:u„ÀtŠA:Bu ÎÖ„Àuæ3ÀëÀƒØÿ…Àu!9G„ ÿÿÿ‹OƒÇQèä„ÿÿƒÄ‰D$é÷þÿÿºÀšD‹ËŠ:u„ÀtŠA:Bu ÎÖ„Àuæ3ÀëÀƒØÿ…Àu ÇD$8é»þÿÿºÐ•D‹ËëIŠ:u„ÀtŠA:Bu ÎÖ„Àuæ3ÀëÀƒØÿ…Àu ÇD$@é{þÿÿº´šD‹ËëIŠ:u„ÀtŠA:Bu ÎÖ„Àuæ3ÀëÀƒØÿ…Àu ÇD$(é;þÿÿº¬šD‹ËëIŠ:u„ÀtŠA:Bu ÎÖ„Àuæ3ÀëÀƒØÿ…Àu ÇD$éûýÿÿº¤šD‹ËëIŠ:u„ÀtŠA:Bu ÎÖ„Àuæ3ÀëÀƒØÿ…Àu ÇD$é»ýÿÿºœšD‹ËëIŠ:u„ÀtŠA:Bu ÎÖ„Àuæ3ÀëÀƒØÿ…Àu ‰t$éýÿÿºÇC‹ËŠ:u„ÀtŠA:Bu ÎÖ„Àuæ3ÀëÀƒØÿ…Àu9G„:‹WƒÇ‰T$4é9ýÿÿºÇC‹ËIŠ:u„ÀtŠA:Bu ÎÖ„Àuæ3ÀëÀƒØÿ…Àu9G„ñ‹GƒÇ‰D$<éðüÿÿºì¯C‹ËŠ:u„ÀtŠA:Bu ÎÖ„Àuæ3ÀëÀƒØÿ…Àu9G„«‹OƒÇ‰L$Héªüÿÿº ´C‹Ëd$Š:u„ÀtŠA:Bu ÎÖ„Àuæ3ÀëÀƒØÿ…Àu9G„jüÿÿ‹WƒÇ‰T$0é`üÿÿ¹˜´C‹ÃŠ:u„ÒtŠP:Qu Æ΄Òuæ3ÀëÀƒØÿ…À…)üÿÿ9G„ üÿÿ‹GƒÇ‰D$Déüÿÿ…í„"‹ ÌEh„šDQè‚q‹ÌEhì³CRèqq¡ÌEh¬ DPèaq‹ ÌEhXšDQèPq‹ÌEh(šDRè?q¡ÌEhü™DPè/q‹ ÌEhŒ DQèq‹ÌEhÌ™DRè q¡ÌEƒÄ@h¨™DPèúp‹ ÌEht™DQèép‹ÌEh0™DRèØp¡ÌEhð˜DPèÈp‹ ÌEhĘDQè·p‹ÌEhŒ˜DRè¦p¡ÌEhX˜DPè–p‹ ÌEh$˜DQè…p‹ÌEƒÄ@h¨DRé@‹D$H‹ ÌEjPQ誕ÿÿ‹L$H‹øT$ R‹T$DD$(P¡ÌEQRPèÉ¥ÿÿƒÄ …Àu‹ ÌEhØÅCQéôƒ|$ ÿuƒ|$,uÇD$ ‹t$0…öt.hXÈCVèöo‹èƒÄ…íu-‹ÌEVh¸ŠDRèáoƒÄ é°jÿ0¬CPèsƒÄ‹è‹t$D…öt-h$±CVè­o‹ØƒÄ…Ûu/¡ÌEVhœŠDPè™oƒÄ éhjÿ0¬CƒÀ Pè¶rƒÄ‹Øƒ|$8„*Uè:o‹L$‹T$(‹D$4h ˜DWQ‹ ÌEjRPQ胥ÿÿ‹èƒÄ …íuSèþoƒÄé‹T$RUè·|‹ðƒÄ…öu0¡ÌEh˜DPè o‹ ÌEQè nUè¸qSèºoƒÄéÃ|$(tW‹D$ƒøuVSèa|ƒÄé;ƒøuVSèG|ƒÄé'‹ÌEhè—DRè¨nVèÚ{UèZqSè\oƒÄée‹|$…ÿu6jhÌ—D|$X‹Çj2PègrƒÄ…ÀtVèœ{UèqSèoƒÄ é'‹ ÌEjQjè\Äÿÿ‹ÇƒÄ Pd$Š@„Éuù‹L$ V+‹T$DRjjP‹D$@WPQè{‹øƒÄ …ÿu6‹ÌEh´—DRèöm¡ÌEPè‹mVè{UèpSèŸnƒÄ騋 ÌEQjè?ÅÿÿƒÄƒ|$u WSè,{ëƒ|$…ìþÿÿWSè{ƒÄWè{ƒÄVèÄzUèDpSèFn‹D$$ƒÄ …Àt PèýoƒÄ‹D$…Àt PèìoƒÄ_^]3À[‹L$t3Ìè±}ƒÄxÃ|$(‹D$$t3ƒøujjjUè’z‹øé®ƒø…ÞjUètzƒÄ‹øé–ƒøujjjUèSzƒÄëƒø…­jUè7zƒÄ‹ð…öu%h —D‹ ÌEQèÇl‹ÌERè[lƒÄ 銋|$…ÿujh—D|$X‹Çj2PèŒpƒÄ‹ÇPŠ@„Éuù+ÂPWVèÍyV‹øèãyƒÄ…ÿuhx—Dë”Wè¥y‹ðƒÄ…öu$¡ÌEh˜DPèHl‹ ÌEQèÜkƒÄ é ƒ?t[‹ÌEhX—DRèl‹ƒÄƒèt-ƒètƒèth@—Dë!‹ ÌEh—DQë‹ÌEhð–DRë hЖD¡ÌEPè×kƒÄWèyƒÄƒ|$u‹L$QjjjjVSèºmƒÄëƒ|$uZVSèçxƒÄVèRnSèTlUèXk‹D$$ƒÄ …Àt PènƒÄ‹D$…À„ þÿÿPèðmƒÄ_^]3À[‹L$t3Ìèµ{ƒÄxËÌEhè—DRë ¡ÌEhè—DPè,kƒÄ‹Œ$„_^][3̸èy{ƒÄxÃÌÌÌÌÌÌÌÌÌ̸Lè6{¡ÌEU3í‰l$ ÇD$‰l$‰l$‰l$@‰l$<‰l$D‰l$0‰l$‰l$$‰l$ÇD$4`óCÇD$88°C‰l$,‰l$(‰l$H‰l$‰l$ ;ÅuUÿ0¬CƒÀ@PèÀmƒÄ£ÌEUPèçÿÿƒÄ…À„US‹\$XVW‹|$d‹KƒÇƒû‰D$XŒ)‹7¹ ´C‹ÆëIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒûŒ‹OƒÇ‰L$<é鹘´C‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒûŒÀ‹WƒÇ‰T$ 陹ÇC‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒûŒp‹GƒÇ‰D$0éI¹PÇC‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒûŒ ‹OƒÇ‰L$4éù¹ðœD‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒûŒÐ‹WƒÇ‰T$8驹ÐýC‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒûŒ€‹GƒÇ‰D$@éY¹äœD‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒûŒ0‹OƒÇ‰L$Dé ¹ì¯C‹Æ¤$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒûŒà‹oƒÇé½¹Œ´C‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$H逹HÇC‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$PëF¹˜ÆC‹Æd$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$LëÇD$,KƒÇƒûºüÿÿƒ|$,„Ø‹T$X¡ÌERhÔœDPèìf‹ ÌEhì³CQèÛf‹ÌEh¬ÄCRèÊf¡ÌEhŒÄCPèºf‹ ÌEh¤œDQè©f‹ÌEhtœDRè˜f¡ÌEhPœDPèˆf‹ ÌEh(œDQèwf‹ÌEƒÄDhœDRècf¡ÌEh@ÄCPèSf‹ ÌEhÜ›DQèBf‹ÌEh ›DRè1fƒÄ é è¢f‹L$0‹ÌEjD$,PjQRè–›ÿÿƒÄ…Àu¡ÌEh˜ÈCPèóeƒÄéÍ‹ ÌEjUQè(‹ÿÿ‹t$@ƒÄ …ö„º85D‹Î‹ÿŠ:u„ÛtŠY:ZuƒÁƒÂ„Ûuä3ÉëɃÙÿ‹T$(hDDP¡ÌER÷ÙjÉj#ÎQP躛ÿÿƒÄ‰D$…À„Qè&s‹t$8‹ø‰|$…öt!‹ÆPIŠ@„Éuù‹+‹QPVRèôrƒÄ ‹|$‹t$WVèÜrè{hPWVèÉrVè½r‹ð‹D$8ƒÄ…Àt h”ÈCPèûdëjÿ0¬CƒÀ Pè$hƒÄ‰D$…Àu h„›DéóVhx›DPèÍdVèUgƒÄ陋D$<…Àth ®CPè¦d‹ð‰t$,ëjÿ0¬CPèÌg‹ð‰D$,ƒÄ…öu h\›Dé¸jè,ej‹øVW‰|$dèrƒÄ…Àu%‹ ÌEh@›DQèQd‹ÌERèåcƒÄ é‹t$@‹D$DVPWèÕdƒÄ …Àu&‹ ÌEVh ›DQèd‹ÌERè¨cƒÄéâjÿPèJi‹ðƒÄ‰t$…öu$h›D¡ÌEPèÛc‹ ÌEQèocƒÄ é©‹D$ …Àth”ÈCPè®c‹ø‰|$ëjÿ0¬CƒÀ PèÑf‹ø‰D$ƒÄ…ÿu h„›D齃|$Hu VWèqƒÄVè³hƒÄƒ|$L‹Ø‰\$t&SVè–hƒÄ…ÀŽ‹ ÌEhøšDQè:cƒÄƒ|$Pt SWè»dƒÄÇD$_^[‹L$HQè­c‹T$ RèAh‹D$ PèÍb‹L$Qè¹c‹T$Rè§e‹D$0ƒÄ]…Àt PèeeƒÄ‹D$ ƒÄLÃhäšD‹ÌERè»b¡ÌEPèPbƒÄ ëÌÌÌÌÌÌÌ‹D$…Àu¸ÃSh”ÈCPè„b‹ØƒÄ…Ûu[ÃVW3öèdbƒÄ…À~VWèLcPSèÃcWFèHbƒÄ;ð|äSèbƒÄ^¸[ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌV‹t$ WVè2j‹|$ƒÄƒø+t …Àuƒÿu Vjè—ÿÿƒÄ‹Ç_^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ̸œè&r¸‰D$X‰D$@‹„$¤ƒÀS3Û‰D$¡ÌEV¾‰\$ÇD$P ®CÇD$h”ÈC‰œ$”‰\$t‰\$8‰\$X‰œ$œ‰\$<‰œ$ˆ‰\$‰\$ ‰\$D‰\$\‰\$d‰\$L‰\$@‰\$0‰\$$‰\$‰\$,‰\$ÇD$ @‰œ$‰œ$˜‰œ$ ‰œ$€‰\$x‰œ$Œ‰\$l‰\$p‰\$4Ç„$„‰\$|‰\$T‰t$(;Ãu9èuaPèiaƒÄ£ÌE;Ãt"ÿ0¬C‹ ÌEƒÀ@PjjjQè=a¡ÌEƒÄSPè.‡ÿÿƒÄ…À„rUW9\$…Ô‹|$½9„ ‹7€>-… º¼ D‹Îd$Š:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;ÃuƒÇÇD$‰|$éÀ º° D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;ÃuƒÇ‰l$‰|$é‚ º”ÌC‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;ÃuƒÇÇD$‰|$é@ º˜ÆC‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;ÃuƒÇÇD$‰|$éþ ºP§D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;ÃuƒÇÇD$‰|$é¼ º<3D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãuèúa‹|$ƒÇ‰D$ ‰|$éu ºD3D‹ÎIŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãuè˜g‹|$ƒÇ‰D$ ‰|$é+ ºH§D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãuèyl‹|$ƒÇ‰D$ ‰|$éä º<§D‹Î‹ÿŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãuè*l‹|$ƒÇ‰D$ ‰|$é› º4§D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;ÃuèÝk‹|$ƒÇ‰D$ ‰|$éT º,3D‹Î‹ÿŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãuèlf‹|$ƒÇ‰D$ ‰|$é º$3D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãuèf‹|$ƒÇ‰D$ ‰|$éÄ º3D‹Î‹ÿŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;ÃuèÐe‹|$ƒÇ‰D$ ‰|$é{ º`ÆC‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;ÃuƒL$ƒÇ‰|$é< º(§D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;ÃuƒL$ƒÇ‰|$éýºßC‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;ÃuƒL$ ƒÇ‰|$龺§D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;ÃuƒL$ƒÇ‰|$éº$–D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãu l$ƒÇ‰|$éAº§D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;ÃuL$ƒÇ‰|$éÿº§D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãuƒd$¿ƒÇ‰|$éÀºü¦D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;ÃuL$ƒÇ‰|$é~ºTÌC‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;ÃuL$€ƒÇ‰|$é<ºô¦D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;ÃuƒL$ƒÇ‰|$éýºè¦D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;ÃuL$ƒÇ‰|$黺ܦD‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;ÃuL$ƒÇ‰|$éyºÇC‹Î¤$Š:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;ÃuB9_t!ƒÇ‰|$‹ƒÇ‰T$xÇD$<‰|$éƒÇÇD$ÇD$<‰|$éºì¯C‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãu%9_„|ƒÇ‰|$‹ƒÇ‰„$„‰|$鯺ÇC‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãu%9_„)ƒÇ‰|$‹ƒÇ‰Œ$”‰|$é\ºØ¦D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãu%9_„փlj|$‹ƒÇ‰”$˜‰|$é ºÐ¦D‹Î¤$Š:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãu%9_„|ƒÇ‰|$‹ƒÇ‰„$ ‰|$鯺hÆC‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãu%9_„)ƒÇ‰|$‹ƒÇ‰Œ$¨‰|$é\ºÈ¦D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãu"9_„փlj|$‹ƒÇ‰T$@‰|$é ºÀ¦D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãu"9_„†ƒÇ‰|$‹ƒÇ‰D$`‰|$鼺 D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãu"9_„6ƒÇ‰|$‹ƒÇ‰L$D‰|$élº,ÇC‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãu29_G„ã‰D$‹Rè gÿÿ‹|$ƒÄƒÇ‰„$Œ‰|$é º0D‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãu%9_„†ƒÇ‰|$‹ƒÇ‰„$¤‰|$鹺 °C‹Î¤$Š:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãu%9_„,ƒÇ‰|$‹ƒÇ‰Œ$ˆ‰|$é_º°C‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãu%9_„كlj|$‹ƒÇ‰”$€‰|$é º ´C‹ÎŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãu%9_„†ƒÇ‰|$‹ƒÇ‰„$œ‰|$鹺¤´C‹Î¤$Š:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãu/9_G„)‰D$‹QèQeÿÿ‹|$ƒÄƒÇ‰D$h‰|$éUºXÇC‹ÎIŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãu/9_G„ɉD$‹Rèñdÿÿ‹|$ƒÄƒÇ‰D$P‰|$éõº˜´C‹ÎIŠ:u:ÃtŠA:Bu ÍÕ:Ãuæ3ÀëÀƒØÿ;Ãu"9_„lƒÇ‰|$‹ƒÇ‰D$|‰|$颹´¦D‹ÆŠ:u:ÓtŠP:Qu ÅÍ:Óuæ3ÀëÀƒØÿ;Ã…59_tƒÇ‰|$‹ƒÇ‰Œ$‰|$éOƒÇÇD$‰|$é;¡ÌET$\RPL$ QT$SRè…„ÿÿƒÄ…Àu‹|$ƒÇÇD$‰|$ë‹|$9\$„Ýòÿÿ‹D$ƒøu9\$@…r¡ÌEh¦DPéR;Åu59\$`…\9\$D…R‹ ÌEhd¦DQè3SƒÄÇD$é;ƒø…;9u‹ÌEh8¦DRèSƒÄÇD$ÇD$<9\$„¡ÌEh¦DPèØR‹ ÌEhì³CQèÇR‹ÌEhô¥DRè¶R¡ÌEhÈ¥DPè¦R‹ ÌEh¨¥DQè•R‹ÌEh€¥DRè„R¡ÌEhX¥DPètR‹ ÌEh0¥DQècR‹ÌEƒÄ@h ¥DRèOR¡ÌEhܤDPè?R‹ ÌEh¸¤DQè.R‹ÌEh¤DRèR¡ÌEhÄ‘DPè R‹ ÌEh`¤DQèüQ‹ÌEh ¤DRèëQ¡ÌEhð£DPèÛQ‹ ÌEƒÄ@h¼£DQèÇQ‹ÌEh|£DRè¶Q¡ÌEhX£DPè¦Q‹ ÌEh$£DQè•Q‹ÌEhô¢DRè„Q¡ÌEhÌ¢DPètQ‹ ÌEh¤¢DQècQ‹ÌEhh¢DRèRQ¡ÌEƒÄ@hL¢DPè?Q‹ ÌEh¢DQè.Q‹ÌEhСDRèQ¡ÌEh”¡DPè Q‹ ÌEhx¡DQèüP‹ÌEh<¡DRèëP¡ÌEhø DPèÛP‹ ÌEhÜ DQèÊP‹ÌEƒÄ@h¼ DRè¶P¡ÌEh¤ DPè¦P‹ ÌEhp DQè•P‹ÌEh@ DRè„P¡ÌEh DPètP‹ ÌEhÈŸDQècP‹ÌEhpŸDRèRP¡ÌEh4ŸDPèBP‹ ÌEƒÄ@hŸDQè.P‹ÌEj;j;hÌŽDRèP¡ÌEhÀžDPè P‹ ÌEhˆÒCQèøO‹ÌEh„žDRèçOƒÄ0é{;Ã…åüÿÿÇD$éâüÿÿ‹„$„‹ ÌESPQèuÿÿ‹ ÌES”$„R‹ð‹„$¨SPQè!…ÿÿƒÄ …Àu h˜ÈCé9\$<„;‹|$x‹ ÌE3À;û•ÀPQSè}¥ÿÿƒÄ ;ûtW耧ÿÿ‹ÌEPhðÑCRèBOƒÄ‹D$‰l$0ƒøtƒd$¿¿XÈC¨töD$€t‰|$Xƒ|$Pu$ÇD$p$±CëöD$€tÇD$p$±Cƒ|$hu‰|$Xƒø…h9\$ u èÒ\‰D$ è×N‰D$H‹D$9„@‹‹ ÌEhhžDVSjPQèEkÿÿƒÄ;Ä:‹T$HPRèuN‹D$ƒÀƒÄ‰D$9uÀ‹D$‹L$@;Ët-ƒøu(¡ÌEhTžDVSjQPè÷jÿÿƒÄ‰D$l;Äè‹D$‹Œ$¤;Ë„9h4®CVSjQ‹ ÌEQènÿÿƒÄ‰D$8;Ãu‹ÌERè¬MƒÄé ‹D$‹|$`;û„<;Å…D¡ÌEhhžDVSjWPèsjÿÿƒÄ‰D$d;Ãu‹ ÌEQè`MƒÄéT;Åu ‹D$D;Ãu‹Çëƒø…@‹D$D;Ãu‹D$@;Ãt0‹T$t‹Œ$Œh@žDVR‹ÌESQPR誃ÿÿƒÄ‰D$T;Äû‹¼$œ;û„2‹D$XPWè?M‹ðƒÄ‰t$,;óu0‹ ÌEWh¸ŠDQè&MƒÄ éºSÿ0¬CPèGPƒÄ‹ð‰D$,‹|$|;ût/‹T$pRWèïLƒÄ‰D$$;Ãu0¡ÌEWhœŠDPèÙLƒÄ émSÿ0¬CƒÀ Pè÷OƒÄ‰D$$ƒ|$…I‹Œ$€‹”$ˆ¡ÌEQRPè°pÿÿƒÄ ‰D$L;Ä!‹ÈÇAC‹D$\;Ãt PQèÓLƒÄ‹t$,‹D$ÇD$0ƒøu0‹L$‹T$ ‹D$HQRVPè&ZƒÄ‹ð‰t$(;ó…ïhžD鲃ø…3‹D$¨@tƒ|$Pu ‰D$‹L$8‹T$TP‹D$pVQRPèÎYƒÄ묋D$hƒøuL$4QVè¯Y‹ð‰t$0ë/ƒøuSSSVèûQ‹ðƒÄ‰t$(ëƒø…3SVèæQ‹ð‰D$0ƒÄ;óu hüD鋼$;û„Gÿÿÿ‹D$4PèDKhXÈCWècKƒÄ ‰D$4;Ã…#ÿÿÿ‹ ÌEWhàDQèHKƒÄ éÜ‹D$ÇD$0;Å…6‹D$‹L$$‹T$dP‹D$XQRPVèæXƒÄ…À…{‹ ÌEh¼DQ銃ø…¦‹T$‹D$$‹L$4R‹T$PP‹D$@QRPVèœXƒÄ…À„l‹ ÌEh DQè²J‹T$‹D$@‹L$0RPQèfX‹t$T‹øVèîçÿÿƒÄ…Àu"‹ÌEVh€DRèyJƒÄ ÇD$0éWè9JƒÄ‰\$0éó¡ÌEhhDPéÛƒøu‹L$$VQè[PƒÄ‰\$0éÇ‹„$˜‹|$$;ÃtPh`DWèJƒÄ ‹„$ ;ÃtPhTDWèöIƒÄ ‹„$¨;ÃtPhDDWèÜIƒÄ ‹D$Pƒøu‹T$‹D$,RPVWèWƒÄ‰\$0éOƒøuVWèËOƒÄ‰\$0é7ƒøuVWè¹OƒÄ‰\$0ë"‹ ÌEh DQë hüœD‹ÌERègIƒÄ_]9\$4t¡ÌEPSèÌ ÿÿƒÄ‹t$(;ót‹ ÌEQèÙHƒÄ‹T$@h^xCRèQI‹D$8h^xCPèBI‹D$dƒÄ;Ãt Pè=IƒÄ‹L$DQè*ISèŽH‹T$dRè„H‹D$pPèzH‹L$\Qè”K‹T$4RèO‹D$U‹l$ ujkhp¬DU‰+èGƒÄ ‰…Àu3À]ÃÆ‹P‹ÿŠ@„Éuù+‹ЋD$WxŠ@„Éuù‹ +ÇÂ_;Árjw)hp¬DP‰‹Pè.NƒÄ‰‹…Àt­€8t‹ Qhl¬DPèhDƒÄ ‹‹D$‹RPQèUDƒÄ ¸]ÃÌÌÌÌÌÌÌÌÌÌÌ‹D$SUWPPhجDV‹Ù3ÿ3íèúBƒÄ…Ûuh̬DVèèBƒÄG_][ÃöÃthÀ¬DVèÎBƒÄöÃth¸¬DVè»BƒÄ¿öÃt*…ÿth´¬DVèŸBƒÄ½h¬¬DVèŒBƒÄ¿öÃt*…ÿth´¬DVèpBƒÄ½h ¬DVè]BƒÄ¿ƒãðt!…ÿth´¬DVèABƒÄSh”¬DVè2BƒÄ …íth€¬DVè BƒÄh„µCVèBƒÄ_]¸[ÃÌ̸è6RSUV‹t$ W3ÛSSSj V‰\$(‰\$$3íè½MƒÄ…À„cSSSj Vè§M‹øƒÄ…ÿŽKè¹A‰D$…À„.IjjWjVèyMƒÄ‰D$…ÀŒß¨t ƒ|$(ŒxjjWjVèNMƒÄ…Àޏhë@hp¬DPèªD‹ØƒÄ …Û„šjSWjVèMƒÄ…ÀŽƒjjWjVèMƒÄ…ÀŒk~7hö@hp¬DPè[DƒÄ ‰D$…À„IjPWjVèÈLƒÄ…ÀŽ2…íu‹t$0‹L$,VQèNEƒÄ‹èë‹T$,hl¬DRè²@‹t$8ƒÄèƒ|$(u`‹ÆPŠ@„Éuù+Â;è~7‹ÃP¤$Š@„Éuù+ÂŃøN~‹l$,h„µCUèe@VUèäDƒÄ‹è‹D$,Sh ýCPèI@ƒÄ èë=‹D$…Àu¸ô¬D‹l$,PShì¬DUè$@ƒÄƒ|$(|‹L$V‹õèúüÿÿƒÄ…Àt^3í‹t$$Sè‰B‹D$ƒÄ3Û…Àt PèvBƒÄ‰\$jjWj Vè¶K‹øƒÄ…ÿ#þÿÿ…í~‹L$,h„µCQè´?ƒÄÇD$‹T$hð4CRèÄ?ƒÄ…Ût SèBƒÄ‹D$…Àt Pè BƒÄ‹D$_^][ƒÄÃ_^]¸[ƒÄÃÌÌÌÌÌÌÌÌÌÌÌ̸è†O¡E3ĉ„$‹„$U‹¬$ V‹ñV‰D$‰t$‰l$ è?ƒÄ‰D$…À}%hH­DUè?ƒÄ^]‹Œ$3ÌèVOÄÃS3Û…À޼Wë ›‹t$SVè­?‹ðhlÇCVÿ|«C‹øƒÄ…ÿu2‹L$PPVQèoJƒÄ…ÀuYVh8­DUè’>Uè,>ƒÄC;\$|®ë^‹ï+îýþ@UT$$VRèäN‹L$ jGWD$4PQÆD,<èJ‹l$,ƒÄ…Àt§Vh(­DUè9>ƒÄ ë«‹T$h­DRè%>ƒÄ_‹Œ$[^]3ÌèwNÄÃÌÌÌÌ̸8è6NV3öÇD$$‰t$4‰t$(‰t$,‰t$0èà=‰D$è×=‰D$èÎ=‰D$ ‰t$è-;¡ÌE;ÆuVÿ0¬CƒÀ@PèØ@ƒÄ£ÌEVPèÿcÿÿƒÄ…À„÷SUWjÿ0¬CƒÀ Pèª@‹\$T‹|$XKƒÄƒÇƒû‰D$ŒA‹-<«C‹jh€ÙCPÿÕƒÄ …Àu~‹H‹ÁpŠ@„Òuù+Æhà­DQ‹ðÿœ«CƒÄ;Ær‹@PŠ@„Éuù+ƒø‰D$@ŽÖ¡àýD¾àýD…À„Td$P¡ÌEh ýCPèÓ<‹FƒÆƒÄ …Àuâé-‹7¹œÌC‹Æd$Š:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…Àu ÇD$4éZjhÜ­DVÿÕƒÄ …Àu]‹H‹ÁÇD$8p¤$Š@„Òuù+ÆhØ­DQ‹ðÿœ«CƒÄ;Æ‚8ÿÿÿ‹@PŠ@„Éuù+ÂHƒø‰D$<ÿÿÿéì‹7¹Ð­D‹ÆIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒÇ…Û„Õþÿÿ‹‹T$(Q閹ȭD‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…ÀuKƒÇ…Û„þÿÿ‹‹L$,PQëQjhXŠDVÿÕƒÄ …À„nþÿÿ‹7¹TŠD‹ÆŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3ÀëÀƒØÿ…À„8þÿÿ‹T$VRè ;ƒÄKƒÇƒûÅýÿÿ‹L$Qèû:ƒÄ…Àu.èGI‹ð…öt#‹|$IVè¾FPWèÉ:Vè!I‹ðƒÄ…öuä‹T$3ÛR‰\$Hè¶:ƒÄ…ÀŽ!‹l$ëI‹D$SPè;‹ðVèD‹øƒÄ …ÿ„ÏWèÈHPVh¼­DUè:‹L$t‹L$Vh”­DQèr8ƒÄ Vè÷:‹\$H‹l$ ƒÄƒ|$8tjhŒ­Dh ýCUèG8WèQFƒÄ…Àt!h|­DUè/8‹L$4UWèÐøÿÿWè(FƒÄë,hh­DUè8ƒÄƒ|$<tÿ0¬CƒÀ PèùEƒÄèù7‹D$@…À~hŒ­DUPWèÔõÿÿƒÄ…Àt=‹l$Wè?Aë ‹ÌERèY7‹D$ƒÄCP‰\$Hè•7ƒÄ;ØŒèüÿÿÇD$0_][‹ ÌEQè%7‹T$ hð4CRè 7‹D$(hð4CPè‘7‹L$4hð4CQè‚7‹D$,ƒÄ^…Àt Pè 8ƒÄ‹D$ ƒÄ8ÃÌÌÌÌÌÌÌV‹ñ…öu¡ÌEh®DPè7ƒÄ3À^Ã?u è@‰…Àt?‹L$VQjèí?‹ðƒÄ …öt)‹T$ VRèÇ6ƒÄ…Àt‹VPèÃ?ƒÄ…Àt¸^Ë ÌEhä­DQè¶6ƒÄ3À^ÃÌÌÌÌÌÌÌÌÌÌÌU‹l$ V‹ñ…öu¡ÌEh®DPèˆ6ƒÄ^3À]ÃSW‹|$ƒ?uèj?‰…À„ŠVè~6V‹øèªDUj‹Øè¸8‹ðƒÄ…öu‹ ÌEUh(®DQè36ƒÄ _[^3À]ÃVSWè9PègDV‹øè§8ƒÄ…ÿt0‹T$WRèã5ƒÄ…Àt‹D$‹WQèÛ>ƒÄ…Àt _[^¸]ËÌEhä­DRèË5ƒÄ_[^3À]ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸èæEƒ|$U‹l$(„šƒ|$ „‹D$$Pès5ƒÄ…À„zUèb5ƒÄ…À„iSU3ÛèN5ƒÄ…ÀŽTWSUè16‹L$4SQ‹øè$6Ph$®CVè45T$(RD$0PL$@Q‹L$LT$@RD$@PWQè€CƒÄ8…Àuh°®DVè„9ƒÄéâ‹T$8‹D$4‹L$ R‹T$PQRèGCƒÄ…Àuh®DVèQ9Vèe4ƒÄ ‹D$PèCPhà®CVè¬4h€®DVè'9‹L$(QVèôBh„µCVè9ƒÄ(ƒ|$ t$hp®DVèü8‹T$RVèÉBh„µCVèæ8ƒÄƒ|$uB‹D$ƒøÿtPèŸBPh`®DVè;4ƒÄhL®DVè³8‹D$$PVè€Bh„µCVè8ƒÄUCèû3ƒÄ;ØŒ®þÿÿ_[¸]ƒÄÃÌ̸è&D‹D$ VW3ÿWP‰|$‰|$‰|$‰|$‰|$ ‰|$$è-9‹ðƒÄ;÷uhÜ®DhNhÌ®DèBƒÄ 9~u h¸ïCè88ëVèf8‹øƒÄV‰|$èŸ5‹T$(‹BL$ QjPèË7W‹ðèï5ƒÄ_‹Æ^ƒÄÃÌÌVW3öè<Pè·3‹øƒÄ…ÿtQ‹D$ Pè®A‹ðƒÄ…öt>WjjvVèŠ33ÿWWjeVè~3ƒÄ …À4‹ ÌEhà®DQèú2‹ÌERèŽ2ƒÄ Vè«3Wè¯2ƒÄ_3À^Ã_‹Æ^ÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸èöB¡E3ĉ„$SU‹¬$VW3ÛSS‹òjeV‹ùèý2ƒÄ…À&¡ÌEh8¯DPèz2‹ ÌEQè2ƒÄ 3ÀéÉVèÊ;hT$‹ðRV‰7è>5ƒÄ…ÀŽŸ‹=<«CëI…ÛujD$h0¯DPÿ×ƒÄ …Àu(XŠD$< t3< t/hL$QVèð4ƒÄ …ÀÁëS‹ÌEh¯DRèâ1ƒÄë=jVhF‡Ch¾Cè[5‹ðƒÄ…öu¡ÌEh¯DPè²1‹ ÌEQèF1ƒÄ ‰u¸‹Œ$_^][3ÌèðAÄÃÌÌÌÌÌÌÌÌÌÌÌÌÌ̸Xè¦A¡E3ĉD$TU‹l$`VW¹¾X¯D|$ 󥤅Ûu_^3À]‹L$T3ÌèšAƒÄXÃjUè :PD$PSè1USh¦Cè{4jjj Sèo1‹Œ$ƒÄ0_^]3̸èQAƒÄXÃÌÌU‹ìƒäø¸èAWÇD$ ƒûÿtjjjfVè&1ƒÄjjjeVè1‹øƒÄ…ÿ,ƒûÿtjVè¹9ƒÄ…Àu‹Eh°DPè5ƒÄ3À_‹å]Ãûÿu‹M‹U QRVèý>ƒÄ _‹å]ÃD$PjjiVè¸0ƒÄ…À‹Mh°DQè½4‹D$ƒÄ_‹å]Ã…ÿM‹D$T$RjL$ Q‰D$(j@PÇD$,ÇD$(‰\$$èª?…Àu‹Uhì¯DRèj4ƒÄ3À_‹å]ËE‹M jÿPQVè^>‹øƒÄ…ÿ„@ÿÿÿT$ WRè@>ƒÄƒøÿ…º‹ÿ‹D$jV‰D$$ÇD$ ÇD$‰\$è¤8ƒÄ…ÀtL$QjjT$$RëjVè…8ƒÄ…Àt]L$QjT$ Rj‹D$@Pèõ>…Àt*ƒøÿt0L$ WQè»=ƒÄƒøÿtWè§=‹D$ƒÄ_‹å]ËUhدDRë‹EhȯDPë ‹Mh¬¯DQèu3ƒÄWèn=‹D$ƒÄ_‹å]ÃÌÌÌÌÌÌ‹D$ SVWP3ÿ3Ûèc=‹ðƒÄ…öu‹L$ht°DQè«.ƒÄ_^‹Ã[ËD$ …ÀtPjjdVèû.ƒÄƒ|$$u@èÆ-Pè0-‹øƒÄ…ÿu ‹T$hT°DRëLjjj!Wèõ+jWèå-VPè:/ƒÄ ‹ð‹D$‹L$‹T$‹\$(PQRèIýÿÿ‹ØƒÄ …Ûu¡ÌEh4°DPè.ƒÄ…ÿt Wèu,ƒÄ…öt VèÀ.ƒÄ_^‹Ã[ÃÌÌÌÌÌÌÌÌÌÌÌÌ̸ è>‹D$(SUVW3ÿP‹ñ3Û3í‰|$$è¨<ƒÄ‰D$(…ÀUjè<ƒÄéî‹T$@Rjè‡0Pè‡6‰D$,èf<jj‹øèA/ƒÄ‹Øƒþÿt"iö t$T‹ÆÁà+ÆÀÀPjè/ƒÄ‹èƒ|$(ÇD$ŽP‹L$‹T$8QRè<Pèû;‹ð‹D$,VPèè;ƒÄ…ÀtUSjjjVWèÌ;ƒÄéýVL$0Qjjjè­;‹T$@‹D$PRPèìøÿÿ3ɃÄ;ÁuUSQQjVWèŽ;ƒÄé¿‹Š€úVuUSQQQVWèq;ƒÄ颀úR…™‹@P‰L$‰L$‰L$L$QT$RD$0PL$$QÇD$8ÿÿÿÿè·gýÿ‹T$(‹D$8USRPjVWè;‹L$HƒÄ0…Ét jjQhŽë‹L$…ÉtjjQh®Pèß:ƒÄ‹L$Qè”0‹T$Rè€1‹D$ Pè˜0ƒÄ ‹D$@;D$(‰D$Œ°þÿÿ‹L$8QWè—:‹T$X‹D$TƒÄRPèÁ.‹L$P‹T$LPQRWèn:Wjèœ:ƒÄ ‹L$4S‰è1Uè1‹T$(Rè§4Wè;:ƒÄ_^]¸[ƒÄ Ã̸Üè¶;ƒÈÿS3ÛU‰„$¤‰„$܉„$À‰„$„‰D$P¡ÌEV¹3í3ö‰\$(‰\$$ÇD$p@ýC‰\$t‰\$x‰œ$œ‰\$d‰\$l‰\$L‰œ$„‰œ$”‰\$|‰L$ ‰œ$¼‰l$‰\$‰œ$‰\$<‰\$P‰œ$Ô‰\$X‰œ$ä‰\$H‰\$h‰\$‰\$‰œ$Œ‰œ$€Ç„$Ì,‰œ$´‰œ$°‰œ$܉œ$˜‰œ$ ‰œ$À‰œ$¸‰\$\‰œ$؉œ$¤‰\$ ‰\$8‰L$@‰œ$ȉ\$,‰\$0‰\$`‰\$D‰œ$¬‰\$4‰œ$Ð;ÃuSÿ0¬CƒÀ@PèT-ƒÄ£ÌESPè{PÿÿƒÄ…À„€èq'è¶(‹¬$ðƒÅèñ)‰D$,èè)‰D$0Wë¤$‹};û„ñ€?-…躘´C‹ÏëIŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu9]„š‹EƒÅ‰„$€éº¨MD‹ÏëIŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu<9]„J‹MƒÅQÿp«CƒÄ;É„$ä0‹U¡ÌERh¿DP麿D‹Ïd$Š:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;ÃuO9]„ÚŒ$¬QT$xR‹UD$0PL$8ƒÅQRè±1ƒÄ…À…±¡ÌEhdNDPè„(ƒÄ锺´^D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu9]„Z‹MƒÅ‰L$,éPº¸OD‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu9]„‹UƒÅ‰T$(éºü¾D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;ÃuÇ„$ÌéȺßC‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;ÃuÇ„$À鈺ô¾D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu ÇD$$éKºè¾D‹ÏIŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu ‰\$$éºØ¾D‹Ï¤$Š:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu ƒL$<éκȾD‹Ï›Š:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu L$<鋺¼¾D‹ÏIŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu ƒŒ$¨éKº¤¾D‹ÏIŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu ƒL$麔¾D‹Ï›Š:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu ƒL$éκˆ¾D‹Ï›Š:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu ƒL$鎺x¾D‹Ï›Š:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu L$éKºh¾D‹ÏIŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu ƒL$ éºX¾D‹Ï›Š:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu L$é˺L¾D‹ÏIŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu ƒL$鎺`ÆC‹Ï›Š:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu¸‰„$‰„$„é@º@¾D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;ÃuÇ„$éº4¾D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;ÃuÇ„$„éÀº,¾D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu9]„‚‹EƒÅ‰D$xéxº$¾D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu9]„:‹MƒÅ‰L$|é0ºÈ¦D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu9]„ò‹UƒÅ‰T$pé躾D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu 9]„ª‹EƒÅL$‰D$`阺¾D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu9]„Z‹MƒÅ‰Œ$¼éMº¾D‹ÏëIŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu9]„ ‹UƒÅ‰T$`éº °C‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu9]„‹EƒÅ‰„$¸éµº°C‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu9]t{‹MƒÅ‰Œ$´ëqºì½D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ã…–9]t3‹UƒÅRÿp«CƒÄ;É„$Ð}‹EPhнD‹ ÌEQèë ƒÄ ¾ƒÅ;ó„÷ÿÿ‹l$;ëu9\$xu9\$|u 9\$(t9\$Ht;ó„D ‹ÌEhÀ½DRèŸ ¡ÌEh¨½DPè ‹ ÌEhì³CQè~ ‹ÌEh„½DRèm ¡ÌEh\½DPè] ‹ ÌEh0½DQèL ‹ÌEh½DRè; ¡ÌEhȼDPè+ ‹ ÌEƒÄ@hŒ¼DQè ‹ÌEh@¼DRè ¡ÌEhø»DPèö‹ ÌEhÄ»DQèå‹ÌEh”»DRèÔ¡ÌEhX»DPèÄ‹ ÌEh»DQ賋ÌEhغDR袡ÌEƒÄ@h˜ºDPè‹ ÌEhXºDQè~‹ÌEh(ºDRèm¡ÌEhô¹DPè]‹ ÌEh̹DQèL‹ÌEh”¹DRè;¡ÌEhd¹DPè+‹ ÌEh0¹DQè‹ÌEƒÄ@h¹DRè¡ÌEhиDPèö‹ ÌEh”¸DQèå‹ÌEh`¸DRèÔ¡ÌEh,¸DPèÄ‹ ÌEhè·DQ賋ÌEh¨·DR袡ÌEhX·DPè’‹ ÌEƒÄ@h·DQè~‹ÌEhè¶DRèm¡ÌEh¸¶DPè]‹ ÌEhp¶DQèL‹ÌEhH¶DRè;¡ÌEh¶DPè+‹ ÌEh¶DQè‹ÌEhÀµDRè ¡ÌEƒÄ@hŒµDPèö‹ ÌEhPµDQèå‹ÌEhµDRèÔ¡ÌEhÜ´DPèÄ‹ ÌEh¬´DQ賋ÌEhh´DR袡ÌEh ´DPè’ƒÄ8麴D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu69]„iüÿÿ‹UƒÅRÿp«CƒÄ;É„$ÈOüÿÿ‹EPhø³Dé-üÿÿº0D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu9]„üÿÿ‹UƒÅ‰T$Péùûÿÿºð³D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu9]„ºûÿÿ‹EƒÅ‰„$ é­ûÿÿºä³D‹ÏëIŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu9]„jûÿÿ‹MƒÅ‰L$hé`ûÿÿºÜ³D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu9]„"ûÿÿ‹UƒÅ‰T$téûÿÿº D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ã…j9]„Öúÿÿ‹D$@PƒÅèK‹M‹ÌEhȳDSSjQRè48ÿÿƒÄ‰D$@;Ã…¦úÿÿ‹l$_‹ÌERè‹„$ØP苌$äQ莋”$ðRè‹D$XPè‹L$PQè׋T$hRèÍ‹D$tPèËŒ$€Qè¶‹T$XRèþGÿÿ‹D$@Pè΋Œ$”QèÁ‹T$LRèÁUèñ#‹D$LPèá#‹Œ$ÌQèz)‹T$lƒÄ@Rè‹D$4Pè“‹Œ$ h^xCQèÕ‹”$°h^xCRèÃă¼$¨ÿ^][t!‹D$Pè ‹L$Qè‹T$lRèùƒÄ ‹D$4ÄÜúPþC‹Ï‹ÿŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu~9]„:ùÿÿ‹D$TPƒÅ诋M‹ÌEhtüCSSjQRè˜6ÿÿƒÄ‰D$T;Ädþÿÿ‹D$4‹L$TPQ‹L$H|$è¢âÿÿƒÄ…À„Bþÿÿ‹U‹D$0RP蟃ąÀ„)þÿÿéÊøÿÿº,0D‹Ï‹ÿŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu99]„Šøÿÿ‹L$4‹UQ‹L$DƒÅRD$Pè´âÿÿƒÄ …À„Äýÿÿ‹M‹T$0QR뀺À³D‹Ï¤$Š:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu9]„øÿÿ‹EƒÅ‰D$HéøÿÿºŒ0D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu9]„Ò÷ÿÿ‹MƒÅ‰Œ$°éÅ÷ÿÿº¸³D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;ÃuQ9]t8‹UƒÅRÿp«CƒÄ;É„$Ô}‹E‹ ÌEPhœ³DQèCƒÄ ¾ƒ|$Xÿ…H÷ÿÿ‰\$XéD÷ÿÿº³D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu69]„÷ÿÿ‹UƒÅRÿp«CƒÄ;É„$Œìöÿÿ‹EPht³DéÊöÿÿºl³D‹Ï›Š:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu39]„šöÿÿ‹UƒÅRÿp«CƒÄ;ÉD$Xƒöÿÿ‹EPhœ³Déaöÿÿº`³D‹ÏŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu9]„7öÿÿ‹UƒÅ‰”$ˆé*öÿÿºX³D‹Ï‹ÿŠ:u:ÃtŠA:BuƒÁƒÂ:Ãuä3ÀëÀƒØÿ;Ãu9]„êõÿÿ‹EƒÅ‰„$˜éÝõÿÿ¹P³D‹ÇëIŠ:u:ÓtŠP:QuƒÀƒÁ:Óuä3ÀëÀƒØÿ;Ã…Ÿõÿÿ9]„–õÿÿ‹MƒÅ‰Œ$Üé‰õÿÿ9œ$€t‹Œ$€h”ÈCQèKëSÿ0¬CƒÀ PèuƒÄ‰D$ ;Ãu‹ÌEh„›DRè#ƒÄé–úÿÿ;ë…™ƒ|$$t‰\$$‹D$x;ÃtihXÈCPèï‹ðƒÄ;óu¡ÌEh,³DPè܃ÄéOúÿÿSVhF‡Ch¾CèS‹èV‰l$(臃Ä;ëu6‹ ÌEh³DQ蟃Äéúÿÿ‹D$(;ÃtPè5âÿÿƒÄ‰D$l;Äõùÿÿ‹„$ˆ‹´$˜;Ä»;óu‹ð‹ÌEhø²DSSjPRèä1ÿÿƒÄ‰D$\;Ãu¡ÌEhвDPè-ƒÄé ùÿÿ‹Œ$°‹ÌEhdüCSSjQRè¤1ÿÿ‰D$|‹„$ôƒÄ;Ãt'h°²DSSjP¡ÌEPèÍ4ÿÿƒÄ‰„$Ä;ÄJùÿÿ‹ ÌEh˜²DSSSjVQèôJÿÿƒÄ‰D$L;Ä$ùÿÿ9\$lt‹ÌEhp²DR蒃ċT$l;ÓtCD$PL$ èµáÿÿ‹l$ƒÄ…À„åøÿÿ;ëudSjè@#‹\$$‹ðV‰t$$èÚâÿÿƒÄ 3Ûéº;ëu>9\$pu9œ$ u9\$,u9\$$u 9\$H„ù‹ÌEhD²DRè ƒÄé}øÿÿ9\$$t jÿSUè#ƒÄ ‹D$p;ÄÂ9\$Pu‰D$P‹L$p‹ÌEhTžDSSjQRè\0ÿÿ‹øƒÄ‰¼$Ø;û„‹„$¼;Ãt'h0²DSSjP¡ÌEPèx3ÿÿƒÄ‰„$œ;Äõ÷ÿÿ‹L$P‹ÌEh²DSSSjQRè›Iÿÿ‹ðƒÄ‰´$è;ó„Æ÷ÿÿ‹„$¨‹Œ$œPQè$PVWUèK"ƒÄ…À„9œ$t;ët‹T$ SURè!"ƒÄ ‹´$ ;ót-h$±CVèê‹øƒÄ;û„jUWhÖ‡CèCW衃ċL$H;ËtM9\$L„]9\$\„S9\$d„I‹D$8;Ãu/SQèEPÿÿƒÄ‰D$8;Ä÷ÿÿPè <ÿÿƒÄ…À„ôöÿÿ‹D$8;ÃtY‹Œ$Ô‹T$uâWè>ƒÄ_^3À[ƒÄ Ã_^ƒÈÿ[ƒÄ ÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹T$‹V‹t$ ‹;Át+Á^ËN‹BëIŠ:u„ÒtŠP:QuƒÀƒÁ„Òuä3À^ÃÀƒØÿ^ÃÌÌÌÌÌÌÌÌÌ‹D$‹H‹T$‹BjQPÿ<«CƒÄ ÃÌÌÌÌ‹D$‹H‰L$éÎ3É9 ,þDt¸,þDƒÀ Aƒ8u÷WhpqCj Qh(þDÿ «ChÀqChàqCèÚ‹øƒÄ…ÿu_Ã=,þDV¾(þDtVWè³ƒÆ ƒÄƒ~uí^‹Ç_ÃÌ̸Xè–¡E3ĉ„$T‹„$`S‹0¬CU3íVW‰D$‰l$‰l$$‰l$(‰-ÐE9-ÌEu0èŽP肃ģÌE;ÅtÿÓ‹ ÌEƒÀ@PjjjQèZƒÄ‹=l«ChÄDÿ׃Ä…ÀtZhÄD¾ÄDÿ׃Äd$Š:u„ÉtŠH:NuƒÀƒÆ„Éuä3ÀëÀƒØÿ;Åtè2jè%ƒÄë UUUUUèƒÄjèhlCèð‹´«C¡°«C‹ ¬«CPÇ€‹¨«CQRèÅèÀè? è°èïÿÿhPýCÿ׋ðƒÄ;õuhDýCÿ׋ðƒÄ;õu èÊ+ÿÿ‰D$‹ðU‰5ÄEè°L$0QVP£ÈE虃ąÀu‹ÈERètƒÄ‰-ÈEèÖèñýÿÿ‹|$‹‹ðj(D$@PQ‰t$ èˆÿÿD$„º‹ÆPŠ@„Éuù+ƒø~€|0þ\u ƒèð+èëœL$QT$$RD$lPL$0QèbÿÿƒÄ…ÀtQ‹T$‹L$R‹T$$è)øÿÿƒÄ…À|Vt‹D$‹‹ÌEQhôÃDRè|ƒÄ ¡ÌEjjj PèÔƒÄ3íéÿÿÿ‹ ÌEhèÃDQèMƒÄÇD$ëÇD$‹t$3í‹D$;Åt P貃ġÈE;ÅtP讃ĉ-ÈE;õt VèqƒÄ‹D$$;Åt Pè|ƒÄjèPèûÿÿè@è5è*Uèè‹ÌERè¡ÌEƒÄ ;ÅtPèwƒÄ‰-ÌE‹D$Pÿt«C_^][Ìÿ%­Cÿ%<¬Cÿ%@¬Cÿ%D¬Cÿ%H¬Cÿ%L¬Cÿ%P¬Cÿ%T¬Cÿ%X¬Cÿ%\¬Cÿ%`¬Cÿ%d¬Cÿ%h¬Cÿ%l¬Cÿ%p¬Cÿ%t¬Cÿ%x¬Cÿ%|¬Cÿ%€¬Cÿ%„¬Cÿ%ˆ¬Cÿ%Œ¬Cÿ%¤­Cÿ% ­Cÿ%œ­Cÿ%˜­Cÿ%”­Cÿ%­Cÿ%Œ­Cÿ%ˆ­Cÿ%„­Cÿ%€­Cÿ%|­Cÿ%x­Cÿ%t­Cÿ%p­Cÿ%l­Cÿ%h­Cÿ%d­Cÿ%`­Cÿ%\­Cÿ%X­Cÿ%T­Cÿ%P­Cÿ%L­Cÿ%H­Cÿ%D­Cÿ%@­Cÿ%<­Cÿ%8­Cÿ%4­Cÿ%0­Cÿ%,­Cÿ%(­Cÿ%$­Cÿ% ­Cÿ%­Cÿ%8¬Cÿ%­Cÿ%­Cÿ% ­Cÿ%­Cÿ%­Cÿ%­Cÿ%ü¬Cÿ%ø¬Cÿ%ô¬Cÿ%ð¬Cÿ%ì¬Cÿ%è¬Cÿ%ä¬Cÿ%à¬Cÿ%ܬCÿ%جCÿ%Ô¬Cÿ%ЬCÿ%̬Cÿ%ȬCÿ%ĬCÿ%À¬Cÿ%¼¬Cÿ%¸¬Cÿ%´¬Cÿ%°¬Cÿ%¬¬Cÿ%¨¬Cÿ%¤¬Cÿ% ¬Cÿ%œ¬Cÿ%˜¬Cÿ%”¬Cÿ%¬Cÿ%t¡Cÿ%x¡Cÿ%|¡Cÿ%€¡Cÿ%„¡Cÿ%ˆ¡Cÿ%Œ¡Cÿ%¡Cÿ%”¡Cÿ%˜¡Cÿ%œ¡Cÿ% ¡Cÿ%¤¡Cÿ%¨¡Cÿ%¬¡Cÿ%°¡Cÿ%´¡Cÿ%¸¡Cÿ%¼¡Cÿ%À¡Cÿ%Ä¡Cÿ%È¡Cÿ%Ì¡Cÿ%СCÿ%Ô¡Cÿ%Ø¡Cÿ%Ü¡Cÿ%à¡Cÿ%ä¡Cÿ%è¡Cÿ%ì¡Cÿ%ð¡Cÿ%ô¡Cÿ%ø¡Cÿ%ü¡Cÿ%¢Cÿ%¢Cÿ%¢Cÿ% ¢Cÿ%¢Cÿ%¢Cÿ%¢Cÿ%¢Cÿ% ¢Cÿ%$¢Cÿ%(¢Cÿ%,¢Cÿ%0¢Cÿ%4¢Cÿ%8¢Cÿ%<¢Cÿ%@¢Cÿ%D¢Cÿ%H¢Cÿ%L¢Cÿ%P¢Cÿ%T¢Cÿ%X¢Cÿ%\¢Cÿ%`¢Cÿ%d¢Cÿ%h¢Cÿ%l¢Cÿ%p¢Cÿ%t¢Cÿ%x¢Cÿ%|¢Cÿ%€¢Cÿ%„¢Cÿ%ˆ¢Cÿ%Œ¢Cÿ%¢Cÿ%”¢Cÿ%˜¢Cÿ%œ¢Cÿ% ¢Cÿ%¤¢Cÿ%¨¢Cÿ%¬¢Cÿ%°¢Cÿ%´¢Cÿ%¸¢Cÿ%¼¢Cÿ%À¢Cÿ%Ä¢Cÿ%È¢Cÿ%Ì¢Cÿ%ТCÿ%Ô¢Cÿ%Ø¢Cÿ%Ü¢Cÿ%à¢Cÿ%ä¢Cÿ%è¢Cÿ%ì¢Cÿ%ð¢Cÿ%ô¢Cÿ%ø¢Cÿ%ü¢Cÿ%£Cÿ%£Cÿ%£Cÿ% £Cÿ%£Cÿ%£Cÿ%£Cÿ%£Cÿ% £Cÿ%$£Cÿ%(£Cÿ%,£Cÿ%0£Cÿ%4£Cÿ%8£Cÿ%<£Cÿ%@£Cÿ%D£Cÿ%H£Cÿ%L£Cÿ%P£Cÿ%T£Cÿ%X£Cÿ%\£Cÿ%`£Cÿ%d£Cÿ%h£Cÿ%l£Cÿ%p£Cÿ%t£Cÿ%x£Cÿ%|£Cÿ%€£Cÿ%„£Cÿ%ˆ£Cÿ%Œ£Cÿ%£Cÿ%”£Cÿ%˜£Cÿ%œ£Cÿ% £Cÿ%¤£Cÿ%¨£Cÿ%¬£Cÿ%°£Cÿ%´£Cÿ%¸£Cÿ%¼£Cÿ%À£Cÿ%Ä£Cÿ%È£Cÿ%Ì£Cÿ%УCÿ%Ô£Cÿ%Ø£Cÿ%Ü£Cÿ%à£Cÿ%ä£Cÿ%è£Cÿ%ì£Cÿ%ð£Cÿ%ô£Cÿ%ø£Cÿ%ü£Cÿ%¤Cÿ%¤Cÿ%¤Cÿ% ¤Cÿ%¤Cÿ%¤Cÿ%¤Cÿ%¤Cÿ% ¤Cÿ%$¤Cÿ%(¤Cÿ%,¤Cÿ%0¤Cÿ%4¤Cÿ%8¤Cÿ%<¤Cÿ%@¤Cÿ%D¤Cÿ%H¤Cÿ%L¤Cÿ%P¤Cÿ%T¤Cÿ%X¤Cÿ%\¤Cÿ%`¤Cÿ%d¤Cÿ%h¤Cÿ%l¤Cÿ%p¤Cÿ%t¤Cÿ%x¤Cÿ%|¤Cÿ%€¤Cÿ%„¤Cÿ%ˆ¤Cÿ%Œ¤Cÿ%¤Cÿ%”¤Cÿ%˜¤Cÿ%œ¤Cÿ% ¤Cÿ%¤¤Cÿ%¨¤Cÿ%¬¤Cÿ%°¤Cÿ%´¤Cÿ%¸¤Cÿ%¼¤Cÿ%À¤Cÿ%ĤCÿ%ȤCÿ%̤Cÿ%ФCÿ%Ô¤Cÿ%ؤCÿ%ܤCÿ%à¤Cÿ%ä¤Cÿ%è¤Cÿ%ì¤Cÿ%ð¤Cÿ%ô¤Cÿ%ø¤Cÿ%ü¤Cÿ%¥Cÿ%¥Cÿ%¥Cÿ% ¥Cÿ%¥Cÿ%¥Cÿ%¥Cÿ%¥Cÿ% ¥Cÿ%$¥Cÿ%(¥Cÿ%,¥Cÿ%0¥Cÿ%4¥Cÿ%8¥Cÿ%<¥Cÿ%@¥Cÿ%D¥Cÿ%H¥Cÿ%L¥Cÿ%P¥Cÿ%T¥Cÿ%X¥Cÿ%\¥Cÿ%`¥Cÿ%d¥Cÿ%h¥Cÿ%l¥Cÿ%p¥Cÿ%t¥Cÿ%x¥Cÿ%|¥Cÿ%€¥Cÿ%„¥Cÿ%ˆ¥Cÿ%Œ¥Cÿ%¥Cÿ%”¥Cÿ%˜¥Cÿ%œ¥Cÿ% ¥Cÿ%¤¥Cÿ%¨¥Cÿ%¬¥Cÿ%°¥Cÿ%´¥Cÿ%¸¥Cÿ%¼¥Cÿ%À¥Cÿ%Ä¥Cÿ%È¥Cÿ%Ì¥Cÿ%Ð¥Cÿ%Ô¥Cÿ%Ø¥Cÿ%Ü¥Cÿ%à¥Cÿ%ä¥Cÿ%è¥Cÿ%ì¥Cÿ%ð¥Cÿ%ô¥Cÿ%ø¥Cÿ%ü¥Cÿ%¦Cÿ%¦Cÿ%¦Cÿ% ¦Cÿ%¦Cÿ%¦Cÿ%¦Cÿ%¦Cÿ% ¦Cÿ%$¦Cÿ%(¦Cÿ%,¦Cÿ%0¦Cÿ%4¦Cÿ%8¦Cÿ%<¦Cÿ%@¦Cÿ%D¦Cÿ%H¦Cÿ%L¦Cÿ%P¦Cÿ%T¦Cÿ%X¦Cÿ%\¦Cÿ%`¦Cÿ%d¦Cÿ%h¦Cÿ%l¦Cÿ%p¦Cÿ%t¦Cÿ%x¦Cÿ%|¦Cÿ%€¦Cÿ%„¦Cÿ%ˆ¦Cÿ%Œ¦Cÿ%¦Cÿ%”¦Cÿ%˜¦Cÿ%œ¦Cÿ% ¦Cÿ%¤¦Cÿ%¨¦Cÿ%¬¦Cÿ%°¦Cÿ%´¦Cÿ%¸¦Cÿ%¼¦Cÿ%À¦Cÿ%ĦCÿ%ȦCÿ%̦Cÿ%ЦCÿ%Ô¦Cÿ%ئCÿ%ܦCÿ%à¦Cÿ%ä¦Cÿ%è¦Cÿ%ì¦Cÿ%ð¦Cÿ%ô¦Cÿ%ø¦Cÿ%ü¦Cÿ%8 Cÿ%§Cÿ%§Cÿ% §Cÿ%§Cÿ%§Cÿ%§Cÿ%§Cÿ% §Cÿ%$§Cÿ%(§Cÿ%,§Cÿ%0§Cÿ%4§Cÿ%8§Cÿ%<§Cÿ%@§Cÿ%D§Cÿ%H§Cÿ%L§Cÿ%P§Cÿ%T§Cÿ%X§Cÿ%\§Cÿ%`§Cÿ%d§Cÿ%h§Cÿ%l§Cÿ%p§Cÿ%t§Cÿ%x§Cÿ%|§Cÿ%€§Cÿ%„§Cÿ%ˆ§Cÿ%Œ§Cÿ%§Cÿ%”§Cÿ%˜§Cÿ%œ§Cÿ% §Cÿ%¤§Cÿ%¨§Cÿ%¬§Cÿ%°§Cÿ%´§Cÿ%¸§Cÿ%¼§Cÿ%À§Cÿ%ħCÿ%ȧCÿ%̧Cÿ%ЧCÿ%Ô§Cÿ%اCÿ%ܧCÿ%à§Cÿ%ä§Cÿ%è§Cÿ%ì§Cÿ%ð§Cÿ%ô§Cÿ%ø§Cÿ%ü§Cÿ%¨Cÿ%¨Cÿ%¨Cÿ% ¨Cÿ%¨Cÿ%¨Cÿ%¨Cÿ%¨Cÿ% ¨Cÿ%$¨Cÿ%(¨Cÿ%,¨Cÿ%0¨Cÿ%4¨Cÿ%8¨Cÿ%<¨Cÿ%@¨Cÿ%D¨Cÿ%H¨Cÿ%L¨Cÿ%P¨Cÿ%T¨Cÿ%X¨Cÿ%\¨Cÿ%`¨Cÿ%d¨Cÿ%h¨Cÿ%l¨Cÿ%p¨Cÿ%t¨Cÿ%x¨Cÿ%|¨Cÿ%€¨Cÿ%„¨Cÿ%ˆ¨Cÿ%Œ¨Cÿ%¨Cÿ%”¨Cÿ%˜¨Cÿ%œ¨Cÿ% ¨Cÿ%¤¨Cÿ%¨¨Cÿ%¬¨Cÿ%°¨Cÿ%´¨Cÿ%¸¨Cÿ%¼¨Cÿ%À¨Cÿ%ĨCÿ%ȨCÿ%̨Cÿ%ШCÿ%Ô¨Cÿ%بCÿ%ܨCÿ%à¨Cÿ%ä¨Cÿ%è¨Cÿ%ì¨Cÿ%ð¨Cÿ%ô¨Cÿ%ø¨Cÿ%ü¨Cÿ%©Cÿ%©Cÿ%©Cÿ% ©Cÿ%©Cÿ%©Cÿ%©Cÿ%©Cÿ% ©Cÿ%$©Cÿ%(©Cÿ%,©Cÿ%0©Cÿ%4©Cÿ%8©Cÿ%<©Cÿ%@©Cÿ%D©Cÿ%H©Cÿ%L©Cÿ%P©Cÿ%T©Cÿ%X©Cÿ%\©Cÿ%`©Cÿ%d©Cÿ%h©Cÿ%l©Cÿ%p©Cÿ%t©Cÿ%x©Cÿ%|©Cÿ%€©Cÿ%„©Cÿ%ˆ©Cÿ%Œ©Cÿ%©Cÿ%”©Cÿ%˜©Cÿ%œ©Cÿ% ©Cÿ%¤©Cÿ%¨©Cÿ%¬©Cÿ%°©Cÿ%´©Cÿ%¸©Cÿ%¼©Cÿ%À©Cÿ%Ä©Cÿ%È©Cÿ%Ì©Cÿ%ЩCÿ%Ô©Cÿ%Ø©Cÿ%Ü©Cÿ%à©Cÿ%ä©Cÿ%è©Cÿ%ì©Cÿ%ð©Cÿ%ô©Cÿ%ø©Cÿ%ü©Cÿ%ªCÿ%ªCÿ%ªCÿ% ªCÿ%ªCÿ%ªCÿ%ªCÿ%ªCÿ% ªCÿ%$ªCÿ%(ªCÿ%,ªCÿ%0ªCÿ%4ªCÿ%8ªCÿ%<ªCÿ%@ªCÿ%DªCÿ%HªCÿ%LªCÿ%PªCÿ%TªCÿ%XªCÿ%\ªCÿ%`ªCÿ%dªCÿ%hªCÿ%lªCÿ%pªCÿ%tªCÿ%xªCÿ%|ªCÿ%€ªCÿ%„ªCÿ%ˆªCÿ%ŒªCÿ%ªCÿ%”ªCÿ%˜ªCÿ%œªCÿ% ªCÿ%¤ªCÿ%¨ªCÿ%¬ªCÿ%°ªCÿ%´ªCÿ%¸ªCÿ%¼ªCÿ%ÀªCÿ%ĪCÿ%ȪCÿ%̪Cÿ%ЪCÿ%ÔªCÿ%تCÿ%ܪCÿ%àªCÿ%äªCÿ%§Cÿ%p¡Cÿ%l¡Cÿ%h¡Cÿ%d¡Cÿ%`¡Cÿ%\¡Cÿ%X¡Cÿ%T¡Cÿ%P¡Cÿ%L¡Cÿ%H¡Cÿ%D¡Cÿ%@¡Cÿ%<¡Cÿ%8¡Cÿ%4¡Cÿ%0¡Cÿ%,¡Cÿ%(¡Cÿ%$¡Cÿ% ¡Cÿ%¡Cÿ%¡Cÿ%¡Cÿ%¡Cÿ% ¡Cÿ%¡Cÿ%¡Cÿ%¡Cÿ%ü Cÿ%ø Cÿ%ô Cÿ%ð Cÿ%ì Cÿ%è Cÿ%ä Cÿ%à Cÿ%Ü Cÿ%Ø Cÿ%Ô Cÿ%РCÿ%Ì Cÿ%È Cÿ%Ä Cÿ%À Cÿ%¼ Cÿ%¸ Cÿ%´ Cÿ%° Cÿ%¬ Cÿ%¨ Cÿ%¤ Cÿ%  Cÿ%œ Cÿ%˜ Cÿ%” Cÿ% Cÿ%Œ Cÿ%ˆ Cÿ%„ Cÿ%€ Cÿ%| Cÿ%x Cÿ%t Cÿ%p Cÿ%l Cÿ%h Cÿ%d Cÿ%` Cÿ%\ Cÿ%X Cÿ%T Cÿ%P Cÿ%L Cÿ%H Cÿ%D Cÿ%@ Cÿ%< Cÿ%¬­Cÿ%°­Cÿ%´­Cÿ%¸­Cÿ%ü­Cÿ%ø­Cÿ%ô­Cÿ%ð­Cÿ%ì­Cÿ%è­Cÿ%ä­Cÿ%à­Cÿ%Ü­Cÿ%Ø­Cÿ%Ô­Cÿ%ЭCÿ%Ì­Cÿ%È­Cÿ%Ä­Cÿ%À­Cÿ%¼­CÇôE3ÀÃÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌQL$+ÈÀ÷Ð#È‹Ä%ðÿÿ;Èr ‹ÁY”‹‰$Ã-…ëé; EuóÃéÂÿ%H«Cÿ%d«CÌÌÌÌÌÌÌÌÌÌh:ŽC裡 EÇ$èEÿ5ôE£èEhØEhÜEhÔEÿ¼«CƒÄ£äE…À}jè¹YÃjh˜ÄDè%3Û‰]üd¡‹p‰]ä¿8ESVWÿ0 C;Ãt;Æu3öF‰uäëhèÿ CëÚ3öF¡4E;Æu jè\Yë;¡4E…Àu,‰54Eh®Ch®Cè­YY…ÀtÇEüþÿÿÿ¸ÿé݉5ðE¡4E;Æuh ®Ch®CèrYYÇ4E9]äuSWÿ C9DEthDEè‰Y…Àt SjSÿDE¡ØE‹ Ì«C‰ÿ5ØEÿ5ÜEÿ5ÔEè¶çÿÿƒÄ £ìE9àEu7Pÿt«C‹Eì‹‹ ‰MàPQèŽYYËeè‹Eà£ìE3Û9àEuPÿÄ«C9ðEuÿÀ«CÇEüþÿÿÿ¡ìEèøMZf9@t3ÀëM¡<@€@8PEué·Hù tù uÕƒ¸„vÌ3É9ˆøëƒxtv¼3É9ˆè•Á‹Áj£àEÿð«Cjÿÿì«CYY£<E£@Eÿè«C‹ (E‰ÿä«C‹ $E‰¡à«C‹£0EèVè=„üÿƒ=¬Eu huCÿÜ«CYèmƒ=¨Eÿu jÿÿØ«CY3ÀÃèéŸýÿÿ‹ÿU‹ìì(£E‰ üE‰øE‰ôE‰5ðE‰=ìEfŒEfŒ EfŒèEfŒäEfŒ%àEfŒ-ÜEœE‹E£E‹E£EE£E‹…àüÿÿÇPE¡E£EÇøE ÀÇüE¡E‰…Øüÿÿ¡”E‰…Üüÿÿÿ C£HEjèEYjÿ  Ch0ÄDÿ$ Cƒ=HEujè!Yh Àÿ( CPÿ, CÉËÿU‹ì‹E‹8csmàu*ƒxu$‹@= “t=!“t="“t=@™uèÖ3À]ÂhCÿ  C3ÀÃÿ%¸«Cjh¸ÄDèhÿ5@E‹5 ¬CÿÖY‰Eäƒøÿu ÿuÿ¬CYëgjè˜Yƒeüÿ5@EÿÖ‰Eäÿ5<EÿÖYY‰EàEàPEäPÿu‹5ì«CÿÖYPè[‰EÜÿuäÿÖ£@Eÿuàÿփģ<EÇEüþÿÿÿè ‹EÜèÃjèYËÿU‹ìÿuèNÿÿÿ÷ØÀ÷ØYH]ËÿV¸ˆÄD¾ˆÄDW‹ø;Æs‹…ÀtÿЃÇ;þrñ_^ËÿV¸ÄD¾ÄDW‹ø;Æs‹…ÀtÿЃÇ;þrñ_^Ãÿ%È«CÌÌÌÌÌÌÌÌÌÌ‹ÿU‹ì‹M¸MZf9t3À]ËA<Á8PEuï3Ò¹ f9H”‹Â]ÃÌÌÌÌÌÌÌÌÌÌÌ‹ÿU‹ì‹E‹H<È·ASV·q3ÒWD…öv‹} ‹H ;ùr ‹XÙ;ûr BƒÀ(;Örè3À_^[]ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹ÿU‹ìjþhØÄDh%Cd¡PƒìSVW¡E1Eø3ÅPEðd£‰eèÇEüh@è*ÿÿÿƒÄ…ÀtU‹E-@Ph@èPÿÿÿƒÄ…Àt;‹@$Áè÷ЃàÇEüþÿÿÿ‹Mðd‰ Y_^[‹å]ËEì‹‹3Ò=À”‹ÂËeèÇEüþÿÿÿ3À‹Mðd‰ Y_^[‹å]ÃÌÿ%ЫCÿ%Ô«CÌÌh%Cdÿ5‹D$‰l$l$+àSVW¡E1Eü3ÅP‰eèÿuø‹EüÇEüþÿÿÿ‰EøEðd£Ã‹Mðd‰ Y__^[‹å]QËÿU‹ìÿuÿuÿu ÿuh+‰ChEèçƒÄ]ËÿVhh3öVèÙƒÄ …Àt VVVVVèƒÄ^Ã3ÀËÿU‹ìƒì¡EƒeøƒeüSW¿Næ@»»ÿÿ;Çt …Ãt ÷У”Eë`VEøPÿ C‹uü3uøÿ  C3ðÿ C3ðÿ C3ðEðPÿ C‹Eô3Eð3ð;÷u¾Oæ@»ë …óu‹ÆÁà ð‰5E÷Ö‰5”E^_[ÉÃÿ%ô«Cÿ%ø«Cÿ%ü«Cÿ%¬Cÿ%¬Cÿ%¬Cÿ%¬Cÿ%¬CÜ×T×FØ0ØØ Øð×>׾ע׎×z×\×~€æ€t€q€½€Å€Æ€” €z€u €*€… €, €þ€à€¾€|€{€€é€¯ €: €w €¥ €² €Ï € €& €\ €S €è €ç €V € € €Ô €z €3 € €2 €~ €Q € €P€÷ €T€S€Q€X €O€¬ €™ €› €W €†€ €f €i €¼ €È €µ €¹ €Ø €° €» €á € €« €® €û€Ð€¿€E€O€b€k€_€g€a€€ú€±€§€€” €o€$ €ñ€B€‰€%€Ž€€v€z€R€V€k €Þ€¨€I€‘€.€€r€Ç €9€Û€{€€+€q€,€\€4€N€]€ö€u€€¨€;€é€  €è€ä€ç€c€§€C€{ €m€”€Ó€u€Y€W€9€©€å€A€^€©€@€x€z€© €« €¡€ €ô€n€]€_€î€¥€m€§€Ê€h€š€¥ €ð €E€b€`€C €¢€ž€Y€ €’€›€€Ÿ€¡€˜€Z€Œ€9€“€€ø€£€Þ €Ò€ä€€€f€¡€–€æ€€¨€ €‡ €ä€<€å€ò €÷ €= €¸ €Ñ€µ€?€X€‘€^ €P €O€—€€€C€Ü€Ž€‘€€0€M€L€à €Å€!€"€ €» €­ €k€+€€S€ì€?€6€<€C€¼€Ê€Ÿ€!€>€x€È€Ï€‹€€Í€×€€O€g€Õ€š€›€Ë €c €Û€;€ü€ÿ€ž€ï€J€i€%€· €;€ €x € €% €F €É€ó€€€ƒ€~€æ€™€€€Ä€ €ˆ€ €€X€0€t€N€8€ª€€€€€€€S€¤€w€=€C€5€;€€D€j€?€H€ €€l€7€6€B€]€`€l€2€m€«€­€¯€ €¢€ë€ €µ€€0 €¼ €[€¥€¦€€¦€€ € €× €/ €¼ €ï €u€k€î € €µ€¶ €€t€€|€‚€¢€Q€Í€¼€Ž€ê€¶€½€’€ø€n€_€ý€W €‰€G€/€Ù€€L€s€©€¤€f €Á€V€ã€ý€M€è€ò€7€ê€í€ë€ì€ñ€Œ €°€ €Þ€@€Ö€€¡€Ü€™ €` €€ €€| €‘ €ž€H €s €‚€¿ €ä €{€{ € €3 €M €… €© €È € €ã €€¦ €“ €!€¥€m€€w €f€Œ€ü€ù€÷€ø€€€Í€4€z€€Ž €e €P€d €æ €€e€b€Y€–€¤€€€"€\€ˆ€ˆ€€e€v€Ö€Î€´ €S €o €>€+€v€½ €z €– €) €– €Ú €e € €¦ €V €r€k€€“€T€5€l€:€ € €`€ò€z €Ì €U€p€Æ €½ €õ€-€t€ €€Þ€R€™€€<€˜ €R€‡€. €Ñ€Û€Ø€Õ€ò€ï€€d €€` € €N €û €Á€à€(€×€o€õ€c €€€Ý€ä€U€F€Ä€† €] €B€€Ü€.€Ü€ß€v€Ð €c€î€î€ã€[€Á€£ €ƒ €Å €È €d €ß €£ €‚ €å €þ € €f €D €H €) €L €a €ø €6 € € €M €Q€ €€ÿ€€€§€Ê€€€h €§ €y€ˆ€Š€ €P€ €D €Ô €º €T €± €š €} €Ž €„€¿€ÿ€€V €] €D€m € €˜€H€5 €Ä €¤€€…€Â €Ë€‰ €¯ €¢€¥€¼€€>€Í€Ó€Ò€Ô€Ö€€€‘€“€Ž€œ€!€€ €€º €| €O €€€€€ €t€…€œ €p €€%€® €&€‡€Í €ó€û€÷€ò€l€þ€ð€ð€€õ€Ä€i€ì€k€_€j€€^€^€ÄÓÎÓÚÓäÓîÓøÓÔÔÔÔ"Ô*Ô4Ô>ÔFÔNÔXÔbÔjÔtÔ|Ô†ÔÔšÔ¤Ô®Ô¸ÔÄÔÎÔÜÔæÔðÔüÔÕÕÕ Õ*Õ6Õ>ÕHÕRÕ\ÕfÕpÕzÕ‚ÕŠÕ”ÕžÕ¦Õ¼ÕÊÕÚÕäÕìÕúÕÖÖ Ö6ÖJÖZÖjÖxÖŠÖœÖ²ÖÆÖÐÖÞÖæÖðÖ××.×nØxظӮӦӘӫ€"€#€-€´€–€1€€‚€€A€=€x€š€€#€¢€!€€7€l€O€z€4€€ €b€&€(€€€€€€+€n€q€t€¬€ €%€w€Z€€V€;€`€<€8€€€€$€p€s€v€J€€·€ €€‘€€€Ž€±€€€ç€I€€€ó€*€¤€M€}€^€H€¦€N€0€ù€y€K€ô€½€S€R€?€ €:€€€—€€€3€4€7€€€ € €€€€€s€q€t€€o€P‰C‹CDCOK %s: stdincertificate fileno certificates in file, %s error reading the file, %s error opening the file, %s rmemory allocation failure error %d at %d depth lookup:%s %s Error loading untrusted file %s Error loading directory %s %-10s %s recognized usages: cert1 cert2 ... [-engine e]usage: verify [-verbose] [-CApath path] [-CAfile file] [-purpose purpose] [-crl_check]Error loading file %s -verbose-help-engine-trusted-untrusted-CAfile-CApathCan't find 'asn1' in '%s' defaultasn1Error loading config file '%s' Error on line %ld of config file '%s' Error writing output Can't parse %s type OBJECTNULLError parsing structure Error: offset too large '%s' is an invalid number wb -genconf file file to generate ASN1 structure from -genstr str string to generate ASN1 structure from ASN1 blob wrappings a series of these can be used to 'dig' into multiple -strparse offset -oid file file of extra oid definitions -dlimit arg dump the first arg bytes of unknown data in hex form -dump dump unknown data in hex form -i indent entries -length arg length of section in file -offset arg offset into file -noout arg don't produce any output -out arg output file (output format is always DER -in arg input file -inform arg input format - one of DER PEM where options are %s [options] outfile unable to load EC parameters from file Certificate does not contain DSA parameters unable to load DSA parameters from file Error getting passwords -reqexts-extensions-set_serial-days-multivalue-rdn-subj-no-asn1-kludge-asn1-kludge-x509-text-subject-reqopt-nameopt-utf8-nodes-verify-modulus-newhdr-batchdh:Certificate does not contain EC parameters ec:dsa:rsa:-newkey-rand-passout-passin-keyout-keyform-config-new-pubkey-key-outform%02x:Error Signing Data Error Verifying Data Verification Failure Verified OK Read Error in %s %s%s(%s)= HMAC-(stdin)Error setting digest %s Error reading signature file %s Error opening signature file %s rbkey fileError opening output file %s (stdout)wError getting password ripemd160mdc2sha512sha384sha256sha224shasha1md2-%-14s to use the %s message digest algorithm md4-%-14s to use the %s message digest algorithm (default) md5-engine e use engine e, possibly a hardware device. -hmac key create hashed MAC with key -signature file signature to verify -keyform arg key file format (PEM or ENGINE) -prverify file verify a signature using private key in file -verify file verify a signature using public key in file -sign file sign digest using private key in file -binary output in binary form -hex output as hex dump -d to output debug info -c to output the digest with separating colons options are unknown option '%s' Invalid PSS salt length %d No signature to verify: use the -signature option -hmacetaonrishdlcupfm-fips-fingerprint-non-fips-allow-d-binary-hex-signature-pss_saltlen-x931-prverify-sign-cout of memory .\apps\dgst.cbad input format specified unable to write DH parameters return(dh); } return(NULL); if ((dh->p == NULL) || (dh->g == NULL)) dh->g=BN_bin2bn(dh%d_g,sizeof(dh%d_g),NULL); dh->p=BN_bin2bn(dh%d_p,sizeof(dh%d_p),NULL); if ((dh=DH_new()) == NULL) return(NULL); DH *dh; DH *get_dh%d() { }; static unsigned char dh%d_g[]={ }; 0x%02X, static unsigned char dh%d_p[]={OPENSSL_malloc.\apps\dh.cDH parameters appear to be ok. the g value is not a generator unable to check the generator value p value is not a safe prime p value is not prime unable to load DH parameters -engine e use engine e, possibly a hardware device. -noout no output -C Output C code -text print a text form of the DH parameters -check check the DH parameters -out arg output file -outform arg output format - one of DER PEM -C-check dh->length = %ld; { DH_free(dh); return(NULL); } static unsigned char dh%d_g[]={ }; static unsigned char dh%d_p[]={#ifndef HEADER_DH_H #include #endif .\apps\dhparam.cunable to load DSA parameters This is going to take a long time Generating DH parameters, %d bit long safe prime, generator %d Generating DSA parameters, %d bit long prime %ld semi-random bytes loaded warning, not much extra random data, consider using the -rand option generator may not be chosen for DSA parameters the random number generator - load the file (or the files in the directory) into numbits number of bits in to generate (default 512) -5 generate parameters using 5 as the generator value -2 generate parameters using 2 as the generator value -dsaparam read or generate DSA parameters, convert to DH %s [options] [numbits] %d-5-2-dsaparamSalted__ -%-25snon-hex digit hex string is too long OPENSSL_malloc failure %ld bytes written:%8ld bytes read :%8ld bad decrypt iv =key=%02Xsalt=Error setting cipher %s invalid hex key value iv undefined error reading input file bad magic number invalid hex iv value error writing output file invalid hex salt value bad password read enter %s %s password:decryptionencryptioninvalid 'bufsize' specified. .\apps\enc.cbufsize=%d %s is an unsupported message digest type Cipher Types %-14s use engine e, possibly a hardware device. -engine e%-14s buffer size -bufsize %-14s print the iv/key (then exit if -P) -[pP]%-14s key/iv in hex is the next argument -K/-iv%-14s from a passphrase. One of md2, md5, sha or sha1 %-14s the next argument is the md to use to create a key %-14s passphrase is the first line of the file argument %-14s passphrase is the next argument %-14s base64 encode/decode, depending on encryption flag -a/-base64%-14s decrypt %-14s encrypt %-14s pass phrase source -pass %-14s output file -out %-14s input file -in zero length password unable to read key from '%s' -none-md-iv-S-K-kfile-k-bufsize-base64-a-A-P-debug-nosalt-salt-nopad-v-p-pass-e%s is an unknown cipher encbase64./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzstrlen(out_buf) < sizeof(out_buf)i == 15output == out_buf + strlen(out_buf)salt_len <= 8strlen(out_buf) <= 6 + 8$strlen(magic) <= 4.\apps\passwd.c1%s %s hash != NULLapr1strlen(passwd) <= pw_maxlenWarning: truncating password to %u characters *salt_p != NULL.\apps\passwd.csalt_malloc_p != NULLsalt_p != NULLpasswd != NULL*passwds != NULLPassword: in_stdinin_stdin == 0-reverse switch table columns -table format output as table -quiet no warnings -noverify never verify when reading password from terminal -stdin read passwords from stdin -in file read passwords from file -salt string use provided salt -apr1 MD5-based password algorithm, Apache variant -1 MD5-based password algorithm -crypt standard Unix password algorithm (default) Usage: passwd [options] [passwords] -reverse-table-quiet-noverify-stdin-apr1-1-crypt the random number generator - load the file (or the files in the directory) into -engine e - use engine e, possibly a hardware device. -5 - use 5 as the generator value -2 - use 2 as the generator value -out file - output the key to 'file usage: gendh [args] [numbits] usage: errstr [-stats] ... %s: bad error code %lx-statsCAkeyTimekeyTimeholdInstructionremoveFromCRLcertificateHoldcessationOfOperationsupersededaffiliationChangedCACompromisekeyCompromiseunspecified -updatedb - Updates db for expired certificates -status serial - Shows certificate status given the serial number -engine e - use engine e, possibly a hardware device. -crlexts .. - CRL extension section (override value in config file) -extfile file - Configuration file with X509v3 extentions to add -extensions .. - Extension section (override value in config file) -multivalue-rdn - enable support for multivalued RDNs -utf8 - input characters are UTF8 (default ASCII) -subj arg - Use arg instead of request's subject -revoke file - Revoke a certificate (given in file) -msie_hack - msie modifications to handle all those universal strings -batch - Don't ask questions -noemailDN - Don't add the EMAIL field into certificate' subject -preserveDN - Don't re-order the DN -ss_cert file - File contains a self signed cert to sign -spkac file - File contains DN and signed public key and challenge -infiles .... - The last argument, requests to process -outdir dir - Where to put output certificates -out file - Where to put the output file(s) -in file - The input PEM encoded certificate request(s) -selfsign - sign a certificate with the key associated with it -cert file - The CA certificate -key arg - key to decode the private key if it is encrypted -keyform arg - private key file format (PEM or ENGINE) -keyfile arg - private key file -policy arg - The CA 'policy' to support -md arg - md to use, one of md2, md5, sha or sha1 -days arg - number of days to certify the certificate for -enddate YYMMDDHHMMSSZ - certificate validity notAfter (overrides -days) -startdate YYMMDDHHMMSSZ - certificate validity notBefore -crlhours hours - Hours is when the next CRL is due -crldays days - Days is when the next CRL is due -gencrl - Generate a new CRL -name arg - The particular CA definition to use -config file - A config file -verbose - Talk alot while doing things usage: ca args variable lookup failed for %s::%s %s=Unknown (%c). %s=Suspended (%c) %s=Expired (%c) %s=Revoked (%c) %s=Valid (%c) Serial %s not present in db. Malloc failure .\apps\ca.c%s=Expired 49,Invalid time format %s. Need YYYYMMDDHHMMSSZ Invalid object identifier %s Unknown CRL reason %s ' ^%c^?\0x%02X%cASN.1 %2d:'UNIVERSALSTRING:'IA5STRING:'T61STRING:'PRINTABLE:'invalid compromised time %s missing compromised time invalid object identifier %s missing hold instruction invalid reason code %s invalid revocation date %s TXT_DB error number %ld failed to update database unknownCERTIFICATE WILL NOT BE CERTIFIED Sign the certificate? [y/n]: (%ld days)Certificate is to be certified until Certificate Details: ERROR: adding extensions from request Successfully added extensions from config Successfully added extensions from file. ERROR: adding extensions in section %s Extra configuration file found todayEverything appears to be ok, creating and signing the certificate Subject Name :%s File name :%s Serial Number :%s Expires on :%s Was revoked on:%s undefType :%s invalid type, Data base error ValidRevokedExpiredThe matching entry has the following details check the database/serial_file for corruption ERROR:Serial number %s has already been issued, ERROR:There is already a certificate for %s 00The subject name appears to be ok, checking data base for clashes %s:invalid type in 'policy' configuration The %s field needed to be the same in the CA certificate (%s) and the request (%s) The %s field does not exist in the CA certificate, the 'policy' is misconfigured The mandatory %s field was missing %s:unknown object type in 'policy' configuration matchThe %s field needed to be supplied and was missing suppliedoptional emailAddress type needs to be of type IA5STRING The string contains characters that are illegal for the ASN.1 type The Subject's Distinguished Name is as follows malloc error invalid characters in string %s Signature ok signature verification failed on SPKAC public key error unpacking SPKAC public key Check that the SPKAC request matches the signature Netscape SPKAC structure not found in %s unable to load Netscape SPKAC structure SPKACno name/value pairs found in %s Error in revocation arguments Revoking Certificate %s. ERROR:Already revoked, serial number %s ERROR:name does not match %s Adding Entry with serial number %s to DB for %s Signature did not match the certificate request Signature verification problems.... error unpacking public key Certificate request and CA private key do not match Check that the request matches the signature Error reading certificate request in %s Signature did not match the certificate no input files signing CRL making CRL cannot lookup how long until the next CRL is issued default_crl_hoursdefault_crl_daysError Loading CRL extension section %s certificate file name too long error while loading CRL number crlnumbercrl_extensionsData Base Updated writing %s writing new certificates Write out database with %d new entries CERTIFICATION CANCELED %d out of %d certificate requests certified, commit? [y/n]unable to find 'section' for %s next serial number is %s next serial number is 00 error while loading serial number end date is invalid, it should be YYMMDDHHMMSSZ cannot lookup how many days to certify for default_daysdefault_enddatestart date is invalid, it should be YYMMDDHHMMSSZ default_startdateserialpolicy is %s policymessage digest is %s email_in_dnextensionsSuccessfully loaded extensions file %s ERROR: on line %ld of config file '%s' ERROR: loading the config file '%s' Done. %d entries marked as expired oldnewNo entries found to mark expired entry %d: bad serial number length (%d) entry %d: bad serial number characters, char pos %ld, char is '%c' entry %d: invalid expiry date in entry %d entry %d: not revoked yet, but has a revocation date Updating %s ... generating index %d entries loaded from the database %s need to be a directory unable to stat(%s) I am unable to access the %s directory there needs to be defined a directory for new certificate to be placed in new_certs_dirInvalid extension copy option: "%s" copy_extensionsInvalid certificate options: "%s" cert_optInvalid name options: "%s" name_optmsie_hackpreserveCA certificate and CA private key do not match CA certificatecertificateCA private keyprivate_keyError verifying serial %s! databaseunique_subjectcadefault_caerror on line %ld of config file '%s' %serror loading the config file '%s' openssl.cnf/SSLEAY_CONFOPENSSL_CONF-crl_CA_compromise-crl_compromise-crl_hold-crl_reason-crlexts-updatedb-status-extfile-revoke-spkac-ss_cert-infiles-crlhours-crldays-msie_hack-gencrl-noemailDN-preserveDN-notext-outdir-selfsign-cert-keyfile-policy-enddate-startdate-create_serial-namebad input format specified for pkcs7 object unable to write pkcs7 object unable to load PKCS7 object -noout don't output encoded data -text print full details of certificates -print_certs print any certs or crl in the input -outform arg output format - DER or PEM -inform arg input format - DER or PEM -print_certsunable to load the file, %s error loading certificates bad input format specified for input crl unable to load CRL -nocrl no crl to load, just certs from '-certfile' (can be used more than once) -certfile arg certificates file of chain to a trusted CA -certfile-nocrl -CApath dir - verify CRL using certificates in "dir" -CAfile name - verify CRL using certificates in file "name" -noout - no CRL output -crlnumber - print CRL number -nextupdate - nextUpdate field -lastupdate - lastUpdate field -issuer - print issuer DN -fingerprint - print the crl fingerprint -hash - print hash value -out arg - output file - default stdout -in arg - input file - default stdin -text - print out a text format version -outform arg - output format - default PEM -inform arg - input format - default PEM (DER or PEM) usage: crl args unable to write CRL %02X%c%s Fingerprint=NONEnextUpdate=lastUpdate=%08lx crlNumber=issuer=Error getting CRL issuer public key Error getting CRL issuer certificate Error initialising X509 store -crlnumber-fingerprint-nextupdate-lastupdate-issuer-hashunable to write key .\apps\rsa.cwriting RSA key RSA key error: %s RSA key ok Public KeyOnly private keys can be checked -engine e use engine e, possibly a hardware device. -pubout output a public key -pubin expect a public key in input file -check verify key consistency -modulus print the RSA key modulus -noout don't print key out -text print the key in text encrypt PEM output with cbc aes -aes128, -aes192, -aes256 -idea encrypt PEM output with cbc idea -des3 encrypt PEM output with ede cbc des using 168 bit key -des encrypt PEM output with cbc des -passout arg output file pass phrase source -out arg output file -passin arg input file pass phrase source -sgckey Use IIS SGC key format -in arg input file -outform arg output format - one of DER NET PEM -inform arg input format - one of DER NET PEM -pubout-pubin-sgckey-passin arg pass phrase source -hexdump hex dump output -decrypt decrypt with private key -encrypt encrypt with public key -verify verify with public key -sign sign with private key -oaep use PKCS#1 OAEP -pkcs use PKCS#1 v1.5 padding (default) -raw use no padding -ssl use SSL v2 padding -certin input is a certificate carrying an RSA public key -pubin input is an RSA public -keyform arg private key format - default PEM -inkey file input key -out file output file -in file input file Usage: rsautl [options] RSA operation error Error reading input Data .\apps\rsautl.cError Reading Output File Error Reading Input File Error getting RSA key CertificateA private key is needed for this operation -decrypt-encrypt-rev-pkcs-ssl-oaep-raw-hexdump-asn1parse-certin-inkeyunable to write private key writing DSA key Public Key=unable to load Key read DSA key -modulus print the DSA public value -outform arg output format - DER or PEM -inform arg input format - DER or PEM unable to write DSA parameters return(dsa); } { DSA_free(dsa); return(NULL); } if ((dsa->p == NULL) || (dsa->q == NULL) || (dsa->g == NULL)) dsa->g=BN_bin2bn(dsa%d_g,sizeof(dsa%d_g),NULL); dsa->q=BN_bin2bn(dsa%d_q,sizeof(dsa%d_q),NULL); dsa->p=BN_bin2bn(dsa%d_p,sizeof(dsa%d_p),NULL); if ((dsa=DSA_new()) == NULL) return(NULL); DSA *dsa; DSA *get_dsa%d() { static unsigned char dsa%d_g[]={static unsigned char dsa%d_q[]={static unsigned char dsa%d_p[]={.\apps\dsaparam.cError, DSA key generation failed This could take some time number number of bits to use for generating private key -rand files to use for random number input -genkey generate a DSA key -text print as text %s [options] [bits] outfile Error allocating DSA object need_rand.\apps\dsaparam.c-genkeybad input format specified for key writing EC key read EC key explicit possible values: named_curve (default) in the asn1 der encoding -param_enc arg specifies the way the ec parameters are encoded hybrid uncompressed (default) possible values: compressed -conv_form arg specifies the point conversion form -param_out print the elliptic curve parameters -text print the key -des encrypt PEM output, instead of 'des' every other cipher supported by OpenSSL can be used -param_outexplicitnamed_curve-param_enchybriduncompressedcompressed-conv_form0x%02X 0x00static unsigned char %s_%d[] = {.\apps\ecparam.cunable to write elliptic curve parameters return(group); } } group = NULL; EC_GROUP_free(group); { if (!ok) if (point) EC_POINT_free(point); if (tmp_3) BN_free(tmp_3); if (tmp_2) BN_free(tmp_2); if (tmp_1) BN_free(tmp_1); err: ok=1; if (!EC_GROUP_set_generator(group, point, tmp_2, tmp_3)) goto err; if ((tmp_3 = BN_bin2bn(ec_cofactor_%d, sizeof(ec_cofactor_%d), tmp_3)) == NULL) goto err; if ((tmp_2 = BN_bin2bn(ec_order_%d, sizeof(ec_order_%d), tmp_2)) == NULL) goto err; if (point == NULL) goto err; point = EC_POINT_bn2point(group, tmp_1, NULL, NULL); if ((tmp_1 = BN_bin2bn(ec_gen_%d, sizeof(ec_gen_%d), tmp_1)) == NULL) goto err; /* build generator */ if ((group = EC_GROUP_new_curve_GFp(tmp_1, tmp_2, tmp_3, NULL)) == NULL) goto err; if ((tmp_3 = BN_bin2bn(ec_b_%d, sizeof(ec_b_%d), NULL)) == NULL) goto err; if ((tmp_2 = BN_bin2bn(ec_a_%d, sizeof(ec_a_%d), NULL)) == NULL) goto err; if ((tmp_1 = BN_bin2bn(ec_p_%d, sizeof(ec_p_%d), NULL)) == NULL) goto err; BIGNUM *tmp_1 = NULL, *tmp_2 = NULL, *tmp_3 = NULL; EC_POINT *point = NULL; EC_GROUP *group = NULL; int ok=0; EC_GROUP *get_ec_group_%d(void) { ec_cofactorec_orderec_genec_bec_aec_pok failed checking elliptic curve parameters: unable to load elliptic curve parameters unknown curve name (%s) using curve name prime256v1 instead of secp256r1 secp256r1unable to create curve (%s) using curve name prime192v1 instead of secp192r1 secp192r1 %-10s: CURVE DESCRIPTION NOT AVAILABLE -engine e use engine e, possibly a hardware device -rand file files to use for random number input -genkey generate ec key -no_seed if 'explicit' parameters are choosen do not use the seed explicit possible values: named_curve (default) in the asn1 der encoding -param_enc arg specifies the way the ec parameters are encoded hybrid uncompressed (default) possible values: compressed -conv_form arg specifies the point conversion form -list_curves prints a list of all currently available curve 'short names' -name arg use the ec parameters with 'short name' name -C print a 'C' function creating the parameters -check validate the ec parameters -text print the ec parameters in text form -noout do not print the ec parameter -out arg output file - default stdout -in arg input file - default stdin -outform arg output format - default PEM -inform arg input format - default PEM (DER or PEM) .\apps\ecparam.c-no_seed-list_curves -certopt arg - various certificate text options -clrext - delete extensions before signing and input certificate -extensions - section from config file with X509V3 extensions to add -extfile - configuration file with X509V3 extensions to add -md2/-md5/-sha1/-mdc2 - digest to use -C - print out C code forms -text - print the certificate in text form -set_serial - serial number to use -CAserial arg - serial file -CAcreateserial - create serial number file if it does not exist missing, it is assumed to be in the CA file. -CAkey arg - set the CA key, must be PEM format -CA arg - set the CA certificate, must be PEM format. -req - input is a certificate request, sign and output. -x509toreq - output a certification request object -signkey arg - self sign cert with arg exit 1 if so, 0 if not -checkend arg - check whether the cert expires in the next arg seconds -days arg - How long till expiry of a signed certificate - def 30 days -setalias arg - set certificate alias -addreject arg - reject certificate for a given purpose -addtrust arg - trust certificate for a given purpose -clrreject - clear all rejected purposes -clrtrust - clear all trusted purposes -trustout - output a "trusted" certificate -ocsp_uri - print OCSP Responder URL(s) -ocspid - print OCSP hash values for the subject name and public key -noout - no certificate output -alias - output certificate alias -fingerprint - print the certificate fingerprint -pubkey - output the public key -modulus - print the RSA key modulus -dates - both Before and After dates -purpose - print out certificate purposes -enddate - notAfter field -startdate - notBefore field -email - print email address(es) -subject - print subject DN -hash - synonym for -subject_hash -issuer_hash - print issuer hash value -subject_hash - print subject hash value -serial - print serial number value -passin arg - private key password source -CAkeyform arg - CA key format - default PEM -CAform arg - CA format - default PEM -keyform arg - private key format - default PEM -outform arg - output format - default PEM (one of DER, NET or PEM) -inform arg - input format - default PEM (one of DER, NET or PEM) usage: x509 args add_word failure .srlout of mem .\apps\x509.cerror with certificate - error %d at depth %d %s error with certificate to be certified - should be self signed Yes (WARNING code=%d) No Yes %s%s : CAunable to write certificate Certificate will not expire no request key file specified Certificate will expire Generating certificate request request keyGetting request Private Key CA Private KeyGetting CA Private Key .\apps\x509.cPrivate keyGetting Private key notAfter=notBefore=unsigned char XXX_certificate[%d]={ unsigned char XXX_public_key[%d]={ }; unsigned char XXX_subject_name[%d]={ /* issuer :%s */ /* subject:%s */ Certificate purposes: serial=subject= issuer= 2.99999.3SET.ex3SET x509v3 extension 3CA CertificateIt does not contain a public key The certificate request appears to corrupted Signature verification error We need a private key to sign with need to specify a CAkey if using the CA command Invalid reject object value %s Invalid trust object value %s -ocspiduse -clrext instead of -crlext -crlext-clrext-CAcreateserial-alias-clrreject-clrtrust-trustout-checkend-purpose-dates-issuer_hash-subject_hash-x509toreq-next_serial-serial-ocsp_uri-email-certopt-setalias-addreject-addtrust-CAserial-CAkey-CA-signkeybad number of days -CAkeyform-CAform-reqe is %ld (0x%lX) Generating RSA private key, %d bit long modulus the random number generator load the file (or the files in the directory) into -3 use 3 for the E value -f4 use F4 (0x10001) for the E value -out file output the key to 'file -idea encrypt the generated key with IDEA in cbc mode -des3 encrypt the generated key with DES in ede cbc mode (168 bit key) -des encrypt the generated key with DES in cbc mode usage: genrsa [args] [numbits] -aes256-aes192-aes128-idea-des3-des-f4-F4-3unable to create BIO for output - a DSA parameter file as generated by the dsaparam command dsaparam-file -idea - encrypt the generated key with IDEA in cbc mode -des3 - encrypt the generated key with DES in ede cbc mode (168 bit key) -des - encrypt the generated key with DES in cbc mode -out file - output the key to 'file' usage: gendsa [args] dsaparam-file Generating DSA key, %d bits unable to load DSA parameter file -HTTP/1.0 200 ok Content-type: text/plain Lets print some clear text server2.pemserver.pem -no_ticket - disable use of RFC4507bis session tickets -tlsextdebug - hex dump of all TLS extensions received -key2 arg - Private Key file to use for servername, in cert file if -cert2 arg - certificate file to use for servername -servername_fatal - on mismatch send fatal alert (default warning alert) -servername host - servername for HostName TLS extension -id_prefix arg - Generate SSL/TLS session IDs prefixed by 'arg' -engine id - Initialise and use the specified engine with the assumption it contains a complete HTTP response. -HTTP - Respond to a 'GET / HTTP/1.0' with file ./ -WWW - Respond to a 'GET / HTTP/1.0' with file ./ -www - Respond to a 'GET /' with a status page -bugs - Turn on SSL bug compatibility -no_ecdhe - Disable ephemeral ECDH -no_dhe - Disable ephemeral DH -no_tls1 - Just disable TLSv1 -no_ssl3 - Just disable SSLv3 -no_ssl2 - Just disable SSLv2 -chain - Read a certificate chain -mtu - Set MTU -timeout - Enable timeouts -dtls1 - Just talk DTLSv1 -tls1 - Just talk TLSv1 -ssl3 - Just talk SSLv3 -ssl2 - Just talk SSLv2 -no_tmp_rsa - Do not generate a tmp RSA key -quiet - No server output -serverpref - Use server's cipher preferences -cipher arg - play with 'openssl ciphers' to see what goes here -nocert - Don't use any certificates (Anon-DH) -CAfile arg - PEM format file of CA's -CApath arg - PEM format directory of CA's -state - Print the SSL states -msg - Show protocol messages -debug - Print more output -crlf - convert LF from terminal into CRLF -nbio_test - test with the non-blocking test bio -nbio - Run with non-blocking IO -named_curve arg - Elliptic curve name to use for ephemeral ECDH keys. Use "openssl ecparam -list_curves" for all names (default is sect163r2). or a default set of parameters is used -dhparam arg - DH parameter file to use, in cert file if not specified -dpass arg - second private key file pass phrase source -dkeyform arg - second key format (PEM, DER or ENGINE) PEM default -dkey arg - second private key file to use (usually for DSA) -dcertform x - second certificate format (PEM or DER) PEM default -dcert arg - second certificate file to use (usually for DSA) -pass arg - private key file pass phrase source -keyform arg - key format (PEM, DER or ENGINE) PEM default not specified (default is %s) -key arg - Private Key file to use, in cert file if -certform arg - certificate format (PEM or DER) PEM default -crl_check_all - check the peer certificate has not been revoked by its CA or any other CRL in the CA chain. CRL(s) are appened to the the certificate file. -crl_check - check the peer certificate has not been revoked by its CA. The CRL(s) are appended to the certificate file (default is %s) -cert arg - certificate file to use -Verify arg - turn on peer certificate verification, must have a cert. -verify arg - turn on peer certificate verification -context arg - set session ID context -accept arg - port to accept on (default is %d) usage: s_server [args ...] Swiching server context. Hostname in TLS extension: "%s" cert_status: ocsp response sent: cert_status: error querying responder cert_status: Can't retrieve issuer certificate. cert_status: no AIA and no default responder URL cert_status: AIA URL: %s cert_status: can't parse AIA URL cert_status: callback called %4ld cache full overflows (%ld allowed) %4ld callback cache hits %4ld session cache timeouts %4ld session cache misses %4ld session cache hits %4ld server accepts that finished %4ld server renegotiates (SSL_accept()) %4ld server accepts (SSL_accept()) %4ld client connects that finished %4ld client renegotiates (SSL_connect()) %4ld client connects (SSL_connect()) %4ld items in the session cache shutdown accept socket Peer has incorrect TLSv1 block padding Reused session-id CIPHER is %s (NONE)Shared ciphers:%s issuer=%s subject=%s Client certificate SSL SESSION PARAMETERSverify error:%s ERROR DELAY ACCEPT rwrite W BLOCK .htm.php.htmlFILE:%s Error opening '%s' '%s' is a directory Error accessing '%s' '%s' is an invalid path '%s' contains '..' reference '%s' is an invalid file name no client certificate available --- %s, Cipher is %s --- New, --- Reused, --- Ciphers common between both SSL end points: %-11s:%-25sCiphers supported in s_server binary

HTTP/1.0 200 ok
Content-type: text/html

GET /GET /stats GET read R BLOCK
turning on non blocking io
.\apps\s_server.cGenerating temp (%d bit) RSA key...Allocation error in generating RSA key
CONNECTION CLOSED
shutting down SSL
DONE
Read BLOCK
Write BLOCK
SSL_do_handshake -> %d
lf_num == 0.\apps\s_server.cunable to create curve (sect163r2)
Using default temp ECDH parameters
error setting cipher list
Setting temp ECDH parameters
Using default temp DH parameters
Setting temp DH parameters
Setting secondary ctx parameters
id_prefix '%s' set.
error setting 'id_prefix'
warning: id_prefix is too long if you use SSLv2
warning: id_prefix is too long, only one new session will be possible
second certificate private key filesecond server certificate filesecond server certificate private key fileserver certificate fileserver certificate private key file-key2-cert2-servername_fatal-servername-id_prefix-chain-mtu-timeout-dtls1-tls1-ssl3-ssl2-no_ticket-no_tls1-no_ssl3-no_ssl2-HTTP-WWW-www-no_ecdhe-no_dhe-no_tmp_rsa-bugs-crlf-state-hack-msgError parsing URL
-status_url-status_timeout-status_verbose-tlsextdebug-nbio_test-nbio-cipher-serverpref-crl_check_all-crl_check-nocert-dkey-dpass-dkeyform-dcert-dcertform-named_curve-dhparam-certform-contextverify depth is %d, must return a certificate
-Verifyverify depth is %d
-accept-port                 -no_ticket        - disable use of RFC4507bis session tickets
 -status           - request certificate status from server
 -tlsextdebug      - hex dump of all TLS extensions received
 -servername host  - Set TLS extension servername in ClientHello
 -sess_in arg  - file to read SSL session from
 -sess_out arg - file to write SSL session to
                 are supported.
                 only "smtp", "pop3", "imap", "ftp" and "xmpp"
                 'prot' defines which one to assume.  Currently,
                 for those protocols that support it, where
 -starttls prot - use the STARTTLS command before starting TLS
                 command to see what is available
 -cipher       - preferred cipher to use, use the 'openssl ciphers'
 -serverpref   - Use server's cipher preferences (only SSLv2)
 -bugs         - Switch on all SSL implementation bug workarounds
 -no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol
 -mtu          - set the MTU
 -dtls1        - just use DTLSv1
 -tls1         - just use TLSv1
 -ssl3         - just use SSLv3
 -ssl2         - just use SSLv2
 -no_ign_eof   - don't ignore input eof
 -ign_eof      - ignore input eof (default when -quiet)
 -quiet        - no s_client output
 -state        - print the 'ssl' states
 -nbio_test    - more ssl protocol testing
 -debug        - extra output
 -showcerts    - show all certificates in the chain
 -pause        - sleep(1) after each read(2) and write(2) system call
 -reconnect    - Drop and re-make the connection with the same Session-ID
 -keyform arg  - key format (PEM or DER) PEM default
                 not specified but cert file is.
 -key arg      - Private key file to use, in cert file if
 -cert arg     - certificate file to use, PEM format assumed
 -verify depth - turn on peer certificate verification
 -connect host:port - who to connect to (default is %s:%s)
localhost4433 -port port     - use -connect instead
 -host host     - use -connect instead
usage: s_client args
Can't use SSL_get_servername
Expansion: %s
Compression: %s
Server public key is %d bit
---
SSL handshake has read %ld bytes and written %ld bytes
---
Ciphers common between both SSL endpoints:
---
No client certificate CA names sent
---
Acceptable client certificate CA names
no peer certificate available
Server certificate
   i:%s
%2d s:%s
---
Certificate chain
======================================

======================================
response parse error
no response sent
OCSP response: closed
read:errno=%d
write:errno=%d
shutdown
bad select %d
getsockname:errno=%d
connect:errno=%d
drop connection and then reconnect
read X BLOCK
read W BLOCK
RENEGOTIATING
.\apps\s_client.cwrite X BLOCK
write R BLOCK
write W BLOCK
Error writing session file %s
/stream:features>AUTH TLS
. STARTTLS
didn't found STARTTLS in server response, try anyway...
. CAPABILITY
STLS
STARTTLS
didn't found starttls in server response, try anyway...
STARTTLSEHLO openssl.client.net
CONNECTED(%08X)
Unable to set TLS servername extension.
Can't open session file %s
Error setting client auth engine
client certificate fileclient certificate private key fileError getting client auth engine
-ssl_client_enginexmppftpimappop3smtp-starttls-reconnect-showcerts-pause-no_ign_eof-ign_eof-prexit-sess_in-sess_out-connect-host.\apps\s_client.cnistb571nistb409nistb283nistb233nistb163nistk571nistk409nistk283nistk233nistk163nistp521nistp384nistp256nistp224nistp192secp160r1aes-256 igeaes-192 igeaes-128 igeevpcamellia-256 cbccamellia-192 cbccamellia-128 cbcaes-256 cbcaes-192 cbcaes-128 cbccast cbcblowfish cbcrc5-32/12 cbcrc2 cbcseed cbcidea cbcdes ede3des cbcrc4rmd160hmac(md5)string to make the random number generator think it has entropy4Vxš¼Þð4Vxš¼Þð4Vxš¼Þð4Vxš¼ÞðVxš¼Þð44Vxš¼Þð4Vxš¼ÞðVxš¼Þð4xš¼Þð4Vü©ñÒMbP?@@Doing %s %ld times on %d size blocks: +DN:%s:%ld:%d
Doing %ld %d bit %s %s's: +DNP:%ld:%d:%s:%s
%d %s's in %.2fs
+R:%d:%s:%f
%4u bit ecdh (%s) %8.4fs %8.1f
+F5:%u:%u:%f:%f
%30sop      op/s
%4u bit ecdsa (%s) %8.4fs %8.4fs %8.1f %8.1f
+F4:%u:%u:%f:%f
%30ssign    verify    sign/s verify/s
dsa %4u bits %8.6fs %8.6fs %8.1f %8.1f
+F3:%u:%u:%f:%f
rsa %4u bits %8.6fs %8.6fs %8.1f %8.1f
+F2:%u:%u:%f:%f
%18ssign    verify    sign/s verify/s
 %11.2f :%.2f %11.2fkˆÃ@%-13s+F:%d:%s%7d bytes:%dtype        The 'numbers' are in 1000s of bytes per second processed.
+HECDH failure.
ECDH key generation failure.
timing function used: %s%s%s%s%s%s%s
ftimetimesgettimeofdaygetrusageHZ=%gTIMEB available timing options: 
%s
%s options:%ld %d-bit ECDH ops in %.2fs
+R7:%ld:%d:%.2f
ECDH computations don't match.
%ld %d bit ECDSA verify in %.2fs
+R6:%ld:%d:%.2f
ECDSA verify failure
ECDSA verify failure.  No ECDSA verify will be done.
%ld %d bit ECDSA signs in %.2fs 
+R5:%ld:%d:%.2f
ECDSA sign failure
ECDSA sign failure.  No ECDSA sign will be done.
ECDSA failure.
%ld %d bit DSA verify in %.2fs
+R4:%ld:%d:%.2f
DSA verify failure
verifyDSA verify failure.  No DSA verify will be done.
%ld %d bit DSA signs in %.2fs
+R3:%ld:%d:%.2f
DSA sign failure
signDSA sign failure.  No DSA sign will be done.
%ld %d bit public RSA's in %.2fs
+R2:%ld:%d:%.2f
RSA verify failure
publicRSA verify failure.  No RSA verify will be done.
%ld %d bit private RSA's in %.2fs
+R1:%ld:%d:%.2f
RSA sign failure
privateRSA sign failure.  No RSA sign will be done.
This is a key...@internal error loading RSA key number %d
-mr             produce machine readable output.
-decrypt        time decryption instead of encryption (only EVP).
-evp e          use EVP e.
Available options:
rsa      aes      des      rc2      idea     ecdh
ecdhb163  ecdhb233  ecdhb283  ecdhb409  ecdhb571
ecdhk163  ecdhk233  ecdhk283  ecdhk409  ecdhk571
ecdhp160  ecdhp192  ecdhp224  ecdhp256  ecdhp384  ecdhp521
ecdsa
ecdsab163 ecdsab233 ecdsab283 ecdsab409 ecdsab571
ecdsak163 ecdsak233 ecdsak283 ecdsak409 ecdsak571
ecdsap160 ecdsap192 ecdsap224 ecdsap256 ecdsap384 ecdsap521
dsa512   dsa1024  dsa2048
rsa512   rsa1024  rsa2048  rsa4096
aes-128-ige aes-192-ige aes-256-ige aes-128-cbc aes-192-cbc aes-256-cbc des-cbc  des-ede3 rc2-cbc  idea-cbc sha512   sha256   sha1     hmac     md5      md4      md2      Available values:
Error: bad option or value
no engine given
%s is an unknown cipher or digest
no EVP given
First we calculate the approximate speed ...
program when this computer is idle.
To get the most accurate results, try to run this
You have chosen to measure elapsed time instead of user CPU time.
ecdhecdhb571ecdhb409ecdhb283ecdhb233ecdhb163ecdhk571ecdhk409ecdhk283ecdhk233ecdhk163ecdhp521ecdhp384ecdhp256ecdhp224ecdhp192ecdhp160ecdsaecdsab571ecdsab409ecdsab283ecdsab233ecdsab163ecdsak571ecdsak409ecdsak283ecdsak233ecdsak163ecdsap521ecdsap384ecdsap256ecdsap224ecdsap192ecdsap160dsarsaaesdescast5castcast-cbcbfblowfishbf-cbcideaidea-cbcrc2rc2-cbcrsa4096rsa2048rsa1024rsa512dsa2048dsa1024dsa512opensslaes-256-igeaes-192-igeaes-128-igeaes-256-cbcaes-192-cbcaes-128-cbcdes-ede3des-cbcripemdhmac-mr-evp-elapsed.\apps\speed.clocalhost:4433-www page     - Retrieve 'page' from the site
-reuse        - Just time connection reuse
-new          - Just time new connections
-bugs         - Turn on SSL bug compatibility
-ssl3         - Just use SSLv3
-ssl2         - Just use SSLv2
-nbio         - Run with non-blocking IO
-connect host:port - host:port to connect to (default is %s)
usage: s_time 

-time-www option too long
-reuseíµ ÷ư>starting
Unable to get connection


Now timing with session id reuse.
%d connections in %ld real seconds, %ld bytes read per connection


%d connections in %.2fs; %.2f connections/user sec, bytes read %ld
GET %s HTTP/1.0

Collecting connection statistics for %d seconds
No CIPHER specified
SSL_CIPHERmultilineonelineRFC2253dump_unknownspace_eqoidalignlnamesnamenofnamedn_revsep_multilinesep_semi_plus_spacesep_comma_plus_spacesep_comma_pluscompatdump_derdump_nostrdump_allshow_typeignore_typeuse_quoteesc_msbesc_ctrlesc_2253ext_dumpext_parseext_errorext_defaultno_attributesno_auxno_sigdumpno_extensionsno_pubkeyno_issuerno_subjectno_validityno_signameno_serialno_versionno_headerca_defaultcompatibleœtDÿÿÿÿtD“ÿÿÿÿ„tDxtDltD`tDTtD HtD@
%s Policies:UserAuthorityRequire explicit Policy: %s
FalseTrueunable to load %s
bad input format specified for key file
no engine specified
no keyfile specified
error converting number from bin to BIGNUM
unable to load number from %s
Out of memory
reasonunable to rename %s to %s
error on line %ld of db attribute file '%s'
verify return:%d
issuer= %s
verify error:num=%d:%s
depth=%d %s
Private key does not match the certificate public key
unable to get private key from '%s'
unable to get certificate from '%s'
error setting private key
error setting certificate
write to %p [%p] (%d bytes => %ld (0x%lX))
read from %p [%p] (%d bytes => %ld (0x%lX))
%s:error in %s
%s:failed in %s
SSL3 alert %s:%s:%s
writeread%s:%s
undefinedSSL_acceptSSL_connect %02x
      %s %s%s [length %04lx]%s%s
, Finished, ClientKeyExchange, CertificateVerify, ServerHelloDone, CertificateRequest, ServerKeyExchange, Certificate, ServerHello, ClientHello, HelloRequest no_renegotiation user_canceled internal_error insufficient_security protocol_version export_restriction decrypt_error decode_error access_denied unknown_ca illegal_parameter certificate_unknown certificate_expired certificate_revoked unsupported_certificate bad_certificate handshake_failure decompression_failure record_overflow decryption_failed bad_record_mac unexpected_message close_notify, warning, fatal, ???ChangeCipherSpecAlertHandshake, CLIENT-CERTIFICATE, REQUEST-CERTIFICATE, SERVER-FINISHED, SERVER-VERIFY, SERVER-HELLO, CLIENT-FINISHED, CLIENT-MASTER-KEY, CLIENT-HELLO UNSUPPORTED-CERTIFICATE-TYPE-ERROR BAD-CERTIFICATE-ERROR NO-CERTIFICATE-ERROR NO-CIPHER-ERROR ???, ERROR:SSL 2.0SSL 3.0 TLS 1.0 ???<<<>>>TLS %s extension "%s" (id=%d), len=%d
clientserverserver ticketEC point formatselliptic curvesstatus requesttruncated HMACtrusted CA keysclient certificate URLmax fragment lengthserver nameunable to start WINSOCK, error code=%d
connectkeepalivesocketgetservbyname failure for %s
tcpgethostbyname addr is not AF_INET
gethostbyname failure
.\apps\s_socket.cbad gethostbyaddr
accept error %d
invalid IP address
%u.%u.%u.%uno port defined
'random' data can be kept in (the file will be overwritten).
Consider setting the RANDFILE environment variable to point at a file that
with much random data.
This means that the random number generator has not been seeded
unable to load 'random state'
 done
Loading 'screen' into random state -unable to write 'random state'
options:  %s (Library: %s)
OpenSSL 0.9.8l 5 Nov 2009usage:version -[avbofpd]
-o-f-b -context arg    - set the session ID context
 -cert           - output certificate 
 -text           - print ssl session id details
usage: sess_id args
unable to load SSL_SESSION
unable to write X509
unable to write SSL_SESSION
No certificate present
Context too long
 -tls1       - TLS1 mode
 -ssl3       - SSL3 mode
 -ssl2       - SSL2 mode
 -v          - verbose mode, a textual listing of the ciphers in SSLeay
usage: ciphers args
Error in cipher list
-?-hError reading sequence file %s
Error reading certs file %s
Can't open output file %s
Can't open input file %s
-toseq    output NS Sequence file
-out file output file
-in file  input file
Usage nseq [options]
Netscape certificate sequence utility
-toseq%s, Iteration %ld
%02X PKCS7 Encrypted data: PKCS7 Data


:     %s: 
%s: 
Mac verify error: invalid password?
Error outputting keys and certificates
MAC verified OK
MAC Iteration %ld
Enter Import Password:Error %s getting chain.
Enter Export Password:Memory allocation error
certificates from certfileNo certificate matches private key
certificatesprivate keyNothing to do!
Can't read Password
Enter MAC Password:Error opening input file %s
-password-caname-CSP-LMK-keypbe-LMK          Add local machine keyset attribute to private key
-CSP name     Microsoft CSP name
              the random number generator
              load the file (or the files in the directory) into
-rand file%cfile%c...
-engine e     use engine e, possibly a hardware device.
-passout p    output file pass phrase source
-passin p     input file pass phrase source
-password p   set import/export password source
-keysig       set MS key signature type
-keyex        set MS key exchange type
-keypbe alg   specify private key PBE algorithm (default 3DES)
-certpbe alg  specify certificate PBE algorithm (default RC2-40)
-descert      encrypt PKCS#12 certificates with triple DES (default RC2-40)
-twopass      separate MAC, encryption passwords
-maciter      use MAC iteration
-noiter       don't use encryption iteration
-nodes        don't encrypt private keys
              encrypt PEM output with cbc aes
-aes128, -aes192, -aes256
-idea         encrypt private keys with idea
-des3         encrypt private keys with triple DES (default)
-des          encrypt private keys with DES
-info         give info about PKCS#12 structure.
-nokeys       don't output private keys.
-cacerts      only output CA certificates.
-clcerts      only output client certificates.
-nocerts      don't output certificates.
-nomacver     don't verify MAC.
-noout        don't output anything, just verify.
-out outfile  output filename
-in  infile   input filename
-caname "nm"  use nm as CA friendly name (can be used more than once).
-name "name"  use name as friendly name
-CAfile arg   - PEM format file of CA's
-CApath arg   - PEM format directory of CA's
-certfile f   add all certs in f
-inkey file   private key if not infile
-chain        add certificate chain
-export       output PKCS12 file
Usage: pkcs12 [options]
Unknown PBE algorithm %s
-certpbe-nomac-nomaciter-maciter-noiter-export-descert-nomacver-twopass-info-cacerts-clcerts-nocerts-keysig-keyex-nokeysWarning unsupported bag type: Safe Contents bag
Certificate bag
Shrouded Keybag: Key AttributesBag AttributesKey bag
No Octet String in PrivateKey
DSA parameters included in PrivateKey
DSA public key include in PrivateKey
Unknown broken type
Warning: broken key encoding: Error decrypting key
Enter Password:Error reading key
Error encrypting key
Enter Encryption Password:Bad format specified for key
Error converting key
key-v1 obj         use PKCS#5 v1.5 and cipher "alg"
-v2 alg         use PKCS#5 v2.0 and cipher "alg"
-nocrypt        use or expect unencrypted private key
-noiter         use 1 as iteration count
-nsdb           use (nonstandard) DSA Netscape DB format
-embed          use (nonstandard) embedded DSA parameters format
-nooct          use (nonstandard) no octet format
-topk8          output PKCS8 file
-passout arg    output file pass phrase source
-outform X      output format (DER or PEM)
-passin arg     input file pass phrase source
-inform X       input format (DER or PEM)
Usage pkcs8 [options]
-embed-nsdb-nooct-nocrypt-topk8-v1Unknown cipher %s
-v2Signature Failure
Signature OK
Error loading SPKAC
Can't find SPKAC called "%s"
Error parsing config file
Error opening input file
SPKAC=%s
Error opening output file
 -engine e      use engine e, possibly a hardware device.
 -verify        verify SPKAC signature
 -noout         don't print SPKAC
 -spkac arg     alternative SPKAC name
 -challenge arg challenge string
 -passin arg    input file pass phrase source
 -key arg       create SPKAC using private key
%s [options]
-spksect-challengeBad input format for PKCS#7 file
Bad output format for PKCS#7 file
Subject: %s
From: %s
To: %s
Verification failure
Error writing signers to %s
Verification successful
Error decrypting PKCS#7 structure
Can't read content file %s
Error reading S/MIME message
Error creating PKCS#7 structure
signing key filesigner certificaterecipient certificate filecert.pem       recipient certificate(s) for encryption
               load the file (or the files in the directory) into
-passin arg    input file pass phrase source
-engine e      use engine e, possibly a hardware device.
-crl_check_all check revocation status of signer's certificate chain using CRLs
-crl_check     check revocation status of signer's certificate using CRLs
-CAfile file   trusted certificates file
-CApath dir    trusted certificates directory
-text          include or delete text MIME headers
-subject s     subject
-from ad       from address
-to addr       to address
-content file  supply or override content for detached signature
-outform arg   output format SMIME (default), PEM or DER
-out file      output file
-keyform arg   input private key format (PEM or ENGINE)
-inkey file    input private key (if not signer or recipient)
-inform arg    input format SMIME (default), PEM or DER
-in file       input file
-recip  file   recipient certificate file for decryption
-signer file   signer certificate file
-certfile file other certificates file
-binary        don't translate message to text
-noattr        don't include any signed attributes
-nodetach      use opaque signing
-nocerts       don't include signers certificate when signing
-noverify      don't verify signers certificate
-nosigs        don't verify message signature
-nointern      don't search certificates in message for signer
               encrypt PEM output with cbc aes
-rc2-128       encrypt with RC2-128
-rc2-64        encrypt with RC2-64
-rc2-40        encrypt with RC2-40 (default)
-des           encrypt with DES
-des3          encrypt with triple DES
-pk7out        output PKCS#7 structure
-verify        verify signed message
-sign          sign message
-decrypt       decrypt encrypted message
-encrypt       encrypt message
Usage smime [options] cert.pem ...
No recipient(s) certificate(s) specified
No recipient certificate or key specified
No signer certificate specified
-content-recip-signer-from-to-crlfeol-nooldmime-nosigs-nosmimecap-nodetach-noattr-nochain-nointern-rc2-64-rc2-128-rc2-40-pk7out-hex                  - hex encode output
-base64               - base64 encode output
-rand file%cfile%c... - seed PRNG from files
-engine e             - use engine e, possibly a hardware device.
-out file             - write to file
Usage: rand [options] num
 argument "/lib/libdriver.so".
 Eg. '-pre "SO_PATH:/lib/libdriver.so"' calls command "SO_PATH" with
 line, or all supported ENGINEs if none are specified.
 NB: -pre and -post will be applied to all ENGINEs supplied on the command
               (only used if -t is also provided)
 -post  - runs command 'cmd' against the ENGINE after loading it
               to load it (if -t is used)
 -pre   - runs command 'cmd' against the ENGINE before any attempts
               -tt will display error trace for unavailable engines
 -t[t]       - for each engine, check that they are really available
 -c          - for each engine, also list the capabilities
               -vvvv will also show internal input flags
               -vvv will also add the input flags for each command
               -vv will additionally display each command's description
 -v[v[v[v]]] - verbose mode, for each engine, list its 'control commands'
usage: engine opts [engine ...]
N, .\apps\engine.c  <0x%04X>NO_INPUTSTRING|NUMERIC[Internal] 
%s%s(input flags): %s: %s
[Error]: command name too long
[Success]: %s
[Failure]: %s
[Error]: internal stack error
[ unavailable ]
[ available ]
      [%s]
RANDDHLoaded: (%s) %s
(%s) %s
-post-pret-tvError Creating OCSP request
No issuer certificate specified
Error converting serial number %s
	Revocation Time: 	Reason: %s
	Next Update: 	This Update: WARNING: Status times invalid.
ERROR: No Status found.
.\apps\ocsp.cbnError setting up accept BIO
Error parsing OCSP request
Invalid request
POSTError accepting connection
HTTP/1.0 200 OK
Content-type: application/ocsp-response
Content-Length: %d

Unexpected retry condition
Select error
Timeout on request
Timeout on connect
Can't get connection fd
Error connecting BIO
Error querying OCSP responsder
Error creating SSL context.
Error creating connect BIO
Response verify OK
Nonce Verify error
Response Verify Failure
WARNING: no nonce in response
Error parsing response
validator certificateError reading OCSP response
Error Opening OCSP response file
Need a responder certificate, key and CA for this operation!
Error opening file %s
Error signing OCSP request
Error loading signer certificate
Responder Error: %s (%d)
signer private keysigner certificatesNeed an OCSP request for this operation!
Waiting for OCSP client connections...
responder private keyresponder other certificatesError loading responder certificate
responder certificateError reading OCSP request
Error Opening OCSP request file
-rother-rkey-rsigner-ndaysIllegal accept count %s
-nrequestIllegal update period %s
-nmin-indexissuer certificate-path-respout-reqoutIllegal validity age %s
-status_age-nrequest n        number of requests to accept (default unlimited)
-resp_key_id       identify reponse by signing certificate key ID
-ndays n	 	 number of days before next update
-nmin n	 	 number of minutes before next update
-resp_no_certs     don't include any certificates in response
-rother file	 other certificates to include in response
-rkey file	 responder key to sign responses with
-rsigner file	 responder certificate to sign responses with
-CA file		 CA certificate
-index file	 certificate status index file
-port num		 port to run responder on
-no_cert_checks    don't do additional checks on signing certificate
-no_chain          don't chain verify response
-no_cert_verify    don't check signing certificate
-no_signature_verify don't check signature on response
-no_intern         don't search certificates contained in response for signer
-trust_other       don't verify additional certificates
-verify_other file additional certificates to search for signer
-noverify          don't verify response at all
-status_age n      maximum status age in seconds
-validity_period n maximum validity discrepancy in seconds
-VAfile file       validator certificates file
-CAfile file       trusted certificates file
-CApath dir        trusted certificates directory
-path              path to use in OCSP request
-host host:n       send OCSP request to host on port n
-url URL           OCSP responder URL
-no_nonce          don't add OCSP nonce to request
-nonce             add OCSP nonce to request
-respin file       read DER encoded OCSP reponse from "file"
-reqin file        read DER encoded OCSP request from "file"
-respout file      write DER encoded OCSP reponse to "file"
-reqout file       write DER encoded OCSP request to "file"
-text              print text form of request and response
-resp_text         print text form of response
-req_text          print text form of request
-no_certs          don't include any certificates in signed request
-sign_other file   additional certificates to include in signed request
-signkey file      private key to sign OCSP request with
-signer file       certificate to sign OCSP request with
-serial n          serial number to check
-cert file         certificate to check
-issuer file       issuer certificate
-out file          output filename
Usage ocsp [options]
OCSP utility
Illegal validity period %s
-validity_period-verify_other-sign_other-VAfile-respin-reqin-resp_text-req_text-no_intern-trust_other-no_explicit-no_cert_checks-no_chain-no_cert_verify-no_signature_verify-no_certs-resp_key_id-resp_no_certs-no_nonce-nonce-ignore_err-urlIllegal timeout value %s
 is %sprime
not Unknown option '%s'
%-14s number of checks
-checks %-14s hex
No prime specified
-checkscast5-ofbcast5-cfbcast5-ecbcast5-cbcbf-ofbbf-cfbbf-ecbrc2-40-cbcrc2-64-cbcrc2-ofbrc2-cfbrc2-ecbidea-ofbidea-cfbidea-ecbdes-ede3-ofbdes-ede-ofbdes-ofbdes-ede3-cfbdes-ede-cfbdes-cfbdes-ede3-cbcdes-ede-cbcdes-ededes-ecbrc4-40desxdes3aes-256-ecbaes-192-ecbaes-128-ecbprimeocspenginerandsmimespkacpkcs8nseqcipherssess_idcrl2pkcs7pkcs7versions_timespeeds_clients_servergendsagenrsax509ecparamecdsaparamrsautlcrlerrstrgendhpasswddhparamdhdgstasn1parsetype out of boundsopenssl (lock_dbg_cb): %s (mode=%d, type=%d) at %s:%d
CRYPTO_w_unlock on read lockCRYPTO_r_unlock on write locknot lockedalready lockedinvalid mode%-15s
Cipher commands (see the `enc' command for more details)

Message Digest commands (see the `dgst' command for more details)

Standard commandsopenssl:Error: '%s' is an invalid command.
list-cipher-commandslist-message-digest-commandslist-standard-commandsbyeexitqquitno-bad exit
error in %s
OpenSSL> >offOPENSSL_DEBUG_MEMORYøEPEHE€ÄD%þÿÿÿÐÿÿÿþÿÿÿÁŠCÕŠCþÿÿÿÌÿÿÿþÿÿÿôCþÿÿÿØÿÿÿþÿÿÿ‹CŸC¤ÑpÓ8¬¤Å~Ó8 ÓŒÓ¬­XаÕìªlÅ`Ø Ü×T×FØ0ØØ
Øð×>׾ע׎×z×\×~€æ€t€q€½€Å€Æ€”
€z€u€*€…€,
€þ€à€¾€|€{€€é€¯
€:€w€¥€²
€Ï€
€&
€\€S€è€ç€V€€€Ô€z€3€€2€~
€Q€€P€÷	€T€S€Q€X
€O€¬€™
€›€W
€†€€f
€i€¼	€È	€µ	€¹	€Ø	€°	€»	€á	€€«	€®	€û€Ð€¿€E€O€b€k€_€g€a€€ú€±€§€€”	€o€$
€ñ€B€‰€%€Ž€€v€z€R€V€k	€Þ€¨€I€‘€.€€r€Ç
€9€Û€{€€+€q€,€\€4€N€]€ö€u€€¨€;€é€ 
€è€ä€ç€c€§€C€{	€m€”€Ó€u€Y€W€9€©€å€A€^€©€@€x€z€©€«€¡€
€ô€n€]€_€î€¥€m€§€Ê€h€š€¥€ð	€E€b€`€C
€¢€ž€Y€ €’€›€€Ÿ€¡€˜€Z€Œ€9€“€€ø€£€Þ
€Ò€ä€€€f€¡€–€æ€€¨€€‡
€ä€<€å€ò
€÷
€=€¸
€Ñ€µ€?€X€‘€^
€P
€O€—€€€C€Ü€Ž€‘€€0€M€L€à
€Å€!€"€
€»
€­€k€+€€S€ì€?€6€<€C€¼€Ê€Ÿ€!€>€x€È€Ï€‹€€Í€×€€O€g€Õ€š€›€Ë€c€Û€;€ü€ÿ€ž€ï€J€i€%€·
€;€€x€
€%€F
€É€ó€€€ƒ€~€æ€™€€€Ä€€ˆ€€€X€0€t€N€8€ª€€€€€€€S€¤€w€=€C€5€;€€D€j€?€H€
€€l€7€6€B€]€`€l€2€m€«€­€¯€	€¢€ë€€µ€€0
€¼
€[€¥€¦€€¦€€€€×€/
€¼€ï	€u€k€î
€€µ€¶
€€t€€|€‚€¢€Q€Í€¼€Ž€ê€¶€½€’€ø€n€_€ý€W	€‰€G€/€Ù€€L€s€©€¤€f	€Á€V€ã€ý€M€è€ò€7€ê€í€ë€ì€ñ€Œ€°€ €Þ€@€Ö€€¡€Ü€™
€`
€€
€€|
€‘
€ž€H
€s
€‚€¿
ۊ
€{€{
€
€3
€M
€…
€©€È
€
ۋ
€€¦
€“
€!€¥€m€€w
€f€Œ€ü€ù€÷€ø€€€Í€4€z€€Ž	€e	€P€d	€æ
€€e€b€Y€–€¤€€€"€\€ˆ€ˆ€€e€v€Ö€Î€´€S€o€>€+€v€½
€z
€–
€)€–€Ú€e€€¦
€V€r€k€€“€T€5€l€:€
€
€`€ò€z	€Ì€U€p€Æ	€½	€õ€-€t€€€Þ€R€™€€<€˜
€R€‡€.
€Ñ€Û€Ø€Õ€ò€ï€€d
€€`
€
€N€û€Á€à€(€×€o€õ€c€€€Ý€ä€U€F€Ä€†	€]€B€€Ü€.€Ü€ß€v€Ð€c€î€î€ã€[€Á€£€ƒ€Å€È€d€ß
€£
€‚€å€þ	€€f€D€H€)€L€a€ø€6€
€
€M€Q€€€ÿ€€€§€Ê€€€h	€§€y€ˆ€Š€ €P€	€D
€Ô	€º	€T€±	€š€}€Ž€„€¿€ÿ€€V
€]
€D€m
€ €˜€H€5
ۀ
€¤€€…€Â	€Ë€‰	€¯	€¢€¥€¼€€>€Í€Ó€Ò€Ô€Ö€€€‘€“€Ž€œ€!€€ €€º
€|
€O
€€€€€
€t€…€œ	€p
€€%€®
€&€‡€Í
€ó€û€÷€ò€l€þ€ð€ð€€õ€Ä€i€ì€k€_€j€€^€^€ÄÓÎÓÚÓäÓîÓøÓÔÔÔÔ"Ô*Ô4Ô>ÔFÔNÔXÔbÔjÔtÔ|Ô†ÔÔšÔ¤Ô®Ô¸ÔÄÔÎÔÜÔæÔðÔüÔÕÕÕ Õ*Õ6Õ>ÕHÕRÕ\ÕfÕpÕzÕ‚ÕŠÕ”ÕžÕ¦Õ¼ÕÊÕÚÕäÕìÕúÕÖÖ Ö6ÖJÖZÖjÖxÖŠÖœÖ²ÖÆÖÐÖÞÖæÖðÖ××.×nØxظӮӦӘӫ€"€#€-€´€–€1€€‚€€A€=€x€š€€#€¢€!€€7€l€O€z€4€€ €b€&€(€€€€€€+€n€q€t€¬€€%€w€Z€€V€;€`€<€8€€€€$€p€s€v€J€€·€€€‘€€€Ž€±€€€ç€I€€€ó€*€¤€M€}€^€H€¦€N€0€ù€y€K€ô€½€S€R€?€€:€€€—€€€3€4€7€€€
€	€€€€€s€q€t€€o€SSLEAY32.dllLIBEAY32.dllWSOCK32.dll¡__iob_funcÐfeofÑferrorÆclearerrŠ_filenof_setmode9_close_lseekˆ_write5_read_openÒfflushìftellêfseekÚfopenÏfcloseïfwriteâfreadÕfgetsÜfprintf.printfµabort,perror¿atoiZstrncmpJsscanfislower*memsetBsetvbufXstrncat'_wassertNstrchr_stat64i32stoupper&memcpyš_stricmpôgetenvÀatolÌexitÊ_time64astrstr·_ftime64Þfputc<renamep_errno;removeCsignalþisdigit`strspn5qsortßfputsmalloc:reallocäfree—_fmodeMSVCR90.dll_amsg_exitŸ__getmainargs,_cexit|_exitf_XcptFilter __initenv_initterm_initterm_e<_configthreadlocaleã__setusermatherr_adjust_fdivË__p__commodeÏ__p__fmodej_encode_pointerà__set_app_typeK_crt_debugger_hookC?terminate@@YAXXZæ_unlock–__dllonexitv_lock_onexit`_decode_pointers_except_handler4_common_invoke_watson?_controlfp_s½InterlockedExchange!SleepºInterlockedCompareExchange-TerminateProcess©GetCurrentProcess>UnhandledExceptionFilterSetUnhandledExceptionFilterÑIsDebuggerPresentTQueryPerformanceCounterfGetTickCount­GetCurrentThreadIdªGetCurrentProcessIdOGetSystemTimeAsFileTimeKERNEL32.dllû_accessl_kbhit²„.KÂØ¸Ø¼ØÀØ°ÎØopenssl.exeOPENSSL_ApplinkêC„µCÌéC¨éCpéCHéCéCØèC˜èCHèCèCÄçC”çClçC0çCèæCÀæCxæC0æCøåCÀåC„åC8åCôäCÈäC€äCXäCäCÌãCãCPãCãCÐâCˆâC8âCøáC°áCxáCláC\áCLáC8áC,áCáCáCôàCäàCÜàCÐàCàD„µC¤DtD@DDÜD´D„D`D8DDèDÄD€DDD½Cø*D°*D`*D(*Dü)DÌ)DDÜDœ)Dl)D<)D)Dà(D¸(D`DŒ(Dh(DD(D(Dà'D°'D„'DL'D'Dð&D &Dp&D<&D&DÜ%D %Dd%D8%Dè$D˜$Dh$D<$D$D¸#Dx#D<#Dø"D°"D"Dd"D,"D"DØ!D!D@!Dð D½CøáC´ DÚX<Ù…"‰Ðä¯uoLÊ’ÝKå3¸ûí”DíWFPÓi™Û)×v'k¢ÓÔâôÝLöØ>|Gtè3@ÿÿÿÿ°5D¤5Dÿÿÿÿˆ5Dl5D<5DÀOD0‚:AÖ3¹ÈûO<}À†Ðç Uò•“ÌO·[g[”hÉ4Þ¥.3Ânü4^q·ÖîØ¥er‡¨°wþWõü_Uƒ‡ÝWIA§÷‘Å„WÜ÷j`R³rñf}—;ž¶
ŒÏB#Ô(Ä%%¥“¥/pßœI ømT.&Þª…Y¨1!ëG×;öÃÝZFŹ+š 	¦ûóxz3pBkh$Ó!é°³
â‚hwŠn|Ú¼>SƒûÖ"çµ®n€ÚU—ÁÐe Løs±jI)aF
óÇçX׈^”›¿{¢BXEAË º1W=[Œ/_âOGŒ޳V?¸û­ÔôüÅ ¡)™[ÙÈÔüIz*!,IäOëïQñ«mûKéKRµ‚,0‚\ܘCè=C[äÍЩ>˃uöµ¥Ÿké4A)újUMpü쮇8
 ©ÀEwnW`Wôí–"Ëá3:í7¥o림€S½pë!v>É/E$‚ÿÍY2.;#xí=àùgO7NGL-ÀO³”áA.-ü‚‘‹"Ôòü,«SU€+Ì?Xº‹öê:ð0ÐÚ°ëš-O&°Ö8ÁëõØ=p÷ôâÏQQyˆúè2{-—òúº'ÅœÙÅëŠyR|I ËŠŽf$¬¯3—ë•Õ;@VPÑæ¾„%Óœâƒlõb]º+}=zláÒT“€‘Q	è[ŽG½däƒUÏZ7ð%µ}!×ißoÂÏÉŠ@ŸzpÀèèÀæš
NFËz۳˃Äð«ë#üĽԪ]1F™ÎžøugÄSGDúÂ%s~ÐŽYѲZôÇ’/9«Í£µÂ¹Ç¹ŸHúƘMÊ„œÊç‰Älý)Y5çóÝÎdY¿!©ŸÅÿ½3ì¬kïQ^­Þ¸_ƹ£"eFƒßÐñDŠáœ#3´—3ækì§YtjÞ>­Ø6€P¢Õ!ñБòl/&ø0eßèÀ›j0˜‚‡ì¢V‡boçŸöVæqI†“ZM4XþÙ¯y·­Ñ0š ú·UÜlZL,YVöè¯
x™žçœQUCü;l¿-A§¯·àè(´Ñæ—Пj€ÊÝ~ÑãЫÖÊ|¼}5Î'ÍØIQcdÊü>¯amâS9'®Ãž”Oãógùwùç•:oâ s>¤z(Ôa—ö #+΄W~%ô¨TÒe”Ì•
«0ÁYa޹k×N¹ƒCy…¼®% ¼ÒH¡h	„öšf¹+»vFN—Y€	LúÖåeHxCµ“,·$èÆ}ZpE’Èl£Íá÷)@ú?[GD9ÁèržzÚª *	ýT“#ª7…[ÌÔùØÿÁa
½~$sm@rñ“	H—l„¨F9åèýOöx“Fj×1´„d…	8‰’”¿â<*àÿ™£ð+1Â6Í`¿-t2蜓n»‘{ýÙ¢q%8ë*é7ÍþDÎ?R‡„R®"”Î8æˆv…šÓ	åišÿX’j}|,ý¨Ê2O
„
7C¿ä]È$‘'FÙTSçbq¨+qAuø: a)F¦å‚ú:Ùúücýk0¼ôNžŒ%¶Uç<ÔNý‹ÃœDW†÷Õä•0‚	)‚Àq¬ˆ‚C;QWq¶+‚e!S_()O|йD³(AOÓújø¹(P9gS,<×Ë–A@2»ëp®°e÷:Ù"ý®½âÝóÂy<Æüu»¯N:6ÂOê%ßK þKiÄC¦¹
ó	†(‰Ï,ÐÔ¯Æmæ!îïêÜ·Æ;cŸ­‰x#¿p~„à7ìÛŽœ>jÌ™ræµ}múåÓäµ²²pNÊøø£ÂHë`™»*±z±=$û )Ú½פ¿ï`-"Êe˜ñÄáÉk(/¡ªyÚÜ|C÷B< ïh÷ß¹iûŽíBµNW¦&¸Ð{VmÆ@ŒŒ*Uל5”“ìë"ïw»y?¡ÊßýÓ¸áÔÌ	?<,ÛÑI8ƒmëféD¬•"#gÔÌô·Ü̇Ԭi5Lµ96ͤҕÊ
ÅÚÂÅ"2(ãÒ‹80ÜŒuOjìz¬>¨ÔjEá¨O.€4ªT•}ŠmÌyÊò¤.ûþQMˆ±ÇôyÛð´VD7ÊZÁŒH¬®H€ƒ?ÞÙÓ,QF±A¶Æ‘rùƒUŒºóså,tP:¾Å/§²mŒžw£ÍmŒEáü·ié'¼eÃú›Ðïþè³^4ôŒêüÓ¿=0²´èCº#Bv‚1s‘íFa
9ƒ@ÎzÔÛ€,
Ñ4Ô’ãÔñ‚—lÚnêOϯ÷LÙñwÛò—vr¹·GÑœÝËJ3nÉuvæä¥1Œw´)ÍõRïóã½.¼ÔRˆé0uõ͉lW'=…´Á/’\v)K¤á³È	þxraËao9‘•NÕ>Ǹö6þœ“š8%zôJÔ ½ù>!9ûrà=ÃåP¨]…£ê_²?êm‘UØ
!ÙÄæ[&¤®í+·¦íø­ìwæOvÀú’´,"Âëj­²åŠž…ƒÌñVxD^Þà`ey1#»ÿÝ.·³ªt॔¯KÞXUÞ3öãÖ46WÖy‘.¾;ÙN¶!\ÓHJÄ`©)øSˆ-µÅ-oî…÷š¾°Bò.q¯1mìÍo+#ß´@¯,
Ã}}Kóµà…Øß‘k
i÷òif[ñÏF}épúm~uN©wæŒ÷M¥A?Ábq^8´ÖæáKÂ,0ƒoI.–æÉš÷]	 U¥:%#Вãã/MïóUZ¾æ†1«ušÓð,ÅA’Ù_ŒucЀ,hË“ûQsI´`Úâ&¯©F¸ìPÝ_ÎYæöàT­ö͘ÌûËAíä´t_	`Çö{<§ ¼ä±ï뤓ÅÊš'‡óÞÊåçöe[ûyn&ÅÈ(¶;Á‚ès¦¸àm¹SíX”æ`\vCÄXÄ$è¼;$ETÌ7ðàc}Ã÷ûtÄ!H¯ÎÁÄ”DÓÒ"-->Z1Ü•ŽôAüXÉ@’_ãÚ¬ž?*kX_Hx ±¯$›< ‹“%žæk¼Bl61ÿzÑÁ&©v§øÌíjÒßbî
|„ËI²
¢‚wñÍgòG!?C!ðF0bQr±çHÆgÍžÖå!íú0¦Aþ¶ú4è÷¥w>·ù9Œg*«{ø°¨ê/úÌÌ@ÎópO?âêvJ5NG­+§—]tC—ÒûÙù–3í{­øI‚Ô@f’•Èìb©zË“ŽæSÔ€H'KAÎaß¿”¤=qí%q˜¤ÖÕJWõlÚ!}5E³ójÙÓCè\Tƒ´_ò—$.Ü@Þ’#YŽ¼Ò¡òàLÝÑç®e¼µõ[˜é×·Uq<
$k¦æaý3B™+„wt’‘õyyÏ­Žï€Wôõ5	t²qXkê2]óÓvH9#„¾’wJíp>¢l³ÃÉäRÈ$ˆA­‡Zê£z…^1Ã5ÆúÈuÄ–™çþ´tÛ´ÃÈŒö÷;fPüÛëÊG…‰áeÙb4·X5êøj,ZhxdkÁ>Nz½„˶…ÓvÅ“ji‰V4ÜJ›¼ÿ¨
n5œ`§#0Çd9‹”‰îº`ú¶—vÜQJ<ë:, `iJ†þŒ!„IT³ áXßµ!QŒGŸ‘ë—>òTÏFùÙ¶çdÉÐTê/¡Ï¥(„ìÕ9v[-ŽCò$ÉoÀõio}µ…Ò_x@	µ(e䍯žÜË‚îV€“pRÒ”¡˜„J’%L›©‘.Ây·\ãÅÕŽÂT­U›%vcP"/XXykãùŸAg”¥¬Šœ&løWa×:}1°-8½”b­Äú6BBð$ge‹|o‚DŒÈÉ«»LEü{8î0áüï¼Xß+]
TàIM—™"¨ƒ¾@»P.x(•xŒ˜$V—ó,CÒ‚fr_Sì±±^@ H{?—jë–!5þGÀ•êÅŠ„O^c”`q[JìO`ƺJ$ñ ‹§.:Îà'µŽ´!Åâ¦
QƒUˆÑ0cÕ×®‚Ä…N'ƒ¥|.墣ÓLc‚†˜˜¥9wÙf³ÏÊ q³PÎ=±“•5ÄÔ.ßü`Á”haCÊš#JEr™µaw »×w´*ˆ-³Va^jí¤FJ?PÖº¶×•eSáà£õý¯nC×§Ó¤ßà—ŠFÓFƒHNÒËÀ­y•Œ–º@4q^éùÅJ^‘õ’OëÆp-=ªé:ŽÕ¨­÷Î
²ì
œõ”9¹ŠüùÌò_!1trkd®5a
ËçÚ9Êó!f•×
|Ê¡©Zè¬àqT¯(ÏÕp‰àóžCl{™hM¡EFC¼Ì,ÝÅFÈN¾í¹&«.ÛëÿÛ°ÆU¯ø*‘PD!eåÇ8`$µ‰ÔœëLœz"½ÑÂÒûSïP´@’1V†Szè‹"šIûq•§
ì“hº_÷_ò;­kܾìÞz:'³ìIýC=~¨,^{»üônël°nøŒ8]ƒV}îS>$„¾º
kÈiŽ&Ûò+p†öÈøòS”FÐbP3KˆåʼnsÎ;lI¿³ÇŸ
êD‘å0ªÙ¾[_·׉·ŽtûÏ)ë¨,TQ¸Þ Î/Ì$kwÞ¢h¦R¢ }!Ú»bG6g茪Í8a÷1íúlՅЬœeçPfeoÑ(¥¡1àgúPÞ›ƒ~,ÃPaå­½6¸—N@}èƒ
¼K§?n…¿Aj)}ðŸG0š	Új3Å=†–³àS.àY‚s>u1™GzRû…äÙ¦{8›hŠ„›‡Æµ~†KS[YÏqeˆnÎf®kˆ6ûì(ÜÂ×¥»å,9&KÚšp•7•V#öíº^Þ9Oý·Cµ¤eoÍ€äp•[PÍIMßL¦‘ŠõoPF%™åho0ãiáå³]˜»(†HüÞ™?_ˆœs$
 ]¹*š?–'äb‡Á{tbSüa'¨z‘	¶ñMœTXîItÎU~#ÎöÊÜZa~ÉqµMöÜ4)‡hö^ “³Ûõä	lA•’ëµs¥j~Ø2í¸2g’öÄââè ‹kEŠv°îÏ‘§—ç3MÓ”>Ûbtơݣu¨„’ìƒGÇj°’¯Z 7£dyÒÐ=Íàaˆˆ!Ìt]ÎLQGðÅ\L‚z¯r­¹àSòx·ðµHŠ:ÑŸ‹}¥G·•«˜ø{tPVŽWðîõ·º«…†ù+ïAV ¤Ÿ·8F
¦ñüØN…D’C!]nÌÂË&1
!Ľ$¼Ù×Üñç“PH,®.çIˆ_“W'™6´ «ü§+òÙ˜×Ô4–PXšêTóîõcî…ƒtváR•Ã÷ë{§(ÌêJN„ÚØœyØ›f‰/Ϭ×yù©ØEx¹É~"Q†g°Ÿ&#È8×pŽMO•—@¡Â~rôæRòÉø3‹3·Î %ú­ô޹å™ó]oOƒ4â~Ïo¿0¯oëøÄÙ ]‹\ŽÜÂA2°þï¢~h\(!éõ±XcLNÿK’íÒMŒX\UŽ­£g}¹†næTo@®gLù[<z÷üg†iç
”@¿‹vþ&Ñò¡„¡CV(¼š_×;i‰Š6,Qßw/W{ ªÝ¡b;@{h
8»!]üF÷£°#ÃÒÇrQßF•yÙ½µ,‡ÜçW‚~ñ‹=¥{k&'‘jwäÕä,BÿÒˆ»Ó’ ùÈQd\ØùlG‚´	¸ð%ƒ??³!
]§ØTÃe}ð¿®øhÏ›,xY4côó’üµ¥OÞ/¤<®­8?~¿–¦®%rõŽ€9Ùìº[:èXlž0B71‚¼jßj	)ãÀFÑË…ì0^êÈ9Ž"Ÿ"Ò4ah7=.J[šõÁHÆöÜcÓ–dº4ÉÑ Ñ®l/H“Cíð!0Ã_Þ£ðpxá¨äî.¥ä³È}nBÜ·F6MÔFª=`§-	řɟËÌÑÖÙÛÝÓ×ÚÜÞ„_Dx_Dl_D`_DT_DH_D<_D0_D$_D_D_D_Dô^Dè^DÜ^DÐ^D Àà€	£é™;£é™;¤oD-time arg     - max number of seconds to collect data, default %d
-verify arg   - turn on peer certificate verification, arg == depth
-cert arg     - certificate file to use, PEM format assumed
-key arg      - RSA file to use, PEM format assumed, key is in cert file
                file if not specified by this option
-CApath arg   - PEM format directory of CA's
-CAfile arg   - PEM format file of CA's
-cipher       - preferred cipher to use, play with 'openssl ciphers'

ìˆD„µC¤DtDDÜD¸ˆDˆDÄD`ˆD$ŠD؉D¼‰D ‰D„‰DD¬Dø«D¨«D`«D$«DèªD ªDXªDªDØ©D©D\©D©DبD¨Dp¨D0fD0@ðÁDP@T¸C 5@èÁDð[@äÁDàj@ÜÁDps@°ÙC`@ÔÁDPž@ÌÁD€¦@ÄÁDàª@ÔüCÒ@ÀÁDÀApnDÐA¸ÁD€'AlnD 1A¬ÁD:A¨ÁDðDA ÁD`QA˜ÁDpjAÁD€AˆÁDà˜A|ÁD0¿ApÁD èAhÁDB`ÁDP‚BXÁDpÑBPÁD€ADÁD€	A<ÁDðÕB4ÁDpÛB,ÁD ßBèvD@çB$ÁDCÁDÀ
CÁDÐCÁD@0CÁDÀ:CüÀD@MCôÀDPjCðÈCð[@$ÉCð[@dÉCð[@äÈCð[@èÈCð[@|`Dð[@LoD`@èÀD`@@oD`@ÜÀD`@4oD`@ÐÀD`@´ÙC`@xnD`@ÈÀD`@ÀÀD`@°nD`@x`D`@¸ÀD`@ÄnD`@˜nD`@„nD`@°ÀD`@¨ÀD`@XoD`@doD`@œÀD`@ŒÀD`@„ÀD`@xÀD`@hÀD`@`ÀD`@TÀD`@DÀD`@¸nD`@8ÀD`@,ÀD`@ ÀD`@ÈnD`@ÀD`@ÀD`@ÀD`@ü¿D`@ð¿D`@¨nD`@è¿D`@à¿D`@Ø¿D`@Ì¿D`@À¿D`@´¿D`@¨¿D`@ŒnD`@Næ@»±¿Dÿÿÿÿÿÿÿÿþÿÿÿ€0€	HX Vä
  
    
      
        
      
    
  
  
    
      
    
  
PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGxmail-1.27/win32ssl/bin/split-cabundle.pl0000755000175000017500000000324611341640430017532 0ustar  davidedavide#!/usr/bin/perl -w
#
# split-cabundle.pl by Davide Libenzi (Splits a CA Bundle created with mkcabundle.pl)
# Copyright (C) 2008  Davide Libenzi
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# Davide Libenzi 
#

use strict;

my $openf = 0;
my $startc = 0;

while () {
    my $ln = $_;

    chomp($ln);
    if ($ln =~ /^SHA1 Fingerprint=(.*)$/) {
	my $fname;

	($fname = $1) =~ s/://g;
	print "Creating ${fname}.pem\n";
	if (!open(CFILE, ">${fname}.pem")) {
	    print STDERR "Unable to crete file $fname\n";
	    exit(2);
	}
	$openf = 1;
    } elsif ($ln =~ /^-----BEGIN CERTIFICATE-----/) {
	if (!$openf) {
	    print STDERR "Wrong bundle file format: missing SHA1 Fingerprint\n";
	    exit(3);
	}
	$startc = 1;
	print CFILE "$ln\n";
    } elsif ($ln =~ /^-----END CERTIFICATE-----/) {
	if (!$startc) {
	    print STDERR "Wrong bundle file format: ENDCERT without BEGCERT\n";
	    exit(3);
	}
	print CFILE "$ln\n";
	close(CFILE);
	$startc = 0;
	$openf = 0;
    } elsif ($startc) {
	print CFILE "$ln\n";
    }
}

xmail-1.27/win32ssl/bin/mkcabundle.pl0000755000175000017500000000204111341640430016721 0ustar  davidedavide#!/usr/bin/perl -w
#
# Used to regenerate ca-bundle.crt from the Mozilla certdata.txt.
# Run as ./mkcabundle.pl > ca-bundle.crt
#

my $cvsroot = ':pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot';
my $certdata = 'mozilla/security/nss/lib/ckfw/builtins/certdata.txt';

open(IN, "cvs -d $cvsroot co -p $certdata|")
    || die "could not check out certdata.txt";

my $incert = 0;

print<) {
    if (/^CKA_VALUE MULTILINE_OCTAL/) {
	$incert = 1;
	open(OUT, "|openssl x509 -text -inform DER -fingerprint")
	    || die "could not pipe to openssl x509";
    } elsif (/^END/ && $incert) {
	close(OUT);
	$incert = 0;
	print "\n\n";
    } elsif ($incert) {
	my @bs = split(/\\/);
	foreach my $b (@bs) {
	    chomp $b;
	    printf(OUT "%c", oct($b)) unless $b eq '';
	}
    } elsif (/^CVS_ID.*Revision: ([^ ]*).*/) {
	print "# Generated from certdata.txt RCS revision $1\n#\n";
    }
}

xmail-1.27/win32ssl/bin/c_rehash.pl0000755000175000017500000001106411341640430016375 0ustar  davidedavide#!/usr/bin/perl


# Perl c_rehash script, scan all files in a directory
# and add symbolic links to their hash values.

my $openssl;
my $symlink_exists = eval {symlink("",""); 1};


if(defined $ENV{OPENSSL}) {
    $openssl = $ENV{OPENSSL};
} else {
    $openssl = "openssl";
    $ENV{OPENSSL} = $openssl;
}

my $osslver = `"$openssl" version`;

if ($? != 0) {
    print STDERR "Unable to find the $openssl binary\n";
    exit 1;
}
print "Found OpenSSL version: $osslver\n";


my $use_symlink = $symlink_exists;

for (my $i = 0; $i <= $#ARGV; $i++) {
    if ($ARGV[$i] eq "-c") {
        $use_symlink = 0;
    } else {
        if(-d $ARGV[$i] and -w $ARGV[$i]) {
            hash_dir($ARGV[$i]);
        }
    }
}



sub hash_dir {
    my %hashlist;
    print "Doing $_[0]\n";
    chdir $_[0];
    opendir(DIR, ".");
    my @flist = readdir(DIR);

    # Delete any existing symbolic links
    foreach (grep {/^[\da-f]+\.r{0,1}\d+$/} @flist) {
        if(-l $_) {
            unlink $_;
        }
    }
    closedir DIR;
  FILE:
    foreach $fname (grep {/\.pem$/} @flist) {
        # Check to see if certificates and/or CRLs present.
        my ($cert, $crl) = check_file($fname);
        if(!$cert && !$crl) {
            print STDERR "WARNING: $fname does not contain a certificate or CRL: skipping\n";
            next;
        }
        link_hash_cert($fname) if($cert);
        link_hash_crl($fname) if($crl);
    }
}

sub check_file {
    my ($is_cert, $is_crl) = (0,0);
    my $fname = $_[0];
    open IN, $fname;
    while() {
        if(/^-----BEGIN (.*)-----/) {
            my $hdr = $1;
            if($hdr =~ /^(X509 |TRUSTED |)CERTIFICATE$/) {
                $is_cert = 1;
                last if($is_crl);
            } elsif($hdr eq "X509 CRL") {
                $is_crl = 1;
                last if($is_cert);
            }
        }
    }
    close IN;
    return ($is_cert, $is_crl);
}


# Link a certificate to its subject name hash value, each hash is of
# the form . where n is an integer. If the hash value already exists
# then we need to up the value of n, unless its a duplicate in which
# case we skip the link. We check for duplicates by comparing the
# certificate fingerprints

sub link_hash_cert {
    my $fname = $_[0];
    my ($hash, $fprint) = `"$openssl" x509 -hash -fingerprint -noout -in "$fname"`;

    chomp $hash;
    chomp $fprint;
    $fprint =~ s/^.*=//;
    $fprint =~ tr/://d;
    my $suffix = 0;
    # Search for an unused hash filename
    while(exists $hashlist{"$hash.$suffix"}) {
        # Hash matches: if fingerprint matches its a duplicate cert
        if($hashlist{"$hash.$suffix"} eq $fprint) {
            print STDERR "WARNING: Skipping duplicate certificate $fname\n";
            return;
        }
        $suffix++;
    }
    $hash .= ".$suffix";
    print "$fname => $hash\n";
    if ($use_symlink) {
        symlink $fname, $hash;
    } else {
        file_cp($fname, $hash);
    }
    $hashlist{$hash} = $fprint;
}

# Same as above except for a CRL. CRL links are of the form .r

sub link_hash_crl {
    my $fname = $_[0];
    my ($hash, $fprint) = `"$openssl" crl -hash -fingerprint -noout -in "$fname"`;

    chomp $hash;
    chomp $fprint;
    $fprint =~ s/^.*=//;
    $fprint =~ tr/://d;
    my $suffix = 0;
    # Search for an unused hash filename
    while(exists $hashlist{"$hash.r$suffix"}) {
        # Hash matches: if fingerprint matches its a duplicate cert
        if($hashlist{"$hash.r$suffix"} eq $fprint) {
            print STDERR "WARNING: Skipping duplicate CRL $fname\n";
            return;
        }
        $suffix++;
    }
    $hash .= ".r$suffix";
    print "$fname => $hash\n";
    if ($use_symlink) {
        symlink $fname, $hash;
    } else {
        file_cp($fname, $hash);
    }
    $hashlist{$hash} = $fprint;
}

sub file_cp {
    my ($fsrc, $fdst) = @_;

    if (!open(SFIL, "$fsrc")) {
        print STDERR "unable to open $fsrc\n";
        return 0;
    }
    if (!open(DFIL, ">$fdst")) {
        print STDERR "unable to create $fdst\n";
        close SFIL;
        return 0;
    }
    binmode SFIL;
    binmode DFIL;
    for (;;) {
        my $data;
        my $size = read(SFIL, $data, 10000);

        if (!defined($size)) {
            print STDERR "unable to read file: $fsrc\n";
            close SFIL;
            close DFIL;
            return 0;
        }
        if (!$size) {
            last;
        }
        if (!print DFIL $data) {
            print STDERR "unable to write file: $fdst\n";
            close SFIL;
            close DFIL;
            return 0;
        }
    }
    close SFIL;
    close DFIL;
    return 1;
}

xmail-1.27/win32ssl/README.TXT0000644000175000017500000000017111341640430015044 0ustar  davidedavideThis is a pre-cbuilt Windows version of the OpenSSL library, whose
source code can be found at:

http://www.openssl.org

xmail-1.27/win32ssl/include/0000755000175000017500000000000011341640430015132 5ustar  davidedavidexmail-1.27/win32ssl/include/openssl/0000755000175000017500000000000011341640430016615 5ustar  davidedavidexmail-1.27/win32ssl/include/openssl/blowfish.h0000755000175000017500000001206511341640430020612 0ustar  davidedavide/* crypto/bf/blowfish.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_BLOWFISH_H
#define HEADER_BLOWFISH_H

#include 

#ifdef  __cplusplus
extern "C" {
#endif

#ifdef OPENSSL_NO_BF
#error BF is disabled.
#endif

#define BF_ENCRYPT	1
#define BF_DECRYPT	0

/*
 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 * ! BF_LONG has to be at least 32 bits wide. If it's wider, then !
 * ! BF_LONG_LOG2 has to be defined along.                        !
 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 */

#if defined(OPENSSL_SYS_WIN16) || defined(__LP32__)
#define BF_LONG unsigned long
#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__)
#define BF_LONG unsigned long
#define BF_LONG_LOG2 3
/*
 * _CRAY note. I could declare short, but I have no idea what impact
 * does it have on performance on none-T3E machines. I could declare
 * int, but at least on C90 sizeof(int) can be chosen at compile time.
 * So I've chosen long...
 *					
 */
#else
#define BF_LONG unsigned int
#endif

#define BF_ROUNDS	16
#define BF_BLOCK	8

typedef struct bf_key_st
	{
	BF_LONG P[BF_ROUNDS+2];
	BF_LONG S[4*256];
	} BF_KEY;

#ifdef OPENSSL_FIPS 
void private_BF_set_key(BF_KEY *key, int len, const unsigned char *data);
#endif
void BF_set_key(BF_KEY *key, int len, const unsigned char *data);

void BF_encrypt(BF_LONG *data,const BF_KEY *key);
void BF_decrypt(BF_LONG *data,const BF_KEY *key);

void BF_ecb_encrypt(const unsigned char *in, unsigned char *out,
	const BF_KEY *key, int enc);
void BF_cbc_encrypt(const unsigned char *in, unsigned char *out, long length,
	const BF_KEY *schedule, unsigned char *ivec, int enc);
void BF_cfb64_encrypt(const unsigned char *in, unsigned char *out, long length,
	const BF_KEY *schedule, unsigned char *ivec, int *num, int enc);
void BF_ofb64_encrypt(const unsigned char *in, unsigned char *out, long length,
	const BF_KEY *schedule, unsigned char *ivec, int *num);
const char *BF_options(void);

#ifdef  __cplusplus
}
#endif

#endif
xmail-1.27/win32ssl/include/openssl/x509v3.h0000755000175000017500000007260711341640430017763 0ustar  davidedavide/* x509v3.h */
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
 * project 1999.
 */
/* ====================================================================
 * Copyright (c) 1999-2004 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    licensing@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */
#ifndef HEADER_X509V3_H
#define HEADER_X509V3_H

#include 
#include 
#include 

#ifdef __cplusplus
extern "C" {
#endif

/* Forward reference */
struct v3_ext_method;
struct v3_ext_ctx;

/* Useful typedefs */

typedef void * (*X509V3_EXT_NEW)(void);
typedef void (*X509V3_EXT_FREE)(void *);
typedef void * (*X509V3_EXT_D2I)(void *, const unsigned char ** , long);
typedef int (*X509V3_EXT_I2D)(void *, unsigned char **);
typedef STACK_OF(CONF_VALUE) * (*X509V3_EXT_I2V)(struct v3_ext_method *method, void *ext, STACK_OF(CONF_VALUE) *extlist);
typedef void * (*X509V3_EXT_V2I)(struct v3_ext_method *method, struct v3_ext_ctx *ctx, STACK_OF(CONF_VALUE) *values);
typedef char * (*X509V3_EXT_I2S)(struct v3_ext_method *method, void *ext);
typedef void * (*X509V3_EXT_S2I)(struct v3_ext_method *method, struct v3_ext_ctx *ctx, const char *str);
typedef int (*X509V3_EXT_I2R)(struct v3_ext_method *method, void *ext, BIO *out, int indent);
typedef void * (*X509V3_EXT_R2I)(struct v3_ext_method *method, struct v3_ext_ctx *ctx, const char *str);

/* V3 extension structure */

struct v3_ext_method {
int ext_nid;
int ext_flags;
/* If this is set the following four fields are ignored */
ASN1_ITEM_EXP *it;
/* Old style ASN1 calls */
X509V3_EXT_NEW ext_new;
X509V3_EXT_FREE ext_free;
X509V3_EXT_D2I d2i;
X509V3_EXT_I2D i2d;

/* The following pair is used for string extensions */
X509V3_EXT_I2S i2s;
X509V3_EXT_S2I s2i;

/* The following pair is used for multi-valued extensions */
X509V3_EXT_I2V i2v;
X509V3_EXT_V2I v2i;

/* The following are used for raw extensions */
X509V3_EXT_I2R i2r;
X509V3_EXT_R2I r2i;

void *usr_data;	/* Any extension specific data */
};

typedef struct X509V3_CONF_METHOD_st {
char * (*get_string)(void *db, char *section, char *value);
STACK_OF(CONF_VALUE) * (*get_section)(void *db, char *section);
void (*free_string)(void *db, char * string);
void (*free_section)(void *db, STACK_OF(CONF_VALUE) *section);
} X509V3_CONF_METHOD;

/* Context specific info */
struct v3_ext_ctx {
#define CTX_TEST 0x1
int flags;
X509 *issuer_cert;
X509 *subject_cert;
X509_REQ *subject_req;
X509_CRL *crl;
X509V3_CONF_METHOD *db_meth;
void *db;
/* Maybe more here */
};

typedef struct v3_ext_method X509V3_EXT_METHOD;

DECLARE_STACK_OF(X509V3_EXT_METHOD)

/* ext_flags values */
#define X509V3_EXT_DYNAMIC	0x1
#define X509V3_EXT_CTX_DEP	0x2
#define X509V3_EXT_MULTILINE	0x4

typedef BIT_STRING_BITNAME ENUMERATED_NAMES;

typedef struct BASIC_CONSTRAINTS_st {
int ca;
ASN1_INTEGER *pathlen;
} BASIC_CONSTRAINTS;


typedef struct PKEY_USAGE_PERIOD_st {
ASN1_GENERALIZEDTIME *notBefore;
ASN1_GENERALIZEDTIME *notAfter;
} PKEY_USAGE_PERIOD;

typedef struct otherName_st {
ASN1_OBJECT *type_id;
ASN1_TYPE *value;
} OTHERNAME;

typedef struct EDIPartyName_st {
	ASN1_STRING *nameAssigner;
	ASN1_STRING *partyName;
} EDIPARTYNAME;

typedef struct GENERAL_NAME_st {

#define GEN_OTHERNAME	0
#define GEN_EMAIL	1
#define GEN_DNS		2
#define GEN_X400	3
#define GEN_DIRNAME	4
#define GEN_EDIPARTY	5
#define GEN_URI		6
#define GEN_IPADD	7
#define GEN_RID		8

int type;
union {
	char *ptr;
	OTHERNAME *otherName; /* otherName */
	ASN1_IA5STRING *rfc822Name;
	ASN1_IA5STRING *dNSName;
	ASN1_TYPE *x400Address;
	X509_NAME *directoryName;
	EDIPARTYNAME *ediPartyName;
	ASN1_IA5STRING *uniformResourceIdentifier;
	ASN1_OCTET_STRING *iPAddress;
	ASN1_OBJECT *registeredID;

	/* Old names */
	ASN1_OCTET_STRING *ip; /* iPAddress */
	X509_NAME *dirn;		/* dirn */
	ASN1_IA5STRING *ia5;/* rfc822Name, dNSName, uniformResourceIdentifier */
	ASN1_OBJECT *rid; /* registeredID */
	ASN1_TYPE *other; /* x400Address */
} d;
} GENERAL_NAME;

typedef STACK_OF(GENERAL_NAME) GENERAL_NAMES;

typedef struct ACCESS_DESCRIPTION_st {
	ASN1_OBJECT *method;
	GENERAL_NAME *location;
} ACCESS_DESCRIPTION;

typedef STACK_OF(ACCESS_DESCRIPTION) AUTHORITY_INFO_ACCESS;

typedef STACK_OF(ASN1_OBJECT) EXTENDED_KEY_USAGE;

DECLARE_STACK_OF(GENERAL_NAME)
DECLARE_ASN1_SET_OF(GENERAL_NAME)

DECLARE_STACK_OF(ACCESS_DESCRIPTION)
DECLARE_ASN1_SET_OF(ACCESS_DESCRIPTION)

typedef struct DIST_POINT_NAME_st {
int type;
union {
	GENERAL_NAMES *fullname;
	STACK_OF(X509_NAME_ENTRY) *relativename;
} name;
} DIST_POINT_NAME;

typedef struct DIST_POINT_st {
DIST_POINT_NAME	*distpoint;
ASN1_BIT_STRING *reasons;
GENERAL_NAMES *CRLissuer;
} DIST_POINT;

typedef STACK_OF(DIST_POINT) CRL_DIST_POINTS;

DECLARE_STACK_OF(DIST_POINT)
DECLARE_ASN1_SET_OF(DIST_POINT)

typedef struct AUTHORITY_KEYID_st {
ASN1_OCTET_STRING *keyid;
GENERAL_NAMES *issuer;
ASN1_INTEGER *serial;
} AUTHORITY_KEYID;

/* Strong extranet structures */

typedef struct SXNET_ID_st {
	ASN1_INTEGER *zone;
	ASN1_OCTET_STRING *user;
} SXNETID;

DECLARE_STACK_OF(SXNETID)
DECLARE_ASN1_SET_OF(SXNETID)

typedef struct SXNET_st {
	ASN1_INTEGER *version;
	STACK_OF(SXNETID) *ids;
} SXNET;

typedef struct NOTICEREF_st {
	ASN1_STRING *organization;
	STACK_OF(ASN1_INTEGER) *noticenos;
} NOTICEREF;

typedef struct USERNOTICE_st {
	NOTICEREF *noticeref;
	ASN1_STRING *exptext;
} USERNOTICE;

typedef struct POLICYQUALINFO_st {
	ASN1_OBJECT *pqualid;
	union {
		ASN1_IA5STRING *cpsuri;
		USERNOTICE *usernotice;
		ASN1_TYPE *other;
	} d;
} POLICYQUALINFO;

DECLARE_STACK_OF(POLICYQUALINFO)
DECLARE_ASN1_SET_OF(POLICYQUALINFO)

typedef struct POLICYINFO_st {
	ASN1_OBJECT *policyid;
	STACK_OF(POLICYQUALINFO) *qualifiers;
} POLICYINFO;

typedef STACK_OF(POLICYINFO) CERTIFICATEPOLICIES;

DECLARE_STACK_OF(POLICYINFO)
DECLARE_ASN1_SET_OF(POLICYINFO)

typedef struct POLICY_MAPPING_st {
	ASN1_OBJECT *issuerDomainPolicy;
	ASN1_OBJECT *subjectDomainPolicy;
} POLICY_MAPPING;

DECLARE_STACK_OF(POLICY_MAPPING)

typedef STACK_OF(POLICY_MAPPING) POLICY_MAPPINGS;

typedef struct GENERAL_SUBTREE_st {
	GENERAL_NAME *base;
	ASN1_INTEGER *minimum;
	ASN1_INTEGER *maximum;
} GENERAL_SUBTREE;

DECLARE_STACK_OF(GENERAL_SUBTREE)

typedef struct NAME_CONSTRAINTS_st {
	STACK_OF(GENERAL_SUBTREE) *permittedSubtrees;
	STACK_OF(GENERAL_SUBTREE) *excludedSubtrees;
} NAME_CONSTRAINTS;

typedef struct POLICY_CONSTRAINTS_st {
	ASN1_INTEGER *requireExplicitPolicy;
	ASN1_INTEGER *inhibitPolicyMapping;
} POLICY_CONSTRAINTS;

/* Proxy certificate structures, see RFC 3820 */
typedef struct PROXY_POLICY_st
	{
	ASN1_OBJECT *policyLanguage;
	ASN1_OCTET_STRING *policy;
	} PROXY_POLICY;

typedef struct PROXY_CERT_INFO_EXTENSION_st
	{
	ASN1_INTEGER *pcPathLengthConstraint;
	PROXY_POLICY *proxyPolicy;
	} PROXY_CERT_INFO_EXTENSION;

DECLARE_ASN1_FUNCTIONS(PROXY_POLICY)
DECLARE_ASN1_FUNCTIONS(PROXY_CERT_INFO_EXTENSION)


#define X509V3_conf_err(val) ERR_add_error_data(6, "section:", val->section, \
",name:", val->name, ",value:", val->value);

#define X509V3_set_ctx_test(ctx) \
			X509V3_set_ctx(ctx, NULL, NULL, NULL, NULL, CTX_TEST)
#define X509V3_set_ctx_nodb(ctx) (ctx)->db = NULL;

#define EXT_BITSTRING(nid, table) { nid, 0, ASN1_ITEM_ref(ASN1_BIT_STRING), \
			0,0,0,0, \
			0,0, \
			(X509V3_EXT_I2V)i2v_ASN1_BIT_STRING, \
			(X509V3_EXT_V2I)v2i_ASN1_BIT_STRING, \
			NULL, NULL, \
			table}

#define EXT_IA5STRING(nid) { nid, 0, ASN1_ITEM_ref(ASN1_IA5STRING), \
			0,0,0,0, \
			(X509V3_EXT_I2S)i2s_ASN1_IA5STRING, \
			(X509V3_EXT_S2I)s2i_ASN1_IA5STRING, \
			0,0,0,0, \
			NULL}

#define EXT_END { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}


/* X509_PURPOSE stuff */

#define EXFLAG_BCONS		0x1
#define EXFLAG_KUSAGE		0x2
#define EXFLAG_XKUSAGE		0x4
#define EXFLAG_NSCERT		0x8

#define EXFLAG_CA		0x10
/* Really self issued not necessarily self signed */
#define EXFLAG_SI		0x20
#define EXFLAG_SS		0x20
#define EXFLAG_V1		0x40
#define EXFLAG_INVALID		0x80
#define EXFLAG_SET		0x100
#define EXFLAG_CRITICAL		0x200
#define EXFLAG_PROXY		0x400

#define EXFLAG_INVALID_POLICY	0x800

#define KU_DIGITAL_SIGNATURE	0x0080
#define KU_NON_REPUDIATION	0x0040
#define KU_KEY_ENCIPHERMENT	0x0020
#define KU_DATA_ENCIPHERMENT	0x0010
#define KU_KEY_AGREEMENT	0x0008
#define KU_KEY_CERT_SIGN	0x0004
#define KU_CRL_SIGN		0x0002
#define KU_ENCIPHER_ONLY	0x0001
#define KU_DECIPHER_ONLY	0x8000

#define NS_SSL_CLIENT		0x80
#define NS_SSL_SERVER		0x40
#define NS_SMIME		0x20
#define NS_OBJSIGN		0x10
#define NS_SSL_CA		0x04
#define NS_SMIME_CA		0x02
#define NS_OBJSIGN_CA		0x01
#define NS_ANY_CA		(NS_SSL_CA|NS_SMIME_CA|NS_OBJSIGN_CA)

#define XKU_SSL_SERVER		0x1	
#define XKU_SSL_CLIENT		0x2
#define XKU_SMIME		0x4
#define XKU_CODE_SIGN		0x8
#define XKU_SGC			0x10
#define XKU_OCSP_SIGN		0x20
#define XKU_TIMESTAMP		0x40
#define XKU_DVCS		0x80

#define X509_PURPOSE_DYNAMIC	0x1
#define X509_PURPOSE_DYNAMIC_NAME	0x2

typedef struct x509_purpose_st {
	int purpose;
	int trust;		/* Default trust ID */
	int flags;
	int (*check_purpose)(const struct x509_purpose_st *,
				const X509 *, int);
	char *name;
	char *sname;
	void *usr_data;
} X509_PURPOSE;

#define X509_PURPOSE_SSL_CLIENT		1
#define X509_PURPOSE_SSL_SERVER		2
#define X509_PURPOSE_NS_SSL_SERVER	3
#define X509_PURPOSE_SMIME_SIGN		4
#define X509_PURPOSE_SMIME_ENCRYPT	5
#define X509_PURPOSE_CRL_SIGN		6
#define X509_PURPOSE_ANY		7
#define X509_PURPOSE_OCSP_HELPER	8

#define X509_PURPOSE_MIN		1
#define X509_PURPOSE_MAX		8

/* Flags for X509V3_EXT_print() */

#define X509V3_EXT_UNKNOWN_MASK		(0xfL << 16)
/* Return error for unknown extensions */
#define X509V3_EXT_DEFAULT		0
/* Print error for unknown extensions */
#define X509V3_EXT_ERROR_UNKNOWN	(1L << 16)
/* ASN1 parse unknown extensions */
#define X509V3_EXT_PARSE_UNKNOWN	(2L << 16)
/* BIO_dump unknown extensions */
#define X509V3_EXT_DUMP_UNKNOWN		(3L << 16)

/* Flags for X509V3_add1_i2d */

#define X509V3_ADD_OP_MASK		0xfL
#define X509V3_ADD_DEFAULT		0L
#define X509V3_ADD_APPEND		1L
#define X509V3_ADD_REPLACE		2L
#define X509V3_ADD_REPLACE_EXISTING	3L
#define X509V3_ADD_KEEP_EXISTING	4L
#define X509V3_ADD_DELETE		5L
#define X509V3_ADD_SILENT		0x10

DECLARE_STACK_OF(X509_PURPOSE)

DECLARE_ASN1_FUNCTIONS(BASIC_CONSTRAINTS)

DECLARE_ASN1_FUNCTIONS(SXNET)
DECLARE_ASN1_FUNCTIONS(SXNETID)

int SXNET_add_id_asc(SXNET **psx, char *zone, char *user, int userlen); 
int SXNET_add_id_ulong(SXNET **psx, unsigned long lzone, char *user, int userlen); 
int SXNET_add_id_INTEGER(SXNET **psx, ASN1_INTEGER *izone, char *user, int userlen); 

ASN1_OCTET_STRING *SXNET_get_id_asc(SXNET *sx, char *zone);
ASN1_OCTET_STRING *SXNET_get_id_ulong(SXNET *sx, unsigned long lzone);
ASN1_OCTET_STRING *SXNET_get_id_INTEGER(SXNET *sx, ASN1_INTEGER *zone);

DECLARE_ASN1_FUNCTIONS(AUTHORITY_KEYID)

DECLARE_ASN1_FUNCTIONS(PKEY_USAGE_PERIOD)

DECLARE_ASN1_FUNCTIONS(GENERAL_NAME)


ASN1_BIT_STRING *v2i_ASN1_BIT_STRING(X509V3_EXT_METHOD *method,
				X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval);
STACK_OF(CONF_VALUE) *i2v_ASN1_BIT_STRING(X509V3_EXT_METHOD *method,
				ASN1_BIT_STRING *bits,
				STACK_OF(CONF_VALUE) *extlist);

STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, GENERAL_NAME *gen, STACK_OF(CONF_VALUE) *ret);
int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen);

DECLARE_ASN1_FUNCTIONS(GENERAL_NAMES)

STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method,
		GENERAL_NAMES *gen, STACK_OF(CONF_VALUE) *extlist);
GENERAL_NAMES *v2i_GENERAL_NAMES(X509V3_EXT_METHOD *method,
				X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval);

DECLARE_ASN1_FUNCTIONS(OTHERNAME)
DECLARE_ASN1_FUNCTIONS(EDIPARTYNAME)

char *i2s_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, ASN1_OCTET_STRING *ia5);
ASN1_OCTET_STRING *s2i_ASN1_OCTET_STRING(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, char *str);

DECLARE_ASN1_FUNCTIONS(EXTENDED_KEY_USAGE)
int i2a_ACCESS_DESCRIPTION(BIO *bp, ACCESS_DESCRIPTION* a);

DECLARE_ASN1_FUNCTIONS(CERTIFICATEPOLICIES)
DECLARE_ASN1_FUNCTIONS(POLICYINFO)
DECLARE_ASN1_FUNCTIONS(POLICYQUALINFO)
DECLARE_ASN1_FUNCTIONS(USERNOTICE)
DECLARE_ASN1_FUNCTIONS(NOTICEREF)

DECLARE_ASN1_FUNCTIONS(CRL_DIST_POINTS)
DECLARE_ASN1_FUNCTIONS(DIST_POINT)
DECLARE_ASN1_FUNCTIONS(DIST_POINT_NAME)

DECLARE_ASN1_FUNCTIONS(ACCESS_DESCRIPTION)
DECLARE_ASN1_FUNCTIONS(AUTHORITY_INFO_ACCESS)

DECLARE_ASN1_ITEM(POLICY_MAPPING)
DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_MAPPING)
DECLARE_ASN1_ITEM(POLICY_MAPPINGS)

DECLARE_ASN1_ITEM(GENERAL_SUBTREE)
DECLARE_ASN1_ALLOC_FUNCTIONS(GENERAL_SUBTREE)

DECLARE_ASN1_ITEM(NAME_CONSTRAINTS)
DECLARE_ASN1_ALLOC_FUNCTIONS(NAME_CONSTRAINTS)

DECLARE_ASN1_ALLOC_FUNCTIONS(POLICY_CONSTRAINTS)
DECLARE_ASN1_ITEM(POLICY_CONSTRAINTS)

#ifdef HEADER_CONF_H
GENERAL_NAME *v2i_GENERAL_NAME(X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
							CONF_VALUE *cnf);
GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out, X509V3_EXT_METHOD *method,
				X509V3_CTX *ctx, CONF_VALUE *cnf, int is_nc);
void X509V3_conf_free(CONF_VALUE *val);

X509_EXTENSION *X509V3_EXT_nconf_nid(CONF *conf, X509V3_CTX *ctx, int ext_nid, char *value);
X509_EXTENSION *X509V3_EXT_nconf(CONF *conf, X509V3_CTX *ctx, char *name, char *value);
int X509V3_EXT_add_nconf_sk(CONF *conf, X509V3_CTX *ctx, char *section, STACK_OF(X509_EXTENSION) **sk);
int X509V3_EXT_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, X509 *cert);
int X509V3_EXT_REQ_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, X509_REQ *req);
int X509V3_EXT_CRL_add_nconf(CONF *conf, X509V3_CTX *ctx, char *section, X509_CRL *crl);

X509_EXTENSION *X509V3_EXT_conf_nid(LHASH *conf, X509V3_CTX *ctx, int ext_nid, char *value);
X509_EXTENSION *X509V3_EXT_conf(LHASH *conf, X509V3_CTX *ctx, char *name, char *value);
int X509V3_EXT_add_conf(LHASH *conf, X509V3_CTX *ctx, char *section, X509 *cert);
int X509V3_EXT_REQ_add_conf(LHASH *conf, X509V3_CTX *ctx, char *section, X509_REQ *req);
int X509V3_EXT_CRL_add_conf(LHASH *conf, X509V3_CTX *ctx, char *section, X509_CRL *crl);

int X509V3_add_value_bool_nf(char *name, int asn1_bool,
						STACK_OF(CONF_VALUE) **extlist);
int X509V3_get_value_bool(CONF_VALUE *value, int *asn1_bool);
int X509V3_get_value_int(CONF_VALUE *value, ASN1_INTEGER **aint);
void X509V3_set_nconf(X509V3_CTX *ctx, CONF *conf);
void X509V3_set_conf_lhash(X509V3_CTX *ctx, LHASH *lhash);
#endif

char * X509V3_get_string(X509V3_CTX *ctx, char *name, char *section);
STACK_OF(CONF_VALUE) * X509V3_get_section(X509V3_CTX *ctx, char *section);
void X509V3_string_free(X509V3_CTX *ctx, char *str);
void X509V3_section_free( X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *section);
void X509V3_set_ctx(X509V3_CTX *ctx, X509 *issuer, X509 *subject,
				 X509_REQ *req, X509_CRL *crl, int flags);

int X509V3_add_value(const char *name, const char *value,
						STACK_OF(CONF_VALUE) **extlist);
int X509V3_add_value_uchar(const char *name, const unsigned char *value,
						STACK_OF(CONF_VALUE) **extlist);
int X509V3_add_value_bool(const char *name, int asn1_bool,
						STACK_OF(CONF_VALUE) **extlist);
int X509V3_add_value_int(const char *name, ASN1_INTEGER *aint,
						STACK_OF(CONF_VALUE) **extlist);
char * i2s_ASN1_INTEGER(X509V3_EXT_METHOD *meth, ASN1_INTEGER *aint);
ASN1_INTEGER * s2i_ASN1_INTEGER(X509V3_EXT_METHOD *meth, char *value);
char * i2s_ASN1_ENUMERATED(X509V3_EXT_METHOD *meth, ASN1_ENUMERATED *aint);
char * i2s_ASN1_ENUMERATED_TABLE(X509V3_EXT_METHOD *meth, ASN1_ENUMERATED *aint);
int X509V3_EXT_add(X509V3_EXT_METHOD *ext);
int X509V3_EXT_add_list(X509V3_EXT_METHOD *extlist);
int X509V3_EXT_add_alias(int nid_to, int nid_from);
void X509V3_EXT_cleanup(void);

X509V3_EXT_METHOD *X509V3_EXT_get(X509_EXTENSION *ext);
X509V3_EXT_METHOD *X509V3_EXT_get_nid(int nid);
int X509V3_add_standard_extensions(void);
STACK_OF(CONF_VALUE) *X509V3_parse_list(const char *line);
void *X509V3_EXT_d2i(X509_EXTENSION *ext);
void *X509V3_get_d2i(STACK_OF(X509_EXTENSION) *x, int nid, int *crit, int *idx);


X509_EXTENSION *X509V3_EXT_i2d(int ext_nid, int crit, void *ext_struc);
int X509V3_add1_i2d(STACK_OF(X509_EXTENSION) **x, int nid, void *value, int crit, unsigned long flags);

char *hex_to_string(unsigned char *buffer, long len);
unsigned char *string_to_hex(char *str, long *len);
int name_cmp(const char *name, const char *cmp);

void X509V3_EXT_val_prn(BIO *out, STACK_OF(CONF_VALUE) *val, int indent,
								 int ml);
int X509V3_EXT_print(BIO *out, X509_EXTENSION *ext, unsigned long flag, int indent);
int X509V3_EXT_print_fp(FILE *out, X509_EXTENSION *ext, int flag, int indent);

int X509V3_extensions_print(BIO *out, char *title, STACK_OF(X509_EXTENSION) *exts, unsigned long flag, int indent);

int X509_check_ca(X509 *x);
int X509_check_purpose(X509 *x, int id, int ca);
int X509_supported_extension(X509_EXTENSION *ex);
int X509_PURPOSE_set(int *p, int purpose);
int X509_check_issued(X509 *issuer, X509 *subject);
int X509_PURPOSE_get_count(void);
X509_PURPOSE * X509_PURPOSE_get0(int idx);
int X509_PURPOSE_get_by_sname(char *sname);
int X509_PURPOSE_get_by_id(int id);
int X509_PURPOSE_add(int id, int trust, int flags,
			int (*ck)(const X509_PURPOSE *, const X509 *, int),
				char *name, char *sname, void *arg);
char *X509_PURPOSE_get0_name(X509_PURPOSE *xp);
char *X509_PURPOSE_get0_sname(X509_PURPOSE *xp);
int X509_PURPOSE_get_trust(X509_PURPOSE *xp);
void X509_PURPOSE_cleanup(void);
int X509_PURPOSE_get_id(X509_PURPOSE *);

STACK *X509_get1_email(X509 *x);
STACK *X509_REQ_get1_email(X509_REQ *x);
void X509_email_free(STACK *sk);
STACK *X509_get1_ocsp(X509 *x);

ASN1_OCTET_STRING *a2i_IPADDRESS(const char *ipasc);
ASN1_OCTET_STRING *a2i_IPADDRESS_NC(const char *ipasc);
int a2i_ipadd(unsigned char *ipout, const char *ipasc);
int X509V3_NAME_from_section(X509_NAME *nm, STACK_OF(CONF_VALUE)*dn_sk,
						unsigned long chtype);

void X509_POLICY_NODE_print(BIO *out, X509_POLICY_NODE *node, int indent);

#ifndef OPENSSL_NO_RFC3779

typedef struct ASRange_st {
  ASN1_INTEGER *min, *max;
} ASRange;

#define	ASIdOrRange_id		0
#define	ASIdOrRange_range	1

typedef struct ASIdOrRange_st {
  int type;
  union {
    ASN1_INTEGER *id;
    ASRange      *range;
  } u;
} ASIdOrRange;

typedef STACK_OF(ASIdOrRange) ASIdOrRanges;
DECLARE_STACK_OF(ASIdOrRange)

#define	ASIdentifierChoice_inherit		0
#define	ASIdentifierChoice_asIdsOrRanges	1

typedef struct ASIdentifierChoice_st {
  int type;
  union {
    ASN1_NULL    *inherit;
    ASIdOrRanges *asIdsOrRanges;
  } u;
} ASIdentifierChoice;

typedef struct ASIdentifiers_st {
  ASIdentifierChoice *asnum, *rdi;
} ASIdentifiers;

DECLARE_ASN1_FUNCTIONS(ASRange)
DECLARE_ASN1_FUNCTIONS(ASIdOrRange)
DECLARE_ASN1_FUNCTIONS(ASIdentifierChoice)
DECLARE_ASN1_FUNCTIONS(ASIdentifiers)


typedef struct IPAddressRange_st {
  ASN1_BIT_STRING	*min, *max;
} IPAddressRange;

#define	IPAddressOrRange_addressPrefix	0
#define	IPAddressOrRange_addressRange	1

typedef struct IPAddressOrRange_st {
  int type;
  union {
    ASN1_BIT_STRING	*addressPrefix;
    IPAddressRange	*addressRange;
  } u;
} IPAddressOrRange;

typedef STACK_OF(IPAddressOrRange) IPAddressOrRanges;
DECLARE_STACK_OF(IPAddressOrRange)

#define	IPAddressChoice_inherit			0
#define	IPAddressChoice_addressesOrRanges	1

typedef struct IPAddressChoice_st {
  int type;
  union {
    ASN1_NULL		*inherit;
    IPAddressOrRanges	*addressesOrRanges;
  } u;
} IPAddressChoice;

typedef struct IPAddressFamily_st {
  ASN1_OCTET_STRING	*addressFamily;
  IPAddressChoice	*ipAddressChoice;
} IPAddressFamily;

typedef STACK_OF(IPAddressFamily) IPAddrBlocks;
DECLARE_STACK_OF(IPAddressFamily)

DECLARE_ASN1_FUNCTIONS(IPAddressRange)
DECLARE_ASN1_FUNCTIONS(IPAddressOrRange)
DECLARE_ASN1_FUNCTIONS(IPAddressChoice)
DECLARE_ASN1_FUNCTIONS(IPAddressFamily)

/*
 * API tag for elements of the ASIdentifer SEQUENCE.
 */
#define	V3_ASID_ASNUM	0
#define	V3_ASID_RDI	1

/*
 * AFI values, assigned by IANA.  It'd be nice to make the AFI
 * handling code totally generic, but there are too many little things
 * that would need to be defined for other address families for it to
 * be worth the trouble.
 */
#define	IANA_AFI_IPV4	1
#define	IANA_AFI_IPV6	2

/*
 * Utilities to construct and extract values from RFC3779 extensions,
 * since some of the encodings (particularly for IP address prefixes
 * and ranges) are a bit tedious to work with directly.
 */
int v3_asid_add_inherit(ASIdentifiers *asid, int which);
int v3_asid_add_id_or_range(ASIdentifiers *asid, int which,
			    ASN1_INTEGER *min, ASN1_INTEGER *max);
int v3_addr_add_inherit(IPAddrBlocks *addr,
			const unsigned afi, const unsigned *safi);
int v3_addr_add_prefix(IPAddrBlocks *addr,
		       const unsigned afi, const unsigned *safi,
		       unsigned char *a, const int prefixlen);
int v3_addr_add_range(IPAddrBlocks *addr,
		      const unsigned afi, const unsigned *safi,
		      unsigned char *min, unsigned char *max);
unsigned v3_addr_get_afi(const IPAddressFamily *f);
int v3_addr_get_range(IPAddressOrRange *aor, const unsigned afi,
		      unsigned char *min, unsigned char *max,
		      const int length);

/*
 * Canonical forms.
 */
int v3_asid_is_canonical(ASIdentifiers *asid);
int v3_addr_is_canonical(IPAddrBlocks *addr);
int v3_asid_canonize(ASIdentifiers *asid);
int v3_addr_canonize(IPAddrBlocks *addr);

/*
 * Tests for inheritance and containment.
 */
int v3_asid_inherits(ASIdentifiers *asid);
int v3_addr_inherits(IPAddrBlocks *addr);
int v3_asid_subset(ASIdentifiers *a, ASIdentifiers *b);
int v3_addr_subset(IPAddrBlocks *a, IPAddrBlocks *b);

/*
 * Check whether RFC 3779 extensions nest properly in chains.
 */
int v3_asid_validate_path(X509_STORE_CTX *);
int v3_addr_validate_path(X509_STORE_CTX *);
int v3_asid_validate_resource_set(STACK_OF(X509) *chain,
				  ASIdentifiers *ext,
				  int allow_inheritance);
int v3_addr_validate_resource_set(STACK_OF(X509) *chain,
				  IPAddrBlocks *ext,
				  int allow_inheritance);

#endif /* OPENSSL_NO_RFC3779 */

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_X509V3_strings(void);

/* Error codes for the X509V3 functions. */

/* Function codes. */
#define X509V3_F_ASIDENTIFIERCHOICE_CANONIZE		 156
#define X509V3_F_ASIDENTIFIERCHOICE_IS_CANONICAL	 157
#define X509V3_F_COPY_EMAIL				 122
#define X509V3_F_COPY_ISSUER				 123
#define X509V3_F_DO_DIRNAME				 144
#define X509V3_F_DO_EXT_CONF				 124
#define X509V3_F_DO_EXT_I2D				 135
#define X509V3_F_DO_EXT_NCONF				 151
#define X509V3_F_DO_I2V_NAME_CONSTRAINTS		 148
#define X509V3_F_HEX_TO_STRING				 111
#define X509V3_F_I2S_ASN1_ENUMERATED			 121
#define X509V3_F_I2S_ASN1_IA5STRING			 149
#define X509V3_F_I2S_ASN1_INTEGER			 120
#define X509V3_F_I2V_AUTHORITY_INFO_ACCESS		 138
#define X509V3_F_NOTICE_SECTION				 132
#define X509V3_F_NREF_NOS				 133
#define X509V3_F_POLICY_SECTION				 131
#define X509V3_F_PROCESS_PCI_VALUE			 150
#define X509V3_F_R2I_CERTPOL				 130
#define X509V3_F_R2I_PCI				 155
#define X509V3_F_S2I_ASN1_IA5STRING			 100
#define X509V3_F_S2I_ASN1_INTEGER			 108
#define X509V3_F_S2I_ASN1_OCTET_STRING			 112
#define X509V3_F_S2I_ASN1_SKEY_ID			 114
#define X509V3_F_S2I_SKEY_ID				 115
#define X509V3_F_STRING_TO_HEX				 113
#define X509V3_F_SXNET_ADD_ID_ASC			 125
#define X509V3_F_SXNET_ADD_ID_INTEGER			 126
#define X509V3_F_SXNET_ADD_ID_ULONG			 127
#define X509V3_F_SXNET_GET_ID_ASC			 128
#define X509V3_F_SXNET_GET_ID_ULONG			 129
#define X509V3_F_V2I_ASIDENTIFIERS			 158
#define X509V3_F_V2I_ASN1_BIT_STRING			 101
#define X509V3_F_V2I_AUTHORITY_INFO_ACCESS		 139
#define X509V3_F_V2I_AUTHORITY_KEYID			 119
#define X509V3_F_V2I_BASIC_CONSTRAINTS			 102
#define X509V3_F_V2I_CRLD				 134
#define X509V3_F_V2I_EXTENDED_KEY_USAGE			 103
#define X509V3_F_V2I_GENERAL_NAMES			 118
#define X509V3_F_V2I_GENERAL_NAME_EX			 117
#define X509V3_F_V2I_IPADDRBLOCKS			 159
#define X509V3_F_V2I_ISSUER_ALT				 153
#define X509V3_F_V2I_NAME_CONSTRAINTS			 147
#define X509V3_F_V2I_POLICY_CONSTRAINTS			 146
#define X509V3_F_V2I_POLICY_MAPPINGS			 145
#define X509V3_F_V2I_SUBJECT_ALT			 154
#define X509V3_F_V3_ADDR_VALIDATE_PATH_INTERNAL		 160
#define X509V3_F_V3_GENERIC_EXTENSION			 116
#define X509V3_F_X509V3_ADD1_I2D			 140
#define X509V3_F_X509V3_ADD_VALUE			 105
#define X509V3_F_X509V3_EXT_ADD				 104
#define X509V3_F_X509V3_EXT_ADD_ALIAS			 106
#define X509V3_F_X509V3_EXT_CONF			 107
#define X509V3_F_X509V3_EXT_I2D				 136
#define X509V3_F_X509V3_EXT_NCONF			 152
#define X509V3_F_X509V3_GET_SECTION			 142
#define X509V3_F_X509V3_GET_STRING			 143
#define X509V3_F_X509V3_GET_VALUE_BOOL			 110
#define X509V3_F_X509V3_PARSE_LIST			 109
#define X509V3_F_X509_PURPOSE_ADD			 137
#define X509V3_F_X509_PURPOSE_SET			 141

/* Reason codes. */
#define X509V3_R_BAD_IP_ADDRESS				 118
#define X509V3_R_BAD_OBJECT				 119
#define X509V3_R_BN_DEC2BN_ERROR			 100
#define X509V3_R_BN_TO_ASN1_INTEGER_ERROR		 101
#define X509V3_R_DIRNAME_ERROR				 149
#define X509V3_R_DUPLICATE_ZONE_ID			 133
#define X509V3_R_ERROR_CONVERTING_ZONE			 131
#define X509V3_R_ERROR_CREATING_EXTENSION		 144
#define X509V3_R_ERROR_IN_EXTENSION			 128
#define X509V3_R_EXPECTED_A_SECTION_NAME		 137
#define X509V3_R_EXTENSION_EXISTS			 145
#define X509V3_R_EXTENSION_NAME_ERROR			 115
#define X509V3_R_EXTENSION_NOT_FOUND			 102
#define X509V3_R_EXTENSION_SETTING_NOT_SUPPORTED	 103
#define X509V3_R_EXTENSION_VALUE_ERROR			 116
#define X509V3_R_ILLEGAL_EMPTY_EXTENSION		 151
#define X509V3_R_ILLEGAL_HEX_DIGIT			 113
#define X509V3_R_INCORRECT_POLICY_SYNTAX_TAG		 152
#define X509V3_R_INVALID_ASNUMBER			 160
#define X509V3_R_INVALID_ASRANGE			 161
#define X509V3_R_INVALID_BOOLEAN_STRING			 104
#define X509V3_R_INVALID_EXTENSION_STRING		 105
#define X509V3_R_INVALID_INHERITANCE			 162
#define X509V3_R_INVALID_IPADDRESS			 163
#define X509V3_R_INVALID_NAME				 106
#define X509V3_R_INVALID_NULL_ARGUMENT			 107
#define X509V3_R_INVALID_NULL_NAME			 108
#define X509V3_R_INVALID_NULL_VALUE			 109
#define X509V3_R_INVALID_NUMBER				 140
#define X509V3_R_INVALID_NUMBERS			 141
#define X509V3_R_INVALID_OBJECT_IDENTIFIER		 110
#define X509V3_R_INVALID_OPTION				 138
#define X509V3_R_INVALID_POLICY_IDENTIFIER		 134
#define X509V3_R_INVALID_PROXY_POLICY_SETTING		 153
#define X509V3_R_INVALID_PURPOSE			 146
#define X509V3_R_INVALID_SAFI				 164
#define X509V3_R_INVALID_SECTION			 135
#define X509V3_R_INVALID_SYNTAX				 143
#define X509V3_R_ISSUER_DECODE_ERROR			 126
#define X509V3_R_MISSING_VALUE				 124
#define X509V3_R_NEED_ORGANIZATION_AND_NUMBERS		 142
#define X509V3_R_NO_CONFIG_DATABASE			 136
#define X509V3_R_NO_ISSUER_CERTIFICATE			 121
#define X509V3_R_NO_ISSUER_DETAILS			 127
#define X509V3_R_NO_POLICY_IDENTIFIER			 139
#define X509V3_R_NO_PROXY_CERT_POLICY_LANGUAGE_DEFINED	 154
#define X509V3_R_NO_PUBLIC_KEY				 114
#define X509V3_R_NO_SUBJECT_DETAILS			 125
#define X509V3_R_ODD_NUMBER_OF_DIGITS			 112
#define X509V3_R_OPERATION_NOT_DEFINED			 148
#define X509V3_R_OTHERNAME_ERROR			 147
#define X509V3_R_POLICY_LANGUAGE_ALREADTY_DEFINED	 155
#define X509V3_R_POLICY_PATH_LENGTH			 156
#define X509V3_R_POLICY_PATH_LENGTH_ALREADTY_DEFINED	 157
#define X509V3_R_POLICY_SYNTAX_NOT_CURRENTLY_SUPPORTED	 158
#define X509V3_R_POLICY_WHEN_PROXY_LANGUAGE_REQUIRES_NO_POLICY 159
#define X509V3_R_SECTION_NOT_FOUND			 150
#define X509V3_R_UNABLE_TO_GET_ISSUER_DETAILS		 122
#define X509V3_R_UNABLE_TO_GET_ISSUER_KEYID		 123
#define X509V3_R_UNKNOWN_BIT_STRING_ARGUMENT		 111
#define X509V3_R_UNKNOWN_EXTENSION			 129
#define X509V3_R_UNKNOWN_EXTENSION_NAME			 130
#define X509V3_R_UNKNOWN_OPTION				 120
#define X509V3_R_UNSUPPORTED_OPTION			 117
#define X509V3_R_USER_TOO_LONG				 132

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/cast.h0000755000175000017500000001054511341640430017730 0ustar  davidedavide/* crypto/cast/cast.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_CAST_H
#define HEADER_CAST_H

#ifdef  __cplusplus
extern "C" {
#endif

#include 

#ifdef OPENSSL_NO_CAST
#error CAST is disabled.
#endif

#define CAST_ENCRYPT	1
#define CAST_DECRYPT	0

#define CAST_LONG unsigned long

#define CAST_BLOCK	8
#define CAST_KEY_LENGTH	16

typedef struct cast_key_st
	{
	CAST_LONG data[32];
	int short_key;	/* Use reduced rounds for short key */
	} CAST_KEY;

#ifdef OPENSSL_FIPS 
void private_CAST_set_key(CAST_KEY *key, int len, const unsigned char *data);
#endif
void CAST_set_key(CAST_KEY *key, int len, const unsigned char *data);
void CAST_ecb_encrypt(const unsigned char *in,unsigned char *out,CAST_KEY *key,
		      int enc);
void CAST_encrypt(CAST_LONG *data,CAST_KEY *key);
void CAST_decrypt(CAST_LONG *data,CAST_KEY *key);
void CAST_cbc_encrypt(const unsigned char *in, unsigned char *out, long length,
		      CAST_KEY *ks, unsigned char *iv, int enc);
void CAST_cfb64_encrypt(const unsigned char *in, unsigned char *out,
			long length, CAST_KEY *schedule, unsigned char *ivec,
			int *num, int enc);
void CAST_ofb64_encrypt(const unsigned char *in, unsigned char *out, 
			long length, CAST_KEY *schedule, unsigned char *ivec,
			int *num);

#ifdef  __cplusplus
}
#endif

#endif
xmail-1.27/win32ssl/include/openssl/ecdh.h0000755000175000017500000001100111341640430017665 0ustar  davidedavide/* crypto/ecdh/ecdh.h */
/* ====================================================================
 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
 *
 * The Elliptic Curve Public-Key Crypto Library (ECC Code) included
 * herein is developed by SUN MICROSYSTEMS, INC., and is contributed
 * to the OpenSSL project.
 *
 * The ECC Code is licensed pursuant to the OpenSSL open source
 * license provided below.
 *
 * The ECDH software is originally written by Douglas Stebila of
 * Sun Microsystems Laboratories.
 *
 */
/* ====================================================================
 * Copyright (c) 2000-2002 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    licensing@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */
#ifndef HEADER_ECDH_H
#define HEADER_ECDH_H

#include 

#ifdef OPENSSL_NO_ECDH
#error ECDH is disabled.
#endif

#include 
#include 
#ifndef OPENSSL_NO_DEPRECATED
#include 
#endif

#ifdef __cplusplus
extern "C" {
#endif

const ECDH_METHOD *ECDH_OpenSSL(void);

void	  ECDH_set_default_method(const ECDH_METHOD *);
const ECDH_METHOD *ECDH_get_default_method(void);
int 	  ECDH_set_method(EC_KEY *, const ECDH_METHOD *);

int ECDH_compute_key(void *out, size_t outlen, const EC_POINT *pub_key, EC_KEY *ecdh,
                     void *(*KDF)(const void *in, size_t inlen, void *out, size_t *outlen));

int 	  ECDH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new 
		*new_func, CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
int 	  ECDH_set_ex_data(EC_KEY *d, int idx, void *arg);
void 	  *ECDH_get_ex_data(EC_KEY *d, int idx);


/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_ECDH_strings(void);

/* Error codes for the ECDH functions. */

/* Function codes. */
#define ECDH_F_ECDH_COMPUTE_KEY				 100
#define ECDH_F_ECDH_DATA_NEW_METHOD			 101

/* Reason codes. */
#define ECDH_R_KDF_FAILED				 102
#define ECDH_R_NO_PRIVATE_VALUE				 100
#define ECDH_R_POINT_ARITHMETIC_FAILURE			 101

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/conf.h0000755000175000017500000002241411341640430017721 0ustar  davidedavide/* crypto/conf/conf.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef  HEADER_CONF_H
#define HEADER_CONF_H

#include 
#include 
#include 
#include 
#include 

#include 

#ifdef  __cplusplus
extern "C" {
#endif

typedef struct
	{
	char *section;
	char *name;
	char *value;
	} CONF_VALUE;

DECLARE_STACK_OF(CONF_VALUE)
DECLARE_STACK_OF(CONF_MODULE)
DECLARE_STACK_OF(CONF_IMODULE)

struct conf_st;
struct conf_method_st;
typedef struct conf_method_st CONF_METHOD;

struct conf_method_st
	{
	const char *name;
	CONF *(*create)(CONF_METHOD *meth);
	int (*init)(CONF *conf);
	int (*destroy)(CONF *conf);
	int (*destroy_data)(CONF *conf);
	int (*load_bio)(CONF *conf, BIO *bp, long *eline);
	int (*dump)(const CONF *conf, BIO *bp);
	int (*is_number)(const CONF *conf, char c);
	int (*to_int)(const CONF *conf, char c);
	int (*load)(CONF *conf, const char *name, long *eline);
	};

/* Module definitions */

typedef struct conf_imodule_st CONF_IMODULE;
typedef struct conf_module_st CONF_MODULE;

/* DSO module function typedefs */
typedef int conf_init_func(CONF_IMODULE *md, const CONF *cnf);
typedef void conf_finish_func(CONF_IMODULE *md);

#define	CONF_MFLAGS_IGNORE_ERRORS	0x1
#define CONF_MFLAGS_IGNORE_RETURN_CODES	0x2
#define CONF_MFLAGS_SILENT		0x4
#define CONF_MFLAGS_NO_DSO		0x8
#define CONF_MFLAGS_IGNORE_MISSING_FILE	0x10
#define CONF_MFLAGS_DEFAULT_SECTION	0x20

int CONF_set_default_method(CONF_METHOD *meth);
void CONF_set_nconf(CONF *conf,LHASH *hash);
LHASH *CONF_load(LHASH *conf,const char *file,long *eline);
#ifndef OPENSSL_NO_FP_API
LHASH *CONF_load_fp(LHASH *conf, FILE *fp,long *eline);
#endif
LHASH *CONF_load_bio(LHASH *conf, BIO *bp,long *eline);
STACK_OF(CONF_VALUE) *CONF_get_section(LHASH *conf,const char *section);
char *CONF_get_string(LHASH *conf,const char *group,const char *name);
long CONF_get_number(LHASH *conf,const char *group,const char *name);
void CONF_free(LHASH *conf);
int CONF_dump_fp(LHASH *conf, FILE *out);
int CONF_dump_bio(LHASH *conf, BIO *out);

void OPENSSL_config(const char *config_name);
void OPENSSL_no_config(void);

/* New conf code.  The semantics are different from the functions above.
   If that wasn't the case, the above functions would have been replaced */

struct conf_st
	{
	CONF_METHOD *meth;
	void *meth_data;
	LHASH *data;
	};

CONF *NCONF_new(CONF_METHOD *meth);
CONF_METHOD *NCONF_default(void);
CONF_METHOD *NCONF_WIN32(void);
#if 0 /* Just to give you an idea of what I have in mind */
CONF_METHOD *NCONF_XML(void);
#endif
void NCONF_free(CONF *conf);
void NCONF_free_data(CONF *conf);

int NCONF_load(CONF *conf,const char *file,long *eline);
#ifndef OPENSSL_NO_FP_API
int NCONF_load_fp(CONF *conf, FILE *fp,long *eline);
#endif
int NCONF_load_bio(CONF *conf, BIO *bp,long *eline);
STACK_OF(CONF_VALUE) *NCONF_get_section(const CONF *conf,const char *section);
char *NCONF_get_string(const CONF *conf,const char *group,const char *name);
int NCONF_get_number_e(const CONF *conf,const char *group,const char *name,
		       long *result);
int NCONF_dump_fp(const CONF *conf, FILE *out);
int NCONF_dump_bio(const CONF *conf, BIO *out);

#if 0 /* The following function has no error checking,
	 and should therefore be avoided */
long NCONF_get_number(CONF *conf,char *group,char *name);
#else
#define NCONF_get_number(c,g,n,r) NCONF_get_number_e(c,g,n,r)
#endif
  
/* Module functions */

int CONF_modules_load(const CONF *cnf, const char *appname,
		      unsigned long flags);
int CONF_modules_load_file(const char *filename, const char *appname,
			   unsigned long flags);
void CONF_modules_unload(int all);
void CONF_modules_finish(void);
void CONF_modules_free(void);
int CONF_module_add(const char *name, conf_init_func *ifunc,
		    conf_finish_func *ffunc);

const char *CONF_imodule_get_name(const CONF_IMODULE *md);
const char *CONF_imodule_get_value(const CONF_IMODULE *md);
void *CONF_imodule_get_usr_data(const CONF_IMODULE *md);
void CONF_imodule_set_usr_data(CONF_IMODULE *md, void *usr_data);
CONF_MODULE *CONF_imodule_get_module(const CONF_IMODULE *md);
unsigned long CONF_imodule_get_flags(const CONF_IMODULE *md);
void CONF_imodule_set_flags(CONF_IMODULE *md, unsigned long flags);
void *CONF_module_get_usr_data(CONF_MODULE *pmod);
void CONF_module_set_usr_data(CONF_MODULE *pmod, void *usr_data);

char *CONF_get1_default_config_file(void);

int CONF_parse_list(const char *list, int sep, int nospc,
	int (*list_cb)(const char *elem, int len, void *usr), void *arg);

void OPENSSL_load_builtin_modules(void);

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_CONF_strings(void);

/* Error codes for the CONF functions. */

/* Function codes. */
#define CONF_F_CONF_DUMP_FP				 104
#define CONF_F_CONF_LOAD				 100
#define CONF_F_CONF_LOAD_BIO				 102
#define CONF_F_CONF_LOAD_FP				 103
#define CONF_F_CONF_MODULES_LOAD			 116
#define CONF_F_DEF_LOAD					 120
#define CONF_F_DEF_LOAD_BIO				 121
#define CONF_F_MODULE_INIT				 115
#define CONF_F_MODULE_LOAD_DSO				 117
#define CONF_F_MODULE_RUN				 118
#define CONF_F_NCONF_DUMP_BIO				 105
#define CONF_F_NCONF_DUMP_FP				 106
#define CONF_F_NCONF_GET_NUMBER				 107
#define CONF_F_NCONF_GET_NUMBER_E			 112
#define CONF_F_NCONF_GET_SECTION			 108
#define CONF_F_NCONF_GET_STRING				 109
#define CONF_F_NCONF_LOAD				 113
#define CONF_F_NCONF_LOAD_BIO				 110
#define CONF_F_NCONF_LOAD_FP				 114
#define CONF_F_NCONF_NEW				 111
#define CONF_F_STR_COPY					 101

/* Reason codes. */
#define CONF_R_ERROR_LOADING_DSO			 110
#define CONF_R_MISSING_CLOSE_SQUARE_BRACKET		 100
#define CONF_R_MISSING_EQUAL_SIGN			 101
#define CONF_R_MISSING_FINISH_FUNCTION			 111
#define CONF_R_MISSING_INIT_FUNCTION			 112
#define CONF_R_MODULE_INITIALIZATION_ERROR		 109
#define CONF_R_NO_CLOSE_BRACE				 102
#define CONF_R_NO_CONF					 105
#define CONF_R_NO_CONF_OR_ENVIRONMENT_VARIABLE		 106
#define CONF_R_NO_SECTION				 107
#define CONF_R_NO_SUCH_FILE				 114
#define CONF_R_NO_VALUE					 108
#define CONF_R_UNABLE_TO_CREATE_NEW_SECTION		 103
#define CONF_R_UNKNOWN_MODULE_NAME			 113
#define CONF_R_VARIABLE_HAS_NO_VALUE			 104

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/ocsp.h0000755000175000017500000005700011341640430017737 0ustar  davidedavide/* ocsp.h */
/* Written by Tom Titchener  for the OpenSSL
 * project. */

/* History:
   This file was transfered to Richard Levitte from CertCo by Kathy
   Weinhold in mid-spring 2000 to be included in OpenSSL or released
   as a patch kit. */

/* ====================================================================
 * Copyright (c) 1998-2000 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

#ifndef HEADER_OCSP_H
#define HEADER_OCSP_H

#include 
#include 
#include 

#ifdef  __cplusplus
extern "C" {
#endif

/* Various flags and values */

#define OCSP_DEFAULT_NONCE_LENGTH	16

#define OCSP_NOCERTS			0x1
#define OCSP_NOINTERN			0x2
#define OCSP_NOSIGS			0x4
#define OCSP_NOCHAIN			0x8
#define OCSP_NOVERIFY			0x10
#define OCSP_NOEXPLICIT			0x20
#define OCSP_NOCASIGN			0x40
#define OCSP_NODELEGATED		0x80
#define OCSP_NOCHECKS			0x100
#define OCSP_TRUSTOTHER			0x200
#define OCSP_RESPID_KEY			0x400
#define OCSP_NOTIME			0x800

/*   CertID ::= SEQUENCE {
 *       hashAlgorithm            AlgorithmIdentifier,
 *       issuerNameHash     OCTET STRING, -- Hash of Issuer's DN
 *       issuerKeyHash      OCTET STRING, -- Hash of Issuers public key (excluding the tag & length fields)
 *       serialNumber       CertificateSerialNumber }
 */
typedef struct ocsp_cert_id_st
	{
	X509_ALGOR *hashAlgorithm;
	ASN1_OCTET_STRING *issuerNameHash;
	ASN1_OCTET_STRING *issuerKeyHash;
	ASN1_INTEGER *serialNumber;
	} OCSP_CERTID;

DECLARE_STACK_OF(OCSP_CERTID)

/*   Request ::=     SEQUENCE {
 *       reqCert                    CertID,
 *       singleRequestExtensions    [0] EXPLICIT Extensions OPTIONAL }
 */
typedef struct ocsp_one_request_st
	{
	OCSP_CERTID *reqCert;
	STACK_OF(X509_EXTENSION) *singleRequestExtensions;
	} OCSP_ONEREQ;

DECLARE_STACK_OF(OCSP_ONEREQ)
DECLARE_ASN1_SET_OF(OCSP_ONEREQ)


/*   TBSRequest      ::=     SEQUENCE {
 *       version             [0] EXPLICIT Version DEFAULT v1,
 *       requestorName       [1] EXPLICIT GeneralName OPTIONAL,
 *       requestList             SEQUENCE OF Request,
 *       requestExtensions   [2] EXPLICIT Extensions OPTIONAL }
 */
typedef struct ocsp_req_info_st
	{
	ASN1_INTEGER *version;
	GENERAL_NAME *requestorName;
	STACK_OF(OCSP_ONEREQ) *requestList;
	STACK_OF(X509_EXTENSION) *requestExtensions;
	} OCSP_REQINFO;

/*   Signature       ::=     SEQUENCE {
 *       signatureAlgorithm   AlgorithmIdentifier,
 *       signature            BIT STRING,
 *       certs                [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL }
 */
typedef struct ocsp_signature_st
	{
	X509_ALGOR *signatureAlgorithm;
	ASN1_BIT_STRING *signature;
	STACK_OF(X509) *certs;
	} OCSP_SIGNATURE;

/*   OCSPRequest     ::=     SEQUENCE {
 *       tbsRequest                  TBSRequest,
 *       optionalSignature   [0]     EXPLICIT Signature OPTIONAL }
 */
typedef struct ocsp_request_st
	{
	OCSP_REQINFO *tbsRequest;
	OCSP_SIGNATURE *optionalSignature; /* OPTIONAL */
	} OCSP_REQUEST;

/*   OCSPResponseStatus ::= ENUMERATED {
 *       successful            (0),      --Response has valid confirmations
 *       malformedRequest      (1),      --Illegal confirmation request
 *       internalError         (2),      --Internal error in issuer
 *       tryLater              (3),      --Try again later
 *                                       --(4) is not used
 *       sigRequired           (5),      --Must sign the request
 *       unauthorized          (6)       --Request unauthorized
 *   }
 */
#define OCSP_RESPONSE_STATUS_SUCCESSFUL          0
#define OCSP_RESPONSE_STATUS_MALFORMEDREQUEST     1
#define OCSP_RESPONSE_STATUS_INTERNALERROR        2
#define OCSP_RESPONSE_STATUS_TRYLATER             3
#define OCSP_RESPONSE_STATUS_SIGREQUIRED          5
#define OCSP_RESPONSE_STATUS_UNAUTHORIZED         6

/*   ResponseBytes ::=       SEQUENCE {
 *       responseType   OBJECT IDENTIFIER,
 *       response       OCTET STRING }
 */
typedef struct ocsp_resp_bytes_st
	{
	ASN1_OBJECT *responseType;
	ASN1_OCTET_STRING *response;
	} OCSP_RESPBYTES;

/*   OCSPResponse ::= SEQUENCE {
 *      responseStatus         OCSPResponseStatus,
 *      responseBytes          [0] EXPLICIT ResponseBytes OPTIONAL }
 */
struct ocsp_response_st
	{
	ASN1_ENUMERATED *responseStatus;
	OCSP_RESPBYTES  *responseBytes;
	};

/*   ResponderID ::= CHOICE {
 *      byName   [1] Name,
 *      byKey    [2] KeyHash }
 */
#define V_OCSP_RESPID_NAME 0
#define V_OCSP_RESPID_KEY  1
struct ocsp_responder_id_st
	{
	int type;
	union   {
		X509_NAME* byName;
        	ASN1_OCTET_STRING *byKey;
		} value;
	};

DECLARE_STACK_OF(OCSP_RESPID)
DECLARE_ASN1_FUNCTIONS(OCSP_RESPID)

/*   KeyHash ::= OCTET STRING --SHA-1 hash of responder's public key
 *                            --(excluding the tag and length fields)
 */

/*   RevokedInfo ::= SEQUENCE {
 *       revocationTime              GeneralizedTime,
 *       revocationReason    [0]     EXPLICIT CRLReason OPTIONAL }
 */
typedef struct ocsp_revoked_info_st
	{
	ASN1_GENERALIZEDTIME *revocationTime;
	ASN1_ENUMERATED *revocationReason;
	} OCSP_REVOKEDINFO;

/*   CertStatus ::= CHOICE {
 *       good                [0]     IMPLICIT NULL,
 *       revoked             [1]     IMPLICIT RevokedInfo,
 *       unknown             [2]     IMPLICIT UnknownInfo }
 */
#define V_OCSP_CERTSTATUS_GOOD    0
#define V_OCSP_CERTSTATUS_REVOKED 1
#define V_OCSP_CERTSTATUS_UNKNOWN 2
typedef struct ocsp_cert_status_st
	{
	int type;
	union	{
		ASN1_NULL *good;
		OCSP_REVOKEDINFO *revoked;
		ASN1_NULL *unknown;
		} value;
	} OCSP_CERTSTATUS;

/*   SingleResponse ::= SEQUENCE {
 *      certID                       CertID,
 *      certStatus                   CertStatus,
 *      thisUpdate                   GeneralizedTime,
 *      nextUpdate           [0]     EXPLICIT GeneralizedTime OPTIONAL,
 *      singleExtensions     [1]     EXPLICIT Extensions OPTIONAL }
 */
typedef struct ocsp_single_response_st
	{
	OCSP_CERTID *certId;
	OCSP_CERTSTATUS *certStatus;
	ASN1_GENERALIZEDTIME *thisUpdate;
	ASN1_GENERALIZEDTIME *nextUpdate;
	STACK_OF(X509_EXTENSION) *singleExtensions;
	} OCSP_SINGLERESP;

DECLARE_STACK_OF(OCSP_SINGLERESP)
DECLARE_ASN1_SET_OF(OCSP_SINGLERESP)

/*   ResponseData ::= SEQUENCE {
 *      version              [0] EXPLICIT Version DEFAULT v1,
 *      responderID              ResponderID,
 *      producedAt               GeneralizedTime,
 *      responses                SEQUENCE OF SingleResponse,
 *      responseExtensions   [1] EXPLICIT Extensions OPTIONAL }
 */
typedef struct ocsp_response_data_st
	{
	ASN1_INTEGER *version;
	OCSP_RESPID  *responderId;
	ASN1_GENERALIZEDTIME *producedAt;
	STACK_OF(OCSP_SINGLERESP) *responses;
	STACK_OF(X509_EXTENSION) *responseExtensions;
	} OCSP_RESPDATA;

/*   BasicOCSPResponse       ::= SEQUENCE {
 *      tbsResponseData      ResponseData,
 *      signatureAlgorithm   AlgorithmIdentifier,
 *      signature            BIT STRING,
 *      certs                [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL }
 */
  /* Note 1:
     The value for "signature" is specified in the OCSP rfc2560 as follows:
     "The value for the signature SHALL be computed on the hash of the DER
     encoding ResponseData."  This means that you must hash the DER-encoded
     tbsResponseData, and then run it through a crypto-signing function, which
     will (at least w/RSA) do a hash-'n'-private-encrypt operation.  This seems
     a bit odd, but that's the spec.  Also note that the data structures do not
     leave anywhere to independently specify the algorithm used for the initial
     hash. So, we look at the signature-specification algorithm, and try to do
     something intelligent.	-- Kathy Weinhold, CertCo */
  /* Note 2:
     It seems that the mentioned passage from RFC 2560 (section 4.2.1) is open
     for interpretation.  I've done tests against another responder, and found
     that it doesn't do the double hashing that the RFC seems to say one
     should.  Therefore, all relevant functions take a flag saying which
     variant should be used.	-- Richard Levitte, OpenSSL team and CeloCom */
typedef struct ocsp_basic_response_st
	{
	OCSP_RESPDATA *tbsResponseData;
	X509_ALGOR *signatureAlgorithm;
	ASN1_BIT_STRING *signature;
	STACK_OF(X509) *certs;
	} OCSP_BASICRESP;

/*
 *   CRLReason ::= ENUMERATED {
 *        unspecified             (0),
 *        keyCompromise           (1),
 *        cACompromise            (2),
 *        affiliationChanged      (3),
 *        superseded              (4),
 *        cessationOfOperation    (5),
 *        certificateHold         (6),
 *        removeFromCRL           (8) }
 */
#define OCSP_REVOKED_STATUS_NOSTATUS               -1
#define OCSP_REVOKED_STATUS_UNSPECIFIED             0
#define OCSP_REVOKED_STATUS_KEYCOMPROMISE           1
#define OCSP_REVOKED_STATUS_CACOMPROMISE            2
#define OCSP_REVOKED_STATUS_AFFILIATIONCHANGED      3
#define OCSP_REVOKED_STATUS_SUPERSEDED              4
#define OCSP_REVOKED_STATUS_CESSATIONOFOPERATION    5
#define OCSP_REVOKED_STATUS_CERTIFICATEHOLD         6
#define OCSP_REVOKED_STATUS_REMOVEFROMCRL           8

/* CrlID ::= SEQUENCE {
 *     crlUrl               [0]     EXPLICIT IA5String OPTIONAL,
 *     crlNum               [1]     EXPLICIT INTEGER OPTIONAL,
 *     crlTime              [2]     EXPLICIT GeneralizedTime OPTIONAL }
 */
typedef struct ocsp_crl_id_st
        {
	ASN1_IA5STRING *crlUrl;
	ASN1_INTEGER *crlNum;
	ASN1_GENERALIZEDTIME *crlTime;
        } OCSP_CRLID;

/* ServiceLocator ::= SEQUENCE {
 *      issuer    Name,
 *      locator   AuthorityInfoAccessSyntax OPTIONAL }
 */
typedef struct ocsp_service_locator_st
        {
	X509_NAME* issuer;
	STACK_OF(ACCESS_DESCRIPTION) *locator;
        } OCSP_SERVICELOC;
 
#define PEM_STRING_OCSP_REQUEST	"OCSP REQUEST"
#define PEM_STRING_OCSP_RESPONSE "OCSP RESPONSE"

#define d2i_OCSP_REQUEST_bio(bp,p) ASN1_d2i_bio_of(OCSP_REQUEST,OCSP_REQUEST_new,d2i_OCSP_REQUEST,bp,p)

#define d2i_OCSP_RESPONSE_bio(bp,p) ASN1_d2i_bio_of(OCSP_RESPONSE,OCSP_RESPONSE_new,d2i_OCSP_RESPONSE,bp,p)

#define	PEM_read_bio_OCSP_REQUEST(bp,x,cb) (OCSP_REQUEST *)PEM_ASN1_read_bio( \
     (char *(*)())d2i_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,bp,(char **)x,cb,NULL)

#define	PEM_read_bio_OCSP_RESPONSE(bp,x,cb)(OCSP_RESPONSE *)PEM_ASN1_read_bio(\
     (char *(*)())d2i_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,bp,(char **)x,cb,NULL)

#define PEM_write_bio_OCSP_REQUEST(bp,o) \
    PEM_ASN1_write_bio((int (*)())i2d_OCSP_REQUEST,PEM_STRING_OCSP_REQUEST,\
			bp,(char *)o, NULL,NULL,0,NULL,NULL)

#define PEM_write_bio_OCSP_RESPONSE(bp,o) \
    PEM_ASN1_write_bio((int (*)())i2d_OCSP_RESPONSE,PEM_STRING_OCSP_RESPONSE,\
			bp,(char *)o, NULL,NULL,0,NULL,NULL)

#define i2d_OCSP_RESPONSE_bio(bp,o) ASN1_i2d_bio_of(OCSP_RESPONSE,i2d_OCSP_RESPONSE,bp,o)

#define i2d_OCSP_REQUEST_bio(bp,o) ASN1_i2d_bio_of(OCSP_REQUEST,i2d_OCSP_REQUEST,bp,o)

#define OCSP_REQUEST_sign(o,pkey,md) \
	ASN1_item_sign(ASN1_ITEM_rptr(OCSP_REQINFO),\
		o->optionalSignature->signatureAlgorithm,NULL,\
	        o->optionalSignature->signature,o->tbsRequest,pkey,md)

#define OCSP_BASICRESP_sign(o,pkey,md,d) \
	ASN1_item_sign(ASN1_ITEM_rptr(OCSP_RESPDATA),o->signatureAlgorithm,NULL,\
		o->signature,o->tbsResponseData,pkey,md)

#define OCSP_REQUEST_verify(a,r) ASN1_item_verify(ASN1_ITEM_rptr(OCSP_REQINFO),\
        a->optionalSignature->signatureAlgorithm,\
	a->optionalSignature->signature,a->tbsRequest,r)

#define OCSP_BASICRESP_verify(a,r,d) ASN1_item_verify(ASN1_ITEM_rptr(OCSP_RESPDATA),\
	a->signatureAlgorithm,a->signature,a->tbsResponseData,r)

#define ASN1_BIT_STRING_digest(data,type,md,len) \
	ASN1_item_digest(ASN1_ITEM_rptr(ASN1_BIT_STRING),type,data,md,len)

#define OCSP_CERTID_dup(cid) ASN1_dup_of(OCSP_CERTID,i2d_OCSP_CERTID,d2i_OCSP_CERTID,cid)

#define OCSP_CERTSTATUS_dup(cs)\
                (OCSP_CERTSTATUS*)ASN1_dup((int(*)())i2d_OCSP_CERTSTATUS,\
		(char *(*)())d2i_OCSP_CERTSTATUS,(char *)(cs))

OCSP_RESPONSE *OCSP_sendreq_bio(BIO *b, char *path, OCSP_REQUEST *req);
OCSP_REQ_CTX *OCSP_sendreq_new(BIO *io, char *path, OCSP_REQUEST *req,
								int maxline);
int OCSP_sendreq_nbio(OCSP_RESPONSE **presp, OCSP_REQ_CTX *rctx);
void OCSP_REQ_CTX_free(OCSP_REQ_CTX *rctx);

OCSP_CERTID *OCSP_cert_to_id(const EVP_MD *dgst, X509 *subject, X509 *issuer);

OCSP_CERTID *OCSP_cert_id_new(const EVP_MD *dgst, 
			      X509_NAME *issuerName, 
			      ASN1_BIT_STRING* issuerKey, 
			      ASN1_INTEGER *serialNumber);

OCSP_ONEREQ *OCSP_request_add0_id(OCSP_REQUEST *req, OCSP_CERTID *cid);

int OCSP_request_add1_nonce(OCSP_REQUEST *req, unsigned char *val, int len);
int OCSP_basic_add1_nonce(OCSP_BASICRESP *resp, unsigned char *val, int len);
int OCSP_check_nonce(OCSP_REQUEST *req, OCSP_BASICRESP *bs);
int OCSP_copy_nonce(OCSP_BASICRESP *resp, OCSP_REQUEST *req);

int OCSP_request_set1_name(OCSP_REQUEST *req, X509_NAME *nm);
int OCSP_request_add1_cert(OCSP_REQUEST *req, X509 *cert);

int OCSP_request_sign(OCSP_REQUEST   *req,
		      X509           *signer,
		      EVP_PKEY       *key,
		      const EVP_MD   *dgst,
		      STACK_OF(X509) *certs,
		      unsigned long flags);

int OCSP_response_status(OCSP_RESPONSE *resp);
OCSP_BASICRESP *OCSP_response_get1_basic(OCSP_RESPONSE *resp);

int OCSP_resp_count(OCSP_BASICRESP *bs);
OCSP_SINGLERESP *OCSP_resp_get0(OCSP_BASICRESP *bs, int idx);
int OCSP_resp_find(OCSP_BASICRESP *bs, OCSP_CERTID *id, int last);
int OCSP_single_get0_status(OCSP_SINGLERESP *single, int *reason,
				ASN1_GENERALIZEDTIME **revtime,
				ASN1_GENERALIZEDTIME **thisupd,
				ASN1_GENERALIZEDTIME **nextupd);
int OCSP_resp_find_status(OCSP_BASICRESP *bs, OCSP_CERTID *id, int *status,
				int *reason,
				ASN1_GENERALIZEDTIME **revtime,
				ASN1_GENERALIZEDTIME **thisupd,
				ASN1_GENERALIZEDTIME **nextupd);
int OCSP_check_validity(ASN1_GENERALIZEDTIME *thisupd,
			ASN1_GENERALIZEDTIME *nextupd,
			long sec, long maxsec);

int OCSP_request_verify(OCSP_REQUEST *req, STACK_OF(X509) *certs, X509_STORE *store, unsigned long flags);

int OCSP_parse_url(char *url, char **phost, char **pport, char **ppath, int *pssl);

int OCSP_id_issuer_cmp(OCSP_CERTID *a, OCSP_CERTID *b);
int OCSP_id_cmp(OCSP_CERTID *a, OCSP_CERTID *b);

int OCSP_request_onereq_count(OCSP_REQUEST *req);
OCSP_ONEREQ *OCSP_request_onereq_get0(OCSP_REQUEST *req, int i);
OCSP_CERTID *OCSP_onereq_get0_id(OCSP_ONEREQ *one);
int OCSP_id_get0_info(ASN1_OCTET_STRING **piNameHash, ASN1_OBJECT **pmd,
			ASN1_OCTET_STRING **pikeyHash,
			ASN1_INTEGER **pserial, OCSP_CERTID *cid);
int OCSP_request_is_signed(OCSP_REQUEST *req);
OCSP_RESPONSE *OCSP_response_create(int status, OCSP_BASICRESP *bs);
OCSP_SINGLERESP *OCSP_basic_add1_status(OCSP_BASICRESP *rsp,
						OCSP_CERTID *cid,
						int status, int reason,
						ASN1_TIME *revtime,
					ASN1_TIME *thisupd, ASN1_TIME *nextupd);
int OCSP_basic_add1_cert(OCSP_BASICRESP *resp, X509 *cert);
int OCSP_basic_sign(OCSP_BASICRESP *brsp, 
			X509 *signer, EVP_PKEY *key, const EVP_MD *dgst,
			STACK_OF(X509) *certs, unsigned long flags);

ASN1_STRING *ASN1_STRING_encode(ASN1_STRING *s, i2d_of_void *i2d,
				void *data, STACK_OF(ASN1_OBJECT) *sk);
#define ASN1_STRING_encode_of(type,s,i2d,data,sk) \
	ASN1_STRING_encode(s, CHECKED_I2D_OF(type, i2d), data, sk)

X509_EXTENSION *OCSP_crlID_new(char *url, long *n, char *tim);

X509_EXTENSION *OCSP_accept_responses_new(char **oids);

X509_EXTENSION *OCSP_archive_cutoff_new(char* tim);

X509_EXTENSION *OCSP_url_svcloc_new(X509_NAME* issuer, char **urls);

int OCSP_REQUEST_get_ext_count(OCSP_REQUEST *x);
int OCSP_REQUEST_get_ext_by_NID(OCSP_REQUEST *x, int nid, int lastpos);
int OCSP_REQUEST_get_ext_by_OBJ(OCSP_REQUEST *x, ASN1_OBJECT *obj, int lastpos);
int OCSP_REQUEST_get_ext_by_critical(OCSP_REQUEST *x, int crit, int lastpos);
X509_EXTENSION *OCSP_REQUEST_get_ext(OCSP_REQUEST *x, int loc);
X509_EXTENSION *OCSP_REQUEST_delete_ext(OCSP_REQUEST *x, int loc);
void *OCSP_REQUEST_get1_ext_d2i(OCSP_REQUEST *x, int nid, int *crit, int *idx);
int OCSP_REQUEST_add1_ext_i2d(OCSP_REQUEST *x, int nid, void *value, int crit,
							unsigned long flags);
int OCSP_REQUEST_add_ext(OCSP_REQUEST *x, X509_EXTENSION *ex, int loc);

int OCSP_ONEREQ_get_ext_count(OCSP_ONEREQ *x);
int OCSP_ONEREQ_get_ext_by_NID(OCSP_ONEREQ *x, int nid, int lastpos);
int OCSP_ONEREQ_get_ext_by_OBJ(OCSP_ONEREQ *x, ASN1_OBJECT *obj, int lastpos);
int OCSP_ONEREQ_get_ext_by_critical(OCSP_ONEREQ *x, int crit, int lastpos);
X509_EXTENSION *OCSP_ONEREQ_get_ext(OCSP_ONEREQ *x, int loc);
X509_EXTENSION *OCSP_ONEREQ_delete_ext(OCSP_ONEREQ *x, int loc);
void *OCSP_ONEREQ_get1_ext_d2i(OCSP_ONEREQ *x, int nid, int *crit, int *idx);
int OCSP_ONEREQ_add1_ext_i2d(OCSP_ONEREQ *x, int nid, void *value, int crit,
							unsigned long flags);
int OCSP_ONEREQ_add_ext(OCSP_ONEREQ *x, X509_EXTENSION *ex, int loc);

int OCSP_BASICRESP_get_ext_count(OCSP_BASICRESP *x);
int OCSP_BASICRESP_get_ext_by_NID(OCSP_BASICRESP *x, int nid, int lastpos);
int OCSP_BASICRESP_get_ext_by_OBJ(OCSP_BASICRESP *x, ASN1_OBJECT *obj, int lastpos);
int OCSP_BASICRESP_get_ext_by_critical(OCSP_BASICRESP *x, int crit, int lastpos);
X509_EXTENSION *OCSP_BASICRESP_get_ext(OCSP_BASICRESP *x, int loc);
X509_EXTENSION *OCSP_BASICRESP_delete_ext(OCSP_BASICRESP *x, int loc);
void *OCSP_BASICRESP_get1_ext_d2i(OCSP_BASICRESP *x, int nid, int *crit, int *idx);
int OCSP_BASICRESP_add1_ext_i2d(OCSP_BASICRESP *x, int nid, void *value, int crit,
							unsigned long flags);
int OCSP_BASICRESP_add_ext(OCSP_BASICRESP *x, X509_EXTENSION *ex, int loc);

int OCSP_SINGLERESP_get_ext_count(OCSP_SINGLERESP *x);
int OCSP_SINGLERESP_get_ext_by_NID(OCSP_SINGLERESP *x, int nid, int lastpos);
int OCSP_SINGLERESP_get_ext_by_OBJ(OCSP_SINGLERESP *x, ASN1_OBJECT *obj, int lastpos);
int OCSP_SINGLERESP_get_ext_by_critical(OCSP_SINGLERESP *x, int crit, int lastpos);
X509_EXTENSION *OCSP_SINGLERESP_get_ext(OCSP_SINGLERESP *x, int loc);
X509_EXTENSION *OCSP_SINGLERESP_delete_ext(OCSP_SINGLERESP *x, int loc);
void *OCSP_SINGLERESP_get1_ext_d2i(OCSP_SINGLERESP *x, int nid, int *crit, int *idx);
int OCSP_SINGLERESP_add1_ext_i2d(OCSP_SINGLERESP *x, int nid, void *value, int crit,
							unsigned long flags);
int OCSP_SINGLERESP_add_ext(OCSP_SINGLERESP *x, X509_EXTENSION *ex, int loc);

DECLARE_ASN1_FUNCTIONS(OCSP_SINGLERESP)
DECLARE_ASN1_FUNCTIONS(OCSP_CERTSTATUS)
DECLARE_ASN1_FUNCTIONS(OCSP_REVOKEDINFO)
DECLARE_ASN1_FUNCTIONS(OCSP_BASICRESP)
DECLARE_ASN1_FUNCTIONS(OCSP_RESPDATA)
DECLARE_ASN1_FUNCTIONS(OCSP_RESPID)
DECLARE_ASN1_FUNCTIONS(OCSP_RESPONSE)
DECLARE_ASN1_FUNCTIONS(OCSP_RESPBYTES)
DECLARE_ASN1_FUNCTIONS(OCSP_ONEREQ)
DECLARE_ASN1_FUNCTIONS(OCSP_CERTID)
DECLARE_ASN1_FUNCTIONS(OCSP_REQUEST)
DECLARE_ASN1_FUNCTIONS(OCSP_SIGNATURE)
DECLARE_ASN1_FUNCTIONS(OCSP_REQINFO)
DECLARE_ASN1_FUNCTIONS(OCSP_CRLID)
DECLARE_ASN1_FUNCTIONS(OCSP_SERVICELOC)

char *OCSP_response_status_str(long s);
char *OCSP_cert_status_str(long s);
char *OCSP_crl_reason_str(long s);

int OCSP_REQUEST_print(BIO *bp, OCSP_REQUEST* a, unsigned long flags);
int OCSP_RESPONSE_print(BIO *bp, OCSP_RESPONSE* o, unsigned long flags);

int OCSP_basic_verify(OCSP_BASICRESP *bs, STACK_OF(X509) *certs,
				X509_STORE *st, unsigned long flags);

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_OCSP_strings(void);

/* Error codes for the OCSP functions. */

/* Function codes. */
#define OCSP_F_ASN1_STRING_ENCODE			 100
#define OCSP_F_D2I_OCSP_NONCE				 102
#define OCSP_F_OCSP_BASIC_ADD1_STATUS			 103
#define OCSP_F_OCSP_BASIC_SIGN				 104
#define OCSP_F_OCSP_BASIC_VERIFY			 105
#define OCSP_F_OCSP_CERT_ID_NEW				 101
#define OCSP_F_OCSP_CHECK_DELEGATED			 106
#define OCSP_F_OCSP_CHECK_IDS				 107
#define OCSP_F_OCSP_CHECK_ISSUER			 108
#define OCSP_F_OCSP_CHECK_VALIDITY			 115
#define OCSP_F_OCSP_MATCH_ISSUERID			 109
#define OCSP_F_OCSP_PARSE_URL				 114
#define OCSP_F_OCSP_REQUEST_SIGN			 110
#define OCSP_F_OCSP_REQUEST_VERIFY			 116
#define OCSP_F_OCSP_RESPONSE_GET1_BASIC			 111
#define OCSP_F_OCSP_SENDREQ_BIO				 112
#define OCSP_F_PARSE_HTTP_LINE1				 117
#define OCSP_F_REQUEST_VERIFY				 113

/* Reason codes. */
#define OCSP_R_BAD_DATA					 100
#define OCSP_R_CERTIFICATE_VERIFY_ERROR			 101
#define OCSP_R_DIGEST_ERR				 102
#define OCSP_R_ERROR_IN_NEXTUPDATE_FIELD		 122
#define OCSP_R_ERROR_IN_THISUPDATE_FIELD		 123
#define OCSP_R_ERROR_PARSING_URL			 121
#define OCSP_R_MISSING_OCSPSIGNING_USAGE		 103
#define OCSP_R_NEXTUPDATE_BEFORE_THISUPDATE		 124
#define OCSP_R_NOT_BASIC_RESPONSE			 104
#define OCSP_R_NO_CERTIFICATES_IN_CHAIN			 105
#define OCSP_R_NO_CONTENT				 106
#define OCSP_R_NO_PUBLIC_KEY				 107
#define OCSP_R_NO_RESPONSE_DATA				 108
#define OCSP_R_NO_REVOKED_TIME				 109
#define OCSP_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE	 110
#define OCSP_R_REQUEST_NOT_SIGNED			 128
#define OCSP_R_RESPONSE_CONTAINS_NO_REVOCATION_DATA	 111
#define OCSP_R_ROOT_CA_NOT_TRUSTED			 112
#define OCSP_R_SERVER_READ_ERROR			 113
#define OCSP_R_SERVER_RESPONSE_ERROR			 114
#define OCSP_R_SERVER_RESPONSE_PARSE_ERROR		 115
#define OCSP_R_SERVER_WRITE_ERROR			 116
#define OCSP_R_SIGNATURE_FAILURE			 117
#define OCSP_R_SIGNER_CERTIFICATE_NOT_FOUND		 118
#define OCSP_R_STATUS_EXPIRED				 125
#define OCSP_R_STATUS_NOT_YET_VALID			 126
#define OCSP_R_STATUS_TOO_OLD				 127
#define OCSP_R_UNKNOWN_MESSAGE_DIGEST			 119
#define OCSP_R_UNKNOWN_NID				 120
#define OCSP_R_UNSUPPORTED_REQUESTORNAME_TYPE		 129

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/aes.h0000755000175000017500000001306211341640430017543 0ustar  davidedavide/* crypto/aes/aes.h -*- mode:C; c-file-style: "eay" -*- */
/* ====================================================================
 * Copyright (c) 1998-2002 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 */

#ifndef HEADER_AES_H
#define HEADER_AES_H

#include 

#ifdef OPENSSL_NO_AES
#error AES is disabled.
#endif

#define AES_ENCRYPT	1
#define AES_DECRYPT	0

/* Because array size can't be a const in C, the following two are macros.
   Both sizes are in bytes. */
#define AES_MAXNR 14
#define AES_BLOCK_SIZE 16

#ifdef OPENSSL_FIPS
#define FIPS_AES_SIZE_T	int
#endif

#ifdef  __cplusplus
extern "C" {
#endif

/* This should be a hidden type, but EVP requires that the size be known */
struct aes_key_st {
#ifdef AES_LONG
    unsigned long rd_key[4 *(AES_MAXNR + 1)];
#else
    unsigned int rd_key[4 *(AES_MAXNR + 1)];
#endif
    int rounds;
};
typedef struct aes_key_st AES_KEY;

const char *AES_options(void);

int AES_set_encrypt_key(const unsigned char *userKey, const int bits,
	AES_KEY *key);
int AES_set_decrypt_key(const unsigned char *userKey, const int bits,
	AES_KEY *key);

void AES_encrypt(const unsigned char *in, unsigned char *out,
	const AES_KEY *key);
void AES_decrypt(const unsigned char *in, unsigned char *out,
	const AES_KEY *key);

void AES_ecb_encrypt(const unsigned char *in, unsigned char *out,
	const AES_KEY *key, const int enc);
void AES_cbc_encrypt(const unsigned char *in, unsigned char *out,
	const unsigned long length, const AES_KEY *key,
	unsigned char *ivec, const int enc);
void AES_cfb128_encrypt(const unsigned char *in, unsigned char *out,
	const unsigned long length, const AES_KEY *key,
	unsigned char *ivec, int *num, const int enc);
void AES_cfb1_encrypt(const unsigned char *in, unsigned char *out,
	const unsigned long length, const AES_KEY *key,
	unsigned char *ivec, int *num, const int enc);
void AES_cfb8_encrypt(const unsigned char *in, unsigned char *out,
	const unsigned long length, const AES_KEY *key,
	unsigned char *ivec, int *num, const int enc);
void AES_cfbr_encrypt_block(const unsigned char *in,unsigned char *out,
			    const int nbits,const AES_KEY *key,
			    unsigned char *ivec,const int enc);
void AES_ofb128_encrypt(const unsigned char *in, unsigned char *out,
	const unsigned long length, const AES_KEY *key,
	unsigned char *ivec, int *num);
void AES_ctr128_encrypt(const unsigned char *in, unsigned char *out,
	const unsigned long length, const AES_KEY *key,
	unsigned char ivec[AES_BLOCK_SIZE],
	unsigned char ecount_buf[AES_BLOCK_SIZE],
	unsigned int *num);

/* For IGE, see also http://www.links.org/files/openssl-ige.pdf */
/* NB: the IV is _two_ blocks long */
void AES_ige_encrypt(const unsigned char *in, unsigned char *out,
		     const unsigned long length, const AES_KEY *key,
		     unsigned char *ivec, const int enc);
/* NB: the IV is _four_ blocks long */
void AES_bi_ige_encrypt(const unsigned char *in, unsigned char *out,
			const unsigned long length, const AES_KEY *key,
			const AES_KEY *key2, const unsigned char *ivec,
			const int enc);

int AES_wrap_key(AES_KEY *key, const unsigned char *iv,
		unsigned char *out,
		const unsigned char *in, unsigned int inlen);
int AES_unwrap_key(AES_KEY *key, const unsigned char *iv,
		unsigned char *out,
		const unsigned char *in, unsigned int inlen);

#ifdef  __cplusplus
}
#endif

#endif /* !HEADER_AES_H */
xmail-1.27/win32ssl/include/openssl/pq_compat.h0000755000175000017500000001410511341640430020755 0ustar  davidedavide/* crypto/pqueue/pqueue_compat.h */
/* 
 * DTLS implementation written by Nagendra Modadugu
 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.  
 */
/* ====================================================================
 * Copyright (c) 1999-2005 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

#ifndef HEADER_PQ_COMPAT_H
#define HEADER_PQ_COMPAT_H

#include 
#include 

/* 
 * The purpose of this header file is for supporting 64-bit integer
 * manipulation on 32-bit (and lower) machines.  Currently the only
 * such environment is VMS, Utrix and those with smaller default integer
 * sizes than 32 bits.  For all such environment, we fall back to using
 * BIGNUM.  We may need to fine tune the conditions for systems that
 * are incorrectly configured.
 *
 * The only clients of this code are (1) pqueue for priority, and
 * (2) DTLS, for sequence number manipulation.
 */

#if (defined(THIRTY_TWO_BIT) && !defined(BN_LLONG)) || defined(SIXTEEN_BIT) || defined(EIGHT_BIT)

#define PQ_64BIT_IS_INTEGER 0
#define PQ_64BIT_IS_BIGNUM 1

#define PQ_64BIT     BIGNUM
#define PQ_64BIT_CTX BN_CTX

#define pq_64bit_init(x)           BN_init(x)
#define pq_64bit_free(x)           BN_free(x)

#define pq_64bit_ctx_new(ctx)      BN_CTX_new()
#define pq_64bit_ctx_free(x)       BN_CTX_free(x)

#define pq_64bit_assign(x, y)      BN_copy(x, y)
#define pq_64bit_assign_word(x, y) BN_set_word(x, y)
#define pq_64bit_gt(x, y)          BN_ucmp(x, y) >= 1 ? 1 : 0
#define pq_64bit_eq(x, y)          BN_ucmp(x, y) == 0 ? 1 : 0
#define pq_64bit_add_word(x, w)    BN_add_word(x, w)
#define pq_64bit_sub(r, x, y)      BN_sub(r, x, y)
#define pq_64bit_sub_word(x, w)    BN_sub_word(x, w)
#define pq_64bit_mod(r, x, n, ctx) BN_mod(r, x, n, ctx)

#define pq_64bit_bin2num(bn, bytes, len)   BN_bin2bn(bytes, len, bn)
#define pq_64bit_num2bin(bn, bytes)        BN_bn2bin(bn, bytes)
#define pq_64bit_get_word(x)               BN_get_word(x)
#define pq_64bit_is_bit_set(x, offset)     BN_is_bit_set(x, offset)
#define pq_64bit_lshift(r, x, shift)       BN_lshift(r, x, shift)
#define pq_64bit_set_bit(x, num)           BN_set_bit(x, num)
#define pq_64bit_get_length(x)             BN_num_bits((x))

#else

#define PQ_64BIT_IS_INTEGER 1
#define PQ_64BIT_IS_BIGNUM 0

#if defined(SIXTY_FOUR_BIT)
#define PQ_64BIT BN_ULONG
#define PQ_64BIT_PRINT "%lld"
#elif defined(SIXTY_FOUR_BIT_LONG)
#define PQ_64BIT BN_ULONG
#define PQ_64BIT_PRINT "%ld"
#elif defined(THIRTY_TWO_BIT)
#define PQ_64BIT BN_ULLONG
#define PQ_64BIT_PRINT "%lld"
#endif

#define PQ_64BIT_CTX      void

#define pq_64bit_init(x)
#define pq_64bit_free(x)
#define pq_64bit_ctx_new(ctx)        (ctx)
#define pq_64bit_ctx_free(x)

#define pq_64bit_assign(x, y)        (*(x) = *(y))
#define pq_64bit_assign_word(x, y)   (*(x) = y)
#define pq_64bit_gt(x, y)	         (*(x) > *(y))
#define pq_64bit_eq(x, y)            (*(x) == *(y))
#define pq_64bit_add_word(x, w)      (*(x) = (*(x) + (w)))
#define pq_64bit_sub(r, x, y)        (*(r) = (*(x) - *(y)))
#define pq_64bit_sub_word(x, w)      (*(x) = (*(x) - (w)))
#define pq_64bit_mod(r, x, n, ctx)

#define pq_64bit_bin2num(num, bytes, len) bytes_to_long_long(bytes, num)
#define pq_64bit_num2bin(num, bytes)      long_long_to_bytes(num, bytes)
#define pq_64bit_get_word(x)              *(x)
#define pq_64bit_lshift(r, x, shift)      (*(r) = (*(x) << (shift)))
#define pq_64bit_set_bit(x, num)          do { \
                                              PQ_64BIT mask = 1; \
                                              mask = mask << (num); \
                                              *(x) |= mask; \
                                          } while(0)
#endif /* OPENSSL_SYS_VMS */

#endif
xmail-1.27/win32ssl/include/openssl/pkcs12.h0000755000175000017500000003060311341640430020076 0ustar  davidedavide/* pkcs12.h */
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
 * project 1999.
 */
/* ====================================================================
 * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    licensing@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

#ifndef HEADER_PKCS12_H
#define HEADER_PKCS12_H

#include 
#include 

#ifdef __cplusplus
extern "C" {
#endif

#define PKCS12_KEY_ID	1
#define PKCS12_IV_ID	2
#define PKCS12_MAC_ID	3

/* Default iteration count */
#ifndef PKCS12_DEFAULT_ITER
#define PKCS12_DEFAULT_ITER	PKCS5_DEFAULT_ITER
#endif

#define PKCS12_MAC_KEY_LENGTH 20

#define PKCS12_SALT_LEN	8

/* Uncomment out next line for unicode password and names, otherwise ASCII */

/*#define PBE_UNICODE*/

#ifdef PBE_UNICODE
#define PKCS12_key_gen PKCS12_key_gen_uni
#define PKCS12_add_friendlyname PKCS12_add_friendlyname_uni
#else
#define PKCS12_key_gen PKCS12_key_gen_asc
#define PKCS12_add_friendlyname PKCS12_add_friendlyname_asc
#endif

/* MS key usage constants */

#define KEY_EX	0x10
#define KEY_SIG 0x80

typedef struct {
X509_SIG *dinfo;
ASN1_OCTET_STRING *salt;
ASN1_INTEGER *iter;	/* defaults to 1 */
} PKCS12_MAC_DATA;

typedef struct {
ASN1_INTEGER *version;
PKCS12_MAC_DATA *mac;
PKCS7 *authsafes;
} PKCS12;

PREDECLARE_STACK_OF(PKCS12_SAFEBAG)

typedef struct {
ASN1_OBJECT *type;
union {
	struct pkcs12_bag_st *bag; /* secret, crl and certbag */
	struct pkcs8_priv_key_info_st	*keybag; /* keybag */
	X509_SIG *shkeybag; /* shrouded key bag */
	STACK_OF(PKCS12_SAFEBAG) *safes;
	ASN1_TYPE *other;
}value;
STACK_OF(X509_ATTRIBUTE) *attrib;
} PKCS12_SAFEBAG;

DECLARE_STACK_OF(PKCS12_SAFEBAG)
DECLARE_ASN1_SET_OF(PKCS12_SAFEBAG)
DECLARE_PKCS12_STACK_OF(PKCS12_SAFEBAG)

typedef struct pkcs12_bag_st {
ASN1_OBJECT *type;
union {
	ASN1_OCTET_STRING *x509cert;
	ASN1_OCTET_STRING *x509crl;
	ASN1_OCTET_STRING *octet;
	ASN1_IA5STRING *sdsicert;
	ASN1_TYPE *other; /* Secret or other bag */
}value;
} PKCS12_BAGS;

#define PKCS12_ERROR	0
#define PKCS12_OK	1

/* Compatibility macros */

#define M_PKCS12_x5092certbag PKCS12_x5092certbag
#define M_PKCS12_x509crl2certbag PKCS12_x509crl2certbag

#define M_PKCS12_certbag2x509 PKCS12_certbag2x509
#define M_PKCS12_certbag2x509crl PKCS12_certbag2x509crl 

#define M_PKCS12_unpack_p7data PKCS12_unpack_p7data
#define M_PKCS12_pack_authsafes PKCS12_pack_authsafes
#define M_PKCS12_unpack_authsafes PKCS12_unpack_authsafes
#define M_PKCS12_unpack_p7encdata PKCS12_unpack_p7encdata

#define M_PKCS12_decrypt_skey PKCS12_decrypt_skey
#define M_PKCS8_decrypt PKCS8_decrypt

#define M_PKCS12_bag_type(bg) OBJ_obj2nid((bg)->type)
#define M_PKCS12_cert_bag_type(bg) OBJ_obj2nid((bg)->value.bag->type)
#define M_PKCS12_crl_bag_type M_PKCS12_cert_bag_type

#define PKCS12_get_attr(bag, attr_nid) \
			 PKCS12_get_attr_gen(bag->attrib, attr_nid)

#define PKCS8_get_attr(p8, attr_nid) \
		PKCS12_get_attr_gen(p8->attributes, attr_nid)

#define PKCS12_mac_present(p12) ((p12)->mac ? 1 : 0)


PKCS12_SAFEBAG *PKCS12_x5092certbag(X509 *x509);
PKCS12_SAFEBAG *PKCS12_x509crl2certbag(X509_CRL *crl);
X509 *PKCS12_certbag2x509(PKCS12_SAFEBAG *bag);
X509_CRL *PKCS12_certbag2x509crl(PKCS12_SAFEBAG *bag);

PKCS12_SAFEBAG *PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it, int nid1,
	     int nid2);
PKCS12_SAFEBAG *PKCS12_MAKE_KEYBAG(PKCS8_PRIV_KEY_INFO *p8);
PKCS8_PRIV_KEY_INFO *PKCS8_decrypt(X509_SIG *p8, const char *pass, int passlen);
PKCS8_PRIV_KEY_INFO *PKCS12_decrypt_skey(PKCS12_SAFEBAG *bag, const char *pass,
								int passlen);
X509_SIG *PKCS8_encrypt(int pbe_nid, const EVP_CIPHER *cipher, 
			const char *pass, int passlen,
			unsigned char *salt, int saltlen, int iter,
			PKCS8_PRIV_KEY_INFO *p8);
PKCS12_SAFEBAG *PKCS12_MAKE_SHKEYBAG(int pbe_nid, const char *pass,
				     int passlen, unsigned char *salt,
				     int saltlen, int iter,
				     PKCS8_PRIV_KEY_INFO *p8);
PKCS7 *PKCS12_pack_p7data(STACK_OF(PKCS12_SAFEBAG) *sk);
STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7data(PKCS7 *p7);
PKCS7 *PKCS12_pack_p7encdata(int pbe_nid, const char *pass, int passlen,
			     unsigned char *salt, int saltlen, int iter,
			     STACK_OF(PKCS12_SAFEBAG) *bags);
STACK_OF(PKCS12_SAFEBAG) *PKCS12_unpack_p7encdata(PKCS7 *p7, const char *pass, int passlen);

int PKCS12_pack_authsafes(PKCS12 *p12, STACK_OF(PKCS7) *safes);
STACK_OF(PKCS7) *PKCS12_unpack_authsafes(PKCS12 *p12);

int PKCS12_add_localkeyid(PKCS12_SAFEBAG *bag, unsigned char *name, int namelen);
int PKCS12_add_friendlyname_asc(PKCS12_SAFEBAG *bag, const char *name,
				int namelen);
int PKCS12_add_CSPName_asc(PKCS12_SAFEBAG *bag, const char *name,
				int namelen);
int PKCS12_add_friendlyname_uni(PKCS12_SAFEBAG *bag, const unsigned char *name,
				int namelen);
int PKCS8_add_keyusage(PKCS8_PRIV_KEY_INFO *p8, int usage);
ASN1_TYPE *PKCS12_get_attr_gen(STACK_OF(X509_ATTRIBUTE) *attrs, int attr_nid);
char *PKCS12_get_friendlyname(PKCS12_SAFEBAG *bag);
unsigned char *PKCS12_pbe_crypt(X509_ALGOR *algor, const char *pass,
				int passlen, unsigned char *in, int inlen,
				unsigned char **data, int *datalen, int en_de);
void * PKCS12_item_decrypt_d2i(X509_ALGOR *algor, const ASN1_ITEM *it,
	     const char *pass, int passlen, ASN1_OCTET_STRING *oct, int zbuf);
ASN1_OCTET_STRING *PKCS12_item_i2d_encrypt(X509_ALGOR *algor, const ASN1_ITEM *it,
				       const char *pass, int passlen,
				       void *obj, int zbuf);
PKCS12 *PKCS12_init(int mode);
int PKCS12_key_gen_asc(const char *pass, int passlen, unsigned char *salt,
		       int saltlen, int id, int iter, int n,
		       unsigned char *out, const EVP_MD *md_type);
int PKCS12_key_gen_uni(unsigned char *pass, int passlen, unsigned char *salt, int saltlen, int id, int iter, int n, unsigned char *out, const EVP_MD *md_type);
int PKCS12_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen,
			 ASN1_TYPE *param, const EVP_CIPHER *cipher, const EVP_MD *md_type,
			 int en_de);
int PKCS12_gen_mac(PKCS12 *p12, const char *pass, int passlen,
			 unsigned char *mac, unsigned int *maclen);
int PKCS12_verify_mac(PKCS12 *p12, const char *pass, int passlen);
int PKCS12_set_mac(PKCS12 *p12, const char *pass, int passlen,
		   unsigned char *salt, int saltlen, int iter,
		   const EVP_MD *md_type);
int PKCS12_setup_mac(PKCS12 *p12, int iter, unsigned char *salt,
					 int saltlen, const EVP_MD *md_type);
unsigned char *asc2uni(const char *asc, int asclen, unsigned char **uni, int *unilen);
char *uni2asc(unsigned char *uni, int unilen);

DECLARE_ASN1_FUNCTIONS(PKCS12)
DECLARE_ASN1_FUNCTIONS(PKCS12_MAC_DATA)
DECLARE_ASN1_FUNCTIONS(PKCS12_SAFEBAG)
DECLARE_ASN1_FUNCTIONS(PKCS12_BAGS)

DECLARE_ASN1_ITEM(PKCS12_SAFEBAGS)
DECLARE_ASN1_ITEM(PKCS12_AUTHSAFES)

void PKCS12_PBE_add(void);
int PKCS12_parse(PKCS12 *p12, const char *pass, EVP_PKEY **pkey, X509 **cert,
		 STACK_OF(X509) **ca);
PKCS12 *PKCS12_create(char *pass, char *name, EVP_PKEY *pkey, X509 *cert,
			 STACK_OF(X509) *ca, int nid_key, int nid_cert, int iter,
						 int mac_iter, int keytype);

PKCS12_SAFEBAG *PKCS12_add_cert(STACK_OF(PKCS12_SAFEBAG) **pbags, X509 *cert);
PKCS12_SAFEBAG *PKCS12_add_key(STACK_OF(PKCS12_SAFEBAG) **pbags, EVP_PKEY *key,
						int key_usage, int iter,
						int key_nid, char *pass);
int PKCS12_add_safe(STACK_OF(PKCS7) **psafes, STACK_OF(PKCS12_SAFEBAG) *bags,
					int safe_nid, int iter, char *pass);
PKCS12 *PKCS12_add_safes(STACK_OF(PKCS7) *safes, int p7_nid);

int i2d_PKCS12_bio(BIO *bp, PKCS12 *p12);
int i2d_PKCS12_fp(FILE *fp, PKCS12 *p12);
PKCS12 *d2i_PKCS12_bio(BIO *bp, PKCS12 **p12);
PKCS12 *d2i_PKCS12_fp(FILE *fp, PKCS12 **p12);
int PKCS12_newpass(PKCS12 *p12, char *oldpass, char *newpass);

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_PKCS12_strings(void);

/* Error codes for the PKCS12 functions. */

/* Function codes. */
#define PKCS12_F_PARSE_BAG				 129
#define PKCS12_F_PARSE_BAGS				 103
#define PKCS12_F_PKCS12_ADD_FRIENDLYNAME		 100
#define PKCS12_F_PKCS12_ADD_FRIENDLYNAME_ASC		 127
#define PKCS12_F_PKCS12_ADD_FRIENDLYNAME_UNI		 102
#define PKCS12_F_PKCS12_ADD_LOCALKEYID			 104
#define PKCS12_F_PKCS12_CREATE				 105
#define PKCS12_F_PKCS12_GEN_MAC				 107
#define PKCS12_F_PKCS12_INIT				 109
#define PKCS12_F_PKCS12_ITEM_DECRYPT_D2I		 106
#define PKCS12_F_PKCS12_ITEM_I2D_ENCRYPT		 108
#define PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG		 117
#define PKCS12_F_PKCS12_KEY_GEN_ASC			 110
#define PKCS12_F_PKCS12_KEY_GEN_UNI			 111
#define PKCS12_F_PKCS12_MAKE_KEYBAG			 112
#define PKCS12_F_PKCS12_MAKE_SHKEYBAG			 113
#define PKCS12_F_PKCS12_NEWPASS				 128
#define PKCS12_F_PKCS12_PACK_P7DATA			 114
#define PKCS12_F_PKCS12_PACK_P7ENCDATA			 115
#define PKCS12_F_PKCS12_PARSE				 118
#define PKCS12_F_PKCS12_PBE_CRYPT			 119
#define PKCS12_F_PKCS12_PBE_KEYIVGEN			 120
#define PKCS12_F_PKCS12_SETUP_MAC			 122
#define PKCS12_F_PKCS12_SET_MAC				 123
#define PKCS12_F_PKCS12_UNPACK_AUTHSAFES		 130
#define PKCS12_F_PKCS12_UNPACK_P7DATA			 131
#define PKCS12_F_PKCS12_VERIFY_MAC			 126
#define PKCS12_F_PKCS8_ADD_KEYUSAGE			 124
#define PKCS12_F_PKCS8_ENCRYPT				 125

/* Reason codes. */
#define PKCS12_R_CANT_PACK_STRUCTURE			 100
#define PKCS12_R_CONTENT_TYPE_NOT_DATA			 121
#define PKCS12_R_DECODE_ERROR				 101
#define PKCS12_R_ENCODE_ERROR				 102
#define PKCS12_R_ENCRYPT_ERROR				 103
#define PKCS12_R_ERROR_SETTING_ENCRYPTED_DATA_TYPE	 120
#define PKCS12_R_INVALID_NULL_ARGUMENT			 104
#define PKCS12_R_INVALID_NULL_PKCS12_POINTER		 105
#define PKCS12_R_IV_GEN_ERROR				 106
#define PKCS12_R_KEY_GEN_ERROR				 107
#define PKCS12_R_MAC_ABSENT				 108
#define PKCS12_R_MAC_GENERATION_ERROR			 109
#define PKCS12_R_MAC_SETUP_ERROR			 110
#define PKCS12_R_MAC_STRING_SET_ERROR			 111
#define PKCS12_R_MAC_VERIFY_ERROR			 112
#define PKCS12_R_MAC_VERIFY_FAILURE			 113
#define PKCS12_R_PARSE_ERROR				 114
#define PKCS12_R_PKCS12_ALGOR_CIPHERINIT_ERROR		 115
#define PKCS12_R_PKCS12_CIPHERFINAL_ERROR		 116
#define PKCS12_R_PKCS12_PBE_CRYPT_ERROR			 117
#define PKCS12_R_UNKNOWN_DIGEST_ALGORITHM		 118
#define PKCS12_R_UNSUPPORTED_PKCS12_MODE		 119

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/evp.h0000755000175000017500000011335211341640430017570 0ustar  davidedavide/* crypto/evp/evp.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_ENVELOPE_H
#define HEADER_ENVELOPE_H

#ifdef OPENSSL_ALGORITHM_DEFINES
# include 
#else
# define OPENSSL_ALGORITHM_DEFINES
# include 
# undef OPENSSL_ALGORITHM_DEFINES
#endif

#include 

#include 

#ifndef OPENSSL_NO_BIO
#include 
#endif

#ifdef OPENSSL_FIPS
#include 
#endif

/*
#define EVP_RC2_KEY_SIZE		16
#define EVP_RC4_KEY_SIZE		16
#define EVP_BLOWFISH_KEY_SIZE		16
#define EVP_CAST5_KEY_SIZE		16
#define EVP_RC5_32_12_16_KEY_SIZE	16
*/
#define EVP_MAX_MD_SIZE			64	/* longest known is SHA512 */
#define EVP_MAX_KEY_LENGTH		32
#define EVP_MAX_IV_LENGTH		16
#define EVP_MAX_BLOCK_LENGTH		32

#define PKCS5_SALT_LEN			8
/* Default PKCS#5 iteration count */
#define PKCS5_DEFAULT_ITER		2048

#include 

#define EVP_PK_RSA	0x0001
#define EVP_PK_DSA	0x0002
#define EVP_PK_DH	0x0004
#define EVP_PK_EC	0x0008
#define EVP_PKT_SIGN	0x0010
#define EVP_PKT_ENC	0x0020
#define EVP_PKT_EXCH	0x0040
#define EVP_PKS_RSA	0x0100
#define EVP_PKS_DSA	0x0200
#define EVP_PKS_EC	0x0400
#define EVP_PKT_EXP	0x1000 /* <= 512 bit key */

#define EVP_PKEY_NONE	NID_undef
#define EVP_PKEY_RSA	NID_rsaEncryption
#define EVP_PKEY_RSA2	NID_rsa
#define EVP_PKEY_DSA	NID_dsa
#define EVP_PKEY_DSA1	NID_dsa_2
#define EVP_PKEY_DSA2	NID_dsaWithSHA
#define EVP_PKEY_DSA3	NID_dsaWithSHA1
#define EVP_PKEY_DSA4	NID_dsaWithSHA1_2
#define EVP_PKEY_DH	NID_dhKeyAgreement
#define EVP_PKEY_EC	NID_X9_62_id_ecPublicKey

#ifdef	__cplusplus
extern "C" {
#endif

/* Type needs to be a bit field
 * Sub-type needs to be for variations on the method, as in, can it do
 * arbitrary encryption.... */
struct evp_pkey_st
	{
	int type;
	int save_type;
	int references;
	union	{
		char *ptr;
#ifndef OPENSSL_NO_RSA
		struct rsa_st *rsa;	/* RSA */
#endif
#ifndef OPENSSL_NO_DSA
		struct dsa_st *dsa;	/* DSA */
#endif
#ifndef OPENSSL_NO_DH
		struct dh_st *dh;	/* DH */
#endif
#ifndef OPENSSL_NO_EC
		struct ec_key_st *ec;	/* ECC */
#endif
		} pkey;
	int save_parameters;
	STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */
	} /* EVP_PKEY */;

#define EVP_PKEY_MO_SIGN	0x0001
#define EVP_PKEY_MO_VERIFY	0x0002
#define EVP_PKEY_MO_ENCRYPT	0x0004
#define EVP_PKEY_MO_DECRYPT	0x0008

#if 0
/* This structure is required to tie the message digest and signing together.
 * The lookup can be done by md/pkey_method, oid, oid/pkey_method, or
 * oid, md and pkey.
 * This is required because for various smart-card perform the digest and
 * signing/verification on-board.  To handle this case, the specific
 * EVP_MD and EVP_PKEY_METHODs need to be closely associated.
 * When a PKEY is created, it will have a EVP_PKEY_METHOD associated with it.
 * This can either be software or a token to provide the required low level
 * routines.
 */
typedef struct evp_pkey_md_st
	{
	int oid;
	EVP_MD *md;
	EVP_PKEY_METHOD *pkey;
	} EVP_PKEY_MD;

#define EVP_rsa_md2() \
		EVP_PKEY_MD_add(NID_md2WithRSAEncryption,\
			EVP_rsa_pkcs1(),EVP_md2())
#define EVP_rsa_md5() \
		EVP_PKEY_MD_add(NID_md5WithRSAEncryption,\
			EVP_rsa_pkcs1(),EVP_md5())
#define EVP_rsa_sha0() \
		EVP_PKEY_MD_add(NID_shaWithRSAEncryption,\
			EVP_rsa_pkcs1(),EVP_sha())
#define EVP_rsa_sha1() \
		EVP_PKEY_MD_add(NID_sha1WithRSAEncryption,\
			EVP_rsa_pkcs1(),EVP_sha1())
#define EVP_rsa_ripemd160() \
		EVP_PKEY_MD_add(NID_ripemd160WithRSA,\
			EVP_rsa_pkcs1(),EVP_ripemd160())
#define EVP_rsa_mdc2() \
		EVP_PKEY_MD_add(NID_mdc2WithRSA,\
			EVP_rsa_octet_string(),EVP_mdc2())
#define EVP_dsa_sha() \
		EVP_PKEY_MD_add(NID_dsaWithSHA,\
			EVP_dsa(),EVP_sha())
#define EVP_dsa_sha1() \
		EVP_PKEY_MD_add(NID_dsaWithSHA1,\
			EVP_dsa(),EVP_sha1())

typedef struct evp_pkey_method_st
	{
	char *name;
	int flags;
	int type;		/* RSA, DSA, an SSLeay specific constant */
	int oid;		/* For the pub-key type */
	int encrypt_oid;	/* pub/priv key encryption */

	int (*sign)();
	int (*verify)();
	struct	{
		int (*set)();	/* get and/or set the underlying type */
		int (*get)();
		int (*encrypt)();
		int (*decrypt)();
		int (*i2d)();
		int (*d2i)();
		int (*dup)();
		} pub,priv;
	int (*set_asn1_parameters)();
	int (*get_asn1_parameters)();
	} EVP_PKEY_METHOD;
#endif

#ifndef EVP_MD
struct env_md_st
	{
	int type;
	int pkey_type;
	int md_size;
	unsigned long flags;
	int (*init)(EVP_MD_CTX *ctx);
	int (*update)(EVP_MD_CTX *ctx,const void *data,size_t count);
	int (*final)(EVP_MD_CTX *ctx,unsigned char *md);
	int (*copy)(EVP_MD_CTX *to,const EVP_MD_CTX *from);
	int (*cleanup)(EVP_MD_CTX *ctx);

	/* FIXME: prototype these some day */
	int (*sign)(int type, const unsigned char *m, unsigned int m_length,
		    unsigned char *sigret, unsigned int *siglen, void *key);
	int (*verify)(int type, const unsigned char *m, unsigned int m_length,
		      const unsigned char *sigbuf, unsigned int siglen,
		      void *key);
	int required_pkey_type[5]; /*EVP_PKEY_xxx */
	int block_size;
	int ctx_size; /* how big does the ctx->md_data need to be */
	} /* EVP_MD */;

typedef int evp_sign_method(int type,const unsigned char *m,
			    unsigned int m_length,unsigned char *sigret,
			    unsigned int *siglen, void *key);
typedef int evp_verify_method(int type,const unsigned char *m,
			    unsigned int m_length,const unsigned char *sigbuf,
			    unsigned int siglen, void *key);

typedef struct
	{
	EVP_MD_CTX *mctx;
	void *key;
	} EVP_MD_SVCTX;

#define EVP_MD_FLAG_ONESHOT	0x0001 /* digest can only handle a single
					* block */

#define EVP_MD_FLAG_FIPS	0x0400 /* Note if suitable for use in FIPS mode */

#define EVP_MD_FLAG_SVCTX	0x0800 /* pass EVP_MD_SVCTX to sign/verify */

#define EVP_PKEY_NULL_method	NULL,NULL,{0,0,0,0}

#ifndef OPENSSL_NO_DSA
#define EVP_PKEY_DSA_method	(evp_sign_method *)DSA_sign, \
				(evp_verify_method *)DSA_verify, \
				{EVP_PKEY_DSA,EVP_PKEY_DSA2,EVP_PKEY_DSA3, \
					EVP_PKEY_DSA4,0}
#else
#define EVP_PKEY_DSA_method	EVP_PKEY_NULL_method
#endif

#ifndef OPENSSL_NO_ECDSA
#define EVP_PKEY_ECDSA_method   (evp_sign_method *)ECDSA_sign, \
				(evp_verify_method *)ECDSA_verify, \
                                 {EVP_PKEY_EC,0,0,0}
#else   
#define EVP_PKEY_ECDSA_method   EVP_PKEY_NULL_method
#endif

#ifndef OPENSSL_NO_RSA
#define EVP_PKEY_RSA_method	(evp_sign_method *)RSA_sign, \
				(evp_verify_method *)RSA_verify, \
				{EVP_PKEY_RSA,EVP_PKEY_RSA2,0,0}
#define EVP_PKEY_RSA_ASN1_OCTET_STRING_method \
				(evp_sign_method *)RSA_sign_ASN1_OCTET_STRING, \
				(evp_verify_method *)RSA_verify_ASN1_OCTET_STRING, \
				{EVP_PKEY_RSA,EVP_PKEY_RSA2,0,0}
#else
#define EVP_PKEY_RSA_method	EVP_PKEY_NULL_method
#define EVP_PKEY_RSA_ASN1_OCTET_STRING_method EVP_PKEY_NULL_method
#endif

#endif /* !EVP_MD */

struct env_md_ctx_st
	{
	const EVP_MD *digest;
	ENGINE *engine; /* functional reference if 'digest' is ENGINE-provided */
	unsigned long flags;
	void *md_data;
	} /* EVP_MD_CTX */;

/* values for EVP_MD_CTX flags */

#define EVP_MD_CTX_FLAG_ONESHOT		0x0001 /* digest update will be called
						* once only */
#define EVP_MD_CTX_FLAG_CLEANED		0x0002 /* context has already been
						* cleaned */
#define EVP_MD_CTX_FLAG_REUSE		0x0004 /* Don't free up ctx->md_data
						* in EVP_MD_CTX_cleanup */
#define EVP_MD_CTX_FLAG_NON_FIPS_ALLOW	0x0008	/* Allow use of non FIPS digest
						 * in FIPS mode */

#define EVP_MD_CTX_FLAG_PAD_MASK	0xF0	/* RSA mode to use */
#define EVP_MD_CTX_FLAG_PAD_PKCS1	0x00	/* PKCS#1 v1.5 mode */
#define EVP_MD_CTX_FLAG_PAD_X931	0x10	/* X9.31 mode */
#define EVP_MD_CTX_FLAG_PAD_PSS		0x20	/* PSS mode */
#define M_EVP_MD_CTX_FLAG_PSS_SALT(ctx) \
		((ctx->flags>>16) &0xFFFF) /* seed length */
#define EVP_MD_CTX_FLAG_PSS_MDLEN	0xFFFF	/* salt len same as digest */
#define EVP_MD_CTX_FLAG_PSS_MREC	0xFFFE	/* salt max or auto recovered */

struct evp_cipher_st
	{
	int nid;
	int block_size;
	int key_len;		/* Default value for variable length ciphers */
	int iv_len;
	unsigned long flags;	/* Various flags */
	int (*init)(EVP_CIPHER_CTX *ctx, const unsigned char *key,
		    const unsigned char *iv, int enc);	/* init key */
	int (*do_cipher)(EVP_CIPHER_CTX *ctx, unsigned char *out,
			 const unsigned char *in, unsigned int inl);/* encrypt/decrypt data */
	int (*cleanup)(EVP_CIPHER_CTX *); /* cleanup ctx */
	int ctx_size;		/* how big ctx->cipher_data needs to be */
	int (*set_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *); /* Populate a ASN1_TYPE with parameters */
	int (*get_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *); /* Get parameters from a ASN1_TYPE */
	int (*ctrl)(EVP_CIPHER_CTX *, int type, int arg, void *ptr); /* Miscellaneous operations */
	void *app_data;		/* Application data */
	} /* EVP_CIPHER */;

/* Values for cipher flags */

/* Modes for ciphers */

#define		EVP_CIPH_STREAM_CIPHER		0x0
#define		EVP_CIPH_ECB_MODE		0x1
#define		EVP_CIPH_CBC_MODE		0x2
#define		EVP_CIPH_CFB_MODE		0x3
#define		EVP_CIPH_OFB_MODE		0x4
#define 	EVP_CIPH_MODE			0x7
/* Set if variable length cipher */
#define 	EVP_CIPH_VARIABLE_LENGTH	0x8
/* Set if the iv handling should be done by the cipher itself */
#define 	EVP_CIPH_CUSTOM_IV		0x10
/* Set if the cipher's init() function should be called if key is NULL */
#define 	EVP_CIPH_ALWAYS_CALL_INIT	0x20
/* Call ctrl() to init cipher parameters */
#define 	EVP_CIPH_CTRL_INIT		0x40
/* Don't use standard key length function */
#define 	EVP_CIPH_CUSTOM_KEY_LENGTH	0x80
/* Don't use standard block padding */
#define 	EVP_CIPH_NO_PADDING		0x100
/* cipher handles random key generation */
#define 	EVP_CIPH_RAND_KEY		0x200
/* Note if suitable for use in FIPS mode */
#define		EVP_CIPH_FLAG_FIPS		0x400
/* Allow non FIPS cipher in FIPS mode */
#define		EVP_CIPH_FLAG_NON_FIPS_ALLOW	0x800
/* Allow use default ASN1 get/set iv */
#define		EVP_CIPH_FLAG_DEFAULT_ASN1	0x1000
/* Buffer length in bits not bytes: CFB1 mode only */
#define		EVP_CIPH_FLAG_LENGTH_BITS	0x2000

/* ctrl() values */

#define		EVP_CTRL_INIT			0x0
#define 	EVP_CTRL_SET_KEY_LENGTH		0x1
#define 	EVP_CTRL_GET_RC2_KEY_BITS	0x2
#define 	EVP_CTRL_SET_RC2_KEY_BITS	0x3
#define 	EVP_CTRL_GET_RC5_ROUNDS		0x4
#define 	EVP_CTRL_SET_RC5_ROUNDS		0x5
#define 	EVP_CTRL_RAND_KEY		0x6

typedef struct evp_cipher_info_st
	{
	const EVP_CIPHER *cipher;
	unsigned char iv[EVP_MAX_IV_LENGTH];
	} EVP_CIPHER_INFO;

struct evp_cipher_ctx_st
	{
	const EVP_CIPHER *cipher;
	ENGINE *engine;	/* functional reference if 'cipher' is ENGINE-provided */
	int encrypt;		/* encrypt or decrypt */
	int buf_len;		/* number we have left */

	unsigned char  oiv[EVP_MAX_IV_LENGTH];	/* original iv */
	unsigned char  iv[EVP_MAX_IV_LENGTH];	/* working iv */
	unsigned char buf[EVP_MAX_BLOCK_LENGTH];/* saved partial block */
	int num;				/* used by cfb/ofb mode */

	void *app_data;		/* application stuff */
	int key_len;		/* May change for variable length cipher */
	unsigned long flags;	/* Various flags */
	void *cipher_data; /* per EVP data */
	int final_used;
	int block_mask;
	unsigned char final[EVP_MAX_BLOCK_LENGTH];/* possible final block */
	} /* EVP_CIPHER_CTX */;

typedef struct evp_Encode_Ctx_st
	{
	int num;	/* number saved in a partial encode/decode */
	int length;	/* The length is either the output line length
			 * (in input bytes) or the shortest input line
			 * length that is ok.  Once decoding begins,
			 * the length is adjusted up each time a longer
			 * line is decoded */
	unsigned char enc_data[80];	/* data to encode */
	int line_num;	/* number read on current line */
	int expect_nl;
	} EVP_ENCODE_CTX;

/* Password based encryption function */
typedef int (EVP_PBE_KEYGEN)(EVP_CIPHER_CTX *ctx, const char *pass, int passlen,
		ASN1_TYPE *param, const EVP_CIPHER *cipher,
                const EVP_MD *md, int en_de);

#ifndef OPENSSL_NO_RSA
#define EVP_PKEY_assign_RSA(pkey,rsa) EVP_PKEY_assign((pkey),EVP_PKEY_RSA,\
					(char *)(rsa))
#endif

#ifndef OPENSSL_NO_DSA
#define EVP_PKEY_assign_DSA(pkey,dsa) EVP_PKEY_assign((pkey),EVP_PKEY_DSA,\
					(char *)(dsa))
#endif

#ifndef OPENSSL_NO_DH
#define EVP_PKEY_assign_DH(pkey,dh) EVP_PKEY_assign((pkey),EVP_PKEY_DH,\
					(char *)(dh))
#endif

#ifndef OPENSSL_NO_EC
#define EVP_PKEY_assign_EC_KEY(pkey,eckey) EVP_PKEY_assign((pkey),EVP_PKEY_EC,\
                                        (char *)(eckey))
#endif

/* Add some extra combinations */
#define EVP_get_digestbynid(a) EVP_get_digestbyname(OBJ_nid2sn(a))
#define EVP_get_digestbyobj(a) EVP_get_digestbynid(OBJ_obj2nid(a))
#define EVP_get_cipherbynid(a) EVP_get_cipherbyname(OBJ_nid2sn(a))
#define EVP_get_cipherbyobj(a) EVP_get_cipherbynid(OBJ_obj2nid(a))

/* Macros to reduce FIPS dependencies: do NOT use in applications */
#define M_EVP_MD_size(e)		((e)->md_size)
#define M_EVP_MD_block_size(e)		((e)->block_size)
#define M_EVP_MD_CTX_set_flags(ctx,flgs) ((ctx)->flags|=(flgs))
#define M_EVP_MD_CTX_clear_flags(ctx,flgs) ((ctx)->flags&=~(flgs))
#define M_EVP_MD_CTX_test_flags(ctx,flgs) ((ctx)->flags&(flgs))
#define M_EVP_MD_type(e)			((e)->type)
#define M_EVP_MD_CTX_type(e)		M_EVP_MD_type(M_EVP_MD_CTX_md(e))
#define M_EVP_MD_CTX_md(e)			((e)->digest)

#define M_EVP_CIPHER_CTX_set_flags(ctx,flgs) ((ctx)->flags|=(flgs))

int EVP_MD_type(const EVP_MD *md);
#define EVP_MD_nid(e)			EVP_MD_type(e)
#define EVP_MD_name(e)			OBJ_nid2sn(EVP_MD_nid(e))
int EVP_MD_pkey_type(const EVP_MD *md);	
int EVP_MD_size(const EVP_MD *md);
int EVP_MD_block_size(const EVP_MD *md);

const EVP_MD * EVP_MD_CTX_md(const EVP_MD_CTX *ctx);
#define EVP_MD_CTX_size(e)		EVP_MD_size(EVP_MD_CTX_md(e))
#define EVP_MD_CTX_block_size(e)	EVP_MD_block_size(EVP_MD_CTX_md(e))
#define EVP_MD_CTX_type(e)		EVP_MD_type(EVP_MD_CTX_md(e))

int EVP_CIPHER_nid(const EVP_CIPHER *cipher);
#define EVP_CIPHER_name(e)		OBJ_nid2sn(EVP_CIPHER_nid(e))
int EVP_CIPHER_block_size(const EVP_CIPHER *cipher);
int EVP_CIPHER_key_length(const EVP_CIPHER *cipher);
int EVP_CIPHER_iv_length(const EVP_CIPHER *cipher);
unsigned long EVP_CIPHER_flags(const EVP_CIPHER *cipher);
#define EVP_CIPHER_mode(e)		(EVP_CIPHER_flags(e) & EVP_CIPH_MODE)

const EVP_CIPHER * EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx);
int EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx);
int EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx);
int EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx);
int EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx);
void * EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx);
void EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data);
#define EVP_CIPHER_CTX_type(c)         EVP_CIPHER_type(EVP_CIPHER_CTX_cipher(c))
unsigned long EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx);
#define EVP_CIPHER_CTX_mode(e)		(EVP_CIPHER_CTX_flags(e) & EVP_CIPH_MODE)

#define EVP_ENCODE_LENGTH(l)	(((l+2)/3*4)+(l/48+1)*2+80)
#define EVP_DECODE_LENGTH(l)	((l+3)/4*3+80)

#define EVP_SignInit_ex(a,b,c)		EVP_DigestInit_ex(a,b,c)
#define EVP_SignInit(a,b)		EVP_DigestInit(a,b)
#define EVP_SignUpdate(a,b,c)		EVP_DigestUpdate(a,b,c)
#define	EVP_VerifyInit_ex(a,b,c)	EVP_DigestInit_ex(a,b,c)
#define	EVP_VerifyInit(a,b)		EVP_DigestInit(a,b)
#define	EVP_VerifyUpdate(a,b,c)		EVP_DigestUpdate(a,b,c)
#define EVP_OpenUpdate(a,b,c,d,e)	EVP_DecryptUpdate(a,b,c,d,e)
#define EVP_SealUpdate(a,b,c,d,e)	EVP_EncryptUpdate(a,b,c,d,e)	

#ifdef CONST_STRICT
void BIO_set_md(BIO *,const EVP_MD *md);
#else
# define BIO_set_md(b,md)		BIO_ctrl(b,BIO_C_SET_MD,0,(char *)md)
#endif
#define BIO_get_md(b,mdp)		BIO_ctrl(b,BIO_C_GET_MD,0,(char *)mdp)
#define BIO_get_md_ctx(b,mdcp)     BIO_ctrl(b,BIO_C_GET_MD_CTX,0,(char *)mdcp)
#define BIO_set_md_ctx(b,mdcp)     BIO_ctrl(b,BIO_C_SET_MD_CTX,0,(char *)mdcp)
#define BIO_get_cipher_status(b)	BIO_ctrl(b,BIO_C_GET_CIPHER_STATUS,0,NULL)
#define BIO_get_cipher_ctx(b,c_pp)	BIO_ctrl(b,BIO_C_GET_CIPHER_CTX,0,(char *)c_pp)

int EVP_Cipher(EVP_CIPHER_CTX *c,
		unsigned char *out,
		const unsigned char *in,
		unsigned int inl);

#define EVP_add_cipher_alias(n,alias) \
	OBJ_NAME_add((alias),OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS,(n))
#define EVP_add_digest_alias(n,alias) \
	OBJ_NAME_add((alias),OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS,(n))
#define EVP_delete_cipher_alias(alias) \
	OBJ_NAME_remove(alias,OBJ_NAME_TYPE_CIPHER_METH|OBJ_NAME_ALIAS);
#define EVP_delete_digest_alias(alias) \
	OBJ_NAME_remove(alias,OBJ_NAME_TYPE_MD_METH|OBJ_NAME_ALIAS);

void	EVP_MD_CTX_init(EVP_MD_CTX *ctx);
int	EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx);
EVP_MD_CTX *EVP_MD_CTX_create(void);
void	EVP_MD_CTX_destroy(EVP_MD_CTX *ctx);
int     EVP_MD_CTX_copy_ex(EVP_MD_CTX *out,const EVP_MD_CTX *in);  
void	EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags);
void	EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags);
int 	EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx,int flags);
int	EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl);
int	EVP_DigestUpdate(EVP_MD_CTX *ctx,const void *d,
			 size_t cnt);
int	EVP_DigestFinal_ex(EVP_MD_CTX *ctx,unsigned char *md,unsigned int *s);
int	EVP_Digest(const void *data, size_t count,
		unsigned char *md, unsigned int *size, const EVP_MD *type, ENGINE *impl);

int     EVP_MD_CTX_copy(EVP_MD_CTX *out,const EVP_MD_CTX *in);  
int	EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type);
int	EVP_DigestFinal(EVP_MD_CTX *ctx,unsigned char *md,unsigned int *s);

int	EVP_read_pw_string(char *buf,int length,const char *prompt,int verify);
void	EVP_set_pw_prompt(const char *prompt);
char *	EVP_get_pw_prompt(void);

int	EVP_BytesToKey(const EVP_CIPHER *type,const EVP_MD *md,
		const unsigned char *salt, const unsigned char *data,
		int datal, int count, unsigned char *key,unsigned char *iv);

void	EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags);
void	EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags);
int 	EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx,int flags);

int	EVP_EncryptInit(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher,
		const unsigned char *key, const unsigned char *iv);
int	EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, ENGINE *impl,
		const unsigned char *key, const unsigned char *iv);
int	EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,
		int *outl, const unsigned char *in, int inl);
int	EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl);
int	EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl);

int	EVP_DecryptInit(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher,
		const unsigned char *key, const unsigned char *iv);
int	EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, ENGINE *impl,
		const unsigned char *key, const unsigned char *iv);
int	EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,
		int *outl, const unsigned char *in, int inl);
int	EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl);
int	EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl);

int	EVP_CipherInit(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher,
		       const unsigned char *key,const unsigned char *iv,
		       int enc);
int	EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, ENGINE *impl,
		       const unsigned char *key,const unsigned char *iv,
		       int enc);
int	EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,
		int *outl, const unsigned char *in, int inl);
int	EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl);
int	EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl);

int	EVP_SignFinal(EVP_MD_CTX *ctx,unsigned char *md,unsigned int *s,
		EVP_PKEY *pkey);

int	EVP_VerifyFinal(EVP_MD_CTX *ctx,const unsigned char *sigbuf,
		unsigned int siglen,EVP_PKEY *pkey);

int	EVP_OpenInit(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *type,
		const unsigned char *ek, int ekl, const unsigned char *iv,
		EVP_PKEY *priv);
int	EVP_OpenFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl);

int	EVP_SealInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
		 unsigned char **ek, int *ekl, unsigned char *iv,
		EVP_PKEY **pubk, int npubk);
int	EVP_SealFinal(EVP_CIPHER_CTX *ctx,unsigned char *out,int *outl);

void	EVP_EncodeInit(EVP_ENCODE_CTX *ctx);
void	EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx,unsigned char *out,int *outl,
		const unsigned char *in,int inl);
void	EVP_EncodeFinal(EVP_ENCODE_CTX *ctx,unsigned char *out,int *outl);
int	EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int n);

void	EVP_DecodeInit(EVP_ENCODE_CTX *ctx);
int	EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx,unsigned char *out,int *outl,
		const unsigned char *in, int inl);
int	EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, unsigned
		char *out, int *outl);
int	EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n);

void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *a);
int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *a);
EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void);
void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *a);
int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen);
int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *c, int pad);
int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr);
int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key);

#ifndef OPENSSL_NO_BIO
BIO_METHOD *BIO_f_md(void);
BIO_METHOD *BIO_f_base64(void);
BIO_METHOD *BIO_f_cipher(void);
BIO_METHOD *BIO_f_reliable(void);
void BIO_set_cipher(BIO *b,const EVP_CIPHER *c,const unsigned char *k,
		const unsigned char *i, int enc);
#endif

const EVP_MD *EVP_md_null(void);
#ifndef OPENSSL_NO_MD2
const EVP_MD *EVP_md2(void);
#endif
#ifndef OPENSSL_NO_MD4
const EVP_MD *EVP_md4(void);
#endif
#ifndef OPENSSL_NO_MD5
const EVP_MD *EVP_md5(void);
#endif
#ifndef OPENSSL_NO_SHA
const EVP_MD *EVP_sha(void);
const EVP_MD *EVP_sha1(void);
const EVP_MD *EVP_dss(void);
const EVP_MD *EVP_dss1(void);
const EVP_MD *EVP_ecdsa(void);
#endif
#ifndef OPENSSL_NO_SHA256
const EVP_MD *EVP_sha224(void);
const EVP_MD *EVP_sha256(void);
#endif
#ifndef OPENSSL_NO_SHA512
const EVP_MD *EVP_sha384(void);
const EVP_MD *EVP_sha512(void);
#endif
#ifndef OPENSSL_NO_MDC2
const EVP_MD *EVP_mdc2(void);
#endif
#ifndef OPENSSL_NO_RIPEMD
const EVP_MD *EVP_ripemd160(void);
#endif
const EVP_CIPHER *EVP_enc_null(void);		/* does nothing :-) */
#ifndef OPENSSL_NO_DES
const EVP_CIPHER *EVP_des_ecb(void);
const EVP_CIPHER *EVP_des_ede(void);
const EVP_CIPHER *EVP_des_ede3(void);
const EVP_CIPHER *EVP_des_ede_ecb(void);
const EVP_CIPHER *EVP_des_ede3_ecb(void);
const EVP_CIPHER *EVP_des_cfb64(void);
# define EVP_des_cfb EVP_des_cfb64
const EVP_CIPHER *EVP_des_cfb1(void);
const EVP_CIPHER *EVP_des_cfb8(void);
const EVP_CIPHER *EVP_des_ede_cfb64(void);
# define EVP_des_ede_cfb EVP_des_ede_cfb64
#if 0
const EVP_CIPHER *EVP_des_ede_cfb1(void);
const EVP_CIPHER *EVP_des_ede_cfb8(void);
#endif
const EVP_CIPHER *EVP_des_ede3_cfb64(void);
# define EVP_des_ede3_cfb EVP_des_ede3_cfb64
const EVP_CIPHER *EVP_des_ede3_cfb1(void);
const EVP_CIPHER *EVP_des_ede3_cfb8(void);
const EVP_CIPHER *EVP_des_ofb(void);
const EVP_CIPHER *EVP_des_ede_ofb(void);
const EVP_CIPHER *EVP_des_ede3_ofb(void);
const EVP_CIPHER *EVP_des_cbc(void);
const EVP_CIPHER *EVP_des_ede_cbc(void);
const EVP_CIPHER *EVP_des_ede3_cbc(void);
const EVP_CIPHER *EVP_desx_cbc(void);
/* This should now be supported through the dev_crypto ENGINE. But also, why are
 * rc4 and md5 declarations made here inside a "NO_DES" precompiler branch? */
#if 0
# ifdef OPENSSL_OPENBSD_DEV_CRYPTO
const EVP_CIPHER *EVP_dev_crypto_des_ede3_cbc(void);
const EVP_CIPHER *EVP_dev_crypto_rc4(void);
const EVP_MD *EVP_dev_crypto_md5(void);
# endif
#endif
#endif
#ifndef OPENSSL_NO_RC4
const EVP_CIPHER *EVP_rc4(void);
const EVP_CIPHER *EVP_rc4_40(void);
#endif
#ifndef OPENSSL_NO_IDEA
const EVP_CIPHER *EVP_idea_ecb(void);
const EVP_CIPHER *EVP_idea_cfb64(void);
# define EVP_idea_cfb EVP_idea_cfb64
const EVP_CIPHER *EVP_idea_ofb(void);
const EVP_CIPHER *EVP_idea_cbc(void);
#endif
#ifndef OPENSSL_NO_RC2
const EVP_CIPHER *EVP_rc2_ecb(void);
const EVP_CIPHER *EVP_rc2_cbc(void);
const EVP_CIPHER *EVP_rc2_40_cbc(void);
const EVP_CIPHER *EVP_rc2_64_cbc(void);
const EVP_CIPHER *EVP_rc2_cfb64(void);
# define EVP_rc2_cfb EVP_rc2_cfb64
const EVP_CIPHER *EVP_rc2_ofb(void);
#endif
#ifndef OPENSSL_NO_BF
const EVP_CIPHER *EVP_bf_ecb(void);
const EVP_CIPHER *EVP_bf_cbc(void);
const EVP_CIPHER *EVP_bf_cfb64(void);
# define EVP_bf_cfb EVP_bf_cfb64
const EVP_CIPHER *EVP_bf_ofb(void);
#endif
#ifndef OPENSSL_NO_CAST
const EVP_CIPHER *EVP_cast5_ecb(void);
const EVP_CIPHER *EVP_cast5_cbc(void);
const EVP_CIPHER *EVP_cast5_cfb64(void);
# define EVP_cast5_cfb EVP_cast5_cfb64
const EVP_CIPHER *EVP_cast5_ofb(void);
#endif
#ifndef OPENSSL_NO_RC5
const EVP_CIPHER *EVP_rc5_32_12_16_cbc(void);
const EVP_CIPHER *EVP_rc5_32_12_16_ecb(void);
const EVP_CIPHER *EVP_rc5_32_12_16_cfb64(void);
# define EVP_rc5_32_12_16_cfb EVP_rc5_32_12_16_cfb64
const EVP_CIPHER *EVP_rc5_32_12_16_ofb(void);
#endif
#ifndef OPENSSL_NO_AES
const EVP_CIPHER *EVP_aes_128_ecb(void);
const EVP_CIPHER *EVP_aes_128_cbc(void);
const EVP_CIPHER *EVP_aes_128_cfb1(void);
const EVP_CIPHER *EVP_aes_128_cfb8(void);
const EVP_CIPHER *EVP_aes_128_cfb128(void);
# define EVP_aes_128_cfb EVP_aes_128_cfb128
const EVP_CIPHER *EVP_aes_128_ofb(void);
#if 0
const EVP_CIPHER *EVP_aes_128_ctr(void);
#endif
const EVP_CIPHER *EVP_aes_192_ecb(void);
const EVP_CIPHER *EVP_aes_192_cbc(void);
const EVP_CIPHER *EVP_aes_192_cfb1(void);
const EVP_CIPHER *EVP_aes_192_cfb8(void);
const EVP_CIPHER *EVP_aes_192_cfb128(void);
# define EVP_aes_192_cfb EVP_aes_192_cfb128
const EVP_CIPHER *EVP_aes_192_ofb(void);
#if 0
const EVP_CIPHER *EVP_aes_192_ctr(void);
#endif
const EVP_CIPHER *EVP_aes_256_ecb(void);
const EVP_CIPHER *EVP_aes_256_cbc(void);
const EVP_CIPHER *EVP_aes_256_cfb1(void);
const EVP_CIPHER *EVP_aes_256_cfb8(void);
const EVP_CIPHER *EVP_aes_256_cfb128(void);
# define EVP_aes_256_cfb EVP_aes_256_cfb128
const EVP_CIPHER *EVP_aes_256_ofb(void);
#if 0
const EVP_CIPHER *EVP_aes_256_ctr(void);
#endif
#endif
#ifndef OPENSSL_NO_CAMELLIA
const EVP_CIPHER *EVP_camellia_128_ecb(void);
const EVP_CIPHER *EVP_camellia_128_cbc(void);
const EVP_CIPHER *EVP_camellia_128_cfb1(void);
const EVP_CIPHER *EVP_camellia_128_cfb8(void);
const EVP_CIPHER *EVP_camellia_128_cfb128(void);
# define EVP_camellia_128_cfb EVP_camellia_128_cfb128
const EVP_CIPHER *EVP_camellia_128_ofb(void);
const EVP_CIPHER *EVP_camellia_192_ecb(void);
const EVP_CIPHER *EVP_camellia_192_cbc(void);
const EVP_CIPHER *EVP_camellia_192_cfb1(void);
const EVP_CIPHER *EVP_camellia_192_cfb8(void);
const EVP_CIPHER *EVP_camellia_192_cfb128(void);
# define EVP_camellia_192_cfb EVP_camellia_192_cfb128
const EVP_CIPHER *EVP_camellia_192_ofb(void);
const EVP_CIPHER *EVP_camellia_256_ecb(void);
const EVP_CIPHER *EVP_camellia_256_cbc(void);
const EVP_CIPHER *EVP_camellia_256_cfb1(void);
const EVP_CIPHER *EVP_camellia_256_cfb8(void);
const EVP_CIPHER *EVP_camellia_256_cfb128(void);
# define EVP_camellia_256_cfb EVP_camellia_256_cfb128
const EVP_CIPHER *EVP_camellia_256_ofb(void);
#endif

#ifndef OPENSSL_NO_SEED
const EVP_CIPHER *EVP_seed_ecb(void);
const EVP_CIPHER *EVP_seed_cbc(void);
const EVP_CIPHER *EVP_seed_cfb128(void);
# define EVP_seed_cfb EVP_seed_cfb128
const EVP_CIPHER *EVP_seed_ofb(void);
#endif

void OPENSSL_add_all_algorithms_noconf(void);
void OPENSSL_add_all_algorithms_conf(void);

#ifdef OPENSSL_LOAD_CONF
#define OpenSSL_add_all_algorithms() \
		OPENSSL_add_all_algorithms_conf()
#else
#define OpenSSL_add_all_algorithms() \
		OPENSSL_add_all_algorithms_noconf()
#endif

void OpenSSL_add_all_ciphers(void);
void OpenSSL_add_all_digests(void);
#define SSLeay_add_all_algorithms() OpenSSL_add_all_algorithms()
#define SSLeay_add_all_ciphers() OpenSSL_add_all_ciphers()
#define SSLeay_add_all_digests() OpenSSL_add_all_digests()

int EVP_add_cipher(const EVP_CIPHER *cipher);
int EVP_add_digest(const EVP_MD *digest);

const EVP_CIPHER *EVP_get_cipherbyname(const char *name);
const EVP_MD *EVP_get_digestbyname(const char *name);
void EVP_cleanup(void);

int		EVP_PKEY_decrypt(unsigned char *dec_key,
			const unsigned char *enc_key,int enc_key_len,
			EVP_PKEY *private_key);
int		EVP_PKEY_encrypt(unsigned char *enc_key,
			const unsigned char *key,int key_len,
			EVP_PKEY *pub_key);
int		EVP_PKEY_type(int type);
int		EVP_PKEY_bits(EVP_PKEY *pkey);
int		EVP_PKEY_size(EVP_PKEY *pkey);
int 		EVP_PKEY_assign(EVP_PKEY *pkey,int type,char *key);

#ifndef OPENSSL_NO_RSA
struct rsa_st;
int EVP_PKEY_set1_RSA(EVP_PKEY *pkey,struct rsa_st *key);
struct rsa_st *EVP_PKEY_get1_RSA(EVP_PKEY *pkey);
#endif
#ifndef OPENSSL_NO_DSA
struct dsa_st;
int EVP_PKEY_set1_DSA(EVP_PKEY *pkey,struct dsa_st *key);
struct dsa_st *EVP_PKEY_get1_DSA(EVP_PKEY *pkey);
#endif
#ifndef OPENSSL_NO_DH
struct dh_st;
int EVP_PKEY_set1_DH(EVP_PKEY *pkey,struct dh_st *key);
struct dh_st *EVP_PKEY_get1_DH(EVP_PKEY *pkey);
#endif
#ifndef OPENSSL_NO_EC
struct ec_key_st;
int EVP_PKEY_set1_EC_KEY(EVP_PKEY *pkey,struct ec_key_st *key);
struct ec_key_st *EVP_PKEY_get1_EC_KEY(EVP_PKEY *pkey);
#endif

EVP_PKEY *	EVP_PKEY_new(void);
void		EVP_PKEY_free(EVP_PKEY *pkey);

EVP_PKEY *	d2i_PublicKey(int type,EVP_PKEY **a, const unsigned char **pp,
			long length);
int		i2d_PublicKey(EVP_PKEY *a, unsigned char **pp);

EVP_PKEY *	d2i_PrivateKey(int type,EVP_PKEY **a, const unsigned char **pp,
			long length);
EVP_PKEY *	d2i_AutoPrivateKey(EVP_PKEY **a, const unsigned char **pp,
			long length);
int		i2d_PrivateKey(EVP_PKEY *a, unsigned char **pp);

int EVP_PKEY_copy_parameters(EVP_PKEY *to, const EVP_PKEY *from);
int EVP_PKEY_missing_parameters(const EVP_PKEY *pkey);
int EVP_PKEY_save_parameters(EVP_PKEY *pkey,int mode);
int EVP_PKEY_cmp_parameters(const EVP_PKEY *a, const EVP_PKEY *b);

int EVP_PKEY_cmp(const EVP_PKEY *a, const EVP_PKEY *b);

int EVP_CIPHER_type(const EVP_CIPHER *ctx);

/* calls methods */
int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type);
int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type);

/* These are used by EVP_CIPHER methods */
int EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c,ASN1_TYPE *type);
int EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX *c,ASN1_TYPE *type);

/* PKCS5 password based encryption */
int PKCS5_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen,
			 ASN1_TYPE *param, const EVP_CIPHER *cipher, const EVP_MD *md,
			 int en_de);
int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen,
			   const unsigned char *salt, int saltlen, int iter,
			   int keylen, unsigned char *out);
int PKCS5_v2_PBE_keyivgen(EVP_CIPHER_CTX *ctx, const char *pass, int passlen,
			 ASN1_TYPE *param, const EVP_CIPHER *cipher, const EVP_MD *md,
			 int en_de);

void PKCS5_PBE_add(void);

int EVP_PBE_CipherInit (ASN1_OBJECT *pbe_obj, const char *pass, int passlen,
	     ASN1_TYPE *param, EVP_CIPHER_CTX *ctx, int en_de);
int EVP_PBE_alg_add(int nid, const EVP_CIPHER *cipher, const EVP_MD *md,
		    EVP_PBE_KEYGEN *keygen);
void EVP_PBE_cleanup(void);

#ifdef OPENSSL_FIPS
#ifndef OPENSSL_NO_ENGINE
void int_EVP_MD_set_engine_callbacks(
	int (*eng_md_init)(ENGINE *impl),
	int (*eng_md_fin)(ENGINE *impl),
	int (*eng_md_evp)
		(EVP_MD_CTX *ctx, const EVP_MD **ptype, ENGINE *impl));
void int_EVP_MD_init_engine_callbacks(void);
void int_EVP_CIPHER_set_engine_callbacks(
	int (*eng_ciph_fin)(ENGINE *impl),
	int (*eng_ciph_evp)
		(EVP_CIPHER_CTX *ctx, const EVP_CIPHER **pciph, ENGINE *impl));
void int_EVP_CIPHER_init_engine_callbacks(void);
#endif
#endif

void EVP_add_alg_module(void);

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_EVP_strings(void);

/* Error codes for the EVP functions. */

/* Function codes. */
#define EVP_F_AES_INIT_KEY				 133
#define EVP_F_ALG_MODULE_INIT				 138
#define EVP_F_CAMELLIA_INIT_KEY				 159
#define EVP_F_D2I_PKEY					 100
#define EVP_F_DO_EVP_ENC_ENGINE				 140
#define EVP_F_DO_EVP_ENC_ENGINE_FULL			 141
#define EVP_F_DO_EVP_MD_ENGINE				 139
#define EVP_F_DO_EVP_MD_ENGINE_FULL			 142
#define EVP_F_DSAPKEY2PKCS8				 134
#define EVP_F_DSA_PKEY2PKCS8				 135
#define EVP_F_ECDSA_PKEY2PKCS8				 129
#define EVP_F_ECKEY_PKEY2PKCS8				 132
#define EVP_F_EVP_CIPHERINIT				 137
#define EVP_F_EVP_CIPHERINIT_EX				 123
#define EVP_F_EVP_CIPHER_CTX_CTRL			 124
#define EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH		 122
#define EVP_F_EVP_DECRYPTFINAL_EX			 101
#define EVP_F_EVP_DIGESTINIT				 136
#define EVP_F_EVP_DIGESTINIT_EX				 128
#define EVP_F_EVP_ENCRYPTFINAL_EX			 127
#define EVP_F_EVP_MD_CTX_COPY_EX			 110
#define EVP_F_EVP_OPENINIT				 102
#define EVP_F_EVP_PBE_ALG_ADD				 115
#define EVP_F_EVP_PBE_CIPHERINIT			 116
#define EVP_F_EVP_PKCS82PKEY				 111
#define EVP_F_EVP_PKEY2PKCS8_BROKEN			 113
#define EVP_F_EVP_PKEY_COPY_PARAMETERS			 103
#define EVP_F_EVP_PKEY_DECRYPT				 104
#define EVP_F_EVP_PKEY_ENCRYPT				 105
#define EVP_F_EVP_PKEY_GET1_DH				 119
#define EVP_F_EVP_PKEY_GET1_DSA				 120
#define EVP_F_EVP_PKEY_GET1_ECDSA			 130
#define EVP_F_EVP_PKEY_GET1_EC_KEY			 131
#define EVP_F_EVP_PKEY_GET1_RSA				 121
#define EVP_F_EVP_PKEY_NEW				 106
#define EVP_F_EVP_RIJNDAEL				 126
#define EVP_F_EVP_SIGNFINAL				 107
#define EVP_F_EVP_VERIFYFINAL				 108
#define EVP_F_PKCS5_PBE_KEYIVGEN			 117
#define EVP_F_PKCS5_V2_PBE_KEYIVGEN			 118
#define EVP_F_PKCS8_SET_BROKEN				 112
#define EVP_F_RC2_MAGIC_TO_METH				 109
#define EVP_F_RC5_CTRL					 125

/* Reason codes. */
#define EVP_R_AES_KEY_SETUP_FAILED			 143
#define EVP_R_ASN1_LIB					 140
#define EVP_R_BAD_BLOCK_LENGTH				 136
#define EVP_R_BAD_DECRYPT				 100
#define EVP_R_BAD_KEY_LENGTH				 137
#define EVP_R_BN_DECODE_ERROR				 112
#define EVP_R_BN_PUBKEY_ERROR				 113
#define EVP_R_CAMELLIA_KEY_SETUP_FAILED			 157
#define EVP_R_CIPHER_PARAMETER_ERROR			 122
#define EVP_R_CTRL_NOT_IMPLEMENTED			 132
#define EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED		 133
#define EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH		 138
#define EVP_R_DECODE_ERROR				 114
#define EVP_R_DIFFERENT_KEY_TYPES			 101
#define EVP_R_DISABLED_FOR_FIPS				 144
#define EVP_R_ENCODE_ERROR				 115
#define EVP_R_ERROR_LOADING_SECTION			 145
#define EVP_R_ERROR_SETTING_FIPS_MODE			 146
#define EVP_R_EVP_PBE_CIPHERINIT_ERROR			 119
#define EVP_R_EXPECTING_AN_RSA_KEY			 127
#define EVP_R_EXPECTING_A_DH_KEY			 128
#define EVP_R_EXPECTING_A_DSA_KEY			 129
#define EVP_R_EXPECTING_A_ECDSA_KEY			 141
#define EVP_R_EXPECTING_A_EC_KEY			 142
#define EVP_R_FIPS_MODE_NOT_SUPPORTED			 147
#define EVP_R_INITIALIZATION_ERROR			 134
#define EVP_R_INPUT_NOT_INITIALIZED			 111
#define EVP_R_INVALID_FIPS_MODE				 148
#define EVP_R_INVALID_KEY_LENGTH			 130
#define EVP_R_IV_TOO_LARGE				 102
#define EVP_R_KEYGEN_FAILURE				 120
#define EVP_R_MISSING_PARAMETERS			 103
#define EVP_R_NO_CIPHER_SET				 131
#define EVP_R_NO_DIGEST_SET				 139
#define EVP_R_NO_DSA_PARAMETERS				 116
#define EVP_R_NO_SIGN_FUNCTION_CONFIGURED		 104
#define EVP_R_NO_VERIFY_FUNCTION_CONFIGURED		 105
#define EVP_R_PKCS8_UNKNOWN_BROKEN_TYPE			 117
#define EVP_R_PUBLIC_KEY_NOT_RSA			 106
#define EVP_R_UNKNOWN_OPTION				 149
#define EVP_R_UNKNOWN_PBE_ALGORITHM			 121
#define EVP_R_UNSUPORTED_NUMBER_OF_ROUNDS		 135
#define EVP_R_UNSUPPORTED_CIPHER			 107
#define EVP_R_UNSUPPORTED_KEYLENGTH			 123
#define EVP_R_UNSUPPORTED_KEY_DERIVATION_FUNCTION	 124
#define EVP_R_UNSUPPORTED_KEY_SIZE			 108
#define EVP_R_UNSUPPORTED_PRF				 125
#define EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM		 118
#define EVP_R_UNSUPPORTED_SALT_TYPE			 126
#define EVP_R_WRONG_FINAL_BLOCK_LENGTH			 109
#define EVP_R_WRONG_PUBLIC_KEY_TYPE			 110
#define EVP_R_SEED_KEY_SETUP_FAILED			 162

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/dso.h0000755000175000017500000003757411341640430017576 0ustar  davidedavide/* dso.h -*- mode:C; c-file-style: "eay" -*- */
/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
 * project 2000.
 */
/* ====================================================================
 * Copyright (c) 2000 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    licensing@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

#ifndef HEADER_DSO_H
#define HEADER_DSO_H

#include 

#ifdef __cplusplus
extern "C" {
#endif

/* These values are used as commands to DSO_ctrl() */
#define DSO_CTRL_GET_FLAGS	1
#define DSO_CTRL_SET_FLAGS	2
#define DSO_CTRL_OR_FLAGS	3

/* By default, DSO_load() will translate the provided filename into a form
 * typical for the platform (more specifically the DSO_METHOD) using the
 * dso_name_converter function of the method. Eg. win32 will transform "blah"
 * into "blah.dll", and dlfcn will transform it into "libblah.so". The
 * behaviour can be overriden by setting the name_converter callback in the DSO
 * object (using DSO_set_name_converter()). This callback could even utilise
 * the DSO_METHOD's converter too if it only wants to override behaviour for
 * one or two possible DSO methods. However, the following flag can be set in a
 * DSO to prevent *any* native name-translation at all - eg. if the caller has
 * prompted the user for a path to a driver library so the filename should be
 * interpreted as-is. */
#define DSO_FLAG_NO_NAME_TRANSLATION		0x01
/* An extra flag to give if only the extension should be added as
 * translation.  This is obviously only of importance on Unix and
 * other operating systems where the translation also may prefix
 * the name with something, like 'lib', and ignored everywhere else.
 * This flag is also ignored if DSO_FLAG_NO_NAME_TRANSLATION is used
 * at the same time. */
#define DSO_FLAG_NAME_TRANSLATION_EXT_ONLY	0x02

/* The following flag controls the translation of symbol names to upper
 * case.  This is currently only being implemented for OpenVMS.
 */
#define DSO_FLAG_UPCASE_SYMBOL			0x10

/* This flag loads the library with public symbols.
 * Meaning: The exported symbols of this library are public
 * to all libraries loaded after this library.
 * At the moment only implemented in unix.
 */
#define DSO_FLAG_GLOBAL_SYMBOLS			0x20


typedef void (*DSO_FUNC_TYPE)(void);

typedef struct dso_st DSO;

/* The function prototype used for method functions (or caller-provided
 * callbacks) that transform filenames. They are passed a DSO structure pointer
 * (or NULL if they are to be used independantly of a DSO object) and a
 * filename to transform. They should either return NULL (if there is an error
 * condition) or a newly allocated string containing the transformed form that
 * the caller will need to free with OPENSSL_free() when done. */
typedef char* (*DSO_NAME_CONVERTER_FUNC)(DSO *, const char *);
/* The function prototype used for method functions (or caller-provided
 * callbacks) that merge two file specifications. They are passed a
 * DSO structure pointer (or NULL if they are to be used independantly of
 * a DSO object) and two file specifications to merge. They should
 * either return NULL (if there is an error condition) or a newly allocated
 * string containing the result of merging that the caller will need
 * to free with OPENSSL_free() when done.
 * Here, merging means that bits and pieces are taken from each of the
 * file specifications and added together in whatever fashion that is
 * sensible for the DSO method in question.  The only rule that really
 * applies is that if the two specification contain pieces of the same
 * type, the copy from the first string takes priority.  One could see
 * it as the first specification is the one given by the user and the
 * second being a bunch of defaults to add on if they're missing in the
 * first. */
typedef char* (*DSO_MERGER_FUNC)(DSO *, const char *, const char *);

typedef struct dso_meth_st
	{
	const char *name;
	/* Loads a shared library, NB: new DSO_METHODs must ensure that a
	 * successful load populates the loaded_filename field, and likewise a
	 * successful unload OPENSSL_frees and NULLs it out. */
	int (*dso_load)(DSO *dso);
	/* Unloads a shared library */
	int (*dso_unload)(DSO *dso);
	/* Binds a variable */
	void *(*dso_bind_var)(DSO *dso, const char *symname);
	/* Binds a function - assumes a return type of DSO_FUNC_TYPE.
	 * This should be cast to the real function prototype by the
	 * caller. Platforms that don't have compatible representations
	 * for different prototypes (this is possible within ANSI C)
	 * are highly unlikely to have shared libraries at all, let
	 * alone a DSO_METHOD implemented for them. */
	DSO_FUNC_TYPE (*dso_bind_func)(DSO *dso, const char *symname);

/* I don't think this would actually be used in any circumstances. */
#if 0
	/* Unbinds a variable */
	int (*dso_unbind_var)(DSO *dso, char *symname, void *symptr);
	/* Unbinds a function */
	int (*dso_unbind_func)(DSO *dso, char *symname, DSO_FUNC_TYPE symptr);
#endif
	/* The generic (yuck) "ctrl()" function. NB: Negative return
	 * values (rather than zero) indicate errors. */
	long (*dso_ctrl)(DSO *dso, int cmd, long larg, void *parg);
	/* The default DSO_METHOD-specific function for converting filenames to
	 * a canonical native form. */
	DSO_NAME_CONVERTER_FUNC dso_name_converter;
	/* The default DSO_METHOD-specific function for converting filenames to
	 * a canonical native form. */
	DSO_MERGER_FUNC dso_merger;

	/* [De]Initialisation handlers. */
	int (*init)(DSO *dso);
	int (*finish)(DSO *dso);
	} DSO_METHOD;

/**********************************************************************/
/* The low-level handle type used to refer to a loaded shared library */

struct dso_st
	{
	DSO_METHOD *meth;
	/* Standard dlopen uses a (void *). Win32 uses a HANDLE. VMS
	 * doesn't use anything but will need to cache the filename
	 * for use in the dso_bind handler. All in all, let each
	 * method control its own destiny. "Handles" and such go in
	 * a STACK. */
	STACK *meth_data;
	int references;
	int flags;
	/* For use by applications etc ... use this for your bits'n'pieces,
	 * don't touch meth_data! */
	CRYPTO_EX_DATA ex_data;
	/* If this callback function pointer is set to non-NULL, then it will
	 * be used in DSO_load() in place of meth->dso_name_converter. NB: This
	 * should normally set using DSO_set_name_converter(). */
	DSO_NAME_CONVERTER_FUNC name_converter;
	/* If this callback function pointer is set to non-NULL, then it will
	 * be used in DSO_load() in place of meth->dso_merger. NB: This
	 * should normally set using DSO_set_merger(). */
	DSO_MERGER_FUNC merger;
	/* This is populated with (a copy of) the platform-independant
	 * filename used for this DSO. */
	char *filename;
	/* This is populated with (a copy of) the translated filename by which
	 * the DSO was actually loaded. It is NULL iff the DSO is not currently
	 * loaded. NB: This is here because the filename translation process
	 * may involve a callback being invoked more than once not only to
	 * convert to a platform-specific form, but also to try different
	 * filenames in the process of trying to perform a load. As such, this
	 * variable can be used to indicate (a) whether this DSO structure
	 * corresponds to a loaded library or not, and (b) the filename with
	 * which it was actually loaded. */
	char *loaded_filename;
	};


DSO *	DSO_new(void);
DSO *	DSO_new_method(DSO_METHOD *method);
int	DSO_free(DSO *dso);
int	DSO_flags(DSO *dso);
int	DSO_up_ref(DSO *dso);
long	DSO_ctrl(DSO *dso, int cmd, long larg, void *parg);

/* This function sets the DSO's name_converter callback. If it is non-NULL,
 * then it will be used instead of the associated DSO_METHOD's function. If
 * oldcb is non-NULL then it is set to the function pointer value being
 * replaced. Return value is non-zero for success. */
int	DSO_set_name_converter(DSO *dso, DSO_NAME_CONVERTER_FUNC cb,
				DSO_NAME_CONVERTER_FUNC *oldcb);
/* These functions can be used to get/set the platform-independant filename
 * used for a DSO. NB: set will fail if the DSO is already loaded. */
const char *DSO_get_filename(DSO *dso);
int	DSO_set_filename(DSO *dso, const char *filename);
/* This function will invoke the DSO's name_converter callback to translate a
 * filename, or if the callback isn't set it will instead use the DSO_METHOD's
 * converter. If "filename" is NULL, the "filename" in the DSO itself will be
 * used. If the DSO_FLAG_NO_NAME_TRANSLATION flag is set, then the filename is
 * simply duplicated. NB: This function is usually called from within a
 * DSO_METHOD during the processing of a DSO_load() call, and is exposed so that
 * caller-created DSO_METHODs can do the same thing. A non-NULL return value
 * will need to be OPENSSL_free()'d. */
char	*DSO_convert_filename(DSO *dso, const char *filename);
/* This function will invoke the DSO's merger callback to merge two file
 * specifications, or if the callback isn't set it will instead use the
 * DSO_METHOD's merger.  A non-NULL return value will need to be
 * OPENSSL_free()'d. */
char	*DSO_merge(DSO *dso, const char *filespec1, const char *filespec2);
/* If the DSO is currently loaded, this returns the filename that it was loaded
 * under, otherwise it returns NULL. So it is also useful as a test as to
 * whether the DSO is currently loaded. NB: This will not necessarily return
 * the same value as DSO_convert_filename(dso, dso->filename), because the
 * DSO_METHOD's load function may have tried a variety of filenames (with
 * and/or without the aid of the converters) before settling on the one it
 * actually loaded. */
const char *DSO_get_loaded_filename(DSO *dso);

void	DSO_set_default_method(DSO_METHOD *meth);
DSO_METHOD *DSO_get_default_method(void);
DSO_METHOD *DSO_get_method(DSO *dso);
DSO_METHOD *DSO_set_method(DSO *dso, DSO_METHOD *meth);

/* The all-singing all-dancing load function, you normally pass NULL
 * for the first and third parameters. Use DSO_up and DSO_free for
 * subsequent reference count handling. Any flags passed in will be set
 * in the constructed DSO after its init() function but before the
 * load operation. If 'dso' is non-NULL, 'flags' is ignored. */
DSO *DSO_load(DSO *dso, const char *filename, DSO_METHOD *meth, int flags);

/* This function binds to a variable inside a shared library. */
void *DSO_bind_var(DSO *dso, const char *symname);

/* This function binds to a function inside a shared library. */
DSO_FUNC_TYPE DSO_bind_func(DSO *dso, const char *symname);

/* This method is the default, but will beg, borrow, or steal whatever
 * method should be the default on any particular platform (including
 * DSO_METH_null() if necessary). */
DSO_METHOD *DSO_METHOD_openssl(void);

/* This method is defined for all platforms - if a platform has no
 * DSO support then this will be the only method! */
DSO_METHOD *DSO_METHOD_null(void);

/* If DSO_DLFCN is defined, the standard dlfcn.h-style functions
 * (dlopen, dlclose, dlsym, etc) will be used and incorporated into
 * this method. If not, this method will return NULL. */
DSO_METHOD *DSO_METHOD_dlfcn(void);

/* If DSO_DL is defined, the standard dl.h-style functions (shl_load, 
 * shl_unload, shl_findsym, etc) will be used and incorporated into
 * this method. If not, this method will return NULL. */
DSO_METHOD *DSO_METHOD_dl(void);

/* If WIN32 is defined, use DLLs. If not, return NULL. */
DSO_METHOD *DSO_METHOD_win32(void);

/* If VMS is defined, use shared images. If not, return NULL. */
DSO_METHOD *DSO_METHOD_vms(void);

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_DSO_strings(void);

/* Error codes for the DSO functions. */

/* Function codes. */
#define DSO_F_DLFCN_BIND_FUNC				 100
#define DSO_F_DLFCN_BIND_VAR				 101
#define DSO_F_DLFCN_LOAD				 102
#define DSO_F_DLFCN_MERGER				 130
#define DSO_F_DLFCN_NAME_CONVERTER			 123
#define DSO_F_DLFCN_UNLOAD				 103
#define DSO_F_DL_BIND_FUNC				 104
#define DSO_F_DL_BIND_VAR				 105
#define DSO_F_DL_LOAD					 106
#define DSO_F_DL_MERGER					 131
#define DSO_F_DL_NAME_CONVERTER				 124
#define DSO_F_DL_UNLOAD					 107
#define DSO_F_DSO_BIND_FUNC				 108
#define DSO_F_DSO_BIND_VAR				 109
#define DSO_F_DSO_CONVERT_FILENAME			 126
#define DSO_F_DSO_CTRL					 110
#define DSO_F_DSO_FREE					 111
#define DSO_F_DSO_GET_FILENAME				 127
#define DSO_F_DSO_GET_LOADED_FILENAME			 128
#define DSO_F_DSO_LOAD					 112
#define DSO_F_DSO_MERGE					 132
#define DSO_F_DSO_NEW_METHOD				 113
#define DSO_F_DSO_SET_FILENAME				 129
#define DSO_F_DSO_SET_NAME_CONVERTER			 122
#define DSO_F_DSO_UP_REF				 114
#define DSO_F_VMS_BIND_SYM				 115
#define DSO_F_VMS_LOAD					 116
#define DSO_F_VMS_MERGER				 133
#define DSO_F_VMS_UNLOAD				 117
#define DSO_F_WIN32_BIND_FUNC				 118
#define DSO_F_WIN32_BIND_VAR				 119
#define DSO_F_WIN32_JOINER				 135
#define DSO_F_WIN32_LOAD				 120
#define DSO_F_WIN32_MERGER				 134
#define DSO_F_WIN32_NAME_CONVERTER			 125
#define DSO_F_WIN32_SPLITTER				 136
#define DSO_F_WIN32_UNLOAD				 121

/* Reason codes. */
#define DSO_R_CTRL_FAILED				 100
#define DSO_R_DSO_ALREADY_LOADED			 110
#define DSO_R_EMPTY_FILE_STRUCTURE			 113
#define DSO_R_FAILURE					 114
#define DSO_R_FILENAME_TOO_BIG				 101
#define DSO_R_FINISH_FAILED				 102
#define DSO_R_INCORRECT_FILE_SYNTAX			 115
#define DSO_R_LOAD_FAILED				 103
#define DSO_R_NAME_TRANSLATION_FAILED			 109
#define DSO_R_NO_FILENAME				 111
#define DSO_R_NO_FILE_SPECIFICATION			 116
#define DSO_R_NULL_HANDLE				 104
#define DSO_R_SET_FILENAME_FAILED			 112
#define DSO_R_STACK_ERROR				 105
#define DSO_R_SYM_FAILURE				 106
#define DSO_R_UNLOAD_FAILED				 107
#define DSO_R_UNSUPPORTED				 108

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/ripemd.h0000755000175000017500000001040411341640430020250 0ustar  davidedavide/* crypto/ripemd/ripemd.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_RIPEMD_H
#define HEADER_RIPEMD_H

#include 
#include 

#ifdef  __cplusplus
extern "C" {
#endif

#ifdef OPENSSL_NO_RIPEMD
#error RIPEMD is disabled.
#endif

#if defined(OPENSSL_SYS_WIN16) || defined(__LP32__)
#define RIPEMD160_LONG unsigned long
#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__)
#define RIPEMD160_LONG unsigned long
#define RIPEMD160_LONG_LOG2 3
#else
#define RIPEMD160_LONG unsigned int
#endif

#define RIPEMD160_CBLOCK	64
#define RIPEMD160_LBLOCK	(RIPEMD160_CBLOCK/4)
#define RIPEMD160_DIGEST_LENGTH	20

typedef struct RIPEMD160state_st
	{
	RIPEMD160_LONG A,B,C,D,E;
	RIPEMD160_LONG Nl,Nh;
	RIPEMD160_LONG data[RIPEMD160_LBLOCK];
	unsigned int   num;
	} RIPEMD160_CTX;
#ifdef OPENSSL_FIPS
int private_RIPEMD160_Init(RIPEMD160_CTX *c);
#endif
int RIPEMD160_Init(RIPEMD160_CTX *c);
int RIPEMD160_Update(RIPEMD160_CTX *c, const void *data, size_t len);
int RIPEMD160_Final(unsigned char *md, RIPEMD160_CTX *c);
unsigned char *RIPEMD160(const unsigned char *d, size_t n,
	unsigned char *md);
void RIPEMD160_Transform(RIPEMD160_CTX *c, const unsigned char *b);
#ifdef  __cplusplus
}
#endif

#endif
xmail-1.27/win32ssl/include/openssl/tmdiff.h0000755000175000017500000001002511341640430020240 0ustar  davidedavide/* crypto/tmdiff.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

/* Header for dynamic hash table routines
 * Author - Eric Young
 */
/* ... erm yeah, "dynamic hash tables" you say?
 * 
 * And what would dynamic hash tables have to do with any of this code *now*?
 * AFAICS, this code is only referenced by crypto/bn/exp.c which is an unused
 * file that I doubt compiles any more. speed.c is the only thing that could
 * use this (and it has nothing to do with hash tables), yet it instead has its
 * own duplication of all this stuff and looks, if anything, more complete. See
 * the corresponding note in apps/speed.c.
 * The Bemused - Geoff
 */

#ifndef HEADER_TMDIFF_H
#define HEADER_TMDIFF_H

#ifdef  __cplusplus
extern "C" {
#endif

typedef struct ms_tm MS_TM;

MS_TM *ms_time_new(void );
void ms_time_free(MS_TM *a);
void ms_time_get(MS_TM *a);
double ms_time_diff(MS_TM *start, MS_TM *end);
int ms_time_cmp(const MS_TM *ap, const MS_TM *bp);

#ifdef  __cplusplus
}
#endif

#endif

xmail-1.27/win32ssl/include/openssl/rsa.h0000755000175000017500000004616311341640430017570 0ustar  davidedavide/* crypto/rsa/rsa.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_RSA_H
#define HEADER_RSA_H

#include 

#ifndef OPENSSL_NO_BIO
#include 
#endif
#include 
#include 
#ifndef OPENSSL_NO_DEPRECATED
#include 
#endif

#ifdef OPENSSL_NO_RSA
#error RSA is disabled.
#endif

/* If this flag is set the RSA method is FIPS compliant and can be used
 * in FIPS mode. This is set in the validated module method. If an
 * application sets this flag in its own methods it is its reposibility
 * to ensure the result is compliant.
 */

#define RSA_FLAG_FIPS_METHOD			0x0400

/* If this flag is set the operations normally disabled in FIPS mode are
 * permitted it is then the applications responsibility to ensure that the
 * usage is compliant.
 */

#define RSA_FLAG_NON_FIPS_ALLOW			0x0400

#ifdef OPENSSL_FIPS
#define FIPS_RSA_SIZE_T	int
#endif

#ifdef  __cplusplus
extern "C" {
#endif

/* Declared already in ossl_typ.h */
/* typedef struct rsa_st RSA; */
/* typedef struct rsa_meth_st RSA_METHOD; */

struct rsa_meth_st
	{
	const char *name;
	int (*rsa_pub_enc)(int flen,const unsigned char *from,
			   unsigned char *to,
			   RSA *rsa,int padding);
	int (*rsa_pub_dec)(int flen,const unsigned char *from,
			   unsigned char *to,
			   RSA *rsa,int padding);
	int (*rsa_priv_enc)(int flen,const unsigned char *from,
			    unsigned char *to,
			    RSA *rsa,int padding);
	int (*rsa_priv_dec)(int flen,const unsigned char *from,
			    unsigned char *to,
			    RSA *rsa,int padding);
	int (*rsa_mod_exp)(BIGNUM *r0,const BIGNUM *I,RSA *rsa,BN_CTX *ctx); /* Can be null */
	int (*bn_mod_exp)(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
			  const BIGNUM *m, BN_CTX *ctx,
			  BN_MONT_CTX *m_ctx); /* Can be null */
	int (*init)(RSA *rsa);		/* called at new */
	int (*finish)(RSA *rsa);	/* called at free */
	int flags;			/* RSA_METHOD_FLAG_* things */
	char *app_data;			/* may be needed! */
/* New sign and verify functions: some libraries don't allow arbitrary data
 * to be signed/verified: this allows them to be used. Note: for this to work
 * the RSA_public_decrypt() and RSA_private_encrypt() should *NOT* be used
 * RSA_sign(), RSA_verify() should be used instead. Note: for backwards
 * compatibility this functionality is only enabled if the RSA_FLAG_SIGN_VER
 * option is set in 'flags'.
 */
	int (*rsa_sign)(int type,
		const unsigned char *m, unsigned int m_length,
		unsigned char *sigret, unsigned int *siglen, const RSA *rsa);
	int (*rsa_verify)(int dtype,
		const unsigned char *m, unsigned int m_length,
		unsigned char *sigbuf, unsigned int siglen, const RSA *rsa);
/* If this callback is NULL, the builtin software RSA key-gen will be used. This
 * is for behavioural compatibility whilst the code gets rewired, but one day
 * it would be nice to assume there are no such things as "builtin software"
 * implementations. */
	int (*rsa_keygen)(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);
	};

struct rsa_st
	{
	/* The first parameter is used to pickup errors where
	 * this is passed instead of aEVP_PKEY, it is set to 0 */
	int pad;
	long version;
	const RSA_METHOD *meth;
	/* functional reference if 'meth' is ENGINE-provided */
	ENGINE *engine;
	BIGNUM *n;
	BIGNUM *e;
	BIGNUM *d;
	BIGNUM *p;
	BIGNUM *q;
	BIGNUM *dmp1;
	BIGNUM *dmq1;
	BIGNUM *iqmp;
	/* be careful using this if the RSA structure is shared */
	CRYPTO_EX_DATA ex_data;
	int references;
	int flags;

	/* Used to cache montgomery values */
	BN_MONT_CTX *_method_mod_n;
	BN_MONT_CTX *_method_mod_p;
	BN_MONT_CTX *_method_mod_q;

	/* all BIGNUM values are actually in the following data, if it is not
	 * NULL */
	char *bignum_data;
	BN_BLINDING *blinding;
	BN_BLINDING *mt_blinding;
	};

#ifndef OPENSSL_RSA_MAX_MODULUS_BITS
# define OPENSSL_RSA_MAX_MODULUS_BITS	16384
#endif

#define OPENSSL_RSA_FIPS_MIN_MODULUS_BITS 1024

#ifndef OPENSSL_RSA_SMALL_MODULUS_BITS
# define OPENSSL_RSA_SMALL_MODULUS_BITS	3072
#endif
#ifndef OPENSSL_RSA_MAX_PUBEXP_BITS
# define OPENSSL_RSA_MAX_PUBEXP_BITS	64 /* exponent limit enforced for "large" modulus only */
#endif

#define RSA_3	0x3L
#define RSA_F4	0x10001L

#define RSA_METHOD_FLAG_NO_CHECK	0x0001 /* don't check pub/private match */

#define RSA_FLAG_CACHE_PUBLIC		0x0002
#define RSA_FLAG_CACHE_PRIVATE		0x0004
#define RSA_FLAG_BLINDING		0x0008
#define RSA_FLAG_THREAD_SAFE		0x0010
/* This flag means the private key operations will be handled by rsa_mod_exp
 * and that they do not depend on the private key components being present:
 * for example a key stored in external hardware. Without this flag bn_mod_exp
 * gets called when private key components are absent.
 */
#define RSA_FLAG_EXT_PKEY		0x0020

/* This flag in the RSA_METHOD enables the new rsa_sign, rsa_verify functions.
 */
#define RSA_FLAG_SIGN_VER		0x0040

#define RSA_FLAG_NO_BLINDING		0x0080 /* new with 0.9.6j and 0.9.7b; the built-in
                                                * RSA implementation now uses blinding by
                                                * default (ignoring RSA_FLAG_BLINDING),
                                                * but other engines might not need it
                                                */
#define RSA_FLAG_NO_CONSTTIME		0x0100 /* new with 0.9.8f; the built-in RSA
						* implementation now uses constant time
						* operations by default in private key operations,
						* e.g., constant time modular exponentiation, 
                                                * modular inverse without leaking branches, 
                                                * division without leaking branches. This 
                                                * flag disables these constant time 
                                                * operations and results in faster RSA 
                                                * private key operations.
                                                */ 
#ifndef OPENSSL_NO_DEPRECATED
#define RSA_FLAG_NO_EXP_CONSTTIME RSA_FLAG_NO_CONSTTIME /* deprecated name for the flag*/
                                                /* new with 0.9.7h; the built-in RSA
                                                * implementation now uses constant time
                                                * modular exponentiation for secret exponents
                                                * by default. This flag causes the
                                                * faster variable sliding window method to
                                                * be used for all exponents.
                                                */
#endif


#define RSA_PKCS1_PADDING	1
#define RSA_SSLV23_PADDING	2
#define RSA_NO_PADDING		3
#define RSA_PKCS1_OAEP_PADDING	4
#define RSA_X931_PADDING	5

#define RSA_PKCS1_PADDING_SIZE	11

#define RSA_set_app_data(s,arg)         RSA_set_ex_data(s,0,arg)
#define RSA_get_app_data(s)             RSA_get_ex_data(s,0)

RSA *	RSA_new(void);
RSA *	RSA_new_method(ENGINE *engine);
int	RSA_size(const RSA *);

/* Deprecated version */
#ifndef OPENSSL_NO_DEPRECATED
RSA *	RSA_generate_key(int bits, unsigned long e,void
		(*callback)(int,int,void *),void *cb_arg);
#endif /* !defined(OPENSSL_NO_DEPRECATED) */

/* New version */
int	RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb);
int RSA_X931_derive_ex(RSA *rsa, BIGNUM *p1, BIGNUM *p2, BIGNUM *q1, BIGNUM *q2,
			const BIGNUM *Xp1, const BIGNUM *Xp2, const BIGNUM *Xp,
			const BIGNUM *Xq1, const BIGNUM *Xq2, const BIGNUM *Xq,
			const BIGNUM *e, BN_GENCB *cb);
int RSA_X931_generate_key_ex(RSA *rsa, int bits, const BIGNUM *e, BN_GENCB *cb);

int	RSA_check_key(const RSA *);
	/* next 4 return -1 on error */
int	RSA_public_encrypt(int flen, const unsigned char *from,
		unsigned char *to, RSA *rsa,int padding);
int	RSA_private_encrypt(int flen, const unsigned char *from,
		unsigned char *to, RSA *rsa,int padding);
int	RSA_public_decrypt(int flen, const unsigned char *from, 
		unsigned char *to, RSA *rsa,int padding);
int	RSA_private_decrypt(int flen, const unsigned char *from, 
		unsigned char *to, RSA *rsa,int padding);
void	RSA_free (RSA *r);
/* "up" the RSA object's reference count */
int	RSA_up_ref(RSA *r);

int	RSA_flags(const RSA *r);

#ifdef OPENSSL_FIPS
RSA *FIPS_rsa_new(void);
void FIPS_rsa_free(RSA *r);
#endif

void RSA_set_default_method(const RSA_METHOD *meth);
const RSA_METHOD *RSA_get_default_method(void);
const RSA_METHOD *RSA_get_method(const RSA *rsa);
int RSA_set_method(RSA *rsa, const RSA_METHOD *meth);

/* This function needs the memory locking malloc callbacks to be installed */
int RSA_memory_lock(RSA *r);

/* these are the actual SSLeay RSA functions */
const RSA_METHOD *RSA_PKCS1_SSLeay(void);

const RSA_METHOD *RSA_null_method(void);

DECLARE_ASN1_ENCODE_FUNCTIONS_const(RSA, RSAPublicKey)
DECLARE_ASN1_ENCODE_FUNCTIONS_const(RSA, RSAPrivateKey)

#ifndef OPENSSL_NO_FP_API
int	RSA_print_fp(FILE *fp, const RSA *r,int offset);
#endif

#ifndef OPENSSL_NO_BIO
int	RSA_print(BIO *bp, const RSA *r,int offset);
#endif

#ifndef OPENSSL_NO_RC4
int i2d_RSA_NET(const RSA *a, unsigned char **pp,
		int (*cb)(char *buf, int len, const char *prompt, int verify),
		int sgckey);
RSA *d2i_RSA_NET(RSA **a, const unsigned char **pp, long length,
		 int (*cb)(char *buf, int len, const char *prompt, int verify),
		 int sgckey);

int i2d_Netscape_RSA(const RSA *a, unsigned char **pp,
		     int (*cb)(char *buf, int len, const char *prompt,
			       int verify));
RSA *d2i_Netscape_RSA(RSA **a, const unsigned char **pp, long length,
		      int (*cb)(char *buf, int len, const char *prompt,
				int verify));
#endif

/* The following 2 functions sign and verify a X509_SIG ASN1 object
 * inside PKCS#1 padded RSA encryption */
int RSA_sign(int type, const unsigned char *m, unsigned int m_length,
	unsigned char *sigret, unsigned int *siglen, RSA *rsa);
int RSA_verify(int type, const unsigned char *m, unsigned int m_length,
	unsigned char *sigbuf, unsigned int siglen, RSA *rsa);

/* The following 2 function sign and verify a ASN1_OCTET_STRING
 * object inside PKCS#1 padded RSA encryption */
int RSA_sign_ASN1_OCTET_STRING(int type,
	const unsigned char *m, unsigned int m_length,
	unsigned char *sigret, unsigned int *siglen, RSA *rsa);
int RSA_verify_ASN1_OCTET_STRING(int type,
	const unsigned char *m, unsigned int m_length,
	unsigned char *sigbuf, unsigned int siglen, RSA *rsa);

int RSA_blinding_on(RSA *rsa, BN_CTX *ctx);
void RSA_blinding_off(RSA *rsa);
BN_BLINDING *RSA_setup_blinding(RSA *rsa, BN_CTX *ctx);

int RSA_padding_add_PKCS1_type_1(unsigned char *to,int tlen,
	const unsigned char *f,int fl);
int RSA_padding_check_PKCS1_type_1(unsigned char *to,int tlen,
	const unsigned char *f,int fl,int rsa_len);
int RSA_padding_add_PKCS1_type_2(unsigned char *to,int tlen,
	const unsigned char *f,int fl);
int RSA_padding_check_PKCS1_type_2(unsigned char *to,int tlen,
	const unsigned char *f,int fl,int rsa_len);
int PKCS1_MGF1(unsigned char *mask, long len,
	const unsigned char *seed, long seedlen, const EVP_MD *dgst);
int RSA_padding_add_PKCS1_OAEP(unsigned char *to,int tlen,
	const unsigned char *f,int fl,
	const unsigned char *p,int pl);
int RSA_padding_check_PKCS1_OAEP(unsigned char *to,int tlen,
	const unsigned char *f,int fl,int rsa_len,
	const unsigned char *p,int pl);
int RSA_padding_add_SSLv23(unsigned char *to,int tlen,
	const unsigned char *f,int fl);
int RSA_padding_check_SSLv23(unsigned char *to,int tlen,
	const unsigned char *f,int fl,int rsa_len);
int RSA_padding_add_none(unsigned char *to,int tlen,
	const unsigned char *f,int fl);
int RSA_padding_check_none(unsigned char *to,int tlen,
	const unsigned char *f,int fl,int rsa_len);
int RSA_padding_add_X931(unsigned char *to,int tlen,
	const unsigned char *f,int fl);
int RSA_padding_check_X931(unsigned char *to,int tlen,
	const unsigned char *f,int fl,int rsa_len);
int RSA_X931_hash_id(int nid);

int RSA_verify_PKCS1_PSS(RSA *rsa, const unsigned char *mHash,
			const EVP_MD *Hash, const unsigned char *EM, int sLen);
int RSA_padding_add_PKCS1_PSS(RSA *rsa, unsigned char *EM,
			const unsigned char *mHash,
			const EVP_MD *Hash, int sLen);

int RSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
	CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
int RSA_set_ex_data(RSA *r,int idx,void *arg);
void *RSA_get_ex_data(const RSA *r, int idx);

RSA *RSAPublicKey_dup(RSA *rsa);
RSA *RSAPrivateKey_dup(RSA *rsa);

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_RSA_strings(void);

/* Error codes for the RSA functions. */

/* Function codes. */
#define RSA_F_FIPS_RSA_SIGN				 140
#define RSA_F_FIPS_RSA_VERIFY				 141
#define RSA_F_MEMORY_LOCK				 100
#define RSA_F_RSA_BUILTIN_KEYGEN			 129
#define RSA_F_RSA_CHECK_KEY				 123
#define RSA_F_RSA_EAY_PRIVATE_DECRYPT			 101
#define RSA_F_RSA_EAY_PRIVATE_ENCRYPT			 102
#define RSA_F_RSA_EAY_PUBLIC_DECRYPT			 103
#define RSA_F_RSA_EAY_PUBLIC_ENCRYPT			 104
#define RSA_F_RSA_GENERATE_KEY				 105
#define RSA_F_RSA_MEMORY_LOCK				 130
#define RSA_F_RSA_NEW_METHOD				 106
#define RSA_F_RSA_NULL					 124
#define RSA_F_RSA_NULL_MOD_EXP				 131
#define RSA_F_RSA_NULL_PRIVATE_DECRYPT			 132
#define RSA_F_RSA_NULL_PRIVATE_ENCRYPT			 133
#define RSA_F_RSA_NULL_PUBLIC_DECRYPT			 134
#define RSA_F_RSA_NULL_PUBLIC_ENCRYPT			 135
#define RSA_F_RSA_PADDING_ADD_NONE			 107
#define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP		 121
#define RSA_F_RSA_PADDING_ADD_PKCS1_PSS			 125
#define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1		 108
#define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2		 109
#define RSA_F_RSA_PADDING_ADD_SSLV23			 110
#define RSA_F_RSA_PADDING_ADD_X931			 127
#define RSA_F_RSA_PADDING_CHECK_NONE			 111
#define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP		 122
#define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1		 112
#define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2		 113
#define RSA_F_RSA_PADDING_CHECK_SSLV23			 114
#define RSA_F_RSA_PADDING_CHECK_X931			 128
#define RSA_F_RSA_PRINT					 115
#define RSA_F_RSA_PRINT_FP				 116
#define RSA_F_RSA_PRIVATE_ENCRYPT			 137
#define RSA_F_RSA_PUBLIC_DECRYPT			 138
#define RSA_F_RSA_SETUP_BLINDING			 136
#define RSA_F_RSA_SET_DEFAULT_METHOD			 139
#define RSA_F_RSA_SET_METHOD				 142
#define RSA_F_RSA_SIGN					 117
#define RSA_F_RSA_SIGN_ASN1_OCTET_STRING		 118
#define RSA_F_RSA_VERIFY				 119
#define RSA_F_RSA_VERIFY_ASN1_OCTET_STRING		 120
#define RSA_F_RSA_VERIFY_PKCS1_PSS			 126

/* Reason codes. */
#define RSA_R_ALGORITHM_MISMATCH			 100
#define RSA_R_BAD_E_VALUE				 101
#define RSA_R_BAD_FIXED_HEADER_DECRYPT			 102
#define RSA_R_BAD_PAD_BYTE_COUNT			 103
#define RSA_R_BAD_SIGNATURE				 104
#define RSA_R_BLOCK_TYPE_IS_NOT_01			 106
#define RSA_R_BLOCK_TYPE_IS_NOT_02			 107
#define RSA_R_DATA_GREATER_THAN_MOD_LEN			 108
#define RSA_R_DATA_TOO_LARGE				 109
#define RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE		 110
#define RSA_R_DATA_TOO_LARGE_FOR_MODULUS		 132
#define RSA_R_DATA_TOO_SMALL				 111
#define RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE		 122
#define RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY		 112
#define RSA_R_DMP1_NOT_CONGRUENT_TO_D			 124
#define RSA_R_DMQ1_NOT_CONGRUENT_TO_D			 125
#define RSA_R_D_E_NOT_CONGRUENT_TO_1			 123
#define RSA_R_FIRST_OCTET_INVALID			 133
#define RSA_R_INVALID_HEADER				 137
#define RSA_R_INVALID_MESSAGE_LENGTH			 131
#define RSA_R_INVALID_PADDING				 138
#define RSA_R_INVALID_TRAILER				 139
#define RSA_R_IQMP_NOT_INVERSE_OF_Q			 126
#define RSA_R_KEY_SIZE_TOO_SMALL			 120
#define RSA_R_LAST_OCTET_INVALID			 134
#define RSA_R_MODULUS_TOO_LARGE				 105
#define RSA_R_NON_FIPS_METHOD				 141
#define RSA_R_NO_PUBLIC_EXPONENT			 140
#define RSA_R_NULL_BEFORE_BLOCK_MISSING			 113
#define RSA_R_N_DOES_NOT_EQUAL_P_Q			 127
#define RSA_R_OAEP_DECODING_ERROR			 121
#define RSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE	 142
#define RSA_R_PADDING_CHECK_FAILED			 114
#define RSA_R_P_NOT_PRIME				 128
#define RSA_R_Q_NOT_PRIME				 129
#define RSA_R_RSA_OPERATIONS_NOT_SUPPORTED		 130
#define RSA_R_SLEN_CHECK_FAILED				 136
#define RSA_R_SLEN_RECOVERY_FAILED			 135
#define RSA_R_SSLV3_ROLLBACK_ATTACK			 115
#define RSA_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 116
#define RSA_R_UNKNOWN_ALGORITHM_TYPE			 117
#define RSA_R_UNKNOWN_PADDING_TYPE			 118
#define RSA_R_WRONG_SIGNATURE_LENGTH			 119

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/kssl.h0000755000175000017500000001344711341640430017756 0ustar  davidedavide/* ssl/kssl.h -*- mode: C; c-file-style: "eay" -*- */
/* Written by Vern Staats  for the OpenSSL project 2000.
 * project 2000.
 */
/* ====================================================================
 * Copyright (c) 2000 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    licensing@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

/*
**	19990701	VRS 	Started.
*/

#ifndef	KSSL_H
#define	KSSL_H

#include 

#ifndef OPENSSL_NO_KRB5

#include 
#include 
#include 

#ifdef  __cplusplus
extern "C" {
#endif

/*
**	Depending on which KRB5 implementation used, some types from
**	the other may be missing.  Resolve that here and now
*/
#ifdef KRB5_HEIMDAL
typedef unsigned char krb5_octet;
#define FAR
#else

#ifndef FAR
#define FAR
#endif

#endif

/*	Uncomment this to debug kssl problems or
**	to trace usage of the Kerberos session key
**
**	#define		KSSL_DEBUG
*/

#ifndef	KRB5SVC
#define KRB5SVC	"host"
#endif

#ifndef	KRB5KEYTAB
#define KRB5KEYTAB	"/etc/krb5.keytab"
#endif

#ifndef KRB5SENDAUTH
#define KRB5SENDAUTH	1
#endif

#ifndef KRB5CHECKAUTH
#define KRB5CHECKAUTH	1
#endif

#ifndef KSSL_CLOCKSKEW
#define	KSSL_CLOCKSKEW	300;
#endif

#define	KSSL_ERR_MAX	255
typedef struct kssl_err_st  {
	int  reason;
	char text[KSSL_ERR_MAX+1];
	} KSSL_ERR;


/*	Context for passing
**		(1) Kerberos session key to SSL, and
**		(2)	Config data between application and SSL lib
*/
typedef struct kssl_ctx_st
        {
                                /*	used by:    disposition:            */
	char *service_name;	/*	C,S	    default ok (kssl)       */
	char *service_host;	/*	C	    input, REQUIRED         */
	char *client_princ;	/*	S	    output from krb5 ticket */
	char *keytab_file;	/*      S	    NULL (/etc/krb5.keytab) */
	char *cred_cache;	/*	C	    NULL (default)          */
	krb5_enctype enctype;
	int length;
	krb5_octet FAR *key;
	} KSSL_CTX;

#define	KSSL_CLIENT 	1
#define KSSL_SERVER 	2
#define	KSSL_SERVICE	3
#define	KSSL_KEYTAB 	4

#define KSSL_CTX_OK 	0
#define KSSL_CTX_ERR	1
#define KSSL_NOMEM	2

/* Public (for use by applications that use OpenSSL with Kerberos 5 support */
krb5_error_code kssl_ctx_setstring(KSSL_CTX *kssl_ctx, int which, char *text);
KSSL_CTX *kssl_ctx_new(void);
KSSL_CTX *kssl_ctx_free(KSSL_CTX *kssl_ctx);
void kssl_ctx_show(KSSL_CTX *kssl_ctx);
krb5_error_code kssl_ctx_setprinc(KSSL_CTX *kssl_ctx, int which,
        krb5_data *realm, krb5_data *entity, int nentities);
krb5_error_code	kssl_cget_tkt(KSSL_CTX *kssl_ctx,  krb5_data **enc_tktp,
        krb5_data *authenp, KSSL_ERR *kssl_err);
krb5_error_code	kssl_sget_tkt(KSSL_CTX *kssl_ctx,  krb5_data *indata,
        krb5_ticket_times *ttimes, KSSL_ERR *kssl_err);
krb5_error_code kssl_ctx_setkey(KSSL_CTX *kssl_ctx, krb5_keyblock *session);
void	kssl_err_set(KSSL_ERR *kssl_err, int reason, char *text);
void kssl_krb5_free_data_contents(krb5_context context, krb5_data *data);
krb5_error_code  kssl_build_principal_2(krb5_context context,
			krb5_principal *princ, int rlen, const char *realm,
			int slen, const char *svc, int hlen, const char *host);
krb5_error_code  kssl_validate_times(krb5_timestamp atime,
					krb5_ticket_times *ttimes);
krb5_error_code  kssl_check_authent(KSSL_CTX *kssl_ctx, krb5_data *authentp,
			            krb5_timestamp *atimep, KSSL_ERR *kssl_err);
unsigned char	*kssl_skip_confound(krb5_enctype enctype, unsigned char *authn);

#ifdef  __cplusplus
}
#endif
#endif	/* OPENSSL_NO_KRB5	*/
#endif	/* KSSL_H 	*/
xmail-1.27/win32ssl/include/openssl/ossl_typ.h0000755000175000017500000001507211341640430020652 0ustar  davidedavide/* ====================================================================
 * Copyright (c) 1998-2001 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

#ifndef HEADER_OPENSSL_TYPES_H
#define HEADER_OPENSSL_TYPES_H

#include 

#ifdef NO_ASN1_TYPEDEFS
#define ASN1_INTEGER		ASN1_STRING
#define ASN1_ENUMERATED		ASN1_STRING
#define ASN1_BIT_STRING		ASN1_STRING
#define ASN1_OCTET_STRING	ASN1_STRING
#define ASN1_PRINTABLESTRING	ASN1_STRING
#define ASN1_T61STRING		ASN1_STRING
#define ASN1_IA5STRING		ASN1_STRING
#define ASN1_UTCTIME		ASN1_STRING
#define ASN1_GENERALIZEDTIME	ASN1_STRING
#define ASN1_TIME		ASN1_STRING
#define ASN1_GENERALSTRING	ASN1_STRING
#define ASN1_UNIVERSALSTRING	ASN1_STRING
#define ASN1_BMPSTRING		ASN1_STRING
#define ASN1_VISIBLESTRING	ASN1_STRING
#define ASN1_UTF8STRING		ASN1_STRING
#define ASN1_BOOLEAN		int
#define ASN1_NULL		int
#else
typedef struct asn1_string_st ASN1_INTEGER;
typedef struct asn1_string_st ASN1_ENUMERATED;
typedef struct asn1_string_st ASN1_BIT_STRING;
typedef struct asn1_string_st ASN1_OCTET_STRING;
typedef struct asn1_string_st ASN1_PRINTABLESTRING;
typedef struct asn1_string_st ASN1_T61STRING;
typedef struct asn1_string_st ASN1_IA5STRING;
typedef struct asn1_string_st ASN1_GENERALSTRING;
typedef struct asn1_string_st ASN1_UNIVERSALSTRING;
typedef struct asn1_string_st ASN1_BMPSTRING;
typedef struct asn1_string_st ASN1_UTCTIME;
typedef struct asn1_string_st ASN1_TIME;
typedef struct asn1_string_st ASN1_GENERALIZEDTIME;
typedef struct asn1_string_st ASN1_VISIBLESTRING;
typedef struct asn1_string_st ASN1_UTF8STRING;
typedef int ASN1_BOOLEAN;
typedef int ASN1_NULL;
#endif

#ifdef OPENSSL_SYS_WIN32
#undef X509_NAME
#undef X509_EXTENSIONS
#undef X509_CERT_PAIR
#undef PKCS7_ISSUER_AND_SERIAL
#undef OCSP_REQUEST
#undef OCSP_RESPONSE
#endif

#ifdef BIGNUM
#undef BIGNUM
#endif
typedef struct bignum_st BIGNUM;
typedef struct bignum_ctx BN_CTX;
typedef struct bn_blinding_st BN_BLINDING;
typedef struct bn_mont_ctx_st BN_MONT_CTX;
typedef struct bn_recp_ctx_st BN_RECP_CTX;
typedef struct bn_gencb_st BN_GENCB;

typedef struct buf_mem_st BUF_MEM;

typedef struct evp_cipher_st EVP_CIPHER;
typedef struct evp_cipher_ctx_st EVP_CIPHER_CTX;
typedef struct env_md_st EVP_MD;
typedef struct env_md_ctx_st EVP_MD_CTX;
typedef struct evp_pkey_st EVP_PKEY;

typedef struct dh_st DH;
typedef struct dh_method DH_METHOD;

typedef struct dsa_st DSA;
typedef struct dsa_method DSA_METHOD;

typedef struct rsa_st RSA;
typedef struct rsa_meth_st RSA_METHOD;

typedef struct rand_meth_st RAND_METHOD;

typedef struct ecdh_method ECDH_METHOD;
typedef struct ecdsa_method ECDSA_METHOD;

typedef struct x509_st X509;
typedef struct X509_algor_st X509_ALGOR;
typedef struct X509_crl_st X509_CRL;
typedef struct X509_name_st X509_NAME;
typedef struct x509_store_st X509_STORE;
typedef struct x509_store_ctx_st X509_STORE_CTX;
typedef struct ssl_st SSL;
typedef struct ssl_ctx_st SSL_CTX;

typedef struct v3_ext_ctx X509V3_CTX;
typedef struct conf_st CONF;

typedef struct store_st STORE;
typedef struct store_method_st STORE_METHOD;

typedef struct ui_st UI;
typedef struct ui_method_st UI_METHOD;

typedef struct st_ERR_FNS ERR_FNS;

typedef struct engine_st ENGINE;

typedef struct X509_POLICY_NODE_st X509_POLICY_NODE;
typedef struct X509_POLICY_LEVEL_st X509_POLICY_LEVEL;
typedef struct X509_POLICY_TREE_st X509_POLICY_TREE;
typedef struct X509_POLICY_CACHE_st X509_POLICY_CACHE;

  /* If placed in pkcs12.h, we end up with a circular depency with pkcs7.h */
#define DECLARE_PKCS12_STACK_OF(type) /* Nothing */
#define IMPLEMENT_PKCS12_STACK_OF(type) /* Nothing */

typedef struct crypto_ex_data_st CRYPTO_EX_DATA;
/* Callback types for crypto.h */
typedef int CRYPTO_EX_new(void *parent, void *ptr, CRYPTO_EX_DATA *ad,
					int idx, long argl, void *argp);
typedef void CRYPTO_EX_free(void *parent, void *ptr, CRYPTO_EX_DATA *ad,
					int idx, long argl, void *argp);
typedef int CRYPTO_EX_dup(CRYPTO_EX_DATA *to, CRYPTO_EX_DATA *from, void *from_d, 
					int idx, long argl, void *argp);

typedef struct ocsp_req_ctx_st OCSP_REQ_CTX;
typedef struct ocsp_response_st OCSP_RESPONSE;
typedef struct ocsp_responder_id_st OCSP_RESPID;

#endif /* def HEADER_OPENSSL_TYPES_H */
xmail-1.27/win32ssl/include/openssl/tls1.h0000755000175000017500000004567611341640430017676 0ustar  davidedavide/* ssl/tls1.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */
/* ====================================================================
 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
 *
 * Portions of the attached software ("Contribution") are developed by 
 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
 *
 * The Contribution is licensed pursuant to the OpenSSL open source
 * license provided above.
 *
 * ECC cipher suite support in OpenSSL originally written by
 * Vipul Gupta and Sumit Gupta of Sun Microsystems Laboratories.
 *
 */

#ifndef HEADER_TLS1_H 
#define HEADER_TLS1_H 

#include 

#ifdef  __cplusplus
extern "C" {
#endif

#define TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES	0

#define TLS1_VERSION			0x0301
#define TLS1_VERSION_MAJOR		0x03
#define TLS1_VERSION_MINOR		0x01

#define TLS1_AD_DECRYPTION_FAILED	21
#define TLS1_AD_RECORD_OVERFLOW		22
#define TLS1_AD_UNKNOWN_CA		48	/* fatal */
#define TLS1_AD_ACCESS_DENIED		49	/* fatal */
#define TLS1_AD_DECODE_ERROR		50	/* fatal */
#define TLS1_AD_DECRYPT_ERROR		51
#define TLS1_AD_EXPORT_RESTRICTION	60	/* fatal */
#define TLS1_AD_PROTOCOL_VERSION	70	/* fatal */
#define TLS1_AD_INSUFFICIENT_SECURITY	71	/* fatal */
#define TLS1_AD_INTERNAL_ERROR		80	/* fatal */
#define TLS1_AD_USER_CANCELLED		90
#define TLS1_AD_NO_RENEGOTIATION	100
/* codes 110-114 are from RFC3546 */
#define TLS1_AD_UNSUPPORTED_EXTENSION	110
#define TLS1_AD_CERTIFICATE_UNOBTAINABLE 111
#define TLS1_AD_UNRECOGNIZED_NAME 	112
#define TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE 113
#define TLS1_AD_BAD_CERTIFICATE_HASH_VALUE 114
#define TLS1_AD_UNKNOWN_PSK_IDENTITY	115	/* fatal */

/* ExtensionType values from RFC 3546 */
#define TLSEXT_TYPE_server_name			0
#define TLSEXT_TYPE_max_fragment_length		1
#define TLSEXT_TYPE_client_certificate_url	2
#define TLSEXT_TYPE_trusted_ca_keys		3
#define TLSEXT_TYPE_truncated_hmac		4
#define TLSEXT_TYPE_status_request		5
#define TLSEXT_TYPE_elliptic_curves		10
#define TLSEXT_TYPE_ec_point_formats		11
#define TLSEXT_TYPE_session_ticket		35

/* NameType value from RFC 3546 */
#define TLSEXT_NAMETYPE_host_name 0
/* status request value from RFC 3546 */
#define TLSEXT_STATUSTYPE_ocsp 1

#ifndef OPENSSL_NO_TLSEXT

#define TLSEXT_MAXLEN_host_name 255

const char *SSL_get_servername(const SSL *s, const int type) ;
int SSL_get_servername_type(const SSL *s) ;

#define SSL_set_tlsext_host_name(s,name) \
SSL_ctrl(s,SSL_CTRL_SET_TLSEXT_HOSTNAME,TLSEXT_NAMETYPE_host_name,(char *)name)

#define SSL_set_tlsext_debug_callback(ssl, cb) \
SSL_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_CB,(void (*)(void))cb)

#define SSL_set_tlsext_debug_arg(ssl, arg) \
SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_DEBUG_ARG,0, (void *)arg)

#define SSL_set_tlsext_status_type(ssl, type) \
SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE,type, NULL)

#define SSL_get_tlsext_status_exts(ssl, arg) \
SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS,0, (void *)arg)

#define SSL_set_tlsext_status_exts(ssl, arg) \
SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS,0, (void *)arg)

#define SSL_get_tlsext_status_ids(ssl, arg) \
SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS,0, (void *)arg)

#define SSL_set_tlsext_status_ids(ssl, arg) \
SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS,0, (void *)arg)

#define SSL_get_tlsext_status_ocsp_resp(ssl, arg) \
SSL_ctrl(ssl,SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP,0, (void *)arg)

#define SSL_set_tlsext_status_ocsp_resp(ssl, arg, arglen) \
SSL_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP,arglen, (void *)arg)

#define SSL_CTX_set_tlsext_servername_callback(ctx, cb) \
SSL_CTX_callback_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_CB,(void (*)(void))cb)

#define SSL_TLSEXT_ERR_OK 0
#define SSL_TLSEXT_ERR_ALERT_WARNING 1
#define SSL_TLSEXT_ERR_ALERT_FATAL 2
#define SSL_TLSEXT_ERR_NOACK 3

#define SSL_CTX_set_tlsext_servername_arg(ctx, arg) \
SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG,0, (void *)arg)

#define SSL_CTX_get_tlsext_ticket_keys(ctx, keys, keylen) \
	SSL_CTX_ctrl((ctx),SSL_CTRL_GET_TLXEXT_TICKET_KEYS,(keylen),(keys))
#define SSL_CTX_set_tlsext_ticket_keys(ctx, keys, keylen) \
	SSL_CTX_ctrl((ctx),SSL_CTRL_SET_TLXEXT_TICKET_KEYS,(keylen),(keys))

#define SSL_CTX_set_tlsext_status_cb(ssl, cb) \
SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB,(void (*)(void))cb)

#define SSL_CTX_set_tlsext_status_arg(ssl, arg) \
SSL_CTX_ctrl(ssl,SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG,0, (void *)arg)

#define SSL_CTX_set_tlsext_ticket_key_cb(ssl, cb) \
SSL_CTX_callback_ctrl(ssl,SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB,(void (*)(void))cb)

#endif

/* Additional TLS ciphersuites from draft-ietf-tls-56-bit-ciphersuites-00.txt
 * (available if TLS1_ALLOW_EXPERIMENTAL_CIPHERSUITES is defined, see
 * s3_lib.c).  We actually treat them like SSL 3.0 ciphers, which we probably
 * shouldn't. */
#define TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_MD5		0x03000060
#define TLS1_CK_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5	0x03000061
#define TLS1_CK_RSA_EXPORT1024_WITH_DES_CBC_SHA		0x03000062
#define TLS1_CK_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA	0x03000063
#define TLS1_CK_RSA_EXPORT1024_WITH_RC4_56_SHA		0x03000064
#define TLS1_CK_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA	0x03000065
#define TLS1_CK_DHE_DSS_WITH_RC4_128_SHA		0x03000066

/* AES ciphersuites from RFC3268 */

#define TLS1_CK_RSA_WITH_AES_128_SHA			0x0300002F
#define TLS1_CK_DH_DSS_WITH_AES_128_SHA			0x03000030
#define TLS1_CK_DH_RSA_WITH_AES_128_SHA			0x03000031
#define TLS1_CK_DHE_DSS_WITH_AES_128_SHA		0x03000032
#define TLS1_CK_DHE_RSA_WITH_AES_128_SHA		0x03000033
#define TLS1_CK_ADH_WITH_AES_128_SHA			0x03000034

#define TLS1_CK_RSA_WITH_AES_256_SHA			0x03000035
#define TLS1_CK_DH_DSS_WITH_AES_256_SHA			0x03000036
#define TLS1_CK_DH_RSA_WITH_AES_256_SHA			0x03000037
#define TLS1_CK_DHE_DSS_WITH_AES_256_SHA		0x03000038
#define TLS1_CK_DHE_RSA_WITH_AES_256_SHA		0x03000039
#define TLS1_CK_ADH_WITH_AES_256_SHA			0x0300003A

/* Camellia ciphersuites from RFC4132 */
#define TLS1_CK_RSA_WITH_CAMELLIA_128_CBC_SHA		0x03000041
#define TLS1_CK_DH_DSS_WITH_CAMELLIA_128_CBC_SHA	0x03000042
#define TLS1_CK_DH_RSA_WITH_CAMELLIA_128_CBC_SHA	0x03000043
#define TLS1_CK_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA	0x03000044
#define TLS1_CK_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA	0x03000045
#define TLS1_CK_ADH_WITH_CAMELLIA_128_CBC_SHA		0x03000046

#define TLS1_CK_RSA_WITH_CAMELLIA_256_CBC_SHA		0x03000084
#define TLS1_CK_DH_DSS_WITH_CAMELLIA_256_CBC_SHA	0x03000085
#define TLS1_CK_DH_RSA_WITH_CAMELLIA_256_CBC_SHA	0x03000086
#define TLS1_CK_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA	0x03000087
#define TLS1_CK_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA	0x03000088
#define TLS1_CK_ADH_WITH_CAMELLIA_256_CBC_SHA		0x03000089

/* SEED ciphersuites from RFC4162 */
#define TLS1_CK_RSA_WITH_SEED_SHA                       0x03000096
#define TLS1_CK_DH_DSS_WITH_SEED_SHA                    0x03000097
#define TLS1_CK_DH_RSA_WITH_SEED_SHA                    0x03000098
#define TLS1_CK_DHE_DSS_WITH_SEED_SHA                   0x03000099
#define TLS1_CK_DHE_RSA_WITH_SEED_SHA                   0x0300009A
#define TLS1_CK_ADH_WITH_SEED_SHA                	0x0300009B

/* ECC ciphersuites from draft-ietf-tls-ecc-12.txt with changes soon to be in draft 13 */
#define TLS1_CK_ECDH_ECDSA_WITH_NULL_SHA                0x0300C001
#define TLS1_CK_ECDH_ECDSA_WITH_RC4_128_SHA             0x0300C002
#define TLS1_CK_ECDH_ECDSA_WITH_DES_192_CBC3_SHA        0x0300C003
#define TLS1_CK_ECDH_ECDSA_WITH_AES_128_CBC_SHA         0x0300C004
#define TLS1_CK_ECDH_ECDSA_WITH_AES_256_CBC_SHA         0x0300C005

#define TLS1_CK_ECDHE_ECDSA_WITH_NULL_SHA               0x0300C006
#define TLS1_CK_ECDHE_ECDSA_WITH_RC4_128_SHA            0x0300C007
#define TLS1_CK_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA       0x0300C008
#define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA        0x0300C009
#define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA        0x0300C00A

#define TLS1_CK_ECDH_RSA_WITH_NULL_SHA                  0x0300C00B
#define TLS1_CK_ECDH_RSA_WITH_RC4_128_SHA               0x0300C00C
#define TLS1_CK_ECDH_RSA_WITH_DES_192_CBC3_SHA          0x0300C00D
#define TLS1_CK_ECDH_RSA_WITH_AES_128_CBC_SHA           0x0300C00E
#define TLS1_CK_ECDH_RSA_WITH_AES_256_CBC_SHA           0x0300C00F

#define TLS1_CK_ECDHE_RSA_WITH_NULL_SHA                 0x0300C010
#define TLS1_CK_ECDHE_RSA_WITH_RC4_128_SHA              0x0300C011
#define TLS1_CK_ECDHE_RSA_WITH_DES_192_CBC3_SHA         0x0300C012
#define TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA          0x0300C013
#define TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA          0x0300C014

#define TLS1_CK_ECDH_anon_WITH_NULL_SHA                 0x0300C015
#define TLS1_CK_ECDH_anon_WITH_RC4_128_SHA              0x0300C016
#define TLS1_CK_ECDH_anon_WITH_DES_192_CBC3_SHA         0x0300C017
#define TLS1_CK_ECDH_anon_WITH_AES_128_CBC_SHA          0x0300C018
#define TLS1_CK_ECDH_anon_WITH_AES_256_CBC_SHA          0x0300C019

/* XXX
 * Inconsistency alert:
 * The OpenSSL names of ciphers with ephemeral DH here include the string
 * "DHE", while elsewhere it has always been "EDH".
 * (The alias for the list of all such ciphers also is "EDH".)
 * The specifications speak of "EDH"; maybe we should allow both forms
 * for everything. */
#define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_MD5		"EXP1024-RC4-MD5"
#define TLS1_TXT_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5	"EXP1024-RC2-CBC-MD5"
#define TLS1_TXT_RSA_EXPORT1024_WITH_DES_CBC_SHA	"EXP1024-DES-CBC-SHA"
#define TLS1_TXT_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA	"EXP1024-DHE-DSS-DES-CBC-SHA"
#define TLS1_TXT_RSA_EXPORT1024_WITH_RC4_56_SHA		"EXP1024-RC4-SHA"
#define TLS1_TXT_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA	"EXP1024-DHE-DSS-RC4-SHA"
#define TLS1_TXT_DHE_DSS_WITH_RC4_128_SHA		"DHE-DSS-RC4-SHA"

/* AES ciphersuites from RFC3268 */
#define TLS1_TXT_RSA_WITH_AES_128_SHA			"AES128-SHA"
#define TLS1_TXT_DH_DSS_WITH_AES_128_SHA		"DH-DSS-AES128-SHA"
#define TLS1_TXT_DH_RSA_WITH_AES_128_SHA		"DH-RSA-AES128-SHA"
#define TLS1_TXT_DHE_DSS_WITH_AES_128_SHA		"DHE-DSS-AES128-SHA"
#define TLS1_TXT_DHE_RSA_WITH_AES_128_SHA		"DHE-RSA-AES128-SHA"
#define TLS1_TXT_ADH_WITH_AES_128_SHA			"ADH-AES128-SHA"

#define TLS1_TXT_RSA_WITH_AES_256_SHA			"AES256-SHA"
#define TLS1_TXT_DH_DSS_WITH_AES_256_SHA		"DH-DSS-AES256-SHA"
#define TLS1_TXT_DH_RSA_WITH_AES_256_SHA		"DH-RSA-AES256-SHA"
#define TLS1_TXT_DHE_DSS_WITH_AES_256_SHA		"DHE-DSS-AES256-SHA"
#define TLS1_TXT_DHE_RSA_WITH_AES_256_SHA		"DHE-RSA-AES256-SHA"
#define TLS1_TXT_ADH_WITH_AES_256_SHA			"ADH-AES256-SHA"

/* ECC ciphersuites from draft-ietf-tls-ecc-01.txt (Mar 15, 2001) */
#define TLS1_TXT_ECDH_ECDSA_WITH_NULL_SHA               "ECDH-ECDSA-NULL-SHA"
#define TLS1_TXT_ECDH_ECDSA_WITH_RC4_128_SHA            "ECDH-ECDSA-RC4-SHA"
#define TLS1_TXT_ECDH_ECDSA_WITH_DES_192_CBC3_SHA       "ECDH-ECDSA-DES-CBC3-SHA"
#define TLS1_TXT_ECDH_ECDSA_WITH_AES_128_CBC_SHA        "ECDH-ECDSA-AES128-SHA"
#define TLS1_TXT_ECDH_ECDSA_WITH_AES_256_CBC_SHA        "ECDH-ECDSA-AES256-SHA"

#define TLS1_TXT_ECDHE_ECDSA_WITH_NULL_SHA              "ECDHE-ECDSA-NULL-SHA"
#define TLS1_TXT_ECDHE_ECDSA_WITH_RC4_128_SHA           "ECDHE-ECDSA-RC4-SHA"
#define TLS1_TXT_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA      "ECDHE-ECDSA-DES-CBC3-SHA"
#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA       "ECDHE-ECDSA-AES128-SHA"
#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA       "ECDHE-ECDSA-AES256-SHA"

#define TLS1_TXT_ECDH_RSA_WITH_NULL_SHA                 "ECDH-RSA-NULL-SHA"
#define TLS1_TXT_ECDH_RSA_WITH_RC4_128_SHA              "ECDH-RSA-RC4-SHA"
#define TLS1_TXT_ECDH_RSA_WITH_DES_192_CBC3_SHA         "ECDH-RSA-DES-CBC3-SHA"
#define TLS1_TXT_ECDH_RSA_WITH_AES_128_CBC_SHA          "ECDH-RSA-AES128-SHA"
#define TLS1_TXT_ECDH_RSA_WITH_AES_256_CBC_SHA          "ECDH-RSA-AES256-SHA"

#define TLS1_TXT_ECDHE_RSA_WITH_NULL_SHA                "ECDHE-RSA-NULL-SHA"
#define TLS1_TXT_ECDHE_RSA_WITH_RC4_128_SHA             "ECDHE-RSA-RC4-SHA"
#define TLS1_TXT_ECDHE_RSA_WITH_DES_192_CBC3_SHA        "ECDHE-RSA-DES-CBC3-SHA"
#define TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA         "ECDHE-RSA-AES128-SHA"
#define TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA         "ECDHE-RSA-AES256-SHA"

#define TLS1_TXT_ECDH_anon_WITH_NULL_SHA                "AECDH-NULL-SHA"
#define TLS1_TXT_ECDH_anon_WITH_RC4_128_SHA             "AECDH-RC4-SHA"
#define TLS1_TXT_ECDH_anon_WITH_DES_192_CBC3_SHA        "AECDH-DES-CBC3-SHA"
#define TLS1_TXT_ECDH_anon_WITH_AES_128_CBC_SHA         "AECDH-AES128-SHA"
#define TLS1_TXT_ECDH_anon_WITH_AES_256_CBC_SHA         "AECDH-AES256-SHA"

/* Camellia ciphersuites from RFC4132 */
#define TLS1_TXT_RSA_WITH_CAMELLIA_128_CBC_SHA		"CAMELLIA128-SHA"
#define TLS1_TXT_DH_DSS_WITH_CAMELLIA_128_CBC_SHA	"DH-DSS-CAMELLIA128-SHA"
#define TLS1_TXT_DH_RSA_WITH_CAMELLIA_128_CBC_SHA	"DH-RSA-CAMELLIA128-SHA"
#define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA	"DHE-DSS-CAMELLIA128-SHA"
#define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA	"DHE-RSA-CAMELLIA128-SHA"
#define TLS1_TXT_ADH_WITH_CAMELLIA_128_CBC_SHA		"ADH-CAMELLIA128-SHA"

#define TLS1_TXT_RSA_WITH_CAMELLIA_256_CBC_SHA		"CAMELLIA256-SHA"
#define TLS1_TXT_DH_DSS_WITH_CAMELLIA_256_CBC_SHA	"DH-DSS-CAMELLIA256-SHA"
#define TLS1_TXT_DH_RSA_WITH_CAMELLIA_256_CBC_SHA	"DH-RSA-CAMELLIA256-SHA"
#define TLS1_TXT_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA	"DHE-DSS-CAMELLIA256-SHA"
#define TLS1_TXT_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA	"DHE-RSA-CAMELLIA256-SHA"
#define TLS1_TXT_ADH_WITH_CAMELLIA_256_CBC_SHA		"ADH-CAMELLIA256-SHA"

/* SEED ciphersuites from RFC4162 */
#define TLS1_TXT_RSA_WITH_SEED_SHA                      "SEED-SHA"
#define TLS1_TXT_DH_DSS_WITH_SEED_SHA                   "DH-DSS-SEED-SHA"
#define TLS1_TXT_DH_RSA_WITH_SEED_SHA                   "DH-RSA-SEED-SHA"
#define TLS1_TXT_DHE_DSS_WITH_SEED_SHA                  "DHE-DSS-SEED-SHA"
#define TLS1_TXT_DHE_RSA_WITH_SEED_SHA                  "DHE-RSA-SEED-SHA"
#define TLS1_TXT_ADH_WITH_SEED_SHA                      "ADH-SEED-SHA"

#define TLS_CT_RSA_SIGN			1
#define TLS_CT_DSS_SIGN			2
#define TLS_CT_RSA_FIXED_DH		3
#define TLS_CT_DSS_FIXED_DH		4
#define TLS_CT_ECDSA_SIGN		64
#define TLS_CT_RSA_FIXED_ECDH		65
#define TLS_CT_ECDSA_FIXED_ECDH 	66
#define TLS_CT_NUMBER			7

#define TLS1_FINISH_MAC_LENGTH		12

#define TLS_MD_MAX_CONST_SIZE			20
#define TLS_MD_CLIENT_FINISH_CONST		"client finished"
#define TLS_MD_CLIENT_FINISH_CONST_SIZE		15
#define TLS_MD_SERVER_FINISH_CONST		"server finished"
#define TLS_MD_SERVER_FINISH_CONST_SIZE		15
#define TLS_MD_SERVER_WRITE_KEY_CONST		"server write key"
#define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE	16
#define TLS_MD_KEY_EXPANSION_CONST		"key expansion"
#define TLS_MD_KEY_EXPANSION_CONST_SIZE		13
#define TLS_MD_CLIENT_WRITE_KEY_CONST		"client write key"
#define TLS_MD_CLIENT_WRITE_KEY_CONST_SIZE	16
#define TLS_MD_SERVER_WRITE_KEY_CONST		"server write key"
#define TLS_MD_SERVER_WRITE_KEY_CONST_SIZE	16
#define TLS_MD_IV_BLOCK_CONST			"IV block"
#define TLS_MD_IV_BLOCK_CONST_SIZE		8
#define TLS_MD_MASTER_SECRET_CONST		"master secret"
#define TLS_MD_MASTER_SECRET_CONST_SIZE		13

#ifdef CHARSET_EBCDIC
#undef TLS_MD_CLIENT_FINISH_CONST
#define TLS_MD_CLIENT_FINISH_CONST    "\x63\x6c\x69\x65\x6e\x74\x20\x66\x69\x6e\x69\x73\x68\x65\x64"  /*client finished*/
#undef TLS_MD_SERVER_FINISH_CONST
#define TLS_MD_SERVER_FINISH_CONST    "\x73\x65\x72\x76\x65\x72\x20\x66\x69\x6e\x69\x73\x68\x65\x64"  /*server finished*/
#undef TLS_MD_SERVER_WRITE_KEY_CONST
#define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79"  /*server write key*/
#undef TLS_MD_KEY_EXPANSION_CONST
#define TLS_MD_KEY_EXPANSION_CONST    "\x6b\x65\x79\x20\x65\x78\x70\x61\x6e\x73\x69\x6f\x6e"  /*key expansion*/
#undef TLS_MD_CLIENT_WRITE_KEY_CONST
#define TLS_MD_CLIENT_WRITE_KEY_CONST "\x63\x6c\x69\x65\x6e\x74\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79"  /*client write key*/
#undef TLS_MD_SERVER_WRITE_KEY_CONST
#define TLS_MD_SERVER_WRITE_KEY_CONST "\x73\x65\x72\x76\x65\x72\x20\x77\x72\x69\x74\x65\x20\x6b\x65\x79"  /*server write key*/
#undef TLS_MD_IV_BLOCK_CONST
#define TLS_MD_IV_BLOCK_CONST         "\x49\x56\x20\x62\x6c\x6f\x63\x6b"  /*IV block*/
#undef TLS_MD_MASTER_SECRET_CONST
#define TLS_MD_MASTER_SECRET_CONST    "\x6d\x61\x73\x74\x65\x72\x20\x73\x65\x63\x72\x65\x74"  /*master secret*/
#endif

#ifdef  __cplusplus
}
#endif
#endif



xmail-1.27/win32ssl/include/openssl/e_os2.h0000755000175000017500000002264011341640430020004 0ustar  davidedavide/* e_os2.h */
/* ====================================================================
 * Copyright (c) 1998-2000 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

#include 

#ifndef HEADER_E_OS2_H
#define HEADER_E_OS2_H

#ifdef  __cplusplus
extern "C" {
#endif

/******************************************************************************
 * Detect operating systems.  This probably needs completing.
 * The result is that at least one OPENSSL_SYS_os macro should be defined.
 * However, if none is defined, Unix is assumed.
 **/

#define OPENSSL_SYS_UNIX

/* ----------------------- Macintosh, before MacOS X ----------------------- */
#if defined(__MWERKS__) && defined(macintosh) || defined(OPENSSL_SYSNAME_MAC)
# undef OPENSSL_SYS_UNIX
# define OPENSSL_SYS_MACINTOSH_CLASSIC
#endif

/* ----------------------- NetWare ----------------------------------------- */
#if defined(NETWARE) || defined(OPENSSL_SYSNAME_NETWARE)
# undef OPENSSL_SYS_UNIX
# define OPENSSL_SYS_NETWARE
#endif

/* ---------------------- Microsoft operating systems ---------------------- */

/* Note that MSDOS actually denotes 32-bit environments running on top of
   MS-DOS, such as DJGPP one. */
#if defined(OPENSSL_SYSNAME_MSDOS)
# undef OPENSSL_SYS_UNIX
# define OPENSSL_SYS_MSDOS
#endif

/* For 32 bit environment, there seems to be the CygWin environment and then
   all the others that try to do the same thing Microsoft does... */
#if defined(OPENSSL_SYSNAME_UWIN)
# undef OPENSSL_SYS_UNIX
# define OPENSSL_SYS_WIN32_UWIN
#else
# if defined(__CYGWIN32__) || defined(OPENSSL_SYSNAME_CYGWIN32)
#  undef OPENSSL_SYS_UNIX
#  define OPENSSL_SYS_WIN32_CYGWIN
# else
#  if defined(_WIN32) || defined(OPENSSL_SYSNAME_WIN32)
#   undef OPENSSL_SYS_UNIX
#   define OPENSSL_SYS_WIN32
#  endif
#  if defined(OPENSSL_SYSNAME_WINNT)
#   undef OPENSSL_SYS_UNIX
#   define OPENSSL_SYS_WINNT
#  endif
#  if defined(OPENSSL_SYSNAME_WINCE)
#   undef OPENSSL_SYS_UNIX
#   define OPENSSL_SYS_WINCE
#  endif
# endif
#endif

/* Anything that tries to look like Microsoft is "Windows" */
#if defined(OPENSSL_SYS_WIN32) || defined(OPENSSL_SYS_WINNT) || defined(OPENSSL_SYS_WINCE)
# undef OPENSSL_SYS_UNIX
# define OPENSSL_SYS_WINDOWS
# ifndef OPENSSL_SYS_MSDOS
#  define OPENSSL_SYS_MSDOS
# endif
#endif

/* DLL settings.  This part is a bit tough, because it's up to the application
   implementor how he or she will link the application, so it requires some
   macro to be used. */
#ifdef OPENSSL_SYS_WINDOWS
# ifndef OPENSSL_OPT_WINDLL
#  if defined(_WINDLL) /* This is used when building OpenSSL to indicate that
                          DLL linkage should be used */
#   define OPENSSL_OPT_WINDLL
#  endif
# endif
#endif

/* -------------------------------- OpenVMS -------------------------------- */
#if defined(__VMS) || defined(VMS) || defined(OPENSSL_SYSNAME_VMS)
# undef OPENSSL_SYS_UNIX
# define OPENSSL_SYS_VMS
# if defined(__DECC)
#  define OPENSSL_SYS_VMS_DECC
# elif defined(__DECCXX)
#  define OPENSSL_SYS_VMS_DECC
#  define OPENSSL_SYS_VMS_DECCXX
# else
#  define OPENSSL_SYS_VMS_NODECC
# endif
#endif

/* --------------------------------- OS/2 ---------------------------------- */
#if defined(__EMX__) || defined(__OS2__)
# undef OPENSSL_SYS_UNIX
# define OPENSSL_SYS_OS2
#endif

/* --------------------------------- Unix ---------------------------------- */
#ifdef OPENSSL_SYS_UNIX
# if defined(linux) || defined(__linux__) || defined(OPENSSL_SYSNAME_LINUX)
#  define OPENSSL_SYS_LINUX
# endif
# ifdef OPENSSL_SYSNAME_MPE
#  define OPENSSL_SYS_MPE
# endif
# ifdef OPENSSL_SYSNAME_SNI
#  define OPENSSL_SYS_SNI
# endif
# ifdef OPENSSL_SYSNAME_ULTRASPARC
#  define OPENSSL_SYS_ULTRASPARC
# endif
# ifdef OPENSSL_SYSNAME_NEWS4
#  define OPENSSL_SYS_NEWS4
# endif
# ifdef OPENSSL_SYSNAME_MACOSX
#  define OPENSSL_SYS_MACOSX
# endif
# ifdef OPENSSL_SYSNAME_MACOSX_RHAPSODY
#  define OPENSSL_SYS_MACOSX_RHAPSODY
#  define OPENSSL_SYS_MACOSX
# endif
# ifdef OPENSSL_SYSNAME_SUNOS
#  define OPENSSL_SYS_SUNOS
#endif
# if defined(_CRAY) || defined(OPENSSL_SYSNAME_CRAY)
#  define OPENSSL_SYS_CRAY
# endif
# if defined(_AIX) || defined(OPENSSL_SYSNAME_AIX)
#  define OPENSSL_SYS_AIX
# endif
#endif

/* --------------------------------- VOS ----------------------------------- */
#ifdef OPENSSL_SYSNAME_VOS
# define OPENSSL_SYS_VOS
#endif

/* ------------------------------- VxWorks --------------------------------- */
#ifdef OPENSSL_SYSNAME_VXWORKS
# define OPENSSL_SYS_VXWORKS
#endif

/**
 * That's it for OS-specific stuff
 *****************************************************************************/


/* Specials for I/O an exit */
#ifdef OPENSSL_SYS_MSDOS
# define OPENSSL_UNISTD_IO 
# define OPENSSL_DECLARE_EXIT extern void exit(int);
#else
# define OPENSSL_UNISTD_IO OPENSSL_UNISTD
# define OPENSSL_DECLARE_EXIT /* declared in unistd.h */
#endif

/* Definitions of OPENSSL_GLOBAL and OPENSSL_EXTERN, to define and declare
   certain global symbols that, with some compilers under VMS, have to be
   defined and declared explicitely with globaldef and globalref.
   Definitions of OPENSSL_EXPORT and OPENSSL_IMPORT, to define and declare
   DLL exports and imports for compilers under Win32.  These are a little
   more complicated to use.  Basically, for any library that exports some
   global variables, the following code must be present in the header file
   that declares them, before OPENSSL_EXTERN is used:

   #ifdef SOME_BUILD_FLAG_MACRO
   # undef OPENSSL_EXTERN
   # define OPENSSL_EXTERN OPENSSL_EXPORT
   #endif

   The default is to have OPENSSL_EXPORT, OPENSSL_IMPORT and OPENSSL_GLOBAL
   have some generally sensible values, and for OPENSSL_EXTERN to have the
   value OPENSSL_IMPORT.
*/

#if defined(OPENSSL_SYS_VMS_NODECC)
# define OPENSSL_EXPORT globalref
# define OPENSSL_IMPORT globalref
# define OPENSSL_GLOBAL globaldef
#elif defined(OPENSSL_SYS_WINDOWS) && defined(OPENSSL_OPT_WINDLL)
# define OPENSSL_EXPORT extern __declspec(dllexport)
# define OPENSSL_IMPORT extern __declspec(dllimport)
# define OPENSSL_GLOBAL
#else
# define OPENSSL_EXPORT extern
# define OPENSSL_IMPORT extern
# define OPENSSL_GLOBAL
#endif
#define OPENSSL_EXTERN OPENSSL_IMPORT

/* Macros to allow global variables to be reached through function calls when
   required (if a shared library version requvres it, for example.
   The way it's done allows definitions like this:

	// in foobar.c
	OPENSSL_IMPLEMENT_GLOBAL(int,foobar) = 0;
	// in foobar.h
	OPENSSL_DECLARE_GLOBAL(int,foobar);
	#define foobar OPENSSL_GLOBAL_REF(foobar)
*/
#ifdef OPENSSL_EXPORT_VAR_AS_FUNCTION
# define OPENSSL_IMPLEMENT_GLOBAL(type,name)			     \
	extern type _hide_##name;				     \
	type *_shadow_##name(void) { return &_hide_##name; }	     \
	static type _hide_##name
# define OPENSSL_DECLARE_GLOBAL(type,name) type *_shadow_##name(void)
# define OPENSSL_GLOBAL_REF(name) (*(_shadow_##name()))
#else
# define OPENSSL_IMPLEMENT_GLOBAL(type,name) OPENSSL_GLOBAL type _shadow_##name
# define OPENSSL_DECLARE_GLOBAL(type,name) OPENSSL_EXPORT type _shadow_##name
# define OPENSSL_GLOBAL_REF(name) _shadow_##name
#endif

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/x509.h0000755000175000017500000013647211341640430017513 0ustar  davidedavide/* crypto/x509/x509.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */
/* ====================================================================
 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
 * ECDH support in OpenSSL originally developed by 
 * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
 */

#ifndef HEADER_X509_H
#define HEADER_X509_H

#include 
#include 
#ifndef OPENSSL_NO_BUFFER
#include 
#endif
#ifndef OPENSSL_NO_EVP
#include 
#endif
#ifndef OPENSSL_NO_BIO
#include 
#endif
#include 
#include 
#include 

#ifndef OPENSSL_NO_EC
#include 
#endif

#ifndef OPENSSL_NO_ECDSA
#include 
#endif

#ifndef OPENSSL_NO_ECDH
#include 
#endif

#ifndef OPENSSL_NO_DEPRECATED
#ifndef OPENSSL_NO_RSA
#include 
#endif
#ifndef OPENSSL_NO_DSA
#include 
#endif
#ifndef OPENSSL_NO_DH
#include 
#endif
#endif

#ifndef OPENSSL_NO_SHA
#include 
#endif
#include 

#ifdef  __cplusplus
extern "C" {
#endif

#ifdef OPENSSL_SYS_WIN32
/* Under Win32 these are defined in wincrypt.h */
#undef X509_NAME
#undef X509_CERT_PAIR
#endif

#define X509_FILETYPE_PEM	1
#define X509_FILETYPE_ASN1	2
#define X509_FILETYPE_DEFAULT	3

#define X509v3_KU_DIGITAL_SIGNATURE	0x0080
#define X509v3_KU_NON_REPUDIATION	0x0040
#define X509v3_KU_KEY_ENCIPHERMENT	0x0020
#define X509v3_KU_DATA_ENCIPHERMENT	0x0010
#define X509v3_KU_KEY_AGREEMENT		0x0008
#define X509v3_KU_KEY_CERT_SIGN		0x0004
#define X509v3_KU_CRL_SIGN		0x0002
#define X509v3_KU_ENCIPHER_ONLY		0x0001
#define X509v3_KU_DECIPHER_ONLY		0x8000
#define X509v3_KU_UNDEF			0xffff

typedef struct X509_objects_st
	{
	int nid;
	int (*a2i)(void);
	int (*i2a)(void);
	} X509_OBJECTS;

struct X509_algor_st
	{
	ASN1_OBJECT *algorithm;
	ASN1_TYPE *parameter;
	} /* X509_ALGOR */;

DECLARE_ASN1_SET_OF(X509_ALGOR)

typedef STACK_OF(X509_ALGOR) X509_ALGORS;

typedef struct X509_val_st
	{
	ASN1_TIME *notBefore;
	ASN1_TIME *notAfter;
	} X509_VAL;

typedef struct X509_pubkey_st
	{
	X509_ALGOR *algor;
	ASN1_BIT_STRING *public_key;
	EVP_PKEY *pkey;
	} X509_PUBKEY;

typedef struct X509_sig_st
	{
	X509_ALGOR *algor;
	ASN1_OCTET_STRING *digest;
	} X509_SIG;

typedef struct X509_name_entry_st
	{
	ASN1_OBJECT *object;
	ASN1_STRING *value;
	int set;
	int size; 	/* temp variable */
	} X509_NAME_ENTRY;

DECLARE_STACK_OF(X509_NAME_ENTRY)
DECLARE_ASN1_SET_OF(X509_NAME_ENTRY)

/* we always keep X509_NAMEs in 2 forms. */
struct X509_name_st
	{
	STACK_OF(X509_NAME_ENTRY) *entries;
	int modified;	/* true if 'bytes' needs to be built */
#ifndef OPENSSL_NO_BUFFER
	BUF_MEM *bytes;
#else
	char *bytes;
#endif
	unsigned long hash; /* Keep the hash around for lookups */
	} /* X509_NAME */;

DECLARE_STACK_OF(X509_NAME)

#define X509_EX_V_NETSCAPE_HACK		0x8000
#define X509_EX_V_INIT			0x0001
typedef struct X509_extension_st
	{
	ASN1_OBJECT *object;
	ASN1_BOOLEAN critical;
	ASN1_OCTET_STRING *value;
	} X509_EXTENSION;

typedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS;

DECLARE_STACK_OF(X509_EXTENSION)
DECLARE_ASN1_SET_OF(X509_EXTENSION)

/* a sequence of these are used */
typedef struct x509_attributes_st
	{
	ASN1_OBJECT *object;
	int single; /* 0 for a set, 1 for a single item (which is wrong) */
	union	{
		char		*ptr;
/* 0 */		STACK_OF(ASN1_TYPE) *set;
/* 1 */		ASN1_TYPE	*single;
		} value;
	} X509_ATTRIBUTE;

DECLARE_STACK_OF(X509_ATTRIBUTE)
DECLARE_ASN1_SET_OF(X509_ATTRIBUTE)


typedef struct X509_req_info_st
	{
	ASN1_ENCODING enc;
	ASN1_INTEGER *version;
	X509_NAME *subject;
	X509_PUBKEY *pubkey;
	/*  d=2 hl=2 l=  0 cons: cont: 00 */
	STACK_OF(X509_ATTRIBUTE) *attributes; /* [ 0 ] */
	} X509_REQ_INFO;

typedef struct X509_req_st
	{
	X509_REQ_INFO *req_info;
	X509_ALGOR *sig_alg;
	ASN1_BIT_STRING *signature;
	int references;
	} X509_REQ;

typedef struct x509_cinf_st
	{
	ASN1_INTEGER *version;		/* [ 0 ] default of v1 */
	ASN1_INTEGER *serialNumber;
	X509_ALGOR *signature;
	X509_NAME *issuer;
	X509_VAL *validity;
	X509_NAME *subject;
	X509_PUBKEY *key;
	ASN1_BIT_STRING *issuerUID;		/* [ 1 ] optional in v2 */
	ASN1_BIT_STRING *subjectUID;		/* [ 2 ] optional in v2 */
	STACK_OF(X509_EXTENSION) *extensions;	/* [ 3 ] optional in v3 */
	} X509_CINF;

/* This stuff is certificate "auxiliary info"
 * it contains details which are useful in certificate
 * stores and databases. When used this is tagged onto
 * the end of the certificate itself
 */

typedef struct x509_cert_aux_st
	{
	STACK_OF(ASN1_OBJECT) *trust;		/* trusted uses */
	STACK_OF(ASN1_OBJECT) *reject;		/* rejected uses */
	ASN1_UTF8STRING *alias;			/* "friendly name" */
	ASN1_OCTET_STRING *keyid;		/* key id of private key */
	STACK_OF(X509_ALGOR) *other;		/* other unspecified info */
	} X509_CERT_AUX;

struct x509_st
	{
	X509_CINF *cert_info;
	X509_ALGOR *sig_alg;
	ASN1_BIT_STRING *signature;
	int valid;
	int references;
	char *name;
	CRYPTO_EX_DATA ex_data;
	/* These contain copies of various extension values */
	long ex_pathlen;
	long ex_pcpathlen;
	unsigned long ex_flags;
	unsigned long ex_kusage;
	unsigned long ex_xkusage;
	unsigned long ex_nscert;
	ASN1_OCTET_STRING *skid;
	struct AUTHORITY_KEYID_st *akid;
	X509_POLICY_CACHE *policy_cache;
#ifndef OPENSSL_NO_RFC3779
	STACK_OF(IPAddressFamily) *rfc3779_addr;
	struct ASIdentifiers_st *rfc3779_asid;
#endif
#ifndef OPENSSL_NO_SHA
	unsigned char sha1_hash[SHA_DIGEST_LENGTH];
#endif
	X509_CERT_AUX *aux;
	} /* X509 */;

DECLARE_STACK_OF(X509)
DECLARE_ASN1_SET_OF(X509)

/* This is used for a table of trust checking functions */

typedef struct x509_trust_st {
	int trust;
	int flags;
	int (*check_trust)(struct x509_trust_st *, X509 *, int);
	char *name;
	int arg1;
	void *arg2;
} X509_TRUST;

DECLARE_STACK_OF(X509_TRUST)

typedef struct x509_cert_pair_st {
	X509 *forward;
	X509 *reverse;
} X509_CERT_PAIR;

/* standard trust ids */

#define X509_TRUST_DEFAULT	-1	/* Only valid in purpose settings */

#define X509_TRUST_COMPAT	1
#define X509_TRUST_SSL_CLIENT	2
#define X509_TRUST_SSL_SERVER	3
#define X509_TRUST_EMAIL	4
#define X509_TRUST_OBJECT_SIGN	5
#define X509_TRUST_OCSP_SIGN	6
#define X509_TRUST_OCSP_REQUEST	7

/* Keep these up to date! */
#define X509_TRUST_MIN		1
#define X509_TRUST_MAX		7


/* trust_flags values */
#define	X509_TRUST_DYNAMIC 	1
#define	X509_TRUST_DYNAMIC_NAME	2

/* check_trust return codes */

#define X509_TRUST_TRUSTED	1
#define X509_TRUST_REJECTED	2
#define X509_TRUST_UNTRUSTED	3

/* Flags for X509_print_ex() */

#define	X509_FLAG_COMPAT		0
#define	X509_FLAG_NO_HEADER		1L
#define	X509_FLAG_NO_VERSION		(1L << 1)
#define	X509_FLAG_NO_SERIAL		(1L << 2)
#define	X509_FLAG_NO_SIGNAME		(1L << 3)
#define	X509_FLAG_NO_ISSUER		(1L << 4)
#define	X509_FLAG_NO_VALIDITY		(1L << 5)
#define	X509_FLAG_NO_SUBJECT		(1L << 6)
#define	X509_FLAG_NO_PUBKEY		(1L << 7)
#define	X509_FLAG_NO_EXTENSIONS		(1L << 8)
#define	X509_FLAG_NO_SIGDUMP		(1L << 9)
#define	X509_FLAG_NO_AUX		(1L << 10)
#define	X509_FLAG_NO_ATTRIBUTES		(1L << 11)

/* Flags specific to X509_NAME_print_ex() */	

/* The field separator information */

#define XN_FLAG_SEP_MASK	(0xf << 16)

#define XN_FLAG_COMPAT		0		/* Traditional SSLeay: use old X509_NAME_print */
#define XN_FLAG_SEP_COMMA_PLUS	(1 << 16)	/* RFC2253 ,+ */
#define XN_FLAG_SEP_CPLUS_SPC	(2 << 16)	/* ,+ spaced: more readable */
#define XN_FLAG_SEP_SPLUS_SPC	(3 << 16)	/* ;+ spaced */
#define XN_FLAG_SEP_MULTILINE	(4 << 16)	/* One line per field */

#define XN_FLAG_DN_REV		(1 << 20)	/* Reverse DN order */

/* How the field name is shown */

#define XN_FLAG_FN_MASK		(0x3 << 21)

#define XN_FLAG_FN_SN		0		/* Object short name */
#define XN_FLAG_FN_LN		(1 << 21)	/* Object long name */
#define XN_FLAG_FN_OID		(2 << 21)	/* Always use OIDs */
#define XN_FLAG_FN_NONE		(3 << 21)	/* No field names */

#define XN_FLAG_SPC_EQ		(1 << 23)	/* Put spaces round '=' */

/* This determines if we dump fields we don't recognise:
 * RFC2253 requires this.
 */

#define XN_FLAG_DUMP_UNKNOWN_FIELDS (1 << 24)

#define XN_FLAG_FN_ALIGN	(1 << 25)	/* Align field names to 20 characters */

/* Complete set of RFC2253 flags */

#define XN_FLAG_RFC2253 (ASN1_STRFLGS_RFC2253 | \
			XN_FLAG_SEP_COMMA_PLUS | \
			XN_FLAG_DN_REV | \
			XN_FLAG_FN_SN | \
			XN_FLAG_DUMP_UNKNOWN_FIELDS)

/* readable oneline form */

#define XN_FLAG_ONELINE (ASN1_STRFLGS_RFC2253 | \
			ASN1_STRFLGS_ESC_QUOTE | \
			XN_FLAG_SEP_CPLUS_SPC | \
			XN_FLAG_SPC_EQ | \
			XN_FLAG_FN_SN)

/* readable multiline form */

#define XN_FLAG_MULTILINE (ASN1_STRFLGS_ESC_CTRL | \
			ASN1_STRFLGS_ESC_MSB | \
			XN_FLAG_SEP_MULTILINE | \
			XN_FLAG_SPC_EQ | \
			XN_FLAG_FN_LN | \
			XN_FLAG_FN_ALIGN)

typedef struct X509_revoked_st
	{
	ASN1_INTEGER *serialNumber;
	ASN1_TIME *revocationDate;
	STACK_OF(X509_EXTENSION) /* optional */ *extensions;
	int sequence; /* load sequence */
	} X509_REVOKED;

DECLARE_STACK_OF(X509_REVOKED)
DECLARE_ASN1_SET_OF(X509_REVOKED)

typedef struct X509_crl_info_st
	{
	ASN1_INTEGER *version;
	X509_ALGOR *sig_alg;
	X509_NAME *issuer;
	ASN1_TIME *lastUpdate;
	ASN1_TIME *nextUpdate;
	STACK_OF(X509_REVOKED) *revoked;
	STACK_OF(X509_EXTENSION) /* [0] */ *extensions;
	ASN1_ENCODING enc;
	} X509_CRL_INFO;

struct X509_crl_st
	{
	/* actual signature */
	X509_CRL_INFO *crl;
	X509_ALGOR *sig_alg;
	ASN1_BIT_STRING *signature;
	int references;
	} /* X509_CRL */;

DECLARE_STACK_OF(X509_CRL)
DECLARE_ASN1_SET_OF(X509_CRL)

typedef struct private_key_st
	{
	int version;
	/* The PKCS#8 data types */
	X509_ALGOR *enc_algor;
	ASN1_OCTET_STRING *enc_pkey;	/* encrypted pub key */

	/* When decrypted, the following will not be NULL */
	EVP_PKEY *dec_pkey;

	/* used to encrypt and decrypt */
	int key_length;
	char *key_data;
	int key_free;	/* true if we should auto free key_data */

	/* expanded version of 'enc_algor' */
	EVP_CIPHER_INFO cipher;

	int references;
	} X509_PKEY;

#ifndef OPENSSL_NO_EVP
typedef struct X509_info_st
	{
	X509 *x509;
	X509_CRL *crl;
	X509_PKEY *x_pkey;

	EVP_CIPHER_INFO enc_cipher;
	int enc_len;
	char *enc_data;

	int references;
	} X509_INFO;

DECLARE_STACK_OF(X509_INFO)
#endif

/* The next 2 structures and their 8 routines were sent to me by
 * Pat Richard  and are used to manipulate
 * Netscapes spki structures - useful if you are writing a CA web page
 */
typedef struct Netscape_spkac_st
	{
	X509_PUBKEY *pubkey;
	ASN1_IA5STRING *challenge;	/* challenge sent in atlas >= PR2 */
	} NETSCAPE_SPKAC;

typedef struct Netscape_spki_st
	{
	NETSCAPE_SPKAC *spkac;	/* signed public key and challenge */
	X509_ALGOR *sig_algor;
	ASN1_BIT_STRING *signature;
	} NETSCAPE_SPKI;

/* Netscape certificate sequence structure */
typedef struct Netscape_certificate_sequence
	{
	ASN1_OBJECT *type;
	STACK_OF(X509) *certs;
	} NETSCAPE_CERT_SEQUENCE;

/* Unused (and iv length is wrong)
typedef struct CBCParameter_st
	{
	unsigned char iv[8];
	} CBC_PARAM;
*/

/* Password based encryption structure */

typedef struct PBEPARAM_st {
ASN1_OCTET_STRING *salt;
ASN1_INTEGER *iter;
} PBEPARAM;

/* Password based encryption V2 structures */

typedef struct PBE2PARAM_st {
X509_ALGOR *keyfunc;
X509_ALGOR *encryption;
} PBE2PARAM;

typedef struct PBKDF2PARAM_st {
ASN1_TYPE *salt;	/* Usually OCTET STRING but could be anything */
ASN1_INTEGER *iter;
ASN1_INTEGER *keylength;
X509_ALGOR *prf;
} PBKDF2PARAM;


/* PKCS#8 private key info structure */

typedef struct pkcs8_priv_key_info_st
        {
        int broken;     /* Flag for various broken formats */
#define PKCS8_OK		0
#define PKCS8_NO_OCTET		1
#define PKCS8_EMBEDDED_PARAM	2
#define PKCS8_NS_DB		3
        ASN1_INTEGER *version;
        X509_ALGOR *pkeyalg;
        ASN1_TYPE *pkey; /* Should be OCTET STRING but some are broken */
        STACK_OF(X509_ATTRIBUTE) *attributes;
        } PKCS8_PRIV_KEY_INFO;

#ifdef  __cplusplus
}
#endif

#include 
#include 

#ifdef  __cplusplus
extern "C" {
#endif

#ifdef SSLEAY_MACROS
#define X509_verify(a,r) ASN1_verify((int (*)())i2d_X509_CINF,a->sig_alg,\
	a->signature,(char *)a->cert_info,r)
#define X509_REQ_verify(a,r) ASN1_verify((int (*)())i2d_X509_REQ_INFO, \
	a->sig_alg,a->signature,(char *)a->req_info,r)
#define X509_CRL_verify(a,r) ASN1_verify((int (*)())i2d_X509_CRL_INFO, \
	a->sig_alg, a->signature,(char *)a->crl,r)

#define X509_sign(x,pkey,md) \
	ASN1_sign((int (*)())i2d_X509_CINF, x->cert_info->signature, \
		x->sig_alg, x->signature, (char *)x->cert_info,pkey,md)
#define X509_REQ_sign(x,pkey,md) \
	ASN1_sign((int (*)())i2d_X509_REQ_INFO,x->sig_alg, NULL, \
		x->signature, (char *)x->req_info,pkey,md)
#define X509_CRL_sign(x,pkey,md) \
	ASN1_sign((int (*)())i2d_X509_CRL_INFO,x->crl->sig_alg,x->sig_alg, \
		x->signature, (char *)x->crl,pkey,md)
#define NETSCAPE_SPKI_sign(x,pkey,md) \
	ASN1_sign((int (*)())i2d_NETSCAPE_SPKAC, x->sig_algor,NULL, \
		x->signature, (char *)x->spkac,pkey,md)

#define X509_dup(x509) (X509 *)ASN1_dup((int (*)())i2d_X509, \
		(char *(*)())d2i_X509,(char *)x509)
#define X509_ATTRIBUTE_dup(xa) (X509_ATTRIBUTE *)ASN1_dup(\
		(int (*)())i2d_X509_ATTRIBUTE, \
		(char *(*)())d2i_X509_ATTRIBUTE,(char *)xa)
#define X509_EXTENSION_dup(ex) (X509_EXTENSION *)ASN1_dup( \
		(int (*)())i2d_X509_EXTENSION, \
		(char *(*)())d2i_X509_EXTENSION,(char *)ex)
#define d2i_X509_fp(fp,x509) (X509 *)ASN1_d2i_fp((char *(*)())X509_new, \
		(char *(*)())d2i_X509, (fp),(unsigned char **)(x509))
#define i2d_X509_fp(fp,x509) ASN1_i2d_fp(i2d_X509,fp,(unsigned char *)x509)
#define d2i_X509_bio(bp,x509) (X509 *)ASN1_d2i_bio((char *(*)())X509_new, \
		(char *(*)())d2i_X509, (bp),(unsigned char **)(x509))
#define i2d_X509_bio(bp,x509) ASN1_i2d_bio(i2d_X509,bp,(unsigned char *)x509)

#define X509_CRL_dup(crl) (X509_CRL *)ASN1_dup((int (*)())i2d_X509_CRL, \
		(char *(*)())d2i_X509_CRL,(char *)crl)
#define d2i_X509_CRL_fp(fp,crl) (X509_CRL *)ASN1_d2i_fp((char *(*)()) \
		X509_CRL_new,(char *(*)())d2i_X509_CRL, (fp),\
		(unsigned char **)(crl))
#define i2d_X509_CRL_fp(fp,crl) ASN1_i2d_fp(i2d_X509_CRL,fp,\
		(unsigned char *)crl)
#define d2i_X509_CRL_bio(bp,crl) (X509_CRL *)ASN1_d2i_bio((char *(*)()) \
		X509_CRL_new,(char *(*)())d2i_X509_CRL, (bp),\
		(unsigned char **)(crl))
#define i2d_X509_CRL_bio(bp,crl) ASN1_i2d_bio(i2d_X509_CRL,bp,\
		(unsigned char *)crl)

#define PKCS7_dup(p7) (PKCS7 *)ASN1_dup((int (*)())i2d_PKCS7, \
		(char *(*)())d2i_PKCS7,(char *)p7)
#define d2i_PKCS7_fp(fp,p7) (PKCS7 *)ASN1_d2i_fp((char *(*)()) \
		PKCS7_new,(char *(*)())d2i_PKCS7, (fp),\
		(unsigned char **)(p7))
#define i2d_PKCS7_fp(fp,p7) ASN1_i2d_fp(i2d_PKCS7,fp,\
		(unsigned char *)p7)
#define d2i_PKCS7_bio(bp,p7) (PKCS7 *)ASN1_d2i_bio((char *(*)()) \
		PKCS7_new,(char *(*)())d2i_PKCS7, (bp),\
		(unsigned char **)(p7))
#define i2d_PKCS7_bio(bp,p7) ASN1_i2d_bio(i2d_PKCS7,bp,\
		(unsigned char *)p7)

#define X509_REQ_dup(req) (X509_REQ *)ASN1_dup((int (*)())i2d_X509_REQ, \
		(char *(*)())d2i_X509_REQ,(char *)req)
#define d2i_X509_REQ_fp(fp,req) (X509_REQ *)ASN1_d2i_fp((char *(*)())\
		X509_REQ_new, (char *(*)())d2i_X509_REQ, (fp),\
		(unsigned char **)(req))
#define i2d_X509_REQ_fp(fp,req) ASN1_i2d_fp(i2d_X509_REQ,fp,\
		(unsigned char *)req)
#define d2i_X509_REQ_bio(bp,req) (X509_REQ *)ASN1_d2i_bio((char *(*)())\
		X509_REQ_new, (char *(*)())d2i_X509_REQ, (bp),\
		(unsigned char **)(req))
#define i2d_X509_REQ_bio(bp,req) ASN1_i2d_bio(i2d_X509_REQ,bp,\
		(unsigned char *)req)

#define RSAPublicKey_dup(rsa) (RSA *)ASN1_dup((int (*)())i2d_RSAPublicKey, \
		(char *(*)())d2i_RSAPublicKey,(char *)rsa)
#define RSAPrivateKey_dup(rsa) (RSA *)ASN1_dup((int (*)())i2d_RSAPrivateKey, \
		(char *(*)())d2i_RSAPrivateKey,(char *)rsa)

#define d2i_RSAPrivateKey_fp(fp,rsa) (RSA *)ASN1_d2i_fp((char *(*)())\
		RSA_new,(char *(*)())d2i_RSAPrivateKey, (fp), \
		(unsigned char **)(rsa))
#define i2d_RSAPrivateKey_fp(fp,rsa) ASN1_i2d_fp(i2d_RSAPrivateKey,fp, \
		(unsigned char *)rsa)
#define d2i_RSAPrivateKey_bio(bp,rsa) (RSA *)ASN1_d2i_bio((char *(*)())\
		RSA_new,(char *(*)())d2i_RSAPrivateKey, (bp), \
		(unsigned char **)(rsa))
#define i2d_RSAPrivateKey_bio(bp,rsa) ASN1_i2d_bio(i2d_RSAPrivateKey,bp, \
		(unsigned char *)rsa)

#define d2i_RSAPublicKey_fp(fp,rsa) (RSA *)ASN1_d2i_fp((char *(*)())\
		RSA_new,(char *(*)())d2i_RSAPublicKey, (fp), \
		(unsigned char **)(rsa))
#define i2d_RSAPublicKey_fp(fp,rsa) ASN1_i2d_fp(i2d_RSAPublicKey,fp, \
		(unsigned char *)rsa)
#define d2i_RSAPublicKey_bio(bp,rsa) (RSA *)ASN1_d2i_bio((char *(*)())\
		RSA_new,(char *(*)())d2i_RSAPublicKey, (bp), \
		(unsigned char **)(rsa))
#define i2d_RSAPublicKey_bio(bp,rsa) ASN1_i2d_bio(i2d_RSAPublicKey,bp, \
		(unsigned char *)rsa)

#define d2i_DSAPrivateKey_fp(fp,dsa) (DSA *)ASN1_d2i_fp((char *(*)())\
		DSA_new,(char *(*)())d2i_DSAPrivateKey, (fp), \
		(unsigned char **)(dsa))
#define i2d_DSAPrivateKey_fp(fp,dsa) ASN1_i2d_fp(i2d_DSAPrivateKey,fp, \
		(unsigned char *)dsa)
#define d2i_DSAPrivateKey_bio(bp,dsa) (DSA *)ASN1_d2i_bio((char *(*)())\
		DSA_new,(char *(*)())d2i_DSAPrivateKey, (bp), \
		(unsigned char **)(dsa))
#define i2d_DSAPrivateKey_bio(bp,dsa) ASN1_i2d_bio(i2d_DSAPrivateKey,bp, \
		(unsigned char *)dsa)

#define d2i_ECPrivateKey_fp(fp,ecdsa) (EC_KEY *)ASN1_d2i_fp((char *(*)())\
		EC_KEY_new,(char *(*)())d2i_ECPrivateKey, (fp), \
		(unsigned char **)(ecdsa))
#define i2d_ECPrivateKey_fp(fp,ecdsa) ASN1_i2d_fp(i2d_ECPrivateKey,fp, \
		(unsigned char *)ecdsa)
#define d2i_ECPrivateKey_bio(bp,ecdsa) (EC_KEY *)ASN1_d2i_bio((char *(*)())\
		EC_KEY_new,(char *(*)())d2i_ECPrivateKey, (bp), \
		(unsigned char **)(ecdsa))
#define i2d_ECPrivateKey_bio(bp,ecdsa) ASN1_i2d_bio(i2d_ECPrivateKey,bp, \
		(unsigned char *)ecdsa)

#define X509_ALGOR_dup(xn) (X509_ALGOR *)ASN1_dup((int (*)())i2d_X509_ALGOR,\
		(char *(*)())d2i_X509_ALGOR,(char *)xn)

#define X509_NAME_dup(xn) (X509_NAME *)ASN1_dup((int (*)())i2d_X509_NAME, \
		(char *(*)())d2i_X509_NAME,(char *)xn)
#define X509_NAME_ENTRY_dup(ne) (X509_NAME_ENTRY *)ASN1_dup( \
		(int (*)())i2d_X509_NAME_ENTRY, \
		(char *(*)())d2i_X509_NAME_ENTRY,\
		(char *)ne)

#define X509_digest(data,type,md,len) \
	ASN1_digest((int (*)())i2d_X509,type,(char *)data,md,len)
#define X509_NAME_digest(data,type,md,len) \
	ASN1_digest((int (*)())i2d_X509_NAME,type,(char *)data,md,len)
#ifndef PKCS7_ISSUER_AND_SERIAL_digest
#define PKCS7_ISSUER_AND_SERIAL_digest(data,type,md,len) \
	ASN1_digest((int (*)())i2d_PKCS7_ISSUER_AND_SERIAL,type,\
		(char *)data,md,len)
#endif
#endif

#define X509_EXT_PACK_UNKNOWN	1
#define X509_EXT_PACK_STRING	2

#define		X509_get_version(x) ASN1_INTEGER_get((x)->cert_info->version)
/* #define	X509_get_serialNumber(x) ((x)->cert_info->serialNumber) */
#define		X509_get_notBefore(x) ((x)->cert_info->validity->notBefore)
#define		X509_get_notAfter(x) ((x)->cert_info->validity->notAfter)
#define		X509_extract_key(x)	X509_get_pubkey(x) /*****/
#define		X509_REQ_get_version(x) ASN1_INTEGER_get((x)->req_info->version)
#define		X509_REQ_get_subject_name(x) ((x)->req_info->subject)
#define		X509_REQ_extract_key(a)	X509_REQ_get_pubkey(a)
#define		X509_name_cmp(a,b)	X509_NAME_cmp((a),(b))
#define		X509_get_signature_type(x) EVP_PKEY_type(OBJ_obj2nid((x)->sig_alg->algorithm))

#define		X509_CRL_get_version(x) ASN1_INTEGER_get((x)->crl->version)
#define 	X509_CRL_get_lastUpdate(x) ((x)->crl->lastUpdate)
#define 	X509_CRL_get_nextUpdate(x) ((x)->crl->nextUpdate)
#define		X509_CRL_get_issuer(x) ((x)->crl->issuer)
#define		X509_CRL_get_REVOKED(x) ((x)->crl->revoked)

/* This one is only used so that a binary form can output, as in
 * i2d_X509_NAME(X509_get_X509_PUBKEY(x),&buf) */
#define 	X509_get_X509_PUBKEY(x) ((x)->cert_info->key)


const char *X509_verify_cert_error_string(long n);

#ifndef SSLEAY_MACROS
#ifndef OPENSSL_NO_EVP
int X509_verify(X509 *a, EVP_PKEY *r);

int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r);
int X509_CRL_verify(X509_CRL *a, EVP_PKEY *r);
int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r);

NETSCAPE_SPKI * NETSCAPE_SPKI_b64_decode(const char *str, int len);
char * NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *x);
EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x);
int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey);

int NETSCAPE_SPKI_print(BIO *out, NETSCAPE_SPKI *spki);

int X509_signature_print(BIO *bp,X509_ALGOR *alg, ASN1_STRING *sig);

int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md);
int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md);
int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md);
int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md);

int X509_pubkey_digest(const X509 *data,const EVP_MD *type,
		unsigned char *md, unsigned int *len);
int X509_digest(const X509 *data,const EVP_MD *type,
		unsigned char *md, unsigned int *len);
int X509_CRL_digest(const X509_CRL *data,const EVP_MD *type,
		unsigned char *md, unsigned int *len);
int X509_REQ_digest(const X509_REQ *data,const EVP_MD *type,
		unsigned char *md, unsigned int *len);
int X509_NAME_digest(const X509_NAME *data,const EVP_MD *type,
		unsigned char *md, unsigned int *len);
#endif

#ifndef OPENSSL_NO_FP_API
X509 *d2i_X509_fp(FILE *fp, X509 **x509);
int i2d_X509_fp(FILE *fp,X509 *x509);
X509_CRL *d2i_X509_CRL_fp(FILE *fp,X509_CRL **crl);
int i2d_X509_CRL_fp(FILE *fp,X509_CRL *crl);
X509_REQ *d2i_X509_REQ_fp(FILE *fp,X509_REQ **req);
int i2d_X509_REQ_fp(FILE *fp,X509_REQ *req);
#ifndef OPENSSL_NO_RSA
RSA *d2i_RSAPrivateKey_fp(FILE *fp,RSA **rsa);
int i2d_RSAPrivateKey_fp(FILE *fp,RSA *rsa);
RSA *d2i_RSAPublicKey_fp(FILE *fp,RSA **rsa);
int i2d_RSAPublicKey_fp(FILE *fp,RSA *rsa);
RSA *d2i_RSA_PUBKEY_fp(FILE *fp,RSA **rsa);
int i2d_RSA_PUBKEY_fp(FILE *fp,RSA *rsa);
#endif
#ifndef OPENSSL_NO_DSA
DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa);
int i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa);
DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa);
int i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa);
#endif
#ifndef OPENSSL_NO_EC
EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey);
int   i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey);
EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey);
int   i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey);
#endif
X509_SIG *d2i_PKCS8_fp(FILE *fp,X509_SIG **p8);
int i2d_PKCS8_fp(FILE *fp,X509_SIG *p8);
PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,
						PKCS8_PRIV_KEY_INFO **p8inf);
int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,PKCS8_PRIV_KEY_INFO *p8inf);
int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, EVP_PKEY *key);
int i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey);
EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a);
int i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey);
EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a);
#endif

#ifndef OPENSSL_NO_BIO
X509 *d2i_X509_bio(BIO *bp,X509 **x509);
int i2d_X509_bio(BIO *bp,X509 *x509);
X509_CRL *d2i_X509_CRL_bio(BIO *bp,X509_CRL **crl);
int i2d_X509_CRL_bio(BIO *bp,X509_CRL *crl);
X509_REQ *d2i_X509_REQ_bio(BIO *bp,X509_REQ **req);
int i2d_X509_REQ_bio(BIO *bp,X509_REQ *req);
#ifndef OPENSSL_NO_RSA
RSA *d2i_RSAPrivateKey_bio(BIO *bp,RSA **rsa);
int i2d_RSAPrivateKey_bio(BIO *bp,RSA *rsa);
RSA *d2i_RSAPublicKey_bio(BIO *bp,RSA **rsa);
int i2d_RSAPublicKey_bio(BIO *bp,RSA *rsa);
RSA *d2i_RSA_PUBKEY_bio(BIO *bp,RSA **rsa);
int i2d_RSA_PUBKEY_bio(BIO *bp,RSA *rsa);
#endif
#ifndef OPENSSL_NO_DSA
DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa);
int i2d_DSA_PUBKEY_bio(BIO *bp, DSA *dsa);
DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa);
int i2d_DSAPrivateKey_bio(BIO *bp, DSA *dsa);
#endif
#ifndef OPENSSL_NO_EC
EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey);
int   i2d_EC_PUBKEY_bio(BIO *bp, EC_KEY *eckey);
EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey);
int   i2d_ECPrivateKey_bio(BIO *bp, EC_KEY *eckey);
#endif
X509_SIG *d2i_PKCS8_bio(BIO *bp,X509_SIG **p8);
int i2d_PKCS8_bio(BIO *bp,X509_SIG *p8);
PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,
						PKCS8_PRIV_KEY_INFO **p8inf);
int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,PKCS8_PRIV_KEY_INFO *p8inf);
int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, EVP_PKEY *key);
int i2d_PrivateKey_bio(BIO *bp, EVP_PKEY *pkey);
EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a);
int i2d_PUBKEY_bio(BIO *bp, EVP_PKEY *pkey);
EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a);
#endif

X509 *X509_dup(X509 *x509);
X509_ATTRIBUTE *X509_ATTRIBUTE_dup(X509_ATTRIBUTE *xa);
X509_EXTENSION *X509_EXTENSION_dup(X509_EXTENSION *ex);
X509_CRL *X509_CRL_dup(X509_CRL *crl);
X509_REQ *X509_REQ_dup(X509_REQ *req);
X509_ALGOR *X509_ALGOR_dup(X509_ALGOR *xn);
int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype, void *pval);
void X509_ALGOR_get0(ASN1_OBJECT **paobj, int *pptype, void **ppval,
						X509_ALGOR *algor);

X509_NAME *X509_NAME_dup(X509_NAME *xn);
X509_NAME_ENTRY *X509_NAME_ENTRY_dup(X509_NAME_ENTRY *ne);

#endif /* !SSLEAY_MACROS */

int		X509_cmp_time(ASN1_TIME *s, time_t *t);
int		X509_cmp_current_time(ASN1_TIME *s);
ASN1_TIME *	X509_time_adj(ASN1_TIME *s, long adj, time_t *t);
ASN1_TIME *	X509_gmtime_adj(ASN1_TIME *s, long adj);

const char *	X509_get_default_cert_area(void );
const char *	X509_get_default_cert_dir(void );
const char *	X509_get_default_cert_file(void );
const char *	X509_get_default_cert_dir_env(void );
const char *	X509_get_default_cert_file_env(void );
const char *	X509_get_default_private_dir(void );

X509_REQ *	X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md);
X509 *		X509_REQ_to_X509(X509_REQ *r, int days,EVP_PKEY *pkey);

DECLARE_ASN1_FUNCTIONS(X509_ALGOR)
DECLARE_ASN1_ENCODE_FUNCTIONS(X509_ALGORS, X509_ALGORS, X509_ALGORS)
DECLARE_ASN1_FUNCTIONS(X509_VAL)

DECLARE_ASN1_FUNCTIONS(X509_PUBKEY)

int		X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey);
EVP_PKEY *	X509_PUBKEY_get(X509_PUBKEY *key);
int		X509_get_pubkey_parameters(EVP_PKEY *pkey,
					   STACK_OF(X509) *chain);
int		i2d_PUBKEY(EVP_PKEY *a,unsigned char **pp);
EVP_PKEY *	d2i_PUBKEY(EVP_PKEY **a,const unsigned char **pp,
			long length);
#ifndef OPENSSL_NO_RSA
int		i2d_RSA_PUBKEY(RSA *a,unsigned char **pp);
RSA *		d2i_RSA_PUBKEY(RSA **a,const unsigned char **pp,
			long length);
#endif
#ifndef OPENSSL_NO_DSA
int		i2d_DSA_PUBKEY(DSA *a,unsigned char **pp);
DSA *		d2i_DSA_PUBKEY(DSA **a,const unsigned char **pp,
			long length);
#endif
#ifndef OPENSSL_NO_EC
int		i2d_EC_PUBKEY(EC_KEY *a, unsigned char **pp);
EC_KEY 		*d2i_EC_PUBKEY(EC_KEY **a, const unsigned char **pp,
			long length);
#endif

DECLARE_ASN1_FUNCTIONS(X509_SIG)
DECLARE_ASN1_FUNCTIONS(X509_REQ_INFO)
DECLARE_ASN1_FUNCTIONS(X509_REQ)

DECLARE_ASN1_FUNCTIONS(X509_ATTRIBUTE)
X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value);

DECLARE_ASN1_FUNCTIONS(X509_EXTENSION)
DECLARE_ASN1_ENCODE_FUNCTIONS(X509_EXTENSIONS, X509_EXTENSIONS, X509_EXTENSIONS)

DECLARE_ASN1_FUNCTIONS(X509_NAME_ENTRY)

DECLARE_ASN1_FUNCTIONS(X509_NAME)

int		X509_NAME_set(X509_NAME **xn, X509_NAME *name);

DECLARE_ASN1_FUNCTIONS(X509_CINF)

DECLARE_ASN1_FUNCTIONS(X509)
DECLARE_ASN1_FUNCTIONS(X509_CERT_AUX)

DECLARE_ASN1_FUNCTIONS(X509_CERT_PAIR)

int X509_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
	     CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
int X509_set_ex_data(X509 *r, int idx, void *arg);
void *X509_get_ex_data(X509 *r, int idx);
int		i2d_X509_AUX(X509 *a,unsigned char **pp);
X509 *		d2i_X509_AUX(X509 **a,const unsigned char **pp,long length);

int X509_alias_set1(X509 *x, unsigned char *name, int len);
int X509_keyid_set1(X509 *x, unsigned char *id, int len);
unsigned char * X509_alias_get0(X509 *x, int *len);
unsigned char * X509_keyid_get0(X509 *x, int *len);
int (*X509_TRUST_set_default(int (*trust)(int , X509 *, int)))(int, X509 *, int);
int X509_TRUST_set(int *t, int trust);
int X509_add1_trust_object(X509 *x, ASN1_OBJECT *obj);
int X509_add1_reject_object(X509 *x, ASN1_OBJECT *obj);
void X509_trust_clear(X509 *x);
void X509_reject_clear(X509 *x);

DECLARE_ASN1_FUNCTIONS(X509_REVOKED)
DECLARE_ASN1_FUNCTIONS(X509_CRL_INFO)
DECLARE_ASN1_FUNCTIONS(X509_CRL)

int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev);

X509_PKEY *	X509_PKEY_new(void );
void		X509_PKEY_free(X509_PKEY *a);
int		i2d_X509_PKEY(X509_PKEY *a,unsigned char **pp);
X509_PKEY *	d2i_X509_PKEY(X509_PKEY **a,const unsigned char **pp,long length);

DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKI)
DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKAC)
DECLARE_ASN1_FUNCTIONS(NETSCAPE_CERT_SEQUENCE)

#ifndef OPENSSL_NO_EVP
X509_INFO *	X509_INFO_new(void);
void		X509_INFO_free(X509_INFO *a);
char *		X509_NAME_oneline(X509_NAME *a,char *buf,int size);

int ASN1_verify(i2d_of_void *i2d, X509_ALGOR *algor1,
		ASN1_BIT_STRING *signature,char *data,EVP_PKEY *pkey);

int ASN1_digest(i2d_of_void *i2d,const EVP_MD *type,char *data,
		unsigned char *md,unsigned int *len);

int ASN1_sign(i2d_of_void *i2d, X509_ALGOR *algor1,
	      X509_ALGOR *algor2, ASN1_BIT_STRING *signature,
	      char *data,EVP_PKEY *pkey, const EVP_MD *type);

int ASN1_item_digest(const ASN1_ITEM *it,const EVP_MD *type,void *data,
	unsigned char *md,unsigned int *len);

int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *algor1,
	ASN1_BIT_STRING *signature,void *data,EVP_PKEY *pkey);

int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, X509_ALGOR *algor2,
	ASN1_BIT_STRING *signature,
	void *data, EVP_PKEY *pkey, const EVP_MD *type);
#endif

int 		X509_set_version(X509 *x,long version);
int 		X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial);
ASN1_INTEGER *	X509_get_serialNumber(X509 *x);
int 		X509_set_issuer_name(X509 *x, X509_NAME *name);
X509_NAME *	X509_get_issuer_name(X509 *a);
int 		X509_set_subject_name(X509 *x, X509_NAME *name);
X509_NAME *	X509_get_subject_name(X509 *a);
int 		X509_set_notBefore(X509 *x, ASN1_TIME *tm);
int 		X509_set_notAfter(X509 *x, ASN1_TIME *tm);
int 		X509_set_pubkey(X509 *x, EVP_PKEY *pkey);
EVP_PKEY *	X509_get_pubkey(X509 *x);
ASN1_BIT_STRING * X509_get0_pubkey_bitstr(const X509 *x);
int		X509_certificate_type(X509 *x,EVP_PKEY *pubkey /* optional */);

int		X509_REQ_set_version(X509_REQ *x,long version);
int		X509_REQ_set_subject_name(X509_REQ *req,X509_NAME *name);
int		X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey);
EVP_PKEY *	X509_REQ_get_pubkey(X509_REQ *req);
int		X509_REQ_extension_nid(int nid);
int *		X509_REQ_get_extension_nids(void);
void		X509_REQ_set_extension_nids(int *nids);
STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req);
int X509_REQ_add_extensions_nid(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts,
				int nid);
int X509_REQ_add_extensions(X509_REQ *req, STACK_OF(X509_EXTENSION) *exts);
int X509_REQ_get_attr_count(const X509_REQ *req);
int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid,
			  int lastpos);
int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, ASN1_OBJECT *obj,
			  int lastpos);
X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc);
X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc);
int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr);
int X509_REQ_add1_attr_by_OBJ(X509_REQ *req,
			const ASN1_OBJECT *obj, int type,
			const unsigned char *bytes, int len);
int X509_REQ_add1_attr_by_NID(X509_REQ *req,
			int nid, int type,
			const unsigned char *bytes, int len);
int X509_REQ_add1_attr_by_txt(X509_REQ *req,
			const char *attrname, int type,
			const unsigned char *bytes, int len);

int X509_CRL_set_version(X509_CRL *x, long version);
int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name);
int X509_CRL_set_lastUpdate(X509_CRL *x, ASN1_TIME *tm);
int X509_CRL_set_nextUpdate(X509_CRL *x, ASN1_TIME *tm);
int X509_CRL_sort(X509_CRL *crl);

int X509_REVOKED_set_serialNumber(X509_REVOKED *x, ASN1_INTEGER *serial);
int X509_REVOKED_set_revocationDate(X509_REVOKED *r, ASN1_TIME *tm);

int		X509_REQ_check_private_key(X509_REQ *x509,EVP_PKEY *pkey);

int		X509_check_private_key(X509 *x509,EVP_PKEY *pkey);

int		X509_issuer_and_serial_cmp(const X509 *a, const X509 *b);
unsigned long	X509_issuer_and_serial_hash(X509 *a);

int		X509_issuer_name_cmp(const X509 *a, const X509 *b);
unsigned long	X509_issuer_name_hash(X509 *a);

int		X509_subject_name_cmp(const X509 *a, const X509 *b);
unsigned long	X509_subject_name_hash(X509 *x);

int		X509_cmp(const X509 *a, const X509 *b);
int		X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b);
unsigned long	X509_NAME_hash(X509_NAME *x);

int		X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b);
#ifndef OPENSSL_NO_FP_API
int		X509_print_ex_fp(FILE *bp,X509 *x, unsigned long nmflag, unsigned long cflag);
int		X509_print_fp(FILE *bp,X509 *x);
int		X509_CRL_print_fp(FILE *bp,X509_CRL *x);
int		X509_REQ_print_fp(FILE *bp,X509_REQ *req);
int X509_NAME_print_ex_fp(FILE *fp, X509_NAME *nm, int indent, unsigned long flags);
#endif

#ifndef OPENSSL_NO_BIO
int		X509_NAME_print(BIO *bp, X509_NAME *name, int obase);
int X509_NAME_print_ex(BIO *out, X509_NAME *nm, int indent, unsigned long flags);
int		X509_print_ex(BIO *bp,X509 *x, unsigned long nmflag, unsigned long cflag);
int		X509_print(BIO *bp,X509 *x);
int		X509_ocspid_print(BIO *bp,X509 *x);
int		X509_CERT_AUX_print(BIO *bp,X509_CERT_AUX *x, int indent);
int		X509_CRL_print(BIO *bp,X509_CRL *x);
int		X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag, unsigned long cflag);
int		X509_REQ_print(BIO *bp,X509_REQ *req);
#endif

int 		X509_NAME_entry_count(X509_NAME *name);
int 		X509_NAME_get_text_by_NID(X509_NAME *name, int nid,
			char *buf,int len);
int		X509_NAME_get_text_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj,
			char *buf,int len);

/* NOTE: you should be passsing -1, not 0 as lastpos.  The functions that use
 * lastpos, search after that position on. */
int 		X509_NAME_get_index_by_NID(X509_NAME *name,int nid,int lastpos);
int 		X509_NAME_get_index_by_OBJ(X509_NAME *name,ASN1_OBJECT *obj,
			int lastpos);
X509_NAME_ENTRY *X509_NAME_get_entry(X509_NAME *name, int loc);
X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc);
int 		X509_NAME_add_entry(X509_NAME *name,X509_NAME_ENTRY *ne,
			int loc, int set);
int X509_NAME_add_entry_by_OBJ(X509_NAME *name, ASN1_OBJECT *obj, int type,
			unsigned char *bytes, int len, int loc, int set);
int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type,
			unsigned char *bytes, int len, int loc, int set);
X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne,
		const char *field, int type, const unsigned char *bytes, int len);
X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid,
			int type,unsigned char *bytes, int len);
int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type,
			const unsigned char *bytes, int len, int loc, int set);
X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne,
			ASN1_OBJECT *obj, int type,const unsigned char *bytes,
			int len);
int 		X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne,
			ASN1_OBJECT *obj);
int 		X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type,
			const unsigned char *bytes, int len);
ASN1_OBJECT *	X509_NAME_ENTRY_get_object(X509_NAME_ENTRY *ne);
ASN1_STRING *	X509_NAME_ENTRY_get_data(X509_NAME_ENTRY *ne);

int		X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x);
int		X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x,
				      int nid, int lastpos);
int		X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *x,
				      ASN1_OBJECT *obj,int lastpos);
int		X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *x,
					   int crit, int lastpos);
X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc);
X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc);
STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x,
					 X509_EXTENSION *ex, int loc);

int		X509_get_ext_count(X509 *x);
int		X509_get_ext_by_NID(X509 *x, int nid, int lastpos);
int		X509_get_ext_by_OBJ(X509 *x,ASN1_OBJECT *obj,int lastpos);
int		X509_get_ext_by_critical(X509 *x, int crit, int lastpos);
X509_EXTENSION *X509_get_ext(X509 *x, int loc);
X509_EXTENSION *X509_delete_ext(X509 *x, int loc);
int		X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc);
void	*	X509_get_ext_d2i(X509 *x, int nid, int *crit, int *idx);
int		X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit,
							unsigned long flags);

int		X509_CRL_get_ext_count(X509_CRL *x);
int		X509_CRL_get_ext_by_NID(X509_CRL *x, int nid, int lastpos);
int		X509_CRL_get_ext_by_OBJ(X509_CRL *x,ASN1_OBJECT *obj,int lastpos);
int		X509_CRL_get_ext_by_critical(X509_CRL *x, int crit, int lastpos);
X509_EXTENSION *X509_CRL_get_ext(X509_CRL *x, int loc);
X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc);
int		X509_CRL_add_ext(X509_CRL *x, X509_EXTENSION *ex, int loc);
void	*	X509_CRL_get_ext_d2i(X509_CRL *x, int nid, int *crit, int *idx);
int		X509_CRL_add1_ext_i2d(X509_CRL *x, int nid, void *value, int crit,
							unsigned long flags);

int		X509_REVOKED_get_ext_count(X509_REVOKED *x);
int		X509_REVOKED_get_ext_by_NID(X509_REVOKED *x, int nid, int lastpos);
int		X509_REVOKED_get_ext_by_OBJ(X509_REVOKED *x,ASN1_OBJECT *obj,int lastpos);
int		X509_REVOKED_get_ext_by_critical(X509_REVOKED *x, int crit, int lastpos);
X509_EXTENSION *X509_REVOKED_get_ext(X509_REVOKED *x, int loc);
X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x, int loc);
int		X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex, int loc);
void	*	X509_REVOKED_get_ext_d2i(X509_REVOKED *x, int nid, int *crit, int *idx);
int		X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid, void *value, int crit,
							unsigned long flags);

X509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex,
			int nid, int crit, ASN1_OCTET_STRING *data);
X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex,
			ASN1_OBJECT *obj,int crit,ASN1_OCTET_STRING *data);
int		X509_EXTENSION_set_object(X509_EXTENSION *ex,ASN1_OBJECT *obj);
int		X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit);
int		X509_EXTENSION_set_data(X509_EXTENSION *ex,
			ASN1_OCTET_STRING *data);
ASN1_OBJECT *	X509_EXTENSION_get_object(X509_EXTENSION *ex);
ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ne);
int		X509_EXTENSION_get_critical(X509_EXTENSION *ex);

int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x);
int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid,
			  int lastpos);
int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk, ASN1_OBJECT *obj,
			  int lastpos);
X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc);
X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc);
STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x,
					 X509_ATTRIBUTE *attr);
STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE) **x,
			const ASN1_OBJECT *obj, int type,
			const unsigned char *bytes, int len);
STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE) **x,
			int nid, int type,
			const unsigned char *bytes, int len);
STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE) **x,
			const char *attrname, int type,
			const unsigned char *bytes, int len);
void *X509at_get0_data_by_OBJ(STACK_OF(X509_ATTRIBUTE) *x,
				ASN1_OBJECT *obj, int lastpos, int type);
X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid,
	     int atrtype, const void *data, int len);
X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr,
	     const ASN1_OBJECT *obj, int atrtype, const void *data, int len);
X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr,
		const char *atrname, int type, const unsigned char *bytes, int len);
int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj);
int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype, const void *data, int len);
void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx,
					int atrtype, void *data);
int X509_ATTRIBUTE_count(X509_ATTRIBUTE *attr);
ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr);
ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx);

int EVP_PKEY_get_attr_count(const EVP_PKEY *key);
int EVP_PKEY_get_attr_by_NID(const EVP_PKEY *key, int nid,
			  int lastpos);
int EVP_PKEY_get_attr_by_OBJ(const EVP_PKEY *key, ASN1_OBJECT *obj,
			  int lastpos);
X509_ATTRIBUTE *EVP_PKEY_get_attr(const EVP_PKEY *key, int loc);
X509_ATTRIBUTE *EVP_PKEY_delete_attr(EVP_PKEY *key, int loc);
int EVP_PKEY_add1_attr(EVP_PKEY *key, X509_ATTRIBUTE *attr);
int EVP_PKEY_add1_attr_by_OBJ(EVP_PKEY *key,
			const ASN1_OBJECT *obj, int type,
			const unsigned char *bytes, int len);
int EVP_PKEY_add1_attr_by_NID(EVP_PKEY *key,
			int nid, int type,
			const unsigned char *bytes, int len);
int EVP_PKEY_add1_attr_by_txt(EVP_PKEY *key,
			const char *attrname, int type,
			const unsigned char *bytes, int len);

int		X509_verify_cert(X509_STORE_CTX *ctx);

/* lookup a cert from a X509 STACK */
X509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk,X509_NAME *name,
				     ASN1_INTEGER *serial);
X509 *X509_find_by_subject(STACK_OF(X509) *sk,X509_NAME *name);

DECLARE_ASN1_FUNCTIONS(PBEPARAM)
DECLARE_ASN1_FUNCTIONS(PBE2PARAM)
DECLARE_ASN1_FUNCTIONS(PBKDF2PARAM)

X509_ALGOR *PKCS5_pbe_set(int alg, int iter, unsigned char *salt, int saltlen);
X509_ALGOR *PKCS5_pbe2_set(const EVP_CIPHER *cipher, int iter,
					 unsigned char *salt, int saltlen);

/* PKCS#8 utilities */

DECLARE_ASN1_FUNCTIONS(PKCS8_PRIV_KEY_INFO)

EVP_PKEY *EVP_PKCS82PKEY(PKCS8_PRIV_KEY_INFO *p8);
PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(EVP_PKEY *pkey);
PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8_broken(EVP_PKEY *pkey, int broken);
PKCS8_PRIV_KEY_INFO *PKCS8_set_broken(PKCS8_PRIV_KEY_INFO *p8, int broken);

int X509_check_trust(X509 *x, int id, int flags);
int X509_TRUST_get_count(void);
X509_TRUST * X509_TRUST_get0(int idx);
int X509_TRUST_get_by_id(int id);
int X509_TRUST_add(int id, int flags, int (*ck)(X509_TRUST *, X509 *, int),
					char *name, int arg1, void *arg2);
void X509_TRUST_cleanup(void);
int X509_TRUST_get_flags(X509_TRUST *xp);
char *X509_TRUST_get0_name(X509_TRUST *xp);
int X509_TRUST_get_trust(X509_TRUST *xp);

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_X509_strings(void);

/* Error codes for the X509 functions. */

/* Function codes. */
#define X509_F_ADD_CERT_DIR				 100
#define X509_F_BY_FILE_CTRL				 101
#define X509_F_CHECK_POLICY				 145
#define X509_F_DIR_CTRL					 102
#define X509_F_GET_CERT_BY_SUBJECT			 103
#define X509_F_NETSCAPE_SPKI_B64_DECODE			 129
#define X509_F_NETSCAPE_SPKI_B64_ENCODE			 130
#define X509_F_X509AT_ADD1_ATTR				 135
#define X509_F_X509V3_ADD_EXT				 104
#define X509_F_X509_ATTRIBUTE_CREATE_BY_NID		 136
#define X509_F_X509_ATTRIBUTE_CREATE_BY_OBJ		 137
#define X509_F_X509_ATTRIBUTE_CREATE_BY_TXT		 140
#define X509_F_X509_ATTRIBUTE_GET0_DATA			 139
#define X509_F_X509_ATTRIBUTE_SET1_DATA			 138
#define X509_F_X509_CHECK_PRIVATE_KEY			 128
#define X509_F_X509_CRL_PRINT_FP			 147
#define X509_F_X509_EXTENSION_CREATE_BY_NID		 108
#define X509_F_X509_EXTENSION_CREATE_BY_OBJ		 109
#define X509_F_X509_GET_PUBKEY_PARAMETERS		 110
#define X509_F_X509_LOAD_CERT_CRL_FILE			 132
#define X509_F_X509_LOAD_CERT_FILE			 111
#define X509_F_X509_LOAD_CRL_FILE			 112
#define X509_F_X509_NAME_ADD_ENTRY			 113
#define X509_F_X509_NAME_ENTRY_CREATE_BY_NID		 114
#define X509_F_X509_NAME_ENTRY_CREATE_BY_TXT		 131
#define X509_F_X509_NAME_ENTRY_SET_OBJECT		 115
#define X509_F_X509_NAME_ONELINE			 116
#define X509_F_X509_NAME_PRINT				 117
#define X509_F_X509_PRINT_EX_FP				 118
#define X509_F_X509_PUBKEY_GET				 119
#define X509_F_X509_PUBKEY_SET				 120
#define X509_F_X509_REQ_CHECK_PRIVATE_KEY		 144
#define X509_F_X509_REQ_PRINT_EX			 121
#define X509_F_X509_REQ_PRINT_FP			 122
#define X509_F_X509_REQ_TO_X509				 123
#define X509_F_X509_STORE_ADD_CERT			 124
#define X509_F_X509_STORE_ADD_CRL			 125
#define X509_F_X509_STORE_CTX_GET1_ISSUER		 146
#define X509_F_X509_STORE_CTX_INIT			 143
#define X509_F_X509_STORE_CTX_NEW			 142
#define X509_F_X509_STORE_CTX_PURPOSE_INHERIT		 134
#define X509_F_X509_TO_X509_REQ				 126
#define X509_F_X509_TRUST_ADD				 133
#define X509_F_X509_TRUST_SET				 141
#define X509_F_X509_VERIFY_CERT				 127

/* Reason codes. */
#define X509_R_BAD_X509_FILETYPE			 100
#define X509_R_BASE64_DECODE_ERROR			 118
#define X509_R_CANT_CHECK_DH_KEY			 114
#define X509_R_CERT_ALREADY_IN_HASH_TABLE		 101
#define X509_R_ERR_ASN1_LIB				 102
#define X509_R_INVALID_DIRECTORY			 113
#define X509_R_INVALID_FIELD_NAME			 119
#define X509_R_INVALID_TRUST				 123
#define X509_R_KEY_TYPE_MISMATCH			 115
#define X509_R_KEY_VALUES_MISMATCH			 116
#define X509_R_LOADING_CERT_DIR				 103
#define X509_R_LOADING_DEFAULTS				 104
#define X509_R_NO_CERT_SET_FOR_US_TO_VERIFY		 105
#define X509_R_SHOULD_RETRY				 106
#define X509_R_UNABLE_TO_FIND_PARAMETERS_IN_CHAIN	 107
#define X509_R_UNABLE_TO_GET_CERTS_PUBLIC_KEY		 108
#define X509_R_UNKNOWN_KEY_TYPE				 117
#define X509_R_UNKNOWN_NID				 109
#define X509_R_UNKNOWN_PURPOSE_ID			 121
#define X509_R_UNKNOWN_TRUST_ID				 120
#define X509_R_UNSUPPORTED_ALGORITHM			 111
#define X509_R_WRONG_LOOKUP_TYPE			 112
#define X509_R_WRONG_TYPE				 122

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/obj_mac.h0000755000175000017500000037222711341640430020400 0ustar  davidedavide/* crypto/objects/obj_mac.h */

/* THIS FILE IS GENERATED FROM objects.txt by objects.pl via the
 * following command:
 * perl objects.pl objects.txt obj_mac.num obj_mac.h
 */

/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#define SN_undef			"UNDEF"
#define LN_undef			"undefined"
#define NID_undef			0
#define OBJ_undef			0L

#define SN_itu_t		"ITU-T"
#define LN_itu_t		"itu-t"
#define NID_itu_t		645
#define OBJ_itu_t		0L

#define NID_ccitt		404
#define OBJ_ccitt		OBJ_itu_t

#define SN_iso		"ISO"
#define LN_iso		"iso"
#define NID_iso		181
#define OBJ_iso		1L

#define SN_joint_iso_itu_t		"JOINT-ISO-ITU-T"
#define LN_joint_iso_itu_t		"joint-iso-itu-t"
#define NID_joint_iso_itu_t		646
#define OBJ_joint_iso_itu_t		2L

#define NID_joint_iso_ccitt		393
#define OBJ_joint_iso_ccitt		OBJ_joint_iso_itu_t

#define SN_member_body		"member-body"
#define LN_member_body		"ISO Member Body"
#define NID_member_body		182
#define OBJ_member_body		OBJ_iso,2L

#define SN_identified_organization		"identified-organization"
#define NID_identified_organization		676
#define OBJ_identified_organization		OBJ_iso,3L

#define SN_hmac_md5		"HMAC-MD5"
#define LN_hmac_md5		"hmac-md5"
#define NID_hmac_md5		780
#define OBJ_hmac_md5		OBJ_identified_organization,6L,1L,5L,5L,8L,1L,1L

#define SN_hmac_sha1		"HMAC-SHA1"
#define LN_hmac_sha1		"hmac-sha1"
#define NID_hmac_sha1		781
#define OBJ_hmac_sha1		OBJ_identified_organization,6L,1L,5L,5L,8L,1L,2L

#define SN_certicom_arc		"certicom-arc"
#define NID_certicom_arc		677
#define OBJ_certicom_arc		OBJ_identified_organization,132L

#define SN_international_organizations		"international-organizations"
#define LN_international_organizations		"International Organizations"
#define NID_international_organizations		647
#define OBJ_international_organizations		OBJ_joint_iso_itu_t,23L

#define SN_wap		"wap"
#define NID_wap		678
#define OBJ_wap		OBJ_international_organizations,43L

#define SN_wap_wsg		"wap-wsg"
#define NID_wap_wsg		679
#define OBJ_wap_wsg		OBJ_wap,13L

#define SN_selected_attribute_types		"selected-attribute-types"
#define LN_selected_attribute_types		"Selected Attribute Types"
#define NID_selected_attribute_types		394
#define OBJ_selected_attribute_types		OBJ_joint_iso_itu_t,5L,1L,5L

#define SN_clearance		"clearance"
#define NID_clearance		395
#define OBJ_clearance		OBJ_selected_attribute_types,55L

#define SN_ISO_US		"ISO-US"
#define LN_ISO_US		"ISO US Member Body"
#define NID_ISO_US		183
#define OBJ_ISO_US		OBJ_member_body,840L

#define SN_X9_57		"X9-57"
#define LN_X9_57		"X9.57"
#define NID_X9_57		184
#define OBJ_X9_57		OBJ_ISO_US,10040L

#define SN_X9cm		"X9cm"
#define LN_X9cm		"X9.57 CM ?"
#define NID_X9cm		185
#define OBJ_X9cm		OBJ_X9_57,4L

#define SN_dsa		"DSA"
#define LN_dsa		"dsaEncryption"
#define NID_dsa		116
#define OBJ_dsa		OBJ_X9cm,1L

#define SN_dsaWithSHA1		"DSA-SHA1"
#define LN_dsaWithSHA1		"dsaWithSHA1"
#define NID_dsaWithSHA1		113
#define OBJ_dsaWithSHA1		OBJ_X9cm,3L

#define SN_ansi_X9_62		"ansi-X9-62"
#define LN_ansi_X9_62		"ANSI X9.62"
#define NID_ansi_X9_62		405
#define OBJ_ansi_X9_62		OBJ_ISO_US,10045L

#define OBJ_X9_62_id_fieldType		OBJ_ansi_X9_62,1L

#define SN_X9_62_prime_field		"prime-field"
#define NID_X9_62_prime_field		406
#define OBJ_X9_62_prime_field		OBJ_X9_62_id_fieldType,1L

#define SN_X9_62_characteristic_two_field		"characteristic-two-field"
#define NID_X9_62_characteristic_two_field		407
#define OBJ_X9_62_characteristic_two_field		OBJ_X9_62_id_fieldType,2L

#define SN_X9_62_id_characteristic_two_basis		"id-characteristic-two-basis"
#define NID_X9_62_id_characteristic_two_basis		680
#define OBJ_X9_62_id_characteristic_two_basis		OBJ_X9_62_characteristic_two_field,3L

#define SN_X9_62_onBasis		"onBasis"
#define NID_X9_62_onBasis		681
#define OBJ_X9_62_onBasis		OBJ_X9_62_id_characteristic_two_basis,1L

#define SN_X9_62_tpBasis		"tpBasis"
#define NID_X9_62_tpBasis		682
#define OBJ_X9_62_tpBasis		OBJ_X9_62_id_characteristic_two_basis,2L

#define SN_X9_62_ppBasis		"ppBasis"
#define NID_X9_62_ppBasis		683
#define OBJ_X9_62_ppBasis		OBJ_X9_62_id_characteristic_two_basis,3L

#define OBJ_X9_62_id_publicKeyType		OBJ_ansi_X9_62,2L

#define SN_X9_62_id_ecPublicKey		"id-ecPublicKey"
#define NID_X9_62_id_ecPublicKey		408
#define OBJ_X9_62_id_ecPublicKey		OBJ_X9_62_id_publicKeyType,1L

#define OBJ_X9_62_ellipticCurve		OBJ_ansi_X9_62,3L

#define OBJ_X9_62_c_TwoCurve		OBJ_X9_62_ellipticCurve,0L

#define SN_X9_62_c2pnb163v1		"c2pnb163v1"
#define NID_X9_62_c2pnb163v1		684
#define OBJ_X9_62_c2pnb163v1		OBJ_X9_62_c_TwoCurve,1L

#define SN_X9_62_c2pnb163v2		"c2pnb163v2"
#define NID_X9_62_c2pnb163v2		685
#define OBJ_X9_62_c2pnb163v2		OBJ_X9_62_c_TwoCurve,2L

#define SN_X9_62_c2pnb163v3		"c2pnb163v3"
#define NID_X9_62_c2pnb163v3		686
#define OBJ_X9_62_c2pnb163v3		OBJ_X9_62_c_TwoCurve,3L

#define SN_X9_62_c2pnb176v1		"c2pnb176v1"
#define NID_X9_62_c2pnb176v1		687
#define OBJ_X9_62_c2pnb176v1		OBJ_X9_62_c_TwoCurve,4L

#define SN_X9_62_c2tnb191v1		"c2tnb191v1"
#define NID_X9_62_c2tnb191v1		688
#define OBJ_X9_62_c2tnb191v1		OBJ_X9_62_c_TwoCurve,5L

#define SN_X9_62_c2tnb191v2		"c2tnb191v2"
#define NID_X9_62_c2tnb191v2		689
#define OBJ_X9_62_c2tnb191v2		OBJ_X9_62_c_TwoCurve,6L

#define SN_X9_62_c2tnb191v3		"c2tnb191v3"
#define NID_X9_62_c2tnb191v3		690
#define OBJ_X9_62_c2tnb191v3		OBJ_X9_62_c_TwoCurve,7L

#define SN_X9_62_c2onb191v4		"c2onb191v4"
#define NID_X9_62_c2onb191v4		691
#define OBJ_X9_62_c2onb191v4		OBJ_X9_62_c_TwoCurve,8L

#define SN_X9_62_c2onb191v5		"c2onb191v5"
#define NID_X9_62_c2onb191v5		692
#define OBJ_X9_62_c2onb191v5		OBJ_X9_62_c_TwoCurve,9L

#define SN_X9_62_c2pnb208w1		"c2pnb208w1"
#define NID_X9_62_c2pnb208w1		693
#define OBJ_X9_62_c2pnb208w1		OBJ_X9_62_c_TwoCurve,10L

#define SN_X9_62_c2tnb239v1		"c2tnb239v1"
#define NID_X9_62_c2tnb239v1		694
#define OBJ_X9_62_c2tnb239v1		OBJ_X9_62_c_TwoCurve,11L

#define SN_X9_62_c2tnb239v2		"c2tnb239v2"
#define NID_X9_62_c2tnb239v2		695
#define OBJ_X9_62_c2tnb239v2		OBJ_X9_62_c_TwoCurve,12L

#define SN_X9_62_c2tnb239v3		"c2tnb239v3"
#define NID_X9_62_c2tnb239v3		696
#define OBJ_X9_62_c2tnb239v3		OBJ_X9_62_c_TwoCurve,13L

#define SN_X9_62_c2onb239v4		"c2onb239v4"
#define NID_X9_62_c2onb239v4		697
#define OBJ_X9_62_c2onb239v4		OBJ_X9_62_c_TwoCurve,14L

#define SN_X9_62_c2onb239v5		"c2onb239v5"
#define NID_X9_62_c2onb239v5		698
#define OBJ_X9_62_c2onb239v5		OBJ_X9_62_c_TwoCurve,15L

#define SN_X9_62_c2pnb272w1		"c2pnb272w1"
#define NID_X9_62_c2pnb272w1		699
#define OBJ_X9_62_c2pnb272w1		OBJ_X9_62_c_TwoCurve,16L

#define SN_X9_62_c2pnb304w1		"c2pnb304w1"
#define NID_X9_62_c2pnb304w1		700
#define OBJ_X9_62_c2pnb304w1		OBJ_X9_62_c_TwoCurve,17L

#define SN_X9_62_c2tnb359v1		"c2tnb359v1"
#define NID_X9_62_c2tnb359v1		701
#define OBJ_X9_62_c2tnb359v1		OBJ_X9_62_c_TwoCurve,18L

#define SN_X9_62_c2pnb368w1		"c2pnb368w1"
#define NID_X9_62_c2pnb368w1		702
#define OBJ_X9_62_c2pnb368w1		OBJ_X9_62_c_TwoCurve,19L

#define SN_X9_62_c2tnb431r1		"c2tnb431r1"
#define NID_X9_62_c2tnb431r1		703
#define OBJ_X9_62_c2tnb431r1		OBJ_X9_62_c_TwoCurve,20L

#define OBJ_X9_62_primeCurve		OBJ_X9_62_ellipticCurve,1L

#define SN_X9_62_prime192v1		"prime192v1"
#define NID_X9_62_prime192v1		409
#define OBJ_X9_62_prime192v1		OBJ_X9_62_primeCurve,1L

#define SN_X9_62_prime192v2		"prime192v2"
#define NID_X9_62_prime192v2		410
#define OBJ_X9_62_prime192v2		OBJ_X9_62_primeCurve,2L

#define SN_X9_62_prime192v3		"prime192v3"
#define NID_X9_62_prime192v3		411
#define OBJ_X9_62_prime192v3		OBJ_X9_62_primeCurve,3L

#define SN_X9_62_prime239v1		"prime239v1"
#define NID_X9_62_prime239v1		412
#define OBJ_X9_62_prime239v1		OBJ_X9_62_primeCurve,4L

#define SN_X9_62_prime239v2		"prime239v2"
#define NID_X9_62_prime239v2		413
#define OBJ_X9_62_prime239v2		OBJ_X9_62_primeCurve,5L

#define SN_X9_62_prime239v3		"prime239v3"
#define NID_X9_62_prime239v3		414
#define OBJ_X9_62_prime239v3		OBJ_X9_62_primeCurve,6L

#define SN_X9_62_prime256v1		"prime256v1"
#define NID_X9_62_prime256v1		415
#define OBJ_X9_62_prime256v1		OBJ_X9_62_primeCurve,7L

#define OBJ_X9_62_id_ecSigType		OBJ_ansi_X9_62,4L

#define SN_ecdsa_with_SHA1		"ecdsa-with-SHA1"
#define NID_ecdsa_with_SHA1		416
#define OBJ_ecdsa_with_SHA1		OBJ_X9_62_id_ecSigType,1L

#define SN_ecdsa_with_Recommended		"ecdsa-with-Recommended"
#define NID_ecdsa_with_Recommended		791
#define OBJ_ecdsa_with_Recommended		OBJ_X9_62_id_ecSigType,2L

#define SN_ecdsa_with_Specified		"ecdsa-with-Specified"
#define NID_ecdsa_with_Specified		792
#define OBJ_ecdsa_with_Specified		OBJ_X9_62_id_ecSigType,3L

#define SN_ecdsa_with_SHA224		"ecdsa-with-SHA224"
#define NID_ecdsa_with_SHA224		793
#define OBJ_ecdsa_with_SHA224		OBJ_ecdsa_with_Specified,1L

#define SN_ecdsa_with_SHA256		"ecdsa-with-SHA256"
#define NID_ecdsa_with_SHA256		794
#define OBJ_ecdsa_with_SHA256		OBJ_ecdsa_with_Specified,2L

#define SN_ecdsa_with_SHA384		"ecdsa-with-SHA384"
#define NID_ecdsa_with_SHA384		795
#define OBJ_ecdsa_with_SHA384		OBJ_ecdsa_with_Specified,3L

#define SN_ecdsa_with_SHA512		"ecdsa-with-SHA512"
#define NID_ecdsa_with_SHA512		796
#define OBJ_ecdsa_with_SHA512		OBJ_ecdsa_with_Specified,4L

#define OBJ_secg_ellipticCurve		OBJ_certicom_arc,0L

#define SN_secp112r1		"secp112r1"
#define NID_secp112r1		704
#define OBJ_secp112r1		OBJ_secg_ellipticCurve,6L

#define SN_secp112r2		"secp112r2"
#define NID_secp112r2		705
#define OBJ_secp112r2		OBJ_secg_ellipticCurve,7L

#define SN_secp128r1		"secp128r1"
#define NID_secp128r1		706
#define OBJ_secp128r1		OBJ_secg_ellipticCurve,28L

#define SN_secp128r2		"secp128r2"
#define NID_secp128r2		707
#define OBJ_secp128r2		OBJ_secg_ellipticCurve,29L

#define SN_secp160k1		"secp160k1"
#define NID_secp160k1		708
#define OBJ_secp160k1		OBJ_secg_ellipticCurve,9L

#define SN_secp160r1		"secp160r1"
#define NID_secp160r1		709
#define OBJ_secp160r1		OBJ_secg_ellipticCurve,8L

#define SN_secp160r2		"secp160r2"
#define NID_secp160r2		710
#define OBJ_secp160r2		OBJ_secg_ellipticCurve,30L

#define SN_secp192k1		"secp192k1"
#define NID_secp192k1		711
#define OBJ_secp192k1		OBJ_secg_ellipticCurve,31L

#define SN_secp224k1		"secp224k1"
#define NID_secp224k1		712
#define OBJ_secp224k1		OBJ_secg_ellipticCurve,32L

#define SN_secp224r1		"secp224r1"
#define NID_secp224r1		713
#define OBJ_secp224r1		OBJ_secg_ellipticCurve,33L

#define SN_secp256k1		"secp256k1"
#define NID_secp256k1		714
#define OBJ_secp256k1		OBJ_secg_ellipticCurve,10L

#define SN_secp384r1		"secp384r1"
#define NID_secp384r1		715
#define OBJ_secp384r1		OBJ_secg_ellipticCurve,34L

#define SN_secp521r1		"secp521r1"
#define NID_secp521r1		716
#define OBJ_secp521r1		OBJ_secg_ellipticCurve,35L

#define SN_sect113r1		"sect113r1"
#define NID_sect113r1		717
#define OBJ_sect113r1		OBJ_secg_ellipticCurve,4L

#define SN_sect113r2		"sect113r2"
#define NID_sect113r2		718
#define OBJ_sect113r2		OBJ_secg_ellipticCurve,5L

#define SN_sect131r1		"sect131r1"
#define NID_sect131r1		719
#define OBJ_sect131r1		OBJ_secg_ellipticCurve,22L

#define SN_sect131r2		"sect131r2"
#define NID_sect131r2		720
#define OBJ_sect131r2		OBJ_secg_ellipticCurve,23L

#define SN_sect163k1		"sect163k1"
#define NID_sect163k1		721
#define OBJ_sect163k1		OBJ_secg_ellipticCurve,1L

#define SN_sect163r1		"sect163r1"
#define NID_sect163r1		722
#define OBJ_sect163r1		OBJ_secg_ellipticCurve,2L

#define SN_sect163r2		"sect163r2"
#define NID_sect163r2		723
#define OBJ_sect163r2		OBJ_secg_ellipticCurve,15L

#define SN_sect193r1		"sect193r1"
#define NID_sect193r1		724
#define OBJ_sect193r1		OBJ_secg_ellipticCurve,24L

#define SN_sect193r2		"sect193r2"
#define NID_sect193r2		725
#define OBJ_sect193r2		OBJ_secg_ellipticCurve,25L

#define SN_sect233k1		"sect233k1"
#define NID_sect233k1		726
#define OBJ_sect233k1		OBJ_secg_ellipticCurve,26L

#define SN_sect233r1		"sect233r1"
#define NID_sect233r1		727
#define OBJ_sect233r1		OBJ_secg_ellipticCurve,27L

#define SN_sect239k1		"sect239k1"
#define NID_sect239k1		728
#define OBJ_sect239k1		OBJ_secg_ellipticCurve,3L

#define SN_sect283k1		"sect283k1"
#define NID_sect283k1		729
#define OBJ_sect283k1		OBJ_secg_ellipticCurve,16L

#define SN_sect283r1		"sect283r1"
#define NID_sect283r1		730
#define OBJ_sect283r1		OBJ_secg_ellipticCurve,17L

#define SN_sect409k1		"sect409k1"
#define NID_sect409k1		731
#define OBJ_sect409k1		OBJ_secg_ellipticCurve,36L

#define SN_sect409r1		"sect409r1"
#define NID_sect409r1		732
#define OBJ_sect409r1		OBJ_secg_ellipticCurve,37L

#define SN_sect571k1		"sect571k1"
#define NID_sect571k1		733
#define OBJ_sect571k1		OBJ_secg_ellipticCurve,38L

#define SN_sect571r1		"sect571r1"
#define NID_sect571r1		734
#define OBJ_sect571r1		OBJ_secg_ellipticCurve,39L

#define OBJ_wap_wsg_idm_ecid		OBJ_wap_wsg,4L

#define SN_wap_wsg_idm_ecid_wtls1		"wap-wsg-idm-ecid-wtls1"
#define NID_wap_wsg_idm_ecid_wtls1		735
#define OBJ_wap_wsg_idm_ecid_wtls1		OBJ_wap_wsg_idm_ecid,1L

#define SN_wap_wsg_idm_ecid_wtls3		"wap-wsg-idm-ecid-wtls3"
#define NID_wap_wsg_idm_ecid_wtls3		736
#define OBJ_wap_wsg_idm_ecid_wtls3		OBJ_wap_wsg_idm_ecid,3L

#define SN_wap_wsg_idm_ecid_wtls4		"wap-wsg-idm-ecid-wtls4"
#define NID_wap_wsg_idm_ecid_wtls4		737
#define OBJ_wap_wsg_idm_ecid_wtls4		OBJ_wap_wsg_idm_ecid,4L

#define SN_wap_wsg_idm_ecid_wtls5		"wap-wsg-idm-ecid-wtls5"
#define NID_wap_wsg_idm_ecid_wtls5		738
#define OBJ_wap_wsg_idm_ecid_wtls5		OBJ_wap_wsg_idm_ecid,5L

#define SN_wap_wsg_idm_ecid_wtls6		"wap-wsg-idm-ecid-wtls6"
#define NID_wap_wsg_idm_ecid_wtls6		739
#define OBJ_wap_wsg_idm_ecid_wtls6		OBJ_wap_wsg_idm_ecid,6L

#define SN_wap_wsg_idm_ecid_wtls7		"wap-wsg-idm-ecid-wtls7"
#define NID_wap_wsg_idm_ecid_wtls7		740
#define OBJ_wap_wsg_idm_ecid_wtls7		OBJ_wap_wsg_idm_ecid,7L

#define SN_wap_wsg_idm_ecid_wtls8		"wap-wsg-idm-ecid-wtls8"
#define NID_wap_wsg_idm_ecid_wtls8		741
#define OBJ_wap_wsg_idm_ecid_wtls8		OBJ_wap_wsg_idm_ecid,8L

#define SN_wap_wsg_idm_ecid_wtls9		"wap-wsg-idm-ecid-wtls9"
#define NID_wap_wsg_idm_ecid_wtls9		742
#define OBJ_wap_wsg_idm_ecid_wtls9		OBJ_wap_wsg_idm_ecid,9L

#define SN_wap_wsg_idm_ecid_wtls10		"wap-wsg-idm-ecid-wtls10"
#define NID_wap_wsg_idm_ecid_wtls10		743
#define OBJ_wap_wsg_idm_ecid_wtls10		OBJ_wap_wsg_idm_ecid,10L

#define SN_wap_wsg_idm_ecid_wtls11		"wap-wsg-idm-ecid-wtls11"
#define NID_wap_wsg_idm_ecid_wtls11		744
#define OBJ_wap_wsg_idm_ecid_wtls11		OBJ_wap_wsg_idm_ecid,11L

#define SN_wap_wsg_idm_ecid_wtls12		"wap-wsg-idm-ecid-wtls12"
#define NID_wap_wsg_idm_ecid_wtls12		745
#define OBJ_wap_wsg_idm_ecid_wtls12		OBJ_wap_wsg_idm_ecid,12L

#define SN_cast5_cbc		"CAST5-CBC"
#define LN_cast5_cbc		"cast5-cbc"
#define NID_cast5_cbc		108
#define OBJ_cast5_cbc		OBJ_ISO_US,113533L,7L,66L,10L

#define SN_cast5_ecb		"CAST5-ECB"
#define LN_cast5_ecb		"cast5-ecb"
#define NID_cast5_ecb		109

#define SN_cast5_cfb64		"CAST5-CFB"
#define LN_cast5_cfb64		"cast5-cfb"
#define NID_cast5_cfb64		110

#define SN_cast5_ofb64		"CAST5-OFB"
#define LN_cast5_ofb64		"cast5-ofb"
#define NID_cast5_ofb64		111

#define LN_pbeWithMD5AndCast5_CBC		"pbeWithMD5AndCast5CBC"
#define NID_pbeWithMD5AndCast5_CBC		112
#define OBJ_pbeWithMD5AndCast5_CBC		OBJ_ISO_US,113533L,7L,66L,12L

#define SN_id_PasswordBasedMAC		"id-PasswordBasedMAC"
#define LN_id_PasswordBasedMAC		"password based MAC"
#define NID_id_PasswordBasedMAC		782
#define OBJ_id_PasswordBasedMAC		OBJ_ISO_US,113533L,7L,66L,13L

#define SN_id_DHBasedMac		"id-DHBasedMac"
#define LN_id_DHBasedMac		"Diffie-Hellman based MAC"
#define NID_id_DHBasedMac		783
#define OBJ_id_DHBasedMac		OBJ_ISO_US,113533L,7L,66L,30L

#define SN_rsadsi		"rsadsi"
#define LN_rsadsi		"RSA Data Security, Inc."
#define NID_rsadsi		1
#define OBJ_rsadsi		OBJ_ISO_US,113549L

#define SN_pkcs		"pkcs"
#define LN_pkcs		"RSA Data Security, Inc. PKCS"
#define NID_pkcs		2
#define OBJ_pkcs		OBJ_rsadsi,1L

#define SN_pkcs1		"pkcs1"
#define NID_pkcs1		186
#define OBJ_pkcs1		OBJ_pkcs,1L

#define LN_rsaEncryption		"rsaEncryption"
#define NID_rsaEncryption		6
#define OBJ_rsaEncryption		OBJ_pkcs1,1L

#define SN_md2WithRSAEncryption		"RSA-MD2"
#define LN_md2WithRSAEncryption		"md2WithRSAEncryption"
#define NID_md2WithRSAEncryption		7
#define OBJ_md2WithRSAEncryption		OBJ_pkcs1,2L

#define SN_md4WithRSAEncryption		"RSA-MD4"
#define LN_md4WithRSAEncryption		"md4WithRSAEncryption"
#define NID_md4WithRSAEncryption		396
#define OBJ_md4WithRSAEncryption		OBJ_pkcs1,3L

#define SN_md5WithRSAEncryption		"RSA-MD5"
#define LN_md5WithRSAEncryption		"md5WithRSAEncryption"
#define NID_md5WithRSAEncryption		8
#define OBJ_md5WithRSAEncryption		OBJ_pkcs1,4L

#define SN_sha1WithRSAEncryption		"RSA-SHA1"
#define LN_sha1WithRSAEncryption		"sha1WithRSAEncryption"
#define NID_sha1WithRSAEncryption		65
#define OBJ_sha1WithRSAEncryption		OBJ_pkcs1,5L

#define SN_sha256WithRSAEncryption		"RSA-SHA256"
#define LN_sha256WithRSAEncryption		"sha256WithRSAEncryption"
#define NID_sha256WithRSAEncryption		668
#define OBJ_sha256WithRSAEncryption		OBJ_pkcs1,11L

#define SN_sha384WithRSAEncryption		"RSA-SHA384"
#define LN_sha384WithRSAEncryption		"sha384WithRSAEncryption"
#define NID_sha384WithRSAEncryption		669
#define OBJ_sha384WithRSAEncryption		OBJ_pkcs1,12L

#define SN_sha512WithRSAEncryption		"RSA-SHA512"
#define LN_sha512WithRSAEncryption		"sha512WithRSAEncryption"
#define NID_sha512WithRSAEncryption		670
#define OBJ_sha512WithRSAEncryption		OBJ_pkcs1,13L

#define SN_sha224WithRSAEncryption		"RSA-SHA224"
#define LN_sha224WithRSAEncryption		"sha224WithRSAEncryption"
#define NID_sha224WithRSAEncryption		671
#define OBJ_sha224WithRSAEncryption		OBJ_pkcs1,14L

#define SN_pkcs3		"pkcs3"
#define NID_pkcs3		27
#define OBJ_pkcs3		OBJ_pkcs,3L

#define LN_dhKeyAgreement		"dhKeyAgreement"
#define NID_dhKeyAgreement		28
#define OBJ_dhKeyAgreement		OBJ_pkcs3,1L

#define SN_pkcs5		"pkcs5"
#define NID_pkcs5		187
#define OBJ_pkcs5		OBJ_pkcs,5L

#define SN_pbeWithMD2AndDES_CBC		"PBE-MD2-DES"
#define LN_pbeWithMD2AndDES_CBC		"pbeWithMD2AndDES-CBC"
#define NID_pbeWithMD2AndDES_CBC		9
#define OBJ_pbeWithMD2AndDES_CBC		OBJ_pkcs5,1L

#define SN_pbeWithMD5AndDES_CBC		"PBE-MD5-DES"
#define LN_pbeWithMD5AndDES_CBC		"pbeWithMD5AndDES-CBC"
#define NID_pbeWithMD5AndDES_CBC		10
#define OBJ_pbeWithMD5AndDES_CBC		OBJ_pkcs5,3L

#define SN_pbeWithMD2AndRC2_CBC		"PBE-MD2-RC2-64"
#define LN_pbeWithMD2AndRC2_CBC		"pbeWithMD2AndRC2-CBC"
#define NID_pbeWithMD2AndRC2_CBC		168
#define OBJ_pbeWithMD2AndRC2_CBC		OBJ_pkcs5,4L

#define SN_pbeWithMD5AndRC2_CBC		"PBE-MD5-RC2-64"
#define LN_pbeWithMD5AndRC2_CBC		"pbeWithMD5AndRC2-CBC"
#define NID_pbeWithMD5AndRC2_CBC		169
#define OBJ_pbeWithMD5AndRC2_CBC		OBJ_pkcs5,6L

#define SN_pbeWithSHA1AndDES_CBC		"PBE-SHA1-DES"
#define LN_pbeWithSHA1AndDES_CBC		"pbeWithSHA1AndDES-CBC"
#define NID_pbeWithSHA1AndDES_CBC		170
#define OBJ_pbeWithSHA1AndDES_CBC		OBJ_pkcs5,10L

#define SN_pbeWithSHA1AndRC2_CBC		"PBE-SHA1-RC2-64"
#define LN_pbeWithSHA1AndRC2_CBC		"pbeWithSHA1AndRC2-CBC"
#define NID_pbeWithSHA1AndRC2_CBC		68
#define OBJ_pbeWithSHA1AndRC2_CBC		OBJ_pkcs5,11L

#define LN_id_pbkdf2		"PBKDF2"
#define NID_id_pbkdf2		69
#define OBJ_id_pbkdf2		OBJ_pkcs5,12L

#define LN_pbes2		"PBES2"
#define NID_pbes2		161
#define OBJ_pbes2		OBJ_pkcs5,13L

#define LN_pbmac1		"PBMAC1"
#define NID_pbmac1		162
#define OBJ_pbmac1		OBJ_pkcs5,14L

#define SN_pkcs7		"pkcs7"
#define NID_pkcs7		20
#define OBJ_pkcs7		OBJ_pkcs,7L

#define LN_pkcs7_data		"pkcs7-data"
#define NID_pkcs7_data		21
#define OBJ_pkcs7_data		OBJ_pkcs7,1L

#define LN_pkcs7_signed		"pkcs7-signedData"
#define NID_pkcs7_signed		22
#define OBJ_pkcs7_signed		OBJ_pkcs7,2L

#define LN_pkcs7_enveloped		"pkcs7-envelopedData"
#define NID_pkcs7_enveloped		23
#define OBJ_pkcs7_enveloped		OBJ_pkcs7,3L

#define LN_pkcs7_signedAndEnveloped		"pkcs7-signedAndEnvelopedData"
#define NID_pkcs7_signedAndEnveloped		24
#define OBJ_pkcs7_signedAndEnveloped		OBJ_pkcs7,4L

#define LN_pkcs7_digest		"pkcs7-digestData"
#define NID_pkcs7_digest		25
#define OBJ_pkcs7_digest		OBJ_pkcs7,5L

#define LN_pkcs7_encrypted		"pkcs7-encryptedData"
#define NID_pkcs7_encrypted		26
#define OBJ_pkcs7_encrypted		OBJ_pkcs7,6L

#define SN_pkcs9		"pkcs9"
#define NID_pkcs9		47
#define OBJ_pkcs9		OBJ_pkcs,9L

#define LN_pkcs9_emailAddress		"emailAddress"
#define NID_pkcs9_emailAddress		48
#define OBJ_pkcs9_emailAddress		OBJ_pkcs9,1L

#define LN_pkcs9_unstructuredName		"unstructuredName"
#define NID_pkcs9_unstructuredName		49
#define OBJ_pkcs9_unstructuredName		OBJ_pkcs9,2L

#define LN_pkcs9_contentType		"contentType"
#define NID_pkcs9_contentType		50
#define OBJ_pkcs9_contentType		OBJ_pkcs9,3L

#define LN_pkcs9_messageDigest		"messageDigest"
#define NID_pkcs9_messageDigest		51
#define OBJ_pkcs9_messageDigest		OBJ_pkcs9,4L

#define LN_pkcs9_signingTime		"signingTime"
#define NID_pkcs9_signingTime		52
#define OBJ_pkcs9_signingTime		OBJ_pkcs9,5L

#define LN_pkcs9_countersignature		"countersignature"
#define NID_pkcs9_countersignature		53
#define OBJ_pkcs9_countersignature		OBJ_pkcs9,6L

#define LN_pkcs9_challengePassword		"challengePassword"
#define NID_pkcs9_challengePassword		54
#define OBJ_pkcs9_challengePassword		OBJ_pkcs9,7L

#define LN_pkcs9_unstructuredAddress		"unstructuredAddress"
#define NID_pkcs9_unstructuredAddress		55
#define OBJ_pkcs9_unstructuredAddress		OBJ_pkcs9,8L

#define LN_pkcs9_extCertAttributes		"extendedCertificateAttributes"
#define NID_pkcs9_extCertAttributes		56
#define OBJ_pkcs9_extCertAttributes		OBJ_pkcs9,9L

#define SN_ext_req		"extReq"
#define LN_ext_req		"Extension Request"
#define NID_ext_req		172
#define OBJ_ext_req		OBJ_pkcs9,14L

#define SN_SMIMECapabilities		"SMIME-CAPS"
#define LN_SMIMECapabilities		"S/MIME Capabilities"
#define NID_SMIMECapabilities		167
#define OBJ_SMIMECapabilities		OBJ_pkcs9,15L

#define SN_SMIME		"SMIME"
#define LN_SMIME		"S/MIME"
#define NID_SMIME		188
#define OBJ_SMIME		OBJ_pkcs9,16L

#define SN_id_smime_mod		"id-smime-mod"
#define NID_id_smime_mod		189
#define OBJ_id_smime_mod		OBJ_SMIME,0L

#define SN_id_smime_ct		"id-smime-ct"
#define NID_id_smime_ct		190
#define OBJ_id_smime_ct		OBJ_SMIME,1L

#define SN_id_smime_aa		"id-smime-aa"
#define NID_id_smime_aa		191
#define OBJ_id_smime_aa		OBJ_SMIME,2L

#define SN_id_smime_alg		"id-smime-alg"
#define NID_id_smime_alg		192
#define OBJ_id_smime_alg		OBJ_SMIME,3L

#define SN_id_smime_cd		"id-smime-cd"
#define NID_id_smime_cd		193
#define OBJ_id_smime_cd		OBJ_SMIME,4L

#define SN_id_smime_spq		"id-smime-spq"
#define NID_id_smime_spq		194
#define OBJ_id_smime_spq		OBJ_SMIME,5L

#define SN_id_smime_cti		"id-smime-cti"
#define NID_id_smime_cti		195
#define OBJ_id_smime_cti		OBJ_SMIME,6L

#define SN_id_smime_mod_cms		"id-smime-mod-cms"
#define NID_id_smime_mod_cms		196
#define OBJ_id_smime_mod_cms		OBJ_id_smime_mod,1L

#define SN_id_smime_mod_ess		"id-smime-mod-ess"
#define NID_id_smime_mod_ess		197
#define OBJ_id_smime_mod_ess		OBJ_id_smime_mod,2L

#define SN_id_smime_mod_oid		"id-smime-mod-oid"
#define NID_id_smime_mod_oid		198
#define OBJ_id_smime_mod_oid		OBJ_id_smime_mod,3L

#define SN_id_smime_mod_msg_v3		"id-smime-mod-msg-v3"
#define NID_id_smime_mod_msg_v3		199
#define OBJ_id_smime_mod_msg_v3		OBJ_id_smime_mod,4L

#define SN_id_smime_mod_ets_eSignature_88		"id-smime-mod-ets-eSignature-88"
#define NID_id_smime_mod_ets_eSignature_88		200
#define OBJ_id_smime_mod_ets_eSignature_88		OBJ_id_smime_mod,5L

#define SN_id_smime_mod_ets_eSignature_97		"id-smime-mod-ets-eSignature-97"
#define NID_id_smime_mod_ets_eSignature_97		201
#define OBJ_id_smime_mod_ets_eSignature_97		OBJ_id_smime_mod,6L

#define SN_id_smime_mod_ets_eSigPolicy_88		"id-smime-mod-ets-eSigPolicy-88"
#define NID_id_smime_mod_ets_eSigPolicy_88		202
#define OBJ_id_smime_mod_ets_eSigPolicy_88		OBJ_id_smime_mod,7L

#define SN_id_smime_mod_ets_eSigPolicy_97		"id-smime-mod-ets-eSigPolicy-97"
#define NID_id_smime_mod_ets_eSigPolicy_97		203
#define OBJ_id_smime_mod_ets_eSigPolicy_97		OBJ_id_smime_mod,8L

#define SN_id_smime_ct_receipt		"id-smime-ct-receipt"
#define NID_id_smime_ct_receipt		204
#define OBJ_id_smime_ct_receipt		OBJ_id_smime_ct,1L

#define SN_id_smime_ct_authData		"id-smime-ct-authData"
#define NID_id_smime_ct_authData		205
#define OBJ_id_smime_ct_authData		OBJ_id_smime_ct,2L

#define SN_id_smime_ct_publishCert		"id-smime-ct-publishCert"
#define NID_id_smime_ct_publishCert		206
#define OBJ_id_smime_ct_publishCert		OBJ_id_smime_ct,3L

#define SN_id_smime_ct_TSTInfo		"id-smime-ct-TSTInfo"
#define NID_id_smime_ct_TSTInfo		207
#define OBJ_id_smime_ct_TSTInfo		OBJ_id_smime_ct,4L

#define SN_id_smime_ct_TDTInfo		"id-smime-ct-TDTInfo"
#define NID_id_smime_ct_TDTInfo		208
#define OBJ_id_smime_ct_TDTInfo		OBJ_id_smime_ct,5L

#define SN_id_smime_ct_contentInfo		"id-smime-ct-contentInfo"
#define NID_id_smime_ct_contentInfo		209
#define OBJ_id_smime_ct_contentInfo		OBJ_id_smime_ct,6L

#define SN_id_smime_ct_DVCSRequestData		"id-smime-ct-DVCSRequestData"
#define NID_id_smime_ct_DVCSRequestData		210
#define OBJ_id_smime_ct_DVCSRequestData		OBJ_id_smime_ct,7L

#define SN_id_smime_ct_DVCSResponseData		"id-smime-ct-DVCSResponseData"
#define NID_id_smime_ct_DVCSResponseData		211
#define OBJ_id_smime_ct_DVCSResponseData		OBJ_id_smime_ct,8L

#define SN_id_smime_ct_compressedData		"id-smime-ct-compressedData"
#define NID_id_smime_ct_compressedData		786
#define OBJ_id_smime_ct_compressedData		OBJ_id_smime_ct,9L

#define SN_id_ct_asciiTextWithCRLF		"id-ct-asciiTextWithCRLF"
#define NID_id_ct_asciiTextWithCRLF		787
#define OBJ_id_ct_asciiTextWithCRLF		OBJ_id_smime_ct,27L

#define SN_id_smime_aa_receiptRequest		"id-smime-aa-receiptRequest"
#define NID_id_smime_aa_receiptRequest		212
#define OBJ_id_smime_aa_receiptRequest		OBJ_id_smime_aa,1L

#define SN_id_smime_aa_securityLabel		"id-smime-aa-securityLabel"
#define NID_id_smime_aa_securityLabel		213
#define OBJ_id_smime_aa_securityLabel		OBJ_id_smime_aa,2L

#define SN_id_smime_aa_mlExpandHistory		"id-smime-aa-mlExpandHistory"
#define NID_id_smime_aa_mlExpandHistory		214
#define OBJ_id_smime_aa_mlExpandHistory		OBJ_id_smime_aa,3L

#define SN_id_smime_aa_contentHint		"id-smime-aa-contentHint"
#define NID_id_smime_aa_contentHint		215
#define OBJ_id_smime_aa_contentHint		OBJ_id_smime_aa,4L

#define SN_id_smime_aa_msgSigDigest		"id-smime-aa-msgSigDigest"
#define NID_id_smime_aa_msgSigDigest		216
#define OBJ_id_smime_aa_msgSigDigest		OBJ_id_smime_aa,5L

#define SN_id_smime_aa_encapContentType		"id-smime-aa-encapContentType"
#define NID_id_smime_aa_encapContentType		217
#define OBJ_id_smime_aa_encapContentType		OBJ_id_smime_aa,6L

#define SN_id_smime_aa_contentIdentifier		"id-smime-aa-contentIdentifier"
#define NID_id_smime_aa_contentIdentifier		218
#define OBJ_id_smime_aa_contentIdentifier		OBJ_id_smime_aa,7L

#define SN_id_smime_aa_macValue		"id-smime-aa-macValue"
#define NID_id_smime_aa_macValue		219
#define OBJ_id_smime_aa_macValue		OBJ_id_smime_aa,8L

#define SN_id_smime_aa_equivalentLabels		"id-smime-aa-equivalentLabels"
#define NID_id_smime_aa_equivalentLabels		220
#define OBJ_id_smime_aa_equivalentLabels		OBJ_id_smime_aa,9L

#define SN_id_smime_aa_contentReference		"id-smime-aa-contentReference"
#define NID_id_smime_aa_contentReference		221
#define OBJ_id_smime_aa_contentReference		OBJ_id_smime_aa,10L

#define SN_id_smime_aa_encrypKeyPref		"id-smime-aa-encrypKeyPref"
#define NID_id_smime_aa_encrypKeyPref		222
#define OBJ_id_smime_aa_encrypKeyPref		OBJ_id_smime_aa,11L

#define SN_id_smime_aa_signingCertificate		"id-smime-aa-signingCertificate"
#define NID_id_smime_aa_signingCertificate		223
#define OBJ_id_smime_aa_signingCertificate		OBJ_id_smime_aa,12L

#define SN_id_smime_aa_smimeEncryptCerts		"id-smime-aa-smimeEncryptCerts"
#define NID_id_smime_aa_smimeEncryptCerts		224
#define OBJ_id_smime_aa_smimeEncryptCerts		OBJ_id_smime_aa,13L

#define SN_id_smime_aa_timeStampToken		"id-smime-aa-timeStampToken"
#define NID_id_smime_aa_timeStampToken		225
#define OBJ_id_smime_aa_timeStampToken		OBJ_id_smime_aa,14L

#define SN_id_smime_aa_ets_sigPolicyId		"id-smime-aa-ets-sigPolicyId"
#define NID_id_smime_aa_ets_sigPolicyId		226
#define OBJ_id_smime_aa_ets_sigPolicyId		OBJ_id_smime_aa,15L

#define SN_id_smime_aa_ets_commitmentType		"id-smime-aa-ets-commitmentType"
#define NID_id_smime_aa_ets_commitmentType		227
#define OBJ_id_smime_aa_ets_commitmentType		OBJ_id_smime_aa,16L

#define SN_id_smime_aa_ets_signerLocation		"id-smime-aa-ets-signerLocation"
#define NID_id_smime_aa_ets_signerLocation		228
#define OBJ_id_smime_aa_ets_signerLocation		OBJ_id_smime_aa,17L

#define SN_id_smime_aa_ets_signerAttr		"id-smime-aa-ets-signerAttr"
#define NID_id_smime_aa_ets_signerAttr		229
#define OBJ_id_smime_aa_ets_signerAttr		OBJ_id_smime_aa,18L

#define SN_id_smime_aa_ets_otherSigCert		"id-smime-aa-ets-otherSigCert"
#define NID_id_smime_aa_ets_otherSigCert		230
#define OBJ_id_smime_aa_ets_otherSigCert		OBJ_id_smime_aa,19L

#define SN_id_smime_aa_ets_contentTimestamp		"id-smime-aa-ets-contentTimestamp"
#define NID_id_smime_aa_ets_contentTimestamp		231
#define OBJ_id_smime_aa_ets_contentTimestamp		OBJ_id_smime_aa,20L

#define SN_id_smime_aa_ets_CertificateRefs		"id-smime-aa-ets-CertificateRefs"
#define NID_id_smime_aa_ets_CertificateRefs		232
#define OBJ_id_smime_aa_ets_CertificateRefs		OBJ_id_smime_aa,21L

#define SN_id_smime_aa_ets_RevocationRefs		"id-smime-aa-ets-RevocationRefs"
#define NID_id_smime_aa_ets_RevocationRefs		233
#define OBJ_id_smime_aa_ets_RevocationRefs		OBJ_id_smime_aa,22L

#define SN_id_smime_aa_ets_certValues		"id-smime-aa-ets-certValues"
#define NID_id_smime_aa_ets_certValues		234
#define OBJ_id_smime_aa_ets_certValues		OBJ_id_smime_aa,23L

#define SN_id_smime_aa_ets_revocationValues		"id-smime-aa-ets-revocationValues"
#define NID_id_smime_aa_ets_revocationValues		235
#define OBJ_id_smime_aa_ets_revocationValues		OBJ_id_smime_aa,24L

#define SN_id_smime_aa_ets_escTimeStamp		"id-smime-aa-ets-escTimeStamp"
#define NID_id_smime_aa_ets_escTimeStamp		236
#define OBJ_id_smime_aa_ets_escTimeStamp		OBJ_id_smime_aa,25L

#define SN_id_smime_aa_ets_certCRLTimestamp		"id-smime-aa-ets-certCRLTimestamp"
#define NID_id_smime_aa_ets_certCRLTimestamp		237
#define OBJ_id_smime_aa_ets_certCRLTimestamp		OBJ_id_smime_aa,26L

#define SN_id_smime_aa_ets_archiveTimeStamp		"id-smime-aa-ets-archiveTimeStamp"
#define NID_id_smime_aa_ets_archiveTimeStamp		238
#define OBJ_id_smime_aa_ets_archiveTimeStamp		OBJ_id_smime_aa,27L

#define SN_id_smime_aa_signatureType		"id-smime-aa-signatureType"
#define NID_id_smime_aa_signatureType		239
#define OBJ_id_smime_aa_signatureType		OBJ_id_smime_aa,28L

#define SN_id_smime_aa_dvcs_dvc		"id-smime-aa-dvcs-dvc"
#define NID_id_smime_aa_dvcs_dvc		240
#define OBJ_id_smime_aa_dvcs_dvc		OBJ_id_smime_aa,29L

#define SN_id_smime_alg_ESDHwith3DES		"id-smime-alg-ESDHwith3DES"
#define NID_id_smime_alg_ESDHwith3DES		241
#define OBJ_id_smime_alg_ESDHwith3DES		OBJ_id_smime_alg,1L

#define SN_id_smime_alg_ESDHwithRC2		"id-smime-alg-ESDHwithRC2"
#define NID_id_smime_alg_ESDHwithRC2		242
#define OBJ_id_smime_alg_ESDHwithRC2		OBJ_id_smime_alg,2L

#define SN_id_smime_alg_3DESwrap		"id-smime-alg-3DESwrap"
#define NID_id_smime_alg_3DESwrap		243
#define OBJ_id_smime_alg_3DESwrap		OBJ_id_smime_alg,3L

#define SN_id_smime_alg_RC2wrap		"id-smime-alg-RC2wrap"
#define NID_id_smime_alg_RC2wrap		244
#define OBJ_id_smime_alg_RC2wrap		OBJ_id_smime_alg,4L

#define SN_id_smime_alg_ESDH		"id-smime-alg-ESDH"
#define NID_id_smime_alg_ESDH		245
#define OBJ_id_smime_alg_ESDH		OBJ_id_smime_alg,5L

#define SN_id_smime_alg_CMS3DESwrap		"id-smime-alg-CMS3DESwrap"
#define NID_id_smime_alg_CMS3DESwrap		246
#define OBJ_id_smime_alg_CMS3DESwrap		OBJ_id_smime_alg,6L

#define SN_id_smime_alg_CMSRC2wrap		"id-smime-alg-CMSRC2wrap"
#define NID_id_smime_alg_CMSRC2wrap		247
#define OBJ_id_smime_alg_CMSRC2wrap		OBJ_id_smime_alg,7L

#define SN_id_smime_cd_ldap		"id-smime-cd-ldap"
#define NID_id_smime_cd_ldap		248
#define OBJ_id_smime_cd_ldap		OBJ_id_smime_cd,1L

#define SN_id_smime_spq_ets_sqt_uri		"id-smime-spq-ets-sqt-uri"
#define NID_id_smime_spq_ets_sqt_uri		249
#define OBJ_id_smime_spq_ets_sqt_uri		OBJ_id_smime_spq,1L

#define SN_id_smime_spq_ets_sqt_unotice		"id-smime-spq-ets-sqt-unotice"
#define NID_id_smime_spq_ets_sqt_unotice		250
#define OBJ_id_smime_spq_ets_sqt_unotice		OBJ_id_smime_spq,2L

#define SN_id_smime_cti_ets_proofOfOrigin		"id-smime-cti-ets-proofOfOrigin"
#define NID_id_smime_cti_ets_proofOfOrigin		251
#define OBJ_id_smime_cti_ets_proofOfOrigin		OBJ_id_smime_cti,1L

#define SN_id_smime_cti_ets_proofOfReceipt		"id-smime-cti-ets-proofOfReceipt"
#define NID_id_smime_cti_ets_proofOfReceipt		252
#define OBJ_id_smime_cti_ets_proofOfReceipt		OBJ_id_smime_cti,2L

#define SN_id_smime_cti_ets_proofOfDelivery		"id-smime-cti-ets-proofOfDelivery"
#define NID_id_smime_cti_ets_proofOfDelivery		253
#define OBJ_id_smime_cti_ets_proofOfDelivery		OBJ_id_smime_cti,3L

#define SN_id_smime_cti_ets_proofOfSender		"id-smime-cti-ets-proofOfSender"
#define NID_id_smime_cti_ets_proofOfSender		254
#define OBJ_id_smime_cti_ets_proofOfSender		OBJ_id_smime_cti,4L

#define SN_id_smime_cti_ets_proofOfApproval		"id-smime-cti-ets-proofOfApproval"
#define NID_id_smime_cti_ets_proofOfApproval		255
#define OBJ_id_smime_cti_ets_proofOfApproval		OBJ_id_smime_cti,5L

#define SN_id_smime_cti_ets_proofOfCreation		"id-smime-cti-ets-proofOfCreation"
#define NID_id_smime_cti_ets_proofOfCreation		256
#define OBJ_id_smime_cti_ets_proofOfCreation		OBJ_id_smime_cti,6L

#define LN_friendlyName		"friendlyName"
#define NID_friendlyName		156
#define OBJ_friendlyName		OBJ_pkcs9,20L

#define LN_localKeyID		"localKeyID"
#define NID_localKeyID		157
#define OBJ_localKeyID		OBJ_pkcs9,21L

#define SN_ms_csp_name		"CSPName"
#define LN_ms_csp_name		"Microsoft CSP Name"
#define NID_ms_csp_name		417
#define OBJ_ms_csp_name		1L,3L,6L,1L,4L,1L,311L,17L,1L

#define SN_LocalKeySet		"LocalKeySet"
#define LN_LocalKeySet		"Microsoft Local Key set"
#define NID_LocalKeySet		856
#define OBJ_LocalKeySet		1L,3L,6L,1L,4L,1L,311L,17L,2L

#define OBJ_certTypes		OBJ_pkcs9,22L

#define LN_x509Certificate		"x509Certificate"
#define NID_x509Certificate		158
#define OBJ_x509Certificate		OBJ_certTypes,1L

#define LN_sdsiCertificate		"sdsiCertificate"
#define NID_sdsiCertificate		159
#define OBJ_sdsiCertificate		OBJ_certTypes,2L

#define OBJ_crlTypes		OBJ_pkcs9,23L

#define LN_x509Crl		"x509Crl"
#define NID_x509Crl		160
#define OBJ_x509Crl		OBJ_crlTypes,1L

#define OBJ_pkcs12		OBJ_pkcs,12L

#define OBJ_pkcs12_pbeids		OBJ_pkcs12,1L

#define SN_pbe_WithSHA1And128BitRC4		"PBE-SHA1-RC4-128"
#define LN_pbe_WithSHA1And128BitRC4		"pbeWithSHA1And128BitRC4"
#define NID_pbe_WithSHA1And128BitRC4		144
#define OBJ_pbe_WithSHA1And128BitRC4		OBJ_pkcs12_pbeids,1L

#define SN_pbe_WithSHA1And40BitRC4		"PBE-SHA1-RC4-40"
#define LN_pbe_WithSHA1And40BitRC4		"pbeWithSHA1And40BitRC4"
#define NID_pbe_WithSHA1And40BitRC4		145
#define OBJ_pbe_WithSHA1And40BitRC4		OBJ_pkcs12_pbeids,2L

#define SN_pbe_WithSHA1And3_Key_TripleDES_CBC		"PBE-SHA1-3DES"
#define LN_pbe_WithSHA1And3_Key_TripleDES_CBC		"pbeWithSHA1And3-KeyTripleDES-CBC"
#define NID_pbe_WithSHA1And3_Key_TripleDES_CBC		146
#define OBJ_pbe_WithSHA1And3_Key_TripleDES_CBC		OBJ_pkcs12_pbeids,3L

#define SN_pbe_WithSHA1And2_Key_TripleDES_CBC		"PBE-SHA1-2DES"
#define LN_pbe_WithSHA1And2_Key_TripleDES_CBC		"pbeWithSHA1And2-KeyTripleDES-CBC"
#define NID_pbe_WithSHA1And2_Key_TripleDES_CBC		147
#define OBJ_pbe_WithSHA1And2_Key_TripleDES_CBC		OBJ_pkcs12_pbeids,4L

#define SN_pbe_WithSHA1And128BitRC2_CBC		"PBE-SHA1-RC2-128"
#define LN_pbe_WithSHA1And128BitRC2_CBC		"pbeWithSHA1And128BitRC2-CBC"
#define NID_pbe_WithSHA1And128BitRC2_CBC		148
#define OBJ_pbe_WithSHA1And128BitRC2_CBC		OBJ_pkcs12_pbeids,5L

#define SN_pbe_WithSHA1And40BitRC2_CBC		"PBE-SHA1-RC2-40"
#define LN_pbe_WithSHA1And40BitRC2_CBC		"pbeWithSHA1And40BitRC2-CBC"
#define NID_pbe_WithSHA1And40BitRC2_CBC		149
#define OBJ_pbe_WithSHA1And40BitRC2_CBC		OBJ_pkcs12_pbeids,6L

#define OBJ_pkcs12_Version1		OBJ_pkcs12,10L

#define OBJ_pkcs12_BagIds		OBJ_pkcs12_Version1,1L

#define LN_keyBag		"keyBag"
#define NID_keyBag		150
#define OBJ_keyBag		OBJ_pkcs12_BagIds,1L

#define LN_pkcs8ShroudedKeyBag		"pkcs8ShroudedKeyBag"
#define NID_pkcs8ShroudedKeyBag		151
#define OBJ_pkcs8ShroudedKeyBag		OBJ_pkcs12_BagIds,2L

#define LN_certBag		"certBag"
#define NID_certBag		152
#define OBJ_certBag		OBJ_pkcs12_BagIds,3L

#define LN_crlBag		"crlBag"
#define NID_crlBag		153
#define OBJ_crlBag		OBJ_pkcs12_BagIds,4L

#define LN_secretBag		"secretBag"
#define NID_secretBag		154
#define OBJ_secretBag		OBJ_pkcs12_BagIds,5L

#define LN_safeContentsBag		"safeContentsBag"
#define NID_safeContentsBag		155
#define OBJ_safeContentsBag		OBJ_pkcs12_BagIds,6L

#define SN_md2		"MD2"
#define LN_md2		"md2"
#define NID_md2		3
#define OBJ_md2		OBJ_rsadsi,2L,2L

#define SN_md4		"MD4"
#define LN_md4		"md4"
#define NID_md4		257
#define OBJ_md4		OBJ_rsadsi,2L,4L

#define SN_md5		"MD5"
#define LN_md5		"md5"
#define NID_md5		4
#define OBJ_md5		OBJ_rsadsi,2L,5L

#define SN_md5_sha1		"MD5-SHA1"
#define LN_md5_sha1		"md5-sha1"
#define NID_md5_sha1		114

#define LN_hmacWithMD5		"hmacWithMD5"
#define NID_hmacWithMD5		797
#define OBJ_hmacWithMD5		OBJ_rsadsi,2L,6L

#define LN_hmacWithSHA1		"hmacWithSHA1"
#define NID_hmacWithSHA1		163
#define OBJ_hmacWithSHA1		OBJ_rsadsi,2L,7L

#define LN_hmacWithSHA224		"hmacWithSHA224"
#define NID_hmacWithSHA224		798
#define OBJ_hmacWithSHA224		OBJ_rsadsi,2L,8L

#define LN_hmacWithSHA256		"hmacWithSHA256"
#define NID_hmacWithSHA256		799
#define OBJ_hmacWithSHA256		OBJ_rsadsi,2L,9L

#define LN_hmacWithSHA384		"hmacWithSHA384"
#define NID_hmacWithSHA384		800
#define OBJ_hmacWithSHA384		OBJ_rsadsi,2L,10L

#define LN_hmacWithSHA512		"hmacWithSHA512"
#define NID_hmacWithSHA512		801
#define OBJ_hmacWithSHA512		OBJ_rsadsi,2L,11L

#define SN_rc2_cbc		"RC2-CBC"
#define LN_rc2_cbc		"rc2-cbc"
#define NID_rc2_cbc		37
#define OBJ_rc2_cbc		OBJ_rsadsi,3L,2L

#define SN_rc2_ecb		"RC2-ECB"
#define LN_rc2_ecb		"rc2-ecb"
#define NID_rc2_ecb		38

#define SN_rc2_cfb64		"RC2-CFB"
#define LN_rc2_cfb64		"rc2-cfb"
#define NID_rc2_cfb64		39

#define SN_rc2_ofb64		"RC2-OFB"
#define LN_rc2_ofb64		"rc2-ofb"
#define NID_rc2_ofb64		40

#define SN_rc2_40_cbc		"RC2-40-CBC"
#define LN_rc2_40_cbc		"rc2-40-cbc"
#define NID_rc2_40_cbc		98

#define SN_rc2_64_cbc		"RC2-64-CBC"
#define LN_rc2_64_cbc		"rc2-64-cbc"
#define NID_rc2_64_cbc		166

#define SN_rc4		"RC4"
#define LN_rc4		"rc4"
#define NID_rc4		5
#define OBJ_rc4		OBJ_rsadsi,3L,4L

#define SN_rc4_40		"RC4-40"
#define LN_rc4_40		"rc4-40"
#define NID_rc4_40		97

#define SN_des_ede3_cbc		"DES-EDE3-CBC"
#define LN_des_ede3_cbc		"des-ede3-cbc"
#define NID_des_ede3_cbc		44
#define OBJ_des_ede3_cbc		OBJ_rsadsi,3L,7L

#define SN_rc5_cbc		"RC5-CBC"
#define LN_rc5_cbc		"rc5-cbc"
#define NID_rc5_cbc		120
#define OBJ_rc5_cbc		OBJ_rsadsi,3L,8L

#define SN_rc5_ecb		"RC5-ECB"
#define LN_rc5_ecb		"rc5-ecb"
#define NID_rc5_ecb		121

#define SN_rc5_cfb64		"RC5-CFB"
#define LN_rc5_cfb64		"rc5-cfb"
#define NID_rc5_cfb64		122

#define SN_rc5_ofb64		"RC5-OFB"
#define LN_rc5_ofb64		"rc5-ofb"
#define NID_rc5_ofb64		123

#define SN_ms_ext_req		"msExtReq"
#define LN_ms_ext_req		"Microsoft Extension Request"
#define NID_ms_ext_req		171
#define OBJ_ms_ext_req		1L,3L,6L,1L,4L,1L,311L,2L,1L,14L

#define SN_ms_code_ind		"msCodeInd"
#define LN_ms_code_ind		"Microsoft Individual Code Signing"
#define NID_ms_code_ind		134
#define OBJ_ms_code_ind		1L,3L,6L,1L,4L,1L,311L,2L,1L,21L

#define SN_ms_code_com		"msCodeCom"
#define LN_ms_code_com		"Microsoft Commercial Code Signing"
#define NID_ms_code_com		135
#define OBJ_ms_code_com		1L,3L,6L,1L,4L,1L,311L,2L,1L,22L

#define SN_ms_ctl_sign		"msCTLSign"
#define LN_ms_ctl_sign		"Microsoft Trust List Signing"
#define NID_ms_ctl_sign		136
#define OBJ_ms_ctl_sign		1L,3L,6L,1L,4L,1L,311L,10L,3L,1L

#define SN_ms_sgc		"msSGC"
#define LN_ms_sgc		"Microsoft Server Gated Crypto"
#define NID_ms_sgc		137
#define OBJ_ms_sgc		1L,3L,6L,1L,4L,1L,311L,10L,3L,3L

#define SN_ms_efs		"msEFS"
#define LN_ms_efs		"Microsoft Encrypted File System"
#define NID_ms_efs		138
#define OBJ_ms_efs		1L,3L,6L,1L,4L,1L,311L,10L,3L,4L

#define SN_ms_smartcard_login		"msSmartcardLogin"
#define LN_ms_smartcard_login		"Microsoft Smartcardlogin"
#define NID_ms_smartcard_login		648
#define OBJ_ms_smartcard_login		1L,3L,6L,1L,4L,1L,311L,20L,2L,2L

#define SN_ms_upn		"msUPN"
#define LN_ms_upn		"Microsoft Universal Principal Name"
#define NID_ms_upn		649
#define OBJ_ms_upn		1L,3L,6L,1L,4L,1L,311L,20L,2L,3L

#define SN_idea_cbc		"IDEA-CBC"
#define LN_idea_cbc		"idea-cbc"
#define NID_idea_cbc		34
#define OBJ_idea_cbc		1L,3L,6L,1L,4L,1L,188L,7L,1L,1L,2L

#define SN_idea_ecb		"IDEA-ECB"
#define LN_idea_ecb		"idea-ecb"
#define NID_idea_ecb		36

#define SN_idea_cfb64		"IDEA-CFB"
#define LN_idea_cfb64		"idea-cfb"
#define NID_idea_cfb64		35

#define SN_idea_ofb64		"IDEA-OFB"
#define LN_idea_ofb64		"idea-ofb"
#define NID_idea_ofb64		46

#define SN_bf_cbc		"BF-CBC"
#define LN_bf_cbc		"bf-cbc"
#define NID_bf_cbc		91
#define OBJ_bf_cbc		1L,3L,6L,1L,4L,1L,3029L,1L,2L

#define SN_bf_ecb		"BF-ECB"
#define LN_bf_ecb		"bf-ecb"
#define NID_bf_ecb		92

#define SN_bf_cfb64		"BF-CFB"
#define LN_bf_cfb64		"bf-cfb"
#define NID_bf_cfb64		93

#define SN_bf_ofb64		"BF-OFB"
#define LN_bf_ofb64		"bf-ofb"
#define NID_bf_ofb64		94

#define SN_id_pkix		"PKIX"
#define NID_id_pkix		127
#define OBJ_id_pkix		1L,3L,6L,1L,5L,5L,7L

#define SN_id_pkix_mod		"id-pkix-mod"
#define NID_id_pkix_mod		258
#define OBJ_id_pkix_mod		OBJ_id_pkix,0L

#define SN_id_pe		"id-pe"
#define NID_id_pe		175
#define OBJ_id_pe		OBJ_id_pkix,1L

#define SN_id_qt		"id-qt"
#define NID_id_qt		259
#define OBJ_id_qt		OBJ_id_pkix,2L

#define SN_id_kp		"id-kp"
#define NID_id_kp		128
#define OBJ_id_kp		OBJ_id_pkix,3L

#define SN_id_it		"id-it"
#define NID_id_it		260
#define OBJ_id_it		OBJ_id_pkix,4L

#define SN_id_pkip		"id-pkip"
#define NID_id_pkip		261
#define OBJ_id_pkip		OBJ_id_pkix,5L

#define SN_id_alg		"id-alg"
#define NID_id_alg		262
#define OBJ_id_alg		OBJ_id_pkix,6L

#define SN_id_cmc		"id-cmc"
#define NID_id_cmc		263
#define OBJ_id_cmc		OBJ_id_pkix,7L

#define SN_id_on		"id-on"
#define NID_id_on		264
#define OBJ_id_on		OBJ_id_pkix,8L

#define SN_id_pda		"id-pda"
#define NID_id_pda		265
#define OBJ_id_pda		OBJ_id_pkix,9L

#define SN_id_aca		"id-aca"
#define NID_id_aca		266
#define OBJ_id_aca		OBJ_id_pkix,10L

#define SN_id_qcs		"id-qcs"
#define NID_id_qcs		267
#define OBJ_id_qcs		OBJ_id_pkix,11L

#define SN_id_cct		"id-cct"
#define NID_id_cct		268
#define OBJ_id_cct		OBJ_id_pkix,12L

#define SN_id_ppl		"id-ppl"
#define NID_id_ppl		662
#define OBJ_id_ppl		OBJ_id_pkix,21L

#define SN_id_ad		"id-ad"
#define NID_id_ad		176
#define OBJ_id_ad		OBJ_id_pkix,48L

#define SN_id_pkix1_explicit_88		"id-pkix1-explicit-88"
#define NID_id_pkix1_explicit_88		269
#define OBJ_id_pkix1_explicit_88		OBJ_id_pkix_mod,1L

#define SN_id_pkix1_implicit_88		"id-pkix1-implicit-88"
#define NID_id_pkix1_implicit_88		270
#define OBJ_id_pkix1_implicit_88		OBJ_id_pkix_mod,2L

#define SN_id_pkix1_explicit_93		"id-pkix1-explicit-93"
#define NID_id_pkix1_explicit_93		271
#define OBJ_id_pkix1_explicit_93		OBJ_id_pkix_mod,3L

#define SN_id_pkix1_implicit_93		"id-pkix1-implicit-93"
#define NID_id_pkix1_implicit_93		272
#define OBJ_id_pkix1_implicit_93		OBJ_id_pkix_mod,4L

#define SN_id_mod_crmf		"id-mod-crmf"
#define NID_id_mod_crmf		273
#define OBJ_id_mod_crmf		OBJ_id_pkix_mod,5L

#define SN_id_mod_cmc		"id-mod-cmc"
#define NID_id_mod_cmc		274
#define OBJ_id_mod_cmc		OBJ_id_pkix_mod,6L

#define SN_id_mod_kea_profile_88		"id-mod-kea-profile-88"
#define NID_id_mod_kea_profile_88		275
#define OBJ_id_mod_kea_profile_88		OBJ_id_pkix_mod,7L

#define SN_id_mod_kea_profile_93		"id-mod-kea-profile-93"
#define NID_id_mod_kea_profile_93		276
#define OBJ_id_mod_kea_profile_93		OBJ_id_pkix_mod,8L

#define SN_id_mod_cmp		"id-mod-cmp"
#define NID_id_mod_cmp		277
#define OBJ_id_mod_cmp		OBJ_id_pkix_mod,9L

#define SN_id_mod_qualified_cert_88		"id-mod-qualified-cert-88"
#define NID_id_mod_qualified_cert_88		278
#define OBJ_id_mod_qualified_cert_88		OBJ_id_pkix_mod,10L

#define SN_id_mod_qualified_cert_93		"id-mod-qualified-cert-93"
#define NID_id_mod_qualified_cert_93		279
#define OBJ_id_mod_qualified_cert_93		OBJ_id_pkix_mod,11L

#define SN_id_mod_attribute_cert		"id-mod-attribute-cert"
#define NID_id_mod_attribute_cert		280
#define OBJ_id_mod_attribute_cert		OBJ_id_pkix_mod,12L

#define SN_id_mod_timestamp_protocol		"id-mod-timestamp-protocol"
#define NID_id_mod_timestamp_protocol		281
#define OBJ_id_mod_timestamp_protocol		OBJ_id_pkix_mod,13L

#define SN_id_mod_ocsp		"id-mod-ocsp"
#define NID_id_mod_ocsp		282
#define OBJ_id_mod_ocsp		OBJ_id_pkix_mod,14L

#define SN_id_mod_dvcs		"id-mod-dvcs"
#define NID_id_mod_dvcs		283
#define OBJ_id_mod_dvcs		OBJ_id_pkix_mod,15L

#define SN_id_mod_cmp2000		"id-mod-cmp2000"
#define NID_id_mod_cmp2000		284
#define OBJ_id_mod_cmp2000		OBJ_id_pkix_mod,16L

#define SN_info_access		"authorityInfoAccess"
#define LN_info_access		"Authority Information Access"
#define NID_info_access		177
#define OBJ_info_access		OBJ_id_pe,1L

#define SN_biometricInfo		"biometricInfo"
#define LN_biometricInfo		"Biometric Info"
#define NID_biometricInfo		285
#define OBJ_biometricInfo		OBJ_id_pe,2L

#define SN_qcStatements		"qcStatements"
#define NID_qcStatements		286
#define OBJ_qcStatements		OBJ_id_pe,3L

#define SN_ac_auditEntity		"ac-auditEntity"
#define NID_ac_auditEntity		287
#define OBJ_ac_auditEntity		OBJ_id_pe,4L

#define SN_ac_targeting		"ac-targeting"
#define NID_ac_targeting		288
#define OBJ_ac_targeting		OBJ_id_pe,5L

#define SN_aaControls		"aaControls"
#define NID_aaControls		289
#define OBJ_aaControls		OBJ_id_pe,6L

#define SN_sbgp_ipAddrBlock		"sbgp-ipAddrBlock"
#define NID_sbgp_ipAddrBlock		290
#define OBJ_sbgp_ipAddrBlock		OBJ_id_pe,7L

#define SN_sbgp_autonomousSysNum		"sbgp-autonomousSysNum"
#define NID_sbgp_autonomousSysNum		291
#define OBJ_sbgp_autonomousSysNum		OBJ_id_pe,8L

#define SN_sbgp_routerIdentifier		"sbgp-routerIdentifier"
#define NID_sbgp_routerIdentifier		292
#define OBJ_sbgp_routerIdentifier		OBJ_id_pe,9L

#define SN_ac_proxying		"ac-proxying"
#define NID_ac_proxying		397
#define OBJ_ac_proxying		OBJ_id_pe,10L

#define SN_sinfo_access		"subjectInfoAccess"
#define LN_sinfo_access		"Subject Information Access"
#define NID_sinfo_access		398
#define OBJ_sinfo_access		OBJ_id_pe,11L

#define SN_proxyCertInfo		"proxyCertInfo"
#define LN_proxyCertInfo		"Proxy Certificate Information"
#define NID_proxyCertInfo		663
#define OBJ_proxyCertInfo		OBJ_id_pe,14L

#define SN_id_qt_cps		"id-qt-cps"
#define LN_id_qt_cps		"Policy Qualifier CPS"
#define NID_id_qt_cps		164
#define OBJ_id_qt_cps		OBJ_id_qt,1L

#define SN_id_qt_unotice		"id-qt-unotice"
#define LN_id_qt_unotice		"Policy Qualifier User Notice"
#define NID_id_qt_unotice		165
#define OBJ_id_qt_unotice		OBJ_id_qt,2L

#define SN_textNotice		"textNotice"
#define NID_textNotice		293
#define OBJ_textNotice		OBJ_id_qt,3L

#define SN_server_auth		"serverAuth"
#define LN_server_auth		"TLS Web Server Authentication"
#define NID_server_auth		129
#define OBJ_server_auth		OBJ_id_kp,1L

#define SN_client_auth		"clientAuth"
#define LN_client_auth		"TLS Web Client Authentication"
#define NID_client_auth		130
#define OBJ_client_auth		OBJ_id_kp,2L

#define SN_code_sign		"codeSigning"
#define LN_code_sign		"Code Signing"
#define NID_code_sign		131
#define OBJ_code_sign		OBJ_id_kp,3L

#define SN_email_protect		"emailProtection"
#define LN_email_protect		"E-mail Protection"
#define NID_email_protect		132
#define OBJ_email_protect		OBJ_id_kp,4L

#define SN_ipsecEndSystem		"ipsecEndSystem"
#define LN_ipsecEndSystem		"IPSec End System"
#define NID_ipsecEndSystem		294
#define OBJ_ipsecEndSystem		OBJ_id_kp,5L

#define SN_ipsecTunnel		"ipsecTunnel"
#define LN_ipsecTunnel		"IPSec Tunnel"
#define NID_ipsecTunnel		295
#define OBJ_ipsecTunnel		OBJ_id_kp,6L

#define SN_ipsecUser		"ipsecUser"
#define LN_ipsecUser		"IPSec User"
#define NID_ipsecUser		296
#define OBJ_ipsecUser		OBJ_id_kp,7L

#define SN_time_stamp		"timeStamping"
#define LN_time_stamp		"Time Stamping"
#define NID_time_stamp		133
#define OBJ_time_stamp		OBJ_id_kp,8L

#define SN_OCSP_sign		"OCSPSigning"
#define LN_OCSP_sign		"OCSP Signing"
#define NID_OCSP_sign		180
#define OBJ_OCSP_sign		OBJ_id_kp,9L

#define SN_dvcs		"DVCS"
#define LN_dvcs		"dvcs"
#define NID_dvcs		297
#define OBJ_dvcs		OBJ_id_kp,10L

#define SN_id_it_caProtEncCert		"id-it-caProtEncCert"
#define NID_id_it_caProtEncCert		298
#define OBJ_id_it_caProtEncCert		OBJ_id_it,1L

#define SN_id_it_signKeyPairTypes		"id-it-signKeyPairTypes"
#define NID_id_it_signKeyPairTypes		299
#define OBJ_id_it_signKeyPairTypes		OBJ_id_it,2L

#define SN_id_it_encKeyPairTypes		"id-it-encKeyPairTypes"
#define NID_id_it_encKeyPairTypes		300
#define OBJ_id_it_encKeyPairTypes		OBJ_id_it,3L

#define SN_id_it_preferredSymmAlg		"id-it-preferredSymmAlg"
#define NID_id_it_preferredSymmAlg		301
#define OBJ_id_it_preferredSymmAlg		OBJ_id_it,4L

#define SN_id_it_caKeyUpdateInfo		"id-it-caKeyUpdateInfo"
#define NID_id_it_caKeyUpdateInfo		302
#define OBJ_id_it_caKeyUpdateInfo		OBJ_id_it,5L

#define SN_id_it_currentCRL		"id-it-currentCRL"
#define NID_id_it_currentCRL		303
#define OBJ_id_it_currentCRL		OBJ_id_it,6L

#define SN_id_it_unsupportedOIDs		"id-it-unsupportedOIDs"
#define NID_id_it_unsupportedOIDs		304
#define OBJ_id_it_unsupportedOIDs		OBJ_id_it,7L

#define SN_id_it_subscriptionRequest		"id-it-subscriptionRequest"
#define NID_id_it_subscriptionRequest		305
#define OBJ_id_it_subscriptionRequest		OBJ_id_it,8L

#define SN_id_it_subscriptionResponse		"id-it-subscriptionResponse"
#define NID_id_it_subscriptionResponse		306
#define OBJ_id_it_subscriptionResponse		OBJ_id_it,9L

#define SN_id_it_keyPairParamReq		"id-it-keyPairParamReq"
#define NID_id_it_keyPairParamReq		307
#define OBJ_id_it_keyPairParamReq		OBJ_id_it,10L

#define SN_id_it_keyPairParamRep		"id-it-keyPairParamRep"
#define NID_id_it_keyPairParamRep		308
#define OBJ_id_it_keyPairParamRep		OBJ_id_it,11L

#define SN_id_it_revPassphrase		"id-it-revPassphrase"
#define NID_id_it_revPassphrase		309
#define OBJ_id_it_revPassphrase		OBJ_id_it,12L

#define SN_id_it_implicitConfirm		"id-it-implicitConfirm"
#define NID_id_it_implicitConfirm		310
#define OBJ_id_it_implicitConfirm		OBJ_id_it,13L

#define SN_id_it_confirmWaitTime		"id-it-confirmWaitTime"
#define NID_id_it_confirmWaitTime		311
#define OBJ_id_it_confirmWaitTime		OBJ_id_it,14L

#define SN_id_it_origPKIMessage		"id-it-origPKIMessage"
#define NID_id_it_origPKIMessage		312
#define OBJ_id_it_origPKIMessage		OBJ_id_it,15L

#define SN_id_it_suppLangTags		"id-it-suppLangTags"
#define NID_id_it_suppLangTags		784
#define OBJ_id_it_suppLangTags		OBJ_id_it,16L

#define SN_id_regCtrl		"id-regCtrl"
#define NID_id_regCtrl		313
#define OBJ_id_regCtrl		OBJ_id_pkip,1L

#define SN_id_regInfo		"id-regInfo"
#define NID_id_regInfo		314
#define OBJ_id_regInfo		OBJ_id_pkip,2L

#define SN_id_regCtrl_regToken		"id-regCtrl-regToken"
#define NID_id_regCtrl_regToken		315
#define OBJ_id_regCtrl_regToken		OBJ_id_regCtrl,1L

#define SN_id_regCtrl_authenticator		"id-regCtrl-authenticator"
#define NID_id_regCtrl_authenticator		316
#define OBJ_id_regCtrl_authenticator		OBJ_id_regCtrl,2L

#define SN_id_regCtrl_pkiPublicationInfo		"id-regCtrl-pkiPublicationInfo"
#define NID_id_regCtrl_pkiPublicationInfo		317
#define OBJ_id_regCtrl_pkiPublicationInfo		OBJ_id_regCtrl,3L

#define SN_id_regCtrl_pkiArchiveOptions		"id-regCtrl-pkiArchiveOptions"
#define NID_id_regCtrl_pkiArchiveOptions		318
#define OBJ_id_regCtrl_pkiArchiveOptions		OBJ_id_regCtrl,4L

#define SN_id_regCtrl_oldCertID		"id-regCtrl-oldCertID"
#define NID_id_regCtrl_oldCertID		319
#define OBJ_id_regCtrl_oldCertID		OBJ_id_regCtrl,5L

#define SN_id_regCtrl_protocolEncrKey		"id-regCtrl-protocolEncrKey"
#define NID_id_regCtrl_protocolEncrKey		320
#define OBJ_id_regCtrl_protocolEncrKey		OBJ_id_regCtrl,6L

#define SN_id_regInfo_utf8Pairs		"id-regInfo-utf8Pairs"
#define NID_id_regInfo_utf8Pairs		321
#define OBJ_id_regInfo_utf8Pairs		OBJ_id_regInfo,1L

#define SN_id_regInfo_certReq		"id-regInfo-certReq"
#define NID_id_regInfo_certReq		322
#define OBJ_id_regInfo_certReq		OBJ_id_regInfo,2L

#define SN_id_alg_des40		"id-alg-des40"
#define NID_id_alg_des40		323
#define OBJ_id_alg_des40		OBJ_id_alg,1L

#define SN_id_alg_noSignature		"id-alg-noSignature"
#define NID_id_alg_noSignature		324
#define OBJ_id_alg_noSignature		OBJ_id_alg,2L

#define SN_id_alg_dh_sig_hmac_sha1		"id-alg-dh-sig-hmac-sha1"
#define NID_id_alg_dh_sig_hmac_sha1		325
#define OBJ_id_alg_dh_sig_hmac_sha1		OBJ_id_alg,3L

#define SN_id_alg_dh_pop		"id-alg-dh-pop"
#define NID_id_alg_dh_pop		326
#define OBJ_id_alg_dh_pop		OBJ_id_alg,4L

#define SN_id_cmc_statusInfo		"id-cmc-statusInfo"
#define NID_id_cmc_statusInfo		327
#define OBJ_id_cmc_statusInfo		OBJ_id_cmc,1L

#define SN_id_cmc_identification		"id-cmc-identification"
#define NID_id_cmc_identification		328
#define OBJ_id_cmc_identification		OBJ_id_cmc,2L

#define SN_id_cmc_identityProof		"id-cmc-identityProof"
#define NID_id_cmc_identityProof		329
#define OBJ_id_cmc_identityProof		OBJ_id_cmc,3L

#define SN_id_cmc_dataReturn		"id-cmc-dataReturn"
#define NID_id_cmc_dataReturn		330
#define OBJ_id_cmc_dataReturn		OBJ_id_cmc,4L

#define SN_id_cmc_transactionId		"id-cmc-transactionId"
#define NID_id_cmc_transactionId		331
#define OBJ_id_cmc_transactionId		OBJ_id_cmc,5L

#define SN_id_cmc_senderNonce		"id-cmc-senderNonce"
#define NID_id_cmc_senderNonce		332
#define OBJ_id_cmc_senderNonce		OBJ_id_cmc,6L

#define SN_id_cmc_recipientNonce		"id-cmc-recipientNonce"
#define NID_id_cmc_recipientNonce		333
#define OBJ_id_cmc_recipientNonce		OBJ_id_cmc,7L

#define SN_id_cmc_addExtensions		"id-cmc-addExtensions"
#define NID_id_cmc_addExtensions		334
#define OBJ_id_cmc_addExtensions		OBJ_id_cmc,8L

#define SN_id_cmc_encryptedPOP		"id-cmc-encryptedPOP"
#define NID_id_cmc_encryptedPOP		335
#define OBJ_id_cmc_encryptedPOP		OBJ_id_cmc,9L

#define SN_id_cmc_decryptedPOP		"id-cmc-decryptedPOP"
#define NID_id_cmc_decryptedPOP		336
#define OBJ_id_cmc_decryptedPOP		OBJ_id_cmc,10L

#define SN_id_cmc_lraPOPWitness		"id-cmc-lraPOPWitness"
#define NID_id_cmc_lraPOPWitness		337
#define OBJ_id_cmc_lraPOPWitness		OBJ_id_cmc,11L

#define SN_id_cmc_getCert		"id-cmc-getCert"
#define NID_id_cmc_getCert		338
#define OBJ_id_cmc_getCert		OBJ_id_cmc,15L

#define SN_id_cmc_getCRL		"id-cmc-getCRL"
#define NID_id_cmc_getCRL		339
#define OBJ_id_cmc_getCRL		OBJ_id_cmc,16L

#define SN_id_cmc_revokeRequest		"id-cmc-revokeRequest"
#define NID_id_cmc_revokeRequest		340
#define OBJ_id_cmc_revokeRequest		OBJ_id_cmc,17L

#define SN_id_cmc_regInfo		"id-cmc-regInfo"
#define NID_id_cmc_regInfo		341
#define OBJ_id_cmc_regInfo		OBJ_id_cmc,18L

#define SN_id_cmc_responseInfo		"id-cmc-responseInfo"
#define NID_id_cmc_responseInfo		342
#define OBJ_id_cmc_responseInfo		OBJ_id_cmc,19L

#define SN_id_cmc_queryPending		"id-cmc-queryPending"
#define NID_id_cmc_queryPending		343
#define OBJ_id_cmc_queryPending		OBJ_id_cmc,21L

#define SN_id_cmc_popLinkRandom		"id-cmc-popLinkRandom"
#define NID_id_cmc_popLinkRandom		344
#define OBJ_id_cmc_popLinkRandom		OBJ_id_cmc,22L

#define SN_id_cmc_popLinkWitness		"id-cmc-popLinkWitness"
#define NID_id_cmc_popLinkWitness		345
#define OBJ_id_cmc_popLinkWitness		OBJ_id_cmc,23L

#define SN_id_cmc_confirmCertAcceptance		"id-cmc-confirmCertAcceptance"
#define NID_id_cmc_confirmCertAcceptance		346
#define OBJ_id_cmc_confirmCertAcceptance		OBJ_id_cmc,24L

#define SN_id_on_personalData		"id-on-personalData"
#define NID_id_on_personalData		347
#define OBJ_id_on_personalData		OBJ_id_on,1L

#define SN_id_on_permanentIdentifier		"id-on-permanentIdentifier"
#define LN_id_on_permanentIdentifier		"Permanent Identifier"
#define NID_id_on_permanentIdentifier		858
#define OBJ_id_on_permanentIdentifier		OBJ_id_on,3L

#define SN_id_pda_dateOfBirth		"id-pda-dateOfBirth"
#define NID_id_pda_dateOfBirth		348
#define OBJ_id_pda_dateOfBirth		OBJ_id_pda,1L

#define SN_id_pda_placeOfBirth		"id-pda-placeOfBirth"
#define NID_id_pda_placeOfBirth		349
#define OBJ_id_pda_placeOfBirth		OBJ_id_pda,2L

#define SN_id_pda_gender		"id-pda-gender"
#define NID_id_pda_gender		351
#define OBJ_id_pda_gender		OBJ_id_pda,3L

#define SN_id_pda_countryOfCitizenship		"id-pda-countryOfCitizenship"
#define NID_id_pda_countryOfCitizenship		352
#define OBJ_id_pda_countryOfCitizenship		OBJ_id_pda,4L

#define SN_id_pda_countryOfResidence		"id-pda-countryOfResidence"
#define NID_id_pda_countryOfResidence		353
#define OBJ_id_pda_countryOfResidence		OBJ_id_pda,5L

#define SN_id_aca_authenticationInfo		"id-aca-authenticationInfo"
#define NID_id_aca_authenticationInfo		354
#define OBJ_id_aca_authenticationInfo		OBJ_id_aca,1L

#define SN_id_aca_accessIdentity		"id-aca-accessIdentity"
#define NID_id_aca_accessIdentity		355
#define OBJ_id_aca_accessIdentity		OBJ_id_aca,2L

#define SN_id_aca_chargingIdentity		"id-aca-chargingIdentity"
#define NID_id_aca_chargingIdentity		356
#define OBJ_id_aca_chargingIdentity		OBJ_id_aca,3L

#define SN_id_aca_group		"id-aca-group"
#define NID_id_aca_group		357
#define OBJ_id_aca_group		OBJ_id_aca,4L

#define SN_id_aca_role		"id-aca-role"
#define NID_id_aca_role		358
#define OBJ_id_aca_role		OBJ_id_aca,5L

#define SN_id_aca_encAttrs		"id-aca-encAttrs"
#define NID_id_aca_encAttrs		399
#define OBJ_id_aca_encAttrs		OBJ_id_aca,6L

#define SN_id_qcs_pkixQCSyntax_v1		"id-qcs-pkixQCSyntax-v1"
#define NID_id_qcs_pkixQCSyntax_v1		359
#define OBJ_id_qcs_pkixQCSyntax_v1		OBJ_id_qcs,1L

#define SN_id_cct_crs		"id-cct-crs"
#define NID_id_cct_crs		360
#define OBJ_id_cct_crs		OBJ_id_cct,1L

#define SN_id_cct_PKIData		"id-cct-PKIData"
#define NID_id_cct_PKIData		361
#define OBJ_id_cct_PKIData		OBJ_id_cct,2L

#define SN_id_cct_PKIResponse		"id-cct-PKIResponse"
#define NID_id_cct_PKIResponse		362
#define OBJ_id_cct_PKIResponse		OBJ_id_cct,3L

#define SN_id_ppl_anyLanguage		"id-ppl-anyLanguage"
#define LN_id_ppl_anyLanguage		"Any language"
#define NID_id_ppl_anyLanguage		664
#define OBJ_id_ppl_anyLanguage		OBJ_id_ppl,0L

#define SN_id_ppl_inheritAll		"id-ppl-inheritAll"
#define LN_id_ppl_inheritAll		"Inherit all"
#define NID_id_ppl_inheritAll		665
#define OBJ_id_ppl_inheritAll		OBJ_id_ppl,1L

#define SN_Independent		"id-ppl-independent"
#define LN_Independent		"Independent"
#define NID_Independent		667
#define OBJ_Independent		OBJ_id_ppl,2L

#define SN_ad_OCSP		"OCSP"
#define LN_ad_OCSP		"OCSP"
#define NID_ad_OCSP		178
#define OBJ_ad_OCSP		OBJ_id_ad,1L

#define SN_ad_ca_issuers		"caIssuers"
#define LN_ad_ca_issuers		"CA Issuers"
#define NID_ad_ca_issuers		179
#define OBJ_ad_ca_issuers		OBJ_id_ad,2L

#define SN_ad_timeStamping		"ad_timestamping"
#define LN_ad_timeStamping		"AD Time Stamping"
#define NID_ad_timeStamping		363
#define OBJ_ad_timeStamping		OBJ_id_ad,3L

#define SN_ad_dvcs		"AD_DVCS"
#define LN_ad_dvcs		"ad dvcs"
#define NID_ad_dvcs		364
#define OBJ_ad_dvcs		OBJ_id_ad,4L

#define SN_caRepository		"caRepository"
#define LN_caRepository		"CA Repository"
#define NID_caRepository		785
#define OBJ_caRepository		OBJ_id_ad,5L

#define OBJ_id_pkix_OCSP		OBJ_ad_OCSP

#define SN_id_pkix_OCSP_basic		"basicOCSPResponse"
#define LN_id_pkix_OCSP_basic		"Basic OCSP Response"
#define NID_id_pkix_OCSP_basic		365
#define OBJ_id_pkix_OCSP_basic		OBJ_id_pkix_OCSP,1L

#define SN_id_pkix_OCSP_Nonce		"Nonce"
#define LN_id_pkix_OCSP_Nonce		"OCSP Nonce"
#define NID_id_pkix_OCSP_Nonce		366
#define OBJ_id_pkix_OCSP_Nonce		OBJ_id_pkix_OCSP,2L

#define SN_id_pkix_OCSP_CrlID		"CrlID"
#define LN_id_pkix_OCSP_CrlID		"OCSP CRL ID"
#define NID_id_pkix_OCSP_CrlID		367
#define OBJ_id_pkix_OCSP_CrlID		OBJ_id_pkix_OCSP,3L

#define SN_id_pkix_OCSP_acceptableResponses		"acceptableResponses"
#define LN_id_pkix_OCSP_acceptableResponses		"Acceptable OCSP Responses"
#define NID_id_pkix_OCSP_acceptableResponses		368
#define OBJ_id_pkix_OCSP_acceptableResponses		OBJ_id_pkix_OCSP,4L

#define SN_id_pkix_OCSP_noCheck		"noCheck"
#define LN_id_pkix_OCSP_noCheck		"OCSP No Check"
#define NID_id_pkix_OCSP_noCheck		369
#define OBJ_id_pkix_OCSP_noCheck		OBJ_id_pkix_OCSP,5L

#define SN_id_pkix_OCSP_archiveCutoff		"archiveCutoff"
#define LN_id_pkix_OCSP_archiveCutoff		"OCSP Archive Cutoff"
#define NID_id_pkix_OCSP_archiveCutoff		370
#define OBJ_id_pkix_OCSP_archiveCutoff		OBJ_id_pkix_OCSP,6L

#define SN_id_pkix_OCSP_serviceLocator		"serviceLocator"
#define LN_id_pkix_OCSP_serviceLocator		"OCSP Service Locator"
#define NID_id_pkix_OCSP_serviceLocator		371
#define OBJ_id_pkix_OCSP_serviceLocator		OBJ_id_pkix_OCSP,7L

#define SN_id_pkix_OCSP_extendedStatus		"extendedStatus"
#define LN_id_pkix_OCSP_extendedStatus		"Extended OCSP Status"
#define NID_id_pkix_OCSP_extendedStatus		372
#define OBJ_id_pkix_OCSP_extendedStatus		OBJ_id_pkix_OCSP,8L

#define SN_id_pkix_OCSP_valid		"valid"
#define NID_id_pkix_OCSP_valid		373
#define OBJ_id_pkix_OCSP_valid		OBJ_id_pkix_OCSP,9L

#define SN_id_pkix_OCSP_path		"path"
#define NID_id_pkix_OCSP_path		374
#define OBJ_id_pkix_OCSP_path		OBJ_id_pkix_OCSP,10L

#define SN_id_pkix_OCSP_trustRoot		"trustRoot"
#define LN_id_pkix_OCSP_trustRoot		"Trust Root"
#define NID_id_pkix_OCSP_trustRoot		375
#define OBJ_id_pkix_OCSP_trustRoot		OBJ_id_pkix_OCSP,11L

#define SN_algorithm		"algorithm"
#define LN_algorithm		"algorithm"
#define NID_algorithm		376
#define OBJ_algorithm		1L,3L,14L,3L,2L

#define SN_md5WithRSA		"RSA-NP-MD5"
#define LN_md5WithRSA		"md5WithRSA"
#define NID_md5WithRSA		104
#define OBJ_md5WithRSA		OBJ_algorithm,3L

#define SN_des_ecb		"DES-ECB"
#define LN_des_ecb		"des-ecb"
#define NID_des_ecb		29
#define OBJ_des_ecb		OBJ_algorithm,6L

#define SN_des_cbc		"DES-CBC"
#define LN_des_cbc		"des-cbc"
#define NID_des_cbc		31
#define OBJ_des_cbc		OBJ_algorithm,7L

#define SN_des_ofb64		"DES-OFB"
#define LN_des_ofb64		"des-ofb"
#define NID_des_ofb64		45
#define OBJ_des_ofb64		OBJ_algorithm,8L

#define SN_des_cfb64		"DES-CFB"
#define LN_des_cfb64		"des-cfb"
#define NID_des_cfb64		30
#define OBJ_des_cfb64		OBJ_algorithm,9L

#define SN_rsaSignature		"rsaSignature"
#define NID_rsaSignature		377
#define OBJ_rsaSignature		OBJ_algorithm,11L

#define SN_dsa_2		"DSA-old"
#define LN_dsa_2		"dsaEncryption-old"
#define NID_dsa_2		67
#define OBJ_dsa_2		OBJ_algorithm,12L

#define SN_dsaWithSHA		"DSA-SHA"
#define LN_dsaWithSHA		"dsaWithSHA"
#define NID_dsaWithSHA		66
#define OBJ_dsaWithSHA		OBJ_algorithm,13L

#define SN_shaWithRSAEncryption		"RSA-SHA"
#define LN_shaWithRSAEncryption		"shaWithRSAEncryption"
#define NID_shaWithRSAEncryption		42
#define OBJ_shaWithRSAEncryption		OBJ_algorithm,15L

#define SN_des_ede_ecb		"DES-EDE"
#define LN_des_ede_ecb		"des-ede"
#define NID_des_ede_ecb		32
#define OBJ_des_ede_ecb		OBJ_algorithm,17L

#define SN_des_ede3_ecb		"DES-EDE3"
#define LN_des_ede3_ecb		"des-ede3"
#define NID_des_ede3_ecb		33

#define SN_des_ede_cbc		"DES-EDE-CBC"
#define LN_des_ede_cbc		"des-ede-cbc"
#define NID_des_ede_cbc		43

#define SN_des_ede_cfb64		"DES-EDE-CFB"
#define LN_des_ede_cfb64		"des-ede-cfb"
#define NID_des_ede_cfb64		60

#define SN_des_ede3_cfb64		"DES-EDE3-CFB"
#define LN_des_ede3_cfb64		"des-ede3-cfb"
#define NID_des_ede3_cfb64		61

#define SN_des_ede_ofb64		"DES-EDE-OFB"
#define LN_des_ede_ofb64		"des-ede-ofb"
#define NID_des_ede_ofb64		62

#define SN_des_ede3_ofb64		"DES-EDE3-OFB"
#define LN_des_ede3_ofb64		"des-ede3-ofb"
#define NID_des_ede3_ofb64		63

#define SN_desx_cbc		"DESX-CBC"
#define LN_desx_cbc		"desx-cbc"
#define NID_desx_cbc		80

#define SN_sha		"SHA"
#define LN_sha		"sha"
#define NID_sha		41
#define OBJ_sha		OBJ_algorithm,18L

#define SN_sha1		"SHA1"
#define LN_sha1		"sha1"
#define NID_sha1		64
#define OBJ_sha1		OBJ_algorithm,26L

#define SN_dsaWithSHA1_2		"DSA-SHA1-old"
#define LN_dsaWithSHA1_2		"dsaWithSHA1-old"
#define NID_dsaWithSHA1_2		70
#define OBJ_dsaWithSHA1_2		OBJ_algorithm,27L

#define SN_sha1WithRSA		"RSA-SHA1-2"
#define LN_sha1WithRSA		"sha1WithRSA"
#define NID_sha1WithRSA		115
#define OBJ_sha1WithRSA		OBJ_algorithm,29L

#define SN_ripemd160		"RIPEMD160"
#define LN_ripemd160		"ripemd160"
#define NID_ripemd160		117
#define OBJ_ripemd160		1L,3L,36L,3L,2L,1L

#define SN_ripemd160WithRSA		"RSA-RIPEMD160"
#define LN_ripemd160WithRSA		"ripemd160WithRSA"
#define NID_ripemd160WithRSA		119
#define OBJ_ripemd160WithRSA		1L,3L,36L,3L,3L,1L,2L

#define SN_sxnet		"SXNetID"
#define LN_sxnet		"Strong Extranet ID"
#define NID_sxnet		143
#define OBJ_sxnet		1L,3L,101L,1L,4L,1L

#define SN_X500		"X500"
#define LN_X500		"directory services (X.500)"
#define NID_X500		11
#define OBJ_X500		2L,5L

#define SN_X509		"X509"
#define NID_X509		12
#define OBJ_X509		OBJ_X500,4L

#define SN_commonName		"CN"
#define LN_commonName		"commonName"
#define NID_commonName		13
#define OBJ_commonName		OBJ_X509,3L

#define SN_surname		"SN"
#define LN_surname		"surname"
#define NID_surname		100
#define OBJ_surname		OBJ_X509,4L

#define LN_serialNumber		"serialNumber"
#define NID_serialNumber		105
#define OBJ_serialNumber		OBJ_X509,5L

#define SN_countryName		"C"
#define LN_countryName		"countryName"
#define NID_countryName		14
#define OBJ_countryName		OBJ_X509,6L

#define SN_localityName		"L"
#define LN_localityName		"localityName"
#define NID_localityName		15
#define OBJ_localityName		OBJ_X509,7L

#define SN_stateOrProvinceName		"ST"
#define LN_stateOrProvinceName		"stateOrProvinceName"
#define NID_stateOrProvinceName		16
#define OBJ_stateOrProvinceName		OBJ_X509,8L

#define LN_streetAddress		"streetAddress"
#define NID_streetAddress		660
#define OBJ_streetAddress		OBJ_X509,9L

#define SN_organizationName		"O"
#define LN_organizationName		"organizationName"
#define NID_organizationName		17
#define OBJ_organizationName		OBJ_X509,10L

#define SN_organizationalUnitName		"OU"
#define LN_organizationalUnitName		"organizationalUnitName"
#define NID_organizationalUnitName		18
#define OBJ_organizationalUnitName		OBJ_X509,11L

#define LN_title		"title"
#define NID_title		106
#define OBJ_title		OBJ_X509,12L

#define LN_description		"description"
#define NID_description		107
#define OBJ_description		OBJ_X509,13L

#define LN_postalCode		"postalCode"
#define NID_postalCode		661
#define OBJ_postalCode		OBJ_X509,17L

#define SN_name		"name"
#define LN_name		"name"
#define NID_name		173
#define OBJ_name		OBJ_X509,41L

#define SN_givenName		"GN"
#define LN_givenName		"givenName"
#define NID_givenName		99
#define OBJ_givenName		OBJ_X509,42L

#define LN_initials		"initials"
#define NID_initials		101
#define OBJ_initials		OBJ_X509,43L

#define LN_generationQualifier		"generationQualifier"
#define NID_generationQualifier		509
#define OBJ_generationQualifier		OBJ_X509,44L

#define LN_x500UniqueIdentifier		"x500UniqueIdentifier"
#define NID_x500UniqueIdentifier		503
#define OBJ_x500UniqueIdentifier		OBJ_X509,45L

#define SN_dnQualifier		"dnQualifier"
#define LN_dnQualifier		"dnQualifier"
#define NID_dnQualifier		174
#define OBJ_dnQualifier		OBJ_X509,46L

#define LN_pseudonym		"pseudonym"
#define NID_pseudonym		510
#define OBJ_pseudonym		OBJ_X509,65L

#define SN_role		"role"
#define LN_role		"role"
#define NID_role		400
#define OBJ_role		OBJ_X509,72L

#define SN_X500algorithms		"X500algorithms"
#define LN_X500algorithms		"directory services - algorithms"
#define NID_X500algorithms		378
#define OBJ_X500algorithms		OBJ_X500,8L

#define SN_rsa		"RSA"
#define LN_rsa		"rsa"
#define NID_rsa		19
#define OBJ_rsa		OBJ_X500algorithms,1L,1L

#define SN_mdc2WithRSA		"RSA-MDC2"
#define LN_mdc2WithRSA		"mdc2WithRSA"
#define NID_mdc2WithRSA		96
#define OBJ_mdc2WithRSA		OBJ_X500algorithms,3L,100L

#define SN_mdc2		"MDC2"
#define LN_mdc2		"mdc2"
#define NID_mdc2		95
#define OBJ_mdc2		OBJ_X500algorithms,3L,101L

#define SN_id_ce		"id-ce"
#define NID_id_ce		81
#define OBJ_id_ce		OBJ_X500,29L

#define SN_subject_directory_attributes		"subjectDirectoryAttributes"
#define LN_subject_directory_attributes		"X509v3 Subject Directory Attributes"
#define NID_subject_directory_attributes		769
#define OBJ_subject_directory_attributes		OBJ_id_ce,9L

#define SN_subject_key_identifier		"subjectKeyIdentifier"
#define LN_subject_key_identifier		"X509v3 Subject Key Identifier"
#define NID_subject_key_identifier		82
#define OBJ_subject_key_identifier		OBJ_id_ce,14L

#define SN_key_usage		"keyUsage"
#define LN_key_usage		"X509v3 Key Usage"
#define NID_key_usage		83
#define OBJ_key_usage		OBJ_id_ce,15L

#define SN_private_key_usage_period		"privateKeyUsagePeriod"
#define LN_private_key_usage_period		"X509v3 Private Key Usage Period"
#define NID_private_key_usage_period		84
#define OBJ_private_key_usage_period		OBJ_id_ce,16L

#define SN_subject_alt_name		"subjectAltName"
#define LN_subject_alt_name		"X509v3 Subject Alternative Name"
#define NID_subject_alt_name		85
#define OBJ_subject_alt_name		OBJ_id_ce,17L

#define SN_issuer_alt_name		"issuerAltName"
#define LN_issuer_alt_name		"X509v3 Issuer Alternative Name"
#define NID_issuer_alt_name		86
#define OBJ_issuer_alt_name		OBJ_id_ce,18L

#define SN_basic_constraints		"basicConstraints"
#define LN_basic_constraints		"X509v3 Basic Constraints"
#define NID_basic_constraints		87
#define OBJ_basic_constraints		OBJ_id_ce,19L

#define SN_crl_number		"crlNumber"
#define LN_crl_number		"X509v3 CRL Number"
#define NID_crl_number		88
#define OBJ_crl_number		OBJ_id_ce,20L

#define SN_crl_reason		"CRLReason"
#define LN_crl_reason		"X509v3 CRL Reason Code"
#define NID_crl_reason		141
#define OBJ_crl_reason		OBJ_id_ce,21L

#define SN_invalidity_date		"invalidityDate"
#define LN_invalidity_date		"Invalidity Date"
#define NID_invalidity_date		142
#define OBJ_invalidity_date		OBJ_id_ce,24L

#define SN_delta_crl		"deltaCRL"
#define LN_delta_crl		"X509v3 Delta CRL Indicator"
#define NID_delta_crl		140
#define OBJ_delta_crl		OBJ_id_ce,27L

#define SN_issuing_distribution_point		"issuingDistributionPoint"
#define LN_issuing_distribution_point		"X509v3 Issuing Distrubution Point"
#define NID_issuing_distribution_point		770
#define OBJ_issuing_distribution_point		OBJ_id_ce,28L

#define SN_certificate_issuer		"certificateIssuer"
#define LN_certificate_issuer		"X509v3 Certificate Issuer"
#define NID_certificate_issuer		771
#define OBJ_certificate_issuer		OBJ_id_ce,29L

#define SN_name_constraints		"nameConstraints"
#define LN_name_constraints		"X509v3 Name Constraints"
#define NID_name_constraints		666
#define OBJ_name_constraints		OBJ_id_ce,30L

#define SN_crl_distribution_points		"crlDistributionPoints"
#define LN_crl_distribution_points		"X509v3 CRL Distribution Points"
#define NID_crl_distribution_points		103
#define OBJ_crl_distribution_points		OBJ_id_ce,31L

#define SN_certificate_policies		"certificatePolicies"
#define LN_certificate_policies		"X509v3 Certificate Policies"
#define NID_certificate_policies		89
#define OBJ_certificate_policies		OBJ_id_ce,32L

#define SN_any_policy		"anyPolicy"
#define LN_any_policy		"X509v3 Any Policy"
#define NID_any_policy		746
#define OBJ_any_policy		OBJ_certificate_policies,0L

#define SN_policy_mappings		"policyMappings"
#define LN_policy_mappings		"X509v3 Policy Mappings"
#define NID_policy_mappings		747
#define OBJ_policy_mappings		OBJ_id_ce,33L

#define SN_authority_key_identifier		"authorityKeyIdentifier"
#define LN_authority_key_identifier		"X509v3 Authority Key Identifier"
#define NID_authority_key_identifier		90
#define OBJ_authority_key_identifier		OBJ_id_ce,35L

#define SN_policy_constraints		"policyConstraints"
#define LN_policy_constraints		"X509v3 Policy Constraints"
#define NID_policy_constraints		401
#define OBJ_policy_constraints		OBJ_id_ce,36L

#define SN_ext_key_usage		"extendedKeyUsage"
#define LN_ext_key_usage		"X509v3 Extended Key Usage"
#define NID_ext_key_usage		126
#define OBJ_ext_key_usage		OBJ_id_ce,37L

#define SN_freshest_crl		"freshestCRL"
#define LN_freshest_crl		"X509v3 Freshest CRL"
#define NID_freshest_crl		857
#define OBJ_freshest_crl		OBJ_id_ce,46L

#define SN_inhibit_any_policy		"inhibitAnyPolicy"
#define LN_inhibit_any_policy		"X509v3 Inhibit Any Policy"
#define NID_inhibit_any_policy		748
#define OBJ_inhibit_any_policy		OBJ_id_ce,54L

#define SN_target_information		"targetInformation"
#define LN_target_information		"X509v3 AC Targeting"
#define NID_target_information		402
#define OBJ_target_information		OBJ_id_ce,55L

#define SN_no_rev_avail		"noRevAvail"
#define LN_no_rev_avail		"X509v3 No Revocation Available"
#define NID_no_rev_avail		403
#define OBJ_no_rev_avail		OBJ_id_ce,56L

#define SN_netscape		"Netscape"
#define LN_netscape		"Netscape Communications Corp."
#define NID_netscape		57
#define OBJ_netscape		2L,16L,840L,1L,113730L

#define SN_netscape_cert_extension		"nsCertExt"
#define LN_netscape_cert_extension		"Netscape Certificate Extension"
#define NID_netscape_cert_extension		58
#define OBJ_netscape_cert_extension		OBJ_netscape,1L

#define SN_netscape_data_type		"nsDataType"
#define LN_netscape_data_type		"Netscape Data Type"
#define NID_netscape_data_type		59
#define OBJ_netscape_data_type		OBJ_netscape,2L

#define SN_netscape_cert_type		"nsCertType"
#define LN_netscape_cert_type		"Netscape Cert Type"
#define NID_netscape_cert_type		71
#define OBJ_netscape_cert_type		OBJ_netscape_cert_extension,1L

#define SN_netscape_base_url		"nsBaseUrl"
#define LN_netscape_base_url		"Netscape Base Url"
#define NID_netscape_base_url		72
#define OBJ_netscape_base_url		OBJ_netscape_cert_extension,2L

#define SN_netscape_revocation_url		"nsRevocationUrl"
#define LN_netscape_revocation_url		"Netscape Revocation Url"
#define NID_netscape_revocation_url		73
#define OBJ_netscape_revocation_url		OBJ_netscape_cert_extension,3L

#define SN_netscape_ca_revocation_url		"nsCaRevocationUrl"
#define LN_netscape_ca_revocation_url		"Netscape CA Revocation Url"
#define NID_netscape_ca_revocation_url		74
#define OBJ_netscape_ca_revocation_url		OBJ_netscape_cert_extension,4L

#define SN_netscape_renewal_url		"nsRenewalUrl"
#define LN_netscape_renewal_url		"Netscape Renewal Url"
#define NID_netscape_renewal_url		75
#define OBJ_netscape_renewal_url		OBJ_netscape_cert_extension,7L

#define SN_netscape_ca_policy_url		"nsCaPolicyUrl"
#define LN_netscape_ca_policy_url		"Netscape CA Policy Url"
#define NID_netscape_ca_policy_url		76
#define OBJ_netscape_ca_policy_url		OBJ_netscape_cert_extension,8L

#define SN_netscape_ssl_server_name		"nsSslServerName"
#define LN_netscape_ssl_server_name		"Netscape SSL Server Name"
#define NID_netscape_ssl_server_name		77
#define OBJ_netscape_ssl_server_name		OBJ_netscape_cert_extension,12L

#define SN_netscape_comment		"nsComment"
#define LN_netscape_comment		"Netscape Comment"
#define NID_netscape_comment		78
#define OBJ_netscape_comment		OBJ_netscape_cert_extension,13L

#define SN_netscape_cert_sequence		"nsCertSequence"
#define LN_netscape_cert_sequence		"Netscape Certificate Sequence"
#define NID_netscape_cert_sequence		79
#define OBJ_netscape_cert_sequence		OBJ_netscape_data_type,5L

#define SN_ns_sgc		"nsSGC"
#define LN_ns_sgc		"Netscape Server Gated Crypto"
#define NID_ns_sgc		139
#define OBJ_ns_sgc		OBJ_netscape,4L,1L

#define SN_org		"ORG"
#define LN_org		"org"
#define NID_org		379
#define OBJ_org		OBJ_iso,3L

#define SN_dod		"DOD"
#define LN_dod		"dod"
#define NID_dod		380
#define OBJ_dod		OBJ_org,6L

#define SN_iana		"IANA"
#define LN_iana		"iana"
#define NID_iana		381
#define OBJ_iana		OBJ_dod,1L

#define OBJ_internet		OBJ_iana

#define SN_Directory		"directory"
#define LN_Directory		"Directory"
#define NID_Directory		382
#define OBJ_Directory		OBJ_internet,1L

#define SN_Management		"mgmt"
#define LN_Management		"Management"
#define NID_Management		383
#define OBJ_Management		OBJ_internet,2L

#define SN_Experimental		"experimental"
#define LN_Experimental		"Experimental"
#define NID_Experimental		384
#define OBJ_Experimental		OBJ_internet,3L

#define SN_Private		"private"
#define LN_Private		"Private"
#define NID_Private		385
#define OBJ_Private		OBJ_internet,4L

#define SN_Security		"security"
#define LN_Security		"Security"
#define NID_Security		386
#define OBJ_Security		OBJ_internet,5L

#define SN_SNMPv2		"snmpv2"
#define LN_SNMPv2		"SNMPv2"
#define NID_SNMPv2		387
#define OBJ_SNMPv2		OBJ_internet,6L

#define LN_Mail		"Mail"
#define NID_Mail		388
#define OBJ_Mail		OBJ_internet,7L

#define SN_Enterprises		"enterprises"
#define LN_Enterprises		"Enterprises"
#define NID_Enterprises		389
#define OBJ_Enterprises		OBJ_Private,1L

#define SN_dcObject		"dcobject"
#define LN_dcObject		"dcObject"
#define NID_dcObject		390
#define OBJ_dcObject		OBJ_Enterprises,1466L,344L

#define SN_mime_mhs		"mime-mhs"
#define LN_mime_mhs		"MIME MHS"
#define NID_mime_mhs		504
#define OBJ_mime_mhs		OBJ_Mail,1L

#define SN_mime_mhs_headings		"mime-mhs-headings"
#define LN_mime_mhs_headings		"mime-mhs-headings"
#define NID_mime_mhs_headings		505
#define OBJ_mime_mhs_headings		OBJ_mime_mhs,1L

#define SN_mime_mhs_bodies		"mime-mhs-bodies"
#define LN_mime_mhs_bodies		"mime-mhs-bodies"
#define NID_mime_mhs_bodies		506
#define OBJ_mime_mhs_bodies		OBJ_mime_mhs,2L

#define SN_id_hex_partial_message		"id-hex-partial-message"
#define LN_id_hex_partial_message		"id-hex-partial-message"
#define NID_id_hex_partial_message		507
#define OBJ_id_hex_partial_message		OBJ_mime_mhs_headings,1L

#define SN_id_hex_multipart_message		"id-hex-multipart-message"
#define LN_id_hex_multipart_message		"id-hex-multipart-message"
#define NID_id_hex_multipart_message		508
#define OBJ_id_hex_multipart_message		OBJ_mime_mhs_headings,2L

#define SN_rle_compression		"RLE"
#define LN_rle_compression		"run length compression"
#define NID_rle_compression		124
#define OBJ_rle_compression		1L,1L,1L,1L,666L,1L

#define SN_zlib_compression		"ZLIB"
#define LN_zlib_compression		"zlib compression"
#define NID_zlib_compression		125
#define OBJ_zlib_compression		OBJ_id_smime_alg,8L

#define OBJ_csor		2L,16L,840L,1L,101L,3L

#define OBJ_nistAlgorithms		OBJ_csor,4L

#define OBJ_aes		OBJ_nistAlgorithms,1L

#define SN_aes_128_ecb		"AES-128-ECB"
#define LN_aes_128_ecb		"aes-128-ecb"
#define NID_aes_128_ecb		418
#define OBJ_aes_128_ecb		OBJ_aes,1L

#define SN_aes_128_cbc		"AES-128-CBC"
#define LN_aes_128_cbc		"aes-128-cbc"
#define NID_aes_128_cbc		419
#define OBJ_aes_128_cbc		OBJ_aes,2L

#define SN_aes_128_ofb128		"AES-128-OFB"
#define LN_aes_128_ofb128		"aes-128-ofb"
#define NID_aes_128_ofb128		420
#define OBJ_aes_128_ofb128		OBJ_aes,3L

#define SN_aes_128_cfb128		"AES-128-CFB"
#define LN_aes_128_cfb128		"aes-128-cfb"
#define NID_aes_128_cfb128		421
#define OBJ_aes_128_cfb128		OBJ_aes,4L

#define SN_aes_192_ecb		"AES-192-ECB"
#define LN_aes_192_ecb		"aes-192-ecb"
#define NID_aes_192_ecb		422
#define OBJ_aes_192_ecb		OBJ_aes,21L

#define SN_aes_192_cbc		"AES-192-CBC"
#define LN_aes_192_cbc		"aes-192-cbc"
#define NID_aes_192_cbc		423
#define OBJ_aes_192_cbc		OBJ_aes,22L

#define SN_aes_192_ofb128		"AES-192-OFB"
#define LN_aes_192_ofb128		"aes-192-ofb"
#define NID_aes_192_ofb128		424
#define OBJ_aes_192_ofb128		OBJ_aes,23L

#define SN_aes_192_cfb128		"AES-192-CFB"
#define LN_aes_192_cfb128		"aes-192-cfb"
#define NID_aes_192_cfb128		425
#define OBJ_aes_192_cfb128		OBJ_aes,24L

#define SN_aes_256_ecb		"AES-256-ECB"
#define LN_aes_256_ecb		"aes-256-ecb"
#define NID_aes_256_ecb		426
#define OBJ_aes_256_ecb		OBJ_aes,41L

#define SN_aes_256_cbc		"AES-256-CBC"
#define LN_aes_256_cbc		"aes-256-cbc"
#define NID_aes_256_cbc		427
#define OBJ_aes_256_cbc		OBJ_aes,42L

#define SN_aes_256_ofb128		"AES-256-OFB"
#define LN_aes_256_ofb128		"aes-256-ofb"
#define NID_aes_256_ofb128		428
#define OBJ_aes_256_ofb128		OBJ_aes,43L

#define SN_aes_256_cfb128		"AES-256-CFB"
#define LN_aes_256_cfb128		"aes-256-cfb"
#define NID_aes_256_cfb128		429
#define OBJ_aes_256_cfb128		OBJ_aes,44L

#define SN_aes_128_cfb1		"AES-128-CFB1"
#define LN_aes_128_cfb1		"aes-128-cfb1"
#define NID_aes_128_cfb1		650

#define SN_aes_192_cfb1		"AES-192-CFB1"
#define LN_aes_192_cfb1		"aes-192-cfb1"
#define NID_aes_192_cfb1		651

#define SN_aes_256_cfb1		"AES-256-CFB1"
#define LN_aes_256_cfb1		"aes-256-cfb1"
#define NID_aes_256_cfb1		652

#define SN_aes_128_cfb8		"AES-128-CFB8"
#define LN_aes_128_cfb8		"aes-128-cfb8"
#define NID_aes_128_cfb8		653

#define SN_aes_192_cfb8		"AES-192-CFB8"
#define LN_aes_192_cfb8		"aes-192-cfb8"
#define NID_aes_192_cfb8		654

#define SN_aes_256_cfb8		"AES-256-CFB8"
#define LN_aes_256_cfb8		"aes-256-cfb8"
#define NID_aes_256_cfb8		655

#define SN_des_cfb1		"DES-CFB1"
#define LN_des_cfb1		"des-cfb1"
#define NID_des_cfb1		656

#define SN_des_cfb8		"DES-CFB8"
#define LN_des_cfb8		"des-cfb8"
#define NID_des_cfb8		657

#define SN_des_ede3_cfb1		"DES-EDE3-CFB1"
#define LN_des_ede3_cfb1		"des-ede3-cfb1"
#define NID_des_ede3_cfb1		658

#define SN_des_ede3_cfb8		"DES-EDE3-CFB8"
#define LN_des_ede3_cfb8		"des-ede3-cfb8"
#define NID_des_ede3_cfb8		659

#define SN_id_aes128_wrap		"id-aes128-wrap"
#define NID_id_aes128_wrap		788
#define OBJ_id_aes128_wrap		OBJ_aes,5L

#define SN_id_aes192_wrap		"id-aes192-wrap"
#define NID_id_aes192_wrap		789
#define OBJ_id_aes192_wrap		OBJ_aes,25L

#define SN_id_aes256_wrap		"id-aes256-wrap"
#define NID_id_aes256_wrap		790
#define OBJ_id_aes256_wrap		OBJ_aes,45L

#define OBJ_nist_hashalgs		OBJ_nistAlgorithms,2L

#define SN_sha256		"SHA256"
#define LN_sha256		"sha256"
#define NID_sha256		672
#define OBJ_sha256		OBJ_nist_hashalgs,1L

#define SN_sha384		"SHA384"
#define LN_sha384		"sha384"
#define NID_sha384		673
#define OBJ_sha384		OBJ_nist_hashalgs,2L

#define SN_sha512		"SHA512"
#define LN_sha512		"sha512"
#define NID_sha512		674
#define OBJ_sha512		OBJ_nist_hashalgs,3L

#define SN_sha224		"SHA224"
#define LN_sha224		"sha224"
#define NID_sha224		675
#define OBJ_sha224		OBJ_nist_hashalgs,4L

#define OBJ_dsa_with_sha2		OBJ_nistAlgorithms,3L

#define SN_dsa_with_SHA224		"dsa_with_SHA224"
#define NID_dsa_with_SHA224		802
#define OBJ_dsa_with_SHA224		OBJ_dsa_with_sha2,1L

#define SN_dsa_with_SHA256		"dsa_with_SHA256"
#define NID_dsa_with_SHA256		803
#define OBJ_dsa_with_SHA256		OBJ_dsa_with_sha2,2L

#define SN_hold_instruction_code		"holdInstructionCode"
#define LN_hold_instruction_code		"Hold Instruction Code"
#define NID_hold_instruction_code		430
#define OBJ_hold_instruction_code		OBJ_id_ce,23L

#define OBJ_holdInstruction		OBJ_X9_57,2L

#define SN_hold_instruction_none		"holdInstructionNone"
#define LN_hold_instruction_none		"Hold Instruction None"
#define NID_hold_instruction_none		431
#define OBJ_hold_instruction_none		OBJ_holdInstruction,1L

#define SN_hold_instruction_call_issuer		"holdInstructionCallIssuer"
#define LN_hold_instruction_call_issuer		"Hold Instruction Call Issuer"
#define NID_hold_instruction_call_issuer		432
#define OBJ_hold_instruction_call_issuer		OBJ_holdInstruction,2L

#define SN_hold_instruction_reject		"holdInstructionReject"
#define LN_hold_instruction_reject		"Hold Instruction Reject"
#define NID_hold_instruction_reject		433
#define OBJ_hold_instruction_reject		OBJ_holdInstruction,3L

#define SN_data		"data"
#define NID_data		434
#define OBJ_data		OBJ_itu_t,9L

#define SN_pss		"pss"
#define NID_pss		435
#define OBJ_pss		OBJ_data,2342L

#define SN_ucl		"ucl"
#define NID_ucl		436
#define OBJ_ucl		OBJ_pss,19200300L

#define SN_pilot		"pilot"
#define NID_pilot		437
#define OBJ_pilot		OBJ_ucl,100L

#define LN_pilotAttributeType		"pilotAttributeType"
#define NID_pilotAttributeType		438
#define OBJ_pilotAttributeType		OBJ_pilot,1L

#define LN_pilotAttributeSyntax		"pilotAttributeSyntax"
#define NID_pilotAttributeSyntax		439
#define OBJ_pilotAttributeSyntax		OBJ_pilot,3L

#define LN_pilotObjectClass		"pilotObjectClass"
#define NID_pilotObjectClass		440
#define OBJ_pilotObjectClass		OBJ_pilot,4L

#define LN_pilotGroups		"pilotGroups"
#define NID_pilotGroups		441
#define OBJ_pilotGroups		OBJ_pilot,10L

#define LN_iA5StringSyntax		"iA5StringSyntax"
#define NID_iA5StringSyntax		442
#define OBJ_iA5StringSyntax		OBJ_pilotAttributeSyntax,4L

#define LN_caseIgnoreIA5StringSyntax		"caseIgnoreIA5StringSyntax"
#define NID_caseIgnoreIA5StringSyntax		443
#define OBJ_caseIgnoreIA5StringSyntax		OBJ_pilotAttributeSyntax,5L

#define LN_pilotObject		"pilotObject"
#define NID_pilotObject		444
#define OBJ_pilotObject		OBJ_pilotObjectClass,3L

#define LN_pilotPerson		"pilotPerson"
#define NID_pilotPerson		445
#define OBJ_pilotPerson		OBJ_pilotObjectClass,4L

#define SN_account		"account"
#define NID_account		446
#define OBJ_account		OBJ_pilotObjectClass,5L

#define SN_document		"document"
#define NID_document		447
#define OBJ_document		OBJ_pilotObjectClass,6L

#define SN_room		"room"
#define NID_room		448
#define OBJ_room		OBJ_pilotObjectClass,7L

#define LN_documentSeries		"documentSeries"
#define NID_documentSeries		449
#define OBJ_documentSeries		OBJ_pilotObjectClass,9L

#define SN_Domain		"domain"
#define LN_Domain		"Domain"
#define NID_Domain		392
#define OBJ_Domain		OBJ_pilotObjectClass,13L

#define LN_rFC822localPart		"rFC822localPart"
#define NID_rFC822localPart		450
#define OBJ_rFC822localPart		OBJ_pilotObjectClass,14L

#define LN_dNSDomain		"dNSDomain"
#define NID_dNSDomain		451
#define OBJ_dNSDomain		OBJ_pilotObjectClass,15L

#define LN_domainRelatedObject		"domainRelatedObject"
#define NID_domainRelatedObject		452
#define OBJ_domainRelatedObject		OBJ_pilotObjectClass,17L

#define LN_friendlyCountry		"friendlyCountry"
#define NID_friendlyCountry		453
#define OBJ_friendlyCountry		OBJ_pilotObjectClass,18L

#define LN_simpleSecurityObject		"simpleSecurityObject"
#define NID_simpleSecurityObject		454
#define OBJ_simpleSecurityObject		OBJ_pilotObjectClass,19L

#define LN_pilotOrganization		"pilotOrganization"
#define NID_pilotOrganization		455
#define OBJ_pilotOrganization		OBJ_pilotObjectClass,20L

#define LN_pilotDSA		"pilotDSA"
#define NID_pilotDSA		456
#define OBJ_pilotDSA		OBJ_pilotObjectClass,21L

#define LN_qualityLabelledData		"qualityLabelledData"
#define NID_qualityLabelledData		457
#define OBJ_qualityLabelledData		OBJ_pilotObjectClass,22L

#define SN_userId		"UID"
#define LN_userId		"userId"
#define NID_userId		458
#define OBJ_userId		OBJ_pilotAttributeType,1L

#define LN_textEncodedORAddress		"textEncodedORAddress"
#define NID_textEncodedORAddress		459
#define OBJ_textEncodedORAddress		OBJ_pilotAttributeType,2L

#define SN_rfc822Mailbox		"mail"
#define LN_rfc822Mailbox		"rfc822Mailbox"
#define NID_rfc822Mailbox		460
#define OBJ_rfc822Mailbox		OBJ_pilotAttributeType,3L

#define SN_info		"info"
#define NID_info		461
#define OBJ_info		OBJ_pilotAttributeType,4L

#define LN_favouriteDrink		"favouriteDrink"
#define NID_favouriteDrink		462
#define OBJ_favouriteDrink		OBJ_pilotAttributeType,5L

#define LN_roomNumber		"roomNumber"
#define NID_roomNumber		463
#define OBJ_roomNumber		OBJ_pilotAttributeType,6L

#define SN_photo		"photo"
#define NID_photo		464
#define OBJ_photo		OBJ_pilotAttributeType,7L

#define LN_userClass		"userClass"
#define NID_userClass		465
#define OBJ_userClass		OBJ_pilotAttributeType,8L

#define SN_host		"host"
#define NID_host		466
#define OBJ_host		OBJ_pilotAttributeType,9L

#define SN_manager		"manager"
#define NID_manager		467
#define OBJ_manager		OBJ_pilotAttributeType,10L

#define LN_documentIdentifier		"documentIdentifier"
#define NID_documentIdentifier		468
#define OBJ_documentIdentifier		OBJ_pilotAttributeType,11L

#define LN_documentTitle		"documentTitle"
#define NID_documentTitle		469
#define OBJ_documentTitle		OBJ_pilotAttributeType,12L

#define LN_documentVersion		"documentVersion"
#define NID_documentVersion		470
#define OBJ_documentVersion		OBJ_pilotAttributeType,13L

#define LN_documentAuthor		"documentAuthor"
#define NID_documentAuthor		471
#define OBJ_documentAuthor		OBJ_pilotAttributeType,14L

#define LN_documentLocation		"documentLocation"
#define NID_documentLocation		472
#define OBJ_documentLocation		OBJ_pilotAttributeType,15L

#define LN_homeTelephoneNumber		"homeTelephoneNumber"
#define NID_homeTelephoneNumber		473
#define OBJ_homeTelephoneNumber		OBJ_pilotAttributeType,20L

#define SN_secretary		"secretary"
#define NID_secretary		474
#define OBJ_secretary		OBJ_pilotAttributeType,21L

#define LN_otherMailbox		"otherMailbox"
#define NID_otherMailbox		475
#define OBJ_otherMailbox		OBJ_pilotAttributeType,22L

#define LN_lastModifiedTime		"lastModifiedTime"
#define NID_lastModifiedTime		476
#define OBJ_lastModifiedTime		OBJ_pilotAttributeType,23L

#define LN_lastModifiedBy		"lastModifiedBy"
#define NID_lastModifiedBy		477
#define OBJ_lastModifiedBy		OBJ_pilotAttributeType,24L

#define SN_domainComponent		"DC"
#define LN_domainComponent		"domainComponent"
#define NID_domainComponent		391
#define OBJ_domainComponent		OBJ_pilotAttributeType,25L

#define LN_aRecord		"aRecord"
#define NID_aRecord		478
#define OBJ_aRecord		OBJ_pilotAttributeType,26L

#define LN_pilotAttributeType27		"pilotAttributeType27"
#define NID_pilotAttributeType27		479
#define OBJ_pilotAttributeType27		OBJ_pilotAttributeType,27L

#define LN_mXRecord		"mXRecord"
#define NID_mXRecord		480
#define OBJ_mXRecord		OBJ_pilotAttributeType,28L

#define LN_nSRecord		"nSRecord"
#define NID_nSRecord		481
#define OBJ_nSRecord		OBJ_pilotAttributeType,29L

#define LN_sOARecord		"sOARecord"
#define NID_sOARecord		482
#define OBJ_sOARecord		OBJ_pilotAttributeType,30L

#define LN_cNAMERecord		"cNAMERecord"
#define NID_cNAMERecord		483
#define OBJ_cNAMERecord		OBJ_pilotAttributeType,31L

#define LN_associatedDomain		"associatedDomain"
#define NID_associatedDomain		484
#define OBJ_associatedDomain		OBJ_pilotAttributeType,37L

#define LN_associatedName		"associatedName"
#define NID_associatedName		485
#define OBJ_associatedName		OBJ_pilotAttributeType,38L

#define LN_homePostalAddress		"homePostalAddress"
#define NID_homePostalAddress		486
#define OBJ_homePostalAddress		OBJ_pilotAttributeType,39L

#define LN_personalTitle		"personalTitle"
#define NID_personalTitle		487
#define OBJ_personalTitle		OBJ_pilotAttributeType,40L

#define LN_mobileTelephoneNumber		"mobileTelephoneNumber"
#define NID_mobileTelephoneNumber		488
#define OBJ_mobileTelephoneNumber		OBJ_pilotAttributeType,41L

#define LN_pagerTelephoneNumber		"pagerTelephoneNumber"
#define NID_pagerTelephoneNumber		489
#define OBJ_pagerTelephoneNumber		OBJ_pilotAttributeType,42L

#define LN_friendlyCountryName		"friendlyCountryName"
#define NID_friendlyCountryName		490
#define OBJ_friendlyCountryName		OBJ_pilotAttributeType,43L

#define LN_organizationalStatus		"organizationalStatus"
#define NID_organizationalStatus		491
#define OBJ_organizationalStatus		OBJ_pilotAttributeType,45L

#define LN_janetMailbox		"janetMailbox"
#define NID_janetMailbox		492
#define OBJ_janetMailbox		OBJ_pilotAttributeType,46L

#define LN_mailPreferenceOption		"mailPreferenceOption"
#define NID_mailPreferenceOption		493
#define OBJ_mailPreferenceOption		OBJ_pilotAttributeType,47L

#define LN_buildingName		"buildingName"
#define NID_buildingName		494
#define OBJ_buildingName		OBJ_pilotAttributeType,48L

#define LN_dSAQuality		"dSAQuality"
#define NID_dSAQuality		495
#define OBJ_dSAQuality		OBJ_pilotAttributeType,49L

#define LN_singleLevelQuality		"singleLevelQuality"
#define NID_singleLevelQuality		496
#define OBJ_singleLevelQuality		OBJ_pilotAttributeType,50L

#define LN_subtreeMinimumQuality		"subtreeMinimumQuality"
#define NID_subtreeMinimumQuality		497
#define OBJ_subtreeMinimumQuality		OBJ_pilotAttributeType,51L

#define LN_subtreeMaximumQuality		"subtreeMaximumQuality"
#define NID_subtreeMaximumQuality		498
#define OBJ_subtreeMaximumQuality		OBJ_pilotAttributeType,52L

#define LN_personalSignature		"personalSignature"
#define NID_personalSignature		499
#define OBJ_personalSignature		OBJ_pilotAttributeType,53L

#define LN_dITRedirect		"dITRedirect"
#define NID_dITRedirect		500
#define OBJ_dITRedirect		OBJ_pilotAttributeType,54L

#define SN_audio		"audio"
#define NID_audio		501
#define OBJ_audio		OBJ_pilotAttributeType,55L

#define LN_documentPublisher		"documentPublisher"
#define NID_documentPublisher		502
#define OBJ_documentPublisher		OBJ_pilotAttributeType,56L

#define SN_id_set		"id-set"
#define LN_id_set		"Secure Electronic Transactions"
#define NID_id_set		512
#define OBJ_id_set		OBJ_international_organizations,42L

#define SN_set_ctype		"set-ctype"
#define LN_set_ctype		"content types"
#define NID_set_ctype		513
#define OBJ_set_ctype		OBJ_id_set,0L

#define SN_set_msgExt		"set-msgExt"
#define LN_set_msgExt		"message extensions"
#define NID_set_msgExt		514
#define OBJ_set_msgExt		OBJ_id_set,1L

#define SN_set_attr		"set-attr"
#define NID_set_attr		515
#define OBJ_set_attr		OBJ_id_set,3L

#define SN_set_policy		"set-policy"
#define NID_set_policy		516
#define OBJ_set_policy		OBJ_id_set,5L

#define SN_set_certExt		"set-certExt"
#define LN_set_certExt		"certificate extensions"
#define NID_set_certExt		517
#define OBJ_set_certExt		OBJ_id_set,7L

#define SN_set_brand		"set-brand"
#define NID_set_brand		518
#define OBJ_set_brand		OBJ_id_set,8L

#define SN_setct_PANData		"setct-PANData"
#define NID_setct_PANData		519
#define OBJ_setct_PANData		OBJ_set_ctype,0L

#define SN_setct_PANToken		"setct-PANToken"
#define NID_setct_PANToken		520
#define OBJ_setct_PANToken		OBJ_set_ctype,1L

#define SN_setct_PANOnly		"setct-PANOnly"
#define NID_setct_PANOnly		521
#define OBJ_setct_PANOnly		OBJ_set_ctype,2L

#define SN_setct_OIData		"setct-OIData"
#define NID_setct_OIData		522
#define OBJ_setct_OIData		OBJ_set_ctype,3L

#define SN_setct_PI		"setct-PI"
#define NID_setct_PI		523
#define OBJ_setct_PI		OBJ_set_ctype,4L

#define SN_setct_PIData		"setct-PIData"
#define NID_setct_PIData		524
#define OBJ_setct_PIData		OBJ_set_ctype,5L

#define SN_setct_PIDataUnsigned		"setct-PIDataUnsigned"
#define NID_setct_PIDataUnsigned		525
#define OBJ_setct_PIDataUnsigned		OBJ_set_ctype,6L

#define SN_setct_HODInput		"setct-HODInput"
#define NID_setct_HODInput		526
#define OBJ_setct_HODInput		OBJ_set_ctype,7L

#define SN_setct_AuthResBaggage		"setct-AuthResBaggage"
#define NID_setct_AuthResBaggage		527
#define OBJ_setct_AuthResBaggage		OBJ_set_ctype,8L

#define SN_setct_AuthRevReqBaggage		"setct-AuthRevReqBaggage"
#define NID_setct_AuthRevReqBaggage		528
#define OBJ_setct_AuthRevReqBaggage		OBJ_set_ctype,9L

#define SN_setct_AuthRevResBaggage		"setct-AuthRevResBaggage"
#define NID_setct_AuthRevResBaggage		529
#define OBJ_setct_AuthRevResBaggage		OBJ_set_ctype,10L

#define SN_setct_CapTokenSeq		"setct-CapTokenSeq"
#define NID_setct_CapTokenSeq		530
#define OBJ_setct_CapTokenSeq		OBJ_set_ctype,11L

#define SN_setct_PInitResData		"setct-PInitResData"
#define NID_setct_PInitResData		531
#define OBJ_setct_PInitResData		OBJ_set_ctype,12L

#define SN_setct_PI_TBS		"setct-PI-TBS"
#define NID_setct_PI_TBS		532
#define OBJ_setct_PI_TBS		OBJ_set_ctype,13L

#define SN_setct_PResData		"setct-PResData"
#define NID_setct_PResData		533
#define OBJ_setct_PResData		OBJ_set_ctype,14L

#define SN_setct_AuthReqTBS		"setct-AuthReqTBS"
#define NID_setct_AuthReqTBS		534
#define OBJ_setct_AuthReqTBS		OBJ_set_ctype,16L

#define SN_setct_AuthResTBS		"setct-AuthResTBS"
#define NID_setct_AuthResTBS		535
#define OBJ_setct_AuthResTBS		OBJ_set_ctype,17L

#define SN_setct_AuthResTBSX		"setct-AuthResTBSX"
#define NID_setct_AuthResTBSX		536
#define OBJ_setct_AuthResTBSX		OBJ_set_ctype,18L

#define SN_setct_AuthTokenTBS		"setct-AuthTokenTBS"
#define NID_setct_AuthTokenTBS		537
#define OBJ_setct_AuthTokenTBS		OBJ_set_ctype,19L

#define SN_setct_CapTokenData		"setct-CapTokenData"
#define NID_setct_CapTokenData		538
#define OBJ_setct_CapTokenData		OBJ_set_ctype,20L

#define SN_setct_CapTokenTBS		"setct-CapTokenTBS"
#define NID_setct_CapTokenTBS		539
#define OBJ_setct_CapTokenTBS		OBJ_set_ctype,21L

#define SN_setct_AcqCardCodeMsg		"setct-AcqCardCodeMsg"
#define NID_setct_AcqCardCodeMsg		540
#define OBJ_setct_AcqCardCodeMsg		OBJ_set_ctype,22L

#define SN_setct_AuthRevReqTBS		"setct-AuthRevReqTBS"
#define NID_setct_AuthRevReqTBS		541
#define OBJ_setct_AuthRevReqTBS		OBJ_set_ctype,23L

#define SN_setct_AuthRevResData		"setct-AuthRevResData"
#define NID_setct_AuthRevResData		542
#define OBJ_setct_AuthRevResData		OBJ_set_ctype,24L

#define SN_setct_AuthRevResTBS		"setct-AuthRevResTBS"
#define NID_setct_AuthRevResTBS		543
#define OBJ_setct_AuthRevResTBS		OBJ_set_ctype,25L

#define SN_setct_CapReqTBS		"setct-CapReqTBS"
#define NID_setct_CapReqTBS		544
#define OBJ_setct_CapReqTBS		OBJ_set_ctype,26L

#define SN_setct_CapReqTBSX		"setct-CapReqTBSX"
#define NID_setct_CapReqTBSX		545
#define OBJ_setct_CapReqTBSX		OBJ_set_ctype,27L

#define SN_setct_CapResData		"setct-CapResData"
#define NID_setct_CapResData		546
#define OBJ_setct_CapResData		OBJ_set_ctype,28L

#define SN_setct_CapRevReqTBS		"setct-CapRevReqTBS"
#define NID_setct_CapRevReqTBS		547
#define OBJ_setct_CapRevReqTBS		OBJ_set_ctype,29L

#define SN_setct_CapRevReqTBSX		"setct-CapRevReqTBSX"
#define NID_setct_CapRevReqTBSX		548
#define OBJ_setct_CapRevReqTBSX		OBJ_set_ctype,30L

#define SN_setct_CapRevResData		"setct-CapRevResData"
#define NID_setct_CapRevResData		549
#define OBJ_setct_CapRevResData		OBJ_set_ctype,31L

#define SN_setct_CredReqTBS		"setct-CredReqTBS"
#define NID_setct_CredReqTBS		550
#define OBJ_setct_CredReqTBS		OBJ_set_ctype,32L

#define SN_setct_CredReqTBSX		"setct-CredReqTBSX"
#define NID_setct_CredReqTBSX		551
#define OBJ_setct_CredReqTBSX		OBJ_set_ctype,33L

#define SN_setct_CredResData		"setct-CredResData"
#define NID_setct_CredResData		552
#define OBJ_setct_CredResData		OBJ_set_ctype,34L

#define SN_setct_CredRevReqTBS		"setct-CredRevReqTBS"
#define NID_setct_CredRevReqTBS		553
#define OBJ_setct_CredRevReqTBS		OBJ_set_ctype,35L

#define SN_setct_CredRevReqTBSX		"setct-CredRevReqTBSX"
#define NID_setct_CredRevReqTBSX		554
#define OBJ_setct_CredRevReqTBSX		OBJ_set_ctype,36L

#define SN_setct_CredRevResData		"setct-CredRevResData"
#define NID_setct_CredRevResData		555
#define OBJ_setct_CredRevResData		OBJ_set_ctype,37L

#define SN_setct_PCertReqData		"setct-PCertReqData"
#define NID_setct_PCertReqData		556
#define OBJ_setct_PCertReqData		OBJ_set_ctype,38L

#define SN_setct_PCertResTBS		"setct-PCertResTBS"
#define NID_setct_PCertResTBS		557
#define OBJ_setct_PCertResTBS		OBJ_set_ctype,39L

#define SN_setct_BatchAdminReqData		"setct-BatchAdminReqData"
#define NID_setct_BatchAdminReqData		558
#define OBJ_setct_BatchAdminReqData		OBJ_set_ctype,40L

#define SN_setct_BatchAdminResData		"setct-BatchAdminResData"
#define NID_setct_BatchAdminResData		559
#define OBJ_setct_BatchAdminResData		OBJ_set_ctype,41L

#define SN_setct_CardCInitResTBS		"setct-CardCInitResTBS"
#define NID_setct_CardCInitResTBS		560
#define OBJ_setct_CardCInitResTBS		OBJ_set_ctype,42L

#define SN_setct_MeAqCInitResTBS		"setct-MeAqCInitResTBS"
#define NID_setct_MeAqCInitResTBS		561
#define OBJ_setct_MeAqCInitResTBS		OBJ_set_ctype,43L

#define SN_setct_RegFormResTBS		"setct-RegFormResTBS"
#define NID_setct_RegFormResTBS		562
#define OBJ_setct_RegFormResTBS		OBJ_set_ctype,44L

#define SN_setct_CertReqData		"setct-CertReqData"
#define NID_setct_CertReqData		563
#define OBJ_setct_CertReqData		OBJ_set_ctype,45L

#define SN_setct_CertReqTBS		"setct-CertReqTBS"
#define NID_setct_CertReqTBS		564
#define OBJ_setct_CertReqTBS		OBJ_set_ctype,46L

#define SN_setct_CertResData		"setct-CertResData"
#define NID_setct_CertResData		565
#define OBJ_setct_CertResData		OBJ_set_ctype,47L

#define SN_setct_CertInqReqTBS		"setct-CertInqReqTBS"
#define NID_setct_CertInqReqTBS		566
#define OBJ_setct_CertInqReqTBS		OBJ_set_ctype,48L

#define SN_setct_ErrorTBS		"setct-ErrorTBS"
#define NID_setct_ErrorTBS		567
#define OBJ_setct_ErrorTBS		OBJ_set_ctype,49L

#define SN_setct_PIDualSignedTBE		"setct-PIDualSignedTBE"
#define NID_setct_PIDualSignedTBE		568
#define OBJ_setct_PIDualSignedTBE		OBJ_set_ctype,50L

#define SN_setct_PIUnsignedTBE		"setct-PIUnsignedTBE"
#define NID_setct_PIUnsignedTBE		569
#define OBJ_setct_PIUnsignedTBE		OBJ_set_ctype,51L

#define SN_setct_AuthReqTBE		"setct-AuthReqTBE"
#define NID_setct_AuthReqTBE		570
#define OBJ_setct_AuthReqTBE		OBJ_set_ctype,52L

#define SN_setct_AuthResTBE		"setct-AuthResTBE"
#define NID_setct_AuthResTBE		571
#define OBJ_setct_AuthResTBE		OBJ_set_ctype,53L

#define SN_setct_AuthResTBEX		"setct-AuthResTBEX"
#define NID_setct_AuthResTBEX		572
#define OBJ_setct_AuthResTBEX		OBJ_set_ctype,54L

#define SN_setct_AuthTokenTBE		"setct-AuthTokenTBE"
#define NID_setct_AuthTokenTBE		573
#define OBJ_setct_AuthTokenTBE		OBJ_set_ctype,55L

#define SN_setct_CapTokenTBE		"setct-CapTokenTBE"
#define NID_setct_CapTokenTBE		574
#define OBJ_setct_CapTokenTBE		OBJ_set_ctype,56L

#define SN_setct_CapTokenTBEX		"setct-CapTokenTBEX"
#define NID_setct_CapTokenTBEX		575
#define OBJ_setct_CapTokenTBEX		OBJ_set_ctype,57L

#define SN_setct_AcqCardCodeMsgTBE		"setct-AcqCardCodeMsgTBE"
#define NID_setct_AcqCardCodeMsgTBE		576
#define OBJ_setct_AcqCardCodeMsgTBE		OBJ_set_ctype,58L

#define SN_setct_AuthRevReqTBE		"setct-AuthRevReqTBE"
#define NID_setct_AuthRevReqTBE		577
#define OBJ_setct_AuthRevReqTBE		OBJ_set_ctype,59L

#define SN_setct_AuthRevResTBE		"setct-AuthRevResTBE"
#define NID_setct_AuthRevResTBE		578
#define OBJ_setct_AuthRevResTBE		OBJ_set_ctype,60L

#define SN_setct_AuthRevResTBEB		"setct-AuthRevResTBEB"
#define NID_setct_AuthRevResTBEB		579
#define OBJ_setct_AuthRevResTBEB		OBJ_set_ctype,61L

#define SN_setct_CapReqTBE		"setct-CapReqTBE"
#define NID_setct_CapReqTBE		580
#define OBJ_setct_CapReqTBE		OBJ_set_ctype,62L

#define SN_setct_CapReqTBEX		"setct-CapReqTBEX"
#define NID_setct_CapReqTBEX		581
#define OBJ_setct_CapReqTBEX		OBJ_set_ctype,63L

#define SN_setct_CapResTBE		"setct-CapResTBE"
#define NID_setct_CapResTBE		582
#define OBJ_setct_CapResTBE		OBJ_set_ctype,64L

#define SN_setct_CapRevReqTBE		"setct-CapRevReqTBE"
#define NID_setct_CapRevReqTBE		583
#define OBJ_setct_CapRevReqTBE		OBJ_set_ctype,65L

#define SN_setct_CapRevReqTBEX		"setct-CapRevReqTBEX"
#define NID_setct_CapRevReqTBEX		584
#define OBJ_setct_CapRevReqTBEX		OBJ_set_ctype,66L

#define SN_setct_CapRevResTBE		"setct-CapRevResTBE"
#define NID_setct_CapRevResTBE		585
#define OBJ_setct_CapRevResTBE		OBJ_set_ctype,67L

#define SN_setct_CredReqTBE		"setct-CredReqTBE"
#define NID_setct_CredReqTBE		586
#define OBJ_setct_CredReqTBE		OBJ_set_ctype,68L

#define SN_setct_CredReqTBEX		"setct-CredReqTBEX"
#define NID_setct_CredReqTBEX		587
#define OBJ_setct_CredReqTBEX		OBJ_set_ctype,69L

#define SN_setct_CredResTBE		"setct-CredResTBE"
#define NID_setct_CredResTBE		588
#define OBJ_setct_CredResTBE		OBJ_set_ctype,70L

#define SN_setct_CredRevReqTBE		"setct-CredRevReqTBE"
#define NID_setct_CredRevReqTBE		589
#define OBJ_setct_CredRevReqTBE		OBJ_set_ctype,71L

#define SN_setct_CredRevReqTBEX		"setct-CredRevReqTBEX"
#define NID_setct_CredRevReqTBEX		590
#define OBJ_setct_CredRevReqTBEX		OBJ_set_ctype,72L

#define SN_setct_CredRevResTBE		"setct-CredRevResTBE"
#define NID_setct_CredRevResTBE		591
#define OBJ_setct_CredRevResTBE		OBJ_set_ctype,73L

#define SN_setct_BatchAdminReqTBE		"setct-BatchAdminReqTBE"
#define NID_setct_BatchAdminReqTBE		592
#define OBJ_setct_BatchAdminReqTBE		OBJ_set_ctype,74L

#define SN_setct_BatchAdminResTBE		"setct-BatchAdminResTBE"
#define NID_setct_BatchAdminResTBE		593
#define OBJ_setct_BatchAdminResTBE		OBJ_set_ctype,75L

#define SN_setct_RegFormReqTBE		"setct-RegFormReqTBE"
#define NID_setct_RegFormReqTBE		594
#define OBJ_setct_RegFormReqTBE		OBJ_set_ctype,76L

#define SN_setct_CertReqTBE		"setct-CertReqTBE"
#define NID_setct_CertReqTBE		595
#define OBJ_setct_CertReqTBE		OBJ_set_ctype,77L

#define SN_setct_CertReqTBEX		"setct-CertReqTBEX"
#define NID_setct_CertReqTBEX		596
#define OBJ_setct_CertReqTBEX		OBJ_set_ctype,78L

#define SN_setct_CertResTBE		"setct-CertResTBE"
#define NID_setct_CertResTBE		597
#define OBJ_setct_CertResTBE		OBJ_set_ctype,79L

#define SN_setct_CRLNotificationTBS		"setct-CRLNotificationTBS"
#define NID_setct_CRLNotificationTBS		598
#define OBJ_setct_CRLNotificationTBS		OBJ_set_ctype,80L

#define SN_setct_CRLNotificationResTBS		"setct-CRLNotificationResTBS"
#define NID_setct_CRLNotificationResTBS		599
#define OBJ_setct_CRLNotificationResTBS		OBJ_set_ctype,81L

#define SN_setct_BCIDistributionTBS		"setct-BCIDistributionTBS"
#define NID_setct_BCIDistributionTBS		600
#define OBJ_setct_BCIDistributionTBS		OBJ_set_ctype,82L

#define SN_setext_genCrypt		"setext-genCrypt"
#define LN_setext_genCrypt		"generic cryptogram"
#define NID_setext_genCrypt		601
#define OBJ_setext_genCrypt		OBJ_set_msgExt,1L

#define SN_setext_miAuth		"setext-miAuth"
#define LN_setext_miAuth		"merchant initiated auth"
#define NID_setext_miAuth		602
#define OBJ_setext_miAuth		OBJ_set_msgExt,3L

#define SN_setext_pinSecure		"setext-pinSecure"
#define NID_setext_pinSecure		603
#define OBJ_setext_pinSecure		OBJ_set_msgExt,4L

#define SN_setext_pinAny		"setext-pinAny"
#define NID_setext_pinAny		604
#define OBJ_setext_pinAny		OBJ_set_msgExt,5L

#define SN_setext_track2		"setext-track2"
#define NID_setext_track2		605
#define OBJ_setext_track2		OBJ_set_msgExt,7L

#define SN_setext_cv		"setext-cv"
#define LN_setext_cv		"additional verification"
#define NID_setext_cv		606
#define OBJ_setext_cv		OBJ_set_msgExt,8L

#define SN_set_policy_root		"set-policy-root"
#define NID_set_policy_root		607
#define OBJ_set_policy_root		OBJ_set_policy,0L

#define SN_setCext_hashedRoot		"setCext-hashedRoot"
#define NID_setCext_hashedRoot		608
#define OBJ_setCext_hashedRoot		OBJ_set_certExt,0L

#define SN_setCext_certType		"setCext-certType"
#define NID_setCext_certType		609
#define OBJ_setCext_certType		OBJ_set_certExt,1L

#define SN_setCext_merchData		"setCext-merchData"
#define NID_setCext_merchData		610
#define OBJ_setCext_merchData		OBJ_set_certExt,2L

#define SN_setCext_cCertRequired		"setCext-cCertRequired"
#define NID_setCext_cCertRequired		611
#define OBJ_setCext_cCertRequired		OBJ_set_certExt,3L

#define SN_setCext_tunneling		"setCext-tunneling"
#define NID_setCext_tunneling		612
#define OBJ_setCext_tunneling		OBJ_set_certExt,4L

#define SN_setCext_setExt		"setCext-setExt"
#define NID_setCext_setExt		613
#define OBJ_setCext_setExt		OBJ_set_certExt,5L

#define SN_setCext_setQualf		"setCext-setQualf"
#define NID_setCext_setQualf		614
#define OBJ_setCext_setQualf		OBJ_set_certExt,6L

#define SN_setCext_PGWYcapabilities		"setCext-PGWYcapabilities"
#define NID_setCext_PGWYcapabilities		615
#define OBJ_setCext_PGWYcapabilities		OBJ_set_certExt,7L

#define SN_setCext_TokenIdentifier		"setCext-TokenIdentifier"
#define NID_setCext_TokenIdentifier		616
#define OBJ_setCext_TokenIdentifier		OBJ_set_certExt,8L

#define SN_setCext_Track2Data		"setCext-Track2Data"
#define NID_setCext_Track2Data		617
#define OBJ_setCext_Track2Data		OBJ_set_certExt,9L

#define SN_setCext_TokenType		"setCext-TokenType"
#define NID_setCext_TokenType		618
#define OBJ_setCext_TokenType		OBJ_set_certExt,10L

#define SN_setCext_IssuerCapabilities		"setCext-IssuerCapabilities"
#define NID_setCext_IssuerCapabilities		619
#define OBJ_setCext_IssuerCapabilities		OBJ_set_certExt,11L

#define SN_setAttr_Cert		"setAttr-Cert"
#define NID_setAttr_Cert		620
#define OBJ_setAttr_Cert		OBJ_set_attr,0L

#define SN_setAttr_PGWYcap		"setAttr-PGWYcap"
#define LN_setAttr_PGWYcap		"payment gateway capabilities"
#define NID_setAttr_PGWYcap		621
#define OBJ_setAttr_PGWYcap		OBJ_set_attr,1L

#define SN_setAttr_TokenType		"setAttr-TokenType"
#define NID_setAttr_TokenType		622
#define OBJ_setAttr_TokenType		OBJ_set_attr,2L

#define SN_setAttr_IssCap		"setAttr-IssCap"
#define LN_setAttr_IssCap		"issuer capabilities"
#define NID_setAttr_IssCap		623
#define OBJ_setAttr_IssCap		OBJ_set_attr,3L

#define SN_set_rootKeyThumb		"set-rootKeyThumb"
#define NID_set_rootKeyThumb		624
#define OBJ_set_rootKeyThumb		OBJ_setAttr_Cert,0L

#define SN_set_addPolicy		"set-addPolicy"
#define NID_set_addPolicy		625
#define OBJ_set_addPolicy		OBJ_setAttr_Cert,1L

#define SN_setAttr_Token_EMV		"setAttr-Token-EMV"
#define NID_setAttr_Token_EMV		626
#define OBJ_setAttr_Token_EMV		OBJ_setAttr_TokenType,1L

#define SN_setAttr_Token_B0Prime		"setAttr-Token-B0Prime"
#define NID_setAttr_Token_B0Prime		627
#define OBJ_setAttr_Token_B0Prime		OBJ_setAttr_TokenType,2L

#define SN_setAttr_IssCap_CVM		"setAttr-IssCap-CVM"
#define NID_setAttr_IssCap_CVM		628
#define OBJ_setAttr_IssCap_CVM		OBJ_setAttr_IssCap,3L

#define SN_setAttr_IssCap_T2		"setAttr-IssCap-T2"
#define NID_setAttr_IssCap_T2		629
#define OBJ_setAttr_IssCap_T2		OBJ_setAttr_IssCap,4L

#define SN_setAttr_IssCap_Sig		"setAttr-IssCap-Sig"
#define NID_setAttr_IssCap_Sig		630
#define OBJ_setAttr_IssCap_Sig		OBJ_setAttr_IssCap,5L

#define SN_setAttr_GenCryptgrm		"setAttr-GenCryptgrm"
#define LN_setAttr_GenCryptgrm		"generate cryptogram"
#define NID_setAttr_GenCryptgrm		631
#define OBJ_setAttr_GenCryptgrm		OBJ_setAttr_IssCap_CVM,1L

#define SN_setAttr_T2Enc		"setAttr-T2Enc"
#define LN_setAttr_T2Enc		"encrypted track 2"
#define NID_setAttr_T2Enc		632
#define OBJ_setAttr_T2Enc		OBJ_setAttr_IssCap_T2,1L

#define SN_setAttr_T2cleartxt		"setAttr-T2cleartxt"
#define LN_setAttr_T2cleartxt		"cleartext track 2"
#define NID_setAttr_T2cleartxt		633
#define OBJ_setAttr_T2cleartxt		OBJ_setAttr_IssCap_T2,2L

#define SN_setAttr_TokICCsig		"setAttr-TokICCsig"
#define LN_setAttr_TokICCsig		"ICC or token signature"
#define NID_setAttr_TokICCsig		634
#define OBJ_setAttr_TokICCsig		OBJ_setAttr_IssCap_Sig,1L

#define SN_setAttr_SecDevSig		"setAttr-SecDevSig"
#define LN_setAttr_SecDevSig		"secure device signature"
#define NID_setAttr_SecDevSig		635
#define OBJ_setAttr_SecDevSig		OBJ_setAttr_IssCap_Sig,2L

#define SN_set_brand_IATA_ATA		"set-brand-IATA-ATA"
#define NID_set_brand_IATA_ATA		636
#define OBJ_set_brand_IATA_ATA		OBJ_set_brand,1L

#define SN_set_brand_Diners		"set-brand-Diners"
#define NID_set_brand_Diners		637
#define OBJ_set_brand_Diners		OBJ_set_brand,30L

#define SN_set_brand_AmericanExpress		"set-brand-AmericanExpress"
#define NID_set_brand_AmericanExpress		638
#define OBJ_set_brand_AmericanExpress		OBJ_set_brand,34L

#define SN_set_brand_JCB		"set-brand-JCB"
#define NID_set_brand_JCB		639
#define OBJ_set_brand_JCB		OBJ_set_brand,35L

#define SN_set_brand_Visa		"set-brand-Visa"
#define NID_set_brand_Visa		640
#define OBJ_set_brand_Visa		OBJ_set_brand,4L

#define SN_set_brand_MasterCard		"set-brand-MasterCard"
#define NID_set_brand_MasterCard		641
#define OBJ_set_brand_MasterCard		OBJ_set_brand,5L

#define SN_set_brand_Novus		"set-brand-Novus"
#define NID_set_brand_Novus		642
#define OBJ_set_brand_Novus		OBJ_set_brand,6011L

#define SN_des_cdmf		"DES-CDMF"
#define LN_des_cdmf		"des-cdmf"
#define NID_des_cdmf		643
#define OBJ_des_cdmf		OBJ_rsadsi,3L,10L

#define SN_rsaOAEPEncryptionSET		"rsaOAEPEncryptionSET"
#define NID_rsaOAEPEncryptionSET		644
#define OBJ_rsaOAEPEncryptionSET		OBJ_rsadsi,1L,1L,6L

#define SN_ipsec3		"Oakley-EC2N-3"
#define LN_ipsec3		"ipsec3"
#define NID_ipsec3		749

#define SN_ipsec4		"Oakley-EC2N-4"
#define LN_ipsec4		"ipsec4"
#define NID_ipsec4		750

#define SN_whirlpool		"whirlpool"
#define NID_whirlpool		804
#define OBJ_whirlpool		OBJ_iso,0L,10118L,3L,0L,55L

#define SN_cryptopro		"cryptopro"
#define NID_cryptopro		805
#define OBJ_cryptopro		OBJ_member_body,643L,2L,2L

#define SN_cryptocom		"cryptocom"
#define NID_cryptocom		806
#define OBJ_cryptocom		OBJ_member_body,643L,2L,9L

#define SN_id_GostR3411_94_with_GostR3410_2001		"id-GostR3411-94-with-GostR3410-2001"
#define LN_id_GostR3411_94_with_GostR3410_2001		"GOST R 34.11-94 with GOST R 34.10-2001"
#define NID_id_GostR3411_94_with_GostR3410_2001		807
#define OBJ_id_GostR3411_94_with_GostR3410_2001		OBJ_cryptopro,3L

#define SN_id_GostR3411_94_with_GostR3410_94		"id-GostR3411-94-with-GostR3410-94"
#define LN_id_GostR3411_94_with_GostR3410_94		"GOST R 34.11-94 with GOST R 34.10-94"
#define NID_id_GostR3411_94_with_GostR3410_94		808
#define OBJ_id_GostR3411_94_with_GostR3410_94		OBJ_cryptopro,4L

#define SN_id_GostR3411_94		"md_gost94"
#define LN_id_GostR3411_94		"GOST R 34.11-94"
#define NID_id_GostR3411_94		809
#define OBJ_id_GostR3411_94		OBJ_cryptopro,9L

#define SN_id_HMACGostR3411_94		"id-HMACGostR3411-94"
#define LN_id_HMACGostR3411_94		"HMAC GOST 34.11-94"
#define NID_id_HMACGostR3411_94		810
#define OBJ_id_HMACGostR3411_94		OBJ_cryptopro,10L

#define SN_id_GostR3410_2001		"gost2001"
#define LN_id_GostR3410_2001		"GOST R 34.10-2001"
#define NID_id_GostR3410_2001		811
#define OBJ_id_GostR3410_2001		OBJ_cryptopro,19L

#define SN_id_GostR3410_94		"gost94"
#define LN_id_GostR3410_94		"GOST R 34.10-94"
#define NID_id_GostR3410_94		812
#define OBJ_id_GostR3410_94		OBJ_cryptopro,20L

#define SN_id_Gost28147_89		"gost89"
#define LN_id_Gost28147_89		"GOST 28147-89"
#define NID_id_Gost28147_89		813
#define OBJ_id_Gost28147_89		OBJ_cryptopro,21L

#define SN_gost89_cnt		"gost89-cnt"
#define NID_gost89_cnt		814

#define SN_id_Gost28147_89_MAC		"gost-mac"
#define LN_id_Gost28147_89_MAC		"GOST 28147-89 MAC"
#define NID_id_Gost28147_89_MAC		815
#define OBJ_id_Gost28147_89_MAC		OBJ_cryptopro,22L

#define SN_id_GostR3411_94_prf		"prf-gostr3411-94"
#define LN_id_GostR3411_94_prf		"GOST R 34.11-94 PRF"
#define NID_id_GostR3411_94_prf		816
#define OBJ_id_GostR3411_94_prf		OBJ_cryptopro,23L

#define SN_id_GostR3410_2001DH		"id-GostR3410-2001DH"
#define LN_id_GostR3410_2001DH		"GOST R 34.10-2001 DH"
#define NID_id_GostR3410_2001DH		817
#define OBJ_id_GostR3410_2001DH		OBJ_cryptopro,98L

#define SN_id_GostR3410_94DH		"id-GostR3410-94DH"
#define LN_id_GostR3410_94DH		"GOST R 34.10-94 DH"
#define NID_id_GostR3410_94DH		818
#define OBJ_id_GostR3410_94DH		OBJ_cryptopro,99L

#define SN_id_Gost28147_89_CryptoPro_KeyMeshing		"id-Gost28147-89-CryptoPro-KeyMeshing"
#define NID_id_Gost28147_89_CryptoPro_KeyMeshing		819
#define OBJ_id_Gost28147_89_CryptoPro_KeyMeshing		OBJ_cryptopro,14L,1L

#define SN_id_Gost28147_89_None_KeyMeshing		"id-Gost28147-89-None-KeyMeshing"
#define NID_id_Gost28147_89_None_KeyMeshing		820
#define OBJ_id_Gost28147_89_None_KeyMeshing		OBJ_cryptopro,14L,0L

#define SN_id_GostR3411_94_TestParamSet		"id-GostR3411-94-TestParamSet"
#define NID_id_GostR3411_94_TestParamSet		821
#define OBJ_id_GostR3411_94_TestParamSet		OBJ_cryptopro,30L,0L

#define SN_id_GostR3411_94_CryptoProParamSet		"id-GostR3411-94-CryptoProParamSet"
#define NID_id_GostR3411_94_CryptoProParamSet		822
#define OBJ_id_GostR3411_94_CryptoProParamSet		OBJ_cryptopro,30L,1L

#define SN_id_Gost28147_89_TestParamSet		"id-Gost28147-89-TestParamSet"
#define NID_id_Gost28147_89_TestParamSet		823
#define OBJ_id_Gost28147_89_TestParamSet		OBJ_cryptopro,31L,0L

#define SN_id_Gost28147_89_CryptoPro_A_ParamSet		"id-Gost28147-89-CryptoPro-A-ParamSet"
#define NID_id_Gost28147_89_CryptoPro_A_ParamSet		824
#define OBJ_id_Gost28147_89_CryptoPro_A_ParamSet		OBJ_cryptopro,31L,1L

#define SN_id_Gost28147_89_CryptoPro_B_ParamSet		"id-Gost28147-89-CryptoPro-B-ParamSet"
#define NID_id_Gost28147_89_CryptoPro_B_ParamSet		825
#define OBJ_id_Gost28147_89_CryptoPro_B_ParamSet		OBJ_cryptopro,31L,2L

#define SN_id_Gost28147_89_CryptoPro_C_ParamSet		"id-Gost28147-89-CryptoPro-C-ParamSet"
#define NID_id_Gost28147_89_CryptoPro_C_ParamSet		826
#define OBJ_id_Gost28147_89_CryptoPro_C_ParamSet		OBJ_cryptopro,31L,3L

#define SN_id_Gost28147_89_CryptoPro_D_ParamSet		"id-Gost28147-89-CryptoPro-D-ParamSet"
#define NID_id_Gost28147_89_CryptoPro_D_ParamSet		827
#define OBJ_id_Gost28147_89_CryptoPro_D_ParamSet		OBJ_cryptopro,31L,4L

#define SN_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet		"id-Gost28147-89-CryptoPro-Oscar-1-1-ParamSet"
#define NID_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet		828
#define OBJ_id_Gost28147_89_CryptoPro_Oscar_1_1_ParamSet		OBJ_cryptopro,31L,5L

#define SN_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet		"id-Gost28147-89-CryptoPro-Oscar-1-0-ParamSet"
#define NID_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet		829
#define OBJ_id_Gost28147_89_CryptoPro_Oscar_1_0_ParamSet		OBJ_cryptopro,31L,6L

#define SN_id_Gost28147_89_CryptoPro_RIC_1_ParamSet		"id-Gost28147-89-CryptoPro-RIC-1-ParamSet"
#define NID_id_Gost28147_89_CryptoPro_RIC_1_ParamSet		830
#define OBJ_id_Gost28147_89_CryptoPro_RIC_1_ParamSet		OBJ_cryptopro,31L,7L

#define SN_id_GostR3410_94_TestParamSet		"id-GostR3410-94-TestParamSet"
#define NID_id_GostR3410_94_TestParamSet		831
#define OBJ_id_GostR3410_94_TestParamSet		OBJ_cryptopro,32L,0L

#define SN_id_GostR3410_94_CryptoPro_A_ParamSet		"id-GostR3410-94-CryptoPro-A-ParamSet"
#define NID_id_GostR3410_94_CryptoPro_A_ParamSet		832
#define OBJ_id_GostR3410_94_CryptoPro_A_ParamSet		OBJ_cryptopro,32L,2L

#define SN_id_GostR3410_94_CryptoPro_B_ParamSet		"id-GostR3410-94-CryptoPro-B-ParamSet"
#define NID_id_GostR3410_94_CryptoPro_B_ParamSet		833
#define OBJ_id_GostR3410_94_CryptoPro_B_ParamSet		OBJ_cryptopro,32L,3L

#define SN_id_GostR3410_94_CryptoPro_C_ParamSet		"id-GostR3410-94-CryptoPro-C-ParamSet"
#define NID_id_GostR3410_94_CryptoPro_C_ParamSet		834
#define OBJ_id_GostR3410_94_CryptoPro_C_ParamSet		OBJ_cryptopro,32L,4L

#define SN_id_GostR3410_94_CryptoPro_D_ParamSet		"id-GostR3410-94-CryptoPro-D-ParamSet"
#define NID_id_GostR3410_94_CryptoPro_D_ParamSet		835
#define OBJ_id_GostR3410_94_CryptoPro_D_ParamSet		OBJ_cryptopro,32L,5L

#define SN_id_GostR3410_94_CryptoPro_XchA_ParamSet		"id-GostR3410-94-CryptoPro-XchA-ParamSet"
#define NID_id_GostR3410_94_CryptoPro_XchA_ParamSet		836
#define OBJ_id_GostR3410_94_CryptoPro_XchA_ParamSet		OBJ_cryptopro,33L,1L

#define SN_id_GostR3410_94_CryptoPro_XchB_ParamSet		"id-GostR3410-94-CryptoPro-XchB-ParamSet"
#define NID_id_GostR3410_94_CryptoPro_XchB_ParamSet		837
#define OBJ_id_GostR3410_94_CryptoPro_XchB_ParamSet		OBJ_cryptopro,33L,2L

#define SN_id_GostR3410_94_CryptoPro_XchC_ParamSet		"id-GostR3410-94-CryptoPro-XchC-ParamSet"
#define NID_id_GostR3410_94_CryptoPro_XchC_ParamSet		838
#define OBJ_id_GostR3410_94_CryptoPro_XchC_ParamSet		OBJ_cryptopro,33L,3L

#define SN_id_GostR3410_2001_TestParamSet		"id-GostR3410-2001-TestParamSet"
#define NID_id_GostR3410_2001_TestParamSet		839
#define OBJ_id_GostR3410_2001_TestParamSet		OBJ_cryptopro,35L,0L

#define SN_id_GostR3410_2001_CryptoPro_A_ParamSet		"id-GostR3410-2001-CryptoPro-A-ParamSet"
#define NID_id_GostR3410_2001_CryptoPro_A_ParamSet		840
#define OBJ_id_GostR3410_2001_CryptoPro_A_ParamSet		OBJ_cryptopro,35L,1L

#define SN_id_GostR3410_2001_CryptoPro_B_ParamSet		"id-GostR3410-2001-CryptoPro-B-ParamSet"
#define NID_id_GostR3410_2001_CryptoPro_B_ParamSet		841
#define OBJ_id_GostR3410_2001_CryptoPro_B_ParamSet		OBJ_cryptopro,35L,2L

#define SN_id_GostR3410_2001_CryptoPro_C_ParamSet		"id-GostR3410-2001-CryptoPro-C-ParamSet"
#define NID_id_GostR3410_2001_CryptoPro_C_ParamSet		842
#define OBJ_id_GostR3410_2001_CryptoPro_C_ParamSet		OBJ_cryptopro,35L,3L

#define SN_id_GostR3410_2001_CryptoPro_XchA_ParamSet		"id-GostR3410-2001-CryptoPro-XchA-ParamSet"
#define NID_id_GostR3410_2001_CryptoPro_XchA_ParamSet		843
#define OBJ_id_GostR3410_2001_CryptoPro_XchA_ParamSet		OBJ_cryptopro,36L,0L

#define SN_id_GostR3410_2001_CryptoPro_XchB_ParamSet		"id-GostR3410-2001-CryptoPro-XchB-ParamSet"
#define NID_id_GostR3410_2001_CryptoPro_XchB_ParamSet		844
#define OBJ_id_GostR3410_2001_CryptoPro_XchB_ParamSet		OBJ_cryptopro,36L,1L

#define SN_id_GostR3410_94_a		"id-GostR3410-94-a"
#define NID_id_GostR3410_94_a		845
#define OBJ_id_GostR3410_94_a		OBJ_id_GostR3410_94,1L

#define SN_id_GostR3410_94_aBis		"id-GostR3410-94-aBis"
#define NID_id_GostR3410_94_aBis		846
#define OBJ_id_GostR3410_94_aBis		OBJ_id_GostR3410_94,2L

#define SN_id_GostR3410_94_b		"id-GostR3410-94-b"
#define NID_id_GostR3410_94_b		847
#define OBJ_id_GostR3410_94_b		OBJ_id_GostR3410_94,3L

#define SN_id_GostR3410_94_bBis		"id-GostR3410-94-bBis"
#define NID_id_GostR3410_94_bBis		848
#define OBJ_id_GostR3410_94_bBis		OBJ_id_GostR3410_94,4L

#define SN_id_Gost28147_89_cc		"id-Gost28147-89-cc"
#define LN_id_Gost28147_89_cc		"GOST 28147-89 Cryptocom ParamSet"
#define NID_id_Gost28147_89_cc		849
#define OBJ_id_Gost28147_89_cc		OBJ_cryptocom,1L,6L,1L

#define SN_id_GostR3410_94_cc		"gost94cc"
#define LN_id_GostR3410_94_cc		"GOST 34.10-94 Cryptocom"
#define NID_id_GostR3410_94_cc		850
#define OBJ_id_GostR3410_94_cc		OBJ_cryptocom,1L,5L,3L

#define SN_id_GostR3410_2001_cc		"gost2001cc"
#define LN_id_GostR3410_2001_cc		"GOST 34.10-2001 Cryptocom"
#define NID_id_GostR3410_2001_cc		851
#define OBJ_id_GostR3410_2001_cc		OBJ_cryptocom,1L,5L,4L

#define SN_id_GostR3411_94_with_GostR3410_94_cc		"id-GostR3411-94-with-GostR3410-94-cc"
#define LN_id_GostR3411_94_with_GostR3410_94_cc		"GOST R 34.11-94 with GOST R 34.10-94 Cryptocom"
#define NID_id_GostR3411_94_with_GostR3410_94_cc		852
#define OBJ_id_GostR3411_94_with_GostR3410_94_cc		OBJ_cryptocom,1L,3L,3L

#define SN_id_GostR3411_94_with_GostR3410_2001_cc		"id-GostR3411-94-with-GostR3410-2001-cc"
#define LN_id_GostR3411_94_with_GostR3410_2001_cc		"GOST R 34.11-94 with GOST R 34.10-2001 Cryptocom"
#define NID_id_GostR3411_94_with_GostR3410_2001_cc		853
#define OBJ_id_GostR3411_94_with_GostR3410_2001_cc		OBJ_cryptocom,1L,3L,4L

#define SN_id_GostR3410_2001_ParamSet_cc		"id-GostR3410-2001-ParamSet-cc"
#define LN_id_GostR3410_2001_ParamSet_cc		"GOST R 3410-2001 Parameter Set Cryptocom"
#define NID_id_GostR3410_2001_ParamSet_cc		854
#define OBJ_id_GostR3410_2001_ParamSet_cc		OBJ_cryptocom,1L,8L,1L

#define SN_camellia_128_cbc		"CAMELLIA-128-CBC"
#define LN_camellia_128_cbc		"camellia-128-cbc"
#define NID_camellia_128_cbc		751
#define OBJ_camellia_128_cbc		1L,2L,392L,200011L,61L,1L,1L,1L,2L

#define SN_camellia_192_cbc		"CAMELLIA-192-CBC"
#define LN_camellia_192_cbc		"camellia-192-cbc"
#define NID_camellia_192_cbc		752
#define OBJ_camellia_192_cbc		1L,2L,392L,200011L,61L,1L,1L,1L,3L

#define SN_camellia_256_cbc		"CAMELLIA-256-CBC"
#define LN_camellia_256_cbc		"camellia-256-cbc"
#define NID_camellia_256_cbc		753
#define OBJ_camellia_256_cbc		1L,2L,392L,200011L,61L,1L,1L,1L,4L

#define OBJ_ntt_ds		0L,3L,4401L,5L

#define OBJ_camellia		OBJ_ntt_ds,3L,1L,9L

#define SN_camellia_128_ecb		"CAMELLIA-128-ECB"
#define LN_camellia_128_ecb		"camellia-128-ecb"
#define NID_camellia_128_ecb		754
#define OBJ_camellia_128_ecb		OBJ_camellia,1L

#define SN_camellia_128_ofb128		"CAMELLIA-128-OFB"
#define LN_camellia_128_ofb128		"camellia-128-ofb"
#define NID_camellia_128_ofb128		766
#define OBJ_camellia_128_ofb128		OBJ_camellia,3L

#define SN_camellia_128_cfb128		"CAMELLIA-128-CFB"
#define LN_camellia_128_cfb128		"camellia-128-cfb"
#define NID_camellia_128_cfb128		757
#define OBJ_camellia_128_cfb128		OBJ_camellia,4L

#define SN_camellia_192_ecb		"CAMELLIA-192-ECB"
#define LN_camellia_192_ecb		"camellia-192-ecb"
#define NID_camellia_192_ecb		755
#define OBJ_camellia_192_ecb		OBJ_camellia,21L

#define SN_camellia_192_ofb128		"CAMELLIA-192-OFB"
#define LN_camellia_192_ofb128		"camellia-192-ofb"
#define NID_camellia_192_ofb128		767
#define OBJ_camellia_192_ofb128		OBJ_camellia,23L

#define SN_camellia_192_cfb128		"CAMELLIA-192-CFB"
#define LN_camellia_192_cfb128		"camellia-192-cfb"
#define NID_camellia_192_cfb128		758
#define OBJ_camellia_192_cfb128		OBJ_camellia,24L

#define SN_camellia_256_ecb		"CAMELLIA-256-ECB"
#define LN_camellia_256_ecb		"camellia-256-ecb"
#define NID_camellia_256_ecb		756
#define OBJ_camellia_256_ecb		OBJ_camellia,41L

#define SN_camellia_256_ofb128		"CAMELLIA-256-OFB"
#define LN_camellia_256_ofb128		"camellia-256-ofb"
#define NID_camellia_256_ofb128		768
#define OBJ_camellia_256_ofb128		OBJ_camellia,43L

#define SN_camellia_256_cfb128		"CAMELLIA-256-CFB"
#define LN_camellia_256_cfb128		"camellia-256-cfb"
#define NID_camellia_256_cfb128		759
#define OBJ_camellia_256_cfb128		OBJ_camellia,44L

#define SN_camellia_128_cfb1		"CAMELLIA-128-CFB1"
#define LN_camellia_128_cfb1		"camellia-128-cfb1"
#define NID_camellia_128_cfb1		760

#define SN_camellia_192_cfb1		"CAMELLIA-192-CFB1"
#define LN_camellia_192_cfb1		"camellia-192-cfb1"
#define NID_camellia_192_cfb1		761

#define SN_camellia_256_cfb1		"CAMELLIA-256-CFB1"
#define LN_camellia_256_cfb1		"camellia-256-cfb1"
#define NID_camellia_256_cfb1		762

#define SN_camellia_128_cfb8		"CAMELLIA-128-CFB8"
#define LN_camellia_128_cfb8		"camellia-128-cfb8"
#define NID_camellia_128_cfb8		763

#define SN_camellia_192_cfb8		"CAMELLIA-192-CFB8"
#define LN_camellia_192_cfb8		"camellia-192-cfb8"
#define NID_camellia_192_cfb8		764

#define SN_camellia_256_cfb8		"CAMELLIA-256-CFB8"
#define LN_camellia_256_cfb8		"camellia-256-cfb8"
#define NID_camellia_256_cfb8		765

#define SN_kisa		"KISA"
#define LN_kisa		"kisa"
#define NID_kisa		773
#define OBJ_kisa		OBJ_member_body,410L,200004L

#define SN_seed_ecb		"SEED-ECB"
#define LN_seed_ecb		"seed-ecb"
#define NID_seed_ecb		776
#define OBJ_seed_ecb		OBJ_kisa,1L,3L

#define SN_seed_cbc		"SEED-CBC"
#define LN_seed_cbc		"seed-cbc"
#define NID_seed_cbc		777
#define OBJ_seed_cbc		OBJ_kisa,1L,4L

#define SN_seed_cfb128		"SEED-CFB"
#define LN_seed_cfb128		"seed-cfb"
#define NID_seed_cfb128		779
#define OBJ_seed_cfb128		OBJ_kisa,1L,5L

#define SN_seed_ofb128		"SEED-OFB"
#define LN_seed_ofb128		"seed-ofb"
#define NID_seed_ofb128		778
#define OBJ_seed_ofb128		OBJ_kisa,1L,6L

#define SN_hmac		"HMAC"
#define LN_hmac		"hmac"
#define NID_hmac		855

xmail-1.27/win32ssl/include/openssl/ssl2.h0000755000175000017500000002473411341640430017666 0ustar  davidedavide/* ssl/ssl2.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_SSL2_H 
#define HEADER_SSL2_H 

#ifdef  __cplusplus
extern "C" {
#endif

/* Protocol Version Codes */
#define SSL2_VERSION		0x0002
#define SSL2_VERSION_MAJOR	0x00
#define SSL2_VERSION_MINOR	0x02
/* #define SSL2_CLIENT_VERSION	0x0002 */
/* #define SSL2_SERVER_VERSION	0x0002 */

/* Protocol Message Codes */
#define SSL2_MT_ERROR			0
#define SSL2_MT_CLIENT_HELLO		1
#define SSL2_MT_CLIENT_MASTER_KEY	2
#define SSL2_MT_CLIENT_FINISHED		3
#define SSL2_MT_SERVER_HELLO		4
#define SSL2_MT_SERVER_VERIFY		5
#define SSL2_MT_SERVER_FINISHED		6
#define SSL2_MT_REQUEST_CERTIFICATE	7
#define SSL2_MT_CLIENT_CERTIFICATE	8

/* Error Message Codes */
#define SSL2_PE_UNDEFINED_ERROR		0x0000
#define SSL2_PE_NO_CIPHER		0x0001
#define SSL2_PE_NO_CERTIFICATE		0x0002
#define SSL2_PE_BAD_CERTIFICATE		0x0004
#define SSL2_PE_UNSUPPORTED_CERTIFICATE_TYPE 0x0006

/* Cipher Kind Values */
#define SSL2_CK_NULL_WITH_MD5			0x02000000 /* v3 */
#define SSL2_CK_RC4_128_WITH_MD5		0x02010080
#define SSL2_CK_RC4_128_EXPORT40_WITH_MD5	0x02020080
#define SSL2_CK_RC2_128_CBC_WITH_MD5		0x02030080
#define SSL2_CK_RC2_128_CBC_EXPORT40_WITH_MD5	0x02040080
#define SSL2_CK_IDEA_128_CBC_WITH_MD5		0x02050080
#define SSL2_CK_DES_64_CBC_WITH_MD5		0x02060040
#define SSL2_CK_DES_64_CBC_WITH_SHA		0x02060140 /* v3 */
#define SSL2_CK_DES_192_EDE3_CBC_WITH_MD5	0x020700c0
#define SSL2_CK_DES_192_EDE3_CBC_WITH_SHA	0x020701c0 /* v3 */
#define SSL2_CK_RC4_64_WITH_MD5			0x02080080 /* MS hack */
 
#define SSL2_CK_DES_64_CFB64_WITH_MD5_1		0x02ff0800 /* SSLeay */
#define SSL2_CK_NULL				0x02ff0810 /* SSLeay */

#define SSL2_TXT_DES_64_CFB64_WITH_MD5_1	"DES-CFB-M1"
#define SSL2_TXT_NULL_WITH_MD5			"NULL-MD5"
#define SSL2_TXT_RC4_128_WITH_MD5		"RC4-MD5"
#define SSL2_TXT_RC4_128_EXPORT40_WITH_MD5	"EXP-RC4-MD5"
#define SSL2_TXT_RC2_128_CBC_WITH_MD5		"RC2-CBC-MD5"
#define SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5	"EXP-RC2-CBC-MD5"
#define SSL2_TXT_IDEA_128_CBC_WITH_MD5		"IDEA-CBC-MD5"
#define SSL2_TXT_DES_64_CBC_WITH_MD5		"DES-CBC-MD5"
#define SSL2_TXT_DES_64_CBC_WITH_SHA		"DES-CBC-SHA"
#define SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5	"DES-CBC3-MD5"
#define SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA	"DES-CBC3-SHA"
#define SSL2_TXT_RC4_64_WITH_MD5		"RC4-64-MD5"

#define SSL2_TXT_NULL				"NULL"

/* Flags for the SSL_CIPHER.algorithm2 field */
#define SSL2_CF_5_BYTE_ENC			0x01
#define SSL2_CF_8_BYTE_ENC			0x02

/* Certificate Type Codes */
#define SSL2_CT_X509_CERTIFICATE		0x01

/* Authentication Type Code */
#define SSL2_AT_MD5_WITH_RSA_ENCRYPTION		0x01

#define SSL2_MAX_SSL_SESSION_ID_LENGTH		32

/* Upper/Lower Bounds */
#define SSL2_MAX_MASTER_KEY_LENGTH_IN_BITS	256
#ifdef OPENSSL_SYS_MPE
#define SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER	29998u
#else
#define SSL2_MAX_RECORD_LENGTH_2_BYTE_HEADER	32767u  /* 2^15-1 */
#endif
#define SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER	16383 /* 2^14-1 */

#define SSL2_CHALLENGE_LENGTH	16
/*#define SSL2_CHALLENGE_LENGTH	32 */
#define SSL2_MIN_CHALLENGE_LENGTH	16
#define SSL2_MAX_CHALLENGE_LENGTH	32
#define SSL2_CONNECTION_ID_LENGTH	16
#define SSL2_MAX_CONNECTION_ID_LENGTH	16
#define SSL2_SSL_SESSION_ID_LENGTH	16
#define SSL2_MAX_CERT_CHALLENGE_LENGTH	32
#define SSL2_MIN_CERT_CHALLENGE_LENGTH	16
#define SSL2_MAX_KEY_MATERIAL_LENGTH	24

#ifndef HEADER_SSL_LOCL_H
#define  CERT		char
#endif

typedef struct ssl2_state_st
	{
	int three_byte_header;
	int clear_text;		/* clear text */
	int escape;		/* not used in SSLv2 */
	int ssl2_rollback;	/* used if SSLv23 rolled back to SSLv2 */

	/* non-blocking io info, used to make sure the same
	 * args were passwd */
	unsigned int wnum;	/* number of bytes sent so far */
	int wpend_tot;
	const unsigned char *wpend_buf;

	int wpend_off;	/* offset to data to write */
	int wpend_len; 	/* number of bytes passwd to write */
	int wpend_ret; 	/* number of bytes to return to caller */

	/* buffer raw data */
	int rbuf_left;
	int rbuf_offs;
	unsigned char *rbuf;
	unsigned char *wbuf;

	unsigned char *write_ptr;/* used to point to the start due to
				  * 2/3 byte header. */

	unsigned int padding;
	unsigned int rlength; /* passed to ssl2_enc */
	int ract_data_length; /* Set when things are encrypted. */
	unsigned int wlength; /* passed to ssl2_enc */
	int wact_data_length; /* Set when things are decrypted. */
	unsigned char *ract_data;
	unsigned char *wact_data;
	unsigned char *mac_data;

	unsigned char *read_key;
	unsigned char *write_key;

		/* Stuff specifically to do with this SSL session */
	unsigned int challenge_length;
	unsigned char challenge[SSL2_MAX_CHALLENGE_LENGTH];
	unsigned int conn_id_length;
	unsigned char conn_id[SSL2_MAX_CONNECTION_ID_LENGTH];
	unsigned int key_material_length;
	unsigned char key_material[SSL2_MAX_KEY_MATERIAL_LENGTH*2];

	unsigned long read_sequence;
	unsigned long write_sequence;

	struct	{
		unsigned int conn_id_length;
		unsigned int cert_type;	
		unsigned int cert_length;
		unsigned int csl; 
		unsigned int clear;
		unsigned int enc; 
		unsigned char ccl[SSL2_MAX_CERT_CHALLENGE_LENGTH];
		unsigned int cipher_spec_length;
		unsigned int session_id_length;
		unsigned int clen;
		unsigned int rlen;
		} tmp;
	} SSL2_STATE;

/* SSLv2 */
/* client */
#define SSL2_ST_SEND_CLIENT_HELLO_A		(0x10|SSL_ST_CONNECT)
#define SSL2_ST_SEND_CLIENT_HELLO_B		(0x11|SSL_ST_CONNECT)
#define SSL2_ST_GET_SERVER_HELLO_A		(0x20|SSL_ST_CONNECT)
#define SSL2_ST_GET_SERVER_HELLO_B		(0x21|SSL_ST_CONNECT)
#define SSL2_ST_SEND_CLIENT_MASTER_KEY_A	(0x30|SSL_ST_CONNECT)
#define SSL2_ST_SEND_CLIENT_MASTER_KEY_B	(0x31|SSL_ST_CONNECT)
#define SSL2_ST_SEND_CLIENT_FINISHED_A		(0x40|SSL_ST_CONNECT)
#define SSL2_ST_SEND_CLIENT_FINISHED_B		(0x41|SSL_ST_CONNECT)
#define SSL2_ST_SEND_CLIENT_CERTIFICATE_A	(0x50|SSL_ST_CONNECT)
#define SSL2_ST_SEND_CLIENT_CERTIFICATE_B	(0x51|SSL_ST_CONNECT)
#define SSL2_ST_SEND_CLIENT_CERTIFICATE_C	(0x52|SSL_ST_CONNECT)
#define SSL2_ST_SEND_CLIENT_CERTIFICATE_D	(0x53|SSL_ST_CONNECT)
#define SSL2_ST_GET_SERVER_VERIFY_A		(0x60|SSL_ST_CONNECT)
#define SSL2_ST_GET_SERVER_VERIFY_B		(0x61|SSL_ST_CONNECT)
#define SSL2_ST_GET_SERVER_FINISHED_A		(0x70|SSL_ST_CONNECT)
#define SSL2_ST_GET_SERVER_FINISHED_B		(0x71|SSL_ST_CONNECT)
#define SSL2_ST_CLIENT_START_ENCRYPTION		(0x80|SSL_ST_CONNECT)
#define SSL2_ST_X509_GET_CLIENT_CERTIFICATE	(0x90|SSL_ST_CONNECT)
/* server */
#define SSL2_ST_GET_CLIENT_HELLO_A		(0x10|SSL_ST_ACCEPT)
#define SSL2_ST_GET_CLIENT_HELLO_B		(0x11|SSL_ST_ACCEPT)
#define SSL2_ST_GET_CLIENT_HELLO_C		(0x12|SSL_ST_ACCEPT)
#define SSL2_ST_SEND_SERVER_HELLO_A		(0x20|SSL_ST_ACCEPT)
#define SSL2_ST_SEND_SERVER_HELLO_B		(0x21|SSL_ST_ACCEPT)
#define SSL2_ST_GET_CLIENT_MASTER_KEY_A		(0x30|SSL_ST_ACCEPT)
#define SSL2_ST_GET_CLIENT_MASTER_KEY_B		(0x31|SSL_ST_ACCEPT)
#define SSL2_ST_SEND_SERVER_VERIFY_A		(0x40|SSL_ST_ACCEPT)
#define SSL2_ST_SEND_SERVER_VERIFY_B		(0x41|SSL_ST_ACCEPT)
#define SSL2_ST_SEND_SERVER_VERIFY_C		(0x42|SSL_ST_ACCEPT)
#define SSL2_ST_GET_CLIENT_FINISHED_A		(0x50|SSL_ST_ACCEPT)
#define SSL2_ST_GET_CLIENT_FINISHED_B		(0x51|SSL_ST_ACCEPT)
#define SSL2_ST_SEND_SERVER_FINISHED_A		(0x60|SSL_ST_ACCEPT)
#define SSL2_ST_SEND_SERVER_FINISHED_B		(0x61|SSL_ST_ACCEPT)
#define SSL2_ST_SEND_REQUEST_CERTIFICATE_A	(0x70|SSL_ST_ACCEPT)
#define SSL2_ST_SEND_REQUEST_CERTIFICATE_B	(0x71|SSL_ST_ACCEPT)
#define SSL2_ST_SEND_REQUEST_CERTIFICATE_C	(0x72|SSL_ST_ACCEPT)
#define SSL2_ST_SEND_REQUEST_CERTIFICATE_D	(0x73|SSL_ST_ACCEPT)
#define SSL2_ST_SERVER_START_ENCRYPTION		(0x80|SSL_ST_ACCEPT)
#define SSL2_ST_X509_GET_SERVER_CERTIFICATE	(0x90|SSL_ST_ACCEPT)

#ifdef  __cplusplus
}
#endif
#endif

xmail-1.27/win32ssl/include/openssl/ssl.h0000755000175000017500000024454511341640430017610 0ustar  davidedavide/* ssl/ssl.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */
/* ====================================================================
 * Copyright (c) 1998-2001 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */
/* ====================================================================
 * Copyright (c) 1998-2006 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */
/* ====================================================================
 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
 * ECC cipher suite support in OpenSSL originally developed by 
 * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
 */

#ifndef HEADER_SSL_H 
#define HEADER_SSL_H 

#include 

#ifndef OPENSSL_NO_COMP
#include 
#endif
#ifndef OPENSSL_NO_BIO
#include 
#endif
#ifndef OPENSSL_NO_DEPRECATED
#ifndef OPENSSL_NO_X509
#include 
#endif
#include 
#include 
#include 
#endif
#include 
#include 

#include 
#include 
#include 

#ifdef  __cplusplus
extern "C" {
#endif

/* SSLeay version number for ASN.1 encoding of the session information */
/* Version 0 - initial version
 * Version 1 - added the optional peer certificate
 */
#define SSL_SESSION_ASN1_VERSION 0x0001

/* text strings for the ciphers */
#define SSL_TXT_NULL_WITH_MD5		SSL2_TXT_NULL_WITH_MD5			
#define SSL_TXT_RC4_128_WITH_MD5	SSL2_TXT_RC4_128_WITH_MD5		
#define SSL_TXT_RC4_128_EXPORT40_WITH_MD5 SSL2_TXT_RC4_128_EXPORT40_WITH_MD5	
#define SSL_TXT_RC2_128_CBC_WITH_MD5	SSL2_TXT_RC2_128_CBC_WITH_MD5		
#define SSL_TXT_RC2_128_CBC_EXPORT40_WITH_MD5 SSL2_TXT_RC2_128_CBC_EXPORT40_WITH_MD5	
#define SSL_TXT_IDEA_128_CBC_WITH_MD5	SSL2_TXT_IDEA_128_CBC_WITH_MD5		
#define SSL_TXT_DES_64_CBC_WITH_MD5	SSL2_TXT_DES_64_CBC_WITH_MD5		
#define SSL_TXT_DES_64_CBC_WITH_SHA	SSL2_TXT_DES_64_CBC_WITH_SHA		
#define SSL_TXT_DES_192_EDE3_CBC_WITH_MD5 SSL2_TXT_DES_192_EDE3_CBC_WITH_MD5	
#define SSL_TXT_DES_192_EDE3_CBC_WITH_SHA SSL2_TXT_DES_192_EDE3_CBC_WITH_SHA	

/*    VRS Additional Kerberos5 entries
 */
#define SSL_TXT_KRB5_DES_64_CBC_SHA   SSL3_TXT_KRB5_DES_64_CBC_SHA
#define SSL_TXT_KRB5_DES_192_CBC3_SHA SSL3_TXT_KRB5_DES_192_CBC3_SHA
#define SSL_TXT_KRB5_RC4_128_SHA      SSL3_TXT_KRB5_RC4_128_SHA
#define SSL_TXT_KRB5_IDEA_128_CBC_SHA SSL3_TXT_KRB5_IDEA_128_CBC_SHA
#define SSL_TXT_KRB5_DES_64_CBC_MD5   SSL3_TXT_KRB5_DES_64_CBC_MD5       
#define SSL_TXT_KRB5_DES_192_CBC3_MD5 SSL3_TXT_KRB5_DES_192_CBC3_MD5       
#define SSL_TXT_KRB5_RC4_128_MD5      SSL3_TXT_KRB5_RC4_128_MD5
#define SSL_TXT_KRB5_IDEA_128_CBC_MD5 SSL3_TXT_KRB5_IDEA_128_CBC_MD5 

#define SSL_TXT_KRB5_DES_40_CBC_SHA   SSL3_TXT_KRB5_DES_40_CBC_SHA 
#define SSL_TXT_KRB5_RC2_40_CBC_SHA   SSL3_TXT_KRB5_RC2_40_CBC_SHA 
#define SSL_TXT_KRB5_RC4_40_SHA	      SSL3_TXT_KRB5_RC4_40_SHA
#define SSL_TXT_KRB5_DES_40_CBC_MD5   SSL3_TXT_KRB5_DES_40_CBC_MD5 
#define SSL_TXT_KRB5_RC2_40_CBC_MD5   SSL3_TXT_KRB5_RC2_40_CBC_MD5 
#define SSL_TXT_KRB5_RC4_40_MD5	      SSL3_TXT_KRB5_RC4_40_MD5

#define SSL_TXT_KRB5_DES_40_CBC_SHA   SSL3_TXT_KRB5_DES_40_CBC_SHA
#define SSL_TXT_KRB5_DES_40_CBC_MD5   SSL3_TXT_KRB5_DES_40_CBC_MD5
#define SSL_TXT_KRB5_DES_64_CBC_SHA   SSL3_TXT_KRB5_DES_64_CBC_SHA
#define SSL_TXT_KRB5_DES_64_CBC_MD5   SSL3_TXT_KRB5_DES_64_CBC_MD5
#define SSL_TXT_KRB5_DES_192_CBC3_SHA SSL3_TXT_KRB5_DES_192_CBC3_SHA
#define SSL_TXT_KRB5_DES_192_CBC3_MD5 SSL3_TXT_KRB5_DES_192_CBC3_MD5
#define SSL_MAX_KRB5_PRINCIPAL_LENGTH  256

#define SSL_MAX_SSL_SESSION_ID_LENGTH		32
#define SSL_MAX_SID_CTX_LENGTH			32

#define SSL_MIN_RSA_MODULUS_LENGTH_IN_BYTES	(512/8)
#define SSL_MAX_KEY_ARG_LENGTH			8
#define SSL_MAX_MASTER_KEY_LENGTH		48

/* These are used to specify which ciphers to use and not to use */
#define SSL_TXT_LOW		"LOW"
#define SSL_TXT_MEDIUM		"MEDIUM"
#define SSL_TXT_HIGH		"HIGH"
#define SSL_TXT_FIPS		"FIPS"
#define SSL_TXT_kFZA		"kFZA"
#define	SSL_TXT_aFZA		"aFZA"
#define SSL_TXT_eFZA		"eFZA"
#define SSL_TXT_FZA		"FZA"

#define	SSL_TXT_aNULL		"aNULL"
#define	SSL_TXT_eNULL		"eNULL"
#define	SSL_TXT_NULL		"NULL"

#define SSL_TXT_kKRB5     	"kKRB5"
#define SSL_TXT_aKRB5     	"aKRB5"
#define SSL_TXT_KRB5      	"KRB5"

#define SSL_TXT_kRSA		"kRSA"
#define SSL_TXT_kDHr		"kDHr"
#define SSL_TXT_kDHd		"kDHd"
#define SSL_TXT_kEDH		"kEDH"
#define	SSL_TXT_aRSA		"aRSA"
#define	SSL_TXT_aDSS		"aDSS"
#define	SSL_TXT_aDH		"aDH"
#define	SSL_TXT_DSS		"DSS"
#define SSL_TXT_DH		"DH"
#define SSL_TXT_EDH		"EDH"
#define SSL_TXT_ADH		"ADH"
#define SSL_TXT_RSA		"RSA"
#define SSL_TXT_DES		"DES"
#define SSL_TXT_3DES		"3DES"
#define SSL_TXT_RC4		"RC4"
#define SSL_TXT_RC2		"RC2"
#define SSL_TXT_IDEA		"IDEA"
#define SSL_TXT_SEED		"SEED"
#define SSL_TXT_AES		"AES"
#define SSL_TXT_CAMELLIA	"CAMELLIA"
#define SSL_TXT_MD5		"MD5"
#define SSL_TXT_SHA1		"SHA1"
#define SSL_TXT_SHA		"SHA"
#define SSL_TXT_EXP		"EXP"
#define SSL_TXT_EXPORT		"EXPORT"
#define SSL_TXT_EXP40		"EXPORT40"
#define SSL_TXT_EXP56		"EXPORT56"
#define SSL_TXT_SSLV2		"SSLv2"
#define SSL_TXT_SSLV3		"SSLv3"
#define SSL_TXT_TLSV1		"TLSv1"
#define SSL_TXT_ALL		"ALL"
#define SSL_TXT_ECC		"ECCdraft" /* ECC ciphersuites are not yet official */

/*
 * COMPLEMENTOF* definitions. These identifiers are used to (de-select)
 * ciphers normally not being used.
 * Example: "RC4" will activate all ciphers using RC4 including ciphers
 * without authentication, which would normally disabled by DEFAULT (due
 * the "!ADH" being part of default). Therefore "RC4:!COMPLEMENTOFDEFAULT"
 * will make sure that it is also disabled in the specific selection.
 * COMPLEMENTOF* identifiers are portable between version, as adjustments
 * to the default cipher setup will also be included here.
 *
 * COMPLEMENTOFDEFAULT does not experience the same special treatment that
 * DEFAULT gets, as only selection is being done and no sorting as needed
 * for DEFAULT.
 */
#define SSL_TXT_CMPALL		"COMPLEMENTOFALL"
#define SSL_TXT_CMPDEF		"COMPLEMENTOFDEFAULT"

/* The following cipher list is used by default.
 * It also is substituted when an application-defined cipher list string
 * starts with 'DEFAULT'. */
#define SSL_DEFAULT_CIPHER_LIST	"AES:ALL:!aNULL:!eNULL:+RC4:@STRENGTH" /* low priority for RC4 */

/* Used in SSL_set_shutdown()/SSL_get_shutdown(); */
#define SSL_SENT_SHUTDOWN	1
#define SSL_RECEIVED_SHUTDOWN	2

#ifdef __cplusplus
}
#endif

#ifdef  __cplusplus
extern "C" {
#endif

#if (defined(OPENSSL_NO_RSA) || defined(OPENSSL_NO_MD5)) && !defined(OPENSSL_NO_SSL2)
#define OPENSSL_NO_SSL2
#endif

#define SSL_FILETYPE_ASN1	X509_FILETYPE_ASN1
#define SSL_FILETYPE_PEM	X509_FILETYPE_PEM

/* This is needed to stop compilers complaining about the
 * 'struct ssl_st *' function parameters used to prototype callbacks
 * in SSL_CTX. */
typedef struct ssl_st *ssl_crock_st;

/* used to hold info on the particular ciphers used */
typedef struct ssl_cipher_st
	{
	int valid;
	const char *name;		/* text name */
	unsigned long id;		/* id, 4 bytes, first is version */
	unsigned long algorithms;	/* what ciphers are used */
	unsigned long algo_strength;	/* strength and export flags */
	unsigned long algorithm2;	/* Extra flags */
	int strength_bits;		/* Number of bits really used */
	int alg_bits;			/* Number of bits for algorithm */
	unsigned long mask;		/* used for matching */
	unsigned long mask_strength;	/* also used for matching */
	} SSL_CIPHER;

DECLARE_STACK_OF(SSL_CIPHER)

/* Used to hold functions for SSLv2 or SSLv3/TLSv1 functions */
typedef struct ssl_method_st
	{
	int version;
	int (*ssl_new)(SSL *s);
	void (*ssl_clear)(SSL *s);
	void (*ssl_free)(SSL *s);
	int (*ssl_accept)(SSL *s);
	int (*ssl_connect)(SSL *s);
	int (*ssl_read)(SSL *s,void *buf,int len);
	int (*ssl_peek)(SSL *s,void *buf,int len);
	int (*ssl_write)(SSL *s,const void *buf,int len);
	int (*ssl_shutdown)(SSL *s);
	int (*ssl_renegotiate)(SSL *s);
	int (*ssl_renegotiate_check)(SSL *s);
	long (*ssl_get_message)(SSL *s, int st1, int stn, int mt, long
		max, int *ok);
	int (*ssl_read_bytes)(SSL *s, int type, unsigned char *buf, int len, 
		int peek);
	int (*ssl_write_bytes)(SSL *s, int type, const void *buf_, int len);
	int (*ssl_dispatch_alert)(SSL *s);
	long (*ssl_ctrl)(SSL *s,int cmd,long larg,void *parg);
	long (*ssl_ctx_ctrl)(SSL_CTX *ctx,int cmd,long larg,void *parg);
	SSL_CIPHER *(*get_cipher_by_char)(const unsigned char *ptr);
	int (*put_cipher_by_char)(const SSL_CIPHER *cipher,unsigned char *ptr);
	int (*ssl_pending)(const SSL *s);
	int (*num_ciphers)(void);
	SSL_CIPHER *(*get_cipher)(unsigned ncipher);
	struct ssl_method_st *(*get_ssl_method)(int version);
	long (*get_timeout)(void);
	struct ssl3_enc_method *ssl3_enc; /* Extra SSLv3/TLS stuff */
	int (*ssl_version)(void);
	long (*ssl_callback_ctrl)(SSL *s, int cb_id, void (*fp)(void));
	long (*ssl_ctx_callback_ctrl)(SSL_CTX *s, int cb_id, void (*fp)(void));
	} SSL_METHOD;

/* Lets make this into an ASN.1 type structure as follows
 * SSL_SESSION_ID ::= SEQUENCE {
 *	version 		INTEGER,	-- structure version number
 *	SSLversion 		INTEGER,	-- SSL version number
 *	Cipher 			OCTET_STRING,	-- the 3 byte cipher ID
 *	Session_ID 		OCTET_STRING,	-- the Session ID
 *	Master_key 		OCTET_STRING,	-- the master key
 *	KRB5_principal		OCTET_STRING	-- optional Kerberos principal
 *	Key_Arg [ 0 ] IMPLICIT	OCTET_STRING,	-- the optional Key argument
 *	Time [ 1 ] EXPLICIT	INTEGER,	-- optional Start Time
 *	Timeout [ 2 ] EXPLICIT	INTEGER,	-- optional Timeout ins seconds
 *	Peer [ 3 ] EXPLICIT	X509,		-- optional Peer Certificate
 *	Session_ID_context [ 4 ] EXPLICIT OCTET_STRING,   -- the Session ID context
 *	Verify_result [ 5 ] EXPLICIT INTEGER    -- X509_V_... code for `Peer'
 *	Compression [6] IMPLICIT ASN1_OBJECT	-- compression OID XXXXX
 *	}
 * Look in ssl/ssl_asn1.c for more details
 * I'm using EXPLICIT tags so I can read the damn things using asn1parse :-).
 */
typedef struct ssl_session_st
	{
	int ssl_version;	/* what ssl version session info is
				 * being kept in here? */

	/* only really used in SSLv2 */
	unsigned int key_arg_length;
	unsigned char key_arg[SSL_MAX_KEY_ARG_LENGTH];
	int master_key_length;
	unsigned char master_key[SSL_MAX_MASTER_KEY_LENGTH];
	/* session_id - valid? */
	unsigned int session_id_length;
	unsigned char session_id[SSL_MAX_SSL_SESSION_ID_LENGTH];
	/* this is used to determine whether the session is being reused in
	 * the appropriate context. It is up to the application to set this,
	 * via SSL_new */
	unsigned int sid_ctx_length;
	unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH];

#ifndef OPENSSL_NO_KRB5
        unsigned int krb5_client_princ_len;
        unsigned char krb5_client_princ[SSL_MAX_KRB5_PRINCIPAL_LENGTH];
#endif /* OPENSSL_NO_KRB5 */

	int not_resumable;

	/* The cert is the certificate used to establish this connection */
	struct sess_cert_st /* SESS_CERT */ *sess_cert;

	/* This is the cert for the other end.
	 * On clients, it will be the same as sess_cert->peer_key->x509
	 * (the latter is not enough as sess_cert is not retained
	 * in the external representation of sessions, see ssl_asn1.c). */
	X509 *peer;
	/* when app_verify_callback accepts a session where the peer's certificate
	 * is not ok, we must remember the error for session reuse: */
	long verify_result; /* only for servers */

	int references;
	long timeout;
	long time;

	int compress_meth;		/* Need to lookup the method */

	SSL_CIPHER *cipher;
	unsigned long cipher_id;	/* when ASN.1 loaded, this
					 * needs to be used to load
					 * the 'cipher' structure */

	STACK_OF(SSL_CIPHER) *ciphers; /* shared ciphers? */

	CRYPTO_EX_DATA ex_data; /* application specific data */

	/* These are used to make removal of session-ids more
	 * efficient and to implement a maximum cache size. */
	struct ssl_session_st *prev,*next;
#ifndef OPENSSL_NO_TLSEXT
	char *tlsext_hostname;
	/* RFC4507 info */
	unsigned char *tlsext_tick;	/* Session ticket */
	size_t	tlsext_ticklen;		/* Session ticket length */	
	long tlsext_tick_lifetime_hint;	/* Session lifetime hint in seconds */
#endif
	} SSL_SESSION;


#define SSL_OP_MICROSOFT_SESS_ID_BUG			0x00000001L
#define SSL_OP_NETSCAPE_CHALLENGE_BUG			0x00000002L
#define SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG		0x00000008L
#define SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUG		0x00000010L
#define SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER		0x00000020L
#define SSL_OP_MSIE_SSLV2_RSA_PADDING			0x00000040L /* no effect since 0.9.7h and 0.9.8b */
#define SSL_OP_SSLEAY_080_CLIENT_DH_BUG			0x00000080L
#define SSL_OP_TLS_D5_BUG				0x00000100L
#define SSL_OP_TLS_BLOCK_PADDING_BUG			0x00000200L

/* Disable SSL 3.0/TLS 1.0 CBC vulnerability workaround that was added
 * in OpenSSL 0.9.6d.  Usually (depending on the application protocol)
 * the workaround is not needed.  Unfortunately some broken SSL/TLS
 * implementations cannot handle it at all, which is why we include
 * it in SSL_OP_ALL. */
#define SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS              0x00000800L /* added in 0.9.6e */

/* SSL_OP_ALL: various bug workarounds that should be rather harmless.
 *             This used to be 0x000FFFFFL before 0.9.7. */
#define SSL_OP_ALL					0x00000FFFL

/* DTLS options */
#define SSL_OP_NO_QUERY_MTU                 0x00001000L
/* Turn on Cookie Exchange (on relevant for servers) */
#define SSL_OP_COOKIE_EXCHANGE              0x00002000L
/* Don't use RFC4507 ticket extension */
#define SSL_OP_NO_TICKET	            0x00004000L

/* As server, disallow session resumption on renegotiation */
#define SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION	0x00010000L
/* If set, always create a new key when using tmp_ecdh parameters */
#define SSL_OP_SINGLE_ECDH_USE				0x00080000L
/* If set, always create a new key when using tmp_dh parameters */
#define SSL_OP_SINGLE_DH_USE				0x00100000L
/* Set to always use the tmp_rsa key when doing RSA operations,
 * even when this violates protocol specs */
#define SSL_OP_EPHEMERAL_RSA				0x00200000L
/* Set on servers to choose the cipher according to the server's
 * preferences */
#define SSL_OP_CIPHER_SERVER_PREFERENCE			0x00400000L
/* If set, a server will allow a client to issue a SSLv3.0 version number
 * as latest version supported in the premaster secret, even when TLSv1.0
 * (version 3.1) was announced in the client hello. Normally this is
 * forbidden to prevent version rollback attacks. */
#define SSL_OP_TLS_ROLLBACK_BUG				0x00800000L

#define SSL_OP_NO_SSLv2					0x01000000L
#define SSL_OP_NO_SSLv3					0x02000000L
#define SSL_OP_NO_TLSv1					0x04000000L

/* The next flag deliberately changes the ciphertest, this is a check
 * for the PKCS#1 attack */
#define SSL_OP_PKCS1_CHECK_1				0x08000000L
#define SSL_OP_PKCS1_CHECK_2				0x10000000L
#define SSL_OP_NETSCAPE_CA_DN_BUG			0x20000000L
#define SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG		0x40000000L


/* Allow SSL_write(..., n) to return r with 0 < r < n (i.e. report success
 * when just a single record has been written): */
#define SSL_MODE_ENABLE_PARTIAL_WRITE       0x00000001L
/* Make it possible to retry SSL_write() with changed buffer location
 * (buffer contents must stay the same!); this is not the default to avoid
 * the misconception that non-blocking SSL_write() behaves like
 * non-blocking write(): */
#define SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER 0x00000002L
/* Never bother the application with retries if the transport
 * is blocking: */
#define SSL_MODE_AUTO_RETRY 0x00000004L
/* Don't attempt to automatically build certificate chain */
#define SSL_MODE_NO_AUTO_CHAIN 0x00000008L


/* Note: SSL[_CTX]_set_{options,mode} use |= op on the previous value,
 * they cannot be used to clear bits. */

#define SSL_CTX_set_options(ctx,op) \
	SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,(op),NULL)
#define SSL_CTX_get_options(ctx) \
	SSL_CTX_ctrl((ctx),SSL_CTRL_OPTIONS,0,NULL)
#define SSL_set_options(ssl,op) \
	SSL_ctrl((ssl),SSL_CTRL_OPTIONS,(op),NULL)
#define SSL_get_options(ssl) \
        SSL_ctrl((ssl),SSL_CTRL_OPTIONS,0,NULL)

#define SSL_CTX_set_mode(ctx,op) \
	SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,(op),NULL)
#define SSL_CTX_get_mode(ctx) \
	SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,0,NULL)
#define SSL_set_mode(ssl,op) \
	SSL_ctrl((ssl),SSL_CTRL_MODE,(op),NULL)
#define SSL_get_mode(ssl) \
        SSL_ctrl((ssl),SSL_CTRL_MODE,0,NULL)
#define SSL_set_mtu(ssl, mtu) \
        SSL_ctrl((ssl),SSL_CTRL_SET_MTU,(mtu),NULL)


void SSL_CTX_set_msg_callback(SSL_CTX *ctx, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg));
void SSL_set_msg_callback(SSL *ssl, void (*cb)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg));
#define SSL_CTX_set_msg_callback_arg(ctx, arg) SSL_CTX_ctrl((ctx), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg))
#define SSL_set_msg_callback_arg(ssl, arg) SSL_ctrl((ssl), SSL_CTRL_SET_MSG_CALLBACK_ARG, 0, (arg))



#if defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN32)
#define SSL_MAX_CERT_LIST_DEFAULT 1024*30 /* 30k max cert list :-) */
#else
#define SSL_MAX_CERT_LIST_DEFAULT 1024*100 /* 100k max cert list :-) */
#endif

#define SSL_SESSION_CACHE_MAX_SIZE_DEFAULT	(1024*20)

/* This callback type is used inside SSL_CTX, SSL, and in the functions that set
 * them. It is used to override the generation of SSL/TLS session IDs in a
 * server. Return value should be zero on an error, non-zero to proceed. Also,
 * callbacks should themselves check if the id they generate is unique otherwise
 * the SSL handshake will fail with an error - callbacks can do this using the
 * 'ssl' value they're passed by;
 *      SSL_has_matching_session_id(ssl, id, *id_len)
 * The length value passed in is set at the maximum size the session ID can be.
 * In SSLv2 this is 16 bytes, whereas SSLv3/TLSv1 it is 32 bytes. The callback
 * can alter this length to be less if desired, but under SSLv2 session IDs are
 * supposed to be fixed at 16 bytes so the id will be padded after the callback
 * returns in this case. It is also an error for the callback to set the size to
 * zero. */
typedef int (*GEN_SESSION_CB)(const SSL *ssl, unsigned char *id,
				unsigned int *id_len);

typedef struct ssl_comp_st
	{
	int id;
	const char *name;
#ifndef OPENSSL_NO_COMP
	COMP_METHOD *method;
#else
	char *method;
#endif
	} SSL_COMP;

DECLARE_STACK_OF(SSL_COMP)

struct ssl_ctx_st
	{
	SSL_METHOD *method;

	STACK_OF(SSL_CIPHER) *cipher_list;
	/* same as above but sorted for lookup */
	STACK_OF(SSL_CIPHER) *cipher_list_by_id;

	struct x509_store_st /* X509_STORE */ *cert_store;
	struct lhash_st /* LHASH */ *sessions;	/* a set of SSL_SESSIONs */
	/* Most session-ids that will be cached, default is
	 * SSL_SESSION_CACHE_MAX_SIZE_DEFAULT. 0 is unlimited. */
	unsigned long session_cache_size;
	struct ssl_session_st *session_cache_head;
	struct ssl_session_st *session_cache_tail;

	/* This can have one of 2 values, ored together,
	 * SSL_SESS_CACHE_CLIENT,
	 * SSL_SESS_CACHE_SERVER,
	 * Default is SSL_SESSION_CACHE_SERVER, which means only
	 * SSL_accept which cache SSL_SESSIONS. */
	int session_cache_mode;

	/* If timeout is not 0, it is the default timeout value set
	 * when SSL_new() is called.  This has been put in to make
	 * life easier to set things up */
	long session_timeout;

	/* If this callback is not null, it will be called each
	 * time a session id is added to the cache.  If this function
	 * returns 1, it means that the callback will do a
	 * SSL_SESSION_free() when it has finished using it.  Otherwise,
	 * on 0, it means the callback has finished with it.
	 * If remove_session_cb is not null, it will be called when
	 * a session-id is removed from the cache.  After the call,
	 * OpenSSL will SSL_SESSION_free() it. */
	int (*new_session_cb)(struct ssl_st *ssl,SSL_SESSION *sess);
	void (*remove_session_cb)(struct ssl_ctx_st *ctx,SSL_SESSION *sess);
	SSL_SESSION *(*get_session_cb)(struct ssl_st *ssl,
		unsigned char *data,int len,int *copy);

	struct
		{
		int sess_connect;	/* SSL new conn - started */
		int sess_connect_renegotiate;/* SSL reneg - requested */
		int sess_connect_good;	/* SSL new conne/reneg - finished */
		int sess_accept;	/* SSL new accept - started */
		int sess_accept_renegotiate;/* SSL reneg - requested */
		int sess_accept_good;	/* SSL accept/reneg - finished */
		int sess_miss;		/* session lookup misses  */
		int sess_timeout;	/* reuse attempt on timeouted session */
		int sess_cache_full;	/* session removed due to full cache */
		int sess_hit;		/* session reuse actually done */
		int sess_cb_hit;	/* session-id that was not
					 * in the cache was
					 * passed back via the callback.  This
					 * indicates that the application is
					 * supplying session-id's from other
					 * processes - spooky :-) */
		} stats;

	int references;

	/* if defined, these override the X509_verify_cert() calls */
	int (*app_verify_callback)(X509_STORE_CTX *, void *);
	void *app_verify_arg;
	/* before OpenSSL 0.9.7, 'app_verify_arg' was ignored
	 * ('app_verify_callback' was called with just one argument) */

	/* Default password callback. */
	pem_password_cb *default_passwd_callback;

	/* Default password callback user data. */
	void *default_passwd_callback_userdata;

	/* get client cert callback */
	int (*client_cert_cb)(SSL *ssl, X509 **x509, EVP_PKEY **pkey);

    /* cookie generate callback */
    int (*app_gen_cookie_cb)(SSL *ssl, unsigned char *cookie, 
        unsigned int *cookie_len);

    /* verify cookie callback */
    int (*app_verify_cookie_cb)(SSL *ssl, unsigned char *cookie, 
        unsigned int cookie_len);

	CRYPTO_EX_DATA ex_data;

	const EVP_MD *rsa_md5;/* For SSLv2 - name is 'ssl2-md5' */
	const EVP_MD *md5;	/* For SSLv3/TLSv1 'ssl3-md5' */
	const EVP_MD *sha1;   /* For SSLv3/TLSv1 'ssl3->sha1' */

	STACK_OF(X509) *extra_certs;
	STACK_OF(SSL_COMP) *comp_methods; /* stack of SSL_COMP, SSLv3/TLSv1 */


	/* Default values used when no per-SSL value is defined follow */

	void (*info_callback)(const SSL *ssl,int type,int val); /* used if SSL's info_callback is NULL */

	/* what we put in client cert requests */
	STACK_OF(X509_NAME) *client_CA;


	/* Default values to use in SSL structures follow (these are copied by SSL_new) */

	unsigned long options;
	unsigned long mode;
	long max_cert_list;

	struct cert_st /* CERT */ *cert;
	int read_ahead;

	/* callback that allows applications to peek at protocol messages */
	void (*msg_callback)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg);
	void *msg_callback_arg;

	int verify_mode;
	unsigned int sid_ctx_length;
	unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH];
	int (*default_verify_callback)(int ok,X509_STORE_CTX *ctx); /* called 'verify_callback' in the SSL */

	/* Default generate session ID callback. */
	GEN_SESSION_CB generate_session_id;

	X509_VERIFY_PARAM *param;

#if 0
	int purpose;		/* Purpose setting */
	int trust;		/* Trust setting */
#endif

	int quiet_shutdown;

#ifndef OPENSSL_ENGINE
	/* Engine to pass requests for client certs to
	 */
	ENGINE *client_cert_engine;
#endif

#ifndef OPENSSL_NO_TLSEXT
	/* TLS extensions servername callback */
	int (*tlsext_servername_callback)(SSL*, int *, void *);
	void *tlsext_servername_arg;
	/* RFC 4507 session ticket keys */
	unsigned char tlsext_tick_key_name[16];
	unsigned char tlsext_tick_hmac_key[16];
	unsigned char tlsext_tick_aes_key[16];
	/* Callback to support customisation of ticket key setting */
	int (*tlsext_ticket_key_cb)(SSL *ssl,
					unsigned char *name, unsigned char *iv,
					EVP_CIPHER_CTX *ectx,
					HMAC_CTX *hctx, int enc);

	/* certificate status request info */
	/* Callback for status request */
	int (*tlsext_status_cb)(SSL *ssl, void *arg);
	void *tlsext_status_arg;
#endif

	};

#define SSL_SESS_CACHE_OFF			0x0000
#define SSL_SESS_CACHE_CLIENT			0x0001
#define SSL_SESS_CACHE_SERVER			0x0002
#define SSL_SESS_CACHE_BOTH	(SSL_SESS_CACHE_CLIENT|SSL_SESS_CACHE_SERVER)
#define SSL_SESS_CACHE_NO_AUTO_CLEAR		0x0080
/* enough comments already ... see SSL_CTX_set_session_cache_mode(3) */
#define SSL_SESS_CACHE_NO_INTERNAL_LOOKUP	0x0100
#define SSL_SESS_CACHE_NO_INTERNAL_STORE	0x0200
#define SSL_SESS_CACHE_NO_INTERNAL \
	(SSL_SESS_CACHE_NO_INTERNAL_LOOKUP|SSL_SESS_CACHE_NO_INTERNAL_STORE)

  struct lhash_st *SSL_CTX_sessions(SSL_CTX *ctx);
#define SSL_CTX_sess_number(ctx) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_NUMBER,0,NULL)
#define SSL_CTX_sess_connect(ctx) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT,0,NULL)
#define SSL_CTX_sess_connect_good(ctx) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_GOOD,0,NULL)
#define SSL_CTX_sess_connect_renegotiate(ctx) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CONNECT_RENEGOTIATE,0,NULL)
#define SSL_CTX_sess_accept(ctx) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT,0,NULL)
#define SSL_CTX_sess_accept_renegotiate(ctx) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_RENEGOTIATE,0,NULL)
#define SSL_CTX_sess_accept_good(ctx) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_ACCEPT_GOOD,0,NULL)
#define SSL_CTX_sess_hits(ctx) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_HIT,0,NULL)
#define SSL_CTX_sess_cb_hits(ctx) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CB_HIT,0,NULL)
#define SSL_CTX_sess_misses(ctx) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_MISSES,0,NULL)
#define SSL_CTX_sess_timeouts(ctx) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_TIMEOUTS,0,NULL)
#define SSL_CTX_sess_cache_full(ctx) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SESS_CACHE_FULL,0,NULL)

void SSL_CTX_sess_set_new_cb(SSL_CTX *ctx, int (*new_session_cb)(struct ssl_st *ssl,SSL_SESSION *sess));
int (*SSL_CTX_sess_get_new_cb(SSL_CTX *ctx))(struct ssl_st *ssl, SSL_SESSION *sess);
void SSL_CTX_sess_set_remove_cb(SSL_CTX *ctx, void (*remove_session_cb)(struct ssl_ctx_st *ctx,SSL_SESSION *sess));
void (*SSL_CTX_sess_get_remove_cb(SSL_CTX *ctx))(struct ssl_ctx_st *ctx, SSL_SESSION *sess);
void SSL_CTX_sess_set_get_cb(SSL_CTX *ctx, SSL_SESSION *(*get_session_cb)(struct ssl_st *ssl, unsigned char *data,int len,int *copy));
SSL_SESSION *(*SSL_CTX_sess_get_get_cb(SSL_CTX *ctx))(struct ssl_st *ssl, unsigned char *Data, int len, int *copy);
void SSL_CTX_set_info_callback(SSL_CTX *ctx, void (*cb)(const SSL *ssl,int type,int val));
void (*SSL_CTX_get_info_callback(SSL_CTX *ctx))(const SSL *ssl,int type,int val);
void SSL_CTX_set_client_cert_cb(SSL_CTX *ctx, int (*client_cert_cb)(SSL *ssl, X509 **x509, EVP_PKEY **pkey));
int (*SSL_CTX_get_client_cert_cb(SSL_CTX *ctx))(SSL *ssl, X509 **x509, EVP_PKEY **pkey);
#ifndef OPENSSL_NO_ENGINE
int SSL_CTX_set_client_cert_engine(SSL_CTX *ctx, ENGINE *e);
#endif
void SSL_CTX_set_cookie_generate_cb(SSL_CTX *ctx, int (*app_gen_cookie_cb)(SSL *ssl, unsigned char *cookie, unsigned int *cookie_len));
void SSL_CTX_set_cookie_verify_cb(SSL_CTX *ctx, int (*app_verify_cookie_cb)(SSL *ssl, unsigned char *cookie, unsigned int cookie_len));

#define SSL_NOTHING	1
#define SSL_WRITING	2
#define SSL_READING	3
#define SSL_X509_LOOKUP	4

/* These will only be used when doing non-blocking IO */
#define SSL_want_nothing(s)	(SSL_want(s) == SSL_NOTHING)
#define SSL_want_read(s)	(SSL_want(s) == SSL_READING)
#define SSL_want_write(s)	(SSL_want(s) == SSL_WRITING)
#define SSL_want_x509_lookup(s)	(SSL_want(s) == SSL_X509_LOOKUP)

struct ssl_st
	{
	/* protocol version
	 * (one of SSL2_VERSION, SSL3_VERSION, TLS1_VERSION, DTLS1_VERSION)
	 */
	int version;
	int type; /* SSL_ST_CONNECT or SSL_ST_ACCEPT */

	SSL_METHOD *method; /* SSLv3 */

	/* There are 2 BIO's even though they are normally both the
	 * same.  This is so data can be read and written to different
	 * handlers */

#ifndef OPENSSL_NO_BIO
	BIO *rbio; /* used by SSL_read */
	BIO *wbio; /* used by SSL_write */
	BIO *bbio; /* used during session-id reuse to concatenate
		    * messages */
#else
	char *rbio; /* used by SSL_read */
	char *wbio; /* used by SSL_write */
	char *bbio;
#endif
	/* This holds a variable that indicates what we were doing
	 * when a 0 or -1 is returned.  This is needed for
	 * non-blocking IO so we know what request needs re-doing when
	 * in SSL_accept or SSL_connect */
	int rwstate;

	/* true when we are actually in SSL_accept() or SSL_connect() */
	int in_handshake;
	int (*handshake_func)(SSL *);

	/* Imagine that here's a boolean member "init" that is
	 * switched as soon as SSL_set_{accept/connect}_state
	 * is called for the first time, so that "state" and
	 * "handshake_func" are properly initialized.  But as
	 * handshake_func is == 0 until then, we use this
	 * test instead of an "init" member.
	 */

	int server;	/* are we the server side? - mostly used by SSL_clear*/

	int new_session;/* 1 if we are to use a new session.
	                 * 2 if we are a server and are inside a handshake
	                 *   (i.e. not just sending a HelloRequest)
	                 * NB: For servers, the 'new' session may actually be a previously
	                 * cached session or even the previous session unless
	                 * SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION is set */
	int quiet_shutdown;/* don't send shutdown packets */
	int shutdown;	/* we have shut things down, 0x01 sent, 0x02
			 * for received */
	int state;	/* where we are */
	int rstate;	/* where we are when reading */

	BUF_MEM *init_buf;	/* buffer used during init */
	void *init_msg;   	/* pointer to handshake message body, set by ssl3_get_message() */
	int init_num;		/* amount read/written */
	int init_off;		/* amount read/written */

	/* used internally to point at a raw packet */
	unsigned char *packet;
	unsigned int packet_length;

	struct ssl2_state_st *s2; /* SSLv2 variables */
	struct ssl3_state_st *s3; /* SSLv3 variables */
	struct dtls1_state_st *d1; /* DTLSv1 variables */

	int read_ahead;		/* Read as many input bytes as possible
	               	 	 * (for non-blocking reads) */

	/* callback that allows applications to peek at protocol messages */
	void (*msg_callback)(int write_p, int version, int content_type, const void *buf, size_t len, SSL *ssl, void *arg);
	void *msg_callback_arg;

	int hit;		/* reusing a previous session */

	X509_VERIFY_PARAM *param;

#if 0
	int purpose;		/* Purpose setting */
	int trust;		/* Trust setting */
#endif

	/* crypto */
	STACK_OF(SSL_CIPHER) *cipher_list;
	STACK_OF(SSL_CIPHER) *cipher_list_by_id;

	/* These are the ones being used, the ones in SSL_SESSION are
	 * the ones to be 'copied' into these ones */

	EVP_CIPHER_CTX *enc_read_ctx;		/* cryptographic state */
	const EVP_MD *read_hash;		/* used for mac generation */
#ifndef OPENSSL_NO_COMP
	COMP_CTX *expand;			/* uncompress */
#else
	char *expand;
#endif

	EVP_CIPHER_CTX *enc_write_ctx;		/* cryptographic state */
	const EVP_MD *write_hash;		/* used for mac generation */
#ifndef OPENSSL_NO_COMP
	COMP_CTX *compress;			/* compression */
#else
	char *compress;	
#endif

	/* session info */

	/* client cert? */
	/* This is used to hold the server certificate used */
	struct cert_st /* CERT */ *cert;

	/* the session_id_context is used to ensure sessions are only reused
	 * in the appropriate context */
	unsigned int sid_ctx_length;
	unsigned char sid_ctx[SSL_MAX_SID_CTX_LENGTH];

	/* This can also be in the session once a session is established */
	SSL_SESSION *session;

	/* Default generate session ID callback. */
	GEN_SESSION_CB generate_session_id;

	/* Used in SSL2 and SSL3 */
	int verify_mode;	/* 0 don't care about verify failure.
				 * 1 fail if verify fails */
	int (*verify_callback)(int ok,X509_STORE_CTX *ctx); /* fail if callback returns 0 */

	void (*info_callback)(const SSL *ssl,int type,int val); /* optional informational callback */

	int error;		/* error bytes to be written */
	int error_code;		/* actual code */

#ifndef OPENSSL_NO_KRB5
	KSSL_CTX *kssl_ctx;     /* Kerberos 5 context */
#endif	/* OPENSSL_NO_KRB5 */

	SSL_CTX *ctx;
	/* set this flag to 1 and a sleep(1) is put into all SSL_read()
	 * and SSL_write() calls, good for nbio debuging :-) */
	int debug;	

	/* extra application data */
	long verify_result;
	CRYPTO_EX_DATA ex_data;

	/* for server side, keep the list of CA_dn we can use */
	STACK_OF(X509_NAME) *client_CA;

	int references;
	unsigned long options; /* protocol behaviour */
	unsigned long mode; /* API behaviour */
	long max_cert_list;
	int first_packet;
	int client_version;	/* what was passed, used for
				 * SSLv3/TLS rollback check */
#ifndef OPENSSL_NO_TLSEXT
	/* TLS extension debug callback */
	void (*tlsext_debug_cb)(SSL *s, int client_server, int type,
					unsigned char *data, int len,
					void *arg);
	void *tlsext_debug_arg;
	char *tlsext_hostname;
	int servername_done;   /* no further mod of servername 
	                          0 : call the servername extension callback.
	                          1 : prepare 2, allow last ack just after in server callback.
	                          2 : don't call servername callback, no ack in server hello
	                       */
	/* certificate status request info */
	/* Status type or -1 if no status type */
	int tlsext_status_type;
	/* Expect OCSP CertificateStatus message */
	int tlsext_status_expected;
	/* OCSP status request only */
	STACK_OF(OCSP_RESPID) *tlsext_ocsp_ids;
	X509_EXTENSIONS *tlsext_ocsp_exts;
	/* OCSP response received or to be sent */
	unsigned char *tlsext_ocsp_resp;
	int tlsext_ocsp_resplen;

	/* RFC4507 session ticket expected to be received or sent */
	int tlsext_ticket_expected;
	SSL_CTX * initial_ctx; /* initial ctx, used to store sessions */
#define session_ctx initial_ctx
#else
#define session_ctx ctx
#endif
	};

#ifdef __cplusplus
}
#endif

#include 
#include 
#include  /* This is mostly sslv3 with a few tweaks */
#include  /* Datagram TLS */
#include 

#ifdef  __cplusplus
extern "C" {
#endif

/* compatibility */
#define SSL_set_app_data(s,arg)		(SSL_set_ex_data(s,0,(char *)arg))
#define SSL_get_app_data(s)		(SSL_get_ex_data(s,0))
#define SSL_SESSION_set_app_data(s,a)	(SSL_SESSION_set_ex_data(s,0,(char *)a))
#define SSL_SESSION_get_app_data(s)	(SSL_SESSION_get_ex_data(s,0))
#define SSL_CTX_get_app_data(ctx)	(SSL_CTX_get_ex_data(ctx,0))
#define SSL_CTX_set_app_data(ctx,arg)	(SSL_CTX_set_ex_data(ctx,0,(char *)arg))

/* The following are the possible values for ssl->state are are
 * used to indicate where we are up to in the SSL connection establishment.
 * The macros that follow are about the only things you should need to use
 * and even then, only when using non-blocking IO.
 * It can also be useful to work out where you were when the connection
 * failed */

#define SSL_ST_CONNECT			0x1000
#define SSL_ST_ACCEPT			0x2000
#define SSL_ST_MASK			0x0FFF
#define SSL_ST_INIT			(SSL_ST_CONNECT|SSL_ST_ACCEPT)
#define SSL_ST_BEFORE			0x4000
#define SSL_ST_OK			0x03
#define SSL_ST_RENEGOTIATE		(0x04|SSL_ST_INIT)

#define SSL_CB_LOOP			0x01
#define SSL_CB_EXIT			0x02
#define SSL_CB_READ			0x04
#define SSL_CB_WRITE			0x08
#define SSL_CB_ALERT			0x4000 /* used in callback */
#define SSL_CB_READ_ALERT		(SSL_CB_ALERT|SSL_CB_READ)
#define SSL_CB_WRITE_ALERT		(SSL_CB_ALERT|SSL_CB_WRITE)
#define SSL_CB_ACCEPT_LOOP		(SSL_ST_ACCEPT|SSL_CB_LOOP)
#define SSL_CB_ACCEPT_EXIT		(SSL_ST_ACCEPT|SSL_CB_EXIT)
#define SSL_CB_CONNECT_LOOP		(SSL_ST_CONNECT|SSL_CB_LOOP)
#define SSL_CB_CONNECT_EXIT		(SSL_ST_CONNECT|SSL_CB_EXIT)
#define SSL_CB_HANDSHAKE_START		0x10
#define SSL_CB_HANDSHAKE_DONE		0x20

/* Is the SSL_connection established? */
#define SSL_get_state(a)		SSL_state(a)
#define SSL_is_init_finished(a)		(SSL_state(a) == SSL_ST_OK)
#define SSL_in_init(a)			(SSL_state(a)&SSL_ST_INIT)
#define SSL_in_before(a)		(SSL_state(a)&SSL_ST_BEFORE)
#define SSL_in_connect_init(a)		(SSL_state(a)&SSL_ST_CONNECT)
#define SSL_in_accept_init(a)		(SSL_state(a)&SSL_ST_ACCEPT)

/* The following 2 states are kept in ssl->rstate when reads fail,
 * you should not need these */
#define SSL_ST_READ_HEADER			0xF0
#define SSL_ST_READ_BODY			0xF1
#define SSL_ST_READ_DONE			0xF2

/* Obtain latest Finished message
 *   -- that we sent (SSL_get_finished)
 *   -- that we expected from peer (SSL_get_peer_finished).
 * Returns length (0 == no Finished so far), copies up to 'count' bytes. */
size_t SSL_get_finished(const SSL *s, void *buf, size_t count);
size_t SSL_get_peer_finished(const SSL *s, void *buf, size_t count);

/* use either SSL_VERIFY_NONE or SSL_VERIFY_PEER, the last 2 options
 * are 'ored' with SSL_VERIFY_PEER if they are desired */
#define SSL_VERIFY_NONE			0x00
#define SSL_VERIFY_PEER			0x01
#define SSL_VERIFY_FAIL_IF_NO_PEER_CERT	0x02
#define SSL_VERIFY_CLIENT_ONCE		0x04

#define OpenSSL_add_ssl_algorithms()	SSL_library_init()
#define SSLeay_add_ssl_algorithms()	SSL_library_init()

/* this is for backward compatibility */
#if 0 /* NEW_SSLEAY */
#define SSL_CTX_set_default_verify(a,b,c) SSL_CTX_set_verify(a,b,c)
#define SSL_set_pref_cipher(c,n)	SSL_set_cipher_list(c,n)
#define SSL_add_session(a,b)            SSL_CTX_add_session((a),(b))
#define SSL_remove_session(a,b)		SSL_CTX_remove_session((a),(b))
#define SSL_flush_sessions(a,b)		SSL_CTX_flush_sessions((a),(b))
#endif
/* More backward compatibility */
#define SSL_get_cipher(s) \
		SSL_CIPHER_get_name(SSL_get_current_cipher(s))
#define SSL_get_cipher_bits(s,np) \
		SSL_CIPHER_get_bits(SSL_get_current_cipher(s),np)
#define SSL_get_cipher_version(s) \
		SSL_CIPHER_get_version(SSL_get_current_cipher(s))
#define SSL_get_cipher_name(s) \
		SSL_CIPHER_get_name(SSL_get_current_cipher(s))
#define SSL_get_time(a)		SSL_SESSION_get_time(a)
#define SSL_set_time(a,b)	SSL_SESSION_set_time((a),(b))
#define SSL_get_timeout(a)	SSL_SESSION_get_timeout(a)
#define SSL_set_timeout(a,b)	SSL_SESSION_set_timeout((a),(b))

#if 1 /*SSLEAY_MACROS*/
#define d2i_SSL_SESSION_bio(bp,s_id) ASN1_d2i_bio_of(SSL_SESSION,SSL_SESSION_new,d2i_SSL_SESSION,bp,s_id)
#define i2d_SSL_SESSION_bio(bp,s_id) ASN1_i2d_bio_of(SSL_SESSION,i2d_SSL_SESSION,bp,s_id)
#define PEM_read_SSL_SESSION(fp,x,cb,u) (SSL_SESSION *)PEM_ASN1_read( \
	(char *(*)())d2i_SSL_SESSION,PEM_STRING_SSL_SESSION,fp,(char **)x,cb,u)
#define PEM_read_bio_SSL_SESSION(bp,x,cb,u) PEM_ASN1_read_bio_of(SSL_SESSION,d2i_SSL_SESSION,PEM_STRING_SSL_SESSION,bp,x,cb,u)
#define PEM_write_SSL_SESSION(fp,x) \
	PEM_ASN1_write((int (*)())i2d_SSL_SESSION, \
		PEM_STRING_SSL_SESSION,fp, (char *)x, NULL,NULL,0,NULL,NULL)
#define PEM_write_bio_SSL_SESSION(bp,x) \
	PEM_ASN1_write_bio_of(SSL_SESSION,i2d_SSL_SESSION,PEM_STRING_SSL_SESSION,bp,x,NULL,NULL,0,NULL,NULL)
#endif

#define SSL_AD_REASON_OFFSET		1000
/* These alert types are for SSLv3 and TLSv1 */
#define SSL_AD_CLOSE_NOTIFY		SSL3_AD_CLOSE_NOTIFY
#define SSL_AD_UNEXPECTED_MESSAGE	SSL3_AD_UNEXPECTED_MESSAGE /* fatal */
#define SSL_AD_BAD_RECORD_MAC		SSL3_AD_BAD_RECORD_MAC     /* fatal */
#define SSL_AD_DECRYPTION_FAILED	TLS1_AD_DECRYPTION_FAILED
#define SSL_AD_RECORD_OVERFLOW		TLS1_AD_RECORD_OVERFLOW
#define SSL_AD_DECOMPRESSION_FAILURE	SSL3_AD_DECOMPRESSION_FAILURE/* fatal */
#define SSL_AD_HANDSHAKE_FAILURE	SSL3_AD_HANDSHAKE_FAILURE/* fatal */
#define SSL_AD_NO_CERTIFICATE		SSL3_AD_NO_CERTIFICATE /* Not for TLS */
#define SSL_AD_BAD_CERTIFICATE		SSL3_AD_BAD_CERTIFICATE
#define SSL_AD_UNSUPPORTED_CERTIFICATE	SSL3_AD_UNSUPPORTED_CERTIFICATE
#define SSL_AD_CERTIFICATE_REVOKED	SSL3_AD_CERTIFICATE_REVOKED
#define SSL_AD_CERTIFICATE_EXPIRED	SSL3_AD_CERTIFICATE_EXPIRED
#define SSL_AD_CERTIFICATE_UNKNOWN	SSL3_AD_CERTIFICATE_UNKNOWN
#define SSL_AD_ILLEGAL_PARAMETER	SSL3_AD_ILLEGAL_PARAMETER   /* fatal */
#define SSL_AD_UNKNOWN_CA		TLS1_AD_UNKNOWN_CA	/* fatal */
#define SSL_AD_ACCESS_DENIED		TLS1_AD_ACCESS_DENIED	/* fatal */
#define SSL_AD_DECODE_ERROR		TLS1_AD_DECODE_ERROR	/* fatal */
#define SSL_AD_DECRYPT_ERROR		TLS1_AD_DECRYPT_ERROR
#define SSL_AD_EXPORT_RESTRICTION	TLS1_AD_EXPORT_RESTRICTION/* fatal */
#define SSL_AD_PROTOCOL_VERSION		TLS1_AD_PROTOCOL_VERSION /* fatal */
#define SSL_AD_INSUFFICIENT_SECURITY	TLS1_AD_INSUFFICIENT_SECURITY/* fatal */
#define SSL_AD_INTERNAL_ERROR		TLS1_AD_INTERNAL_ERROR	/* fatal */
#define SSL_AD_USER_CANCELLED		TLS1_AD_USER_CANCELLED
#define SSL_AD_NO_RENEGOTIATION		TLS1_AD_NO_RENEGOTIATION
#define SSL_AD_UNSUPPORTED_EXTENSION	TLS1_AD_UNSUPPORTED_EXTENSION
#define SSL_AD_CERTIFICATE_UNOBTAINABLE TLS1_AD_CERTIFICATE_UNOBTAINABLE
#define SSL_AD_UNRECOGNIZED_NAME	TLS1_AD_UNRECOGNIZED_NAME
#define SSL_AD_BAD_CERTIFICATE_STATUS_RESPONSE TLS1_AD_BAD_CERTIFICATE_STATUS_RESPONSE

#define SSL_ERROR_NONE			0
#define SSL_ERROR_SSL			1
#define SSL_ERROR_WANT_READ		2
#define SSL_ERROR_WANT_WRITE		3
#define SSL_ERROR_WANT_X509_LOOKUP	4
#define SSL_ERROR_SYSCALL		5 /* look at error stack/return value/errno */
#define SSL_ERROR_ZERO_RETURN		6
#define SSL_ERROR_WANT_CONNECT		7
#define SSL_ERROR_WANT_ACCEPT		8

#define SSL_CTRL_NEED_TMP_RSA			1
#define SSL_CTRL_SET_TMP_RSA			2
#define SSL_CTRL_SET_TMP_DH			3
#define SSL_CTRL_SET_TMP_ECDH			4
#define SSL_CTRL_SET_TMP_RSA_CB			5
#define SSL_CTRL_SET_TMP_DH_CB			6
#define SSL_CTRL_SET_TMP_ECDH_CB		7

#define SSL_CTRL_GET_SESSION_REUSED		8
#define SSL_CTRL_GET_CLIENT_CERT_REQUEST	9
#define SSL_CTRL_GET_NUM_RENEGOTIATIONS		10
#define SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS	11
#define SSL_CTRL_GET_TOTAL_RENEGOTIATIONS	12
#define SSL_CTRL_GET_FLAGS			13
#define SSL_CTRL_EXTRA_CHAIN_CERT		14

#define SSL_CTRL_SET_MSG_CALLBACK               15
#define SSL_CTRL_SET_MSG_CALLBACK_ARG           16

/* only applies to datagram connections */
#define SSL_CTRL_SET_MTU                17
/* Stats */
#define SSL_CTRL_SESS_NUMBER			20
#define SSL_CTRL_SESS_CONNECT			21
#define SSL_CTRL_SESS_CONNECT_GOOD		22
#define SSL_CTRL_SESS_CONNECT_RENEGOTIATE	23
#define SSL_CTRL_SESS_ACCEPT			24
#define SSL_CTRL_SESS_ACCEPT_GOOD		25
#define SSL_CTRL_SESS_ACCEPT_RENEGOTIATE	26
#define SSL_CTRL_SESS_HIT			27
#define SSL_CTRL_SESS_CB_HIT			28
#define SSL_CTRL_SESS_MISSES			29
#define SSL_CTRL_SESS_TIMEOUTS			30
#define SSL_CTRL_SESS_CACHE_FULL		31
#define SSL_CTRL_OPTIONS			32
#define SSL_CTRL_MODE				33

#define SSL_CTRL_GET_READ_AHEAD			40
#define SSL_CTRL_SET_READ_AHEAD			41
#define SSL_CTRL_SET_SESS_CACHE_SIZE		42
#define SSL_CTRL_GET_SESS_CACHE_SIZE		43
#define SSL_CTRL_SET_SESS_CACHE_MODE		44
#define SSL_CTRL_GET_SESS_CACHE_MODE		45

#define SSL_CTRL_GET_MAX_CERT_LIST		50
#define SSL_CTRL_SET_MAX_CERT_LIST		51

/* see tls1.h for macros based on these */
#ifndef OPENSSL_NO_TLSEXT
#define SSL_CTRL_SET_TLSEXT_SERVERNAME_CB	53
#define SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG	54
#define SSL_CTRL_SET_TLSEXT_HOSTNAME		55
#define SSL_CTRL_SET_TLSEXT_DEBUG_CB		56
#define SSL_CTRL_SET_TLSEXT_DEBUG_ARG		57
#define SSL_CTRL_GET_TLSEXT_TICKET_KEYS		58
#define SSL_CTRL_SET_TLSEXT_TICKET_KEYS		59

#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB	63
#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB_ARG	64
#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_TYPE	65
#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_EXTS	66
#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_EXTS	67
#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_IDS	68
#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_IDS	69
#define SSL_CTRL_GET_TLSEXT_STATUS_REQ_OCSP_RESP	70
#define SSL_CTRL_SET_TLSEXT_STATUS_REQ_OCSP_RESP	71

#define SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB	72
#endif

#define SSL_session_reused(ssl) \
	SSL_ctrl((ssl),SSL_CTRL_GET_SESSION_REUSED,0,NULL)
#define SSL_num_renegotiations(ssl) \
	SSL_ctrl((ssl),SSL_CTRL_GET_NUM_RENEGOTIATIONS,0,NULL)
#define SSL_clear_num_renegotiations(ssl) \
	SSL_ctrl((ssl),SSL_CTRL_CLEAR_NUM_RENEGOTIATIONS,0,NULL)
#define SSL_total_renegotiations(ssl) \
	SSL_ctrl((ssl),SSL_CTRL_GET_TOTAL_RENEGOTIATIONS,0,NULL)

#define SSL_CTX_need_tmp_RSA(ctx) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_NEED_TMP_RSA,0,NULL)
#define SSL_CTX_set_tmp_rsa(ctx,rsa) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_RSA,0,(char *)rsa)
#define SSL_CTX_set_tmp_dh(ctx,dh) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_DH,0,(char *)dh)
#define SSL_CTX_set_tmp_ecdh(ctx,ecdh) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SET_TMP_ECDH,0,(char *)ecdh)

#define SSL_need_tmp_RSA(ssl) \
	SSL_ctrl(ssl,SSL_CTRL_NEED_TMP_RSA,0,NULL)
#define SSL_set_tmp_rsa(ssl,rsa) \
	SSL_ctrl(ssl,SSL_CTRL_SET_TMP_RSA,0,(char *)rsa)
#define SSL_set_tmp_dh(ssl,dh) \
	SSL_ctrl(ssl,SSL_CTRL_SET_TMP_DH,0,(char *)dh)
#define SSL_set_tmp_ecdh(ssl,ecdh) \
	SSL_ctrl(ssl,SSL_CTRL_SET_TMP_ECDH,0,(char *)ecdh)

#define SSL_CTX_add_extra_chain_cert(ctx,x509) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_EXTRA_CHAIN_CERT,0,(char *)x509)

#ifndef OPENSSL_NO_BIO
BIO_METHOD *BIO_f_ssl(void);
BIO *BIO_new_ssl(SSL_CTX *ctx,int client);
BIO *BIO_new_ssl_connect(SSL_CTX *ctx);
BIO *BIO_new_buffer_ssl_connect(SSL_CTX *ctx);
int BIO_ssl_copy_session_id(BIO *to,BIO *from);
void BIO_ssl_shutdown(BIO *ssl_bio);

#endif

int	SSL_CTX_set_cipher_list(SSL_CTX *,const char *str);
SSL_CTX *SSL_CTX_new(SSL_METHOD *meth);
void	SSL_CTX_free(SSL_CTX *);
long SSL_CTX_set_timeout(SSL_CTX *ctx,long t);
long SSL_CTX_get_timeout(const SSL_CTX *ctx);
X509_STORE *SSL_CTX_get_cert_store(const SSL_CTX *);
void SSL_CTX_set_cert_store(SSL_CTX *,X509_STORE *);
int SSL_want(const SSL *s);
int	SSL_clear(SSL *s);

void	SSL_CTX_flush_sessions(SSL_CTX *ctx,long tm);

SSL_CIPHER *SSL_get_current_cipher(const SSL *s);
int	SSL_CIPHER_get_bits(const SSL_CIPHER *c,int *alg_bits);
char *	SSL_CIPHER_get_version(const SSL_CIPHER *c);
const char *	SSL_CIPHER_get_name(const SSL_CIPHER *c);

int	SSL_get_fd(const SSL *s);
int	SSL_get_rfd(const SSL *s);
int	SSL_get_wfd(const SSL *s);
const char  * SSL_get_cipher_list(const SSL *s,int n);
char *	SSL_get_shared_ciphers(const SSL *s, char *buf, int len);
int	SSL_get_read_ahead(const SSL * s);
int	SSL_pending(const SSL *s);
#ifndef OPENSSL_NO_SOCK
int	SSL_set_fd(SSL *s, int fd);
int	SSL_set_rfd(SSL *s, int fd);
int	SSL_set_wfd(SSL *s, int fd);
#endif
#ifndef OPENSSL_NO_BIO
void	SSL_set_bio(SSL *s, BIO *rbio,BIO *wbio);
BIO *	SSL_get_rbio(const SSL *s);
BIO *	SSL_get_wbio(const SSL *s);
#endif
int	SSL_set_cipher_list(SSL *s, const char *str);
void	SSL_set_read_ahead(SSL *s, int yes);
int	SSL_get_verify_mode(const SSL *s);
int	SSL_get_verify_depth(const SSL *s);
int	(*SSL_get_verify_callback(const SSL *s))(int,X509_STORE_CTX *);
void	SSL_set_verify(SSL *s, int mode,
		       int (*callback)(int ok,X509_STORE_CTX *ctx));
void	SSL_set_verify_depth(SSL *s, int depth);
#ifndef OPENSSL_NO_RSA
int	SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa);
#endif
int	SSL_use_RSAPrivateKey_ASN1(SSL *ssl, unsigned char *d, long len);
int	SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey);
int	SSL_use_PrivateKey_ASN1(int pk,SSL *ssl, const unsigned char *d, long len);
int	SSL_use_certificate(SSL *ssl, X509 *x);
int	SSL_use_certificate_ASN1(SSL *ssl, const unsigned char *d, int len);

#ifndef OPENSSL_NO_STDIO
int	SSL_use_RSAPrivateKey_file(SSL *ssl, const char *file, int type);
int	SSL_use_PrivateKey_file(SSL *ssl, const char *file, int type);
int	SSL_use_certificate_file(SSL *ssl, const char *file, int type);
int	SSL_CTX_use_RSAPrivateKey_file(SSL_CTX *ctx, const char *file, int type);
int	SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx, const char *file, int type);
int	SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file, int type);
int	SSL_CTX_use_certificate_chain_file(SSL_CTX *ctx, const char *file); /* PEM type */
STACK_OF(X509_NAME) *SSL_load_client_CA_file(const char *file);
int	SSL_add_file_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs,
					    const char *file);
#ifndef OPENSSL_SYS_VMS
#ifndef OPENSSL_SYS_MACINTOSH_CLASSIC /* XXXXX: Better scheme needed! [was: #ifndef MAC_OS_pre_X] */
int	SSL_add_dir_cert_subjects_to_stack(STACK_OF(X509_NAME) *stackCAs,
					   const char *dir);
#endif
#endif

#endif

void	SSL_load_error_strings(void );
const char *SSL_state_string(const SSL *s);
const char *SSL_rstate_string(const SSL *s);
const char *SSL_state_string_long(const SSL *s);
const char *SSL_rstate_string_long(const SSL *s);
long	SSL_SESSION_get_time(const SSL_SESSION *s);
long	SSL_SESSION_set_time(SSL_SESSION *s, long t);
long	SSL_SESSION_get_timeout(const SSL_SESSION *s);
long	SSL_SESSION_set_timeout(SSL_SESSION *s, long t);
void	SSL_copy_session_id(SSL *to,const SSL *from);

SSL_SESSION *SSL_SESSION_new(void);
unsigned long SSL_SESSION_hash(const SSL_SESSION *a);
int	SSL_SESSION_cmp(const SSL_SESSION *a,const SSL_SESSION *b);
const unsigned char *SSL_SESSION_get_id(const SSL_SESSION *s, unsigned int *len);
#ifndef OPENSSL_NO_FP_API
int	SSL_SESSION_print_fp(FILE *fp,const SSL_SESSION *ses);
#endif
#ifndef OPENSSL_NO_BIO
int	SSL_SESSION_print(BIO *fp,const SSL_SESSION *ses);
#endif
void	SSL_SESSION_free(SSL_SESSION *ses);
int	i2d_SSL_SESSION(SSL_SESSION *in,unsigned char **pp);
int	SSL_set_session(SSL *to, SSL_SESSION *session);
int	SSL_CTX_add_session(SSL_CTX *s, SSL_SESSION *c);
int	SSL_CTX_remove_session(SSL_CTX *,SSL_SESSION *c);
int	SSL_CTX_set_generate_session_id(SSL_CTX *, GEN_SESSION_CB);
int	SSL_set_generate_session_id(SSL *, GEN_SESSION_CB);
int	SSL_has_matching_session_id(const SSL *ssl, const unsigned char *id,
					unsigned int id_len);
SSL_SESSION *d2i_SSL_SESSION(SSL_SESSION **a,const unsigned char **pp,
			     long length);

#ifdef HEADER_X509_H
X509 *	SSL_get_peer_certificate(const SSL *s);
#endif

STACK_OF(X509) *SSL_get_peer_cert_chain(const SSL *s);

int SSL_CTX_get_verify_mode(const SSL_CTX *ctx);
int SSL_CTX_get_verify_depth(const SSL_CTX *ctx);
int (*SSL_CTX_get_verify_callback(const SSL_CTX *ctx))(int,X509_STORE_CTX *);
void SSL_CTX_set_verify(SSL_CTX *ctx,int mode,
			int (*callback)(int, X509_STORE_CTX *));
void SSL_CTX_set_verify_depth(SSL_CTX *ctx,int depth);
void SSL_CTX_set_cert_verify_callback(SSL_CTX *ctx, int (*cb)(X509_STORE_CTX *,void *), void *arg);
#ifndef OPENSSL_NO_RSA
int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa);
#endif
int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const unsigned char *d, long len);
int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey);
int SSL_CTX_use_PrivateKey_ASN1(int pk,SSL_CTX *ctx,
	const unsigned char *d, long len);
int SSL_CTX_use_certificate(SSL_CTX *ctx, X509 *x);
int SSL_CTX_use_certificate_ASN1(SSL_CTX *ctx, int len, const unsigned char *d);

void SSL_CTX_set_default_passwd_cb(SSL_CTX *ctx, pem_password_cb *cb);
void SSL_CTX_set_default_passwd_cb_userdata(SSL_CTX *ctx, void *u);

int SSL_CTX_check_private_key(const SSL_CTX *ctx);
int SSL_check_private_key(const SSL *ctx);

int	SSL_CTX_set_session_id_context(SSL_CTX *ctx,const unsigned char *sid_ctx,
				       unsigned int sid_ctx_len);

SSL *	SSL_new(SSL_CTX *ctx);
int	SSL_set_session_id_context(SSL *ssl,const unsigned char *sid_ctx,
				   unsigned int sid_ctx_len);

int SSL_CTX_set_purpose(SSL_CTX *s, int purpose);
int SSL_set_purpose(SSL *s, int purpose);
int SSL_CTX_set_trust(SSL_CTX *s, int trust);
int SSL_set_trust(SSL *s, int trust);

void	SSL_free(SSL *ssl);
int 	SSL_accept(SSL *ssl);
int 	SSL_connect(SSL *ssl);
int 	SSL_read(SSL *ssl,void *buf,int num);
int 	SSL_peek(SSL *ssl,void *buf,int num);
int 	SSL_write(SSL *ssl,const void *buf,int num);
long	SSL_ctrl(SSL *ssl,int cmd, long larg, void *parg);
long	SSL_callback_ctrl(SSL *, int, void (*)(void));
long	SSL_CTX_ctrl(SSL_CTX *ctx,int cmd, long larg, void *parg);
long	SSL_CTX_callback_ctrl(SSL_CTX *, int, void (*)(void));

int	SSL_get_error(const SSL *s,int ret_code);
const char *SSL_get_version(const SSL *s);

/* This sets the 'default' SSL version that SSL_new() will create */
int SSL_CTX_set_ssl_version(SSL_CTX *ctx,SSL_METHOD *meth);

SSL_METHOD *SSLv2_method(void);		/* SSLv2 */
SSL_METHOD *SSLv2_server_method(void);	/* SSLv2 */
SSL_METHOD *SSLv2_client_method(void);	/* SSLv2 */

SSL_METHOD *SSLv3_method(void);		/* SSLv3 */
SSL_METHOD *SSLv3_server_method(void);	/* SSLv3 */
SSL_METHOD *SSLv3_client_method(void);	/* SSLv3 */

SSL_METHOD *SSLv23_method(void);	/* SSLv3 but can rollback to v2 */
SSL_METHOD *SSLv23_server_method(void);	/* SSLv3 but can rollback to v2 */
SSL_METHOD *SSLv23_client_method(void);	/* SSLv3 but can rollback to v2 */

SSL_METHOD *TLSv1_method(void);		/* TLSv1.0 */
SSL_METHOD *TLSv1_server_method(void);	/* TLSv1.0 */
SSL_METHOD *TLSv1_client_method(void);	/* TLSv1.0 */

SSL_METHOD *DTLSv1_method(void);		/* DTLSv1.0 */
SSL_METHOD *DTLSv1_server_method(void);	/* DTLSv1.0 */
SSL_METHOD *DTLSv1_client_method(void);	/* DTLSv1.0 */

STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL *s);

int SSL_do_handshake(SSL *s);
int SSL_renegotiate(SSL *s);
int SSL_renegotiate_pending(SSL *s);
int SSL_shutdown(SSL *s);

SSL_METHOD *SSL_get_ssl_method(SSL *s);
int SSL_set_ssl_method(SSL *s,SSL_METHOD *method);
const char *SSL_alert_type_string_long(int value);
const char *SSL_alert_type_string(int value);
const char *SSL_alert_desc_string_long(int value);
const char *SSL_alert_desc_string(int value);

void SSL_set_client_CA_list(SSL *s, STACK_OF(X509_NAME) *name_list);
void SSL_CTX_set_client_CA_list(SSL_CTX *ctx, STACK_OF(X509_NAME) *name_list);
STACK_OF(X509_NAME) *SSL_get_client_CA_list(const SSL *s);
STACK_OF(X509_NAME) *SSL_CTX_get_client_CA_list(const SSL_CTX *s);
int SSL_add_client_CA(SSL *ssl,X509 *x);
int SSL_CTX_add_client_CA(SSL_CTX *ctx,X509 *x);

void SSL_set_connect_state(SSL *s);
void SSL_set_accept_state(SSL *s);

long SSL_get_default_timeout(const SSL *s);

int SSL_library_init(void );

char *SSL_CIPHER_description(SSL_CIPHER *,char *buf,int size);
STACK_OF(X509_NAME) *SSL_dup_CA_list(STACK_OF(X509_NAME) *sk);

SSL *SSL_dup(SSL *ssl);

X509 *SSL_get_certificate(const SSL *ssl);
/* EVP_PKEY */ struct evp_pkey_st *SSL_get_privatekey(SSL *ssl);

void SSL_CTX_set_quiet_shutdown(SSL_CTX *ctx,int mode);
int SSL_CTX_get_quiet_shutdown(const SSL_CTX *ctx);
void SSL_set_quiet_shutdown(SSL *ssl,int mode);
int SSL_get_quiet_shutdown(const SSL *ssl);
void SSL_set_shutdown(SSL *ssl,int mode);
int SSL_get_shutdown(const SSL *ssl);
int SSL_version(const SSL *ssl);
int SSL_CTX_set_default_verify_paths(SSL_CTX *ctx);
int SSL_CTX_load_verify_locations(SSL_CTX *ctx, const char *CAfile,
	const char *CApath);
#define SSL_get0_session SSL_get_session /* just peek at pointer */
SSL_SESSION *SSL_get_session(const SSL *ssl);
SSL_SESSION *SSL_get1_session(SSL *ssl); /* obtain a reference count */
SSL_CTX *SSL_get_SSL_CTX(const SSL *ssl);
SSL_CTX *SSL_set_SSL_CTX(SSL *ssl, SSL_CTX* ctx);
void SSL_set_info_callback(SSL *ssl,
			   void (*cb)(const SSL *ssl,int type,int val));
void (*SSL_get_info_callback(const SSL *ssl))(const SSL *ssl,int type,int val);
int SSL_state(const SSL *ssl);

void SSL_set_verify_result(SSL *ssl,long v);
long SSL_get_verify_result(const SSL *ssl);

int SSL_set_ex_data(SSL *ssl,int idx,void *data);
void *SSL_get_ex_data(const SSL *ssl,int idx);
int SSL_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
	CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);

int SSL_SESSION_set_ex_data(SSL_SESSION *ss,int idx,void *data);
void *SSL_SESSION_get_ex_data(const SSL_SESSION *ss,int idx);
int SSL_SESSION_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
	CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);

int SSL_CTX_set_ex_data(SSL_CTX *ssl,int idx,void *data);
void *SSL_CTX_get_ex_data(const SSL_CTX *ssl,int idx);
int SSL_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
	CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);

int SSL_get_ex_data_X509_STORE_CTX_idx(void );

#define SSL_CTX_sess_set_cache_size(ctx,t) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_SIZE,t,NULL)
#define SSL_CTX_sess_get_cache_size(ctx) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_SIZE,0,NULL)
#define SSL_CTX_set_session_cache_mode(ctx,m) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SET_SESS_CACHE_MODE,m,NULL)
#define SSL_CTX_get_session_cache_mode(ctx) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_GET_SESS_CACHE_MODE,0,NULL)

#define SSL_CTX_get_default_read_ahead(ctx) SSL_CTX_get_read_ahead(ctx)
#define SSL_CTX_set_default_read_ahead(ctx,m) SSL_CTX_set_read_ahead(ctx,m)
#define SSL_CTX_get_read_ahead(ctx) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_GET_READ_AHEAD,0,NULL)
#define SSL_CTX_set_read_ahead(ctx,m) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SET_READ_AHEAD,m,NULL)
#define SSL_CTX_get_max_cert_list(ctx) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL)
#define SSL_CTX_set_max_cert_list(ctx,m) \
	SSL_CTX_ctrl(ctx,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL)
#define SSL_get_max_cert_list(ssl) \
	SSL_ctrl(ssl,SSL_CTRL_GET_MAX_CERT_LIST,0,NULL)
#define SSL_set_max_cert_list(ssl,m) \
	SSL_ctrl(ssl,SSL_CTRL_SET_MAX_CERT_LIST,m,NULL)

     /* NB: the keylength is only applicable when is_export is true */
#ifndef OPENSSL_NO_RSA
void SSL_CTX_set_tmp_rsa_callback(SSL_CTX *ctx,
				  RSA *(*cb)(SSL *ssl,int is_export,
					     int keylength));

void SSL_set_tmp_rsa_callback(SSL *ssl,
				  RSA *(*cb)(SSL *ssl,int is_export,
					     int keylength));
#endif
#ifndef OPENSSL_NO_DH
void SSL_CTX_set_tmp_dh_callback(SSL_CTX *ctx,
				 DH *(*dh)(SSL *ssl,int is_export,
					   int keylength));
void SSL_set_tmp_dh_callback(SSL *ssl,
				 DH *(*dh)(SSL *ssl,int is_export,
					   int keylength));
#endif
#ifndef OPENSSL_NO_ECDH
void SSL_CTX_set_tmp_ecdh_callback(SSL_CTX *ctx,
				 EC_KEY *(*ecdh)(SSL *ssl,int is_export,
					   int keylength));
void SSL_set_tmp_ecdh_callback(SSL *ssl,
				 EC_KEY *(*ecdh)(SSL *ssl,int is_export,
					   int keylength));
#endif

#ifndef OPENSSL_NO_COMP
const COMP_METHOD *SSL_get_current_compression(SSL *s);
const COMP_METHOD *SSL_get_current_expansion(SSL *s);
const char *SSL_COMP_get_name(const COMP_METHOD *comp);
STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void);
int SSL_COMP_add_compression_method(int id,COMP_METHOD *cm);
#else
const void *SSL_get_current_compression(SSL *s);
const void *SSL_get_current_expansion(SSL *s);
const char *SSL_COMP_get_name(const void *comp);
void *SSL_COMP_get_compression_methods(void);
int SSL_COMP_add_compression_method(int id,void *cm);
#endif

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_SSL_strings(void);

/* Error codes for the SSL functions. */

/* Function codes. */
#define SSL_F_CLIENT_CERTIFICATE			 100
#define SSL_F_CLIENT_FINISHED				 167
#define SSL_F_CLIENT_HELLO				 101
#define SSL_F_CLIENT_MASTER_KEY				 102
#define SSL_F_D2I_SSL_SESSION				 103
#define SSL_F_DO_DTLS1_WRITE				 245
#define SSL_F_DO_SSL3_WRITE				 104
#define SSL_F_DTLS1_ACCEPT				 246
#define SSL_F_DTLS1_BUFFER_RECORD			 247
#define SSL_F_DTLS1_CLIENT_HELLO			 248
#define SSL_F_DTLS1_CONNECT				 249
#define SSL_F_DTLS1_ENC					 250
#define SSL_F_DTLS1_GET_HELLO_VERIFY			 251
#define SSL_F_DTLS1_GET_MESSAGE				 252
#define SSL_F_DTLS1_GET_MESSAGE_FRAGMENT		 253
#define SSL_F_DTLS1_GET_RECORD				 254
#define SSL_F_DTLS1_OUTPUT_CERT_CHAIN			 255
#define SSL_F_DTLS1_PREPROCESS_FRAGMENT			 277
#define SSL_F_DTLS1_PROCESS_OUT_OF_SEQ_MESSAGE		 256
#define SSL_F_DTLS1_PROCESS_RECORD			 257
#define SSL_F_DTLS1_READ_BYTES				 258
#define SSL_F_DTLS1_READ_FAILED				 259
#define SSL_F_DTLS1_SEND_CERTIFICATE_REQUEST		 260
#define SSL_F_DTLS1_SEND_CLIENT_CERTIFICATE		 261
#define SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE		 262
#define SSL_F_DTLS1_SEND_CLIENT_VERIFY			 263
#define SSL_F_DTLS1_SEND_HELLO_VERIFY_REQUEST		 264
#define SSL_F_DTLS1_SEND_SERVER_CERTIFICATE		 265
#define SSL_F_DTLS1_SEND_SERVER_HELLO			 266
#define SSL_F_DTLS1_SEND_SERVER_KEY_EXCHANGE		 267
#define SSL_F_DTLS1_WRITE_APP_DATA_BYTES		 268
#define SSL_F_GET_CLIENT_FINISHED			 105
#define SSL_F_GET_CLIENT_HELLO				 106
#define SSL_F_GET_CLIENT_MASTER_KEY			 107
#define SSL_F_GET_SERVER_FINISHED			 108
#define SSL_F_GET_SERVER_HELLO				 109
#define SSL_F_GET_SERVER_VERIFY				 110
#define SSL_F_I2D_SSL_SESSION				 111
#define SSL_F_READ_N					 112
#define SSL_F_REQUEST_CERTIFICATE			 113
#define SSL_F_SERVER_FINISH				 239
#define SSL_F_SERVER_HELLO				 114
#define SSL_F_SERVER_VERIFY				 240
#define SSL_F_SSL23_ACCEPT				 115
#define SSL_F_SSL23_CLIENT_HELLO			 116
#define SSL_F_SSL23_CONNECT				 117
#define SSL_F_SSL23_GET_CLIENT_HELLO			 118
#define SSL_F_SSL23_GET_SERVER_HELLO			 119
#define SSL_F_SSL23_PEEK				 237
#define SSL_F_SSL23_READ				 120
#define SSL_F_SSL23_WRITE				 121
#define SSL_F_SSL2_ACCEPT				 122
#define SSL_F_SSL2_CONNECT				 123
#define SSL_F_SSL2_ENC_INIT				 124
#define SSL_F_SSL2_GENERATE_KEY_MATERIAL		 241
#define SSL_F_SSL2_PEEK					 234
#define SSL_F_SSL2_READ					 125
#define SSL_F_SSL2_READ_INTERNAL			 236
#define SSL_F_SSL2_SET_CERTIFICATE			 126
#define SSL_F_SSL2_WRITE				 127
#define SSL_F_SSL3_ACCEPT				 128
#define SSL_F_SSL3_CALLBACK_CTRL			 233
#define SSL_F_SSL3_CHANGE_CIPHER_STATE			 129
#define SSL_F_SSL3_CHECK_CERT_AND_ALGORITHM		 130
#define SSL_F_SSL3_CLIENT_HELLO				 131
#define SSL_F_SSL3_CONNECT				 132
#define SSL_F_SSL3_CTRL					 213
#define SSL_F_SSL3_CTX_CTRL				 133
#define SSL_F_SSL3_DO_CHANGE_CIPHER_SPEC		 279
#define SSL_F_SSL3_ENC					 134
#define SSL_F_SSL3_GENERATE_KEY_BLOCK			 238
#define SSL_F_SSL3_GET_CERTIFICATE_REQUEST		 135
#define SSL_F_SSL3_GET_CERT_STATUS			 288
#define SSL_F_SSL3_GET_CERT_VERIFY			 136
#define SSL_F_SSL3_GET_CLIENT_CERTIFICATE		 137
#define SSL_F_SSL3_GET_CLIENT_HELLO			 138
#define SSL_F_SSL3_GET_CLIENT_KEY_EXCHANGE		 139
#define SSL_F_SSL3_GET_FINISHED				 140
#define SSL_F_SSL3_GET_KEY_EXCHANGE			 141
#define SSL_F_SSL3_GET_MESSAGE				 142
#define SSL_F_SSL3_GET_NEW_SESSION_TICKET		 283
#define SSL_F_SSL3_GET_RECORD				 143
#define SSL_F_SSL3_GET_SERVER_CERTIFICATE		 144
#define SSL_F_SSL3_GET_SERVER_DONE			 145
#define SSL_F_SSL3_GET_SERVER_HELLO			 146
#define SSL_F_SSL3_NEW_SESSION_TICKET			 284
#define SSL_F_SSL3_OUTPUT_CERT_CHAIN			 147
#define SSL_F_SSL3_PEEK					 235
#define SSL_F_SSL3_READ_BYTES				 148
#define SSL_F_SSL3_READ_N				 149
#define SSL_F_SSL3_SEND_CERTIFICATE_REQUEST		 150
#define SSL_F_SSL3_SEND_CLIENT_CERTIFICATE		 151
#define SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE		 152
#define SSL_F_SSL3_SEND_CLIENT_VERIFY			 153
#define SSL_F_SSL3_SEND_SERVER_CERTIFICATE		 154
#define SSL_F_SSL3_SEND_SERVER_HELLO			 242
#define SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE		 155
#define SSL_F_SSL3_SETUP_BUFFERS			 156
#define SSL_F_SSL3_SETUP_KEY_BLOCK			 157
#define SSL_F_SSL3_WRITE_BYTES				 158
#define SSL_F_SSL3_WRITE_PENDING			 159
#define SSL_F_SSL_ADD_CLIENTHELLO_TLSEXT		 272
#define SSL_F_SSL_ADD_DIR_CERT_SUBJECTS_TO_STACK	 215
#define SSL_F_SSL_ADD_FILE_CERT_SUBJECTS_TO_STACK	 216
#define SSL_F_SSL_ADD_SERVERHELLO_TLSEXT		 273
#define SSL_F_SSL_BAD_METHOD				 160
#define SSL_F_SSL_BYTES_TO_CIPHER_LIST			 161
#define SSL_F_SSL_CERT_DUP				 221
#define SSL_F_SSL_CERT_INST				 222
#define SSL_F_SSL_CERT_INSTANTIATE			 214
#define SSL_F_SSL_CERT_NEW				 162
#define SSL_F_SSL_CHECK_PRIVATE_KEY			 163
#define SSL_F_SSL_CHECK_SERVERHELLO_TLSEXT		 274
#define SSL_F_SSL_CIPHER_PROCESS_RULESTR		 230
#define SSL_F_SSL_CIPHER_STRENGTH_SORT			 231
#define SSL_F_SSL_CLEAR					 164
#define SSL_F_SSL_COMP_ADD_COMPRESSION_METHOD		 165
#define SSL_F_SSL_CREATE_CIPHER_LIST			 166
#define SSL_F_SSL_CTRL					 232
#define SSL_F_SSL_CTX_CHECK_PRIVATE_KEY			 168
#define SSL_F_SSL_CTX_NEW				 169
#define SSL_F_SSL_CTX_SET_CIPHER_LIST			 269
#define SSL_F_SSL_CTX_SET_CLIENT_CERT_ENGINE		 278
#define SSL_F_SSL_CTX_SET_PURPOSE			 226
#define SSL_F_SSL_CTX_SET_SESSION_ID_CONTEXT		 219
#define SSL_F_SSL_CTX_SET_SSL_VERSION			 170
#define SSL_F_SSL_CTX_SET_TRUST				 229
#define SSL_F_SSL_CTX_USE_CERTIFICATE			 171
#define SSL_F_SSL_CTX_USE_CERTIFICATE_ASN1		 172
#define SSL_F_SSL_CTX_USE_CERTIFICATE_CHAIN_FILE	 220
#define SSL_F_SSL_CTX_USE_CERTIFICATE_FILE		 173
#define SSL_F_SSL_CTX_USE_PRIVATEKEY			 174
#define SSL_F_SSL_CTX_USE_PRIVATEKEY_ASN1		 175
#define SSL_F_SSL_CTX_USE_PRIVATEKEY_FILE		 176
#define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY			 177
#define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_ASN1		 178
#define SSL_F_SSL_CTX_USE_RSAPRIVATEKEY_FILE		 179
#define SSL_F_SSL_DO_HANDSHAKE				 180
#define SSL_F_SSL_GET_NEW_SESSION			 181
#define SSL_F_SSL_GET_PREV_SESSION			 217
#define SSL_F_SSL_GET_SERVER_SEND_CERT			 182
#define SSL_F_SSL_GET_SIGN_PKEY				 183
#define SSL_F_SSL_INIT_WBIO_BUFFER			 184
#define SSL_F_SSL_LOAD_CLIENT_CA_FILE			 185
#define SSL_F_SSL_NEW					 186
#define SSL_F_SSL_PEEK					 270
#define SSL_F_SSL_PREPARE_CLIENTHELLO_TLSEXT		 275
#define SSL_F_SSL_PREPARE_SERVERHELLO_TLSEXT		 276
#define SSL_F_SSL_READ					 223
#define SSL_F_SSL_RSA_PRIVATE_DECRYPT			 187
#define SSL_F_SSL_RSA_PUBLIC_ENCRYPT			 188
#define SSL_F_SSL_SESSION_NEW				 189
#define SSL_F_SSL_SESSION_PRINT_FP			 190
#define SSL_F_SSL_SESS_CERT_NEW				 225
#define SSL_F_SSL_SET_CERT				 191
#define SSL_F_SSL_SET_CIPHER_LIST			 271
#define SSL_F_SSL_SET_FD				 192
#define SSL_F_SSL_SET_PKEY				 193
#define SSL_F_SSL_SET_PURPOSE				 227
#define SSL_F_SSL_SET_RFD				 194
#define SSL_F_SSL_SET_SESSION				 195
#define SSL_F_SSL_SET_SESSION_ID_CONTEXT		 218
#define SSL_F_SSL_SET_TRUST				 228
#define SSL_F_SSL_SET_WFD				 196
#define SSL_F_SSL_SHUTDOWN				 224
#define SSL_F_SSL_UNDEFINED_CONST_FUNCTION		 243
#define SSL_F_SSL_UNDEFINED_FUNCTION			 197
#define SSL_F_SSL_UNDEFINED_VOID_FUNCTION		 244
#define SSL_F_SSL_USE_CERTIFICATE			 198
#define SSL_F_SSL_USE_CERTIFICATE_ASN1			 199
#define SSL_F_SSL_USE_CERTIFICATE_FILE			 200
#define SSL_F_SSL_USE_PRIVATEKEY			 201
#define SSL_F_SSL_USE_PRIVATEKEY_ASN1			 202
#define SSL_F_SSL_USE_PRIVATEKEY_FILE			 203
#define SSL_F_SSL_USE_RSAPRIVATEKEY			 204
#define SSL_F_SSL_USE_RSAPRIVATEKEY_ASN1		 205
#define SSL_F_SSL_USE_RSAPRIVATEKEY_FILE		 206
#define SSL_F_SSL_VERIFY_CERT_CHAIN			 207
#define SSL_F_SSL_WRITE					 208
#define SSL_F_TLS1_CHANGE_CIPHER_STATE			 209
#define SSL_F_TLS1_ENC					 210
#define SSL_F_TLS1_SETUP_KEY_BLOCK			 211
#define SSL_F_WRITE_PENDING				 212

/* Reason codes. */
#define SSL_R_APP_DATA_IN_HANDSHAKE			 100
#define SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT 272
#define SSL_R_BAD_ALERT_RECORD				 101
#define SSL_R_BAD_AUTHENTICATION_TYPE			 102
#define SSL_R_BAD_CHANGE_CIPHER_SPEC			 103
#define SSL_R_BAD_CHECKSUM				 104
#define SSL_R_BAD_DATA_RETURNED_BY_CALLBACK		 106
#define SSL_R_BAD_DECOMPRESSION				 107
#define SSL_R_BAD_DH_G_LENGTH				 108
#define SSL_R_BAD_DH_PUB_KEY_LENGTH			 109
#define SSL_R_BAD_DH_P_LENGTH				 110
#define SSL_R_BAD_DIGEST_LENGTH				 111
#define SSL_R_BAD_DSA_SIGNATURE				 112
#define SSL_R_BAD_ECC_CERT				 304
#define SSL_R_BAD_ECDSA_SIGNATURE			 305
#define SSL_R_BAD_ECPOINT				 306
#define SSL_R_BAD_HELLO_REQUEST				 105
#define SSL_R_BAD_LENGTH				 271
#define SSL_R_BAD_MAC_DECODE				 113
#define SSL_R_BAD_MESSAGE_TYPE				 114
#define SSL_R_BAD_PACKET_LENGTH				 115
#define SSL_R_BAD_PROTOCOL_VERSION_NUMBER		 116
#define SSL_R_BAD_RESPONSE_ARGUMENT			 117
#define SSL_R_BAD_RSA_DECRYPT				 118
#define SSL_R_BAD_RSA_ENCRYPT				 119
#define SSL_R_BAD_RSA_E_LENGTH				 120
#define SSL_R_BAD_RSA_MODULUS_LENGTH			 121
#define SSL_R_BAD_RSA_SIGNATURE				 122
#define SSL_R_BAD_SIGNATURE				 123
#define SSL_R_BAD_SSL_FILETYPE				 124
#define SSL_R_BAD_SSL_SESSION_ID_LENGTH			 125
#define SSL_R_BAD_STATE					 126
#define SSL_R_BAD_WRITE_RETRY				 127
#define SSL_R_BIO_NOT_SET				 128
#define SSL_R_BLOCK_CIPHER_PAD_IS_WRONG			 129
#define SSL_R_BN_LIB					 130
#define SSL_R_CA_DN_LENGTH_MISMATCH			 131
#define SSL_R_CA_DN_TOO_LONG				 132
#define SSL_R_CCS_RECEIVED_EARLY			 133
#define SSL_R_CERTIFICATE_VERIFY_FAILED			 134
#define SSL_R_CERT_LENGTH_MISMATCH			 135
#define SSL_R_CHALLENGE_IS_DIFFERENT			 136
#define SSL_R_CIPHER_CODE_WRONG_LENGTH			 137
#define SSL_R_CIPHER_OR_HASH_UNAVAILABLE		 138
#define SSL_R_CIPHER_TABLE_SRC_ERROR			 139
#define SSL_R_CLIENTHELLO_TLSEXT			 157
#define SSL_R_COMPRESSED_LENGTH_TOO_LONG		 140
#define SSL_R_COMPRESSION_FAILURE			 141
#define SSL_R_COMPRESSION_ID_NOT_WITHIN_PRIVATE_RANGE	 307
#define SSL_R_COMPRESSION_LIBRARY_ERROR			 142
#define SSL_R_CONNECTION_ID_IS_DIFFERENT		 143
#define SSL_R_CONNECTION_TYPE_NOT_SET			 144
#define SSL_R_COOKIE_MISMATCH				 308
#define SSL_R_DATA_BETWEEN_CCS_AND_FINISHED		 145
#define SSL_R_DATA_LENGTH_TOO_LONG			 146
#define SSL_R_DECRYPTION_FAILED				 147
#define SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC	 281
#define SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG		 148
#define SSL_R_DIGEST_CHECK_FAILED			 149
#define SSL_R_DUPLICATE_COMPRESSION_ID			 309
#define SSL_R_ECGROUP_TOO_LARGE_FOR_CIPHER		 310
#define SSL_R_ENCRYPTED_LENGTH_TOO_LONG			 150
#define SSL_R_ERROR_GENERATING_TMP_RSA_KEY		 282
#define SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST		 151
#define SSL_R_EXCESSIVE_MESSAGE_SIZE			 152
#define SSL_R_EXTRA_DATA_IN_MESSAGE			 153
#define SSL_R_GOT_A_FIN_BEFORE_A_CCS			 154
#define SSL_R_HTTPS_PROXY_REQUEST			 155
#define SSL_R_HTTP_REQUEST				 156
#define SSL_R_ILLEGAL_PADDING				 283
#define SSL_R_INVALID_CHALLENGE_LENGTH			 158
#define SSL_R_INVALID_COMMAND				 280
#define SSL_R_INVALID_PURPOSE				 278
#define SSL_R_INVALID_STATUS_RESPONSE			 316
#define SSL_R_INVALID_TICKET_KEYS_LENGTH		 275
#define SSL_R_INVALID_TRUST				 279
#define SSL_R_KEY_ARG_TOO_LONG				 284
#define SSL_R_KRB5					 285
#define SSL_R_KRB5_C_CC_PRINC				 286
#define SSL_R_KRB5_C_GET_CRED				 287
#define SSL_R_KRB5_C_INIT				 288
#define SSL_R_KRB5_C_MK_REQ				 289
#define SSL_R_KRB5_S_BAD_TICKET				 290
#define SSL_R_KRB5_S_INIT				 291
#define SSL_R_KRB5_S_RD_REQ				 292
#define SSL_R_KRB5_S_TKT_EXPIRED			 293
#define SSL_R_KRB5_S_TKT_NYV				 294
#define SSL_R_KRB5_S_TKT_SKEW				 295
#define SSL_R_LENGTH_MISMATCH				 159
#define SSL_R_LENGTH_TOO_SHORT				 160
#define SSL_R_LIBRARY_BUG				 274
#define SSL_R_LIBRARY_HAS_NO_CIPHERS			 161
#define SSL_R_MESSAGE_TOO_LONG				 296
#define SSL_R_MISSING_DH_DSA_CERT			 162
#define SSL_R_MISSING_DH_KEY				 163
#define SSL_R_MISSING_DH_RSA_CERT			 164
#define SSL_R_MISSING_DSA_SIGNING_CERT			 165
#define SSL_R_MISSING_EXPORT_TMP_DH_KEY			 166
#define SSL_R_MISSING_EXPORT_TMP_RSA_KEY		 167
#define SSL_R_MISSING_RSA_CERTIFICATE			 168
#define SSL_R_MISSING_RSA_ENCRYPTING_CERT		 169
#define SSL_R_MISSING_RSA_SIGNING_CERT			 170
#define SSL_R_MISSING_TMP_DH_KEY			 171
#define SSL_R_MISSING_TMP_ECDH_KEY			 311
#define SSL_R_MISSING_TMP_RSA_KEY			 172
#define SSL_R_MISSING_TMP_RSA_PKEY			 173
#define SSL_R_MISSING_VERIFY_MESSAGE			 174
#define SSL_R_NON_SSLV2_INITIAL_PACKET			 175
#define SSL_R_NO_CERTIFICATES_RETURNED			 176
#define SSL_R_NO_CERTIFICATE_ASSIGNED			 177
#define SSL_R_NO_CERTIFICATE_RETURNED			 178
#define SSL_R_NO_CERTIFICATE_SET			 179
#define SSL_R_NO_CERTIFICATE_SPECIFIED			 180
#define SSL_R_NO_CIPHERS_AVAILABLE			 181
#define SSL_R_NO_CIPHERS_PASSED				 182
#define SSL_R_NO_CIPHERS_SPECIFIED			 183
#define SSL_R_NO_CIPHER_LIST				 184
#define SSL_R_NO_CIPHER_MATCH				 185
#define SSL_R_NO_CLIENT_CERT_METHOD			 317
#define SSL_R_NO_CLIENT_CERT_RECEIVED			 186
#define SSL_R_NO_COMPRESSION_SPECIFIED			 187
#define SSL_R_NO_METHOD_SPECIFIED			 188
#define SSL_R_NO_PRIVATEKEY				 189
#define SSL_R_NO_PRIVATE_KEY_ASSIGNED			 190
#define SSL_R_NO_PROTOCOLS_AVAILABLE			 191
#define SSL_R_NO_PUBLICKEY				 192
#define SSL_R_NO_RENEGOTIATION				 318
#define SSL_R_NO_SHARED_CIPHER				 193
#define SSL_R_NO_VERIFY_CALLBACK			 194
#define SSL_R_NULL_SSL_CTX				 195
#define SSL_R_NULL_SSL_METHOD_PASSED			 196
#define SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED		 197
#define SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE		 297
#define SSL_R_PACKET_LENGTH_TOO_LONG			 198
#define SSL_R_PARSE_TLSEXT				 223
#define SSL_R_PATH_TOO_LONG				 270
#define SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE		 199
#define SSL_R_PEER_ERROR				 200
#define SSL_R_PEER_ERROR_CERTIFICATE			 201
#define SSL_R_PEER_ERROR_NO_CERTIFICATE			 202
#define SSL_R_PEER_ERROR_NO_CIPHER			 203
#define SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE	 204
#define SSL_R_PRE_MAC_LENGTH_TOO_LONG			 205
#define SSL_R_PROBLEMS_MAPPING_CIPHER_FUNCTIONS		 206
#define SSL_R_PROTOCOL_IS_SHUTDOWN			 207
#define SSL_R_PUBLIC_KEY_ENCRYPT_ERROR			 208
#define SSL_R_PUBLIC_KEY_IS_NOT_RSA			 209
#define SSL_R_PUBLIC_KEY_NOT_RSA			 210
#define SSL_R_READ_BIO_NOT_SET				 211
#define SSL_R_READ_TIMEOUT_EXPIRED			 312
#define SSL_R_READ_WRONG_PACKET_TYPE			 212
#define SSL_R_RECORD_LENGTH_MISMATCH			 213
#define SSL_R_RECORD_TOO_LARGE				 214
#define SSL_R_RECORD_TOO_SMALL				 298
#define SSL_R_REQUIRED_CIPHER_MISSING			 215
#define SSL_R_REUSE_CERT_LENGTH_NOT_ZERO		 216
#define SSL_R_REUSE_CERT_TYPE_NOT_ZERO			 217
#define SSL_R_REUSE_CIPHER_LIST_NOT_ZERO		 218
#define SSL_R_SERVERHELLO_TLSEXT			 224
#define SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED		 277
#define SSL_R_SHORT_READ				 219
#define SSL_R_SIGNATURE_FOR_NON_SIGNING_CERTIFICATE	 220
#define SSL_R_SSL23_DOING_SESSION_ID_REUSE		 221
#define SSL_R_SSL2_CONNECTION_ID_TOO_LONG		 299
#define SSL_R_SSL3_EXT_INVALID_SERVERNAME		 225
#define SSL_R_SSL3_EXT_INVALID_SERVERNAME_TYPE		 226
#define SSL_R_SSL3_SESSION_ID_TOO_LONG			 300
#define SSL_R_SSL3_SESSION_ID_TOO_SHORT			 222
#define SSL_R_SSLV3_ALERT_BAD_CERTIFICATE		 1042
#define SSL_R_SSLV3_ALERT_BAD_RECORD_MAC		 1020
#define SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED		 1045
#define SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED		 1044
#define SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN		 1046
#define SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE		 1030
#define SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE		 1040
#define SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER		 1047
#define SSL_R_SSLV3_ALERT_NO_CERTIFICATE		 1041
#define SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE		 1010
#define SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE	 1043
#define SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION	 228
#define SSL_R_SSL_HANDSHAKE_FAILURE			 229
#define SSL_R_SSL_LIBRARY_HAS_NO_CIPHERS		 230
#define SSL_R_SSL_SESSION_ID_CALLBACK_FAILED		 301
#define SSL_R_SSL_SESSION_ID_CONFLICT			 302
#define SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG		 273
#define SSL_R_SSL_SESSION_ID_HAS_BAD_LENGTH		 303
#define SSL_R_SSL_SESSION_ID_IS_DIFFERENT		 231
#define SSL_R_TLSV1_ALERT_ACCESS_DENIED			 1049
#define SSL_R_TLSV1_ALERT_DECODE_ERROR			 1050
#define SSL_R_TLSV1_ALERT_DECRYPTION_FAILED		 1021
#define SSL_R_TLSV1_ALERT_DECRYPT_ERROR			 1051
#define SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION		 1060
#define SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY		 1071
#define SSL_R_TLSV1_ALERT_INTERNAL_ERROR		 1080
#define SSL_R_TLSV1_ALERT_NO_RENEGOTIATION		 1100
#define SSL_R_TLSV1_ALERT_PROTOCOL_VERSION		 1070
#define SSL_R_TLSV1_ALERT_RECORD_OVERFLOW		 1022
#define SSL_R_TLSV1_ALERT_UNKNOWN_CA			 1048
#define SSL_R_TLSV1_ALERT_USER_CANCELLED		 1090
#define SSL_R_TLS_CLIENT_CERT_REQ_WITH_ANON_CIPHER	 232
#define SSL_R_TLS_INVALID_ECPOINTFORMAT_LIST		 227
#define SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST 233
#define SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG	 234
#define SSL_R_TRIED_TO_USE_UNSUPPORTED_CIPHER		 235
#define SSL_R_UNABLE_TO_DECODE_DH_CERTS			 236
#define SSL_R_UNABLE_TO_DECODE_ECDH_CERTS		 313
#define SSL_R_UNABLE_TO_EXTRACT_PUBLIC_KEY		 237
#define SSL_R_UNABLE_TO_FIND_DH_PARAMETERS		 238
#define SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS		 314
#define SSL_R_UNABLE_TO_FIND_PUBLIC_KEY_PARAMETERS	 239
#define SSL_R_UNABLE_TO_FIND_SSL_METHOD			 240
#define SSL_R_UNABLE_TO_LOAD_SSL2_MD5_ROUTINES		 241
#define SSL_R_UNABLE_TO_LOAD_SSL3_MD5_ROUTINES		 242
#define SSL_R_UNABLE_TO_LOAD_SSL3_SHA1_ROUTINES		 243
#define SSL_R_UNEXPECTED_MESSAGE			 244
#define SSL_R_UNEXPECTED_RECORD				 245
#define SSL_R_UNINITIALIZED				 276
#define SSL_R_UNKNOWN_ALERT_TYPE			 246
#define SSL_R_UNKNOWN_CERTIFICATE_TYPE			 247
#define SSL_R_UNKNOWN_CIPHER_RETURNED			 248
#define SSL_R_UNKNOWN_CIPHER_TYPE			 249
#define SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE			 250
#define SSL_R_UNKNOWN_PKEY_TYPE				 251
#define SSL_R_UNKNOWN_PROTOCOL				 252
#define SSL_R_UNKNOWN_REMOTE_ERROR_TYPE			 253
#define SSL_R_UNKNOWN_SSL_VERSION			 254
#define SSL_R_UNKNOWN_STATE				 255
#define SSL_R_UNSUPPORTED_CIPHER			 256
#define SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM		 257
#define SSL_R_UNSUPPORTED_ELLIPTIC_CURVE		 315
#define SSL_R_UNSUPPORTED_PROTOCOL			 258
#define SSL_R_UNSUPPORTED_SSL_VERSION			 259
#define SSL_R_UNSUPPORTED_STATUS_TYPE			 329
#define SSL_R_WRITE_BIO_NOT_SET				 260
#define SSL_R_WRONG_CIPHER_RETURNED			 261
#define SSL_R_WRONG_MESSAGE_TYPE			 262
#define SSL_R_WRONG_NUMBER_OF_KEY_BITS			 263
#define SSL_R_WRONG_SIGNATURE_LENGTH			 264
#define SSL_R_WRONG_SIGNATURE_SIZE			 265
#define SSL_R_WRONG_SSL_VERSION				 266
#define SSL_R_WRONG_VERSION_NUMBER			 267
#define SSL_R_X509_LIB					 268
#define SSL_R_X509_VERIFICATION_SETUP_PROBLEMS		 269

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/asn1.h0000755000175000017500000013720511341640430017643 0ustar  davidedavide/* crypto/asn1/asn1.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_ASN1_H
#define HEADER_ASN1_H

#include 
#include 
#ifndef OPENSSL_NO_BIO
#include 
#endif
#include 
#include 

#include 

#include 
#ifndef OPENSSL_NO_DEPRECATED
#include 
#endif

#ifdef OPENSSL_BUILD_SHLIBCRYPTO
# undef OPENSSL_EXTERN
# define OPENSSL_EXTERN OPENSSL_EXPORT
#endif

#ifdef  __cplusplus
extern "C" {
#endif

#define V_ASN1_UNIVERSAL		0x00
#define	V_ASN1_APPLICATION		0x40
#define V_ASN1_CONTEXT_SPECIFIC		0x80
#define V_ASN1_PRIVATE			0xc0

#define V_ASN1_CONSTRUCTED		0x20
#define V_ASN1_PRIMITIVE_TAG		0x1f
#define V_ASN1_PRIMATIVE_TAG		0x1f

#define V_ASN1_APP_CHOOSE		-2	/* let the recipient choose */
#define V_ASN1_OTHER			-3	/* used in ASN1_TYPE */
#define V_ASN1_ANY			-4	/* used in ASN1 template code */

#define V_ASN1_NEG			0x100	/* negative flag */

#define V_ASN1_UNDEF			-1
#define V_ASN1_EOC			0
#define V_ASN1_BOOLEAN			1	/**/
#define V_ASN1_INTEGER			2
#define V_ASN1_NEG_INTEGER		(2 | V_ASN1_NEG)
#define V_ASN1_BIT_STRING		3
#define V_ASN1_OCTET_STRING		4
#define V_ASN1_NULL			5
#define V_ASN1_OBJECT			6
#define V_ASN1_OBJECT_DESCRIPTOR	7
#define V_ASN1_EXTERNAL			8
#define V_ASN1_REAL			9
#define V_ASN1_ENUMERATED		10
#define V_ASN1_NEG_ENUMERATED		(10 | V_ASN1_NEG)
#define V_ASN1_UTF8STRING		12
#define V_ASN1_SEQUENCE			16
#define V_ASN1_SET			17
#define V_ASN1_NUMERICSTRING		18	/**/
#define V_ASN1_PRINTABLESTRING		19
#define V_ASN1_T61STRING		20
#define V_ASN1_TELETEXSTRING		20	/* alias */
#define V_ASN1_VIDEOTEXSTRING		21	/**/
#define V_ASN1_IA5STRING		22
#define V_ASN1_UTCTIME			23
#define V_ASN1_GENERALIZEDTIME		24	/**/
#define V_ASN1_GRAPHICSTRING		25	/**/
#define V_ASN1_ISO64STRING		26	/**/
#define V_ASN1_VISIBLESTRING		26	/* alias */
#define V_ASN1_GENERALSTRING		27	/**/
#define V_ASN1_UNIVERSALSTRING		28	/**/
#define V_ASN1_BMPSTRING		30

/* For use with d2i_ASN1_type_bytes() */
#define B_ASN1_NUMERICSTRING	0x0001
#define B_ASN1_PRINTABLESTRING	0x0002
#define B_ASN1_T61STRING	0x0004
#define B_ASN1_TELETEXSTRING	0x0004
#define B_ASN1_VIDEOTEXSTRING	0x0008
#define B_ASN1_IA5STRING	0x0010
#define B_ASN1_GRAPHICSTRING	0x0020
#define B_ASN1_ISO64STRING	0x0040
#define B_ASN1_VISIBLESTRING	0x0040
#define B_ASN1_GENERALSTRING	0x0080
#define B_ASN1_UNIVERSALSTRING	0x0100
#define B_ASN1_OCTET_STRING	0x0200
#define B_ASN1_BIT_STRING	0x0400
#define B_ASN1_BMPSTRING	0x0800
#define B_ASN1_UNKNOWN		0x1000
#define B_ASN1_UTF8STRING	0x2000
#define B_ASN1_UTCTIME		0x4000
#define B_ASN1_GENERALIZEDTIME	0x8000
#define B_ASN1_SEQUENCE		0x10000

/* For use with ASN1_mbstring_copy() */
#define MBSTRING_FLAG		0x1000
#define MBSTRING_UTF8		(MBSTRING_FLAG)
#define MBSTRING_ASC		(MBSTRING_FLAG|1)
#define MBSTRING_BMP		(MBSTRING_FLAG|2)
#define MBSTRING_UNIV		(MBSTRING_FLAG|4)

#define SMIME_OLDMIME		0x400
#define SMIME_CRLFEOL		0x800
#define SMIME_STREAM		0x1000

struct X509_algor_st;
DECLARE_STACK_OF(X509_ALGOR)

#define DECLARE_ASN1_SET_OF(type) /* filled in by mkstack.pl */
#define IMPLEMENT_ASN1_SET_OF(type) /* nothing, no longer needed */

/* We MUST make sure that, except for constness, asn1_ctx_st and
   asn1_const_ctx are exactly the same.  Fortunately, as soon as
   the old ASN1 parsing macros are gone, we can throw this away
   as well... */
typedef struct asn1_ctx_st
	{
	unsigned char *p;/* work char pointer */
	int eos;	/* end of sequence read for indefinite encoding */
	int error;	/* error code to use when returning an error */
	int inf;	/* constructed if 0x20, indefinite is 0x21 */
	int tag;	/* tag from last 'get object' */
	int xclass;	/* class from last 'get object' */
	long slen;	/* length of last 'get object' */
	unsigned char *max; /* largest value of p allowed */
	unsigned char *q;/* temporary variable */
	unsigned char **pp;/* variable */
	int line;	/* used in error processing */
	} ASN1_CTX;

typedef struct asn1_const_ctx_st
	{
	const unsigned char *p;/* work char pointer */
	int eos;	/* end of sequence read for indefinite encoding */
	int error;	/* error code to use when returning an error */
	int inf;	/* constructed if 0x20, indefinite is 0x21 */
	int tag;	/* tag from last 'get object' */
	int xclass;	/* class from last 'get object' */
	long slen;	/* length of last 'get object' */
	const unsigned char *max; /* largest value of p allowed */
	const unsigned char *q;/* temporary variable */
	const unsigned char **pp;/* variable */
	int line;	/* used in error processing */
	} ASN1_const_CTX;

/* These are used internally in the ASN1_OBJECT to keep track of
 * whether the names and data need to be free()ed */
#define ASN1_OBJECT_FLAG_DYNAMIC	 0x01	/* internal use */
#define ASN1_OBJECT_FLAG_CRITICAL	 0x02	/* critical x509v3 object id */
#define ASN1_OBJECT_FLAG_DYNAMIC_STRINGS 0x04	/* internal use */
#define ASN1_OBJECT_FLAG_DYNAMIC_DATA 	 0x08	/* internal use */
typedef struct asn1_object_st
	{
	const char *sn,*ln;
	int nid;
	int length;
	unsigned char *data;
	int flags;	/* Should we free this one */
	} ASN1_OBJECT;

#define ASN1_STRING_FLAG_BITS_LEFT 0x08 /* Set if 0x07 has bits left value */
/* This indicates that the ASN1_STRING is not a real value but just a place
 * holder for the location where indefinite length constructed data should
 * be inserted in the memory buffer 
 */
#define ASN1_STRING_FLAG_NDEF 0x010 

/* This flag is used by the CMS code to indicate that a string is not
 * complete and is a place holder for content when it had all been 
 * accessed. The flag will be reset when content has been written to it.
 */
#define ASN1_STRING_FLAG_CONT 0x020 

/* This is the base type that holds just about everything :-) */
typedef struct asn1_string_st
	{
	int length;
	int type;
	unsigned char *data;
	/* The value of the following field depends on the type being
	 * held.  It is mostly being used for BIT_STRING so if the
	 * input data has a non-zero 'unused bits' value, it will be
	 * handled correctly */
	long flags;
	} ASN1_STRING;

/* ASN1_ENCODING structure: this is used to save the received
 * encoding of an ASN1 type. This is useful to get round
 * problems with invalid encodings which can break signatures.
 */

typedef struct ASN1_ENCODING_st
	{
	unsigned char *enc;	/* DER encoding */
	long len;		/* Length of encoding */
	int modified;		 /* set to 1 if 'enc' is invalid */
	} ASN1_ENCODING;

/* Used with ASN1 LONG type: if a long is set to this it is omitted */
#define ASN1_LONG_UNDEF	0x7fffffffL

#define STABLE_FLAGS_MALLOC	0x01
#define STABLE_NO_MASK		0x02
#define DIRSTRING_TYPE	\
 (B_ASN1_PRINTABLESTRING|B_ASN1_T61STRING|B_ASN1_BMPSTRING|B_ASN1_UTF8STRING)
#define PKCS9STRING_TYPE (DIRSTRING_TYPE|B_ASN1_IA5STRING)

typedef struct asn1_string_table_st {
	int nid;
	long minsize;
	long maxsize;
	unsigned long mask;
	unsigned long flags;
} ASN1_STRING_TABLE;

DECLARE_STACK_OF(ASN1_STRING_TABLE)

/* size limits: this stuff is taken straight from RFC2459 */

#define ub_name				32768
#define ub_common_name			64
#define ub_locality_name		128
#define ub_state_name			128
#define ub_organization_name		64
#define ub_organization_unit_name	64
#define ub_title			64
#define ub_email_address		128

/* Declarations for template structures: for full definitions
 * see asn1t.h
 */
typedef struct ASN1_TEMPLATE_st ASN1_TEMPLATE;
typedef struct ASN1_ITEM_st ASN1_ITEM;
typedef struct ASN1_TLC_st ASN1_TLC;
/* This is just an opaque pointer */
typedef struct ASN1_VALUE_st ASN1_VALUE;

/* Declare ASN1 functions: the implement macro in in asn1t.h */

#define DECLARE_ASN1_FUNCTIONS(type) DECLARE_ASN1_FUNCTIONS_name(type, type)

#define DECLARE_ASN1_ALLOC_FUNCTIONS(type) \
	DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, type)

#define DECLARE_ASN1_FUNCTIONS_name(type, name) \
	DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \
	DECLARE_ASN1_ENCODE_FUNCTIONS(type, name, name)

#define DECLARE_ASN1_FUNCTIONS_fname(type, itname, name) \
	DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \
	DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name)

#define	DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) \
	type *d2i_##name(type **a, const unsigned char **in, long len); \
	int i2d_##name(type *a, unsigned char **out); \
	DECLARE_ASN1_ITEM(itname)

#define	DECLARE_ASN1_ENCODE_FUNCTIONS_const(type, name) \
	type *d2i_##name(type **a, const unsigned char **in, long len); \
	int i2d_##name(const type *a, unsigned char **out); \
	DECLARE_ASN1_ITEM(name)

#define	DECLARE_ASN1_NDEF_FUNCTION(name) \
	int i2d_##name##_NDEF(name *a, unsigned char **out);

#define DECLARE_ASN1_FUNCTIONS_const(name) \
	DECLARE_ASN1_ALLOC_FUNCTIONS(name) \
	DECLARE_ASN1_ENCODE_FUNCTIONS_const(name, name)

#define DECLARE_ASN1_ALLOC_FUNCTIONS_name(type, name) \
	type *name##_new(void); \
	void name##_free(type *a);

#define D2I_OF(type) type *(*)(type **,const unsigned char **,long)
#define I2D_OF(type) int (*)(type *,unsigned char **)
#define I2D_OF_const(type) int (*)(const type *,unsigned char **)

#define CHECKED_D2I_OF(type, d2i) \
    ((d2i_of_void*) (1 ? d2i : ((D2I_OF(type))0)))
#define CHECKED_I2D_OF(type, i2d) \
    ((i2d_of_void*) (1 ? i2d : ((I2D_OF(type))0)))
#define CHECKED_NEW_OF(type, xnew) \
    ((void *(*)(void)) (1 ? xnew : ((type *(*)(void))0)))
#define CHECKED_PTR_OF(type, p) \
    ((void*) (1 ? p : (type*)0))
#define CHECKED_PPTR_OF(type, p) \
    ((void**) (1 ? p : (type**)0))

#define TYPEDEF_D2I_OF(type) typedef type *d2i_of_##type(type **,const unsigned char **,long)
#define TYPEDEF_I2D_OF(type) typedef int i2d_of_##type(type *,unsigned char **)
#define TYPEDEF_D2I2D_OF(type) TYPEDEF_D2I_OF(type); TYPEDEF_I2D_OF(type)

TYPEDEF_D2I2D_OF(void);

/* The following macros and typedefs allow an ASN1_ITEM
 * to be embedded in a structure and referenced. Since
 * the ASN1_ITEM pointers need to be globally accessible
 * (possibly from shared libraries) they may exist in
 * different forms. On platforms that support it the
 * ASN1_ITEM structure itself will be globally exported.
 * Other platforms will export a function that returns
 * an ASN1_ITEM pointer.
 *
 * To handle both cases transparently the macros below
 * should be used instead of hard coding an ASN1_ITEM
 * pointer in a structure.
 *
 * The structure will look like this:
 *
 * typedef struct SOMETHING_st {
 *      ...
 *      ASN1_ITEM_EXP *iptr;
 *      ...
 * } SOMETHING; 
 *
 * It would be initialised as e.g.:
 *
 * SOMETHING somevar = {...,ASN1_ITEM_ref(X509),...};
 *
 * and the actual pointer extracted with:
 *
 * const ASN1_ITEM *it = ASN1_ITEM_ptr(somevar.iptr);
 *
 * Finally an ASN1_ITEM pointer can be extracted from an
 * appropriate reference with: ASN1_ITEM_rptr(X509). This
 * would be used when a function takes an ASN1_ITEM * argument.
 *
 */

#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION

/* ASN1_ITEM pointer exported type */
typedef const ASN1_ITEM ASN1_ITEM_EXP;

/* Macro to obtain ASN1_ITEM pointer from exported type */
#define ASN1_ITEM_ptr(iptr) (iptr)

/* Macro to include ASN1_ITEM pointer from base type */
#define ASN1_ITEM_ref(iptr) (&(iptr##_it))

#define ASN1_ITEM_rptr(ref) (&(ref##_it))

#define DECLARE_ASN1_ITEM(name) \
	OPENSSL_EXTERN const ASN1_ITEM name##_it;

#else

/* Platforms that can't easily handle shared global variables are declared
 * as functions returning ASN1_ITEM pointers.
 */

/* ASN1_ITEM pointer exported type */
typedef const ASN1_ITEM * ASN1_ITEM_EXP(void);

/* Macro to obtain ASN1_ITEM pointer from exported type */
#define ASN1_ITEM_ptr(iptr) (iptr())

/* Macro to include ASN1_ITEM pointer from base type */
#define ASN1_ITEM_ref(iptr) (iptr##_it)

#define ASN1_ITEM_rptr(ref) (ref##_it())

#define DECLARE_ASN1_ITEM(name) \
	const ASN1_ITEM * name##_it(void);

#endif

/* Parameters used by ASN1_STRING_print_ex() */

/* These determine which characters to escape:
 * RFC2253 special characters, control characters and
 * MSB set characters
 */

#define ASN1_STRFLGS_ESC_2253		1
#define ASN1_STRFLGS_ESC_CTRL		2
#define ASN1_STRFLGS_ESC_MSB		4


/* This flag determines how we do escaping: normally
 * RC2253 backslash only, set this to use backslash and
 * quote.
 */

#define ASN1_STRFLGS_ESC_QUOTE		8


/* These three flags are internal use only. */

/* Character is a valid PrintableString character */
#define CHARTYPE_PRINTABLESTRING	0x10
/* Character needs escaping if it is the first character */
#define CHARTYPE_FIRST_ESC_2253		0x20
/* Character needs escaping if it is the last character */
#define CHARTYPE_LAST_ESC_2253		0x40

/* NB the internal flags are safely reused below by flags
 * handled at the top level.
 */

/* If this is set we convert all character strings
 * to UTF8 first 
 */

#define ASN1_STRFLGS_UTF8_CONVERT	0x10

/* If this is set we don't attempt to interpret content:
 * just assume all strings are 1 byte per character. This
 * will produce some pretty odd looking output!
 */

#define ASN1_STRFLGS_IGNORE_TYPE	0x20

/* If this is set we include the string type in the output */
#define ASN1_STRFLGS_SHOW_TYPE		0x40

/* This determines which strings to display and which to
 * 'dump' (hex dump of content octets or DER encoding). We can
 * only dump non character strings or everything. If we
 * don't dump 'unknown' they are interpreted as character
 * strings with 1 octet per character and are subject to
 * the usual escaping options.
 */

#define ASN1_STRFLGS_DUMP_ALL		0x80
#define ASN1_STRFLGS_DUMP_UNKNOWN	0x100

/* These determine what 'dumping' does, we can dump the
 * content octets or the DER encoding: both use the
 * RFC2253 #XXXXX notation.
 */

#define ASN1_STRFLGS_DUMP_DER		0x200

/* All the string flags consistent with RFC2253,
 * escaping control characters isn't essential in
 * RFC2253 but it is advisable anyway.
 */

#define ASN1_STRFLGS_RFC2253	(ASN1_STRFLGS_ESC_2253 | \
				ASN1_STRFLGS_ESC_CTRL | \
				ASN1_STRFLGS_ESC_MSB | \
				ASN1_STRFLGS_UTF8_CONVERT | \
				ASN1_STRFLGS_DUMP_UNKNOWN | \
				ASN1_STRFLGS_DUMP_DER)

DECLARE_STACK_OF(ASN1_INTEGER)
DECLARE_ASN1_SET_OF(ASN1_INTEGER)

DECLARE_STACK_OF(ASN1_GENERALSTRING)

typedef struct asn1_type_st
	{
	int type;
	union	{
		char *ptr;
		ASN1_BOOLEAN		boolean;
		ASN1_STRING *		asn1_string;
		ASN1_OBJECT *		object;
		ASN1_INTEGER *		integer;
		ASN1_ENUMERATED *	enumerated;
		ASN1_BIT_STRING *	bit_string;
		ASN1_OCTET_STRING *	octet_string;
		ASN1_PRINTABLESTRING *	printablestring;
		ASN1_T61STRING *	t61string;
		ASN1_IA5STRING *	ia5string;
		ASN1_GENERALSTRING *	generalstring;
		ASN1_BMPSTRING *	bmpstring;
		ASN1_UNIVERSALSTRING *	universalstring;
		ASN1_UTCTIME *		utctime;
		ASN1_GENERALIZEDTIME *	generalizedtime;
		ASN1_VISIBLESTRING *	visiblestring;
		ASN1_UTF8STRING *	utf8string;
		/* set and sequence are left complete and still
		 * contain the set or sequence bytes */
		ASN1_STRING *		set;
		ASN1_STRING *		sequence;
		ASN1_VALUE  *		asn1_value;
		} value;
	} ASN1_TYPE;

DECLARE_STACK_OF(ASN1_TYPE)
DECLARE_ASN1_SET_OF(ASN1_TYPE)

typedef struct asn1_method_st
	{
	i2d_of_void *i2d;
	d2i_of_void *d2i;
	void *(*create)(void);
	void (*destroy)(void *);
	} ASN1_METHOD;

/* This is used when parsing some Netscape objects */
typedef struct asn1_header_st
	{
	ASN1_OCTET_STRING *header;
	void *data;
	ASN1_METHOD *meth;
	} ASN1_HEADER;

/* This is used to contain a list of bit names */
typedef struct BIT_STRING_BITNAME_st {
	int bitnum;
	const char *lname;
	const char *sname;
} BIT_STRING_BITNAME;


#define M_ASN1_STRING_length(x)	((x)->length)
#define M_ASN1_STRING_length_set(x, n)	((x)->length = (n))
#define M_ASN1_STRING_type(x)	((x)->type)
#define M_ASN1_STRING_data(x)	((x)->data)

/* Macros for string operations */
#define M_ASN1_BIT_STRING_new()	(ASN1_BIT_STRING *)\
		ASN1_STRING_type_new(V_ASN1_BIT_STRING)
#define M_ASN1_BIT_STRING_free(a)	ASN1_STRING_free((ASN1_STRING *)a)
#define M_ASN1_BIT_STRING_dup(a) (ASN1_BIT_STRING *)\
		ASN1_STRING_dup((ASN1_STRING *)a)
#define M_ASN1_BIT_STRING_cmp(a,b) ASN1_STRING_cmp(\
		(ASN1_STRING *)a,(ASN1_STRING *)b)
#define M_ASN1_BIT_STRING_set(a,b,c) ASN1_STRING_set((ASN1_STRING *)a,b,c)

#define M_ASN1_INTEGER_new()	(ASN1_INTEGER *)\
		ASN1_STRING_type_new(V_ASN1_INTEGER)
#define M_ASN1_INTEGER_free(a)		ASN1_STRING_free((ASN1_STRING *)a)
#define M_ASN1_INTEGER_dup(a) (ASN1_INTEGER *)ASN1_STRING_dup((ASN1_STRING *)a)
#define M_ASN1_INTEGER_cmp(a,b)	ASN1_STRING_cmp(\
		(ASN1_STRING *)a,(ASN1_STRING *)b)

#define M_ASN1_ENUMERATED_new()	(ASN1_ENUMERATED *)\
		ASN1_STRING_type_new(V_ASN1_ENUMERATED)
#define M_ASN1_ENUMERATED_free(a)	ASN1_STRING_free((ASN1_STRING *)a)
#define M_ASN1_ENUMERATED_dup(a) (ASN1_ENUMERATED *)ASN1_STRING_dup((ASN1_STRING *)a)
#define M_ASN1_ENUMERATED_cmp(a,b)	ASN1_STRING_cmp(\
		(ASN1_STRING *)a,(ASN1_STRING *)b)

#define M_ASN1_OCTET_STRING_new()	(ASN1_OCTET_STRING *)\
		ASN1_STRING_type_new(V_ASN1_OCTET_STRING)
#define M_ASN1_OCTET_STRING_free(a)	ASN1_STRING_free((ASN1_STRING *)a)
#define M_ASN1_OCTET_STRING_dup(a) (ASN1_OCTET_STRING *)\
		ASN1_STRING_dup((ASN1_STRING *)a)
#define M_ASN1_OCTET_STRING_cmp(a,b) ASN1_STRING_cmp(\
		(ASN1_STRING *)a,(ASN1_STRING *)b)
#define M_ASN1_OCTET_STRING_set(a,b,c)	ASN1_STRING_set((ASN1_STRING *)a,b,c)
#define M_ASN1_OCTET_STRING_print(a,b)	ASN1_STRING_print(a,(ASN1_STRING *)b)
#define M_i2d_ASN1_OCTET_STRING(a,pp) \
		i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_OCTET_STRING,\
		V_ASN1_UNIVERSAL)

#define B_ASN1_TIME \
			B_ASN1_UTCTIME | \
			B_ASN1_GENERALIZEDTIME

#define B_ASN1_PRINTABLE \
			B_ASN1_NUMERICSTRING| \
			B_ASN1_PRINTABLESTRING| \
			B_ASN1_T61STRING| \
			B_ASN1_IA5STRING| \
			B_ASN1_BIT_STRING| \
			B_ASN1_UNIVERSALSTRING|\
			B_ASN1_BMPSTRING|\
			B_ASN1_UTF8STRING|\
			B_ASN1_SEQUENCE|\
			B_ASN1_UNKNOWN

#define B_ASN1_DIRECTORYSTRING \
			B_ASN1_PRINTABLESTRING| \
			B_ASN1_TELETEXSTRING|\
			B_ASN1_BMPSTRING|\
			B_ASN1_UNIVERSALSTRING|\
			B_ASN1_UTF8STRING

#define B_ASN1_DISPLAYTEXT \
			B_ASN1_IA5STRING| \
			B_ASN1_VISIBLESTRING| \
			B_ASN1_BMPSTRING|\
			B_ASN1_UTF8STRING

#define M_ASN1_PRINTABLE_new()	ASN1_STRING_type_new(V_ASN1_T61STRING)
#define M_ASN1_PRINTABLE_free(a)	ASN1_STRING_free((ASN1_STRING *)a)
#define M_i2d_ASN1_PRINTABLE(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\
		pp,a->type,V_ASN1_UNIVERSAL)
#define M_d2i_ASN1_PRINTABLE(a,pp,l) \
		d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \
			B_ASN1_PRINTABLE)

#define M_DIRECTORYSTRING_new() ASN1_STRING_type_new(V_ASN1_PRINTABLESTRING)
#define M_DIRECTORYSTRING_free(a)	ASN1_STRING_free((ASN1_STRING *)a)
#define M_i2d_DIRECTORYSTRING(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\
						pp,a->type,V_ASN1_UNIVERSAL)
#define M_d2i_DIRECTORYSTRING(a,pp,l) \
		d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \
			B_ASN1_DIRECTORYSTRING)

#define M_DISPLAYTEXT_new() ASN1_STRING_type_new(V_ASN1_VISIBLESTRING)
#define M_DISPLAYTEXT_free(a) ASN1_STRING_free((ASN1_STRING *)a)
#define M_i2d_DISPLAYTEXT(a,pp) i2d_ASN1_bytes((ASN1_STRING *)a,\
						pp,a->type,V_ASN1_UNIVERSAL)
#define M_d2i_DISPLAYTEXT(a,pp,l) \
		d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l, \
			B_ASN1_DISPLAYTEXT)

#define M_ASN1_PRINTABLESTRING_new() (ASN1_PRINTABLESTRING *)\
		ASN1_STRING_type_new(V_ASN1_PRINTABLESTRING)
#define M_ASN1_PRINTABLESTRING_free(a)	ASN1_STRING_free((ASN1_STRING *)a)
#define M_i2d_ASN1_PRINTABLESTRING(a,pp) \
		i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_PRINTABLESTRING,\
		V_ASN1_UNIVERSAL)
#define M_d2i_ASN1_PRINTABLESTRING(a,pp,l) \
		(ASN1_PRINTABLESTRING *)d2i_ASN1_type_bytes\
		((ASN1_STRING **)a,pp,l,B_ASN1_PRINTABLESTRING)

#define M_ASN1_T61STRING_new()	(ASN1_T61STRING *)\
		ASN1_STRING_type_new(V_ASN1_T61STRING)
#define M_ASN1_T61STRING_free(a)	ASN1_STRING_free((ASN1_STRING *)a)
#define M_i2d_ASN1_T61STRING(a,pp) \
		i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_T61STRING,\
		V_ASN1_UNIVERSAL)
#define M_d2i_ASN1_T61STRING(a,pp,l) \
		(ASN1_T61STRING *)d2i_ASN1_type_bytes\
		((ASN1_STRING **)a,pp,l,B_ASN1_T61STRING)

#define M_ASN1_IA5STRING_new()	(ASN1_IA5STRING *)\
		ASN1_STRING_type_new(V_ASN1_IA5STRING)
#define M_ASN1_IA5STRING_free(a)	ASN1_STRING_free((ASN1_STRING *)a)
#define M_ASN1_IA5STRING_dup(a)	\
			(ASN1_IA5STRING *)ASN1_STRING_dup((ASN1_STRING *)a)
#define M_i2d_ASN1_IA5STRING(a,pp) \
		i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_IA5STRING,\
			V_ASN1_UNIVERSAL)
#define M_d2i_ASN1_IA5STRING(a,pp,l) \
		(ASN1_IA5STRING *)d2i_ASN1_type_bytes((ASN1_STRING **)a,pp,l,\
			B_ASN1_IA5STRING)

#define M_ASN1_UTCTIME_new()	(ASN1_UTCTIME *)\
		ASN1_STRING_type_new(V_ASN1_UTCTIME)
#define M_ASN1_UTCTIME_free(a)	ASN1_STRING_free((ASN1_STRING *)a)
#define M_ASN1_UTCTIME_dup(a) (ASN1_UTCTIME *)ASN1_STRING_dup((ASN1_STRING *)a)

#define M_ASN1_GENERALIZEDTIME_new()	(ASN1_GENERALIZEDTIME *)\
		ASN1_STRING_type_new(V_ASN1_GENERALIZEDTIME)
#define M_ASN1_GENERALIZEDTIME_free(a)	ASN1_STRING_free((ASN1_STRING *)a)
#define M_ASN1_GENERALIZEDTIME_dup(a) (ASN1_GENERALIZEDTIME *)ASN1_STRING_dup(\
	(ASN1_STRING *)a)

#define M_ASN1_TIME_new()	(ASN1_TIME *)\
		ASN1_STRING_type_new(V_ASN1_UTCTIME)
#define M_ASN1_TIME_free(a)	ASN1_STRING_free((ASN1_STRING *)a)
#define M_ASN1_TIME_dup(a) (ASN1_TIME *)ASN1_STRING_dup((ASN1_STRING *)a)

#define M_ASN1_GENERALSTRING_new()	(ASN1_GENERALSTRING *)\
		ASN1_STRING_type_new(V_ASN1_GENERALSTRING)
#define M_ASN1_GENERALSTRING_free(a)	ASN1_STRING_free((ASN1_STRING *)a)
#define M_i2d_ASN1_GENERALSTRING(a,pp) \
		i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_GENERALSTRING,\
			V_ASN1_UNIVERSAL)
#define M_d2i_ASN1_GENERALSTRING(a,pp,l) \
		(ASN1_GENERALSTRING *)d2i_ASN1_type_bytes\
		((ASN1_STRING **)a,pp,l,B_ASN1_GENERALSTRING)

#define M_ASN1_UNIVERSALSTRING_new()	(ASN1_UNIVERSALSTRING *)\
		ASN1_STRING_type_new(V_ASN1_UNIVERSALSTRING)
#define M_ASN1_UNIVERSALSTRING_free(a)	ASN1_STRING_free((ASN1_STRING *)a)
#define M_i2d_ASN1_UNIVERSALSTRING(a,pp) \
		i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_UNIVERSALSTRING,\
			V_ASN1_UNIVERSAL)
#define M_d2i_ASN1_UNIVERSALSTRING(a,pp,l) \
		(ASN1_UNIVERSALSTRING *)d2i_ASN1_type_bytes\
		((ASN1_STRING **)a,pp,l,B_ASN1_UNIVERSALSTRING)

#define M_ASN1_BMPSTRING_new()	(ASN1_BMPSTRING *)\
		ASN1_STRING_type_new(V_ASN1_BMPSTRING)
#define M_ASN1_BMPSTRING_free(a)	ASN1_STRING_free((ASN1_STRING *)a)
#define M_i2d_ASN1_BMPSTRING(a,pp) \
		i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_BMPSTRING,\
			V_ASN1_UNIVERSAL)
#define M_d2i_ASN1_BMPSTRING(a,pp,l) \
		(ASN1_BMPSTRING *)d2i_ASN1_type_bytes\
		((ASN1_STRING **)a,pp,l,B_ASN1_BMPSTRING)

#define M_ASN1_VISIBLESTRING_new()	(ASN1_VISIBLESTRING *)\
		ASN1_STRING_type_new(V_ASN1_VISIBLESTRING)
#define M_ASN1_VISIBLESTRING_free(a)	ASN1_STRING_free((ASN1_STRING *)a)
#define M_i2d_ASN1_VISIBLESTRING(a,pp) \
		i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_VISIBLESTRING,\
			V_ASN1_UNIVERSAL)
#define M_d2i_ASN1_VISIBLESTRING(a,pp,l) \
		(ASN1_VISIBLESTRING *)d2i_ASN1_type_bytes\
		((ASN1_STRING **)a,pp,l,B_ASN1_VISIBLESTRING)

#define M_ASN1_UTF8STRING_new()	(ASN1_UTF8STRING *)\
		ASN1_STRING_type_new(V_ASN1_UTF8STRING)
#define M_ASN1_UTF8STRING_free(a)	ASN1_STRING_free((ASN1_STRING *)a)
#define M_i2d_ASN1_UTF8STRING(a,pp) \
		i2d_ASN1_bytes((ASN1_STRING *)a,pp,V_ASN1_UTF8STRING,\
			V_ASN1_UNIVERSAL)
#define M_d2i_ASN1_UTF8STRING(a,pp,l) \
		(ASN1_UTF8STRING *)d2i_ASN1_type_bytes\
		((ASN1_STRING **)a,pp,l,B_ASN1_UTF8STRING)

  /* for the is_set parameter to i2d_ASN1_SET */
#define IS_SEQUENCE	0
#define IS_SET		1

DECLARE_ASN1_FUNCTIONS_fname(ASN1_TYPE, ASN1_ANY, ASN1_TYPE)

int ASN1_TYPE_get(ASN1_TYPE *a);
void ASN1_TYPE_set(ASN1_TYPE *a, int type, void *value);
int ASN1_TYPE_set1(ASN1_TYPE *a, int type, const void *value);

ASN1_OBJECT *	ASN1_OBJECT_new(void );
void		ASN1_OBJECT_free(ASN1_OBJECT *a);
int		i2d_ASN1_OBJECT(ASN1_OBJECT *a,unsigned char **pp);
ASN1_OBJECT *	c2i_ASN1_OBJECT(ASN1_OBJECT **a,const unsigned char **pp,
			long length);
ASN1_OBJECT *	d2i_ASN1_OBJECT(ASN1_OBJECT **a,const unsigned char **pp,
			long length);

DECLARE_ASN1_ITEM(ASN1_OBJECT)

DECLARE_STACK_OF(ASN1_OBJECT)
DECLARE_ASN1_SET_OF(ASN1_OBJECT)

ASN1_STRING *	ASN1_STRING_new(void);
void		ASN1_STRING_free(ASN1_STRING *a);
ASN1_STRING *	ASN1_STRING_dup(ASN1_STRING *a);
ASN1_STRING *	ASN1_STRING_type_new(int type );
int 		ASN1_STRING_cmp(ASN1_STRING *a, ASN1_STRING *b);
  /* Since this is used to store all sorts of things, via macros, for now, make
     its data void * */
int 		ASN1_STRING_set(ASN1_STRING *str, const void *data, int len);
void		ASN1_STRING_set0(ASN1_STRING *str, void *data, int len);
int ASN1_STRING_length(ASN1_STRING *x);
void ASN1_STRING_length_set(ASN1_STRING *x, int n);
int ASN1_STRING_type(ASN1_STRING *x);
unsigned char * ASN1_STRING_data(ASN1_STRING *x);

DECLARE_ASN1_FUNCTIONS(ASN1_BIT_STRING)
int		i2c_ASN1_BIT_STRING(ASN1_BIT_STRING *a,unsigned char **pp);
ASN1_BIT_STRING *c2i_ASN1_BIT_STRING(ASN1_BIT_STRING **a,const unsigned char **pp,
			long length);
int		ASN1_BIT_STRING_set(ASN1_BIT_STRING *a, unsigned char *d,
			int length );
int		ASN1_BIT_STRING_set_bit(ASN1_BIT_STRING *a, int n, int value);
int		ASN1_BIT_STRING_get_bit(ASN1_BIT_STRING *a, int n);

#ifndef OPENSSL_NO_BIO
int ASN1_BIT_STRING_name_print(BIO *out, ASN1_BIT_STRING *bs,
				BIT_STRING_BITNAME *tbl, int indent);
#endif
int ASN1_BIT_STRING_num_asc(char *name, BIT_STRING_BITNAME *tbl);
int ASN1_BIT_STRING_set_asc(ASN1_BIT_STRING *bs, char *name, int value,
				BIT_STRING_BITNAME *tbl);

int		i2d_ASN1_BOOLEAN(int a,unsigned char **pp);
int 		d2i_ASN1_BOOLEAN(int *a,const unsigned char **pp,long length);

DECLARE_ASN1_FUNCTIONS(ASN1_INTEGER)
int		i2c_ASN1_INTEGER(ASN1_INTEGER *a,unsigned char **pp);
ASN1_INTEGER *c2i_ASN1_INTEGER(ASN1_INTEGER **a,const unsigned char **pp,
			long length);
ASN1_INTEGER *d2i_ASN1_UINTEGER(ASN1_INTEGER **a,const unsigned char **pp,
			long length);
ASN1_INTEGER *	ASN1_INTEGER_dup(ASN1_INTEGER *x);
int ASN1_INTEGER_cmp(ASN1_INTEGER *x, ASN1_INTEGER *y);

DECLARE_ASN1_FUNCTIONS(ASN1_ENUMERATED)

int ASN1_UTCTIME_check(ASN1_UTCTIME *a);
ASN1_UTCTIME *ASN1_UTCTIME_set(ASN1_UTCTIME *s,time_t t);
int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str);
int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t);
#if 0
time_t ASN1_UTCTIME_get(const ASN1_UTCTIME *s);
#endif

int ASN1_GENERALIZEDTIME_check(ASN1_GENERALIZEDTIME *a);
ASN1_GENERALIZEDTIME *ASN1_GENERALIZEDTIME_set(ASN1_GENERALIZEDTIME *s,time_t t);
int ASN1_GENERALIZEDTIME_set_string(ASN1_GENERALIZEDTIME *s, const char *str);

DECLARE_ASN1_FUNCTIONS(ASN1_OCTET_STRING)
ASN1_OCTET_STRING *	ASN1_OCTET_STRING_dup(ASN1_OCTET_STRING *a);
int 	ASN1_OCTET_STRING_cmp(ASN1_OCTET_STRING *a, ASN1_OCTET_STRING *b);
int 	ASN1_OCTET_STRING_set(ASN1_OCTET_STRING *str, const unsigned char *data, int len);

DECLARE_ASN1_FUNCTIONS(ASN1_VISIBLESTRING)
DECLARE_ASN1_FUNCTIONS(ASN1_UNIVERSALSTRING)
DECLARE_ASN1_FUNCTIONS(ASN1_UTF8STRING)
DECLARE_ASN1_FUNCTIONS(ASN1_NULL)
DECLARE_ASN1_FUNCTIONS(ASN1_BMPSTRING)

int UTF8_getc(const unsigned char *str, int len, unsigned long *val);
int UTF8_putc(unsigned char *str, int len, unsigned long value);

DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, ASN1_PRINTABLE)

DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DIRECTORYSTRING)
DECLARE_ASN1_FUNCTIONS_name(ASN1_STRING, DISPLAYTEXT)
DECLARE_ASN1_FUNCTIONS(ASN1_PRINTABLESTRING)
DECLARE_ASN1_FUNCTIONS(ASN1_T61STRING)
DECLARE_ASN1_FUNCTIONS(ASN1_IA5STRING)
DECLARE_ASN1_FUNCTIONS(ASN1_GENERALSTRING)
DECLARE_ASN1_FUNCTIONS(ASN1_UTCTIME)
DECLARE_ASN1_FUNCTIONS(ASN1_GENERALIZEDTIME)
DECLARE_ASN1_FUNCTIONS(ASN1_TIME)

DECLARE_ASN1_ITEM(ASN1_OCTET_STRING_NDEF)

ASN1_TIME *ASN1_TIME_set(ASN1_TIME *s,time_t t);
int ASN1_TIME_check(ASN1_TIME *t);
ASN1_GENERALIZEDTIME *ASN1_TIME_to_generalizedtime(ASN1_TIME *t, ASN1_GENERALIZEDTIME **out);

int i2d_ASN1_SET(STACK *a, unsigned char **pp,
		 i2d_of_void *i2d, int ex_tag, int ex_class, int is_set);
STACK *	d2i_ASN1_SET(STACK **a, const unsigned char **pp, long length,
		     d2i_of_void *d2i, void (*free_func)(void *),
		     int ex_tag, int ex_class);

#ifndef OPENSSL_NO_BIO
int i2a_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *a);
int a2i_ASN1_INTEGER(BIO *bp,ASN1_INTEGER *bs,char *buf,int size);
int i2a_ASN1_ENUMERATED(BIO *bp, ASN1_ENUMERATED *a);
int a2i_ASN1_ENUMERATED(BIO *bp,ASN1_ENUMERATED *bs,char *buf,int size);
int i2a_ASN1_OBJECT(BIO *bp,ASN1_OBJECT *a);
int a2i_ASN1_STRING(BIO *bp,ASN1_STRING *bs,char *buf,int size);
int i2a_ASN1_STRING(BIO *bp, ASN1_STRING *a, int type);
#endif
int i2t_ASN1_OBJECT(char *buf,int buf_len,ASN1_OBJECT *a);

int a2d_ASN1_OBJECT(unsigned char *out,int olen, const char *buf, int num);
ASN1_OBJECT *ASN1_OBJECT_create(int nid, unsigned char *data,int len,
	const char *sn, const char *ln);

int ASN1_INTEGER_set(ASN1_INTEGER *a, long v);
long ASN1_INTEGER_get(ASN1_INTEGER *a);
ASN1_INTEGER *BN_to_ASN1_INTEGER(BIGNUM *bn, ASN1_INTEGER *ai);
BIGNUM *ASN1_INTEGER_to_BN(ASN1_INTEGER *ai,BIGNUM *bn);

int ASN1_ENUMERATED_set(ASN1_ENUMERATED *a, long v);
long ASN1_ENUMERATED_get(ASN1_ENUMERATED *a);
ASN1_ENUMERATED *BN_to_ASN1_ENUMERATED(BIGNUM *bn, ASN1_ENUMERATED *ai);
BIGNUM *ASN1_ENUMERATED_to_BN(ASN1_ENUMERATED *ai,BIGNUM *bn);

/* General */
/* given a string, return the correct type, max is the maximum length */
int ASN1_PRINTABLE_type(const unsigned char *s, int max);

int i2d_ASN1_bytes(ASN1_STRING *a, unsigned char **pp, int tag, int xclass);
ASN1_STRING *d2i_ASN1_bytes(ASN1_STRING **a, const unsigned char **pp,
	long length, int Ptag, int Pclass);
unsigned long ASN1_tag2bit(int tag);
/* type is one or more of the B_ASN1_ values. */
ASN1_STRING *d2i_ASN1_type_bytes(ASN1_STRING **a,const unsigned char **pp,
		long length,int type);

/* PARSING */
int asn1_Finish(ASN1_CTX *c);
int asn1_const_Finish(ASN1_const_CTX *c);

/* SPECIALS */
int ASN1_get_object(const unsigned char **pp, long *plength, int *ptag,
	int *pclass, long omax);
int ASN1_check_infinite_end(unsigned char **p,long len);
int ASN1_const_check_infinite_end(const unsigned char **p,long len);
void ASN1_put_object(unsigned char **pp, int constructed, int length,
	int tag, int xclass);
int ASN1_put_eoc(unsigned char **pp);
int ASN1_object_size(int constructed, int length, int tag);

/* Used to implement other functions */
void *ASN1_dup(i2d_of_void *i2d, d2i_of_void *d2i, char *x);

#define ASN1_dup_of(type,i2d,d2i,x) \
    ((type*)ASN1_dup(CHECKED_I2D_OF(type, i2d), \
		     CHECKED_D2I_OF(type, d2i), \
		     CHECKED_PTR_OF(type, x)))

#define ASN1_dup_of_const(type,i2d,d2i,x) \
    ((type*)ASN1_dup(CHECKED_I2D_OF(const type, i2d), \
		     CHECKED_D2I_OF(type, d2i), \
		     CHECKED_PTR_OF(const type, x)))

void *ASN1_item_dup(const ASN1_ITEM *it, void *x);

/* ASN1 alloc/free macros for when a type is only used internally */

#define M_ASN1_new_of(type) (type *)ASN1_item_new(ASN1_ITEM_rptr(type))
#define M_ASN1_free_of(x, type) \
		ASN1_item_free(CHECKED_PTR_OF(type, x), ASN1_ITEM_rptr(type))

#ifndef OPENSSL_NO_FP_API
void *ASN1_d2i_fp(void *(*xnew)(void), d2i_of_void *d2i, FILE *in, void **x);

#define ASN1_d2i_fp_of(type,xnew,d2i,in,x) \
    ((type*)ASN1_d2i_fp(CHECKED_NEW_OF(type, xnew), \
			CHECKED_D2I_OF(type, d2i), \
			in, \
			CHECKED_PPTR_OF(type, x)))

void *ASN1_item_d2i_fp(const ASN1_ITEM *it, FILE *in, void *x);
int ASN1_i2d_fp(i2d_of_void *i2d,FILE *out,void *x);

#define ASN1_i2d_fp_of(type,i2d,out,x) \
    (ASN1_i2d_fp(CHECKED_I2D_OF(type, i2d), \
		 out, \
		 CHECKED_PTR_OF(type, x)))

#define ASN1_i2d_fp_of_const(type,i2d,out,x) \
    (ASN1_i2d_fp(CHECKED_I2D_OF(const type, i2d), \
		 out, \
		 CHECKED_PTR_OF(const type, x)))

int ASN1_item_i2d_fp(const ASN1_ITEM *it, FILE *out, void *x);
int ASN1_STRING_print_ex_fp(FILE *fp, ASN1_STRING *str, unsigned long flags);
#endif

int ASN1_STRING_to_UTF8(unsigned char **out, ASN1_STRING *in);

#ifndef OPENSSL_NO_BIO
void *ASN1_d2i_bio(void *(*xnew)(void), d2i_of_void *d2i, BIO *in, void **x);

#define ASN1_d2i_bio_of(type,xnew,d2i,in,x) \
    ((type*)ASN1_d2i_bio( CHECKED_NEW_OF(type, xnew), \
			  CHECKED_D2I_OF(type, d2i), \
			  in, \
			  CHECKED_PPTR_OF(type, x)))

void *ASN1_item_d2i_bio(const ASN1_ITEM *it, BIO *in, void *x);
int ASN1_i2d_bio(i2d_of_void *i2d,BIO *out, unsigned char *x);

#define ASN1_i2d_bio_of(type,i2d,out,x) \
    (ASN1_i2d_bio(CHECKED_I2D_OF(type, i2d), \
		  out, \
		  CHECKED_PTR_OF(type, x)))

#define ASN1_i2d_bio_of_const(type,i2d,out,x) \
    (ASN1_i2d_bio(CHECKED_I2D_OF(const type, i2d), \
		  out, \
		  CHECKED_PTR_OF(const type, x)))

int ASN1_item_i2d_bio(const ASN1_ITEM *it, BIO *out, void *x);
int ASN1_UTCTIME_print(BIO *fp,ASN1_UTCTIME *a);
int ASN1_GENERALIZEDTIME_print(BIO *fp,ASN1_GENERALIZEDTIME *a);
int ASN1_TIME_print(BIO *fp,ASN1_TIME *a);
int ASN1_STRING_print(BIO *bp,ASN1_STRING *v);
int ASN1_STRING_print_ex(BIO *out, ASN1_STRING *str, unsigned long flags);
int ASN1_parse(BIO *bp,const unsigned char *pp,long len,int indent);
int ASN1_parse_dump(BIO *bp,const unsigned char *pp,long len,int indent,int dump);
#endif
const char *ASN1_tag2str(int tag);

/* Used to load and write netscape format cert/key */
int i2d_ASN1_HEADER(ASN1_HEADER *a,unsigned char **pp);
ASN1_HEADER *d2i_ASN1_HEADER(ASN1_HEADER **a,const unsigned char **pp, long length);
ASN1_HEADER *ASN1_HEADER_new(void );
void ASN1_HEADER_free(ASN1_HEADER *a);

int ASN1_UNIVERSALSTRING_to_string(ASN1_UNIVERSALSTRING *s);

/* Not used that much at this point, except for the first two */
ASN1_METHOD *X509_asn1_meth(void);
ASN1_METHOD *RSAPrivateKey_asn1_meth(void);
ASN1_METHOD *ASN1_IA5STRING_asn1_meth(void);
ASN1_METHOD *ASN1_BIT_STRING_asn1_meth(void);

int ASN1_TYPE_set_octetstring(ASN1_TYPE *a,
	unsigned char *data, int len);
int ASN1_TYPE_get_octetstring(ASN1_TYPE *a,
	unsigned char *data, int max_len);
int ASN1_TYPE_set_int_octetstring(ASN1_TYPE *a, long num,
	unsigned char *data, int len);
int ASN1_TYPE_get_int_octetstring(ASN1_TYPE *a,long *num,
	unsigned char *data, int max_len);

STACK *ASN1_seq_unpack(const unsigned char *buf, int len,
		       d2i_of_void *d2i, void (*free_func)(void *));
unsigned char *ASN1_seq_pack(STACK *safes, i2d_of_void *i2d,
			     unsigned char **buf, int *len );
void *ASN1_unpack_string(ASN1_STRING *oct, d2i_of_void *d2i);
void *ASN1_item_unpack(ASN1_STRING *oct, const ASN1_ITEM *it);
ASN1_STRING *ASN1_pack_string(void *obj, i2d_of_void *i2d,
			      ASN1_OCTET_STRING **oct);

#define ASN1_pack_string_of(type,obj,i2d,oct) \
    (ASN1_pack_string(CHECKED_PTR_OF(type, obj), \
		      CHECKED_I2D_OF(type, i2d), \
		      oct))

ASN1_STRING *ASN1_item_pack(void *obj, const ASN1_ITEM *it, ASN1_OCTET_STRING **oct);

void ASN1_STRING_set_default_mask(unsigned long mask);
int ASN1_STRING_set_default_mask_asc(char *p);
unsigned long ASN1_STRING_get_default_mask(void);
int ASN1_mbstring_copy(ASN1_STRING **out, const unsigned char *in, int len,
					int inform, unsigned long mask);
int ASN1_mbstring_ncopy(ASN1_STRING **out, const unsigned char *in, int len,
					int inform, unsigned long mask, 
					long minsize, long maxsize);

ASN1_STRING *ASN1_STRING_set_by_NID(ASN1_STRING **out, 
		const unsigned char *in, int inlen, int inform, int nid);
ASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid);
int ASN1_STRING_TABLE_add(int, long, long, unsigned long, unsigned long);
void ASN1_STRING_TABLE_cleanup(void);

/* ASN1 template functions */

/* Old API compatible functions */
ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it);
void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it);
ASN1_VALUE * ASN1_item_d2i(ASN1_VALUE **val, const unsigned char **in, long len, const ASN1_ITEM *it);
int ASN1_item_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it);
int ASN1_item_ndef_i2d(ASN1_VALUE *val, unsigned char **out, const ASN1_ITEM *it);

void ASN1_add_oid_module(void);

ASN1_TYPE *ASN1_generate_nconf(char *str, CONF *nconf);
ASN1_TYPE *ASN1_generate_v3(char *str, X509V3_CTX *cnf);

typedef int asn1_output_data_fn(BIO *out, BIO *data, ASN1_VALUE *val, int flags,
					const ASN1_ITEM *it);

int int_smime_write_ASN1(BIO *bio, ASN1_VALUE *val, BIO *data, int flags,
				int ctype_nid, int econt_nid,
				STACK_OF(X509_ALGOR) *mdalgs,
				asn1_output_data_fn *data_fn,
				const ASN1_ITEM *it);
ASN1_VALUE *SMIME_read_ASN1(BIO *bio, BIO **bcont, const ASN1_ITEM *it);

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_ASN1_strings(void);

/* Error codes for the ASN1 functions. */

/* Function codes. */
#define ASN1_F_A2D_ASN1_OBJECT				 100
#define ASN1_F_A2I_ASN1_ENUMERATED			 101
#define ASN1_F_A2I_ASN1_INTEGER				 102
#define ASN1_F_A2I_ASN1_STRING				 103
#define ASN1_F_APPEND_EXP				 176
#define ASN1_F_ASN1_BIT_STRING_SET_BIT			 183
#define ASN1_F_ASN1_CB					 177
#define ASN1_F_ASN1_CHECK_TLEN				 104
#define ASN1_F_ASN1_COLLATE_PRIMITIVE			 105
#define ASN1_F_ASN1_COLLECT				 106
#define ASN1_F_ASN1_D2I_EX_PRIMITIVE			 108
#define ASN1_F_ASN1_D2I_FP				 109
#define ASN1_F_ASN1_D2I_READ_BIO			 107
#define ASN1_F_ASN1_DIGEST				 184
#define ASN1_F_ASN1_DO_ADB				 110
#define ASN1_F_ASN1_DUP					 111
#define ASN1_F_ASN1_ENUMERATED_SET			 112
#define ASN1_F_ASN1_ENUMERATED_TO_BN			 113
#define ASN1_F_ASN1_EX_C2I				 204
#define ASN1_F_ASN1_FIND_END				 190
#define ASN1_F_ASN1_GENERALIZEDTIME_SET			 185
#define ASN1_F_ASN1_GENERATE_V3				 178
#define ASN1_F_ASN1_GET_OBJECT				 114
#define ASN1_F_ASN1_HEADER_NEW				 115
#define ASN1_F_ASN1_I2D_BIO				 116
#define ASN1_F_ASN1_I2D_FP				 117
#define ASN1_F_ASN1_INTEGER_SET				 118
#define ASN1_F_ASN1_INTEGER_TO_BN			 119
#define ASN1_F_ASN1_ITEM_D2I_FP				 206
#define ASN1_F_ASN1_ITEM_DUP				 191
#define ASN1_F_ASN1_ITEM_EX_COMBINE_NEW			 121
#define ASN1_F_ASN1_ITEM_EX_D2I				 120
#define ASN1_F_ASN1_ITEM_I2D_BIO			 192
#define ASN1_F_ASN1_ITEM_I2D_FP				 193
#define ASN1_F_ASN1_ITEM_PACK				 198
#define ASN1_F_ASN1_ITEM_SIGN				 195
#define ASN1_F_ASN1_ITEM_UNPACK				 199
#define ASN1_F_ASN1_ITEM_VERIFY				 197
#define ASN1_F_ASN1_MBSTRING_NCOPY			 122
#define ASN1_F_ASN1_OBJECT_NEW				 123
#define ASN1_F_ASN1_OUTPUT_DATA				 207
#define ASN1_F_ASN1_PACK_STRING				 124
#define ASN1_F_ASN1_PCTX_NEW				 205
#define ASN1_F_ASN1_PKCS5_PBE_SET			 125
#define ASN1_F_ASN1_SEQ_PACK				 126
#define ASN1_F_ASN1_SEQ_UNPACK				 127
#define ASN1_F_ASN1_SIGN				 128
#define ASN1_F_ASN1_STR2TYPE				 179
#define ASN1_F_ASN1_STRING_SET				 186
#define ASN1_F_ASN1_STRING_TABLE_ADD			 129
#define ASN1_F_ASN1_STRING_TYPE_NEW			 130
#define ASN1_F_ASN1_TEMPLATE_EX_D2I			 132
#define ASN1_F_ASN1_TEMPLATE_NEW			 133
#define ASN1_F_ASN1_TEMPLATE_NOEXP_D2I			 131
#define ASN1_F_ASN1_TIME_SET				 175
#define ASN1_F_ASN1_TYPE_GET_INT_OCTETSTRING		 134
#define ASN1_F_ASN1_TYPE_GET_OCTETSTRING		 135
#define ASN1_F_ASN1_UNPACK_STRING			 136
#define ASN1_F_ASN1_UTCTIME_SET				 187
#define ASN1_F_ASN1_VERIFY				 137
#define ASN1_F_B64_READ_ASN1				 208
#define ASN1_F_B64_WRITE_ASN1				 209
#define ASN1_F_BIO_NEW_NDEF				 212
#define ASN1_F_BITSTR_CB				 180
#define ASN1_F_BN_TO_ASN1_ENUMERATED			 138
#define ASN1_F_BN_TO_ASN1_INTEGER			 139
#define ASN1_F_C2I_ASN1_BIT_STRING			 189
#define ASN1_F_C2I_ASN1_INTEGER				 194
#define ASN1_F_C2I_ASN1_OBJECT				 196
#define ASN1_F_COLLECT_DATA				 140
#define ASN1_F_D2I_ASN1_BIT_STRING			 141
#define ASN1_F_D2I_ASN1_BOOLEAN				 142
#define ASN1_F_D2I_ASN1_BYTES				 143
#define ASN1_F_D2I_ASN1_GENERALIZEDTIME			 144
#define ASN1_F_D2I_ASN1_HEADER				 145
#define ASN1_F_D2I_ASN1_INTEGER				 146
#define ASN1_F_D2I_ASN1_OBJECT				 147
#define ASN1_F_D2I_ASN1_SET				 148
#define ASN1_F_D2I_ASN1_TYPE_BYTES			 149
#define ASN1_F_D2I_ASN1_UINTEGER			 150
#define ASN1_F_D2I_ASN1_UTCTIME				 151
#define ASN1_F_D2I_NETSCAPE_RSA				 152
#define ASN1_F_D2I_NETSCAPE_RSA_2			 153
#define ASN1_F_D2I_PRIVATEKEY				 154
#define ASN1_F_D2I_PUBLICKEY				 155
#define ASN1_F_D2I_RSA_NET				 200
#define ASN1_F_D2I_RSA_NET_2				 201
#define ASN1_F_D2I_X509					 156
#define ASN1_F_D2I_X509_CINF				 157
#define ASN1_F_D2I_X509_PKEY				 159
#define ASN1_F_I2D_ASN1_SET				 188
#define ASN1_F_I2D_ASN1_TIME				 160
#define ASN1_F_I2D_DSA_PUBKEY				 161
#define ASN1_F_I2D_EC_PUBKEY				 181
#define ASN1_F_I2D_PRIVATEKEY				 163
#define ASN1_F_I2D_PUBLICKEY				 164
#define ASN1_F_I2D_RSA_NET				 162
#define ASN1_F_I2D_RSA_PUBKEY				 165
#define ASN1_F_LONG_C2I					 166
#define ASN1_F_OID_MODULE_INIT				 174
#define ASN1_F_PARSE_TAGGING				 182
#define ASN1_F_PKCS5_PBE2_SET				 167
#define ASN1_F_PKCS5_PBE_SET				 202
#define ASN1_F_SMIME_READ_ASN1				 210
#define ASN1_F_SMIME_TEXT				 211
#define ASN1_F_X509_CINF_NEW				 168
#define ASN1_F_X509_CRL_ADD0_REVOKED			 169
#define ASN1_F_X509_INFO_NEW				 170
#define ASN1_F_X509_NAME_ENCODE				 203
#define ASN1_F_X509_NAME_EX_D2I				 158
#define ASN1_F_X509_NAME_EX_NEW				 171
#define ASN1_F_X509_NEW					 172
#define ASN1_F_X509_PKEY_NEW				 173

/* Reason codes. */
#define ASN1_R_ADDING_OBJECT				 171
#define ASN1_R_ASN1_PARSE_ERROR				 198
#define ASN1_R_ASN1_SIG_PARSE_ERROR			 199
#define ASN1_R_AUX_ERROR				 100
#define ASN1_R_BAD_CLASS				 101
#define ASN1_R_BAD_OBJECT_HEADER			 102
#define ASN1_R_BAD_PASSWORD_READ			 103
#define ASN1_R_BAD_TAG					 104
#define ASN1_R_BMPSTRING_IS_WRONG_LENGTH		 210
#define ASN1_R_BN_LIB					 105
#define ASN1_R_BOOLEAN_IS_WRONG_LENGTH			 106
#define ASN1_R_BUFFER_TOO_SMALL				 107
#define ASN1_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER		 108
#define ASN1_R_DATA_IS_WRONG				 109
#define ASN1_R_DECODE_ERROR				 110
#define ASN1_R_DECODING_ERROR				 111
#define ASN1_R_DEPTH_EXCEEDED				 174
#define ASN1_R_ENCODE_ERROR				 112
#define ASN1_R_ERROR_GETTING_TIME			 173
#define ASN1_R_ERROR_LOADING_SECTION			 172
#define ASN1_R_ERROR_PARSING_SET_ELEMENT		 113
#define ASN1_R_ERROR_SETTING_CIPHER_PARAMS		 114
#define ASN1_R_EXPECTING_AN_INTEGER			 115
#define ASN1_R_EXPECTING_AN_OBJECT			 116
#define ASN1_R_EXPECTING_A_BOOLEAN			 117
#define ASN1_R_EXPECTING_A_TIME				 118
#define ASN1_R_EXPLICIT_LENGTH_MISMATCH			 119
#define ASN1_R_EXPLICIT_TAG_NOT_CONSTRUCTED		 120
#define ASN1_R_FIELD_MISSING				 121
#define ASN1_R_FIRST_NUM_TOO_LARGE			 122
#define ASN1_R_HEADER_TOO_LONG				 123
#define ASN1_R_ILLEGAL_BITSTRING_FORMAT			 175
#define ASN1_R_ILLEGAL_BOOLEAN				 176
#define ASN1_R_ILLEGAL_CHARACTERS			 124
#define ASN1_R_ILLEGAL_FORMAT				 177
#define ASN1_R_ILLEGAL_HEX				 178
#define ASN1_R_ILLEGAL_IMPLICIT_TAG			 179
#define ASN1_R_ILLEGAL_INTEGER				 180
#define ASN1_R_ILLEGAL_NESTED_TAGGING			 181
#define ASN1_R_ILLEGAL_NULL				 125
#define ASN1_R_ILLEGAL_NULL_VALUE			 182
#define ASN1_R_ILLEGAL_OBJECT				 183
#define ASN1_R_ILLEGAL_OPTIONAL_ANY			 126
#define ASN1_R_ILLEGAL_OPTIONS_ON_ITEM_TEMPLATE		 170
#define ASN1_R_ILLEGAL_TAGGED_ANY			 127
#define ASN1_R_ILLEGAL_TIME_VALUE			 184
#define ASN1_R_INTEGER_NOT_ASCII_FORMAT			 185
#define ASN1_R_INTEGER_TOO_LARGE_FOR_LONG		 128
#define ASN1_R_INVALID_BMPSTRING_LENGTH			 129
#define ASN1_R_INVALID_DIGIT				 130
#define ASN1_R_INVALID_MIME_TYPE			 200
#define ASN1_R_INVALID_MODIFIER				 186
#define ASN1_R_INVALID_NUMBER				 187
#define ASN1_R_INVALID_SEPARATOR			 131
#define ASN1_R_INVALID_TIME_FORMAT			 132
#define ASN1_R_INVALID_UNIVERSALSTRING_LENGTH		 133
#define ASN1_R_INVALID_UTF8STRING			 134
#define ASN1_R_IV_TOO_LARGE				 135
#define ASN1_R_LENGTH_ERROR				 136
#define ASN1_R_LIST_ERROR				 188
#define ASN1_R_MIME_NO_CONTENT_TYPE			 201
#define ASN1_R_MIME_PARSE_ERROR				 202
#define ASN1_R_MIME_SIG_PARSE_ERROR			 203
#define ASN1_R_MISSING_EOC				 137
#define ASN1_R_MISSING_SECOND_NUMBER			 138
#define ASN1_R_MISSING_VALUE				 189
#define ASN1_R_MSTRING_NOT_UNIVERSAL			 139
#define ASN1_R_MSTRING_WRONG_TAG			 140
#define ASN1_R_NESTED_ASN1_STRING			 197
#define ASN1_R_NON_HEX_CHARACTERS			 141
#define ASN1_R_NOT_ASCII_FORMAT				 190
#define ASN1_R_NOT_ENOUGH_DATA				 142
#define ASN1_R_NO_CONTENT_TYPE				 204
#define ASN1_R_NO_MATCHING_CHOICE_TYPE			 143
#define ASN1_R_NO_MULTIPART_BODY_FAILURE		 205
#define ASN1_R_NO_MULTIPART_BOUNDARY			 206
#define ASN1_R_NO_SIG_CONTENT_TYPE			 207
#define ASN1_R_NULL_IS_WRONG_LENGTH			 144
#define ASN1_R_OBJECT_NOT_ASCII_FORMAT			 191
#define ASN1_R_ODD_NUMBER_OF_CHARS			 145
#define ASN1_R_PRIVATE_KEY_HEADER_MISSING		 146
#define ASN1_R_SECOND_NUMBER_TOO_LARGE			 147
#define ASN1_R_SEQUENCE_LENGTH_MISMATCH			 148
#define ASN1_R_SEQUENCE_NOT_CONSTRUCTED			 149
#define ASN1_R_SEQUENCE_OR_SET_NEEDS_CONFIG		 192
#define ASN1_R_SHORT_LINE				 150
#define ASN1_R_SIG_INVALID_MIME_TYPE			 208
#define ASN1_R_STREAMING_NOT_SUPPORTED			 209
#define ASN1_R_STRING_TOO_LONG				 151
#define ASN1_R_STRING_TOO_SHORT				 152
#define ASN1_R_TAG_VALUE_TOO_HIGH			 153
#define ASN1_R_THE_ASN1_OBJECT_IDENTIFIER_IS_NOT_KNOWN_FOR_THIS_MD 154
#define ASN1_R_TIME_NOT_ASCII_FORMAT			 193
#define ASN1_R_TOO_LONG					 155
#define ASN1_R_TYPE_NOT_CONSTRUCTED			 156
#define ASN1_R_UNABLE_TO_DECODE_RSA_KEY			 157
#define ASN1_R_UNABLE_TO_DECODE_RSA_PRIVATE_KEY		 158
#define ASN1_R_UNEXPECTED_EOC				 159
#define ASN1_R_UNIVERSALSTRING_IS_WRONG_LENGTH		 211
#define ASN1_R_UNKNOWN_FORMAT				 160
#define ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM		 161
#define ASN1_R_UNKNOWN_OBJECT_TYPE			 162
#define ASN1_R_UNKNOWN_PUBLIC_KEY_TYPE			 163
#define ASN1_R_UNKNOWN_TAG				 194
#define ASN1_R_UNKOWN_FORMAT				 195
#define ASN1_R_UNSUPPORTED_ANY_DEFINED_BY_TYPE		 164
#define ASN1_R_UNSUPPORTED_CIPHER			 165
#define ASN1_R_UNSUPPORTED_ENCRYPTION_ALGORITHM		 166
#define ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE		 167
#define ASN1_R_UNSUPPORTED_TYPE				 196
#define ASN1_R_WRONG_TAG				 168
#define ASN1_R_WRONG_TYPE				 169

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/md5.h0000755000175000017500000001116211341640430017457 0ustar  davidedavide/* crypto/md5/md5.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_MD5_H
#define HEADER_MD5_H

#include 
#include 

#ifdef  __cplusplus
extern "C" {
#endif

#ifdef OPENSSL_NO_MD5
#error MD5 is disabled.
#endif

/*
 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 * ! MD5_LONG has to be at least 32 bits wide. If it's wider, then !
 * ! MD5_LONG_LOG2 has to be defined along.			   !
 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 */

#if defined(OPENSSL_SYS_WIN16) || defined(__LP32__)
#define MD5_LONG unsigned long
#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__)
#define MD5_LONG unsigned long
#define MD5_LONG_LOG2 3
/*
 * _CRAY note. I could declare short, but I have no idea what impact
 * does it have on performance on none-T3E machines. I could declare
 * int, but at least on C90 sizeof(int) can be chosen at compile time.
 * So I've chosen long...
 *					
 */
#else
#define MD5_LONG unsigned int
#endif

#define MD5_CBLOCK	64
#define MD5_LBLOCK	(MD5_CBLOCK/4)
#define MD5_DIGEST_LENGTH 16

typedef struct MD5state_st
	{
	MD5_LONG A,B,C,D;
	MD5_LONG Nl,Nh;
	MD5_LONG data[MD5_LBLOCK];
	unsigned int num;
	} MD5_CTX;

#ifdef OPENSSL_FIPS
int private_MD5_Init(MD5_CTX *c);
#endif
int MD5_Init(MD5_CTX *c);
int MD5_Update(MD5_CTX *c, const void *data, size_t len);
int MD5_Final(unsigned char *md, MD5_CTX *c);
unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
void MD5_Transform(MD5_CTX *c, const unsigned char *b);
#ifdef  __cplusplus
}
#endif

#endif
xmail-1.27/win32ssl/include/openssl/bio.h0000755000175000017500000007414611341640430017556 0ustar  davidedavide/* crypto/bio/bio.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_BIO_H
#define HEADER_BIO_H

#include 

#ifndef OPENSSL_NO_FP_API
# include 
#endif
#include 

#include 

#ifdef  __cplusplus
extern "C" {
#endif

/* These are the 'types' of BIOs */
#define BIO_TYPE_NONE		0
#define BIO_TYPE_MEM		(1|0x0400)
#define BIO_TYPE_FILE		(2|0x0400)

#define BIO_TYPE_FD		(4|0x0400|0x0100)
#define BIO_TYPE_SOCKET		(5|0x0400|0x0100)
#define BIO_TYPE_NULL		(6|0x0400)
#define BIO_TYPE_SSL		(7|0x0200)
#define BIO_TYPE_MD		(8|0x0200)		/* passive filter */
#define BIO_TYPE_BUFFER		(9|0x0200)		/* filter */
#define BIO_TYPE_CIPHER		(10|0x0200)		/* filter */
#define BIO_TYPE_BASE64		(11|0x0200)		/* filter */
#define BIO_TYPE_CONNECT	(12|0x0400|0x0100)	/* socket - connect */
#define BIO_TYPE_ACCEPT		(13|0x0400|0x0100)	/* socket for accept */
#define BIO_TYPE_PROXY_CLIENT	(14|0x0200)		/* client proxy BIO */
#define BIO_TYPE_PROXY_SERVER	(15|0x0200)		/* server proxy BIO */
#define BIO_TYPE_NBIO_TEST	(16|0x0200)		/* server proxy BIO */
#define BIO_TYPE_NULL_FILTER	(17|0x0200)
#define BIO_TYPE_BER		(18|0x0200)		/* BER -> bin filter */
#define BIO_TYPE_BIO		(19|0x0400)		/* (half a) BIO pair */
#define BIO_TYPE_LINEBUFFER	(20|0x0200)		/* filter */
#define BIO_TYPE_DGRAM		(21|0x0400|0x0100)
#define BIO_TYPE_COMP 		(23|0x0200)		/* filter */

#define BIO_TYPE_DESCRIPTOR	0x0100	/* socket, fd, connect or accept */
#define BIO_TYPE_FILTER		0x0200
#define BIO_TYPE_SOURCE_SINK	0x0400

/* BIO_FILENAME_READ|BIO_CLOSE to open or close on free.
 * BIO_set_fp(in,stdin,BIO_NOCLOSE); */
#define BIO_NOCLOSE		0x00
#define BIO_CLOSE		0x01

/* These are used in the following macros and are passed to
 * BIO_ctrl() */
#define BIO_CTRL_RESET		1  /* opt - rewind/zero etc */
#define BIO_CTRL_EOF		2  /* opt - are we at the eof */
#define BIO_CTRL_INFO		3  /* opt - extra tit-bits */
#define BIO_CTRL_SET		4  /* man - set the 'IO' type */
#define BIO_CTRL_GET		5  /* man - get the 'IO' type */
#define BIO_CTRL_PUSH		6  /* opt - internal, used to signify change */
#define BIO_CTRL_POP		7  /* opt - internal, used to signify change */
#define BIO_CTRL_GET_CLOSE	8  /* man - set the 'close' on free */
#define BIO_CTRL_SET_CLOSE	9  /* man - set the 'close' on free */
#define BIO_CTRL_PENDING	10  /* opt - is their more data buffered */
#define BIO_CTRL_FLUSH		11  /* opt - 'flush' buffered output */
#define BIO_CTRL_DUP		12  /* man - extra stuff for 'duped' BIO */
#define BIO_CTRL_WPENDING	13  /* opt - number of bytes still to write */
/* callback is int cb(BIO *bio,state,ret); */
#define BIO_CTRL_SET_CALLBACK	14  /* opt - set callback function */
#define BIO_CTRL_GET_CALLBACK	15  /* opt - set callback function */

#define BIO_CTRL_SET_FILENAME	30	/* BIO_s_file special */

/* dgram BIO stuff */
#define BIO_CTRL_DGRAM_CONNECT       31  /* BIO dgram special */
#define BIO_CTRL_DGRAM_SET_CONNECTED 32  /* allow for an externally
					  * connected socket to be
					  * passed in */ 
#define BIO_CTRL_DGRAM_SET_RECV_TIMEOUT 33 /* setsockopt, essentially */
#define BIO_CTRL_DGRAM_GET_RECV_TIMEOUT 34 /* getsockopt, essentially */
#define BIO_CTRL_DGRAM_SET_SEND_TIMEOUT 35 /* setsockopt, essentially */
#define BIO_CTRL_DGRAM_GET_SEND_TIMEOUT 36 /* getsockopt, essentially */

#define BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP 37 /* flag whether the last */
#define BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP 38 /* I/O operation tiemd out */
					
/* #ifdef IP_MTU_DISCOVER */
#define BIO_CTRL_DGRAM_MTU_DISCOVER       39 /* set DF bit on egress packets */
/* #endif */

#define BIO_CTRL_DGRAM_QUERY_MTU          40 /* as kernel for current MTU */
#define BIO_CTRL_DGRAM_GET_MTU            41 /* get cached value for MTU */
#define BIO_CTRL_DGRAM_SET_MTU            42 /* set cached value for
					      * MTU. want to use this
					      * if asking the kernel
					      * fails */

#define BIO_CTRL_DGRAM_MTU_EXCEEDED       43 /* check whether the MTU
					      * was exceed in the
					      * previous write
					      * operation */

#define BIO_CTRL_DGRAM_SET_PEER           44 /* Destination for the data */


/* modifiers */
#define BIO_FP_READ		0x02
#define BIO_FP_WRITE		0x04
#define BIO_FP_APPEND		0x08
#define BIO_FP_TEXT		0x10

#define BIO_FLAGS_READ		0x01
#define BIO_FLAGS_WRITE		0x02
#define BIO_FLAGS_IO_SPECIAL	0x04
#define BIO_FLAGS_RWS (BIO_FLAGS_READ|BIO_FLAGS_WRITE|BIO_FLAGS_IO_SPECIAL)
#define BIO_FLAGS_SHOULD_RETRY	0x08
#ifndef	BIO_FLAGS_UPLINK
/* "UPLINK" flag denotes file descriptors provided by application.
   It defaults to 0, as most platforms don't require UPLINK interface. */
#define	BIO_FLAGS_UPLINK	0
#endif

/* Used in BIO_gethostbyname() */
#define BIO_GHBN_CTRL_HITS		1
#define BIO_GHBN_CTRL_MISSES		2
#define BIO_GHBN_CTRL_CACHE_SIZE	3
#define BIO_GHBN_CTRL_GET_ENTRY		4
#define BIO_GHBN_CTRL_FLUSH		5

/* Mostly used in the SSL BIO */
/* Not used anymore
 * #define BIO_FLAGS_PROTOCOL_DELAYED_READ 0x10
 * #define BIO_FLAGS_PROTOCOL_DELAYED_WRITE 0x20
 * #define BIO_FLAGS_PROTOCOL_STARTUP	0x40
 */

#define BIO_FLAGS_BASE64_NO_NL	0x100

/* This is used with memory BIOs: it means we shouldn't free up or change the
 * data in any way.
 */
#define BIO_FLAGS_MEM_RDONLY	0x200

typedef struct bio_st BIO;

void BIO_set_flags(BIO *b, int flags);
int  BIO_test_flags(const BIO *b, int flags);
void BIO_clear_flags(BIO *b, int flags);

#define BIO_get_flags(b) BIO_test_flags(b, ~(0x0))
#define BIO_set_retry_special(b) \
		BIO_set_flags(b, (BIO_FLAGS_IO_SPECIAL|BIO_FLAGS_SHOULD_RETRY))
#define BIO_set_retry_read(b) \
		BIO_set_flags(b, (BIO_FLAGS_READ|BIO_FLAGS_SHOULD_RETRY))
#define BIO_set_retry_write(b) \
		BIO_set_flags(b, (BIO_FLAGS_WRITE|BIO_FLAGS_SHOULD_RETRY))

/* These are normally used internally in BIOs */
#define BIO_clear_retry_flags(b) \
		BIO_clear_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY))
#define BIO_get_retry_flags(b) \
		BIO_test_flags(b, (BIO_FLAGS_RWS|BIO_FLAGS_SHOULD_RETRY))

/* These should be used by the application to tell why we should retry */
#define BIO_should_read(a)		BIO_test_flags(a, BIO_FLAGS_READ)
#define BIO_should_write(a)		BIO_test_flags(a, BIO_FLAGS_WRITE)
#define BIO_should_io_special(a)	BIO_test_flags(a, BIO_FLAGS_IO_SPECIAL)
#define BIO_retry_type(a)		BIO_test_flags(a, BIO_FLAGS_RWS)
#define BIO_should_retry(a)		BIO_test_flags(a, BIO_FLAGS_SHOULD_RETRY)

/* The next three are used in conjunction with the
 * BIO_should_io_special() condition.  After this returns true,
 * BIO *BIO_get_retry_BIO(BIO *bio, int *reason); will walk the BIO 
 * stack and return the 'reason' for the special and the offending BIO.
 * Given a BIO, BIO_get_retry_reason(bio) will return the code. */
/* Returned from the SSL bio when the certificate retrieval code had an error */
#define BIO_RR_SSL_X509_LOOKUP		0x01
/* Returned from the connect BIO when a connect would have blocked */
#define BIO_RR_CONNECT			0x02
/* Returned from the accept BIO when an accept would have blocked */
#define BIO_RR_ACCEPT			0x03

/* These are passed by the BIO callback */
#define BIO_CB_FREE	0x01
#define BIO_CB_READ	0x02
#define BIO_CB_WRITE	0x03
#define BIO_CB_PUTS	0x04
#define BIO_CB_GETS	0x05
#define BIO_CB_CTRL	0x06

/* The callback is called before and after the underling operation,
 * The BIO_CB_RETURN flag indicates if it is after the call */
#define BIO_CB_RETURN	0x80
#define BIO_CB_return(a) ((a)|BIO_CB_RETURN))
#define BIO_cb_pre(a)	(!((a)&BIO_CB_RETURN))
#define BIO_cb_post(a)	((a)&BIO_CB_RETURN)

long (*BIO_get_callback(const BIO *b)) (struct bio_st *,int,const char *,int, long,long);
void BIO_set_callback(BIO *b, 
	long (*callback)(struct bio_st *,int,const char *,int, long,long));
char *BIO_get_callback_arg(const BIO *b);
void BIO_set_callback_arg(BIO *b, char *arg);

const char * BIO_method_name(const BIO *b);
int BIO_method_type(const BIO *b);

typedef void bio_info_cb(struct bio_st *, int, const char *, int, long, long);

#ifndef OPENSSL_SYS_WIN16
typedef struct bio_method_st
	{
	int type;
	const char *name;
	int (*bwrite)(BIO *, const char *, int);
	int (*bread)(BIO *, char *, int);
	int (*bputs)(BIO *, const char *);
	int (*bgets)(BIO *, char *, int);
	long (*ctrl)(BIO *, int, long, void *);
	int (*create)(BIO *);
	int (*destroy)(BIO *);
        long (*callback_ctrl)(BIO *, int, bio_info_cb *);
	} BIO_METHOD;
#else
typedef struct bio_method_st
	{
	int type;
	const char *name;
	int (_far *bwrite)();
	int (_far *bread)();
	int (_far *bputs)();
	int (_far *bgets)();
	long (_far *ctrl)();
	int (_far *create)();
	int (_far *destroy)();
	long (_far *callback_ctrl)();
	} BIO_METHOD;
#endif

struct bio_st
	{
	BIO_METHOD *method;
	/* bio, mode, argp, argi, argl, ret */
	long (*callback)(struct bio_st *,int,const char *,int, long,long);
	char *cb_arg; /* first argument for the callback */

	int init;
	int shutdown;
	int flags;	/* extra storage */
	int retry_reason;
	int num;
	void *ptr;
	struct bio_st *next_bio;	/* used by filter BIOs */
	struct bio_st *prev_bio;	/* used by filter BIOs */
	int references;
	unsigned long num_read;
	unsigned long num_write;

	CRYPTO_EX_DATA ex_data;
	};

DECLARE_STACK_OF(BIO)

typedef struct bio_f_buffer_ctx_struct
	{
	/* BIO *bio; */ /* this is now in the BIO struct */
	int ibuf_size;	/* how big is the input buffer */
	int obuf_size;	/* how big is the output buffer */

	char *ibuf;		/* the char array */
	int ibuf_len;		/* how many bytes are in it */
	int ibuf_off;		/* write/read offset */

	char *obuf;		/* the char array */
	int obuf_len;		/* how many bytes are in it */
	int obuf_off;		/* write/read offset */
	} BIO_F_BUFFER_CTX;

/* connect BIO stuff */
#define BIO_CONN_S_BEFORE		1
#define BIO_CONN_S_GET_IP		2
#define BIO_CONN_S_GET_PORT		3
#define BIO_CONN_S_CREATE_SOCKET	4
#define BIO_CONN_S_CONNECT		5
#define BIO_CONN_S_OK			6
#define BIO_CONN_S_BLOCKED_CONNECT	7
#define BIO_CONN_S_NBIO			8
/*#define BIO_CONN_get_param_hostname	BIO_ctrl */

#define BIO_C_SET_CONNECT			100
#define BIO_C_DO_STATE_MACHINE			101
#define BIO_C_SET_NBIO				102
#define BIO_C_SET_PROXY_PARAM			103
#define BIO_C_SET_FD				104
#define BIO_C_GET_FD				105
#define BIO_C_SET_FILE_PTR			106
#define BIO_C_GET_FILE_PTR			107
#define BIO_C_SET_FILENAME			108
#define BIO_C_SET_SSL				109
#define BIO_C_GET_SSL				110
#define BIO_C_SET_MD				111
#define BIO_C_GET_MD				112
#define BIO_C_GET_CIPHER_STATUS			113
#define BIO_C_SET_BUF_MEM			114
#define BIO_C_GET_BUF_MEM_PTR			115
#define BIO_C_GET_BUFF_NUM_LINES		116
#define BIO_C_SET_BUFF_SIZE			117
#define BIO_C_SET_ACCEPT			118
#define BIO_C_SSL_MODE				119
#define BIO_C_GET_MD_CTX			120
#define BIO_C_GET_PROXY_PARAM			121
#define BIO_C_SET_BUFF_READ_DATA		122 /* data to read first */
#define BIO_C_GET_CONNECT			123
#define BIO_C_GET_ACCEPT			124
#define BIO_C_SET_SSL_RENEGOTIATE_BYTES		125
#define BIO_C_GET_SSL_NUM_RENEGOTIATES		126
#define BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT	127
#define BIO_C_FILE_SEEK				128
#define BIO_C_GET_CIPHER_CTX			129
#define BIO_C_SET_BUF_MEM_EOF_RETURN		130/*return end of input value*/
#define BIO_C_SET_BIND_MODE			131
#define BIO_C_GET_BIND_MODE			132
#define BIO_C_FILE_TELL				133
#define BIO_C_GET_SOCKS				134
#define BIO_C_SET_SOCKS				135

#define BIO_C_SET_WRITE_BUF_SIZE		136/* for BIO_s_bio */
#define BIO_C_GET_WRITE_BUF_SIZE		137
#define BIO_C_MAKE_BIO_PAIR			138
#define BIO_C_DESTROY_BIO_PAIR			139
#define BIO_C_GET_WRITE_GUARANTEE		140
#define BIO_C_GET_READ_REQUEST			141
#define BIO_C_SHUTDOWN_WR			142
#define BIO_C_NREAD0				143
#define BIO_C_NREAD				144
#define BIO_C_NWRITE0				145
#define BIO_C_NWRITE				146
#define BIO_C_RESET_READ_REQUEST		147
#define BIO_C_SET_MD_CTX			148


#define BIO_set_app_data(s,arg)		BIO_set_ex_data(s,0,arg)
#define BIO_get_app_data(s)		BIO_get_ex_data(s,0)

/* BIO_s_connect() and BIO_s_socks4a_connect() */
#define BIO_set_conn_hostname(b,name) BIO_ctrl(b,BIO_C_SET_CONNECT,0,(char *)name)
#define BIO_set_conn_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,1,(char *)port)
#define BIO_set_conn_ip(b,ip)	  BIO_ctrl(b,BIO_C_SET_CONNECT,2,(char *)ip)
#define BIO_set_conn_int_port(b,port) BIO_ctrl(b,BIO_C_SET_CONNECT,3,(char *)port)
#define BIO_get_conn_hostname(b)  BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,0)
#define BIO_get_conn_port(b)      BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,1)
#define BIO_get_conn_ip(b) 		 BIO_ptr_ctrl(b,BIO_C_GET_CONNECT,2)
#define BIO_get_conn_int_port(b) BIO_int_ctrl(b,BIO_C_GET_CONNECT,3)


#define BIO_set_nbio(b,n)	BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL)

/* BIO_s_accept_socket() */
#define BIO_set_accept_port(b,name) BIO_ctrl(b,BIO_C_SET_ACCEPT,0,(char *)name)
#define BIO_get_accept_port(b)	BIO_ptr_ctrl(b,BIO_C_GET_ACCEPT,0)
/* #define BIO_set_nbio(b,n)	BIO_ctrl(b,BIO_C_SET_NBIO,(n),NULL) */
#define BIO_set_nbio_accept(b,n) BIO_ctrl(b,BIO_C_SET_ACCEPT,1,(n)?"a":NULL)
#define BIO_set_accept_bios(b,bio) BIO_ctrl(b,BIO_C_SET_ACCEPT,2,(char *)bio)

#define BIO_BIND_NORMAL			0
#define BIO_BIND_REUSEADDR_IF_UNUSED	1
#define BIO_BIND_REUSEADDR		2
#define BIO_set_bind_mode(b,mode) BIO_ctrl(b,BIO_C_SET_BIND_MODE,mode,NULL)
#define BIO_get_bind_mode(b,mode) BIO_ctrl(b,BIO_C_GET_BIND_MODE,0,NULL)

#define BIO_do_connect(b)	BIO_do_handshake(b)
#define BIO_do_accept(b)	BIO_do_handshake(b)
#define BIO_do_handshake(b)	BIO_ctrl(b,BIO_C_DO_STATE_MACHINE,0,NULL)

/* BIO_s_proxy_client() */
#define BIO_set_url(b,url)	BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,0,(char *)(url))
#define BIO_set_proxies(b,p)	BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,1,(char *)(p))
/* BIO_set_nbio(b,n) */
#define BIO_set_filter_bio(b,s) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,2,(char *)(s))
/* BIO *BIO_get_filter_bio(BIO *bio); */
#define BIO_set_proxy_cb(b,cb) BIO_callback_ctrl(b,BIO_C_SET_PROXY_PARAM,3,(void *(*cb)()))
#define BIO_set_proxy_header(b,sk) BIO_ctrl(b,BIO_C_SET_PROXY_PARAM,4,(char *)sk)
#define BIO_set_no_connect_return(b,bool) BIO_int_ctrl(b,BIO_C_SET_PROXY_PARAM,5,bool)

#define BIO_get_proxy_header(b,skp) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,0,(char *)skp)
#define BIO_get_proxies(b,pxy_p) BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,1,(char *)(pxy_p))
#define BIO_get_url(b,url)	BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,2,(char *)(url))
#define BIO_get_no_connect_return(b)	BIO_ctrl(b,BIO_C_GET_PROXY_PARAM,5,NULL)

#define BIO_set_fd(b,fd,c)	BIO_int_ctrl(b,BIO_C_SET_FD,c,fd)
#define BIO_get_fd(b,c)		BIO_ctrl(b,BIO_C_GET_FD,0,(char *)c)

#define BIO_set_fp(b,fp,c)	BIO_ctrl(b,BIO_C_SET_FILE_PTR,c,(char *)fp)
#define BIO_get_fp(b,fpp)	BIO_ctrl(b,BIO_C_GET_FILE_PTR,0,(char *)fpp)

#define BIO_seek(b,ofs)	(int)BIO_ctrl(b,BIO_C_FILE_SEEK,ofs,NULL)
#define BIO_tell(b)	(int)BIO_ctrl(b,BIO_C_FILE_TELL,0,NULL)

/* name is cast to lose const, but might be better to route through a function
   so we can do it safely */
#ifdef CONST_STRICT
/* If you are wondering why this isn't defined, its because CONST_STRICT is
 * purely a compile-time kludge to allow const to be checked.
 */
int BIO_read_filename(BIO *b,const char *name);
#else
#define BIO_read_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \
		BIO_CLOSE|BIO_FP_READ,(char *)name)
#endif
#define BIO_write_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \
		BIO_CLOSE|BIO_FP_WRITE,name)
#define BIO_append_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \
		BIO_CLOSE|BIO_FP_APPEND,name)
#define BIO_rw_filename(b,name) BIO_ctrl(b,BIO_C_SET_FILENAME, \
		BIO_CLOSE|BIO_FP_READ|BIO_FP_WRITE,name)

/* WARNING WARNING, this ups the reference count on the read bio of the
 * SSL structure.  This is because the ssl read BIO is now pointed to by
 * the next_bio field in the bio.  So when you free the BIO, make sure
 * you are doing a BIO_free_all() to catch the underlying BIO. */
#define BIO_set_ssl(b,ssl,c)	BIO_ctrl(b,BIO_C_SET_SSL,c,(char *)ssl)
#define BIO_get_ssl(b,sslp)	BIO_ctrl(b,BIO_C_GET_SSL,0,(char *)sslp)
#define BIO_set_ssl_mode(b,client)	BIO_ctrl(b,BIO_C_SSL_MODE,client,NULL)
#define BIO_set_ssl_renegotiate_bytes(b,num) \
	BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_BYTES,num,NULL);
#define BIO_get_num_renegotiates(b) \
	BIO_ctrl(b,BIO_C_GET_SSL_NUM_RENEGOTIATES,0,NULL);
#define BIO_set_ssl_renegotiate_timeout(b,seconds) \
	BIO_ctrl(b,BIO_C_SET_SSL_RENEGOTIATE_TIMEOUT,seconds,NULL);

/* defined in evp.h */
/* #define BIO_set_md(b,md)	BIO_ctrl(b,BIO_C_SET_MD,1,(char *)md) */

#define BIO_get_mem_data(b,pp)	BIO_ctrl(b,BIO_CTRL_INFO,0,(char *)pp)
#define BIO_set_mem_buf(b,bm,c)	BIO_ctrl(b,BIO_C_SET_BUF_MEM,c,(char *)bm)
#define BIO_get_mem_ptr(b,pp)	BIO_ctrl(b,BIO_C_GET_BUF_MEM_PTR,0,(char *)pp)
#define BIO_set_mem_eof_return(b,v) \
				BIO_ctrl(b,BIO_C_SET_BUF_MEM_EOF_RETURN,v,NULL)

/* For the BIO_f_buffer() type */
#define BIO_get_buffer_num_lines(b)	BIO_ctrl(b,BIO_C_GET_BUFF_NUM_LINES,0,NULL)
#define BIO_set_buffer_size(b,size)	BIO_ctrl(b,BIO_C_SET_BUFF_SIZE,size,NULL)
#define BIO_set_read_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,0)
#define BIO_set_write_buffer_size(b,size) BIO_int_ctrl(b,BIO_C_SET_BUFF_SIZE,size,1)
#define BIO_set_buffer_read_data(b,buf,num) BIO_ctrl(b,BIO_C_SET_BUFF_READ_DATA,num,buf)

/* Don't use the next one unless you know what you are doing :-) */
#define BIO_dup_state(b,ret)	BIO_ctrl(b,BIO_CTRL_DUP,0,(char *)(ret))

#define BIO_reset(b)		(int)BIO_ctrl(b,BIO_CTRL_RESET,0,NULL)
#define BIO_eof(b)		(int)BIO_ctrl(b,BIO_CTRL_EOF,0,NULL)
#define BIO_set_close(b,c)	(int)BIO_ctrl(b,BIO_CTRL_SET_CLOSE,(c),NULL)
#define BIO_get_close(b)	(int)BIO_ctrl(b,BIO_CTRL_GET_CLOSE,0,NULL)
#define BIO_pending(b)		(int)BIO_ctrl(b,BIO_CTRL_PENDING,0,NULL)
#define BIO_wpending(b)		(int)BIO_ctrl(b,BIO_CTRL_WPENDING,0,NULL)
/* ...pending macros have inappropriate return type */
size_t BIO_ctrl_pending(BIO *b);
size_t BIO_ctrl_wpending(BIO *b);
#define BIO_flush(b)		(int)BIO_ctrl(b,BIO_CTRL_FLUSH,0,NULL)
#define BIO_get_info_callback(b,cbp) (int)BIO_ctrl(b,BIO_CTRL_GET_CALLBACK,0, \
						   cbp)
#define BIO_set_info_callback(b,cb) (int)BIO_callback_ctrl(b,BIO_CTRL_SET_CALLBACK,cb)

/* For the BIO_f_buffer() type */
#define BIO_buffer_get_num_lines(b) BIO_ctrl(b,BIO_CTRL_GET,0,NULL)

/* For BIO_s_bio() */
#define BIO_set_write_buf_size(b,size) (int)BIO_ctrl(b,BIO_C_SET_WRITE_BUF_SIZE,size,NULL)
#define BIO_get_write_buf_size(b,size) (size_t)BIO_ctrl(b,BIO_C_GET_WRITE_BUF_SIZE,size,NULL)
#define BIO_make_bio_pair(b1,b2)   (int)BIO_ctrl(b1,BIO_C_MAKE_BIO_PAIR,0,b2)
#define BIO_destroy_bio_pair(b)    (int)BIO_ctrl(b,BIO_C_DESTROY_BIO_PAIR,0,NULL)
#define BIO_shutdown_wr(b) (int)BIO_ctrl(b, BIO_C_SHUTDOWN_WR, 0, NULL)
/* macros with inappropriate type -- but ...pending macros use int too: */
#define BIO_get_write_guarantee(b) (int)BIO_ctrl(b,BIO_C_GET_WRITE_GUARANTEE,0,NULL)
#define BIO_get_read_request(b)    (int)BIO_ctrl(b,BIO_C_GET_READ_REQUEST,0,NULL)
size_t BIO_ctrl_get_write_guarantee(BIO *b);
size_t BIO_ctrl_get_read_request(BIO *b);
int BIO_ctrl_reset_read_request(BIO *b);

/* ctrl macros for dgram */
#define BIO_ctrl_dgram_connect(b,peer)  \
                     (int)BIO_ctrl(b,BIO_CTRL_DGRAM_CONNECT,0, (char *)peer)
#define BIO_ctrl_set_connected(b, state, peer) \
         (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_CONNECTED, state, (char *)peer)
#define BIO_dgram_recv_timedout(b) \
         (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_RECV_TIMER_EXP, 0, NULL)
#define BIO_dgram_send_timedout(b) \
         (int)BIO_ctrl(b, BIO_CTRL_DGRAM_GET_SEND_TIMER_EXP, 0, NULL)
#define BIO_dgram_set_peer(b,peer) \
         (int)BIO_ctrl(b, BIO_CTRL_DGRAM_SET_PEER, 0, (char *)peer)

/* These two aren't currently implemented */
/* int BIO_get_ex_num(BIO *bio); */
/* void BIO_set_ex_free_func(BIO *bio,int idx,void (*cb)()); */
int BIO_set_ex_data(BIO *bio,int idx,void *data);
void *BIO_get_ex_data(BIO *bio,int idx);
int BIO_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
	CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
unsigned long BIO_number_read(BIO *bio);
unsigned long BIO_number_written(BIO *bio);

# ifndef OPENSSL_NO_FP_API
#  if defined(OPENSSL_SYS_WIN16) && defined(_WINDLL)
BIO_METHOD *BIO_s_file_internal(void);
BIO *BIO_new_file_internal(char *filename, char *mode);
BIO *BIO_new_fp_internal(FILE *stream, int close_flag);
#    define BIO_s_file	BIO_s_file_internal
#    define BIO_new_file	BIO_new_file_internal
#    define BIO_new_fp	BIO_new_fp_internal
#  else /* FP_API */
BIO_METHOD *BIO_s_file(void );
BIO *BIO_new_file(const char *filename, const char *mode);
BIO *BIO_new_fp(FILE *stream, int close_flag);
#    define BIO_s_file_internal		BIO_s_file
#    define BIO_new_file_internal	BIO_new_file
#    define BIO_new_fp_internal		BIO_s_file
#  endif /* FP_API */
# endif
BIO *	BIO_new(BIO_METHOD *type);
int	BIO_set(BIO *a,BIO_METHOD *type);
int	BIO_free(BIO *a);
void	BIO_vfree(BIO *a);
int	BIO_read(BIO *b, void *data, int len);
int	BIO_gets(BIO *bp,char *buf, int size);
int	BIO_write(BIO *b, const void *data, int len);
int	BIO_puts(BIO *bp,const char *buf);
int	BIO_indent(BIO *b,int indent,int max);
long	BIO_ctrl(BIO *bp,int cmd,long larg,void *parg);
long BIO_callback_ctrl(BIO *b, int cmd, void (*fp)(struct bio_st *, int, const char *, int, long, long));
char *	BIO_ptr_ctrl(BIO *bp,int cmd,long larg);
long	BIO_int_ctrl(BIO *bp,int cmd,long larg,int iarg);
BIO *	BIO_push(BIO *b,BIO *append);
BIO *	BIO_pop(BIO *b);
void	BIO_free_all(BIO *a);
BIO *	BIO_find_type(BIO *b,int bio_type);
BIO *	BIO_next(BIO *b);
BIO *	BIO_get_retry_BIO(BIO *bio, int *reason);
int	BIO_get_retry_reason(BIO *bio);
BIO *	BIO_dup_chain(BIO *in);

int BIO_nread0(BIO *bio, char **buf);
int BIO_nread(BIO *bio, char **buf, int num);
int BIO_nwrite0(BIO *bio, char **buf);
int BIO_nwrite(BIO *bio, char **buf, int num);

#ifndef OPENSSL_SYS_WIN16
long BIO_debug_callback(BIO *bio,int cmd,const char *argp,int argi,
	long argl,long ret);
#else
long _far _loadds BIO_debug_callback(BIO *bio,int cmd,const char *argp,int argi,
	long argl,long ret);
#endif

BIO_METHOD *BIO_s_mem(void);
BIO *BIO_new_mem_buf(void *buf, int len);
BIO_METHOD *BIO_s_socket(void);
BIO_METHOD *BIO_s_connect(void);
BIO_METHOD *BIO_s_accept(void);
BIO_METHOD *BIO_s_fd(void);
#ifndef OPENSSL_SYS_OS2
BIO_METHOD *BIO_s_log(void);
#endif
BIO_METHOD *BIO_s_bio(void);
BIO_METHOD *BIO_s_null(void);
BIO_METHOD *BIO_f_null(void);
BIO_METHOD *BIO_f_buffer(void);
#ifdef OPENSSL_SYS_VMS
BIO_METHOD *BIO_f_linebuffer(void);
#endif
BIO_METHOD *BIO_f_nbio_test(void);
#ifndef OPENSSL_NO_DGRAM
BIO_METHOD *BIO_s_datagram(void);
#endif

/* BIO_METHOD *BIO_f_ber(void); */

int BIO_sock_should_retry(int i);
int BIO_sock_non_fatal_error(int error);
int BIO_dgram_non_fatal_error(int error);

int BIO_fd_should_retry(int i);
int BIO_fd_non_fatal_error(int error);
int BIO_dump_cb(int (*cb)(const void *data, size_t len, void *u),
		void *u, const char *s, int len);
int BIO_dump_indent_cb(int (*cb)(const void *data, size_t len, void *u),
		       void *u, const char *s, int len, int indent);
int BIO_dump(BIO *b,const char *bytes,int len);
int BIO_dump_indent(BIO *b,const char *bytes,int len,int indent);
#ifndef OPENSSL_NO_FP_API
int BIO_dump_fp(FILE *fp, const char *s, int len);
int BIO_dump_indent_fp(FILE *fp, const char *s, int len, int indent);
#endif
struct hostent *BIO_gethostbyname(const char *name);
/* We might want a thread-safe interface too:
 * struct hostent *BIO_gethostbyname_r(const char *name,
 *     struct hostent *result, void *buffer, size_t buflen);
 * or something similar (caller allocates a struct hostent,
 * pointed to by "result", and additional buffer space for the various
 * substructures; if the buffer does not suffice, NULL is returned
 * and an appropriate error code is set).
 */
int BIO_sock_error(int sock);
int BIO_socket_ioctl(int fd, long type, void *arg);
int BIO_socket_nbio(int fd,int mode);
int BIO_get_port(const char *str, unsigned short *port_ptr);
int BIO_get_host_ip(const char *str, unsigned char *ip);
int BIO_get_accept_socket(char *host_port,int mode);
int BIO_accept(int sock,char **ip_port);
int BIO_sock_init(void );
void BIO_sock_cleanup(void);
int BIO_set_tcp_ndelay(int sock,int turn_on);

BIO *BIO_new_socket(int sock, int close_flag);
BIO *BIO_new_dgram(int fd, int close_flag);
BIO *BIO_new_fd(int fd, int close_flag);
BIO *BIO_new_connect(char *host_port);
BIO *BIO_new_accept(char *host_port);

int BIO_new_bio_pair(BIO **bio1, size_t writebuf1,
	BIO **bio2, size_t writebuf2);
/* If successful, returns 1 and in *bio1, *bio2 two BIO pair endpoints.
 * Otherwise returns 0 and sets *bio1 and *bio2 to NULL.
 * Size 0 uses default value.
 */

void BIO_copy_next_retry(BIO *b);

/*long BIO_ghbn_ctrl(int cmd,int iarg,char *parg);*/

#ifdef __GNUC__
#  define __bio_h__attr__ __attribute__
#else
#  define __bio_h__attr__(x)
#endif
int BIO_printf(BIO *bio, const char *format, ...)
	__bio_h__attr__((__format__(__printf__,2,3)));
int BIO_vprintf(BIO *bio, const char *format, va_list args)
	__bio_h__attr__((__format__(__printf__,2,0)));
int BIO_snprintf(char *buf, size_t n, const char *format, ...)
	__bio_h__attr__((__format__(__printf__,3,4)));
int BIO_vsnprintf(char *buf, size_t n, const char *format, va_list args)
	__bio_h__attr__((__format__(__printf__,3,0)));
#undef __bio_h__attr__

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_BIO_strings(void);

/* Error codes for the BIO functions. */

/* Function codes. */
#define BIO_F_ACPT_STATE				 100
#define BIO_F_BIO_ACCEPT				 101
#define BIO_F_BIO_BER_GET_HEADER			 102
#define BIO_F_BIO_CALLBACK_CTRL				 131
#define BIO_F_BIO_CTRL					 103
#define BIO_F_BIO_GETHOSTBYNAME				 120
#define BIO_F_BIO_GETS					 104
#define BIO_F_BIO_GET_ACCEPT_SOCKET			 105
#define BIO_F_BIO_GET_HOST_IP				 106
#define BIO_F_BIO_GET_PORT				 107
#define BIO_F_BIO_MAKE_PAIR				 121
#define BIO_F_BIO_NEW					 108
#define BIO_F_BIO_NEW_FILE				 109
#define BIO_F_BIO_NEW_MEM_BUF				 126
#define BIO_F_BIO_NREAD					 123
#define BIO_F_BIO_NREAD0				 124
#define BIO_F_BIO_NWRITE				 125
#define BIO_F_BIO_NWRITE0				 122
#define BIO_F_BIO_PUTS					 110
#define BIO_F_BIO_READ					 111
#define BIO_F_BIO_SOCK_INIT				 112
#define BIO_F_BIO_WRITE					 113
#define BIO_F_BUFFER_CTRL				 114
#define BIO_F_CONN_CTRL					 127
#define BIO_F_CONN_STATE				 115
#define BIO_F_FILE_CTRL					 116
#define BIO_F_FILE_READ					 130
#define BIO_F_LINEBUFFER_CTRL				 129
#define BIO_F_MEM_READ					 128
#define BIO_F_MEM_WRITE					 117
#define BIO_F_SSL_NEW					 118
#define BIO_F_WSASTARTUP				 119

/* Reason codes. */
#define BIO_R_ACCEPT_ERROR				 100
#define BIO_R_BAD_FOPEN_MODE				 101
#define BIO_R_BAD_HOSTNAME_LOOKUP			 102
#define BIO_R_BROKEN_PIPE				 124
#define BIO_R_CONNECT_ERROR				 103
#define BIO_R_EOF_ON_MEMORY_BIO				 127
#define BIO_R_ERROR_SETTING_NBIO			 104
#define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPTED_SOCKET	 105
#define BIO_R_ERROR_SETTING_NBIO_ON_ACCEPT_SOCKET	 106
#define BIO_R_GETHOSTBYNAME_ADDR_IS_NOT_AF_INET		 107
#define BIO_R_INVALID_ARGUMENT				 125
#define BIO_R_INVALID_IP_ADDRESS			 108
#define BIO_R_IN_USE					 123
#define BIO_R_KEEPALIVE					 109
#define BIO_R_NBIO_CONNECT_ERROR			 110
#define BIO_R_NO_ACCEPT_PORT_SPECIFIED			 111
#define BIO_R_NO_HOSTNAME_SPECIFIED			 112
#define BIO_R_NO_PORT_DEFINED				 113
#define BIO_R_NO_PORT_SPECIFIED				 114
#define BIO_R_NO_SUCH_FILE				 128
#define BIO_R_NULL_PARAMETER				 115
#define BIO_R_TAG_MISMATCH				 116
#define BIO_R_UNABLE_TO_BIND_SOCKET			 117
#define BIO_R_UNABLE_TO_CREATE_SOCKET			 118
#define BIO_R_UNABLE_TO_LISTEN_SOCKET			 119
#define BIO_R_UNINITIALIZED				 120
#define BIO_R_UNSUPPORTED_METHOD			 121
#define BIO_R_WRITE_TO_READ_ONLY_BIO			 126
#define BIO_R_WSASTARTUP				 122

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/pkcs7.h0000755000175000017500000003771511341640430020035 0ustar  davidedavide/* crypto/pkcs7/pkcs7.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_PKCS7_H
#define HEADER_PKCS7_H

#include 
#include 
#include 

#include 
#include 

#ifdef  __cplusplus
extern "C" {
#endif

#ifdef OPENSSL_SYS_WIN32
/* Under Win32 thes are defined in wincrypt.h */
#undef PKCS7_ISSUER_AND_SERIAL
#undef PKCS7_SIGNER_INFO
#endif

/*
Encryption_ID		DES-CBC
Digest_ID		MD5
Digest_Encryption_ID	rsaEncryption
Key_Encryption_ID	rsaEncryption
*/

typedef struct pkcs7_issuer_and_serial_st
	{
	X509_NAME *issuer;
	ASN1_INTEGER *serial;
	} PKCS7_ISSUER_AND_SERIAL;

typedef struct pkcs7_signer_info_st
	{
	ASN1_INTEGER 			*version;	/* version 1 */
	PKCS7_ISSUER_AND_SERIAL		*issuer_and_serial;
	X509_ALGOR			*digest_alg;
	STACK_OF(X509_ATTRIBUTE)	*auth_attr;	/* [ 0 ] */
	X509_ALGOR			*digest_enc_alg;
	ASN1_OCTET_STRING		*enc_digest;
	STACK_OF(X509_ATTRIBUTE)	*unauth_attr;	/* [ 1 ] */

	/* The private key to sign with */
	EVP_PKEY			*pkey;
	} PKCS7_SIGNER_INFO;

DECLARE_STACK_OF(PKCS7_SIGNER_INFO)
DECLARE_ASN1_SET_OF(PKCS7_SIGNER_INFO)

typedef struct pkcs7_recip_info_st
	{
	ASN1_INTEGER			*version;	/* version 0 */
	PKCS7_ISSUER_AND_SERIAL		*issuer_and_serial;
	X509_ALGOR			*key_enc_algor;
	ASN1_OCTET_STRING		*enc_key;
	X509				*cert; /* get the pub-key from this */
	} PKCS7_RECIP_INFO;

DECLARE_STACK_OF(PKCS7_RECIP_INFO)
DECLARE_ASN1_SET_OF(PKCS7_RECIP_INFO)

typedef struct pkcs7_signed_st
	{
	ASN1_INTEGER			*version;	/* version 1 */
	STACK_OF(X509_ALGOR)		*md_algs;	/* md used */
	STACK_OF(X509)			*cert;		/* [ 0 ] */
	STACK_OF(X509_CRL)		*crl;		/* [ 1 ] */
	STACK_OF(PKCS7_SIGNER_INFO)	*signer_info;

	struct pkcs7_st			*contents;
	} PKCS7_SIGNED;
/* The above structure is very very similar to PKCS7_SIGN_ENVELOPE.
 * How about merging the two */

typedef struct pkcs7_enc_content_st
	{
	ASN1_OBJECT			*content_type;
	X509_ALGOR			*algorithm;
	ASN1_OCTET_STRING		*enc_data;	/* [ 0 ] */
	const EVP_CIPHER		*cipher;
	} PKCS7_ENC_CONTENT;

typedef struct pkcs7_enveloped_st
	{
	ASN1_INTEGER			*version;	/* version 0 */
	STACK_OF(PKCS7_RECIP_INFO)	*recipientinfo;
	PKCS7_ENC_CONTENT		*enc_data;
	} PKCS7_ENVELOPE;

typedef struct pkcs7_signedandenveloped_st
	{
	ASN1_INTEGER			*version;	/* version 1 */
	STACK_OF(X509_ALGOR)		*md_algs;	/* md used */
	STACK_OF(X509)			*cert;		/* [ 0 ] */
	STACK_OF(X509_CRL)		*crl;		/* [ 1 ] */
	STACK_OF(PKCS7_SIGNER_INFO)	*signer_info;

	PKCS7_ENC_CONTENT		*enc_data;
	STACK_OF(PKCS7_RECIP_INFO)	*recipientinfo;
	} PKCS7_SIGN_ENVELOPE;

typedef struct pkcs7_digest_st
	{
	ASN1_INTEGER			*version;	/* version 0 */
	X509_ALGOR			*md;		/* md used */
	struct pkcs7_st 		*contents;
	ASN1_OCTET_STRING		*digest;
	} PKCS7_DIGEST;

typedef struct pkcs7_encrypted_st
	{
	ASN1_INTEGER			*version;	/* version 0 */
	PKCS7_ENC_CONTENT		*enc_data;
	} PKCS7_ENCRYPT;

typedef struct pkcs7_st
	{
	/* The following is non NULL if it contains ASN1 encoding of
	 * this structure */
	unsigned char *asn1;
	long length;

#define PKCS7_S_HEADER	0
#define PKCS7_S_BODY	1
#define PKCS7_S_TAIL	2
	int state; /* used during processing */

	int detached;

	ASN1_OBJECT *type;
	/* content as defined by the type */
	/* all encryption/message digests are applied to the 'contents',
	 * leaving out the 'type' field. */
	union	{
		char *ptr;

		/* NID_pkcs7_data */
		ASN1_OCTET_STRING *data;

		/* NID_pkcs7_signed */
		PKCS7_SIGNED *sign;

		/* NID_pkcs7_enveloped */
		PKCS7_ENVELOPE *enveloped;

		/* NID_pkcs7_signedAndEnveloped */
		PKCS7_SIGN_ENVELOPE *signed_and_enveloped;

		/* NID_pkcs7_digest */
		PKCS7_DIGEST *digest;

		/* NID_pkcs7_encrypted */
		PKCS7_ENCRYPT *encrypted;

		/* Anything else */
		ASN1_TYPE *other;
		} d;
	} PKCS7;

DECLARE_STACK_OF(PKCS7)
DECLARE_ASN1_SET_OF(PKCS7)
DECLARE_PKCS12_STACK_OF(PKCS7)

#define PKCS7_OP_SET_DETACHED_SIGNATURE	1
#define PKCS7_OP_GET_DETACHED_SIGNATURE	2

#define PKCS7_get_signed_attributes(si)	((si)->auth_attr)
#define PKCS7_get_attributes(si)	((si)->unauth_attr)

#define PKCS7_type_is_signed(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_signed)
#define PKCS7_type_is_encrypted(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_encrypted)
#define PKCS7_type_is_enveloped(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_enveloped)
#define PKCS7_type_is_signedAndEnveloped(a) \
		(OBJ_obj2nid((a)->type) == NID_pkcs7_signedAndEnveloped)
#define PKCS7_type_is_data(a)   (OBJ_obj2nid((a)->type) == NID_pkcs7_data)

#define PKCS7_type_is_digest(a)   (OBJ_obj2nid((a)->type) == NID_pkcs7_digest)

#define PKCS7_set_detached(p,v) \
		PKCS7_ctrl(p,PKCS7_OP_SET_DETACHED_SIGNATURE,v,NULL)
#define PKCS7_get_detached(p) \
		PKCS7_ctrl(p,PKCS7_OP_GET_DETACHED_SIGNATURE,0,NULL)

#define PKCS7_is_detached(p7) (PKCS7_type_is_signed(p7) && PKCS7_get_detached(p7))

#ifdef SSLEAY_MACROS
#ifndef PKCS7_ISSUER_AND_SERIAL_digest
#define PKCS7_ISSUER_AND_SERIAL_digest(data,type,md,len) \
        ASN1_digest((int (*)())i2d_PKCS7_ISSUER_AND_SERIAL,type,\
	                (char *)data,md,len)
#endif
#endif

/* S/MIME related flags */

#define PKCS7_TEXT		0x1
#define PKCS7_NOCERTS		0x2
#define PKCS7_NOSIGS		0x4
#define PKCS7_NOCHAIN		0x8
#define PKCS7_NOINTERN		0x10
#define PKCS7_NOVERIFY		0x20
#define PKCS7_DETACHED		0x40
#define PKCS7_BINARY		0x80
#define PKCS7_NOATTR		0x100
#define	PKCS7_NOSMIMECAP	0x200
#define PKCS7_NOOLDMIMETYPE	0x400
#define PKCS7_CRLFEOL		0x800
#define PKCS7_STREAM		0x1000
#define PKCS7_NOCRL		0x2000

/* Flags: for compatibility with older code */

#define SMIME_TEXT	PKCS7_TEXT
#define SMIME_NOCERTS	PKCS7_NOCERTS
#define SMIME_NOSIGS	PKCS7_NOSIGS
#define SMIME_NOCHAIN	PKCS7_NOCHAIN
#define SMIME_NOINTERN	PKCS7_NOINTERN
#define SMIME_NOVERIFY	PKCS7_NOVERIFY
#define SMIME_DETACHED	PKCS7_DETACHED
#define SMIME_BINARY	PKCS7_BINARY
#define SMIME_NOATTR	PKCS7_NOATTR

DECLARE_ASN1_FUNCTIONS(PKCS7_ISSUER_AND_SERIAL)

#ifndef SSLEAY_MACROS
int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data,const EVP_MD *type,
	unsigned char *md,unsigned int *len);
#ifndef OPENSSL_NO_FP_API
PKCS7 *d2i_PKCS7_fp(FILE *fp,PKCS7 **p7);
int i2d_PKCS7_fp(FILE *fp,PKCS7 *p7);
#endif
PKCS7 *PKCS7_dup(PKCS7 *p7);
PKCS7 *d2i_PKCS7_bio(BIO *bp,PKCS7 **p7);
int i2d_PKCS7_bio(BIO *bp,PKCS7 *p7);
#endif

DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNER_INFO)
DECLARE_ASN1_FUNCTIONS(PKCS7_RECIP_INFO)
DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNED)
DECLARE_ASN1_FUNCTIONS(PKCS7_ENC_CONTENT)
DECLARE_ASN1_FUNCTIONS(PKCS7_ENVELOPE)
DECLARE_ASN1_FUNCTIONS(PKCS7_SIGN_ENVELOPE)
DECLARE_ASN1_FUNCTIONS(PKCS7_DIGEST)
DECLARE_ASN1_FUNCTIONS(PKCS7_ENCRYPT)
DECLARE_ASN1_FUNCTIONS(PKCS7)

DECLARE_ASN1_ITEM(PKCS7_ATTR_SIGN)
DECLARE_ASN1_ITEM(PKCS7_ATTR_VERIFY)

DECLARE_ASN1_NDEF_FUNCTION(PKCS7)

long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg);

int PKCS7_set_type(PKCS7 *p7, int type);
int PKCS7_set0_type_other(PKCS7 *p7, int type, ASN1_TYPE *other);
int PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data);
int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509, EVP_PKEY *pkey,
	const EVP_MD *dgst);
int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *p7i);
int PKCS7_add_certificate(PKCS7 *p7, X509 *x509);
int PKCS7_add_crl(PKCS7 *p7, X509_CRL *x509);
int PKCS7_content_new(PKCS7 *p7, int nid);
int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx,
	BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si); 
int PKCS7_signatureVerify(BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si,
								X509 *x509);

BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio);
int PKCS7_dataFinal(PKCS7 *p7, BIO *bio);
BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio, X509 *pcert);


PKCS7_SIGNER_INFO *PKCS7_add_signature(PKCS7 *p7, X509 *x509,
	EVP_PKEY *pkey, const EVP_MD *dgst);
X509 *PKCS7_cert_from_signer_info(PKCS7 *p7, PKCS7_SIGNER_INFO *si);
int PKCS7_set_digest(PKCS7 *p7, const EVP_MD *md);
STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7);

PKCS7_RECIP_INFO *PKCS7_add_recipient(PKCS7 *p7, X509 *x509);
int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri);
int PKCS7_RECIP_INFO_set(PKCS7_RECIP_INFO *p7i, X509 *x509);
int PKCS7_set_cipher(PKCS7 *p7, const EVP_CIPHER *cipher);

PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial(PKCS7 *p7, int idx);
ASN1_OCTET_STRING *PKCS7_digest_from_attributes(STACK_OF(X509_ATTRIBUTE) *sk);
int PKCS7_add_signed_attribute(PKCS7_SIGNER_INFO *p7si,int nid,int type,
	void *data);
int PKCS7_add_attribute (PKCS7_SIGNER_INFO *p7si, int nid, int atrtype,
	void *value);
ASN1_TYPE *PKCS7_get_attribute(PKCS7_SIGNER_INFO *si, int nid);
ASN1_TYPE *PKCS7_get_signed_attribute(PKCS7_SIGNER_INFO *si, int nid);
int PKCS7_set_signed_attributes(PKCS7_SIGNER_INFO *p7si,
				STACK_OF(X509_ATTRIBUTE) *sk);
int PKCS7_set_attributes(PKCS7_SIGNER_INFO *p7si,STACK_OF(X509_ATTRIBUTE) *sk);


PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey, STACK_OF(X509) *certs,
							BIO *data, int flags);
int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs, X509_STORE *store,
					BIO *indata, BIO *out, int flags);
STACK_OF(X509) *PKCS7_get0_signers(PKCS7 *p7, STACK_OF(X509) *certs, int flags);
PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in, const EVP_CIPHER *cipher,
								int flags);
int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, int flags);

int PKCS7_add_attrib_smimecap(PKCS7_SIGNER_INFO *si,
			      STACK_OF(X509_ALGOR) *cap);
STACK_OF(X509_ALGOR) *PKCS7_get_smimecap(PKCS7_SIGNER_INFO *si);
int PKCS7_simple_smimecap(STACK_OF(X509_ALGOR) *sk, int nid, int arg);

int SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags);
PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont);
int SMIME_crlf_copy(BIO *in, BIO *out, int flags);
int SMIME_text(BIO *in, BIO *out);

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_PKCS7_strings(void);

/* Error codes for the PKCS7 functions. */

/* Function codes. */
#define PKCS7_F_B64_READ_PKCS7				 120
#define PKCS7_F_B64_WRITE_PKCS7				 121
#define PKCS7_F_PKCS7_ADD_ATTRIB_SMIMECAP		 118
#define PKCS7_F_PKCS7_ADD_CERTIFICATE			 100
#define PKCS7_F_PKCS7_ADD_CRL				 101
#define PKCS7_F_PKCS7_ADD_RECIPIENT_INFO		 102
#define PKCS7_F_PKCS7_ADD_SIGNER			 103
#define PKCS7_F_PKCS7_BIO_ADD_DIGEST			 125
#define PKCS7_F_PKCS7_CTRL				 104
#define PKCS7_F_PKCS7_DATADECODE			 112
#define PKCS7_F_PKCS7_DATAFINAL				 128
#define PKCS7_F_PKCS7_DATAINIT				 105
#define PKCS7_F_PKCS7_DATASIGN				 106
#define PKCS7_F_PKCS7_DATAVERIFY			 107
#define PKCS7_F_PKCS7_DECRYPT				 114
#define PKCS7_F_PKCS7_ENCRYPT				 115
#define PKCS7_F_PKCS7_FIND_DIGEST			 127
#define PKCS7_F_PKCS7_GET0_SIGNERS			 124
#define PKCS7_F_PKCS7_SET_CIPHER			 108
#define PKCS7_F_PKCS7_SET_CONTENT			 109
#define PKCS7_F_PKCS7_SET_DIGEST			 126
#define PKCS7_F_PKCS7_SET_TYPE				 110
#define PKCS7_F_PKCS7_SIGN				 116
#define PKCS7_F_PKCS7_SIGNATUREVERIFY			 113
#define PKCS7_F_PKCS7_SIMPLE_SMIMECAP			 119
#define PKCS7_F_PKCS7_VERIFY				 117
#define PKCS7_F_SMIME_READ_PKCS7			 122
#define PKCS7_F_SMIME_TEXT				 123

/* Reason codes. */
#define PKCS7_R_CERTIFICATE_VERIFY_ERROR		 117
#define PKCS7_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER		 144
#define PKCS7_R_CIPHER_NOT_INITIALIZED			 116
#define PKCS7_R_CONTENT_AND_DATA_PRESENT		 118
#define PKCS7_R_DECODE_ERROR				 130
#define PKCS7_R_DECRYPTED_KEY_IS_WRONG_LENGTH		 100
#define PKCS7_R_DECRYPT_ERROR				 119
#define PKCS7_R_DIGEST_FAILURE				 101
#define PKCS7_R_ERROR_ADDING_RECIPIENT			 120
#define PKCS7_R_ERROR_SETTING_CIPHER			 121
#define PKCS7_R_INVALID_MIME_TYPE			 131
#define PKCS7_R_INVALID_NULL_POINTER			 143
#define PKCS7_R_MIME_NO_CONTENT_TYPE			 132
#define PKCS7_R_MIME_PARSE_ERROR			 133
#define PKCS7_R_MIME_SIG_PARSE_ERROR			 134
#define PKCS7_R_MISSING_CERIPEND_INFO			 103
#define PKCS7_R_NO_CONTENT				 122
#define PKCS7_R_NO_CONTENT_TYPE				 135
#define PKCS7_R_NO_MULTIPART_BODY_FAILURE		 136
#define PKCS7_R_NO_MULTIPART_BOUNDARY			 137
#define PKCS7_R_NO_RECIPIENT_MATCHES_CERTIFICATE	 115
#define PKCS7_R_NO_RECIPIENT_MATCHES_KEY		 146
#define PKCS7_R_NO_SIGNATURES_ON_DATA			 123
#define PKCS7_R_NO_SIGNERS				 142
#define PKCS7_R_NO_SIG_CONTENT_TYPE			 138
#define PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE	 104
#define PKCS7_R_PKCS7_ADD_SIGNATURE_ERROR		 124
#define PKCS7_R_PKCS7_DATAFINAL				 126
#define PKCS7_R_PKCS7_DATAFINAL_ERROR			 125
#define PKCS7_R_PKCS7_DATASIGN				 145
#define PKCS7_R_PKCS7_PARSE_ERROR			 139
#define PKCS7_R_PKCS7_SIG_PARSE_ERROR			 140
#define PKCS7_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE	 127
#define PKCS7_R_SIGNATURE_FAILURE			 105
#define PKCS7_R_SIGNER_CERTIFICATE_NOT_FOUND		 128
#define PKCS7_R_SIG_INVALID_MIME_TYPE			 141
#define PKCS7_R_SMIME_TEXT_ERROR			 129
#define PKCS7_R_UNABLE_TO_FIND_CERTIFICATE		 106
#define PKCS7_R_UNABLE_TO_FIND_MEM_BIO			 107
#define PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST		 108
#define PKCS7_R_UNKNOWN_DIGEST_TYPE			 109
#define PKCS7_R_UNKNOWN_OPERATION			 110
#define PKCS7_R_UNSUPPORTED_CIPHER_TYPE			 111
#define PKCS7_R_UNSUPPORTED_CONTENT_TYPE		 112
#define PKCS7_R_WRONG_CONTENT_TYPE			 113
#define PKCS7_R_WRONG_PKCS7_TYPE			 114

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/pem2.h0000755000175000017500000000545711341640430017647 0ustar  davidedavide/* ====================================================================
 * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    licensing@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

/*
 * This header only exists to break a circular dependency between pem and err
 * Ben 30 Jan 1999.
 */

#ifdef __cplusplus
extern "C" {
#endif

#ifndef HEADER_PEM_H
void ERR_load_PEM_strings(void);
#endif

#ifdef __cplusplus
}
#endif
xmail-1.27/win32ssl/include/openssl/ui_compat.h0000755000175000017500000000655711341640430020766 0ustar  davidedavide/* crypto/ui/ui.h -*- mode:C; c-file-style: "eay" -*- */
/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL
 * project 2001.
 */
/* ====================================================================
 * Copyright (c) 2001 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

#ifndef HEADER_UI_COMPAT_H
#define HEADER_UI_COMPAT_H

#include 
#include 

#ifdef  __cplusplus
extern "C" {
#endif

/* The following functions were previously part of the DES section,
   and are provided here for backward compatibility reasons. */

#define des_read_pw_string(b,l,p,v) \
	_ossl_old_des_read_pw_string((b),(l),(p),(v))
#define des_read_pw(b,bf,s,p,v) \
	_ossl_old_des_read_pw((b),(bf),(s),(p),(v))

int _ossl_old_des_read_pw_string(char *buf,int length,const char *prompt,int verify);
int _ossl_old_des_read_pw(char *buf,char *buff,int size,const char *prompt,int verify);

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/stack.h0000755000175000017500000001050211341640430020074 0ustar  davidedavide/* crypto/stack/stack.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_STACK_H
#define HEADER_STACK_H

#ifdef  __cplusplus
extern "C" {
#endif

typedef struct stack_st
	{
	int num;
	char **data;
	int sorted;

	int num_alloc;
	int (*comp)(const char * const *, const char * const *);
	} STACK;

#define M_sk_num(sk)		((sk) ? (sk)->num:-1)
#define M_sk_value(sk,n)	((sk) ? (sk)->data[n] : NULL)

int sk_num(const STACK *);
char *sk_value(const STACK *, int);

char *sk_set(STACK *, int, char *);

STACK *sk_new(int (*cmp)(const char * const *, const char * const *));
STACK *sk_new_null(void);
void sk_free(STACK *);
void sk_pop_free(STACK *st, void (*func)(void *));
int sk_insert(STACK *sk,char *data,int where);
char *sk_delete(STACK *st,int loc);
char *sk_delete_ptr(STACK *st, char *p);
int sk_find(STACK *st,char *data);
int sk_find_ex(STACK *st,char *data);
int sk_push(STACK *st,char *data);
int sk_unshift(STACK *st,char *data);
char *sk_shift(STACK *st);
char *sk_pop(STACK *st);
void sk_zero(STACK *st);
int (*sk_set_cmp_func(STACK *sk, int (*c)(const char * const *,
			const char * const *)))
			(const char * const *, const char * const *);
STACK *sk_dup(STACK *st);
void sk_sort(STACK *st);
int sk_is_sorted(const STACK *st);

#ifdef  __cplusplus
}
#endif

#endif
xmail-1.27/win32ssl/include/openssl/safestack.h0000755000175000017500000042626111341640430020750 0ustar  davidedavide/* ====================================================================
 * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

#ifndef HEADER_SAFESTACK_H
#define HEADER_SAFESTACK_H

#include 

#ifdef DEBUG_SAFESTACK

#ifndef CHECKED_PTR_OF
#define CHECKED_PTR_OF(type, p) \
    ((void*) (1 ? p : (type*)0))
#endif

#define CHECKED_SK_FREE_FUNC(type, p) \
    ((void (*)(void *)) ((1 ? p : (void (*)(type *))0)))

#define CHECKED_SK_CMP_FUNC(type, p) \
    ((int (*)(const char * const *, const char * const *)) \
	((1 ? p : (int (*)(const type * const *, const type * const *))0)))

#define STACK_OF(type) struct stack_st_##type
#define PREDECLARE_STACK_OF(type) STACK_OF(type);

#define DECLARE_STACK_OF(type) \
STACK_OF(type) \
    { \
    STACK stack; \
    };

#define IMPLEMENT_STACK_OF(type) /* nada (obsolete in new safestack approach)*/

/* SKM_sk_... stack macros are internal to safestack.h:
 * never use them directly, use sk__... instead */
#define SKM_sk_new(type, cmp) \
	((STACK_OF(type) *)sk_new(CHECKED_SK_CMP_FUNC(type, cmp)))
#define SKM_sk_new_null(type) \
	((STACK_OF(type) *)sk_new_null())
#define SKM_sk_free(type, st) \
	sk_free(CHECKED_PTR_OF(STACK_OF(type), st))
#define SKM_sk_num(type, st) \
	sk_num(CHECKED_PTR_OF(STACK_OF(type), st))
#define SKM_sk_value(type, st,i) \
	((type *)sk_value(CHECKED_PTR_OF(STACK_OF(type), st), i))
#define SKM_sk_set(type, st,i,val) \
	sk_set(CHECKED_PTR_OF(STACK_OF(type), st), i, CHECKED_PTR_OF(type, val))
#define SKM_sk_zero(type, st) \
	sk_zero(CHECKED_PTR_OF(STACK_OF(type), st))
#define SKM_sk_push(type, st,val) \
	sk_push(CHECKED_PTR_OF(STACK_OF(type), st), CHECKED_PTR_OF(type, val))
#define SKM_sk_unshift(type, st,val) \
	sk_unshift(CHECKED_PTR_OF(STACK_OF(type), st), CHECKED_PTR_OF(type, val))
#define SKM_sk_find(type, st,val) \
	sk_find(CHECKED_PTR_OF(STACK_OF(type), st), CHECKED_PTR_OF(type, val))
#define SKM_sk_delete(type, st,i) \
	(type *)sk_delete(CHECKED_PTR_OF(STACK_OF(type), st), i)
#define SKM_sk_delete_ptr(type, st,ptr) \
	(type *)sk_delete_ptr(CHECKED_PTR_OF(STACK_OF(type), st), CHECKED_PTR_OF(type, ptr))
#define SKM_sk_insert(type, st,val,i) \
	sk_insert(CHECKED_PTR_OF(STACK_OF(type), st), CHECKED_PTR_OF(type, val), i)
#define SKM_sk_set_cmp_func(type, st,cmp) \
	((int (*)(const type * const *,const type * const *)) \
	sk_set_cmp_func(CHECKED_PTR_OF(STACK_OF(type), st), CHECKED_SK_CMP_FUNC(type, cmp)))
#define SKM_sk_dup(type, st) \
	(STACK_OF(type) *)sk_dup(CHECKED_PTR_OF(STACK_OF(type), st))
#define SKM_sk_pop_free(type, st,free_func) \
	sk_pop_free(CHECKED_PTR_OF(STACK_OF(type), st), CHECKED_SK_FREE_FUNC(type, free_func))
#define SKM_sk_shift(type, st) \
	(type *)sk_shift(CHECKED_PTR_OF(STACK_OF(type), st))
#define SKM_sk_pop(type, st) \
	(type *)sk_pop(CHECKED_PTR_OF(STACK_OF(type), st))
#define SKM_sk_sort(type, st) \
	sk_sort(CHECKED_PTR_OF(STACK_OF(type), st))
#define SKM_sk_is_sorted(type, st) \
	sk_is_sorted(CHECKED_PTR_OF(STACK_OF(type), st))

#define	SKM_ASN1_SET_OF_d2i(type, st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	(STACK_OF(type) *)d2i_ASN1_SET(CHECKED_PTR_OF(STACK_OF(type), st), \
				pp, length, \
				CHECKED_D2I_OF(type, d2i_func), \
				CHECKED_SK_FREE_FUNC(type, free_func), \
				ex_tag, ex_class)

#define	SKM_ASN1_SET_OF_i2d(type, st, pp, i2d_func, ex_tag, ex_class, is_set) \
	i2d_ASN1_SET(CHECKED_PTR_OF(STACK_OF(type), st), pp, \
				CHECKED_I2D_OF(type, i2d_func), \
				ex_tag, ex_class, is_set)

#define	SKM_ASN1_seq_pack(type, st, i2d_func, buf, len) \
	ASN1_seq_pack(CHECKED_PTR_OF(STACK_OF(type), st), \
			CHECKED_I2D_OF(type, i2d_func), buf, len)

#define	SKM_ASN1_seq_unpack(type, buf, len, d2i_func, free_func) \
	(STACK_OF(type) *)ASN1_seq_unpack(buf, len, CHECKED_D2I_OF(type, d2i_func), CHECKED_SK_FREE_FUNC(type, free_func))

#define SKM_PKCS12_decrypt_d2i(type, algor, d2i_func, free_func, pass, passlen, oct, seq) \
	(STACK_OF(type) *)PKCS12_decrypt_d2i(algor, \
				CHECKED_D2I_OF(type, d2i_func), \
				CHECKED_SK_FREE_FUNC(type, free_func), \
				pass, passlen, oct, seq)

#else

#define STACK_OF(type) STACK
#define PREDECLARE_STACK_OF(type) /* nada */
#define DECLARE_STACK_OF(type)    /* nada */
#define IMPLEMENT_STACK_OF(type)  /* nada */

#define SKM_sk_new(type, cmp) \
	sk_new((int (*)(const char * const *, const char * const *))(cmp))
#define SKM_sk_new_null(type) \
	sk_new_null()
#define SKM_sk_free(type, st) \
	sk_free(st)
#define SKM_sk_num(type, st) \
	sk_num(st)
#define SKM_sk_value(type, st,i) \
	((type *)sk_value(st, i))
#define SKM_sk_set(type, st,i,val) \
	((type *)sk_set(st, i,(char *)val))
#define SKM_sk_zero(type, st) \
	sk_zero(st)
#define SKM_sk_push(type, st,val) \
	sk_push(st, (char *)val)
#define SKM_sk_unshift(type, st,val) \
	sk_unshift(st, (char *)val)
#define SKM_sk_find(type, st,val) \
	sk_find(st, (char *)val)
#define SKM_sk_delete(type, st,i) \
	((type *)sk_delete(st, i))
#define SKM_sk_delete_ptr(type, st,ptr) \
	((type *)sk_delete_ptr(st,(char *)ptr))
#define SKM_sk_insert(type, st,val,i) \
	sk_insert(st, (char *)val, i)
#define SKM_sk_set_cmp_func(type, st,cmp) \
	((int (*)(const type * const *,const type * const *)) \
	sk_set_cmp_func(st, (int (*)(const char * const *, const char * const *))(cmp)))
#define SKM_sk_dup(type, st) \
	sk_dup(st)
#define SKM_sk_pop_free(type, st,free_func) \
	sk_pop_free(st, (void (*)(void *))free_func)
#define SKM_sk_shift(type, st) \
	((type *)sk_shift(st))
#define SKM_sk_pop(type, st) \
	((type *)sk_pop(st))
#define SKM_sk_sort(type, st) \
	sk_sort(st)
#define SKM_sk_is_sorted(type, st) \
	sk_is_sorted(st)

#define	SKM_ASN1_SET_OF_d2i(type, st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	d2i_ASN1_SET(st,pp,length, (void *(*)(void ** ,const unsigned char ** ,long))d2i_func, (void (*)(void *))free_func, ex_tag,ex_class)
#define	SKM_ASN1_SET_OF_i2d(type, st, pp, i2d_func, ex_tag, ex_class, is_set) \
	i2d_ASN1_SET(st,pp,(int (*)(void *, unsigned char **))i2d_func,ex_tag,ex_class,is_set)

#define	SKM_ASN1_seq_pack(type, st, i2d_func, buf, len) \
	ASN1_seq_pack(st, (int (*)(void *, unsigned char **))i2d_func, buf, len)
#define	SKM_ASN1_seq_unpack(type, buf, len, d2i_func, free_func) \
	ASN1_seq_unpack(buf,len,(void *(*)(void **,const unsigned char **,long))d2i_func, (void(*)(void *))free_func)

#define SKM_PKCS12_decrypt_d2i(type, algor, d2i_func, free_func, pass, passlen, oct, seq) \
	((STACK *)PKCS12_decrypt_d2i(algor,(char *(*)())d2i_func, (void(*)(void *))free_func,pass,passlen,oct,seq))

#endif

/* This block of defines is updated by util/mkstack.pl, please do not touch! */
#define sk_ACCESS_DESCRIPTION_new(st) SKM_sk_new(ACCESS_DESCRIPTION, (st))
#define sk_ACCESS_DESCRIPTION_new_null() SKM_sk_new_null(ACCESS_DESCRIPTION)
#define sk_ACCESS_DESCRIPTION_free(st) SKM_sk_free(ACCESS_DESCRIPTION, (st))
#define sk_ACCESS_DESCRIPTION_num(st) SKM_sk_num(ACCESS_DESCRIPTION, (st))
#define sk_ACCESS_DESCRIPTION_value(st, i) SKM_sk_value(ACCESS_DESCRIPTION, (st), (i))
#define sk_ACCESS_DESCRIPTION_set(st, i, val) SKM_sk_set(ACCESS_DESCRIPTION, (st), (i), (val))
#define sk_ACCESS_DESCRIPTION_zero(st) SKM_sk_zero(ACCESS_DESCRIPTION, (st))
#define sk_ACCESS_DESCRIPTION_push(st, val) SKM_sk_push(ACCESS_DESCRIPTION, (st), (val))
#define sk_ACCESS_DESCRIPTION_unshift(st, val) SKM_sk_unshift(ACCESS_DESCRIPTION, (st), (val))
#define sk_ACCESS_DESCRIPTION_find(st, val) SKM_sk_find(ACCESS_DESCRIPTION, (st), (val))
#define sk_ACCESS_DESCRIPTION_find_ex(st, val) SKM_sk_find_ex(ACCESS_DESCRIPTION, (st), (val))
#define sk_ACCESS_DESCRIPTION_delete(st, i) SKM_sk_delete(ACCESS_DESCRIPTION, (st), (i))
#define sk_ACCESS_DESCRIPTION_delete_ptr(st, ptr) SKM_sk_delete_ptr(ACCESS_DESCRIPTION, (st), (ptr))
#define sk_ACCESS_DESCRIPTION_insert(st, val, i) SKM_sk_insert(ACCESS_DESCRIPTION, (st), (val), (i))
#define sk_ACCESS_DESCRIPTION_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ACCESS_DESCRIPTION, (st), (cmp))
#define sk_ACCESS_DESCRIPTION_dup(st) SKM_sk_dup(ACCESS_DESCRIPTION, st)
#define sk_ACCESS_DESCRIPTION_pop_free(st, free_func) SKM_sk_pop_free(ACCESS_DESCRIPTION, (st), (free_func))
#define sk_ACCESS_DESCRIPTION_shift(st) SKM_sk_shift(ACCESS_DESCRIPTION, (st))
#define sk_ACCESS_DESCRIPTION_pop(st) SKM_sk_pop(ACCESS_DESCRIPTION, (st))
#define sk_ACCESS_DESCRIPTION_sort(st) SKM_sk_sort(ACCESS_DESCRIPTION, (st))
#define sk_ACCESS_DESCRIPTION_is_sorted(st) SKM_sk_is_sorted(ACCESS_DESCRIPTION, (st))

#define sk_ASIdOrRange_new(st) SKM_sk_new(ASIdOrRange, (st))
#define sk_ASIdOrRange_new_null() SKM_sk_new_null(ASIdOrRange)
#define sk_ASIdOrRange_free(st) SKM_sk_free(ASIdOrRange, (st))
#define sk_ASIdOrRange_num(st) SKM_sk_num(ASIdOrRange, (st))
#define sk_ASIdOrRange_value(st, i) SKM_sk_value(ASIdOrRange, (st), (i))
#define sk_ASIdOrRange_set(st, i, val) SKM_sk_set(ASIdOrRange, (st), (i), (val))
#define sk_ASIdOrRange_zero(st) SKM_sk_zero(ASIdOrRange, (st))
#define sk_ASIdOrRange_push(st, val) SKM_sk_push(ASIdOrRange, (st), (val))
#define sk_ASIdOrRange_unshift(st, val) SKM_sk_unshift(ASIdOrRange, (st), (val))
#define sk_ASIdOrRange_find(st, val) SKM_sk_find(ASIdOrRange, (st), (val))
#define sk_ASIdOrRange_find_ex(st, val) SKM_sk_find_ex(ASIdOrRange, (st), (val))
#define sk_ASIdOrRange_delete(st, i) SKM_sk_delete(ASIdOrRange, (st), (i))
#define sk_ASIdOrRange_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASIdOrRange, (st), (ptr))
#define sk_ASIdOrRange_insert(st, val, i) SKM_sk_insert(ASIdOrRange, (st), (val), (i))
#define sk_ASIdOrRange_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASIdOrRange, (st), (cmp))
#define sk_ASIdOrRange_dup(st) SKM_sk_dup(ASIdOrRange, st)
#define sk_ASIdOrRange_pop_free(st, free_func) SKM_sk_pop_free(ASIdOrRange, (st), (free_func))
#define sk_ASIdOrRange_shift(st) SKM_sk_shift(ASIdOrRange, (st))
#define sk_ASIdOrRange_pop(st) SKM_sk_pop(ASIdOrRange, (st))
#define sk_ASIdOrRange_sort(st) SKM_sk_sort(ASIdOrRange, (st))
#define sk_ASIdOrRange_is_sorted(st) SKM_sk_is_sorted(ASIdOrRange, (st))

#define sk_ASN1_GENERALSTRING_new(st) SKM_sk_new(ASN1_GENERALSTRING, (st))
#define sk_ASN1_GENERALSTRING_new_null() SKM_sk_new_null(ASN1_GENERALSTRING)
#define sk_ASN1_GENERALSTRING_free(st) SKM_sk_free(ASN1_GENERALSTRING, (st))
#define sk_ASN1_GENERALSTRING_num(st) SKM_sk_num(ASN1_GENERALSTRING, (st))
#define sk_ASN1_GENERALSTRING_value(st, i) SKM_sk_value(ASN1_GENERALSTRING, (st), (i))
#define sk_ASN1_GENERALSTRING_set(st, i, val) SKM_sk_set(ASN1_GENERALSTRING, (st), (i), (val))
#define sk_ASN1_GENERALSTRING_zero(st) SKM_sk_zero(ASN1_GENERALSTRING, (st))
#define sk_ASN1_GENERALSTRING_push(st, val) SKM_sk_push(ASN1_GENERALSTRING, (st), (val))
#define sk_ASN1_GENERALSTRING_unshift(st, val) SKM_sk_unshift(ASN1_GENERALSTRING, (st), (val))
#define sk_ASN1_GENERALSTRING_find(st, val) SKM_sk_find(ASN1_GENERALSTRING, (st), (val))
#define sk_ASN1_GENERALSTRING_find_ex(st, val) SKM_sk_find_ex(ASN1_GENERALSTRING, (st), (val))
#define sk_ASN1_GENERALSTRING_delete(st, i) SKM_sk_delete(ASN1_GENERALSTRING, (st), (i))
#define sk_ASN1_GENERALSTRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_GENERALSTRING, (st), (ptr))
#define sk_ASN1_GENERALSTRING_insert(st, val, i) SKM_sk_insert(ASN1_GENERALSTRING, (st), (val), (i))
#define sk_ASN1_GENERALSTRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_GENERALSTRING, (st), (cmp))
#define sk_ASN1_GENERALSTRING_dup(st) SKM_sk_dup(ASN1_GENERALSTRING, st)
#define sk_ASN1_GENERALSTRING_pop_free(st, free_func) SKM_sk_pop_free(ASN1_GENERALSTRING, (st), (free_func))
#define sk_ASN1_GENERALSTRING_shift(st) SKM_sk_shift(ASN1_GENERALSTRING, (st))
#define sk_ASN1_GENERALSTRING_pop(st) SKM_sk_pop(ASN1_GENERALSTRING, (st))
#define sk_ASN1_GENERALSTRING_sort(st) SKM_sk_sort(ASN1_GENERALSTRING, (st))
#define sk_ASN1_GENERALSTRING_is_sorted(st) SKM_sk_is_sorted(ASN1_GENERALSTRING, (st))

#define sk_ASN1_INTEGER_new(st) SKM_sk_new(ASN1_INTEGER, (st))
#define sk_ASN1_INTEGER_new_null() SKM_sk_new_null(ASN1_INTEGER)
#define sk_ASN1_INTEGER_free(st) SKM_sk_free(ASN1_INTEGER, (st))
#define sk_ASN1_INTEGER_num(st) SKM_sk_num(ASN1_INTEGER, (st))
#define sk_ASN1_INTEGER_value(st, i) SKM_sk_value(ASN1_INTEGER, (st), (i))
#define sk_ASN1_INTEGER_set(st, i, val) SKM_sk_set(ASN1_INTEGER, (st), (i), (val))
#define sk_ASN1_INTEGER_zero(st) SKM_sk_zero(ASN1_INTEGER, (st))
#define sk_ASN1_INTEGER_push(st, val) SKM_sk_push(ASN1_INTEGER, (st), (val))
#define sk_ASN1_INTEGER_unshift(st, val) SKM_sk_unshift(ASN1_INTEGER, (st), (val))
#define sk_ASN1_INTEGER_find(st, val) SKM_sk_find(ASN1_INTEGER, (st), (val))
#define sk_ASN1_INTEGER_find_ex(st, val) SKM_sk_find_ex(ASN1_INTEGER, (st), (val))
#define sk_ASN1_INTEGER_delete(st, i) SKM_sk_delete(ASN1_INTEGER, (st), (i))
#define sk_ASN1_INTEGER_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_INTEGER, (st), (ptr))
#define sk_ASN1_INTEGER_insert(st, val, i) SKM_sk_insert(ASN1_INTEGER, (st), (val), (i))
#define sk_ASN1_INTEGER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_INTEGER, (st), (cmp))
#define sk_ASN1_INTEGER_dup(st) SKM_sk_dup(ASN1_INTEGER, st)
#define sk_ASN1_INTEGER_pop_free(st, free_func) SKM_sk_pop_free(ASN1_INTEGER, (st), (free_func))
#define sk_ASN1_INTEGER_shift(st) SKM_sk_shift(ASN1_INTEGER, (st))
#define sk_ASN1_INTEGER_pop(st) SKM_sk_pop(ASN1_INTEGER, (st))
#define sk_ASN1_INTEGER_sort(st) SKM_sk_sort(ASN1_INTEGER, (st))
#define sk_ASN1_INTEGER_is_sorted(st) SKM_sk_is_sorted(ASN1_INTEGER, (st))

#define sk_ASN1_OBJECT_new(st) SKM_sk_new(ASN1_OBJECT, (st))
#define sk_ASN1_OBJECT_new_null() SKM_sk_new_null(ASN1_OBJECT)
#define sk_ASN1_OBJECT_free(st) SKM_sk_free(ASN1_OBJECT, (st))
#define sk_ASN1_OBJECT_num(st) SKM_sk_num(ASN1_OBJECT, (st))
#define sk_ASN1_OBJECT_value(st, i) SKM_sk_value(ASN1_OBJECT, (st), (i))
#define sk_ASN1_OBJECT_set(st, i, val) SKM_sk_set(ASN1_OBJECT, (st), (i), (val))
#define sk_ASN1_OBJECT_zero(st) SKM_sk_zero(ASN1_OBJECT, (st))
#define sk_ASN1_OBJECT_push(st, val) SKM_sk_push(ASN1_OBJECT, (st), (val))
#define sk_ASN1_OBJECT_unshift(st, val) SKM_sk_unshift(ASN1_OBJECT, (st), (val))
#define sk_ASN1_OBJECT_find(st, val) SKM_sk_find(ASN1_OBJECT, (st), (val))
#define sk_ASN1_OBJECT_find_ex(st, val) SKM_sk_find_ex(ASN1_OBJECT, (st), (val))
#define sk_ASN1_OBJECT_delete(st, i) SKM_sk_delete(ASN1_OBJECT, (st), (i))
#define sk_ASN1_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_OBJECT, (st), (ptr))
#define sk_ASN1_OBJECT_insert(st, val, i) SKM_sk_insert(ASN1_OBJECT, (st), (val), (i))
#define sk_ASN1_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_OBJECT, (st), (cmp))
#define sk_ASN1_OBJECT_dup(st) SKM_sk_dup(ASN1_OBJECT, st)
#define sk_ASN1_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(ASN1_OBJECT, (st), (free_func))
#define sk_ASN1_OBJECT_shift(st) SKM_sk_shift(ASN1_OBJECT, (st))
#define sk_ASN1_OBJECT_pop(st) SKM_sk_pop(ASN1_OBJECT, (st))
#define sk_ASN1_OBJECT_sort(st) SKM_sk_sort(ASN1_OBJECT, (st))
#define sk_ASN1_OBJECT_is_sorted(st) SKM_sk_is_sorted(ASN1_OBJECT, (st))

#define sk_ASN1_STRING_TABLE_new(st) SKM_sk_new(ASN1_STRING_TABLE, (st))
#define sk_ASN1_STRING_TABLE_new_null() SKM_sk_new_null(ASN1_STRING_TABLE)
#define sk_ASN1_STRING_TABLE_free(st) SKM_sk_free(ASN1_STRING_TABLE, (st))
#define sk_ASN1_STRING_TABLE_num(st) SKM_sk_num(ASN1_STRING_TABLE, (st))
#define sk_ASN1_STRING_TABLE_value(st, i) SKM_sk_value(ASN1_STRING_TABLE, (st), (i))
#define sk_ASN1_STRING_TABLE_set(st, i, val) SKM_sk_set(ASN1_STRING_TABLE, (st), (i), (val))
#define sk_ASN1_STRING_TABLE_zero(st) SKM_sk_zero(ASN1_STRING_TABLE, (st))
#define sk_ASN1_STRING_TABLE_push(st, val) SKM_sk_push(ASN1_STRING_TABLE, (st), (val))
#define sk_ASN1_STRING_TABLE_unshift(st, val) SKM_sk_unshift(ASN1_STRING_TABLE, (st), (val))
#define sk_ASN1_STRING_TABLE_find(st, val) SKM_sk_find(ASN1_STRING_TABLE, (st), (val))
#define sk_ASN1_STRING_TABLE_find_ex(st, val) SKM_sk_find_ex(ASN1_STRING_TABLE, (st), (val))
#define sk_ASN1_STRING_TABLE_delete(st, i) SKM_sk_delete(ASN1_STRING_TABLE, (st), (i))
#define sk_ASN1_STRING_TABLE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_STRING_TABLE, (st), (ptr))
#define sk_ASN1_STRING_TABLE_insert(st, val, i) SKM_sk_insert(ASN1_STRING_TABLE, (st), (val), (i))
#define sk_ASN1_STRING_TABLE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_STRING_TABLE, (st), (cmp))
#define sk_ASN1_STRING_TABLE_dup(st) SKM_sk_dup(ASN1_STRING_TABLE, st)
#define sk_ASN1_STRING_TABLE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_STRING_TABLE, (st), (free_func))
#define sk_ASN1_STRING_TABLE_shift(st) SKM_sk_shift(ASN1_STRING_TABLE, (st))
#define sk_ASN1_STRING_TABLE_pop(st) SKM_sk_pop(ASN1_STRING_TABLE, (st))
#define sk_ASN1_STRING_TABLE_sort(st) SKM_sk_sort(ASN1_STRING_TABLE, (st))
#define sk_ASN1_STRING_TABLE_is_sorted(st) SKM_sk_is_sorted(ASN1_STRING_TABLE, (st))

#define sk_ASN1_TYPE_new(st) SKM_sk_new(ASN1_TYPE, (st))
#define sk_ASN1_TYPE_new_null() SKM_sk_new_null(ASN1_TYPE)
#define sk_ASN1_TYPE_free(st) SKM_sk_free(ASN1_TYPE, (st))
#define sk_ASN1_TYPE_num(st) SKM_sk_num(ASN1_TYPE, (st))
#define sk_ASN1_TYPE_value(st, i) SKM_sk_value(ASN1_TYPE, (st), (i))
#define sk_ASN1_TYPE_set(st, i, val) SKM_sk_set(ASN1_TYPE, (st), (i), (val))
#define sk_ASN1_TYPE_zero(st) SKM_sk_zero(ASN1_TYPE, (st))
#define sk_ASN1_TYPE_push(st, val) SKM_sk_push(ASN1_TYPE, (st), (val))
#define sk_ASN1_TYPE_unshift(st, val) SKM_sk_unshift(ASN1_TYPE, (st), (val))
#define sk_ASN1_TYPE_find(st, val) SKM_sk_find(ASN1_TYPE, (st), (val))
#define sk_ASN1_TYPE_find_ex(st, val) SKM_sk_find_ex(ASN1_TYPE, (st), (val))
#define sk_ASN1_TYPE_delete(st, i) SKM_sk_delete(ASN1_TYPE, (st), (i))
#define sk_ASN1_TYPE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_TYPE, (st), (ptr))
#define sk_ASN1_TYPE_insert(st, val, i) SKM_sk_insert(ASN1_TYPE, (st), (val), (i))
#define sk_ASN1_TYPE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_TYPE, (st), (cmp))
#define sk_ASN1_TYPE_dup(st) SKM_sk_dup(ASN1_TYPE, st)
#define sk_ASN1_TYPE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_TYPE, (st), (free_func))
#define sk_ASN1_TYPE_shift(st) SKM_sk_shift(ASN1_TYPE, (st))
#define sk_ASN1_TYPE_pop(st) SKM_sk_pop(ASN1_TYPE, (st))
#define sk_ASN1_TYPE_sort(st) SKM_sk_sort(ASN1_TYPE, (st))
#define sk_ASN1_TYPE_is_sorted(st) SKM_sk_is_sorted(ASN1_TYPE, (st))

#define sk_ASN1_VALUE_new(st) SKM_sk_new(ASN1_VALUE, (st))
#define sk_ASN1_VALUE_new_null() SKM_sk_new_null(ASN1_VALUE)
#define sk_ASN1_VALUE_free(st) SKM_sk_free(ASN1_VALUE, (st))
#define sk_ASN1_VALUE_num(st) SKM_sk_num(ASN1_VALUE, (st))
#define sk_ASN1_VALUE_value(st, i) SKM_sk_value(ASN1_VALUE, (st), (i))
#define sk_ASN1_VALUE_set(st, i, val) SKM_sk_set(ASN1_VALUE, (st), (i), (val))
#define sk_ASN1_VALUE_zero(st) SKM_sk_zero(ASN1_VALUE, (st))
#define sk_ASN1_VALUE_push(st, val) SKM_sk_push(ASN1_VALUE, (st), (val))
#define sk_ASN1_VALUE_unshift(st, val) SKM_sk_unshift(ASN1_VALUE, (st), (val))
#define sk_ASN1_VALUE_find(st, val) SKM_sk_find(ASN1_VALUE, (st), (val))
#define sk_ASN1_VALUE_find_ex(st, val) SKM_sk_find_ex(ASN1_VALUE, (st), (val))
#define sk_ASN1_VALUE_delete(st, i) SKM_sk_delete(ASN1_VALUE, (st), (i))
#define sk_ASN1_VALUE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ASN1_VALUE, (st), (ptr))
#define sk_ASN1_VALUE_insert(st, val, i) SKM_sk_insert(ASN1_VALUE, (st), (val), (i))
#define sk_ASN1_VALUE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ASN1_VALUE, (st), (cmp))
#define sk_ASN1_VALUE_dup(st) SKM_sk_dup(ASN1_VALUE, st)
#define sk_ASN1_VALUE_pop_free(st, free_func) SKM_sk_pop_free(ASN1_VALUE, (st), (free_func))
#define sk_ASN1_VALUE_shift(st) SKM_sk_shift(ASN1_VALUE, (st))
#define sk_ASN1_VALUE_pop(st) SKM_sk_pop(ASN1_VALUE, (st))
#define sk_ASN1_VALUE_sort(st) SKM_sk_sort(ASN1_VALUE, (st))
#define sk_ASN1_VALUE_is_sorted(st) SKM_sk_is_sorted(ASN1_VALUE, (st))

#define sk_BIO_new(st) SKM_sk_new(BIO, (st))
#define sk_BIO_new_null() SKM_sk_new_null(BIO)
#define sk_BIO_free(st) SKM_sk_free(BIO, (st))
#define sk_BIO_num(st) SKM_sk_num(BIO, (st))
#define sk_BIO_value(st, i) SKM_sk_value(BIO, (st), (i))
#define sk_BIO_set(st, i, val) SKM_sk_set(BIO, (st), (i), (val))
#define sk_BIO_zero(st) SKM_sk_zero(BIO, (st))
#define sk_BIO_push(st, val) SKM_sk_push(BIO, (st), (val))
#define sk_BIO_unshift(st, val) SKM_sk_unshift(BIO, (st), (val))
#define sk_BIO_find(st, val) SKM_sk_find(BIO, (st), (val))
#define sk_BIO_find_ex(st, val) SKM_sk_find_ex(BIO, (st), (val))
#define sk_BIO_delete(st, i) SKM_sk_delete(BIO, (st), (i))
#define sk_BIO_delete_ptr(st, ptr) SKM_sk_delete_ptr(BIO, (st), (ptr))
#define sk_BIO_insert(st, val, i) SKM_sk_insert(BIO, (st), (val), (i))
#define sk_BIO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(BIO, (st), (cmp))
#define sk_BIO_dup(st) SKM_sk_dup(BIO, st)
#define sk_BIO_pop_free(st, free_func) SKM_sk_pop_free(BIO, (st), (free_func))
#define sk_BIO_shift(st) SKM_sk_shift(BIO, (st))
#define sk_BIO_pop(st) SKM_sk_pop(BIO, (st))
#define sk_BIO_sort(st) SKM_sk_sort(BIO, (st))
#define sk_BIO_is_sorted(st) SKM_sk_is_sorted(BIO, (st))

#define sk_CMS_CertificateChoices_new(st) SKM_sk_new(CMS_CertificateChoices, (st))
#define sk_CMS_CertificateChoices_new_null() SKM_sk_new_null(CMS_CertificateChoices)
#define sk_CMS_CertificateChoices_free(st) SKM_sk_free(CMS_CertificateChoices, (st))
#define sk_CMS_CertificateChoices_num(st) SKM_sk_num(CMS_CertificateChoices, (st))
#define sk_CMS_CertificateChoices_value(st, i) SKM_sk_value(CMS_CertificateChoices, (st), (i))
#define sk_CMS_CertificateChoices_set(st, i, val) SKM_sk_set(CMS_CertificateChoices, (st), (i), (val))
#define sk_CMS_CertificateChoices_zero(st) SKM_sk_zero(CMS_CertificateChoices, (st))
#define sk_CMS_CertificateChoices_push(st, val) SKM_sk_push(CMS_CertificateChoices, (st), (val))
#define sk_CMS_CertificateChoices_unshift(st, val) SKM_sk_unshift(CMS_CertificateChoices, (st), (val))
#define sk_CMS_CertificateChoices_find(st, val) SKM_sk_find(CMS_CertificateChoices, (st), (val))
#define sk_CMS_CertificateChoices_find_ex(st, val) SKM_sk_find_ex(CMS_CertificateChoices, (st), (val))
#define sk_CMS_CertificateChoices_delete(st, i) SKM_sk_delete(CMS_CertificateChoices, (st), (i))
#define sk_CMS_CertificateChoices_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_CertificateChoices, (st), (ptr))
#define sk_CMS_CertificateChoices_insert(st, val, i) SKM_sk_insert(CMS_CertificateChoices, (st), (val), (i))
#define sk_CMS_CertificateChoices_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_CertificateChoices, (st), (cmp))
#define sk_CMS_CertificateChoices_dup(st) SKM_sk_dup(CMS_CertificateChoices, st)
#define sk_CMS_CertificateChoices_pop_free(st, free_func) SKM_sk_pop_free(CMS_CertificateChoices, (st), (free_func))
#define sk_CMS_CertificateChoices_shift(st) SKM_sk_shift(CMS_CertificateChoices, (st))
#define sk_CMS_CertificateChoices_pop(st) SKM_sk_pop(CMS_CertificateChoices, (st))
#define sk_CMS_CertificateChoices_sort(st) SKM_sk_sort(CMS_CertificateChoices, (st))
#define sk_CMS_CertificateChoices_is_sorted(st) SKM_sk_is_sorted(CMS_CertificateChoices, (st))

#define sk_CMS_RecipientInfo_new(st) SKM_sk_new(CMS_RecipientInfo, (st))
#define sk_CMS_RecipientInfo_new_null() SKM_sk_new_null(CMS_RecipientInfo)
#define sk_CMS_RecipientInfo_free(st) SKM_sk_free(CMS_RecipientInfo, (st))
#define sk_CMS_RecipientInfo_num(st) SKM_sk_num(CMS_RecipientInfo, (st))
#define sk_CMS_RecipientInfo_value(st, i) SKM_sk_value(CMS_RecipientInfo, (st), (i))
#define sk_CMS_RecipientInfo_set(st, i, val) SKM_sk_set(CMS_RecipientInfo, (st), (i), (val))
#define sk_CMS_RecipientInfo_zero(st) SKM_sk_zero(CMS_RecipientInfo, (st))
#define sk_CMS_RecipientInfo_push(st, val) SKM_sk_push(CMS_RecipientInfo, (st), (val))
#define sk_CMS_RecipientInfo_unshift(st, val) SKM_sk_unshift(CMS_RecipientInfo, (st), (val))
#define sk_CMS_RecipientInfo_find(st, val) SKM_sk_find(CMS_RecipientInfo, (st), (val))
#define sk_CMS_RecipientInfo_find_ex(st, val) SKM_sk_find_ex(CMS_RecipientInfo, (st), (val))
#define sk_CMS_RecipientInfo_delete(st, i) SKM_sk_delete(CMS_RecipientInfo, (st), (i))
#define sk_CMS_RecipientInfo_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_RecipientInfo, (st), (ptr))
#define sk_CMS_RecipientInfo_insert(st, val, i) SKM_sk_insert(CMS_RecipientInfo, (st), (val), (i))
#define sk_CMS_RecipientInfo_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_RecipientInfo, (st), (cmp))
#define sk_CMS_RecipientInfo_dup(st) SKM_sk_dup(CMS_RecipientInfo, st)
#define sk_CMS_RecipientInfo_pop_free(st, free_func) SKM_sk_pop_free(CMS_RecipientInfo, (st), (free_func))
#define sk_CMS_RecipientInfo_shift(st) SKM_sk_shift(CMS_RecipientInfo, (st))
#define sk_CMS_RecipientInfo_pop(st) SKM_sk_pop(CMS_RecipientInfo, (st))
#define sk_CMS_RecipientInfo_sort(st) SKM_sk_sort(CMS_RecipientInfo, (st))
#define sk_CMS_RecipientInfo_is_sorted(st) SKM_sk_is_sorted(CMS_RecipientInfo, (st))

#define sk_CMS_RevocationInfoChoice_new(st) SKM_sk_new(CMS_RevocationInfoChoice, (st))
#define sk_CMS_RevocationInfoChoice_new_null() SKM_sk_new_null(CMS_RevocationInfoChoice)
#define sk_CMS_RevocationInfoChoice_free(st) SKM_sk_free(CMS_RevocationInfoChoice, (st))
#define sk_CMS_RevocationInfoChoice_num(st) SKM_sk_num(CMS_RevocationInfoChoice, (st))
#define sk_CMS_RevocationInfoChoice_value(st, i) SKM_sk_value(CMS_RevocationInfoChoice, (st), (i))
#define sk_CMS_RevocationInfoChoice_set(st, i, val) SKM_sk_set(CMS_RevocationInfoChoice, (st), (i), (val))
#define sk_CMS_RevocationInfoChoice_zero(st) SKM_sk_zero(CMS_RevocationInfoChoice, (st))
#define sk_CMS_RevocationInfoChoice_push(st, val) SKM_sk_push(CMS_RevocationInfoChoice, (st), (val))
#define sk_CMS_RevocationInfoChoice_unshift(st, val) SKM_sk_unshift(CMS_RevocationInfoChoice, (st), (val))
#define sk_CMS_RevocationInfoChoice_find(st, val) SKM_sk_find(CMS_RevocationInfoChoice, (st), (val))
#define sk_CMS_RevocationInfoChoice_find_ex(st, val) SKM_sk_find_ex(CMS_RevocationInfoChoice, (st), (val))
#define sk_CMS_RevocationInfoChoice_delete(st, i) SKM_sk_delete(CMS_RevocationInfoChoice, (st), (i))
#define sk_CMS_RevocationInfoChoice_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_RevocationInfoChoice, (st), (ptr))
#define sk_CMS_RevocationInfoChoice_insert(st, val, i) SKM_sk_insert(CMS_RevocationInfoChoice, (st), (val), (i))
#define sk_CMS_RevocationInfoChoice_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_RevocationInfoChoice, (st), (cmp))
#define sk_CMS_RevocationInfoChoice_dup(st) SKM_sk_dup(CMS_RevocationInfoChoice, st)
#define sk_CMS_RevocationInfoChoice_pop_free(st, free_func) SKM_sk_pop_free(CMS_RevocationInfoChoice, (st), (free_func))
#define sk_CMS_RevocationInfoChoice_shift(st) SKM_sk_shift(CMS_RevocationInfoChoice, (st))
#define sk_CMS_RevocationInfoChoice_pop(st) SKM_sk_pop(CMS_RevocationInfoChoice, (st))
#define sk_CMS_RevocationInfoChoice_sort(st) SKM_sk_sort(CMS_RevocationInfoChoice, (st))
#define sk_CMS_RevocationInfoChoice_is_sorted(st) SKM_sk_is_sorted(CMS_RevocationInfoChoice, (st))

#define sk_CMS_SignerInfo_new(st) SKM_sk_new(CMS_SignerInfo, (st))
#define sk_CMS_SignerInfo_new_null() SKM_sk_new_null(CMS_SignerInfo)
#define sk_CMS_SignerInfo_free(st) SKM_sk_free(CMS_SignerInfo, (st))
#define sk_CMS_SignerInfo_num(st) SKM_sk_num(CMS_SignerInfo, (st))
#define sk_CMS_SignerInfo_value(st, i) SKM_sk_value(CMS_SignerInfo, (st), (i))
#define sk_CMS_SignerInfo_set(st, i, val) SKM_sk_set(CMS_SignerInfo, (st), (i), (val))
#define sk_CMS_SignerInfo_zero(st) SKM_sk_zero(CMS_SignerInfo, (st))
#define sk_CMS_SignerInfo_push(st, val) SKM_sk_push(CMS_SignerInfo, (st), (val))
#define sk_CMS_SignerInfo_unshift(st, val) SKM_sk_unshift(CMS_SignerInfo, (st), (val))
#define sk_CMS_SignerInfo_find(st, val) SKM_sk_find(CMS_SignerInfo, (st), (val))
#define sk_CMS_SignerInfo_find_ex(st, val) SKM_sk_find_ex(CMS_SignerInfo, (st), (val))
#define sk_CMS_SignerInfo_delete(st, i) SKM_sk_delete(CMS_SignerInfo, (st), (i))
#define sk_CMS_SignerInfo_delete_ptr(st, ptr) SKM_sk_delete_ptr(CMS_SignerInfo, (st), (ptr))
#define sk_CMS_SignerInfo_insert(st, val, i) SKM_sk_insert(CMS_SignerInfo, (st), (val), (i))
#define sk_CMS_SignerInfo_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CMS_SignerInfo, (st), (cmp))
#define sk_CMS_SignerInfo_dup(st) SKM_sk_dup(CMS_SignerInfo, st)
#define sk_CMS_SignerInfo_pop_free(st, free_func) SKM_sk_pop_free(CMS_SignerInfo, (st), (free_func))
#define sk_CMS_SignerInfo_shift(st) SKM_sk_shift(CMS_SignerInfo, (st))
#define sk_CMS_SignerInfo_pop(st) SKM_sk_pop(CMS_SignerInfo, (st))
#define sk_CMS_SignerInfo_sort(st) SKM_sk_sort(CMS_SignerInfo, (st))
#define sk_CMS_SignerInfo_is_sorted(st) SKM_sk_is_sorted(CMS_SignerInfo, (st))

#define sk_CONF_IMODULE_new(st) SKM_sk_new(CONF_IMODULE, (st))
#define sk_CONF_IMODULE_new_null() SKM_sk_new_null(CONF_IMODULE)
#define sk_CONF_IMODULE_free(st) SKM_sk_free(CONF_IMODULE, (st))
#define sk_CONF_IMODULE_num(st) SKM_sk_num(CONF_IMODULE, (st))
#define sk_CONF_IMODULE_value(st, i) SKM_sk_value(CONF_IMODULE, (st), (i))
#define sk_CONF_IMODULE_set(st, i, val) SKM_sk_set(CONF_IMODULE, (st), (i), (val))
#define sk_CONF_IMODULE_zero(st) SKM_sk_zero(CONF_IMODULE, (st))
#define sk_CONF_IMODULE_push(st, val) SKM_sk_push(CONF_IMODULE, (st), (val))
#define sk_CONF_IMODULE_unshift(st, val) SKM_sk_unshift(CONF_IMODULE, (st), (val))
#define sk_CONF_IMODULE_find(st, val) SKM_sk_find(CONF_IMODULE, (st), (val))
#define sk_CONF_IMODULE_find_ex(st, val) SKM_sk_find_ex(CONF_IMODULE, (st), (val))
#define sk_CONF_IMODULE_delete(st, i) SKM_sk_delete(CONF_IMODULE, (st), (i))
#define sk_CONF_IMODULE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_IMODULE, (st), (ptr))
#define sk_CONF_IMODULE_insert(st, val, i) SKM_sk_insert(CONF_IMODULE, (st), (val), (i))
#define sk_CONF_IMODULE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_IMODULE, (st), (cmp))
#define sk_CONF_IMODULE_dup(st) SKM_sk_dup(CONF_IMODULE, st)
#define sk_CONF_IMODULE_pop_free(st, free_func) SKM_sk_pop_free(CONF_IMODULE, (st), (free_func))
#define sk_CONF_IMODULE_shift(st) SKM_sk_shift(CONF_IMODULE, (st))
#define sk_CONF_IMODULE_pop(st) SKM_sk_pop(CONF_IMODULE, (st))
#define sk_CONF_IMODULE_sort(st) SKM_sk_sort(CONF_IMODULE, (st))
#define sk_CONF_IMODULE_is_sorted(st) SKM_sk_is_sorted(CONF_IMODULE, (st))

#define sk_CONF_MODULE_new(st) SKM_sk_new(CONF_MODULE, (st))
#define sk_CONF_MODULE_new_null() SKM_sk_new_null(CONF_MODULE)
#define sk_CONF_MODULE_free(st) SKM_sk_free(CONF_MODULE, (st))
#define sk_CONF_MODULE_num(st) SKM_sk_num(CONF_MODULE, (st))
#define sk_CONF_MODULE_value(st, i) SKM_sk_value(CONF_MODULE, (st), (i))
#define sk_CONF_MODULE_set(st, i, val) SKM_sk_set(CONF_MODULE, (st), (i), (val))
#define sk_CONF_MODULE_zero(st) SKM_sk_zero(CONF_MODULE, (st))
#define sk_CONF_MODULE_push(st, val) SKM_sk_push(CONF_MODULE, (st), (val))
#define sk_CONF_MODULE_unshift(st, val) SKM_sk_unshift(CONF_MODULE, (st), (val))
#define sk_CONF_MODULE_find(st, val) SKM_sk_find(CONF_MODULE, (st), (val))
#define sk_CONF_MODULE_find_ex(st, val) SKM_sk_find_ex(CONF_MODULE, (st), (val))
#define sk_CONF_MODULE_delete(st, i) SKM_sk_delete(CONF_MODULE, (st), (i))
#define sk_CONF_MODULE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_MODULE, (st), (ptr))
#define sk_CONF_MODULE_insert(st, val, i) SKM_sk_insert(CONF_MODULE, (st), (val), (i))
#define sk_CONF_MODULE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_MODULE, (st), (cmp))
#define sk_CONF_MODULE_dup(st) SKM_sk_dup(CONF_MODULE, st)
#define sk_CONF_MODULE_pop_free(st, free_func) SKM_sk_pop_free(CONF_MODULE, (st), (free_func))
#define sk_CONF_MODULE_shift(st) SKM_sk_shift(CONF_MODULE, (st))
#define sk_CONF_MODULE_pop(st) SKM_sk_pop(CONF_MODULE, (st))
#define sk_CONF_MODULE_sort(st) SKM_sk_sort(CONF_MODULE, (st))
#define sk_CONF_MODULE_is_sorted(st) SKM_sk_is_sorted(CONF_MODULE, (st))

#define sk_CONF_VALUE_new(st) SKM_sk_new(CONF_VALUE, (st))
#define sk_CONF_VALUE_new_null() SKM_sk_new_null(CONF_VALUE)
#define sk_CONF_VALUE_free(st) SKM_sk_free(CONF_VALUE, (st))
#define sk_CONF_VALUE_num(st) SKM_sk_num(CONF_VALUE, (st))
#define sk_CONF_VALUE_value(st, i) SKM_sk_value(CONF_VALUE, (st), (i))
#define sk_CONF_VALUE_set(st, i, val) SKM_sk_set(CONF_VALUE, (st), (i), (val))
#define sk_CONF_VALUE_zero(st) SKM_sk_zero(CONF_VALUE, (st))
#define sk_CONF_VALUE_push(st, val) SKM_sk_push(CONF_VALUE, (st), (val))
#define sk_CONF_VALUE_unshift(st, val) SKM_sk_unshift(CONF_VALUE, (st), (val))
#define sk_CONF_VALUE_find(st, val) SKM_sk_find(CONF_VALUE, (st), (val))
#define sk_CONF_VALUE_find_ex(st, val) SKM_sk_find_ex(CONF_VALUE, (st), (val))
#define sk_CONF_VALUE_delete(st, i) SKM_sk_delete(CONF_VALUE, (st), (i))
#define sk_CONF_VALUE_delete_ptr(st, ptr) SKM_sk_delete_ptr(CONF_VALUE, (st), (ptr))
#define sk_CONF_VALUE_insert(st, val, i) SKM_sk_insert(CONF_VALUE, (st), (val), (i))
#define sk_CONF_VALUE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CONF_VALUE, (st), (cmp))
#define sk_CONF_VALUE_dup(st) SKM_sk_dup(CONF_VALUE, st)
#define sk_CONF_VALUE_pop_free(st, free_func) SKM_sk_pop_free(CONF_VALUE, (st), (free_func))
#define sk_CONF_VALUE_shift(st) SKM_sk_shift(CONF_VALUE, (st))
#define sk_CONF_VALUE_pop(st) SKM_sk_pop(CONF_VALUE, (st))
#define sk_CONF_VALUE_sort(st) SKM_sk_sort(CONF_VALUE, (st))
#define sk_CONF_VALUE_is_sorted(st) SKM_sk_is_sorted(CONF_VALUE, (st))

#define sk_CRYPTO_EX_DATA_FUNCS_new(st) SKM_sk_new(CRYPTO_EX_DATA_FUNCS, (st))
#define sk_CRYPTO_EX_DATA_FUNCS_new_null() SKM_sk_new_null(CRYPTO_EX_DATA_FUNCS)
#define sk_CRYPTO_EX_DATA_FUNCS_free(st) SKM_sk_free(CRYPTO_EX_DATA_FUNCS, (st))
#define sk_CRYPTO_EX_DATA_FUNCS_num(st) SKM_sk_num(CRYPTO_EX_DATA_FUNCS, (st))
#define sk_CRYPTO_EX_DATA_FUNCS_value(st, i) SKM_sk_value(CRYPTO_EX_DATA_FUNCS, (st), (i))
#define sk_CRYPTO_EX_DATA_FUNCS_set(st, i, val) SKM_sk_set(CRYPTO_EX_DATA_FUNCS, (st), (i), (val))
#define sk_CRYPTO_EX_DATA_FUNCS_zero(st) SKM_sk_zero(CRYPTO_EX_DATA_FUNCS, (st))
#define sk_CRYPTO_EX_DATA_FUNCS_push(st, val) SKM_sk_push(CRYPTO_EX_DATA_FUNCS, (st), (val))
#define sk_CRYPTO_EX_DATA_FUNCS_unshift(st, val) SKM_sk_unshift(CRYPTO_EX_DATA_FUNCS, (st), (val))
#define sk_CRYPTO_EX_DATA_FUNCS_find(st, val) SKM_sk_find(CRYPTO_EX_DATA_FUNCS, (st), (val))
#define sk_CRYPTO_EX_DATA_FUNCS_find_ex(st, val) SKM_sk_find_ex(CRYPTO_EX_DATA_FUNCS, (st), (val))
#define sk_CRYPTO_EX_DATA_FUNCS_delete(st, i) SKM_sk_delete(CRYPTO_EX_DATA_FUNCS, (st), (i))
#define sk_CRYPTO_EX_DATA_FUNCS_delete_ptr(st, ptr) SKM_sk_delete_ptr(CRYPTO_EX_DATA_FUNCS, (st), (ptr))
#define sk_CRYPTO_EX_DATA_FUNCS_insert(st, val, i) SKM_sk_insert(CRYPTO_EX_DATA_FUNCS, (st), (val), (i))
#define sk_CRYPTO_EX_DATA_FUNCS_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CRYPTO_EX_DATA_FUNCS, (st), (cmp))
#define sk_CRYPTO_EX_DATA_FUNCS_dup(st) SKM_sk_dup(CRYPTO_EX_DATA_FUNCS, st)
#define sk_CRYPTO_EX_DATA_FUNCS_pop_free(st, free_func) SKM_sk_pop_free(CRYPTO_EX_DATA_FUNCS, (st), (free_func))
#define sk_CRYPTO_EX_DATA_FUNCS_shift(st) SKM_sk_shift(CRYPTO_EX_DATA_FUNCS, (st))
#define sk_CRYPTO_EX_DATA_FUNCS_pop(st) SKM_sk_pop(CRYPTO_EX_DATA_FUNCS, (st))
#define sk_CRYPTO_EX_DATA_FUNCS_sort(st) SKM_sk_sort(CRYPTO_EX_DATA_FUNCS, (st))
#define sk_CRYPTO_EX_DATA_FUNCS_is_sorted(st) SKM_sk_is_sorted(CRYPTO_EX_DATA_FUNCS, (st))

#define sk_CRYPTO_dynlock_new(st) SKM_sk_new(CRYPTO_dynlock, (st))
#define sk_CRYPTO_dynlock_new_null() SKM_sk_new_null(CRYPTO_dynlock)
#define sk_CRYPTO_dynlock_free(st) SKM_sk_free(CRYPTO_dynlock, (st))
#define sk_CRYPTO_dynlock_num(st) SKM_sk_num(CRYPTO_dynlock, (st))
#define sk_CRYPTO_dynlock_value(st, i) SKM_sk_value(CRYPTO_dynlock, (st), (i))
#define sk_CRYPTO_dynlock_set(st, i, val) SKM_sk_set(CRYPTO_dynlock, (st), (i), (val))
#define sk_CRYPTO_dynlock_zero(st) SKM_sk_zero(CRYPTO_dynlock, (st))
#define sk_CRYPTO_dynlock_push(st, val) SKM_sk_push(CRYPTO_dynlock, (st), (val))
#define sk_CRYPTO_dynlock_unshift(st, val) SKM_sk_unshift(CRYPTO_dynlock, (st), (val))
#define sk_CRYPTO_dynlock_find(st, val) SKM_sk_find(CRYPTO_dynlock, (st), (val))
#define sk_CRYPTO_dynlock_find_ex(st, val) SKM_sk_find_ex(CRYPTO_dynlock, (st), (val))
#define sk_CRYPTO_dynlock_delete(st, i) SKM_sk_delete(CRYPTO_dynlock, (st), (i))
#define sk_CRYPTO_dynlock_delete_ptr(st, ptr) SKM_sk_delete_ptr(CRYPTO_dynlock, (st), (ptr))
#define sk_CRYPTO_dynlock_insert(st, val, i) SKM_sk_insert(CRYPTO_dynlock, (st), (val), (i))
#define sk_CRYPTO_dynlock_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(CRYPTO_dynlock, (st), (cmp))
#define sk_CRYPTO_dynlock_dup(st) SKM_sk_dup(CRYPTO_dynlock, st)
#define sk_CRYPTO_dynlock_pop_free(st, free_func) SKM_sk_pop_free(CRYPTO_dynlock, (st), (free_func))
#define sk_CRYPTO_dynlock_shift(st) SKM_sk_shift(CRYPTO_dynlock, (st))
#define sk_CRYPTO_dynlock_pop(st) SKM_sk_pop(CRYPTO_dynlock, (st))
#define sk_CRYPTO_dynlock_sort(st) SKM_sk_sort(CRYPTO_dynlock, (st))
#define sk_CRYPTO_dynlock_is_sorted(st) SKM_sk_is_sorted(CRYPTO_dynlock, (st))

#define sk_DIST_POINT_new(st) SKM_sk_new(DIST_POINT, (st))
#define sk_DIST_POINT_new_null() SKM_sk_new_null(DIST_POINT)
#define sk_DIST_POINT_free(st) SKM_sk_free(DIST_POINT, (st))
#define sk_DIST_POINT_num(st) SKM_sk_num(DIST_POINT, (st))
#define sk_DIST_POINT_value(st, i) SKM_sk_value(DIST_POINT, (st), (i))
#define sk_DIST_POINT_set(st, i, val) SKM_sk_set(DIST_POINT, (st), (i), (val))
#define sk_DIST_POINT_zero(st) SKM_sk_zero(DIST_POINT, (st))
#define sk_DIST_POINT_push(st, val) SKM_sk_push(DIST_POINT, (st), (val))
#define sk_DIST_POINT_unshift(st, val) SKM_sk_unshift(DIST_POINT, (st), (val))
#define sk_DIST_POINT_find(st, val) SKM_sk_find(DIST_POINT, (st), (val))
#define sk_DIST_POINT_find_ex(st, val) SKM_sk_find_ex(DIST_POINT, (st), (val))
#define sk_DIST_POINT_delete(st, i) SKM_sk_delete(DIST_POINT, (st), (i))
#define sk_DIST_POINT_delete_ptr(st, ptr) SKM_sk_delete_ptr(DIST_POINT, (st), (ptr))
#define sk_DIST_POINT_insert(st, val, i) SKM_sk_insert(DIST_POINT, (st), (val), (i))
#define sk_DIST_POINT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(DIST_POINT, (st), (cmp))
#define sk_DIST_POINT_dup(st) SKM_sk_dup(DIST_POINT, st)
#define sk_DIST_POINT_pop_free(st, free_func) SKM_sk_pop_free(DIST_POINT, (st), (free_func))
#define sk_DIST_POINT_shift(st) SKM_sk_shift(DIST_POINT, (st))
#define sk_DIST_POINT_pop(st) SKM_sk_pop(DIST_POINT, (st))
#define sk_DIST_POINT_sort(st) SKM_sk_sort(DIST_POINT, (st))
#define sk_DIST_POINT_is_sorted(st) SKM_sk_is_sorted(DIST_POINT, (st))

#define sk_ENGINE_new(st) SKM_sk_new(ENGINE, (st))
#define sk_ENGINE_new_null() SKM_sk_new_null(ENGINE)
#define sk_ENGINE_free(st) SKM_sk_free(ENGINE, (st))
#define sk_ENGINE_num(st) SKM_sk_num(ENGINE, (st))
#define sk_ENGINE_value(st, i) SKM_sk_value(ENGINE, (st), (i))
#define sk_ENGINE_set(st, i, val) SKM_sk_set(ENGINE, (st), (i), (val))
#define sk_ENGINE_zero(st) SKM_sk_zero(ENGINE, (st))
#define sk_ENGINE_push(st, val) SKM_sk_push(ENGINE, (st), (val))
#define sk_ENGINE_unshift(st, val) SKM_sk_unshift(ENGINE, (st), (val))
#define sk_ENGINE_find(st, val) SKM_sk_find(ENGINE, (st), (val))
#define sk_ENGINE_find_ex(st, val) SKM_sk_find_ex(ENGINE, (st), (val))
#define sk_ENGINE_delete(st, i) SKM_sk_delete(ENGINE, (st), (i))
#define sk_ENGINE_delete_ptr(st, ptr) SKM_sk_delete_ptr(ENGINE, (st), (ptr))
#define sk_ENGINE_insert(st, val, i) SKM_sk_insert(ENGINE, (st), (val), (i))
#define sk_ENGINE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ENGINE, (st), (cmp))
#define sk_ENGINE_dup(st) SKM_sk_dup(ENGINE, st)
#define sk_ENGINE_pop_free(st, free_func) SKM_sk_pop_free(ENGINE, (st), (free_func))
#define sk_ENGINE_shift(st) SKM_sk_shift(ENGINE, (st))
#define sk_ENGINE_pop(st) SKM_sk_pop(ENGINE, (st))
#define sk_ENGINE_sort(st) SKM_sk_sort(ENGINE, (st))
#define sk_ENGINE_is_sorted(st) SKM_sk_is_sorted(ENGINE, (st))

#define sk_ENGINE_CLEANUP_ITEM_new(st) SKM_sk_new(ENGINE_CLEANUP_ITEM, (st))
#define sk_ENGINE_CLEANUP_ITEM_new_null() SKM_sk_new_null(ENGINE_CLEANUP_ITEM)
#define sk_ENGINE_CLEANUP_ITEM_free(st) SKM_sk_free(ENGINE_CLEANUP_ITEM, (st))
#define sk_ENGINE_CLEANUP_ITEM_num(st) SKM_sk_num(ENGINE_CLEANUP_ITEM, (st))
#define sk_ENGINE_CLEANUP_ITEM_value(st, i) SKM_sk_value(ENGINE_CLEANUP_ITEM, (st), (i))
#define sk_ENGINE_CLEANUP_ITEM_set(st, i, val) SKM_sk_set(ENGINE_CLEANUP_ITEM, (st), (i), (val))
#define sk_ENGINE_CLEANUP_ITEM_zero(st) SKM_sk_zero(ENGINE_CLEANUP_ITEM, (st))
#define sk_ENGINE_CLEANUP_ITEM_push(st, val) SKM_sk_push(ENGINE_CLEANUP_ITEM, (st), (val))
#define sk_ENGINE_CLEANUP_ITEM_unshift(st, val) SKM_sk_unshift(ENGINE_CLEANUP_ITEM, (st), (val))
#define sk_ENGINE_CLEANUP_ITEM_find(st, val) SKM_sk_find(ENGINE_CLEANUP_ITEM, (st), (val))
#define sk_ENGINE_CLEANUP_ITEM_find_ex(st, val) SKM_sk_find_ex(ENGINE_CLEANUP_ITEM, (st), (val))
#define sk_ENGINE_CLEANUP_ITEM_delete(st, i) SKM_sk_delete(ENGINE_CLEANUP_ITEM, (st), (i))
#define sk_ENGINE_CLEANUP_ITEM_delete_ptr(st, ptr) SKM_sk_delete_ptr(ENGINE_CLEANUP_ITEM, (st), (ptr))
#define sk_ENGINE_CLEANUP_ITEM_insert(st, val, i) SKM_sk_insert(ENGINE_CLEANUP_ITEM, (st), (val), (i))
#define sk_ENGINE_CLEANUP_ITEM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(ENGINE_CLEANUP_ITEM, (st), (cmp))
#define sk_ENGINE_CLEANUP_ITEM_dup(st) SKM_sk_dup(ENGINE_CLEANUP_ITEM, st)
#define sk_ENGINE_CLEANUP_ITEM_pop_free(st, free_func) SKM_sk_pop_free(ENGINE_CLEANUP_ITEM, (st), (free_func))
#define sk_ENGINE_CLEANUP_ITEM_shift(st) SKM_sk_shift(ENGINE_CLEANUP_ITEM, (st))
#define sk_ENGINE_CLEANUP_ITEM_pop(st) SKM_sk_pop(ENGINE_CLEANUP_ITEM, (st))
#define sk_ENGINE_CLEANUP_ITEM_sort(st) SKM_sk_sort(ENGINE_CLEANUP_ITEM, (st))
#define sk_ENGINE_CLEANUP_ITEM_is_sorted(st) SKM_sk_is_sorted(ENGINE_CLEANUP_ITEM, (st))

#define sk_EVP_PKEY_ASN1_METHOD_new(st) SKM_sk_new(EVP_PKEY_ASN1_METHOD, (st))
#define sk_EVP_PKEY_ASN1_METHOD_new_null() SKM_sk_new_null(EVP_PKEY_ASN1_METHOD)
#define sk_EVP_PKEY_ASN1_METHOD_free(st) SKM_sk_free(EVP_PKEY_ASN1_METHOD, (st))
#define sk_EVP_PKEY_ASN1_METHOD_num(st) SKM_sk_num(EVP_PKEY_ASN1_METHOD, (st))
#define sk_EVP_PKEY_ASN1_METHOD_value(st, i) SKM_sk_value(EVP_PKEY_ASN1_METHOD, (st), (i))
#define sk_EVP_PKEY_ASN1_METHOD_set(st, i, val) SKM_sk_set(EVP_PKEY_ASN1_METHOD, (st), (i), (val))
#define sk_EVP_PKEY_ASN1_METHOD_zero(st) SKM_sk_zero(EVP_PKEY_ASN1_METHOD, (st))
#define sk_EVP_PKEY_ASN1_METHOD_push(st, val) SKM_sk_push(EVP_PKEY_ASN1_METHOD, (st), (val))
#define sk_EVP_PKEY_ASN1_METHOD_unshift(st, val) SKM_sk_unshift(EVP_PKEY_ASN1_METHOD, (st), (val))
#define sk_EVP_PKEY_ASN1_METHOD_find(st, val) SKM_sk_find(EVP_PKEY_ASN1_METHOD, (st), (val))
#define sk_EVP_PKEY_ASN1_METHOD_find_ex(st, val) SKM_sk_find_ex(EVP_PKEY_ASN1_METHOD, (st), (val))
#define sk_EVP_PKEY_ASN1_METHOD_delete(st, i) SKM_sk_delete(EVP_PKEY_ASN1_METHOD, (st), (i))
#define sk_EVP_PKEY_ASN1_METHOD_delete_ptr(st, ptr) SKM_sk_delete_ptr(EVP_PKEY_ASN1_METHOD, (st), (ptr))
#define sk_EVP_PKEY_ASN1_METHOD_insert(st, val, i) SKM_sk_insert(EVP_PKEY_ASN1_METHOD, (st), (val), (i))
#define sk_EVP_PKEY_ASN1_METHOD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(EVP_PKEY_ASN1_METHOD, (st), (cmp))
#define sk_EVP_PKEY_ASN1_METHOD_dup(st) SKM_sk_dup(EVP_PKEY_ASN1_METHOD, st)
#define sk_EVP_PKEY_ASN1_METHOD_pop_free(st, free_func) SKM_sk_pop_free(EVP_PKEY_ASN1_METHOD, (st), (free_func))
#define sk_EVP_PKEY_ASN1_METHOD_shift(st) SKM_sk_shift(EVP_PKEY_ASN1_METHOD, (st))
#define sk_EVP_PKEY_ASN1_METHOD_pop(st) SKM_sk_pop(EVP_PKEY_ASN1_METHOD, (st))
#define sk_EVP_PKEY_ASN1_METHOD_sort(st) SKM_sk_sort(EVP_PKEY_ASN1_METHOD, (st))
#define sk_EVP_PKEY_ASN1_METHOD_is_sorted(st) SKM_sk_is_sorted(EVP_PKEY_ASN1_METHOD, (st))

#define sk_GENERAL_NAME_new(st) SKM_sk_new(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_new_null() SKM_sk_new_null(GENERAL_NAME)
#define sk_GENERAL_NAME_free(st) SKM_sk_free(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_num(st) SKM_sk_num(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_value(st, i) SKM_sk_value(GENERAL_NAME, (st), (i))
#define sk_GENERAL_NAME_set(st, i, val) SKM_sk_set(GENERAL_NAME, (st), (i), (val))
#define sk_GENERAL_NAME_zero(st) SKM_sk_zero(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_push(st, val) SKM_sk_push(GENERAL_NAME, (st), (val))
#define sk_GENERAL_NAME_unshift(st, val) SKM_sk_unshift(GENERAL_NAME, (st), (val))
#define sk_GENERAL_NAME_find(st, val) SKM_sk_find(GENERAL_NAME, (st), (val))
#define sk_GENERAL_NAME_find_ex(st, val) SKM_sk_find_ex(GENERAL_NAME, (st), (val))
#define sk_GENERAL_NAME_delete(st, i) SKM_sk_delete(GENERAL_NAME, (st), (i))
#define sk_GENERAL_NAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_NAME, (st), (ptr))
#define sk_GENERAL_NAME_insert(st, val, i) SKM_sk_insert(GENERAL_NAME, (st), (val), (i))
#define sk_GENERAL_NAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_NAME, (st), (cmp))
#define sk_GENERAL_NAME_dup(st) SKM_sk_dup(GENERAL_NAME, st)
#define sk_GENERAL_NAME_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_NAME, (st), (free_func))
#define sk_GENERAL_NAME_shift(st) SKM_sk_shift(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_pop(st) SKM_sk_pop(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_sort(st) SKM_sk_sort(GENERAL_NAME, (st))
#define sk_GENERAL_NAME_is_sorted(st) SKM_sk_is_sorted(GENERAL_NAME, (st))

#define sk_GENERAL_NAMES_new(st) SKM_sk_new(GENERAL_NAMES, (st))
#define sk_GENERAL_NAMES_new_null() SKM_sk_new_null(GENERAL_NAMES)
#define sk_GENERAL_NAMES_free(st) SKM_sk_free(GENERAL_NAMES, (st))
#define sk_GENERAL_NAMES_num(st) SKM_sk_num(GENERAL_NAMES, (st))
#define sk_GENERAL_NAMES_value(st, i) SKM_sk_value(GENERAL_NAMES, (st), (i))
#define sk_GENERAL_NAMES_set(st, i, val) SKM_sk_set(GENERAL_NAMES, (st), (i), (val))
#define sk_GENERAL_NAMES_zero(st) SKM_sk_zero(GENERAL_NAMES, (st))
#define sk_GENERAL_NAMES_push(st, val) SKM_sk_push(GENERAL_NAMES, (st), (val))
#define sk_GENERAL_NAMES_unshift(st, val) SKM_sk_unshift(GENERAL_NAMES, (st), (val))
#define sk_GENERAL_NAMES_find(st, val) SKM_sk_find(GENERAL_NAMES, (st), (val))
#define sk_GENERAL_NAMES_find_ex(st, val) SKM_sk_find_ex(GENERAL_NAMES, (st), (val))
#define sk_GENERAL_NAMES_delete(st, i) SKM_sk_delete(GENERAL_NAMES, (st), (i))
#define sk_GENERAL_NAMES_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_NAMES, (st), (ptr))
#define sk_GENERAL_NAMES_insert(st, val, i) SKM_sk_insert(GENERAL_NAMES, (st), (val), (i))
#define sk_GENERAL_NAMES_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_NAMES, (st), (cmp))
#define sk_GENERAL_NAMES_dup(st) SKM_sk_dup(GENERAL_NAMES, st)
#define sk_GENERAL_NAMES_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_NAMES, (st), (free_func))
#define sk_GENERAL_NAMES_shift(st) SKM_sk_shift(GENERAL_NAMES, (st))
#define sk_GENERAL_NAMES_pop(st) SKM_sk_pop(GENERAL_NAMES, (st))
#define sk_GENERAL_NAMES_sort(st) SKM_sk_sort(GENERAL_NAMES, (st))
#define sk_GENERAL_NAMES_is_sorted(st) SKM_sk_is_sorted(GENERAL_NAMES, (st))

#define sk_GENERAL_SUBTREE_new(st) SKM_sk_new(GENERAL_SUBTREE, (st))
#define sk_GENERAL_SUBTREE_new_null() SKM_sk_new_null(GENERAL_SUBTREE)
#define sk_GENERAL_SUBTREE_free(st) SKM_sk_free(GENERAL_SUBTREE, (st))
#define sk_GENERAL_SUBTREE_num(st) SKM_sk_num(GENERAL_SUBTREE, (st))
#define sk_GENERAL_SUBTREE_value(st, i) SKM_sk_value(GENERAL_SUBTREE, (st), (i))
#define sk_GENERAL_SUBTREE_set(st, i, val) SKM_sk_set(GENERAL_SUBTREE, (st), (i), (val))
#define sk_GENERAL_SUBTREE_zero(st) SKM_sk_zero(GENERAL_SUBTREE, (st))
#define sk_GENERAL_SUBTREE_push(st, val) SKM_sk_push(GENERAL_SUBTREE, (st), (val))
#define sk_GENERAL_SUBTREE_unshift(st, val) SKM_sk_unshift(GENERAL_SUBTREE, (st), (val))
#define sk_GENERAL_SUBTREE_find(st, val) SKM_sk_find(GENERAL_SUBTREE, (st), (val))
#define sk_GENERAL_SUBTREE_find_ex(st, val) SKM_sk_find_ex(GENERAL_SUBTREE, (st), (val))
#define sk_GENERAL_SUBTREE_delete(st, i) SKM_sk_delete(GENERAL_SUBTREE, (st), (i))
#define sk_GENERAL_SUBTREE_delete_ptr(st, ptr) SKM_sk_delete_ptr(GENERAL_SUBTREE, (st), (ptr))
#define sk_GENERAL_SUBTREE_insert(st, val, i) SKM_sk_insert(GENERAL_SUBTREE, (st), (val), (i))
#define sk_GENERAL_SUBTREE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(GENERAL_SUBTREE, (st), (cmp))
#define sk_GENERAL_SUBTREE_dup(st) SKM_sk_dup(GENERAL_SUBTREE, st)
#define sk_GENERAL_SUBTREE_pop_free(st, free_func) SKM_sk_pop_free(GENERAL_SUBTREE, (st), (free_func))
#define sk_GENERAL_SUBTREE_shift(st) SKM_sk_shift(GENERAL_SUBTREE, (st))
#define sk_GENERAL_SUBTREE_pop(st) SKM_sk_pop(GENERAL_SUBTREE, (st))
#define sk_GENERAL_SUBTREE_sort(st) SKM_sk_sort(GENERAL_SUBTREE, (st))
#define sk_GENERAL_SUBTREE_is_sorted(st) SKM_sk_is_sorted(GENERAL_SUBTREE, (st))

#define sk_IPAddressFamily_new(st) SKM_sk_new(IPAddressFamily, (st))
#define sk_IPAddressFamily_new_null() SKM_sk_new_null(IPAddressFamily)
#define sk_IPAddressFamily_free(st) SKM_sk_free(IPAddressFamily, (st))
#define sk_IPAddressFamily_num(st) SKM_sk_num(IPAddressFamily, (st))
#define sk_IPAddressFamily_value(st, i) SKM_sk_value(IPAddressFamily, (st), (i))
#define sk_IPAddressFamily_set(st, i, val) SKM_sk_set(IPAddressFamily, (st), (i), (val))
#define sk_IPAddressFamily_zero(st) SKM_sk_zero(IPAddressFamily, (st))
#define sk_IPAddressFamily_push(st, val) SKM_sk_push(IPAddressFamily, (st), (val))
#define sk_IPAddressFamily_unshift(st, val) SKM_sk_unshift(IPAddressFamily, (st), (val))
#define sk_IPAddressFamily_find(st, val) SKM_sk_find(IPAddressFamily, (st), (val))
#define sk_IPAddressFamily_find_ex(st, val) SKM_sk_find_ex(IPAddressFamily, (st), (val))
#define sk_IPAddressFamily_delete(st, i) SKM_sk_delete(IPAddressFamily, (st), (i))
#define sk_IPAddressFamily_delete_ptr(st, ptr) SKM_sk_delete_ptr(IPAddressFamily, (st), (ptr))
#define sk_IPAddressFamily_insert(st, val, i) SKM_sk_insert(IPAddressFamily, (st), (val), (i))
#define sk_IPAddressFamily_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(IPAddressFamily, (st), (cmp))
#define sk_IPAddressFamily_dup(st) SKM_sk_dup(IPAddressFamily, st)
#define sk_IPAddressFamily_pop_free(st, free_func) SKM_sk_pop_free(IPAddressFamily, (st), (free_func))
#define sk_IPAddressFamily_shift(st) SKM_sk_shift(IPAddressFamily, (st))
#define sk_IPAddressFamily_pop(st) SKM_sk_pop(IPAddressFamily, (st))
#define sk_IPAddressFamily_sort(st) SKM_sk_sort(IPAddressFamily, (st))
#define sk_IPAddressFamily_is_sorted(st) SKM_sk_is_sorted(IPAddressFamily, (st))

#define sk_IPAddressOrRange_new(st) SKM_sk_new(IPAddressOrRange, (st))
#define sk_IPAddressOrRange_new_null() SKM_sk_new_null(IPAddressOrRange)
#define sk_IPAddressOrRange_free(st) SKM_sk_free(IPAddressOrRange, (st))
#define sk_IPAddressOrRange_num(st) SKM_sk_num(IPAddressOrRange, (st))
#define sk_IPAddressOrRange_value(st, i) SKM_sk_value(IPAddressOrRange, (st), (i))
#define sk_IPAddressOrRange_set(st, i, val) SKM_sk_set(IPAddressOrRange, (st), (i), (val))
#define sk_IPAddressOrRange_zero(st) SKM_sk_zero(IPAddressOrRange, (st))
#define sk_IPAddressOrRange_push(st, val) SKM_sk_push(IPAddressOrRange, (st), (val))
#define sk_IPAddressOrRange_unshift(st, val) SKM_sk_unshift(IPAddressOrRange, (st), (val))
#define sk_IPAddressOrRange_find(st, val) SKM_sk_find(IPAddressOrRange, (st), (val))
#define sk_IPAddressOrRange_find_ex(st, val) SKM_sk_find_ex(IPAddressOrRange, (st), (val))
#define sk_IPAddressOrRange_delete(st, i) SKM_sk_delete(IPAddressOrRange, (st), (i))
#define sk_IPAddressOrRange_delete_ptr(st, ptr) SKM_sk_delete_ptr(IPAddressOrRange, (st), (ptr))
#define sk_IPAddressOrRange_insert(st, val, i) SKM_sk_insert(IPAddressOrRange, (st), (val), (i))
#define sk_IPAddressOrRange_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(IPAddressOrRange, (st), (cmp))
#define sk_IPAddressOrRange_dup(st) SKM_sk_dup(IPAddressOrRange, st)
#define sk_IPAddressOrRange_pop_free(st, free_func) SKM_sk_pop_free(IPAddressOrRange, (st), (free_func))
#define sk_IPAddressOrRange_shift(st) SKM_sk_shift(IPAddressOrRange, (st))
#define sk_IPAddressOrRange_pop(st) SKM_sk_pop(IPAddressOrRange, (st))
#define sk_IPAddressOrRange_sort(st) SKM_sk_sort(IPAddressOrRange, (st))
#define sk_IPAddressOrRange_is_sorted(st) SKM_sk_is_sorted(IPAddressOrRange, (st))

#define sk_KRB5_APREQBODY_new(st) SKM_sk_new(KRB5_APREQBODY, (st))
#define sk_KRB5_APREQBODY_new_null() SKM_sk_new_null(KRB5_APREQBODY)
#define sk_KRB5_APREQBODY_free(st) SKM_sk_free(KRB5_APREQBODY, (st))
#define sk_KRB5_APREQBODY_num(st) SKM_sk_num(KRB5_APREQBODY, (st))
#define sk_KRB5_APREQBODY_value(st, i) SKM_sk_value(KRB5_APREQBODY, (st), (i))
#define sk_KRB5_APREQBODY_set(st, i, val) SKM_sk_set(KRB5_APREQBODY, (st), (i), (val))
#define sk_KRB5_APREQBODY_zero(st) SKM_sk_zero(KRB5_APREQBODY, (st))
#define sk_KRB5_APREQBODY_push(st, val) SKM_sk_push(KRB5_APREQBODY, (st), (val))
#define sk_KRB5_APREQBODY_unshift(st, val) SKM_sk_unshift(KRB5_APREQBODY, (st), (val))
#define sk_KRB5_APREQBODY_find(st, val) SKM_sk_find(KRB5_APREQBODY, (st), (val))
#define sk_KRB5_APREQBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_APREQBODY, (st), (val))
#define sk_KRB5_APREQBODY_delete(st, i) SKM_sk_delete(KRB5_APREQBODY, (st), (i))
#define sk_KRB5_APREQBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_APREQBODY, (st), (ptr))
#define sk_KRB5_APREQBODY_insert(st, val, i) SKM_sk_insert(KRB5_APREQBODY, (st), (val), (i))
#define sk_KRB5_APREQBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_APREQBODY, (st), (cmp))
#define sk_KRB5_APREQBODY_dup(st) SKM_sk_dup(KRB5_APREQBODY, st)
#define sk_KRB5_APREQBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_APREQBODY, (st), (free_func))
#define sk_KRB5_APREQBODY_shift(st) SKM_sk_shift(KRB5_APREQBODY, (st))
#define sk_KRB5_APREQBODY_pop(st) SKM_sk_pop(KRB5_APREQBODY, (st))
#define sk_KRB5_APREQBODY_sort(st) SKM_sk_sort(KRB5_APREQBODY, (st))
#define sk_KRB5_APREQBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_APREQBODY, (st))

#define sk_KRB5_AUTHDATA_new(st) SKM_sk_new(KRB5_AUTHDATA, (st))
#define sk_KRB5_AUTHDATA_new_null() SKM_sk_new_null(KRB5_AUTHDATA)
#define sk_KRB5_AUTHDATA_free(st) SKM_sk_free(KRB5_AUTHDATA, (st))
#define sk_KRB5_AUTHDATA_num(st) SKM_sk_num(KRB5_AUTHDATA, (st))
#define sk_KRB5_AUTHDATA_value(st, i) SKM_sk_value(KRB5_AUTHDATA, (st), (i))
#define sk_KRB5_AUTHDATA_set(st, i, val) SKM_sk_set(KRB5_AUTHDATA, (st), (i), (val))
#define sk_KRB5_AUTHDATA_zero(st) SKM_sk_zero(KRB5_AUTHDATA, (st))
#define sk_KRB5_AUTHDATA_push(st, val) SKM_sk_push(KRB5_AUTHDATA, (st), (val))
#define sk_KRB5_AUTHDATA_unshift(st, val) SKM_sk_unshift(KRB5_AUTHDATA, (st), (val))
#define sk_KRB5_AUTHDATA_find(st, val) SKM_sk_find(KRB5_AUTHDATA, (st), (val))
#define sk_KRB5_AUTHDATA_find_ex(st, val) SKM_sk_find_ex(KRB5_AUTHDATA, (st), (val))
#define sk_KRB5_AUTHDATA_delete(st, i) SKM_sk_delete(KRB5_AUTHDATA, (st), (i))
#define sk_KRB5_AUTHDATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_AUTHDATA, (st), (ptr))
#define sk_KRB5_AUTHDATA_insert(st, val, i) SKM_sk_insert(KRB5_AUTHDATA, (st), (val), (i))
#define sk_KRB5_AUTHDATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_AUTHDATA, (st), (cmp))
#define sk_KRB5_AUTHDATA_dup(st) SKM_sk_dup(KRB5_AUTHDATA, st)
#define sk_KRB5_AUTHDATA_pop_free(st, free_func) SKM_sk_pop_free(KRB5_AUTHDATA, (st), (free_func))
#define sk_KRB5_AUTHDATA_shift(st) SKM_sk_shift(KRB5_AUTHDATA, (st))
#define sk_KRB5_AUTHDATA_pop(st) SKM_sk_pop(KRB5_AUTHDATA, (st))
#define sk_KRB5_AUTHDATA_sort(st) SKM_sk_sort(KRB5_AUTHDATA, (st))
#define sk_KRB5_AUTHDATA_is_sorted(st) SKM_sk_is_sorted(KRB5_AUTHDATA, (st))

#define sk_KRB5_AUTHENTBODY_new(st) SKM_sk_new(KRB5_AUTHENTBODY, (st))
#define sk_KRB5_AUTHENTBODY_new_null() SKM_sk_new_null(KRB5_AUTHENTBODY)
#define sk_KRB5_AUTHENTBODY_free(st) SKM_sk_free(KRB5_AUTHENTBODY, (st))
#define sk_KRB5_AUTHENTBODY_num(st) SKM_sk_num(KRB5_AUTHENTBODY, (st))
#define sk_KRB5_AUTHENTBODY_value(st, i) SKM_sk_value(KRB5_AUTHENTBODY, (st), (i))
#define sk_KRB5_AUTHENTBODY_set(st, i, val) SKM_sk_set(KRB5_AUTHENTBODY, (st), (i), (val))
#define sk_KRB5_AUTHENTBODY_zero(st) SKM_sk_zero(KRB5_AUTHENTBODY, (st))
#define sk_KRB5_AUTHENTBODY_push(st, val) SKM_sk_push(KRB5_AUTHENTBODY, (st), (val))
#define sk_KRB5_AUTHENTBODY_unshift(st, val) SKM_sk_unshift(KRB5_AUTHENTBODY, (st), (val))
#define sk_KRB5_AUTHENTBODY_find(st, val) SKM_sk_find(KRB5_AUTHENTBODY, (st), (val))
#define sk_KRB5_AUTHENTBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_AUTHENTBODY, (st), (val))
#define sk_KRB5_AUTHENTBODY_delete(st, i) SKM_sk_delete(KRB5_AUTHENTBODY, (st), (i))
#define sk_KRB5_AUTHENTBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_AUTHENTBODY, (st), (ptr))
#define sk_KRB5_AUTHENTBODY_insert(st, val, i) SKM_sk_insert(KRB5_AUTHENTBODY, (st), (val), (i))
#define sk_KRB5_AUTHENTBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_AUTHENTBODY, (st), (cmp))
#define sk_KRB5_AUTHENTBODY_dup(st) SKM_sk_dup(KRB5_AUTHENTBODY, st)
#define sk_KRB5_AUTHENTBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_AUTHENTBODY, (st), (free_func))
#define sk_KRB5_AUTHENTBODY_shift(st) SKM_sk_shift(KRB5_AUTHENTBODY, (st))
#define sk_KRB5_AUTHENTBODY_pop(st) SKM_sk_pop(KRB5_AUTHENTBODY, (st))
#define sk_KRB5_AUTHENTBODY_sort(st) SKM_sk_sort(KRB5_AUTHENTBODY, (st))
#define sk_KRB5_AUTHENTBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_AUTHENTBODY, (st))

#define sk_KRB5_CHECKSUM_new(st) SKM_sk_new(KRB5_CHECKSUM, (st))
#define sk_KRB5_CHECKSUM_new_null() SKM_sk_new_null(KRB5_CHECKSUM)
#define sk_KRB5_CHECKSUM_free(st) SKM_sk_free(KRB5_CHECKSUM, (st))
#define sk_KRB5_CHECKSUM_num(st) SKM_sk_num(KRB5_CHECKSUM, (st))
#define sk_KRB5_CHECKSUM_value(st, i) SKM_sk_value(KRB5_CHECKSUM, (st), (i))
#define sk_KRB5_CHECKSUM_set(st, i, val) SKM_sk_set(KRB5_CHECKSUM, (st), (i), (val))
#define sk_KRB5_CHECKSUM_zero(st) SKM_sk_zero(KRB5_CHECKSUM, (st))
#define sk_KRB5_CHECKSUM_push(st, val) SKM_sk_push(KRB5_CHECKSUM, (st), (val))
#define sk_KRB5_CHECKSUM_unshift(st, val) SKM_sk_unshift(KRB5_CHECKSUM, (st), (val))
#define sk_KRB5_CHECKSUM_find(st, val) SKM_sk_find(KRB5_CHECKSUM, (st), (val))
#define sk_KRB5_CHECKSUM_find_ex(st, val) SKM_sk_find_ex(KRB5_CHECKSUM, (st), (val))
#define sk_KRB5_CHECKSUM_delete(st, i) SKM_sk_delete(KRB5_CHECKSUM, (st), (i))
#define sk_KRB5_CHECKSUM_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_CHECKSUM, (st), (ptr))
#define sk_KRB5_CHECKSUM_insert(st, val, i) SKM_sk_insert(KRB5_CHECKSUM, (st), (val), (i))
#define sk_KRB5_CHECKSUM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_CHECKSUM, (st), (cmp))
#define sk_KRB5_CHECKSUM_dup(st) SKM_sk_dup(KRB5_CHECKSUM, st)
#define sk_KRB5_CHECKSUM_pop_free(st, free_func) SKM_sk_pop_free(KRB5_CHECKSUM, (st), (free_func))
#define sk_KRB5_CHECKSUM_shift(st) SKM_sk_shift(KRB5_CHECKSUM, (st))
#define sk_KRB5_CHECKSUM_pop(st) SKM_sk_pop(KRB5_CHECKSUM, (st))
#define sk_KRB5_CHECKSUM_sort(st) SKM_sk_sort(KRB5_CHECKSUM, (st))
#define sk_KRB5_CHECKSUM_is_sorted(st) SKM_sk_is_sorted(KRB5_CHECKSUM, (st))

#define sk_KRB5_ENCDATA_new(st) SKM_sk_new(KRB5_ENCDATA, (st))
#define sk_KRB5_ENCDATA_new_null() SKM_sk_new_null(KRB5_ENCDATA)
#define sk_KRB5_ENCDATA_free(st) SKM_sk_free(KRB5_ENCDATA, (st))
#define sk_KRB5_ENCDATA_num(st) SKM_sk_num(KRB5_ENCDATA, (st))
#define sk_KRB5_ENCDATA_value(st, i) SKM_sk_value(KRB5_ENCDATA, (st), (i))
#define sk_KRB5_ENCDATA_set(st, i, val) SKM_sk_set(KRB5_ENCDATA, (st), (i), (val))
#define sk_KRB5_ENCDATA_zero(st) SKM_sk_zero(KRB5_ENCDATA, (st))
#define sk_KRB5_ENCDATA_push(st, val) SKM_sk_push(KRB5_ENCDATA, (st), (val))
#define sk_KRB5_ENCDATA_unshift(st, val) SKM_sk_unshift(KRB5_ENCDATA, (st), (val))
#define sk_KRB5_ENCDATA_find(st, val) SKM_sk_find(KRB5_ENCDATA, (st), (val))
#define sk_KRB5_ENCDATA_find_ex(st, val) SKM_sk_find_ex(KRB5_ENCDATA, (st), (val))
#define sk_KRB5_ENCDATA_delete(st, i) SKM_sk_delete(KRB5_ENCDATA, (st), (i))
#define sk_KRB5_ENCDATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_ENCDATA, (st), (ptr))
#define sk_KRB5_ENCDATA_insert(st, val, i) SKM_sk_insert(KRB5_ENCDATA, (st), (val), (i))
#define sk_KRB5_ENCDATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_ENCDATA, (st), (cmp))
#define sk_KRB5_ENCDATA_dup(st) SKM_sk_dup(KRB5_ENCDATA, st)
#define sk_KRB5_ENCDATA_pop_free(st, free_func) SKM_sk_pop_free(KRB5_ENCDATA, (st), (free_func))
#define sk_KRB5_ENCDATA_shift(st) SKM_sk_shift(KRB5_ENCDATA, (st))
#define sk_KRB5_ENCDATA_pop(st) SKM_sk_pop(KRB5_ENCDATA, (st))
#define sk_KRB5_ENCDATA_sort(st) SKM_sk_sort(KRB5_ENCDATA, (st))
#define sk_KRB5_ENCDATA_is_sorted(st) SKM_sk_is_sorted(KRB5_ENCDATA, (st))

#define sk_KRB5_ENCKEY_new(st) SKM_sk_new(KRB5_ENCKEY, (st))
#define sk_KRB5_ENCKEY_new_null() SKM_sk_new_null(KRB5_ENCKEY)
#define sk_KRB5_ENCKEY_free(st) SKM_sk_free(KRB5_ENCKEY, (st))
#define sk_KRB5_ENCKEY_num(st) SKM_sk_num(KRB5_ENCKEY, (st))
#define sk_KRB5_ENCKEY_value(st, i) SKM_sk_value(KRB5_ENCKEY, (st), (i))
#define sk_KRB5_ENCKEY_set(st, i, val) SKM_sk_set(KRB5_ENCKEY, (st), (i), (val))
#define sk_KRB5_ENCKEY_zero(st) SKM_sk_zero(KRB5_ENCKEY, (st))
#define sk_KRB5_ENCKEY_push(st, val) SKM_sk_push(KRB5_ENCKEY, (st), (val))
#define sk_KRB5_ENCKEY_unshift(st, val) SKM_sk_unshift(KRB5_ENCKEY, (st), (val))
#define sk_KRB5_ENCKEY_find(st, val) SKM_sk_find(KRB5_ENCKEY, (st), (val))
#define sk_KRB5_ENCKEY_find_ex(st, val) SKM_sk_find_ex(KRB5_ENCKEY, (st), (val))
#define sk_KRB5_ENCKEY_delete(st, i) SKM_sk_delete(KRB5_ENCKEY, (st), (i))
#define sk_KRB5_ENCKEY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_ENCKEY, (st), (ptr))
#define sk_KRB5_ENCKEY_insert(st, val, i) SKM_sk_insert(KRB5_ENCKEY, (st), (val), (i))
#define sk_KRB5_ENCKEY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_ENCKEY, (st), (cmp))
#define sk_KRB5_ENCKEY_dup(st) SKM_sk_dup(KRB5_ENCKEY, st)
#define sk_KRB5_ENCKEY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_ENCKEY, (st), (free_func))
#define sk_KRB5_ENCKEY_shift(st) SKM_sk_shift(KRB5_ENCKEY, (st))
#define sk_KRB5_ENCKEY_pop(st) SKM_sk_pop(KRB5_ENCKEY, (st))
#define sk_KRB5_ENCKEY_sort(st) SKM_sk_sort(KRB5_ENCKEY, (st))
#define sk_KRB5_ENCKEY_is_sorted(st) SKM_sk_is_sorted(KRB5_ENCKEY, (st))

#define sk_KRB5_PRINCNAME_new(st) SKM_sk_new(KRB5_PRINCNAME, (st))
#define sk_KRB5_PRINCNAME_new_null() SKM_sk_new_null(KRB5_PRINCNAME)
#define sk_KRB5_PRINCNAME_free(st) SKM_sk_free(KRB5_PRINCNAME, (st))
#define sk_KRB5_PRINCNAME_num(st) SKM_sk_num(KRB5_PRINCNAME, (st))
#define sk_KRB5_PRINCNAME_value(st, i) SKM_sk_value(KRB5_PRINCNAME, (st), (i))
#define sk_KRB5_PRINCNAME_set(st, i, val) SKM_sk_set(KRB5_PRINCNAME, (st), (i), (val))
#define sk_KRB5_PRINCNAME_zero(st) SKM_sk_zero(KRB5_PRINCNAME, (st))
#define sk_KRB5_PRINCNAME_push(st, val) SKM_sk_push(KRB5_PRINCNAME, (st), (val))
#define sk_KRB5_PRINCNAME_unshift(st, val) SKM_sk_unshift(KRB5_PRINCNAME, (st), (val))
#define sk_KRB5_PRINCNAME_find(st, val) SKM_sk_find(KRB5_PRINCNAME, (st), (val))
#define sk_KRB5_PRINCNAME_find_ex(st, val) SKM_sk_find_ex(KRB5_PRINCNAME, (st), (val))
#define sk_KRB5_PRINCNAME_delete(st, i) SKM_sk_delete(KRB5_PRINCNAME, (st), (i))
#define sk_KRB5_PRINCNAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_PRINCNAME, (st), (ptr))
#define sk_KRB5_PRINCNAME_insert(st, val, i) SKM_sk_insert(KRB5_PRINCNAME, (st), (val), (i))
#define sk_KRB5_PRINCNAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_PRINCNAME, (st), (cmp))
#define sk_KRB5_PRINCNAME_dup(st) SKM_sk_dup(KRB5_PRINCNAME, st)
#define sk_KRB5_PRINCNAME_pop_free(st, free_func) SKM_sk_pop_free(KRB5_PRINCNAME, (st), (free_func))
#define sk_KRB5_PRINCNAME_shift(st) SKM_sk_shift(KRB5_PRINCNAME, (st))
#define sk_KRB5_PRINCNAME_pop(st) SKM_sk_pop(KRB5_PRINCNAME, (st))
#define sk_KRB5_PRINCNAME_sort(st) SKM_sk_sort(KRB5_PRINCNAME, (st))
#define sk_KRB5_PRINCNAME_is_sorted(st) SKM_sk_is_sorted(KRB5_PRINCNAME, (st))

#define sk_KRB5_TKTBODY_new(st) SKM_sk_new(KRB5_TKTBODY, (st))
#define sk_KRB5_TKTBODY_new_null() SKM_sk_new_null(KRB5_TKTBODY)
#define sk_KRB5_TKTBODY_free(st) SKM_sk_free(KRB5_TKTBODY, (st))
#define sk_KRB5_TKTBODY_num(st) SKM_sk_num(KRB5_TKTBODY, (st))
#define sk_KRB5_TKTBODY_value(st, i) SKM_sk_value(KRB5_TKTBODY, (st), (i))
#define sk_KRB5_TKTBODY_set(st, i, val) SKM_sk_set(KRB5_TKTBODY, (st), (i), (val))
#define sk_KRB5_TKTBODY_zero(st) SKM_sk_zero(KRB5_TKTBODY, (st))
#define sk_KRB5_TKTBODY_push(st, val) SKM_sk_push(KRB5_TKTBODY, (st), (val))
#define sk_KRB5_TKTBODY_unshift(st, val) SKM_sk_unshift(KRB5_TKTBODY, (st), (val))
#define sk_KRB5_TKTBODY_find(st, val) SKM_sk_find(KRB5_TKTBODY, (st), (val))
#define sk_KRB5_TKTBODY_find_ex(st, val) SKM_sk_find_ex(KRB5_TKTBODY, (st), (val))
#define sk_KRB5_TKTBODY_delete(st, i) SKM_sk_delete(KRB5_TKTBODY, (st), (i))
#define sk_KRB5_TKTBODY_delete_ptr(st, ptr) SKM_sk_delete_ptr(KRB5_TKTBODY, (st), (ptr))
#define sk_KRB5_TKTBODY_insert(st, val, i) SKM_sk_insert(KRB5_TKTBODY, (st), (val), (i))
#define sk_KRB5_TKTBODY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(KRB5_TKTBODY, (st), (cmp))
#define sk_KRB5_TKTBODY_dup(st) SKM_sk_dup(KRB5_TKTBODY, st)
#define sk_KRB5_TKTBODY_pop_free(st, free_func) SKM_sk_pop_free(KRB5_TKTBODY, (st), (free_func))
#define sk_KRB5_TKTBODY_shift(st) SKM_sk_shift(KRB5_TKTBODY, (st))
#define sk_KRB5_TKTBODY_pop(st) SKM_sk_pop(KRB5_TKTBODY, (st))
#define sk_KRB5_TKTBODY_sort(st) SKM_sk_sort(KRB5_TKTBODY, (st))
#define sk_KRB5_TKTBODY_is_sorted(st) SKM_sk_is_sorted(KRB5_TKTBODY, (st))

#define sk_MIME_HEADER_new(st) SKM_sk_new(MIME_HEADER, (st))
#define sk_MIME_HEADER_new_null() SKM_sk_new_null(MIME_HEADER)
#define sk_MIME_HEADER_free(st) SKM_sk_free(MIME_HEADER, (st))
#define sk_MIME_HEADER_num(st) SKM_sk_num(MIME_HEADER, (st))
#define sk_MIME_HEADER_value(st, i) SKM_sk_value(MIME_HEADER, (st), (i))
#define sk_MIME_HEADER_set(st, i, val) SKM_sk_set(MIME_HEADER, (st), (i), (val))
#define sk_MIME_HEADER_zero(st) SKM_sk_zero(MIME_HEADER, (st))
#define sk_MIME_HEADER_push(st, val) SKM_sk_push(MIME_HEADER, (st), (val))
#define sk_MIME_HEADER_unshift(st, val) SKM_sk_unshift(MIME_HEADER, (st), (val))
#define sk_MIME_HEADER_find(st, val) SKM_sk_find(MIME_HEADER, (st), (val))
#define sk_MIME_HEADER_find_ex(st, val) SKM_sk_find_ex(MIME_HEADER, (st), (val))
#define sk_MIME_HEADER_delete(st, i) SKM_sk_delete(MIME_HEADER, (st), (i))
#define sk_MIME_HEADER_delete_ptr(st, ptr) SKM_sk_delete_ptr(MIME_HEADER, (st), (ptr))
#define sk_MIME_HEADER_insert(st, val, i) SKM_sk_insert(MIME_HEADER, (st), (val), (i))
#define sk_MIME_HEADER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MIME_HEADER, (st), (cmp))
#define sk_MIME_HEADER_dup(st) SKM_sk_dup(MIME_HEADER, st)
#define sk_MIME_HEADER_pop_free(st, free_func) SKM_sk_pop_free(MIME_HEADER, (st), (free_func))
#define sk_MIME_HEADER_shift(st) SKM_sk_shift(MIME_HEADER, (st))
#define sk_MIME_HEADER_pop(st) SKM_sk_pop(MIME_HEADER, (st))
#define sk_MIME_HEADER_sort(st) SKM_sk_sort(MIME_HEADER, (st))
#define sk_MIME_HEADER_is_sorted(st) SKM_sk_is_sorted(MIME_HEADER, (st))

#define sk_MIME_HEADER_new(st) SKM_sk_new(MIME_HEADER, (st))
#define sk_MIME_HEADER_new_null() SKM_sk_new_null(MIME_HEADER)
#define sk_MIME_HEADER_free(st) SKM_sk_free(MIME_HEADER, (st))
#define sk_MIME_HEADER_num(st) SKM_sk_num(MIME_HEADER, (st))
#define sk_MIME_HEADER_value(st, i) SKM_sk_value(MIME_HEADER, (st), (i))
#define sk_MIME_HEADER_set(st, i, val) SKM_sk_set(MIME_HEADER, (st), (i), (val))
#define sk_MIME_HEADER_zero(st) SKM_sk_zero(MIME_HEADER, (st))
#define sk_MIME_HEADER_push(st, val) SKM_sk_push(MIME_HEADER, (st), (val))
#define sk_MIME_HEADER_unshift(st, val) SKM_sk_unshift(MIME_HEADER, (st), (val))
#define sk_MIME_HEADER_find(st, val) SKM_sk_find(MIME_HEADER, (st), (val))
#define sk_MIME_HEADER_find_ex(st, val) SKM_sk_find_ex(MIME_HEADER, (st), (val))
#define sk_MIME_HEADER_delete(st, i) SKM_sk_delete(MIME_HEADER, (st), (i))
#define sk_MIME_HEADER_delete_ptr(st, ptr) SKM_sk_delete_ptr(MIME_HEADER, (st), (ptr))
#define sk_MIME_HEADER_insert(st, val, i) SKM_sk_insert(MIME_HEADER, (st), (val), (i))
#define sk_MIME_HEADER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MIME_HEADER, (st), (cmp))
#define sk_MIME_HEADER_dup(st) SKM_sk_dup(MIME_HEADER, st)
#define sk_MIME_HEADER_pop_free(st, free_func) SKM_sk_pop_free(MIME_HEADER, (st), (free_func))
#define sk_MIME_HEADER_shift(st) SKM_sk_shift(MIME_HEADER, (st))
#define sk_MIME_HEADER_pop(st) SKM_sk_pop(MIME_HEADER, (st))
#define sk_MIME_HEADER_sort(st) SKM_sk_sort(MIME_HEADER, (st))
#define sk_MIME_HEADER_is_sorted(st) SKM_sk_is_sorted(MIME_HEADER, (st))

#define sk_MIME_PARAM_new(st) SKM_sk_new(MIME_PARAM, (st))
#define sk_MIME_PARAM_new_null() SKM_sk_new_null(MIME_PARAM)
#define sk_MIME_PARAM_free(st) SKM_sk_free(MIME_PARAM, (st))
#define sk_MIME_PARAM_num(st) SKM_sk_num(MIME_PARAM, (st))
#define sk_MIME_PARAM_value(st, i) SKM_sk_value(MIME_PARAM, (st), (i))
#define sk_MIME_PARAM_set(st, i, val) SKM_sk_set(MIME_PARAM, (st), (i), (val))
#define sk_MIME_PARAM_zero(st) SKM_sk_zero(MIME_PARAM, (st))
#define sk_MIME_PARAM_push(st, val) SKM_sk_push(MIME_PARAM, (st), (val))
#define sk_MIME_PARAM_unshift(st, val) SKM_sk_unshift(MIME_PARAM, (st), (val))
#define sk_MIME_PARAM_find(st, val) SKM_sk_find(MIME_PARAM, (st), (val))
#define sk_MIME_PARAM_find_ex(st, val) SKM_sk_find_ex(MIME_PARAM, (st), (val))
#define sk_MIME_PARAM_delete(st, i) SKM_sk_delete(MIME_PARAM, (st), (i))
#define sk_MIME_PARAM_delete_ptr(st, ptr) SKM_sk_delete_ptr(MIME_PARAM, (st), (ptr))
#define sk_MIME_PARAM_insert(st, val, i) SKM_sk_insert(MIME_PARAM, (st), (val), (i))
#define sk_MIME_PARAM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MIME_PARAM, (st), (cmp))
#define sk_MIME_PARAM_dup(st) SKM_sk_dup(MIME_PARAM, st)
#define sk_MIME_PARAM_pop_free(st, free_func) SKM_sk_pop_free(MIME_PARAM, (st), (free_func))
#define sk_MIME_PARAM_shift(st) SKM_sk_shift(MIME_PARAM, (st))
#define sk_MIME_PARAM_pop(st) SKM_sk_pop(MIME_PARAM, (st))
#define sk_MIME_PARAM_sort(st) SKM_sk_sort(MIME_PARAM, (st))
#define sk_MIME_PARAM_is_sorted(st) SKM_sk_is_sorted(MIME_PARAM, (st))

#define sk_MIME_PARAM_new(st) SKM_sk_new(MIME_PARAM, (st))
#define sk_MIME_PARAM_new_null() SKM_sk_new_null(MIME_PARAM)
#define sk_MIME_PARAM_free(st) SKM_sk_free(MIME_PARAM, (st))
#define sk_MIME_PARAM_num(st) SKM_sk_num(MIME_PARAM, (st))
#define sk_MIME_PARAM_value(st, i) SKM_sk_value(MIME_PARAM, (st), (i))
#define sk_MIME_PARAM_set(st, i, val) SKM_sk_set(MIME_PARAM, (st), (i), (val))
#define sk_MIME_PARAM_zero(st) SKM_sk_zero(MIME_PARAM, (st))
#define sk_MIME_PARAM_push(st, val) SKM_sk_push(MIME_PARAM, (st), (val))
#define sk_MIME_PARAM_unshift(st, val) SKM_sk_unshift(MIME_PARAM, (st), (val))
#define sk_MIME_PARAM_find(st, val) SKM_sk_find(MIME_PARAM, (st), (val))
#define sk_MIME_PARAM_find_ex(st, val) SKM_sk_find_ex(MIME_PARAM, (st), (val))
#define sk_MIME_PARAM_delete(st, i) SKM_sk_delete(MIME_PARAM, (st), (i))
#define sk_MIME_PARAM_delete_ptr(st, ptr) SKM_sk_delete_ptr(MIME_PARAM, (st), (ptr))
#define sk_MIME_PARAM_insert(st, val, i) SKM_sk_insert(MIME_PARAM, (st), (val), (i))
#define sk_MIME_PARAM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(MIME_PARAM, (st), (cmp))
#define sk_MIME_PARAM_dup(st) SKM_sk_dup(MIME_PARAM, st)
#define sk_MIME_PARAM_pop_free(st, free_func) SKM_sk_pop_free(MIME_PARAM, (st), (free_func))
#define sk_MIME_PARAM_shift(st) SKM_sk_shift(MIME_PARAM, (st))
#define sk_MIME_PARAM_pop(st) SKM_sk_pop(MIME_PARAM, (st))
#define sk_MIME_PARAM_sort(st) SKM_sk_sort(MIME_PARAM, (st))
#define sk_MIME_PARAM_is_sorted(st) SKM_sk_is_sorted(MIME_PARAM, (st))

#define sk_NAME_FUNCS_new(st) SKM_sk_new(NAME_FUNCS, (st))
#define sk_NAME_FUNCS_new_null() SKM_sk_new_null(NAME_FUNCS)
#define sk_NAME_FUNCS_free(st) SKM_sk_free(NAME_FUNCS, (st))
#define sk_NAME_FUNCS_num(st) SKM_sk_num(NAME_FUNCS, (st))
#define sk_NAME_FUNCS_value(st, i) SKM_sk_value(NAME_FUNCS, (st), (i))
#define sk_NAME_FUNCS_set(st, i, val) SKM_sk_set(NAME_FUNCS, (st), (i), (val))
#define sk_NAME_FUNCS_zero(st) SKM_sk_zero(NAME_FUNCS, (st))
#define sk_NAME_FUNCS_push(st, val) SKM_sk_push(NAME_FUNCS, (st), (val))
#define sk_NAME_FUNCS_unshift(st, val) SKM_sk_unshift(NAME_FUNCS, (st), (val))
#define sk_NAME_FUNCS_find(st, val) SKM_sk_find(NAME_FUNCS, (st), (val))
#define sk_NAME_FUNCS_find_ex(st, val) SKM_sk_find_ex(NAME_FUNCS, (st), (val))
#define sk_NAME_FUNCS_delete(st, i) SKM_sk_delete(NAME_FUNCS, (st), (i))
#define sk_NAME_FUNCS_delete_ptr(st, ptr) SKM_sk_delete_ptr(NAME_FUNCS, (st), (ptr))
#define sk_NAME_FUNCS_insert(st, val, i) SKM_sk_insert(NAME_FUNCS, (st), (val), (i))
#define sk_NAME_FUNCS_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(NAME_FUNCS, (st), (cmp))
#define sk_NAME_FUNCS_dup(st) SKM_sk_dup(NAME_FUNCS, st)
#define sk_NAME_FUNCS_pop_free(st, free_func) SKM_sk_pop_free(NAME_FUNCS, (st), (free_func))
#define sk_NAME_FUNCS_shift(st) SKM_sk_shift(NAME_FUNCS, (st))
#define sk_NAME_FUNCS_pop(st) SKM_sk_pop(NAME_FUNCS, (st))
#define sk_NAME_FUNCS_sort(st) SKM_sk_sort(NAME_FUNCS, (st))
#define sk_NAME_FUNCS_is_sorted(st) SKM_sk_is_sorted(NAME_FUNCS, (st))

#define sk_OCSP_CERTID_new(st) SKM_sk_new(OCSP_CERTID, (st))
#define sk_OCSP_CERTID_new_null() SKM_sk_new_null(OCSP_CERTID)
#define sk_OCSP_CERTID_free(st) SKM_sk_free(OCSP_CERTID, (st))
#define sk_OCSP_CERTID_num(st) SKM_sk_num(OCSP_CERTID, (st))
#define sk_OCSP_CERTID_value(st, i) SKM_sk_value(OCSP_CERTID, (st), (i))
#define sk_OCSP_CERTID_set(st, i, val) SKM_sk_set(OCSP_CERTID, (st), (i), (val))
#define sk_OCSP_CERTID_zero(st) SKM_sk_zero(OCSP_CERTID, (st))
#define sk_OCSP_CERTID_push(st, val) SKM_sk_push(OCSP_CERTID, (st), (val))
#define sk_OCSP_CERTID_unshift(st, val) SKM_sk_unshift(OCSP_CERTID, (st), (val))
#define sk_OCSP_CERTID_find(st, val) SKM_sk_find(OCSP_CERTID, (st), (val))
#define sk_OCSP_CERTID_find_ex(st, val) SKM_sk_find_ex(OCSP_CERTID, (st), (val))
#define sk_OCSP_CERTID_delete(st, i) SKM_sk_delete(OCSP_CERTID, (st), (i))
#define sk_OCSP_CERTID_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_CERTID, (st), (ptr))
#define sk_OCSP_CERTID_insert(st, val, i) SKM_sk_insert(OCSP_CERTID, (st), (val), (i))
#define sk_OCSP_CERTID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_CERTID, (st), (cmp))
#define sk_OCSP_CERTID_dup(st) SKM_sk_dup(OCSP_CERTID, st)
#define sk_OCSP_CERTID_pop_free(st, free_func) SKM_sk_pop_free(OCSP_CERTID, (st), (free_func))
#define sk_OCSP_CERTID_shift(st) SKM_sk_shift(OCSP_CERTID, (st))
#define sk_OCSP_CERTID_pop(st) SKM_sk_pop(OCSP_CERTID, (st))
#define sk_OCSP_CERTID_sort(st) SKM_sk_sort(OCSP_CERTID, (st))
#define sk_OCSP_CERTID_is_sorted(st) SKM_sk_is_sorted(OCSP_CERTID, (st))

#define sk_OCSP_ONEREQ_new(st) SKM_sk_new(OCSP_ONEREQ, (st))
#define sk_OCSP_ONEREQ_new_null() SKM_sk_new_null(OCSP_ONEREQ)
#define sk_OCSP_ONEREQ_free(st) SKM_sk_free(OCSP_ONEREQ, (st))
#define sk_OCSP_ONEREQ_num(st) SKM_sk_num(OCSP_ONEREQ, (st))
#define sk_OCSP_ONEREQ_value(st, i) SKM_sk_value(OCSP_ONEREQ, (st), (i))
#define sk_OCSP_ONEREQ_set(st, i, val) SKM_sk_set(OCSP_ONEREQ, (st), (i), (val))
#define sk_OCSP_ONEREQ_zero(st) SKM_sk_zero(OCSP_ONEREQ, (st))
#define sk_OCSP_ONEREQ_push(st, val) SKM_sk_push(OCSP_ONEREQ, (st), (val))
#define sk_OCSP_ONEREQ_unshift(st, val) SKM_sk_unshift(OCSP_ONEREQ, (st), (val))
#define sk_OCSP_ONEREQ_find(st, val) SKM_sk_find(OCSP_ONEREQ, (st), (val))
#define sk_OCSP_ONEREQ_find_ex(st, val) SKM_sk_find_ex(OCSP_ONEREQ, (st), (val))
#define sk_OCSP_ONEREQ_delete(st, i) SKM_sk_delete(OCSP_ONEREQ, (st), (i))
#define sk_OCSP_ONEREQ_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_ONEREQ, (st), (ptr))
#define sk_OCSP_ONEREQ_insert(st, val, i) SKM_sk_insert(OCSP_ONEREQ, (st), (val), (i))
#define sk_OCSP_ONEREQ_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_ONEREQ, (st), (cmp))
#define sk_OCSP_ONEREQ_dup(st) SKM_sk_dup(OCSP_ONEREQ, st)
#define sk_OCSP_ONEREQ_pop_free(st, free_func) SKM_sk_pop_free(OCSP_ONEREQ, (st), (free_func))
#define sk_OCSP_ONEREQ_shift(st) SKM_sk_shift(OCSP_ONEREQ, (st))
#define sk_OCSP_ONEREQ_pop(st) SKM_sk_pop(OCSP_ONEREQ, (st))
#define sk_OCSP_ONEREQ_sort(st) SKM_sk_sort(OCSP_ONEREQ, (st))
#define sk_OCSP_ONEREQ_is_sorted(st) SKM_sk_is_sorted(OCSP_ONEREQ, (st))

#define sk_OCSP_RESPID_new(st) SKM_sk_new(OCSP_RESPID, (st))
#define sk_OCSP_RESPID_new_null() SKM_sk_new_null(OCSP_RESPID)
#define sk_OCSP_RESPID_free(st) SKM_sk_free(OCSP_RESPID, (st))
#define sk_OCSP_RESPID_num(st) SKM_sk_num(OCSP_RESPID, (st))
#define sk_OCSP_RESPID_value(st, i) SKM_sk_value(OCSP_RESPID, (st), (i))
#define sk_OCSP_RESPID_set(st, i, val) SKM_sk_set(OCSP_RESPID, (st), (i), (val))
#define sk_OCSP_RESPID_zero(st) SKM_sk_zero(OCSP_RESPID, (st))
#define sk_OCSP_RESPID_push(st, val) SKM_sk_push(OCSP_RESPID, (st), (val))
#define sk_OCSP_RESPID_unshift(st, val) SKM_sk_unshift(OCSP_RESPID, (st), (val))
#define sk_OCSP_RESPID_find(st, val) SKM_sk_find(OCSP_RESPID, (st), (val))
#define sk_OCSP_RESPID_find_ex(st, val) SKM_sk_find_ex(OCSP_RESPID, (st), (val))
#define sk_OCSP_RESPID_delete(st, i) SKM_sk_delete(OCSP_RESPID, (st), (i))
#define sk_OCSP_RESPID_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_RESPID, (st), (ptr))
#define sk_OCSP_RESPID_insert(st, val, i) SKM_sk_insert(OCSP_RESPID, (st), (val), (i))
#define sk_OCSP_RESPID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_RESPID, (st), (cmp))
#define sk_OCSP_RESPID_dup(st) SKM_sk_dup(OCSP_RESPID, st)
#define sk_OCSP_RESPID_pop_free(st, free_func) SKM_sk_pop_free(OCSP_RESPID, (st), (free_func))
#define sk_OCSP_RESPID_shift(st) SKM_sk_shift(OCSP_RESPID, (st))
#define sk_OCSP_RESPID_pop(st) SKM_sk_pop(OCSP_RESPID, (st))
#define sk_OCSP_RESPID_sort(st) SKM_sk_sort(OCSP_RESPID, (st))
#define sk_OCSP_RESPID_is_sorted(st) SKM_sk_is_sorted(OCSP_RESPID, (st))

#define sk_OCSP_SINGLERESP_new(st) SKM_sk_new(OCSP_SINGLERESP, (st))
#define sk_OCSP_SINGLERESP_new_null() SKM_sk_new_null(OCSP_SINGLERESP)
#define sk_OCSP_SINGLERESP_free(st) SKM_sk_free(OCSP_SINGLERESP, (st))
#define sk_OCSP_SINGLERESP_num(st) SKM_sk_num(OCSP_SINGLERESP, (st))
#define sk_OCSP_SINGLERESP_value(st, i) SKM_sk_value(OCSP_SINGLERESP, (st), (i))
#define sk_OCSP_SINGLERESP_set(st, i, val) SKM_sk_set(OCSP_SINGLERESP, (st), (i), (val))
#define sk_OCSP_SINGLERESP_zero(st) SKM_sk_zero(OCSP_SINGLERESP, (st))
#define sk_OCSP_SINGLERESP_push(st, val) SKM_sk_push(OCSP_SINGLERESP, (st), (val))
#define sk_OCSP_SINGLERESP_unshift(st, val) SKM_sk_unshift(OCSP_SINGLERESP, (st), (val))
#define sk_OCSP_SINGLERESP_find(st, val) SKM_sk_find(OCSP_SINGLERESP, (st), (val))
#define sk_OCSP_SINGLERESP_find_ex(st, val) SKM_sk_find_ex(OCSP_SINGLERESP, (st), (val))
#define sk_OCSP_SINGLERESP_delete(st, i) SKM_sk_delete(OCSP_SINGLERESP, (st), (i))
#define sk_OCSP_SINGLERESP_delete_ptr(st, ptr) SKM_sk_delete_ptr(OCSP_SINGLERESP, (st), (ptr))
#define sk_OCSP_SINGLERESP_insert(st, val, i) SKM_sk_insert(OCSP_SINGLERESP, (st), (val), (i))
#define sk_OCSP_SINGLERESP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(OCSP_SINGLERESP, (st), (cmp))
#define sk_OCSP_SINGLERESP_dup(st) SKM_sk_dup(OCSP_SINGLERESP, st)
#define sk_OCSP_SINGLERESP_pop_free(st, free_func) SKM_sk_pop_free(OCSP_SINGLERESP, (st), (free_func))
#define sk_OCSP_SINGLERESP_shift(st) SKM_sk_shift(OCSP_SINGLERESP, (st))
#define sk_OCSP_SINGLERESP_pop(st) SKM_sk_pop(OCSP_SINGLERESP, (st))
#define sk_OCSP_SINGLERESP_sort(st) SKM_sk_sort(OCSP_SINGLERESP, (st))
#define sk_OCSP_SINGLERESP_is_sorted(st) SKM_sk_is_sorted(OCSP_SINGLERESP, (st))

#define sk_PKCS12_SAFEBAG_new(st) SKM_sk_new(PKCS12_SAFEBAG, (st))
#define sk_PKCS12_SAFEBAG_new_null() SKM_sk_new_null(PKCS12_SAFEBAG)
#define sk_PKCS12_SAFEBAG_free(st) SKM_sk_free(PKCS12_SAFEBAG, (st))
#define sk_PKCS12_SAFEBAG_num(st) SKM_sk_num(PKCS12_SAFEBAG, (st))
#define sk_PKCS12_SAFEBAG_value(st, i) SKM_sk_value(PKCS12_SAFEBAG, (st), (i))
#define sk_PKCS12_SAFEBAG_set(st, i, val) SKM_sk_set(PKCS12_SAFEBAG, (st), (i), (val))
#define sk_PKCS12_SAFEBAG_zero(st) SKM_sk_zero(PKCS12_SAFEBAG, (st))
#define sk_PKCS12_SAFEBAG_push(st, val) SKM_sk_push(PKCS12_SAFEBAG, (st), (val))
#define sk_PKCS12_SAFEBAG_unshift(st, val) SKM_sk_unshift(PKCS12_SAFEBAG, (st), (val))
#define sk_PKCS12_SAFEBAG_find(st, val) SKM_sk_find(PKCS12_SAFEBAG, (st), (val))
#define sk_PKCS12_SAFEBAG_find_ex(st, val) SKM_sk_find_ex(PKCS12_SAFEBAG, (st), (val))
#define sk_PKCS12_SAFEBAG_delete(st, i) SKM_sk_delete(PKCS12_SAFEBAG, (st), (i))
#define sk_PKCS12_SAFEBAG_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS12_SAFEBAG, (st), (ptr))
#define sk_PKCS12_SAFEBAG_insert(st, val, i) SKM_sk_insert(PKCS12_SAFEBAG, (st), (val), (i))
#define sk_PKCS12_SAFEBAG_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS12_SAFEBAG, (st), (cmp))
#define sk_PKCS12_SAFEBAG_dup(st) SKM_sk_dup(PKCS12_SAFEBAG, st)
#define sk_PKCS12_SAFEBAG_pop_free(st, free_func) SKM_sk_pop_free(PKCS12_SAFEBAG, (st), (free_func))
#define sk_PKCS12_SAFEBAG_shift(st) SKM_sk_shift(PKCS12_SAFEBAG, (st))
#define sk_PKCS12_SAFEBAG_pop(st) SKM_sk_pop(PKCS12_SAFEBAG, (st))
#define sk_PKCS12_SAFEBAG_sort(st) SKM_sk_sort(PKCS12_SAFEBAG, (st))
#define sk_PKCS12_SAFEBAG_is_sorted(st) SKM_sk_is_sorted(PKCS12_SAFEBAG, (st))

#define sk_PKCS7_new(st) SKM_sk_new(PKCS7, (st))
#define sk_PKCS7_new_null() SKM_sk_new_null(PKCS7)
#define sk_PKCS7_free(st) SKM_sk_free(PKCS7, (st))
#define sk_PKCS7_num(st) SKM_sk_num(PKCS7, (st))
#define sk_PKCS7_value(st, i) SKM_sk_value(PKCS7, (st), (i))
#define sk_PKCS7_set(st, i, val) SKM_sk_set(PKCS7, (st), (i), (val))
#define sk_PKCS7_zero(st) SKM_sk_zero(PKCS7, (st))
#define sk_PKCS7_push(st, val) SKM_sk_push(PKCS7, (st), (val))
#define sk_PKCS7_unshift(st, val) SKM_sk_unshift(PKCS7, (st), (val))
#define sk_PKCS7_find(st, val) SKM_sk_find(PKCS7, (st), (val))
#define sk_PKCS7_find_ex(st, val) SKM_sk_find_ex(PKCS7, (st), (val))
#define sk_PKCS7_delete(st, i) SKM_sk_delete(PKCS7, (st), (i))
#define sk_PKCS7_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7, (st), (ptr))
#define sk_PKCS7_insert(st, val, i) SKM_sk_insert(PKCS7, (st), (val), (i))
#define sk_PKCS7_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7, (st), (cmp))
#define sk_PKCS7_dup(st) SKM_sk_dup(PKCS7, st)
#define sk_PKCS7_pop_free(st, free_func) SKM_sk_pop_free(PKCS7, (st), (free_func))
#define sk_PKCS7_shift(st) SKM_sk_shift(PKCS7, (st))
#define sk_PKCS7_pop(st) SKM_sk_pop(PKCS7, (st))
#define sk_PKCS7_sort(st) SKM_sk_sort(PKCS7, (st))
#define sk_PKCS7_is_sorted(st) SKM_sk_is_sorted(PKCS7, (st))

#define sk_PKCS7_RECIP_INFO_new(st) SKM_sk_new(PKCS7_RECIP_INFO, (st))
#define sk_PKCS7_RECIP_INFO_new_null() SKM_sk_new_null(PKCS7_RECIP_INFO)
#define sk_PKCS7_RECIP_INFO_free(st) SKM_sk_free(PKCS7_RECIP_INFO, (st))
#define sk_PKCS7_RECIP_INFO_num(st) SKM_sk_num(PKCS7_RECIP_INFO, (st))
#define sk_PKCS7_RECIP_INFO_value(st, i) SKM_sk_value(PKCS7_RECIP_INFO, (st), (i))
#define sk_PKCS7_RECIP_INFO_set(st, i, val) SKM_sk_set(PKCS7_RECIP_INFO, (st), (i), (val))
#define sk_PKCS7_RECIP_INFO_zero(st) SKM_sk_zero(PKCS7_RECIP_INFO, (st))
#define sk_PKCS7_RECIP_INFO_push(st, val) SKM_sk_push(PKCS7_RECIP_INFO, (st), (val))
#define sk_PKCS7_RECIP_INFO_unshift(st, val) SKM_sk_unshift(PKCS7_RECIP_INFO, (st), (val))
#define sk_PKCS7_RECIP_INFO_find(st, val) SKM_sk_find(PKCS7_RECIP_INFO, (st), (val))
#define sk_PKCS7_RECIP_INFO_find_ex(st, val) SKM_sk_find_ex(PKCS7_RECIP_INFO, (st), (val))
#define sk_PKCS7_RECIP_INFO_delete(st, i) SKM_sk_delete(PKCS7_RECIP_INFO, (st), (i))
#define sk_PKCS7_RECIP_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7_RECIP_INFO, (st), (ptr))
#define sk_PKCS7_RECIP_INFO_insert(st, val, i) SKM_sk_insert(PKCS7_RECIP_INFO, (st), (val), (i))
#define sk_PKCS7_RECIP_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7_RECIP_INFO, (st), (cmp))
#define sk_PKCS7_RECIP_INFO_dup(st) SKM_sk_dup(PKCS7_RECIP_INFO, st)
#define sk_PKCS7_RECIP_INFO_pop_free(st, free_func) SKM_sk_pop_free(PKCS7_RECIP_INFO, (st), (free_func))
#define sk_PKCS7_RECIP_INFO_shift(st) SKM_sk_shift(PKCS7_RECIP_INFO, (st))
#define sk_PKCS7_RECIP_INFO_pop(st) SKM_sk_pop(PKCS7_RECIP_INFO, (st))
#define sk_PKCS7_RECIP_INFO_sort(st) SKM_sk_sort(PKCS7_RECIP_INFO, (st))
#define sk_PKCS7_RECIP_INFO_is_sorted(st) SKM_sk_is_sorted(PKCS7_RECIP_INFO, (st))

#define sk_PKCS7_SIGNER_INFO_new(st) SKM_sk_new(PKCS7_SIGNER_INFO, (st))
#define sk_PKCS7_SIGNER_INFO_new_null() SKM_sk_new_null(PKCS7_SIGNER_INFO)
#define sk_PKCS7_SIGNER_INFO_free(st) SKM_sk_free(PKCS7_SIGNER_INFO, (st))
#define sk_PKCS7_SIGNER_INFO_num(st) SKM_sk_num(PKCS7_SIGNER_INFO, (st))
#define sk_PKCS7_SIGNER_INFO_value(st, i) SKM_sk_value(PKCS7_SIGNER_INFO, (st), (i))
#define sk_PKCS7_SIGNER_INFO_set(st, i, val) SKM_sk_set(PKCS7_SIGNER_INFO, (st), (i), (val))
#define sk_PKCS7_SIGNER_INFO_zero(st) SKM_sk_zero(PKCS7_SIGNER_INFO, (st))
#define sk_PKCS7_SIGNER_INFO_push(st, val) SKM_sk_push(PKCS7_SIGNER_INFO, (st), (val))
#define sk_PKCS7_SIGNER_INFO_unshift(st, val) SKM_sk_unshift(PKCS7_SIGNER_INFO, (st), (val))
#define sk_PKCS7_SIGNER_INFO_find(st, val) SKM_sk_find(PKCS7_SIGNER_INFO, (st), (val))
#define sk_PKCS7_SIGNER_INFO_find_ex(st, val) SKM_sk_find_ex(PKCS7_SIGNER_INFO, (st), (val))
#define sk_PKCS7_SIGNER_INFO_delete(st, i) SKM_sk_delete(PKCS7_SIGNER_INFO, (st), (i))
#define sk_PKCS7_SIGNER_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(PKCS7_SIGNER_INFO, (st), (ptr))
#define sk_PKCS7_SIGNER_INFO_insert(st, val, i) SKM_sk_insert(PKCS7_SIGNER_INFO, (st), (val), (i))
#define sk_PKCS7_SIGNER_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(PKCS7_SIGNER_INFO, (st), (cmp))
#define sk_PKCS7_SIGNER_INFO_dup(st) SKM_sk_dup(PKCS7_SIGNER_INFO, st)
#define sk_PKCS7_SIGNER_INFO_pop_free(st, free_func) SKM_sk_pop_free(PKCS7_SIGNER_INFO, (st), (free_func))
#define sk_PKCS7_SIGNER_INFO_shift(st) SKM_sk_shift(PKCS7_SIGNER_INFO, (st))
#define sk_PKCS7_SIGNER_INFO_pop(st) SKM_sk_pop(PKCS7_SIGNER_INFO, (st))
#define sk_PKCS7_SIGNER_INFO_sort(st) SKM_sk_sort(PKCS7_SIGNER_INFO, (st))
#define sk_PKCS7_SIGNER_INFO_is_sorted(st) SKM_sk_is_sorted(PKCS7_SIGNER_INFO, (st))

#define sk_POLICYINFO_new(st) SKM_sk_new(POLICYINFO, (st))
#define sk_POLICYINFO_new_null() SKM_sk_new_null(POLICYINFO)
#define sk_POLICYINFO_free(st) SKM_sk_free(POLICYINFO, (st))
#define sk_POLICYINFO_num(st) SKM_sk_num(POLICYINFO, (st))
#define sk_POLICYINFO_value(st, i) SKM_sk_value(POLICYINFO, (st), (i))
#define sk_POLICYINFO_set(st, i, val) SKM_sk_set(POLICYINFO, (st), (i), (val))
#define sk_POLICYINFO_zero(st) SKM_sk_zero(POLICYINFO, (st))
#define sk_POLICYINFO_push(st, val) SKM_sk_push(POLICYINFO, (st), (val))
#define sk_POLICYINFO_unshift(st, val) SKM_sk_unshift(POLICYINFO, (st), (val))
#define sk_POLICYINFO_find(st, val) SKM_sk_find(POLICYINFO, (st), (val))
#define sk_POLICYINFO_find_ex(st, val) SKM_sk_find_ex(POLICYINFO, (st), (val))
#define sk_POLICYINFO_delete(st, i) SKM_sk_delete(POLICYINFO, (st), (i))
#define sk_POLICYINFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICYINFO, (st), (ptr))
#define sk_POLICYINFO_insert(st, val, i) SKM_sk_insert(POLICYINFO, (st), (val), (i))
#define sk_POLICYINFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICYINFO, (st), (cmp))
#define sk_POLICYINFO_dup(st) SKM_sk_dup(POLICYINFO, st)
#define sk_POLICYINFO_pop_free(st, free_func) SKM_sk_pop_free(POLICYINFO, (st), (free_func))
#define sk_POLICYINFO_shift(st) SKM_sk_shift(POLICYINFO, (st))
#define sk_POLICYINFO_pop(st) SKM_sk_pop(POLICYINFO, (st))
#define sk_POLICYINFO_sort(st) SKM_sk_sort(POLICYINFO, (st))
#define sk_POLICYINFO_is_sorted(st) SKM_sk_is_sorted(POLICYINFO, (st))

#define sk_POLICYQUALINFO_new(st) SKM_sk_new(POLICYQUALINFO, (st))
#define sk_POLICYQUALINFO_new_null() SKM_sk_new_null(POLICYQUALINFO)
#define sk_POLICYQUALINFO_free(st) SKM_sk_free(POLICYQUALINFO, (st))
#define sk_POLICYQUALINFO_num(st) SKM_sk_num(POLICYQUALINFO, (st))
#define sk_POLICYQUALINFO_value(st, i) SKM_sk_value(POLICYQUALINFO, (st), (i))
#define sk_POLICYQUALINFO_set(st, i, val) SKM_sk_set(POLICYQUALINFO, (st), (i), (val))
#define sk_POLICYQUALINFO_zero(st) SKM_sk_zero(POLICYQUALINFO, (st))
#define sk_POLICYQUALINFO_push(st, val) SKM_sk_push(POLICYQUALINFO, (st), (val))
#define sk_POLICYQUALINFO_unshift(st, val) SKM_sk_unshift(POLICYQUALINFO, (st), (val))
#define sk_POLICYQUALINFO_find(st, val) SKM_sk_find(POLICYQUALINFO, (st), (val))
#define sk_POLICYQUALINFO_find_ex(st, val) SKM_sk_find_ex(POLICYQUALINFO, (st), (val))
#define sk_POLICYQUALINFO_delete(st, i) SKM_sk_delete(POLICYQUALINFO, (st), (i))
#define sk_POLICYQUALINFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICYQUALINFO, (st), (ptr))
#define sk_POLICYQUALINFO_insert(st, val, i) SKM_sk_insert(POLICYQUALINFO, (st), (val), (i))
#define sk_POLICYQUALINFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICYQUALINFO, (st), (cmp))
#define sk_POLICYQUALINFO_dup(st) SKM_sk_dup(POLICYQUALINFO, st)
#define sk_POLICYQUALINFO_pop_free(st, free_func) SKM_sk_pop_free(POLICYQUALINFO, (st), (free_func))
#define sk_POLICYQUALINFO_shift(st) SKM_sk_shift(POLICYQUALINFO, (st))
#define sk_POLICYQUALINFO_pop(st) SKM_sk_pop(POLICYQUALINFO, (st))
#define sk_POLICYQUALINFO_sort(st) SKM_sk_sort(POLICYQUALINFO, (st))
#define sk_POLICYQUALINFO_is_sorted(st) SKM_sk_is_sorted(POLICYQUALINFO, (st))

#define sk_POLICY_MAPPING_new(st) SKM_sk_new(POLICY_MAPPING, (st))
#define sk_POLICY_MAPPING_new_null() SKM_sk_new_null(POLICY_MAPPING)
#define sk_POLICY_MAPPING_free(st) SKM_sk_free(POLICY_MAPPING, (st))
#define sk_POLICY_MAPPING_num(st) SKM_sk_num(POLICY_MAPPING, (st))
#define sk_POLICY_MAPPING_value(st, i) SKM_sk_value(POLICY_MAPPING, (st), (i))
#define sk_POLICY_MAPPING_set(st, i, val) SKM_sk_set(POLICY_MAPPING, (st), (i), (val))
#define sk_POLICY_MAPPING_zero(st) SKM_sk_zero(POLICY_MAPPING, (st))
#define sk_POLICY_MAPPING_push(st, val) SKM_sk_push(POLICY_MAPPING, (st), (val))
#define sk_POLICY_MAPPING_unshift(st, val) SKM_sk_unshift(POLICY_MAPPING, (st), (val))
#define sk_POLICY_MAPPING_find(st, val) SKM_sk_find(POLICY_MAPPING, (st), (val))
#define sk_POLICY_MAPPING_find_ex(st, val) SKM_sk_find_ex(POLICY_MAPPING, (st), (val))
#define sk_POLICY_MAPPING_delete(st, i) SKM_sk_delete(POLICY_MAPPING, (st), (i))
#define sk_POLICY_MAPPING_delete_ptr(st, ptr) SKM_sk_delete_ptr(POLICY_MAPPING, (st), (ptr))
#define sk_POLICY_MAPPING_insert(st, val, i) SKM_sk_insert(POLICY_MAPPING, (st), (val), (i))
#define sk_POLICY_MAPPING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(POLICY_MAPPING, (st), (cmp))
#define sk_POLICY_MAPPING_dup(st) SKM_sk_dup(POLICY_MAPPING, st)
#define sk_POLICY_MAPPING_pop_free(st, free_func) SKM_sk_pop_free(POLICY_MAPPING, (st), (free_func))
#define sk_POLICY_MAPPING_shift(st) SKM_sk_shift(POLICY_MAPPING, (st))
#define sk_POLICY_MAPPING_pop(st) SKM_sk_pop(POLICY_MAPPING, (st))
#define sk_POLICY_MAPPING_sort(st) SKM_sk_sort(POLICY_MAPPING, (st))
#define sk_POLICY_MAPPING_is_sorted(st) SKM_sk_is_sorted(POLICY_MAPPING, (st))

#define sk_SSL_CIPHER_new(st) SKM_sk_new(SSL_CIPHER, (st))
#define sk_SSL_CIPHER_new_null() SKM_sk_new_null(SSL_CIPHER)
#define sk_SSL_CIPHER_free(st) SKM_sk_free(SSL_CIPHER, (st))
#define sk_SSL_CIPHER_num(st) SKM_sk_num(SSL_CIPHER, (st))
#define sk_SSL_CIPHER_value(st, i) SKM_sk_value(SSL_CIPHER, (st), (i))
#define sk_SSL_CIPHER_set(st, i, val) SKM_sk_set(SSL_CIPHER, (st), (i), (val))
#define sk_SSL_CIPHER_zero(st) SKM_sk_zero(SSL_CIPHER, (st))
#define sk_SSL_CIPHER_push(st, val) SKM_sk_push(SSL_CIPHER, (st), (val))
#define sk_SSL_CIPHER_unshift(st, val) SKM_sk_unshift(SSL_CIPHER, (st), (val))
#define sk_SSL_CIPHER_find(st, val) SKM_sk_find(SSL_CIPHER, (st), (val))
#define sk_SSL_CIPHER_find_ex(st, val) SKM_sk_find_ex(SSL_CIPHER, (st), (val))
#define sk_SSL_CIPHER_delete(st, i) SKM_sk_delete(SSL_CIPHER, (st), (i))
#define sk_SSL_CIPHER_delete_ptr(st, ptr) SKM_sk_delete_ptr(SSL_CIPHER, (st), (ptr))
#define sk_SSL_CIPHER_insert(st, val, i) SKM_sk_insert(SSL_CIPHER, (st), (val), (i))
#define sk_SSL_CIPHER_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SSL_CIPHER, (st), (cmp))
#define sk_SSL_CIPHER_dup(st) SKM_sk_dup(SSL_CIPHER, st)
#define sk_SSL_CIPHER_pop_free(st, free_func) SKM_sk_pop_free(SSL_CIPHER, (st), (free_func))
#define sk_SSL_CIPHER_shift(st) SKM_sk_shift(SSL_CIPHER, (st))
#define sk_SSL_CIPHER_pop(st) SKM_sk_pop(SSL_CIPHER, (st))
#define sk_SSL_CIPHER_sort(st) SKM_sk_sort(SSL_CIPHER, (st))
#define sk_SSL_CIPHER_is_sorted(st) SKM_sk_is_sorted(SSL_CIPHER, (st))

#define sk_SSL_COMP_new(st) SKM_sk_new(SSL_COMP, (st))
#define sk_SSL_COMP_new_null() SKM_sk_new_null(SSL_COMP)
#define sk_SSL_COMP_free(st) SKM_sk_free(SSL_COMP, (st))
#define sk_SSL_COMP_num(st) SKM_sk_num(SSL_COMP, (st))
#define sk_SSL_COMP_value(st, i) SKM_sk_value(SSL_COMP, (st), (i))
#define sk_SSL_COMP_set(st, i, val) SKM_sk_set(SSL_COMP, (st), (i), (val))
#define sk_SSL_COMP_zero(st) SKM_sk_zero(SSL_COMP, (st))
#define sk_SSL_COMP_push(st, val) SKM_sk_push(SSL_COMP, (st), (val))
#define sk_SSL_COMP_unshift(st, val) SKM_sk_unshift(SSL_COMP, (st), (val))
#define sk_SSL_COMP_find(st, val) SKM_sk_find(SSL_COMP, (st), (val))
#define sk_SSL_COMP_find_ex(st, val) SKM_sk_find_ex(SSL_COMP, (st), (val))
#define sk_SSL_COMP_delete(st, i) SKM_sk_delete(SSL_COMP, (st), (i))
#define sk_SSL_COMP_delete_ptr(st, ptr) SKM_sk_delete_ptr(SSL_COMP, (st), (ptr))
#define sk_SSL_COMP_insert(st, val, i) SKM_sk_insert(SSL_COMP, (st), (val), (i))
#define sk_SSL_COMP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SSL_COMP, (st), (cmp))
#define sk_SSL_COMP_dup(st) SKM_sk_dup(SSL_COMP, st)
#define sk_SSL_COMP_pop_free(st, free_func) SKM_sk_pop_free(SSL_COMP, (st), (free_func))
#define sk_SSL_COMP_shift(st) SKM_sk_shift(SSL_COMP, (st))
#define sk_SSL_COMP_pop(st) SKM_sk_pop(SSL_COMP, (st))
#define sk_SSL_COMP_sort(st) SKM_sk_sort(SSL_COMP, (st))
#define sk_SSL_COMP_is_sorted(st) SKM_sk_is_sorted(SSL_COMP, (st))

#define sk_STORE_OBJECT_new(st) SKM_sk_new(STORE_OBJECT, (st))
#define sk_STORE_OBJECT_new_null() SKM_sk_new_null(STORE_OBJECT)
#define sk_STORE_OBJECT_free(st) SKM_sk_free(STORE_OBJECT, (st))
#define sk_STORE_OBJECT_num(st) SKM_sk_num(STORE_OBJECT, (st))
#define sk_STORE_OBJECT_value(st, i) SKM_sk_value(STORE_OBJECT, (st), (i))
#define sk_STORE_OBJECT_set(st, i, val) SKM_sk_set(STORE_OBJECT, (st), (i), (val))
#define sk_STORE_OBJECT_zero(st) SKM_sk_zero(STORE_OBJECT, (st))
#define sk_STORE_OBJECT_push(st, val) SKM_sk_push(STORE_OBJECT, (st), (val))
#define sk_STORE_OBJECT_unshift(st, val) SKM_sk_unshift(STORE_OBJECT, (st), (val))
#define sk_STORE_OBJECT_find(st, val) SKM_sk_find(STORE_OBJECT, (st), (val))
#define sk_STORE_OBJECT_find_ex(st, val) SKM_sk_find_ex(STORE_OBJECT, (st), (val))
#define sk_STORE_OBJECT_delete(st, i) SKM_sk_delete(STORE_OBJECT, (st), (i))
#define sk_STORE_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(STORE_OBJECT, (st), (ptr))
#define sk_STORE_OBJECT_insert(st, val, i) SKM_sk_insert(STORE_OBJECT, (st), (val), (i))
#define sk_STORE_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(STORE_OBJECT, (st), (cmp))
#define sk_STORE_OBJECT_dup(st) SKM_sk_dup(STORE_OBJECT, st)
#define sk_STORE_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(STORE_OBJECT, (st), (free_func))
#define sk_STORE_OBJECT_shift(st) SKM_sk_shift(STORE_OBJECT, (st))
#define sk_STORE_OBJECT_pop(st) SKM_sk_pop(STORE_OBJECT, (st))
#define sk_STORE_OBJECT_sort(st) SKM_sk_sort(STORE_OBJECT, (st))
#define sk_STORE_OBJECT_is_sorted(st) SKM_sk_is_sorted(STORE_OBJECT, (st))

#define sk_SXNETID_new(st) SKM_sk_new(SXNETID, (st))
#define sk_SXNETID_new_null() SKM_sk_new_null(SXNETID)
#define sk_SXNETID_free(st) SKM_sk_free(SXNETID, (st))
#define sk_SXNETID_num(st) SKM_sk_num(SXNETID, (st))
#define sk_SXNETID_value(st, i) SKM_sk_value(SXNETID, (st), (i))
#define sk_SXNETID_set(st, i, val) SKM_sk_set(SXNETID, (st), (i), (val))
#define sk_SXNETID_zero(st) SKM_sk_zero(SXNETID, (st))
#define sk_SXNETID_push(st, val) SKM_sk_push(SXNETID, (st), (val))
#define sk_SXNETID_unshift(st, val) SKM_sk_unshift(SXNETID, (st), (val))
#define sk_SXNETID_find(st, val) SKM_sk_find(SXNETID, (st), (val))
#define sk_SXNETID_find_ex(st, val) SKM_sk_find_ex(SXNETID, (st), (val))
#define sk_SXNETID_delete(st, i) SKM_sk_delete(SXNETID, (st), (i))
#define sk_SXNETID_delete_ptr(st, ptr) SKM_sk_delete_ptr(SXNETID, (st), (ptr))
#define sk_SXNETID_insert(st, val, i) SKM_sk_insert(SXNETID, (st), (val), (i))
#define sk_SXNETID_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(SXNETID, (st), (cmp))
#define sk_SXNETID_dup(st) SKM_sk_dup(SXNETID, st)
#define sk_SXNETID_pop_free(st, free_func) SKM_sk_pop_free(SXNETID, (st), (free_func))
#define sk_SXNETID_shift(st) SKM_sk_shift(SXNETID, (st))
#define sk_SXNETID_pop(st) SKM_sk_pop(SXNETID, (st))
#define sk_SXNETID_sort(st) SKM_sk_sort(SXNETID, (st))
#define sk_SXNETID_is_sorted(st) SKM_sk_is_sorted(SXNETID, (st))

#define sk_UI_STRING_new(st) SKM_sk_new(UI_STRING, (st))
#define sk_UI_STRING_new_null() SKM_sk_new_null(UI_STRING)
#define sk_UI_STRING_free(st) SKM_sk_free(UI_STRING, (st))
#define sk_UI_STRING_num(st) SKM_sk_num(UI_STRING, (st))
#define sk_UI_STRING_value(st, i) SKM_sk_value(UI_STRING, (st), (i))
#define sk_UI_STRING_set(st, i, val) SKM_sk_set(UI_STRING, (st), (i), (val))
#define sk_UI_STRING_zero(st) SKM_sk_zero(UI_STRING, (st))
#define sk_UI_STRING_push(st, val) SKM_sk_push(UI_STRING, (st), (val))
#define sk_UI_STRING_unshift(st, val) SKM_sk_unshift(UI_STRING, (st), (val))
#define sk_UI_STRING_find(st, val) SKM_sk_find(UI_STRING, (st), (val))
#define sk_UI_STRING_find_ex(st, val) SKM_sk_find_ex(UI_STRING, (st), (val))
#define sk_UI_STRING_delete(st, i) SKM_sk_delete(UI_STRING, (st), (i))
#define sk_UI_STRING_delete_ptr(st, ptr) SKM_sk_delete_ptr(UI_STRING, (st), (ptr))
#define sk_UI_STRING_insert(st, val, i) SKM_sk_insert(UI_STRING, (st), (val), (i))
#define sk_UI_STRING_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(UI_STRING, (st), (cmp))
#define sk_UI_STRING_dup(st) SKM_sk_dup(UI_STRING, st)
#define sk_UI_STRING_pop_free(st, free_func) SKM_sk_pop_free(UI_STRING, (st), (free_func))
#define sk_UI_STRING_shift(st) SKM_sk_shift(UI_STRING, (st))
#define sk_UI_STRING_pop(st) SKM_sk_pop(UI_STRING, (st))
#define sk_UI_STRING_sort(st) SKM_sk_sort(UI_STRING, (st))
#define sk_UI_STRING_is_sorted(st) SKM_sk_is_sorted(UI_STRING, (st))

#define sk_X509_new(st) SKM_sk_new(X509, (st))
#define sk_X509_new_null() SKM_sk_new_null(X509)
#define sk_X509_free(st) SKM_sk_free(X509, (st))
#define sk_X509_num(st) SKM_sk_num(X509, (st))
#define sk_X509_value(st, i) SKM_sk_value(X509, (st), (i))
#define sk_X509_set(st, i, val) SKM_sk_set(X509, (st), (i), (val))
#define sk_X509_zero(st) SKM_sk_zero(X509, (st))
#define sk_X509_push(st, val) SKM_sk_push(X509, (st), (val))
#define sk_X509_unshift(st, val) SKM_sk_unshift(X509, (st), (val))
#define sk_X509_find(st, val) SKM_sk_find(X509, (st), (val))
#define sk_X509_find_ex(st, val) SKM_sk_find_ex(X509, (st), (val))
#define sk_X509_delete(st, i) SKM_sk_delete(X509, (st), (i))
#define sk_X509_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509, (st), (ptr))
#define sk_X509_insert(st, val, i) SKM_sk_insert(X509, (st), (val), (i))
#define sk_X509_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509, (st), (cmp))
#define sk_X509_dup(st) SKM_sk_dup(X509, st)
#define sk_X509_pop_free(st, free_func) SKM_sk_pop_free(X509, (st), (free_func))
#define sk_X509_shift(st) SKM_sk_shift(X509, (st))
#define sk_X509_pop(st) SKM_sk_pop(X509, (st))
#define sk_X509_sort(st) SKM_sk_sort(X509, (st))
#define sk_X509_is_sorted(st) SKM_sk_is_sorted(X509, (st))

#define sk_X509V3_EXT_METHOD_new(st) SKM_sk_new(X509V3_EXT_METHOD, (st))
#define sk_X509V3_EXT_METHOD_new_null() SKM_sk_new_null(X509V3_EXT_METHOD)
#define sk_X509V3_EXT_METHOD_free(st) SKM_sk_free(X509V3_EXT_METHOD, (st))
#define sk_X509V3_EXT_METHOD_num(st) SKM_sk_num(X509V3_EXT_METHOD, (st))
#define sk_X509V3_EXT_METHOD_value(st, i) SKM_sk_value(X509V3_EXT_METHOD, (st), (i))
#define sk_X509V3_EXT_METHOD_set(st, i, val) SKM_sk_set(X509V3_EXT_METHOD, (st), (i), (val))
#define sk_X509V3_EXT_METHOD_zero(st) SKM_sk_zero(X509V3_EXT_METHOD, (st))
#define sk_X509V3_EXT_METHOD_push(st, val) SKM_sk_push(X509V3_EXT_METHOD, (st), (val))
#define sk_X509V3_EXT_METHOD_unshift(st, val) SKM_sk_unshift(X509V3_EXT_METHOD, (st), (val))
#define sk_X509V3_EXT_METHOD_find(st, val) SKM_sk_find(X509V3_EXT_METHOD, (st), (val))
#define sk_X509V3_EXT_METHOD_find_ex(st, val) SKM_sk_find_ex(X509V3_EXT_METHOD, (st), (val))
#define sk_X509V3_EXT_METHOD_delete(st, i) SKM_sk_delete(X509V3_EXT_METHOD, (st), (i))
#define sk_X509V3_EXT_METHOD_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509V3_EXT_METHOD, (st), (ptr))
#define sk_X509V3_EXT_METHOD_insert(st, val, i) SKM_sk_insert(X509V3_EXT_METHOD, (st), (val), (i))
#define sk_X509V3_EXT_METHOD_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509V3_EXT_METHOD, (st), (cmp))
#define sk_X509V3_EXT_METHOD_dup(st) SKM_sk_dup(X509V3_EXT_METHOD, st)
#define sk_X509V3_EXT_METHOD_pop_free(st, free_func) SKM_sk_pop_free(X509V3_EXT_METHOD, (st), (free_func))
#define sk_X509V3_EXT_METHOD_shift(st) SKM_sk_shift(X509V3_EXT_METHOD, (st))
#define sk_X509V3_EXT_METHOD_pop(st) SKM_sk_pop(X509V3_EXT_METHOD, (st))
#define sk_X509V3_EXT_METHOD_sort(st) SKM_sk_sort(X509V3_EXT_METHOD, (st))
#define sk_X509V3_EXT_METHOD_is_sorted(st) SKM_sk_is_sorted(X509V3_EXT_METHOD, (st))

#define sk_X509_ALGOR_new(st) SKM_sk_new(X509_ALGOR, (st))
#define sk_X509_ALGOR_new_null() SKM_sk_new_null(X509_ALGOR)
#define sk_X509_ALGOR_free(st) SKM_sk_free(X509_ALGOR, (st))
#define sk_X509_ALGOR_num(st) SKM_sk_num(X509_ALGOR, (st))
#define sk_X509_ALGOR_value(st, i) SKM_sk_value(X509_ALGOR, (st), (i))
#define sk_X509_ALGOR_set(st, i, val) SKM_sk_set(X509_ALGOR, (st), (i), (val))
#define sk_X509_ALGOR_zero(st) SKM_sk_zero(X509_ALGOR, (st))
#define sk_X509_ALGOR_push(st, val) SKM_sk_push(X509_ALGOR, (st), (val))
#define sk_X509_ALGOR_unshift(st, val) SKM_sk_unshift(X509_ALGOR, (st), (val))
#define sk_X509_ALGOR_find(st, val) SKM_sk_find(X509_ALGOR, (st), (val))
#define sk_X509_ALGOR_find_ex(st, val) SKM_sk_find_ex(X509_ALGOR, (st), (val))
#define sk_X509_ALGOR_delete(st, i) SKM_sk_delete(X509_ALGOR, (st), (i))
#define sk_X509_ALGOR_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_ALGOR, (st), (ptr))
#define sk_X509_ALGOR_insert(st, val, i) SKM_sk_insert(X509_ALGOR, (st), (val), (i))
#define sk_X509_ALGOR_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_ALGOR, (st), (cmp))
#define sk_X509_ALGOR_dup(st) SKM_sk_dup(X509_ALGOR, st)
#define sk_X509_ALGOR_pop_free(st, free_func) SKM_sk_pop_free(X509_ALGOR, (st), (free_func))
#define sk_X509_ALGOR_shift(st) SKM_sk_shift(X509_ALGOR, (st))
#define sk_X509_ALGOR_pop(st) SKM_sk_pop(X509_ALGOR, (st))
#define sk_X509_ALGOR_sort(st) SKM_sk_sort(X509_ALGOR, (st))
#define sk_X509_ALGOR_is_sorted(st) SKM_sk_is_sorted(X509_ALGOR, (st))

#define sk_X509_ATTRIBUTE_new(st) SKM_sk_new(X509_ATTRIBUTE, (st))
#define sk_X509_ATTRIBUTE_new_null() SKM_sk_new_null(X509_ATTRIBUTE)
#define sk_X509_ATTRIBUTE_free(st) SKM_sk_free(X509_ATTRIBUTE, (st))
#define sk_X509_ATTRIBUTE_num(st) SKM_sk_num(X509_ATTRIBUTE, (st))
#define sk_X509_ATTRIBUTE_value(st, i) SKM_sk_value(X509_ATTRIBUTE, (st), (i))
#define sk_X509_ATTRIBUTE_set(st, i, val) SKM_sk_set(X509_ATTRIBUTE, (st), (i), (val))
#define sk_X509_ATTRIBUTE_zero(st) SKM_sk_zero(X509_ATTRIBUTE, (st))
#define sk_X509_ATTRIBUTE_push(st, val) SKM_sk_push(X509_ATTRIBUTE, (st), (val))
#define sk_X509_ATTRIBUTE_unshift(st, val) SKM_sk_unshift(X509_ATTRIBUTE, (st), (val))
#define sk_X509_ATTRIBUTE_find(st, val) SKM_sk_find(X509_ATTRIBUTE, (st), (val))
#define sk_X509_ATTRIBUTE_find_ex(st, val) SKM_sk_find_ex(X509_ATTRIBUTE, (st), (val))
#define sk_X509_ATTRIBUTE_delete(st, i) SKM_sk_delete(X509_ATTRIBUTE, (st), (i))
#define sk_X509_ATTRIBUTE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_ATTRIBUTE, (st), (ptr))
#define sk_X509_ATTRIBUTE_insert(st, val, i) SKM_sk_insert(X509_ATTRIBUTE, (st), (val), (i))
#define sk_X509_ATTRIBUTE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_ATTRIBUTE, (st), (cmp))
#define sk_X509_ATTRIBUTE_dup(st) SKM_sk_dup(X509_ATTRIBUTE, st)
#define sk_X509_ATTRIBUTE_pop_free(st, free_func) SKM_sk_pop_free(X509_ATTRIBUTE, (st), (free_func))
#define sk_X509_ATTRIBUTE_shift(st) SKM_sk_shift(X509_ATTRIBUTE, (st))
#define sk_X509_ATTRIBUTE_pop(st) SKM_sk_pop(X509_ATTRIBUTE, (st))
#define sk_X509_ATTRIBUTE_sort(st) SKM_sk_sort(X509_ATTRIBUTE, (st))
#define sk_X509_ATTRIBUTE_is_sorted(st) SKM_sk_is_sorted(X509_ATTRIBUTE, (st))

#define sk_X509_CRL_new(st) SKM_sk_new(X509_CRL, (st))
#define sk_X509_CRL_new_null() SKM_sk_new_null(X509_CRL)
#define sk_X509_CRL_free(st) SKM_sk_free(X509_CRL, (st))
#define sk_X509_CRL_num(st) SKM_sk_num(X509_CRL, (st))
#define sk_X509_CRL_value(st, i) SKM_sk_value(X509_CRL, (st), (i))
#define sk_X509_CRL_set(st, i, val) SKM_sk_set(X509_CRL, (st), (i), (val))
#define sk_X509_CRL_zero(st) SKM_sk_zero(X509_CRL, (st))
#define sk_X509_CRL_push(st, val) SKM_sk_push(X509_CRL, (st), (val))
#define sk_X509_CRL_unshift(st, val) SKM_sk_unshift(X509_CRL, (st), (val))
#define sk_X509_CRL_find(st, val) SKM_sk_find(X509_CRL, (st), (val))
#define sk_X509_CRL_find_ex(st, val) SKM_sk_find_ex(X509_CRL, (st), (val))
#define sk_X509_CRL_delete(st, i) SKM_sk_delete(X509_CRL, (st), (i))
#define sk_X509_CRL_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_CRL, (st), (ptr))
#define sk_X509_CRL_insert(st, val, i) SKM_sk_insert(X509_CRL, (st), (val), (i))
#define sk_X509_CRL_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_CRL, (st), (cmp))
#define sk_X509_CRL_dup(st) SKM_sk_dup(X509_CRL, st)
#define sk_X509_CRL_pop_free(st, free_func) SKM_sk_pop_free(X509_CRL, (st), (free_func))
#define sk_X509_CRL_shift(st) SKM_sk_shift(X509_CRL, (st))
#define sk_X509_CRL_pop(st) SKM_sk_pop(X509_CRL, (st))
#define sk_X509_CRL_sort(st) SKM_sk_sort(X509_CRL, (st))
#define sk_X509_CRL_is_sorted(st) SKM_sk_is_sorted(X509_CRL, (st))

#define sk_X509_EXTENSION_new(st) SKM_sk_new(X509_EXTENSION, (st))
#define sk_X509_EXTENSION_new_null() SKM_sk_new_null(X509_EXTENSION)
#define sk_X509_EXTENSION_free(st) SKM_sk_free(X509_EXTENSION, (st))
#define sk_X509_EXTENSION_num(st) SKM_sk_num(X509_EXTENSION, (st))
#define sk_X509_EXTENSION_value(st, i) SKM_sk_value(X509_EXTENSION, (st), (i))
#define sk_X509_EXTENSION_set(st, i, val) SKM_sk_set(X509_EXTENSION, (st), (i), (val))
#define sk_X509_EXTENSION_zero(st) SKM_sk_zero(X509_EXTENSION, (st))
#define sk_X509_EXTENSION_push(st, val) SKM_sk_push(X509_EXTENSION, (st), (val))
#define sk_X509_EXTENSION_unshift(st, val) SKM_sk_unshift(X509_EXTENSION, (st), (val))
#define sk_X509_EXTENSION_find(st, val) SKM_sk_find(X509_EXTENSION, (st), (val))
#define sk_X509_EXTENSION_find_ex(st, val) SKM_sk_find_ex(X509_EXTENSION, (st), (val))
#define sk_X509_EXTENSION_delete(st, i) SKM_sk_delete(X509_EXTENSION, (st), (i))
#define sk_X509_EXTENSION_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_EXTENSION, (st), (ptr))
#define sk_X509_EXTENSION_insert(st, val, i) SKM_sk_insert(X509_EXTENSION, (st), (val), (i))
#define sk_X509_EXTENSION_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_EXTENSION, (st), (cmp))
#define sk_X509_EXTENSION_dup(st) SKM_sk_dup(X509_EXTENSION, st)
#define sk_X509_EXTENSION_pop_free(st, free_func) SKM_sk_pop_free(X509_EXTENSION, (st), (free_func))
#define sk_X509_EXTENSION_shift(st) SKM_sk_shift(X509_EXTENSION, (st))
#define sk_X509_EXTENSION_pop(st) SKM_sk_pop(X509_EXTENSION, (st))
#define sk_X509_EXTENSION_sort(st) SKM_sk_sort(X509_EXTENSION, (st))
#define sk_X509_EXTENSION_is_sorted(st) SKM_sk_is_sorted(X509_EXTENSION, (st))

#define sk_X509_INFO_new(st) SKM_sk_new(X509_INFO, (st))
#define sk_X509_INFO_new_null() SKM_sk_new_null(X509_INFO)
#define sk_X509_INFO_free(st) SKM_sk_free(X509_INFO, (st))
#define sk_X509_INFO_num(st) SKM_sk_num(X509_INFO, (st))
#define sk_X509_INFO_value(st, i) SKM_sk_value(X509_INFO, (st), (i))
#define sk_X509_INFO_set(st, i, val) SKM_sk_set(X509_INFO, (st), (i), (val))
#define sk_X509_INFO_zero(st) SKM_sk_zero(X509_INFO, (st))
#define sk_X509_INFO_push(st, val) SKM_sk_push(X509_INFO, (st), (val))
#define sk_X509_INFO_unshift(st, val) SKM_sk_unshift(X509_INFO, (st), (val))
#define sk_X509_INFO_find(st, val) SKM_sk_find(X509_INFO, (st), (val))
#define sk_X509_INFO_find_ex(st, val) SKM_sk_find_ex(X509_INFO, (st), (val))
#define sk_X509_INFO_delete(st, i) SKM_sk_delete(X509_INFO, (st), (i))
#define sk_X509_INFO_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_INFO, (st), (ptr))
#define sk_X509_INFO_insert(st, val, i) SKM_sk_insert(X509_INFO, (st), (val), (i))
#define sk_X509_INFO_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_INFO, (st), (cmp))
#define sk_X509_INFO_dup(st) SKM_sk_dup(X509_INFO, st)
#define sk_X509_INFO_pop_free(st, free_func) SKM_sk_pop_free(X509_INFO, (st), (free_func))
#define sk_X509_INFO_shift(st) SKM_sk_shift(X509_INFO, (st))
#define sk_X509_INFO_pop(st) SKM_sk_pop(X509_INFO, (st))
#define sk_X509_INFO_sort(st) SKM_sk_sort(X509_INFO, (st))
#define sk_X509_INFO_is_sorted(st) SKM_sk_is_sorted(X509_INFO, (st))

#define sk_X509_LOOKUP_new(st) SKM_sk_new(X509_LOOKUP, (st))
#define sk_X509_LOOKUP_new_null() SKM_sk_new_null(X509_LOOKUP)
#define sk_X509_LOOKUP_free(st) SKM_sk_free(X509_LOOKUP, (st))
#define sk_X509_LOOKUP_num(st) SKM_sk_num(X509_LOOKUP, (st))
#define sk_X509_LOOKUP_value(st, i) SKM_sk_value(X509_LOOKUP, (st), (i))
#define sk_X509_LOOKUP_set(st, i, val) SKM_sk_set(X509_LOOKUP, (st), (i), (val))
#define sk_X509_LOOKUP_zero(st) SKM_sk_zero(X509_LOOKUP, (st))
#define sk_X509_LOOKUP_push(st, val) SKM_sk_push(X509_LOOKUP, (st), (val))
#define sk_X509_LOOKUP_unshift(st, val) SKM_sk_unshift(X509_LOOKUP, (st), (val))
#define sk_X509_LOOKUP_find(st, val) SKM_sk_find(X509_LOOKUP, (st), (val))
#define sk_X509_LOOKUP_find_ex(st, val) SKM_sk_find_ex(X509_LOOKUP, (st), (val))
#define sk_X509_LOOKUP_delete(st, i) SKM_sk_delete(X509_LOOKUP, (st), (i))
#define sk_X509_LOOKUP_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_LOOKUP, (st), (ptr))
#define sk_X509_LOOKUP_insert(st, val, i) SKM_sk_insert(X509_LOOKUP, (st), (val), (i))
#define sk_X509_LOOKUP_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_LOOKUP, (st), (cmp))
#define sk_X509_LOOKUP_dup(st) SKM_sk_dup(X509_LOOKUP, st)
#define sk_X509_LOOKUP_pop_free(st, free_func) SKM_sk_pop_free(X509_LOOKUP, (st), (free_func))
#define sk_X509_LOOKUP_shift(st) SKM_sk_shift(X509_LOOKUP, (st))
#define sk_X509_LOOKUP_pop(st) SKM_sk_pop(X509_LOOKUP, (st))
#define sk_X509_LOOKUP_sort(st) SKM_sk_sort(X509_LOOKUP, (st))
#define sk_X509_LOOKUP_is_sorted(st) SKM_sk_is_sorted(X509_LOOKUP, (st))

#define sk_X509_NAME_new(st) SKM_sk_new(X509_NAME, (st))
#define sk_X509_NAME_new_null() SKM_sk_new_null(X509_NAME)
#define sk_X509_NAME_free(st) SKM_sk_free(X509_NAME, (st))
#define sk_X509_NAME_num(st) SKM_sk_num(X509_NAME, (st))
#define sk_X509_NAME_value(st, i) SKM_sk_value(X509_NAME, (st), (i))
#define sk_X509_NAME_set(st, i, val) SKM_sk_set(X509_NAME, (st), (i), (val))
#define sk_X509_NAME_zero(st) SKM_sk_zero(X509_NAME, (st))
#define sk_X509_NAME_push(st, val) SKM_sk_push(X509_NAME, (st), (val))
#define sk_X509_NAME_unshift(st, val) SKM_sk_unshift(X509_NAME, (st), (val))
#define sk_X509_NAME_find(st, val) SKM_sk_find(X509_NAME, (st), (val))
#define sk_X509_NAME_find_ex(st, val) SKM_sk_find_ex(X509_NAME, (st), (val))
#define sk_X509_NAME_delete(st, i) SKM_sk_delete(X509_NAME, (st), (i))
#define sk_X509_NAME_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_NAME, (st), (ptr))
#define sk_X509_NAME_insert(st, val, i) SKM_sk_insert(X509_NAME, (st), (val), (i))
#define sk_X509_NAME_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_NAME, (st), (cmp))
#define sk_X509_NAME_dup(st) SKM_sk_dup(X509_NAME, st)
#define sk_X509_NAME_pop_free(st, free_func) SKM_sk_pop_free(X509_NAME, (st), (free_func))
#define sk_X509_NAME_shift(st) SKM_sk_shift(X509_NAME, (st))
#define sk_X509_NAME_pop(st) SKM_sk_pop(X509_NAME, (st))
#define sk_X509_NAME_sort(st) SKM_sk_sort(X509_NAME, (st))
#define sk_X509_NAME_is_sorted(st) SKM_sk_is_sorted(X509_NAME, (st))

#define sk_X509_NAME_ENTRY_new(st) SKM_sk_new(X509_NAME_ENTRY, (st))
#define sk_X509_NAME_ENTRY_new_null() SKM_sk_new_null(X509_NAME_ENTRY)
#define sk_X509_NAME_ENTRY_free(st) SKM_sk_free(X509_NAME_ENTRY, (st))
#define sk_X509_NAME_ENTRY_num(st) SKM_sk_num(X509_NAME_ENTRY, (st))
#define sk_X509_NAME_ENTRY_value(st, i) SKM_sk_value(X509_NAME_ENTRY, (st), (i))
#define sk_X509_NAME_ENTRY_set(st, i, val) SKM_sk_set(X509_NAME_ENTRY, (st), (i), (val))
#define sk_X509_NAME_ENTRY_zero(st) SKM_sk_zero(X509_NAME_ENTRY, (st))
#define sk_X509_NAME_ENTRY_push(st, val) SKM_sk_push(X509_NAME_ENTRY, (st), (val))
#define sk_X509_NAME_ENTRY_unshift(st, val) SKM_sk_unshift(X509_NAME_ENTRY, (st), (val))
#define sk_X509_NAME_ENTRY_find(st, val) SKM_sk_find(X509_NAME_ENTRY, (st), (val))
#define sk_X509_NAME_ENTRY_find_ex(st, val) SKM_sk_find_ex(X509_NAME_ENTRY, (st), (val))
#define sk_X509_NAME_ENTRY_delete(st, i) SKM_sk_delete(X509_NAME_ENTRY, (st), (i))
#define sk_X509_NAME_ENTRY_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_NAME_ENTRY, (st), (ptr))
#define sk_X509_NAME_ENTRY_insert(st, val, i) SKM_sk_insert(X509_NAME_ENTRY, (st), (val), (i))
#define sk_X509_NAME_ENTRY_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_NAME_ENTRY, (st), (cmp))
#define sk_X509_NAME_ENTRY_dup(st) SKM_sk_dup(X509_NAME_ENTRY, st)
#define sk_X509_NAME_ENTRY_pop_free(st, free_func) SKM_sk_pop_free(X509_NAME_ENTRY, (st), (free_func))
#define sk_X509_NAME_ENTRY_shift(st) SKM_sk_shift(X509_NAME_ENTRY, (st))
#define sk_X509_NAME_ENTRY_pop(st) SKM_sk_pop(X509_NAME_ENTRY, (st))
#define sk_X509_NAME_ENTRY_sort(st) SKM_sk_sort(X509_NAME_ENTRY, (st))
#define sk_X509_NAME_ENTRY_is_sorted(st) SKM_sk_is_sorted(X509_NAME_ENTRY, (st))

#define sk_X509_OBJECT_new(st) SKM_sk_new(X509_OBJECT, (st))
#define sk_X509_OBJECT_new_null() SKM_sk_new_null(X509_OBJECT)
#define sk_X509_OBJECT_free(st) SKM_sk_free(X509_OBJECT, (st))
#define sk_X509_OBJECT_num(st) SKM_sk_num(X509_OBJECT, (st))
#define sk_X509_OBJECT_value(st, i) SKM_sk_value(X509_OBJECT, (st), (i))
#define sk_X509_OBJECT_set(st, i, val) SKM_sk_set(X509_OBJECT, (st), (i), (val))
#define sk_X509_OBJECT_zero(st) SKM_sk_zero(X509_OBJECT, (st))
#define sk_X509_OBJECT_push(st, val) SKM_sk_push(X509_OBJECT, (st), (val))
#define sk_X509_OBJECT_unshift(st, val) SKM_sk_unshift(X509_OBJECT, (st), (val))
#define sk_X509_OBJECT_find(st, val) SKM_sk_find(X509_OBJECT, (st), (val))
#define sk_X509_OBJECT_find_ex(st, val) SKM_sk_find_ex(X509_OBJECT, (st), (val))
#define sk_X509_OBJECT_delete(st, i) SKM_sk_delete(X509_OBJECT, (st), (i))
#define sk_X509_OBJECT_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_OBJECT, (st), (ptr))
#define sk_X509_OBJECT_insert(st, val, i) SKM_sk_insert(X509_OBJECT, (st), (val), (i))
#define sk_X509_OBJECT_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_OBJECT, (st), (cmp))
#define sk_X509_OBJECT_dup(st) SKM_sk_dup(X509_OBJECT, st)
#define sk_X509_OBJECT_pop_free(st, free_func) SKM_sk_pop_free(X509_OBJECT, (st), (free_func))
#define sk_X509_OBJECT_shift(st) SKM_sk_shift(X509_OBJECT, (st))
#define sk_X509_OBJECT_pop(st) SKM_sk_pop(X509_OBJECT, (st))
#define sk_X509_OBJECT_sort(st) SKM_sk_sort(X509_OBJECT, (st))
#define sk_X509_OBJECT_is_sorted(st) SKM_sk_is_sorted(X509_OBJECT, (st))

#define sk_X509_POLICY_DATA_new(st) SKM_sk_new(X509_POLICY_DATA, (st))
#define sk_X509_POLICY_DATA_new_null() SKM_sk_new_null(X509_POLICY_DATA)
#define sk_X509_POLICY_DATA_free(st) SKM_sk_free(X509_POLICY_DATA, (st))
#define sk_X509_POLICY_DATA_num(st) SKM_sk_num(X509_POLICY_DATA, (st))
#define sk_X509_POLICY_DATA_value(st, i) SKM_sk_value(X509_POLICY_DATA, (st), (i))
#define sk_X509_POLICY_DATA_set(st, i, val) SKM_sk_set(X509_POLICY_DATA, (st), (i), (val))
#define sk_X509_POLICY_DATA_zero(st) SKM_sk_zero(X509_POLICY_DATA, (st))
#define sk_X509_POLICY_DATA_push(st, val) SKM_sk_push(X509_POLICY_DATA, (st), (val))
#define sk_X509_POLICY_DATA_unshift(st, val) SKM_sk_unshift(X509_POLICY_DATA, (st), (val))
#define sk_X509_POLICY_DATA_find(st, val) SKM_sk_find(X509_POLICY_DATA, (st), (val))
#define sk_X509_POLICY_DATA_find_ex(st, val) SKM_sk_find_ex(X509_POLICY_DATA, (st), (val))
#define sk_X509_POLICY_DATA_delete(st, i) SKM_sk_delete(X509_POLICY_DATA, (st), (i))
#define sk_X509_POLICY_DATA_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_POLICY_DATA, (st), (ptr))
#define sk_X509_POLICY_DATA_insert(st, val, i) SKM_sk_insert(X509_POLICY_DATA, (st), (val), (i))
#define sk_X509_POLICY_DATA_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_POLICY_DATA, (st), (cmp))
#define sk_X509_POLICY_DATA_dup(st) SKM_sk_dup(X509_POLICY_DATA, st)
#define sk_X509_POLICY_DATA_pop_free(st, free_func) SKM_sk_pop_free(X509_POLICY_DATA, (st), (free_func))
#define sk_X509_POLICY_DATA_shift(st) SKM_sk_shift(X509_POLICY_DATA, (st))
#define sk_X509_POLICY_DATA_pop(st) SKM_sk_pop(X509_POLICY_DATA, (st))
#define sk_X509_POLICY_DATA_sort(st) SKM_sk_sort(X509_POLICY_DATA, (st))
#define sk_X509_POLICY_DATA_is_sorted(st) SKM_sk_is_sorted(X509_POLICY_DATA, (st))

#define sk_X509_POLICY_NODE_new(st) SKM_sk_new(X509_POLICY_NODE, (st))
#define sk_X509_POLICY_NODE_new_null() SKM_sk_new_null(X509_POLICY_NODE)
#define sk_X509_POLICY_NODE_free(st) SKM_sk_free(X509_POLICY_NODE, (st))
#define sk_X509_POLICY_NODE_num(st) SKM_sk_num(X509_POLICY_NODE, (st))
#define sk_X509_POLICY_NODE_value(st, i) SKM_sk_value(X509_POLICY_NODE, (st), (i))
#define sk_X509_POLICY_NODE_set(st, i, val) SKM_sk_set(X509_POLICY_NODE, (st), (i), (val))
#define sk_X509_POLICY_NODE_zero(st) SKM_sk_zero(X509_POLICY_NODE, (st))
#define sk_X509_POLICY_NODE_push(st, val) SKM_sk_push(X509_POLICY_NODE, (st), (val))
#define sk_X509_POLICY_NODE_unshift(st, val) SKM_sk_unshift(X509_POLICY_NODE, (st), (val))
#define sk_X509_POLICY_NODE_find(st, val) SKM_sk_find(X509_POLICY_NODE, (st), (val))
#define sk_X509_POLICY_NODE_find_ex(st, val) SKM_sk_find_ex(X509_POLICY_NODE, (st), (val))
#define sk_X509_POLICY_NODE_delete(st, i) SKM_sk_delete(X509_POLICY_NODE, (st), (i))
#define sk_X509_POLICY_NODE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_POLICY_NODE, (st), (ptr))
#define sk_X509_POLICY_NODE_insert(st, val, i) SKM_sk_insert(X509_POLICY_NODE, (st), (val), (i))
#define sk_X509_POLICY_NODE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_POLICY_NODE, (st), (cmp))
#define sk_X509_POLICY_NODE_dup(st) SKM_sk_dup(X509_POLICY_NODE, st)
#define sk_X509_POLICY_NODE_pop_free(st, free_func) SKM_sk_pop_free(X509_POLICY_NODE, (st), (free_func))
#define sk_X509_POLICY_NODE_shift(st) SKM_sk_shift(X509_POLICY_NODE, (st))
#define sk_X509_POLICY_NODE_pop(st) SKM_sk_pop(X509_POLICY_NODE, (st))
#define sk_X509_POLICY_NODE_sort(st) SKM_sk_sort(X509_POLICY_NODE, (st))
#define sk_X509_POLICY_NODE_is_sorted(st) SKM_sk_is_sorted(X509_POLICY_NODE, (st))

#define sk_X509_POLICY_REF_new(st) SKM_sk_new(X509_POLICY_REF, (st))
#define sk_X509_POLICY_REF_new_null() SKM_sk_new_null(X509_POLICY_REF)
#define sk_X509_POLICY_REF_free(st) SKM_sk_free(X509_POLICY_REF, (st))
#define sk_X509_POLICY_REF_num(st) SKM_sk_num(X509_POLICY_REF, (st))
#define sk_X509_POLICY_REF_value(st, i) SKM_sk_value(X509_POLICY_REF, (st), (i))
#define sk_X509_POLICY_REF_set(st, i, val) SKM_sk_set(X509_POLICY_REF, (st), (i), (val))
#define sk_X509_POLICY_REF_zero(st) SKM_sk_zero(X509_POLICY_REF, (st))
#define sk_X509_POLICY_REF_push(st, val) SKM_sk_push(X509_POLICY_REF, (st), (val))
#define sk_X509_POLICY_REF_unshift(st, val) SKM_sk_unshift(X509_POLICY_REF, (st), (val))
#define sk_X509_POLICY_REF_find(st, val) SKM_sk_find(X509_POLICY_REF, (st), (val))
#define sk_X509_POLICY_REF_find_ex(st, val) SKM_sk_find_ex(X509_POLICY_REF, (st), (val))
#define sk_X509_POLICY_REF_delete(st, i) SKM_sk_delete(X509_POLICY_REF, (st), (i))
#define sk_X509_POLICY_REF_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_POLICY_REF, (st), (ptr))
#define sk_X509_POLICY_REF_insert(st, val, i) SKM_sk_insert(X509_POLICY_REF, (st), (val), (i))
#define sk_X509_POLICY_REF_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_POLICY_REF, (st), (cmp))
#define sk_X509_POLICY_REF_dup(st) SKM_sk_dup(X509_POLICY_REF, st)
#define sk_X509_POLICY_REF_pop_free(st, free_func) SKM_sk_pop_free(X509_POLICY_REF, (st), (free_func))
#define sk_X509_POLICY_REF_shift(st) SKM_sk_shift(X509_POLICY_REF, (st))
#define sk_X509_POLICY_REF_pop(st) SKM_sk_pop(X509_POLICY_REF, (st))
#define sk_X509_POLICY_REF_sort(st) SKM_sk_sort(X509_POLICY_REF, (st))
#define sk_X509_POLICY_REF_is_sorted(st) SKM_sk_is_sorted(X509_POLICY_REF, (st))

#define sk_X509_PURPOSE_new(st) SKM_sk_new(X509_PURPOSE, (st))
#define sk_X509_PURPOSE_new_null() SKM_sk_new_null(X509_PURPOSE)
#define sk_X509_PURPOSE_free(st) SKM_sk_free(X509_PURPOSE, (st))
#define sk_X509_PURPOSE_num(st) SKM_sk_num(X509_PURPOSE, (st))
#define sk_X509_PURPOSE_value(st, i) SKM_sk_value(X509_PURPOSE, (st), (i))
#define sk_X509_PURPOSE_set(st, i, val) SKM_sk_set(X509_PURPOSE, (st), (i), (val))
#define sk_X509_PURPOSE_zero(st) SKM_sk_zero(X509_PURPOSE, (st))
#define sk_X509_PURPOSE_push(st, val) SKM_sk_push(X509_PURPOSE, (st), (val))
#define sk_X509_PURPOSE_unshift(st, val) SKM_sk_unshift(X509_PURPOSE, (st), (val))
#define sk_X509_PURPOSE_find(st, val) SKM_sk_find(X509_PURPOSE, (st), (val))
#define sk_X509_PURPOSE_find_ex(st, val) SKM_sk_find_ex(X509_PURPOSE, (st), (val))
#define sk_X509_PURPOSE_delete(st, i) SKM_sk_delete(X509_PURPOSE, (st), (i))
#define sk_X509_PURPOSE_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_PURPOSE, (st), (ptr))
#define sk_X509_PURPOSE_insert(st, val, i) SKM_sk_insert(X509_PURPOSE, (st), (val), (i))
#define sk_X509_PURPOSE_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_PURPOSE, (st), (cmp))
#define sk_X509_PURPOSE_dup(st) SKM_sk_dup(X509_PURPOSE, st)
#define sk_X509_PURPOSE_pop_free(st, free_func) SKM_sk_pop_free(X509_PURPOSE, (st), (free_func))
#define sk_X509_PURPOSE_shift(st) SKM_sk_shift(X509_PURPOSE, (st))
#define sk_X509_PURPOSE_pop(st) SKM_sk_pop(X509_PURPOSE, (st))
#define sk_X509_PURPOSE_sort(st) SKM_sk_sort(X509_PURPOSE, (st))
#define sk_X509_PURPOSE_is_sorted(st) SKM_sk_is_sorted(X509_PURPOSE, (st))

#define sk_X509_REVOKED_new(st) SKM_sk_new(X509_REVOKED, (st))
#define sk_X509_REVOKED_new_null() SKM_sk_new_null(X509_REVOKED)
#define sk_X509_REVOKED_free(st) SKM_sk_free(X509_REVOKED, (st))
#define sk_X509_REVOKED_num(st) SKM_sk_num(X509_REVOKED, (st))
#define sk_X509_REVOKED_value(st, i) SKM_sk_value(X509_REVOKED, (st), (i))
#define sk_X509_REVOKED_set(st, i, val) SKM_sk_set(X509_REVOKED, (st), (i), (val))
#define sk_X509_REVOKED_zero(st) SKM_sk_zero(X509_REVOKED, (st))
#define sk_X509_REVOKED_push(st, val) SKM_sk_push(X509_REVOKED, (st), (val))
#define sk_X509_REVOKED_unshift(st, val) SKM_sk_unshift(X509_REVOKED, (st), (val))
#define sk_X509_REVOKED_find(st, val) SKM_sk_find(X509_REVOKED, (st), (val))
#define sk_X509_REVOKED_find_ex(st, val) SKM_sk_find_ex(X509_REVOKED, (st), (val))
#define sk_X509_REVOKED_delete(st, i) SKM_sk_delete(X509_REVOKED, (st), (i))
#define sk_X509_REVOKED_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_REVOKED, (st), (ptr))
#define sk_X509_REVOKED_insert(st, val, i) SKM_sk_insert(X509_REVOKED, (st), (val), (i))
#define sk_X509_REVOKED_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_REVOKED, (st), (cmp))
#define sk_X509_REVOKED_dup(st) SKM_sk_dup(X509_REVOKED, st)
#define sk_X509_REVOKED_pop_free(st, free_func) SKM_sk_pop_free(X509_REVOKED, (st), (free_func))
#define sk_X509_REVOKED_shift(st) SKM_sk_shift(X509_REVOKED, (st))
#define sk_X509_REVOKED_pop(st) SKM_sk_pop(X509_REVOKED, (st))
#define sk_X509_REVOKED_sort(st) SKM_sk_sort(X509_REVOKED, (st))
#define sk_X509_REVOKED_is_sorted(st) SKM_sk_is_sorted(X509_REVOKED, (st))

#define sk_X509_TRUST_new(st) SKM_sk_new(X509_TRUST, (st))
#define sk_X509_TRUST_new_null() SKM_sk_new_null(X509_TRUST)
#define sk_X509_TRUST_free(st) SKM_sk_free(X509_TRUST, (st))
#define sk_X509_TRUST_num(st) SKM_sk_num(X509_TRUST, (st))
#define sk_X509_TRUST_value(st, i) SKM_sk_value(X509_TRUST, (st), (i))
#define sk_X509_TRUST_set(st, i, val) SKM_sk_set(X509_TRUST, (st), (i), (val))
#define sk_X509_TRUST_zero(st) SKM_sk_zero(X509_TRUST, (st))
#define sk_X509_TRUST_push(st, val) SKM_sk_push(X509_TRUST, (st), (val))
#define sk_X509_TRUST_unshift(st, val) SKM_sk_unshift(X509_TRUST, (st), (val))
#define sk_X509_TRUST_find(st, val) SKM_sk_find(X509_TRUST, (st), (val))
#define sk_X509_TRUST_find_ex(st, val) SKM_sk_find_ex(X509_TRUST, (st), (val))
#define sk_X509_TRUST_delete(st, i) SKM_sk_delete(X509_TRUST, (st), (i))
#define sk_X509_TRUST_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_TRUST, (st), (ptr))
#define sk_X509_TRUST_insert(st, val, i) SKM_sk_insert(X509_TRUST, (st), (val), (i))
#define sk_X509_TRUST_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_TRUST, (st), (cmp))
#define sk_X509_TRUST_dup(st) SKM_sk_dup(X509_TRUST, st)
#define sk_X509_TRUST_pop_free(st, free_func) SKM_sk_pop_free(X509_TRUST, (st), (free_func))
#define sk_X509_TRUST_shift(st) SKM_sk_shift(X509_TRUST, (st))
#define sk_X509_TRUST_pop(st) SKM_sk_pop(X509_TRUST, (st))
#define sk_X509_TRUST_sort(st) SKM_sk_sort(X509_TRUST, (st))
#define sk_X509_TRUST_is_sorted(st) SKM_sk_is_sorted(X509_TRUST, (st))

#define sk_X509_VERIFY_PARAM_new(st) SKM_sk_new(X509_VERIFY_PARAM, (st))
#define sk_X509_VERIFY_PARAM_new_null() SKM_sk_new_null(X509_VERIFY_PARAM)
#define sk_X509_VERIFY_PARAM_free(st) SKM_sk_free(X509_VERIFY_PARAM, (st))
#define sk_X509_VERIFY_PARAM_num(st) SKM_sk_num(X509_VERIFY_PARAM, (st))
#define sk_X509_VERIFY_PARAM_value(st, i) SKM_sk_value(X509_VERIFY_PARAM, (st), (i))
#define sk_X509_VERIFY_PARAM_set(st, i, val) SKM_sk_set(X509_VERIFY_PARAM, (st), (i), (val))
#define sk_X509_VERIFY_PARAM_zero(st) SKM_sk_zero(X509_VERIFY_PARAM, (st))
#define sk_X509_VERIFY_PARAM_push(st, val) SKM_sk_push(X509_VERIFY_PARAM, (st), (val))
#define sk_X509_VERIFY_PARAM_unshift(st, val) SKM_sk_unshift(X509_VERIFY_PARAM, (st), (val))
#define sk_X509_VERIFY_PARAM_find(st, val) SKM_sk_find(X509_VERIFY_PARAM, (st), (val))
#define sk_X509_VERIFY_PARAM_find_ex(st, val) SKM_sk_find_ex(X509_VERIFY_PARAM, (st), (val))
#define sk_X509_VERIFY_PARAM_delete(st, i) SKM_sk_delete(X509_VERIFY_PARAM, (st), (i))
#define sk_X509_VERIFY_PARAM_delete_ptr(st, ptr) SKM_sk_delete_ptr(X509_VERIFY_PARAM, (st), (ptr))
#define sk_X509_VERIFY_PARAM_insert(st, val, i) SKM_sk_insert(X509_VERIFY_PARAM, (st), (val), (i))
#define sk_X509_VERIFY_PARAM_set_cmp_func(st, cmp) SKM_sk_set_cmp_func(X509_VERIFY_PARAM, (st), (cmp))
#define sk_X509_VERIFY_PARAM_dup(st) SKM_sk_dup(X509_VERIFY_PARAM, st)
#define sk_X509_VERIFY_PARAM_pop_free(st, free_func) SKM_sk_pop_free(X509_VERIFY_PARAM, (st), (free_func))
#define sk_X509_VERIFY_PARAM_shift(st) SKM_sk_shift(X509_VERIFY_PARAM, (st))
#define sk_X509_VERIFY_PARAM_pop(st) SKM_sk_pop(X509_VERIFY_PARAM, (st))
#define sk_X509_VERIFY_PARAM_sort(st) SKM_sk_sort(X509_VERIFY_PARAM, (st))
#define sk_X509_VERIFY_PARAM_is_sorted(st) SKM_sk_is_sorted(X509_VERIFY_PARAM, (st))

#define d2i_ASN1_SET_OF_ACCESS_DESCRIPTION(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(ACCESS_DESCRIPTION, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_ACCESS_DESCRIPTION(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(ACCESS_DESCRIPTION, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_ACCESS_DESCRIPTION(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(ACCESS_DESCRIPTION, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_ACCESS_DESCRIPTION(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(ACCESS_DESCRIPTION, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_ASN1_INTEGER(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(ASN1_INTEGER, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_ASN1_INTEGER(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(ASN1_INTEGER, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_ASN1_INTEGER(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(ASN1_INTEGER, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_ASN1_INTEGER(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(ASN1_INTEGER, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_ASN1_OBJECT(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(ASN1_OBJECT, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_ASN1_OBJECT(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(ASN1_OBJECT, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_ASN1_OBJECT(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(ASN1_OBJECT, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_ASN1_OBJECT(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(ASN1_OBJECT, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_ASN1_TYPE(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(ASN1_TYPE, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_ASN1_TYPE(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(ASN1_TYPE, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_ASN1_TYPE(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(ASN1_TYPE, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_ASN1_TYPE(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(ASN1_TYPE, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_DIST_POINT(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(DIST_POINT, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_DIST_POINT(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(DIST_POINT, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_DIST_POINT(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(DIST_POINT, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_DIST_POINT(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(DIST_POINT, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_GENERAL_NAME(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(GENERAL_NAME, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_GENERAL_NAME(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(GENERAL_NAME, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_GENERAL_NAME(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(GENERAL_NAME, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_GENERAL_NAME(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(GENERAL_NAME, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_OCSP_ONEREQ(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(OCSP_ONEREQ, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_OCSP_ONEREQ(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(OCSP_ONEREQ, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_OCSP_ONEREQ(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(OCSP_ONEREQ, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_OCSP_ONEREQ(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(OCSP_ONEREQ, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_OCSP_SINGLERESP(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(OCSP_SINGLERESP, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_OCSP_SINGLERESP(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(OCSP_SINGLERESP, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_OCSP_SINGLERESP(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(OCSP_SINGLERESP, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_OCSP_SINGLERESP(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(OCSP_SINGLERESP, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_PKCS12_SAFEBAG(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(PKCS12_SAFEBAG, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_PKCS12_SAFEBAG(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(PKCS12_SAFEBAG, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_PKCS12_SAFEBAG(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(PKCS12_SAFEBAG, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_PKCS12_SAFEBAG(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(PKCS12_SAFEBAG, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_PKCS7(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(PKCS7, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_PKCS7(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(PKCS7, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_PKCS7(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(PKCS7, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_PKCS7(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(PKCS7, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_PKCS7_RECIP_INFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(PKCS7_RECIP_INFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_PKCS7_RECIP_INFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(PKCS7_RECIP_INFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_PKCS7_RECIP_INFO(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(PKCS7_RECIP_INFO, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_PKCS7_RECIP_INFO(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(PKCS7_RECIP_INFO, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(PKCS7_SIGNER_INFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(PKCS7_SIGNER_INFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_PKCS7_SIGNER_INFO(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(PKCS7_SIGNER_INFO, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_PKCS7_SIGNER_INFO(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(PKCS7_SIGNER_INFO, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_POLICYINFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(POLICYINFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_POLICYINFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(POLICYINFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_POLICYINFO(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(POLICYINFO, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_POLICYINFO(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(POLICYINFO, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_POLICYQUALINFO(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(POLICYQUALINFO, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_POLICYQUALINFO(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(POLICYQUALINFO, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_POLICYQUALINFO(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(POLICYQUALINFO, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_POLICYQUALINFO(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(POLICYQUALINFO, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_SXNETID(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(SXNETID, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_SXNETID(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(SXNETID, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_SXNETID(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(SXNETID, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_SXNETID(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(SXNETID, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_X509(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(X509, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_X509(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(X509, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_X509(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(X509, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_X509(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(X509, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_X509_ALGOR(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(X509_ALGOR, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_X509_ALGOR(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(X509_ALGOR, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_X509_ALGOR(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(X509_ALGOR, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_X509_ALGOR(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(X509_ALGOR, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_X509_ATTRIBUTE(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(X509_ATTRIBUTE, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_X509_ATTRIBUTE(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(X509_ATTRIBUTE, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_X509_ATTRIBUTE(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(X509_ATTRIBUTE, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_X509_ATTRIBUTE(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(X509_ATTRIBUTE, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_X509_CRL(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(X509_CRL, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_X509_CRL(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(X509_CRL, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_X509_CRL(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(X509_CRL, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_X509_CRL(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(X509_CRL, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_X509_EXTENSION(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(X509_EXTENSION, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_X509_EXTENSION(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(X509_EXTENSION, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_X509_EXTENSION(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(X509_EXTENSION, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_X509_EXTENSION(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(X509_EXTENSION, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_X509_NAME_ENTRY(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(X509_NAME_ENTRY, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_X509_NAME_ENTRY(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(X509_NAME_ENTRY, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_X509_NAME_ENTRY(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(X509_NAME_ENTRY, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_X509_NAME_ENTRY(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(X509_NAME_ENTRY, (buf), (len), (d2i_func), (free_func))

#define d2i_ASN1_SET_OF_X509_REVOKED(st, pp, length, d2i_func, free_func, ex_tag, ex_class) \
	SKM_ASN1_SET_OF_d2i(X509_REVOKED, (st), (pp), (length), (d2i_func), (free_func), (ex_tag), (ex_class)) 
#define i2d_ASN1_SET_OF_X509_REVOKED(st, pp, i2d_func, ex_tag, ex_class, is_set) \
	SKM_ASN1_SET_OF_i2d(X509_REVOKED, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
#define ASN1_seq_pack_X509_REVOKED(st, i2d_func, buf, len) \
	SKM_ASN1_seq_pack(X509_REVOKED, (st), (i2d_func), (buf), (len))
#define ASN1_seq_unpack_X509_REVOKED(buf, len, d2i_func, free_func) \
	SKM_ASN1_seq_unpack(X509_REVOKED, (buf), (len), (d2i_func), (free_func))

#define PKCS12_decrypt_d2i_PKCS12_SAFEBAG(algor, d2i_func, free_func, pass, passlen, oct, seq) \
	SKM_PKCS12_decrypt_d2i(PKCS12_SAFEBAG, (algor), (d2i_func), (free_func), (pass), (passlen), (oct), (seq))

#define PKCS12_decrypt_d2i_PKCS7(algor, d2i_func, free_func, pass, passlen, oct, seq) \
	SKM_PKCS12_decrypt_d2i(PKCS7, (algor), (d2i_func), (free_func), (pass), (passlen), (oct), (seq))
/* End of util/mkstack.pl block, you may now edit :-) */

#endif /* !defined HEADER_SAFESTACK_H */
xmail-1.27/win32ssl/include/openssl/dh.h0000755000175000017500000002071611341640430017372 0ustar  davidedavide/* crypto/dh/dh.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_DH_H
#define HEADER_DH_H

#include 

#ifdef OPENSSL_NO_DH
#error DH is disabled.
#endif

#ifndef OPENSSL_NO_BIO
#include 
#endif
#include 
#ifndef OPENSSL_NO_DEPRECATED
#include 
#endif
	
#ifndef OPENSSL_DH_MAX_MODULUS_BITS
# define OPENSSL_DH_MAX_MODULUS_BITS	10000
#endif

#define OPENSSL_DH_FIPS_MIN_MODULUS_BITS 1024

#define DH_FLAG_CACHE_MONT_P     0x01
#define DH_FLAG_NO_EXP_CONSTTIME 0x02 /* new with 0.9.7h; the built-in DH
                                       * implementation now uses constant time
                                       * modular exponentiation for secret exponents
                                       * by default. This flag causes the
                                       * faster variable sliding window method to
                                       * be used for all exponents.
                                       */

#ifdef  __cplusplus
extern "C" {
#endif

/* Already defined in ossl_typ.h */
/* typedef struct dh_st DH; */
/* typedef struct dh_method DH_METHOD; */

struct dh_method
	{
	const char *name;
	/* Methods here */
	int (*generate_key)(DH *dh);
	int (*compute_key)(unsigned char *key,const BIGNUM *pub_key,DH *dh);
	int (*bn_mod_exp)(const DH *dh, BIGNUM *r, const BIGNUM *a,
				const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx,
				BN_MONT_CTX *m_ctx); /* Can be null */

	int (*init)(DH *dh);
	int (*finish)(DH *dh);
	int flags;
	char *app_data;
	/* If this is non-NULL, it will be used to generate parameters */
	int (*generate_params)(DH *dh, int prime_len, int generator, BN_GENCB *cb);
	};

struct dh_st
	{
	/* This first argument is used to pick up errors when
	 * a DH is passed instead of a EVP_PKEY */
	int pad;
	int version;
	BIGNUM *p;
	BIGNUM *g;
	long length; /* optional */
	BIGNUM *pub_key;	/* g^x */
	BIGNUM *priv_key;	/* x */

	int flags;
	BN_MONT_CTX *method_mont_p;
	/* Place holders if we want to do X9.42 DH */
	BIGNUM *q;
	BIGNUM *j;
	unsigned char *seed;
	int seedlen;
	BIGNUM *counter;

	int references;
	CRYPTO_EX_DATA ex_data;
	const DH_METHOD *meth;
	ENGINE *engine;
	};

#define DH_GENERATOR_2		2
/* #define DH_GENERATOR_3	3 */
#define DH_GENERATOR_5		5

/* DH_check error codes */
#define DH_CHECK_P_NOT_PRIME		0x01
#define DH_CHECK_P_NOT_SAFE_PRIME	0x02
#define DH_UNABLE_TO_CHECK_GENERATOR	0x04
#define DH_NOT_SUITABLE_GENERATOR	0x08

/* DH_check_pub_key error codes */
#define DH_CHECK_PUBKEY_TOO_SMALL	0x01
#define DH_CHECK_PUBKEY_TOO_LARGE	0x02

/* primes p where (p-1)/2 is prime too are called "safe"; we define
   this for backward compatibility: */
#define DH_CHECK_P_NOT_STRONG_PRIME	DH_CHECK_P_NOT_SAFE_PRIME

#define DHparams_dup(x) ASN1_dup_of_const(DH,i2d_DHparams,d2i_DHparams,x)
#define d2i_DHparams_fp(fp,x) (DH *)ASN1_d2i_fp((char *(*)())DH_new, \
		(char *(*)())d2i_DHparams,(fp),(unsigned char **)(x))
#define i2d_DHparams_fp(fp,x) ASN1_i2d_fp(i2d_DHparams,(fp), \
		(unsigned char *)(x))
#define d2i_DHparams_bio(bp,x) ASN1_d2i_bio_of(DH,DH_new,d2i_DHparams,bp,x)
#define i2d_DHparams_bio(bp,x) ASN1_i2d_bio_of_const(DH,i2d_DHparams,bp,x)

const DH_METHOD *DH_OpenSSL(void);

#ifdef OPENSSL_FIPS
DH *	FIPS_dh_new(void);
void	FIPS_dh_free(DH *dh);
#endif

void DH_set_default_method(const DH_METHOD *meth);
const DH_METHOD *DH_get_default_method(void);
int DH_set_method(DH *dh, const DH_METHOD *meth);
DH *DH_new_method(ENGINE *engine);

DH *	DH_new(void);
void	DH_free(DH *dh);
int	DH_up_ref(DH *dh);
int	DH_size(const DH *dh);
int DH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
	     CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
int DH_set_ex_data(DH *d, int idx, void *arg);
void *DH_get_ex_data(DH *d, int idx);

/* Deprecated version */
#ifndef OPENSSL_NO_DEPRECATED
DH *	DH_generate_parameters(int prime_len,int generator,
		void (*callback)(int,int,void *),void *cb_arg);
#endif /* !defined(OPENSSL_NO_DEPRECATED) */

/* New version */
int	DH_generate_parameters_ex(DH *dh, int prime_len,int generator, BN_GENCB *cb);

int	DH_check(const DH *dh,int *codes);
int	DH_check_pub_key(const DH *dh,const BIGNUM *pub_key, int *codes);
int	DH_generate_key(DH *dh);
int	DH_compute_key(unsigned char *key,const BIGNUM *pub_key,DH *dh);
DH *	d2i_DHparams(DH **a,const unsigned char **pp, long length);
int	i2d_DHparams(const DH *a,unsigned char **pp);
#ifndef OPENSSL_NO_FP_API
int	DHparams_print_fp(FILE *fp, const DH *x);
#endif
#ifndef OPENSSL_NO_BIO
int	DHparams_print(BIO *bp, const DH *x);
#else
int	DHparams_print(char *bp, const DH *x);
#endif

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_DH_strings(void);

/* Error codes for the DH functions. */

/* Function codes. */
#define DH_F_COMPUTE_KEY				 102
#define DH_F_DHPARAMS_PRINT				 100
#define DH_F_DHPARAMS_PRINT_FP				 101
#define DH_F_DH_BUILTIN_GENPARAMS			 106
#define DH_F_DH_COMPUTE_KEY				 107
#define DH_F_DH_GENERATE_KEY				 108
#define DH_F_DH_GENERATE_PARAMETERS			 109
#define DH_F_DH_NEW_METHOD				 105
#define DH_F_GENERATE_KEY				 103
#define DH_F_GENERATE_PARAMETERS			 104

/* Reason codes. */
#define DH_R_BAD_GENERATOR				 101
#define DH_R_INVALID_PUBKEY				 102
#define DH_R_KEY_SIZE_TOO_SMALL				 104
#define DH_R_MODULUS_TOO_LARGE				 103
#define DH_R_NO_PRIVATE_VALUE				 100

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/des.h0000755000175000017500000002476011341640430017555 0ustar  davidedavide/* crypto/des/des.h */
/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_NEW_DES_H
#define HEADER_NEW_DES_H

#include 	/* OPENSSL_EXTERN, OPENSSL_NO_DES,
				   DES_LONG (via openssl/opensslconf.h */

#ifdef OPENSSL_NO_DES
#error DES is disabled.
#endif

#ifdef OPENSSL_BUILD_SHLIBCRYPTO
# undef OPENSSL_EXTERN
# define OPENSSL_EXTERN OPENSSL_EXPORT
#endif

#ifdef  __cplusplus
extern "C" {
#endif

typedef unsigned char DES_cblock[8];
typedef /* const */ unsigned char const_DES_cblock[8];
/* With "const", gcc 2.8.1 on Solaris thinks that DES_cblock *
 * and const_DES_cblock * are incompatible pointer types. */

typedef struct DES_ks
    {
    union
	{
	DES_cblock cblock;
	/* make sure things are correct size on machines with
	 * 8 byte longs */
	DES_LONG deslong[2];
	} ks[16];
    } DES_key_schedule;

#ifndef OPENSSL_DISABLE_OLD_DES_SUPPORT
# ifndef OPENSSL_ENABLE_OLD_DES_SUPPORT
#  define OPENSSL_ENABLE_OLD_DES_SUPPORT
# endif
#endif

#ifdef OPENSSL_ENABLE_OLD_DES_SUPPORT
# include 
#endif

#define DES_KEY_SZ 	(sizeof(DES_cblock))
#define DES_SCHEDULE_SZ (sizeof(DES_key_schedule))

#define DES_ENCRYPT	1
#define DES_DECRYPT	0

#define DES_CBC_MODE	0
#define DES_PCBC_MODE	1

#define DES_ecb2_encrypt(i,o,k1,k2,e) \
	DES_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e))

#define DES_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \
	DES_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e))

#define DES_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \
	DES_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e))

#define DES_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \
	DES_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n))

OPENSSL_DECLARE_GLOBAL(int,DES_check_key);	/* defaults to false */
#define DES_check_key OPENSSL_GLOBAL_REF(DES_check_key)
OPENSSL_DECLARE_GLOBAL(int,DES_rw_mode);	/* defaults to DES_PCBC_MODE */
#define DES_rw_mode OPENSSL_GLOBAL_REF(DES_rw_mode)

const char *DES_options(void);
void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output,
		      DES_key_schedule *ks1,DES_key_schedule *ks2,
		      DES_key_schedule *ks3, int enc);
DES_LONG DES_cbc_cksum(const unsigned char *input,DES_cblock *output,
		       long length,DES_key_schedule *schedule,
		       const_DES_cblock *ivec);
/* DES_cbc_encrypt does not update the IV!  Use DES_ncbc_encrypt instead. */
void DES_cbc_encrypt(const unsigned char *input,unsigned char *output,
		     long length,DES_key_schedule *schedule,DES_cblock *ivec,
		     int enc);
void DES_ncbc_encrypt(const unsigned char *input,unsigned char *output,
		      long length,DES_key_schedule *schedule,DES_cblock *ivec,
		      int enc);
void DES_xcbc_encrypt(const unsigned char *input,unsigned char *output,
		      long length,DES_key_schedule *schedule,DES_cblock *ivec,
		      const_DES_cblock *inw,const_DES_cblock *outw,int enc);
void DES_cfb_encrypt(const unsigned char *in,unsigned char *out,int numbits,
		     long length,DES_key_schedule *schedule,DES_cblock *ivec,
		     int enc);
void DES_ecb_encrypt(const_DES_cblock *input,DES_cblock *output,
		     DES_key_schedule *ks,int enc);

/* 	This is the DES encryption function that gets called by just about
	every other DES routine in the library.  You should not use this
	function except to implement 'modes' of DES.  I say this because the
	functions that call this routine do the conversion from 'char *' to
	long, and this needs to be done to make sure 'non-aligned' memory
	access do not occur.  The characters are loaded 'little endian'.
	Data is a pointer to 2 unsigned long's and ks is the
	DES_key_schedule to use.  enc, is non zero specifies encryption,
	zero if decryption. */
void DES_encrypt1(DES_LONG *data,DES_key_schedule *ks, int enc);

/* 	This functions is the same as DES_encrypt1() except that the DES
	initial permutation (IP) and final permutation (FP) have been left
	out.  As for DES_encrypt1(), you should not use this function.
	It is used by the routines in the library that implement triple DES.
	IP() DES_encrypt2() DES_encrypt2() DES_encrypt2() FP() is the same
	as DES_encrypt1() DES_encrypt1() DES_encrypt1() except faster :-). */
void DES_encrypt2(DES_LONG *data,DES_key_schedule *ks, int enc);

void DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1,
		  DES_key_schedule *ks2, DES_key_schedule *ks3);
void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1,
		  DES_key_schedule *ks2, DES_key_schedule *ks3);
void DES_ede3_cbc_encrypt(const unsigned char *input,unsigned char *output, 
			  long length,
			  DES_key_schedule *ks1,DES_key_schedule *ks2,
			  DES_key_schedule *ks3,DES_cblock *ivec,int enc);
void DES_ede3_cbcm_encrypt(const unsigned char *in,unsigned char *out,
			   long length,
			   DES_key_schedule *ks1,DES_key_schedule *ks2,
			   DES_key_schedule *ks3,
			   DES_cblock *ivec1,DES_cblock *ivec2,
			   int enc);
void DES_ede3_cfb64_encrypt(const unsigned char *in,unsigned char *out,
			    long length,DES_key_schedule *ks1,
			    DES_key_schedule *ks2,DES_key_schedule *ks3,
			    DES_cblock *ivec,int *num,int enc);
void DES_ede3_cfb_encrypt(const unsigned char *in,unsigned char *out,
			  int numbits,long length,DES_key_schedule *ks1,
			  DES_key_schedule *ks2,DES_key_schedule *ks3,
			  DES_cblock *ivec,int enc);
void DES_ede3_ofb64_encrypt(const unsigned char *in,unsigned char *out,
			    long length,DES_key_schedule *ks1,
			    DES_key_schedule *ks2,DES_key_schedule *ks3,
			    DES_cblock *ivec,int *num);
#if 0
void DES_xwhite_in2out(const_DES_cblock *DES_key,const_DES_cblock *in_white,
		       DES_cblock *out_white);
#endif

int DES_enc_read(int fd,void *buf,int len,DES_key_schedule *sched,
		 DES_cblock *iv);
int DES_enc_write(int fd,const void *buf,int len,DES_key_schedule *sched,
		  DES_cblock *iv);
char *DES_fcrypt(const char *buf,const char *salt, char *ret);
char *DES_crypt(const char *buf,const char *salt);
void DES_ofb_encrypt(const unsigned char *in,unsigned char *out,int numbits,
		     long length,DES_key_schedule *schedule,DES_cblock *ivec);
void DES_pcbc_encrypt(const unsigned char *input,unsigned char *output,
		      long length,DES_key_schedule *schedule,DES_cblock *ivec,
		      int enc);
DES_LONG DES_quad_cksum(const unsigned char *input,DES_cblock output[],
			long length,int out_count,DES_cblock *seed);
int DES_random_key(DES_cblock *ret);
void DES_set_odd_parity(DES_cblock *key);
int DES_check_key_parity(const_DES_cblock *key);
int DES_is_weak_key(const_DES_cblock *key);
/* DES_set_key (= set_key = DES_key_sched = key_sched) calls
 * DES_set_key_checked if global variable DES_check_key is set,
 * DES_set_key_unchecked otherwise. */
int DES_set_key(const_DES_cblock *key,DES_key_schedule *schedule);
int DES_key_sched(const_DES_cblock *key,DES_key_schedule *schedule);
int DES_set_key_checked(const_DES_cblock *key,DES_key_schedule *schedule);
void DES_set_key_unchecked(const_DES_cblock *key,DES_key_schedule *schedule);
void DES_string_to_key(const char *str,DES_cblock *key);
void DES_string_to_2keys(const char *str,DES_cblock *key1,DES_cblock *key2);
void DES_cfb64_encrypt(const unsigned char *in,unsigned char *out,long length,
		       DES_key_schedule *schedule,DES_cblock *ivec,int *num,
		       int enc);
void DES_ofb64_encrypt(const unsigned char *in,unsigned char *out,long length,
		       DES_key_schedule *schedule,DES_cblock *ivec,int *num);

int DES_read_password(DES_cblock *key, const char *prompt, int verify);
int DES_read_2passwords(DES_cblock *key1, DES_cblock *key2, const char *prompt,
	int verify);

#define DES_fixup_key_parity DES_set_odd_parity

#ifdef  __cplusplus
}
#endif

#endif
xmail-1.27/win32ssl/include/openssl/ssl23.h0000755000175000017500000000724011341640430017742 0ustar  davidedavide/* ssl/ssl23.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_SSL23_H 
#define HEADER_SSL23_H 

#ifdef  __cplusplus
extern "C" {
#endif

/*client */
/* write to server */
#define SSL23_ST_CW_CLNT_HELLO_A	(0x210|SSL_ST_CONNECT)
#define SSL23_ST_CW_CLNT_HELLO_B	(0x211|SSL_ST_CONNECT)
/* read from server */
#define SSL23_ST_CR_SRVR_HELLO_A	(0x220|SSL_ST_CONNECT)
#define SSL23_ST_CR_SRVR_HELLO_B	(0x221|SSL_ST_CONNECT)

/* server */
/* read from client */
#define SSL23_ST_SR_CLNT_HELLO_A	(0x210|SSL_ST_ACCEPT)
#define SSL23_ST_SR_CLNT_HELLO_B	(0x211|SSL_ST_ACCEPT)

#ifdef  __cplusplus
}
#endif
#endif

xmail-1.27/win32ssl/include/openssl/conf_api.h0000755000175000017500000000776011341640430020561 0ustar  davidedavide/* conf_api.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef  HEADER_CONF_API_H
#define HEADER_CONF_API_H

#include 
#include 

#ifdef  __cplusplus
extern "C" {
#endif

/* Up until OpenSSL 0.9.5a, this was new_section */
CONF_VALUE *_CONF_new_section(CONF *conf, const char *section);
/* Up until OpenSSL 0.9.5a, this was get_section */
CONF_VALUE *_CONF_get_section(const CONF *conf, const char *section);
/* Up until OpenSSL 0.9.5a, this was CONF_get_section */
STACK_OF(CONF_VALUE) *_CONF_get_section_values(const CONF *conf,
					       const char *section);

int _CONF_add_string(CONF *conf, CONF_VALUE *section, CONF_VALUE *value);
char *_CONF_get_string(const CONF *conf, const char *section,
		       const char *name);
long _CONF_get_number(const CONF *conf, const char *section, const char *name);

int _CONF_new_data(CONF *conf);
void _CONF_free_data(CONF *conf);

#ifdef  __cplusplus
}
#endif
#endif

xmail-1.27/win32ssl/include/openssl/ebcdic.h0000755000175000017500000000103411341640430020200 0ustar  davidedavide/* crypto/ebcdic.h */

#ifndef HEADER_EBCDIC_H
#define HEADER_EBCDIC_H

#include 

/* Avoid name clashes with other applications */
#define os_toascii   _openssl_os_toascii
#define os_toebcdic  _openssl_os_toebcdic
#define ebcdic2ascii _openssl_ebcdic2ascii
#define ascii2ebcdic _openssl_ascii2ebcdic

extern const unsigned char os_toascii[256];
extern const unsigned char os_toebcdic[256];
void *ebcdic2ascii(void *dest, const void *srce, size_t count);
void *ascii2ebcdic(void *dest, const void *srce, size_t count);

#endif
xmail-1.27/win32ssl/include/openssl/engine.h0000755000175000017500000011320711341640430020242 0ustar  davidedavide/* openssl/engine.h */
/* Written by Geoff Thorpe (geoff@geoffthorpe.net) for the OpenSSL
 * project 2000.
 */
/* ====================================================================
 * Copyright (c) 1999-2004 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    licensing@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */
/* ====================================================================
 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
 * ECDH support in OpenSSL originally developed by 
 * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
 */

#ifndef HEADER_ENGINE_H
#define HEADER_ENGINE_H

#include 

#ifdef OPENSSL_NO_ENGINE
#error ENGINE is disabled.
#endif

#ifndef OPENSSL_NO_DEPRECATED
#include 
#ifndef OPENSSL_NO_RSA
#include 
#endif
#ifndef OPENSSL_NO_DSA
#include 
#endif
#ifndef OPENSSL_NO_DH
#include 
#endif
#ifndef OPENSSL_NO_ECDH
#include 
#endif
#ifndef OPENSSL_NO_ECDSA
#include 
#endif
#include 
#include 
#include 
#include 
#endif

#include 

#include 
#include 

#ifdef  __cplusplus
extern "C" {
#endif

/* These flags are used to control combinations of algorithm (methods)
 * by bitwise "OR"ing. */
#define ENGINE_METHOD_RSA		(unsigned int)0x0001
#define ENGINE_METHOD_DSA		(unsigned int)0x0002
#define ENGINE_METHOD_DH		(unsigned int)0x0004
#define ENGINE_METHOD_RAND		(unsigned int)0x0008
#define ENGINE_METHOD_ECDH		(unsigned int)0x0010
#define ENGINE_METHOD_ECDSA		(unsigned int)0x0020
#define ENGINE_METHOD_CIPHERS		(unsigned int)0x0040
#define ENGINE_METHOD_DIGESTS		(unsigned int)0x0080
#define ENGINE_METHOD_STORE		(unsigned int)0x0100
/* Obvious all-or-nothing cases. */
#define ENGINE_METHOD_ALL		(unsigned int)0xFFFF
#define ENGINE_METHOD_NONE		(unsigned int)0x0000

/* This(ese) flag(s) controls behaviour of the ENGINE_TABLE mechanism used
 * internally to control registration of ENGINE implementations, and can be set
 * by ENGINE_set_table_flags(). The "NOINIT" flag prevents attempts to
 * initialise registered ENGINEs if they are not already initialised. */
#define ENGINE_TABLE_FLAG_NOINIT	(unsigned int)0x0001

/* ENGINE flags that can be set by ENGINE_set_flags(). */
/* #define ENGINE_FLAGS_MALLOCED	0x0001 */ /* Not used */

/* This flag is for ENGINEs that wish to handle the various 'CMD'-related
 * control commands on their own. Without this flag, ENGINE_ctrl() handles these
 * control commands on behalf of the ENGINE using their "cmd_defns" data. */
#define ENGINE_FLAGS_MANUAL_CMD_CTRL	(int)0x0002

/* This flag is for ENGINEs who return new duplicate structures when found via
 * "ENGINE_by_id()". When an ENGINE must store state (eg. if ENGINE_ctrl()
 * commands are called in sequence as part of some stateful process like
 * key-generation setup and execution), it can set this flag - then each attempt
 * to obtain the ENGINE will result in it being copied into a new structure.
 * Normally, ENGINEs don't declare this flag so ENGINE_by_id() just increments
 * the existing ENGINE's structural reference count. */
#define ENGINE_FLAGS_BY_ID_COPY		(int)0x0004

/* ENGINEs can support their own command types, and these flags are used in
 * ENGINE_CTRL_GET_CMD_FLAGS to indicate to the caller what kind of input each
 * command expects. Currently only numeric and string input is supported. If a
 * control command supports none of the _NUMERIC, _STRING, or _NO_INPUT options,
 * then it is regarded as an "internal" control command - and not for use in
 * config setting situations. As such, they're not available to the
 * ENGINE_ctrl_cmd_string() function, only raw ENGINE_ctrl() access. Changes to
 * this list of 'command types' should be reflected carefully in
 * ENGINE_cmd_is_executable() and ENGINE_ctrl_cmd_string(). */

/* accepts a 'long' input value (3rd parameter to ENGINE_ctrl) */
#define ENGINE_CMD_FLAG_NUMERIC		(unsigned int)0x0001
/* accepts string input (cast from 'void*' to 'const char *', 4th parameter to
 * ENGINE_ctrl) */
#define ENGINE_CMD_FLAG_STRING		(unsigned int)0x0002
/* Indicates that the control command takes *no* input. Ie. the control command
 * is unparameterised. */
#define ENGINE_CMD_FLAG_NO_INPUT	(unsigned int)0x0004
/* Indicates that the control command is internal. This control command won't
 * be shown in any output, and is only usable through the ENGINE_ctrl_cmd()
 * function. */
#define ENGINE_CMD_FLAG_INTERNAL	(unsigned int)0x0008

/* NB: These 3 control commands are deprecated and should not be used. ENGINEs
 * relying on these commands should compile conditional support for
 * compatibility (eg. if these symbols are defined) but should also migrate the
 * same functionality to their own ENGINE-specific control functions that can be
 * "discovered" by calling applications. The fact these control commands
 * wouldn't be "executable" (ie. usable by text-based config) doesn't change the
 * fact that application code can find and use them without requiring per-ENGINE
 * hacking. */

/* These flags are used to tell the ctrl function what should be done.
 * All command numbers are shared between all engines, even if some don't
 * make sense to some engines.  In such a case, they do nothing but return
 * the error ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED. */
#define ENGINE_CTRL_SET_LOGSTREAM		1
#define ENGINE_CTRL_SET_PASSWORD_CALLBACK	2
#define ENGINE_CTRL_HUP				3 /* Close and reinitialise any
						     handles/connections etc. */
#define ENGINE_CTRL_SET_USER_INTERFACE          4 /* Alternative to callback */
#define ENGINE_CTRL_SET_CALLBACK_DATA           5 /* User-specific data, used
						     when calling the password
						     callback and the user
						     interface */
#define ENGINE_CTRL_LOAD_CONFIGURATION		6 /* Load a configuration, given
						     a string that represents a
						     file name or so */
#define ENGINE_CTRL_LOAD_SECTION		7 /* Load data from a given
						     section in the already loaded
						     configuration */

/* These control commands allow an application to deal with an arbitrary engine
 * in a dynamic way. Warn: Negative return values indicate errors FOR THESE
 * COMMANDS because zero is used to indicate 'end-of-list'. Other commands,
 * including ENGINE-specific command types, return zero for an error.
 *
 * An ENGINE can choose to implement these ctrl functions, and can internally
 * manage things however it chooses - it does so by setting the
 * ENGINE_FLAGS_MANUAL_CMD_CTRL flag (using ENGINE_set_flags()). Otherwise the
 * ENGINE_ctrl() code handles this on the ENGINE's behalf using the cmd_defns
 * data (set using ENGINE_set_cmd_defns()). This means an ENGINE's ctrl()
 * handler need only implement its own commands - the above "meta" commands will
 * be taken care of. */

/* Returns non-zero if the supplied ENGINE has a ctrl() handler. If "not", then
 * all the remaining control commands will return failure, so it is worth
 * checking this first if the caller is trying to "discover" the engine's
 * capabilities and doesn't want errors generated unnecessarily. */
#define ENGINE_CTRL_HAS_CTRL_FUNCTION		10
/* Returns a positive command number for the first command supported by the
 * engine. Returns zero if no ctrl commands are supported. */
#define ENGINE_CTRL_GET_FIRST_CMD_TYPE		11
/* The 'long' argument specifies a command implemented by the engine, and the
 * return value is the next command supported, or zero if there are no more. */
#define ENGINE_CTRL_GET_NEXT_CMD_TYPE		12
/* The 'void*' argument is a command name (cast from 'const char *'), and the
 * return value is the command that corresponds to it. */
#define ENGINE_CTRL_GET_CMD_FROM_NAME		13
/* The next two allow a command to be converted into its corresponding string
 * form. In each case, the 'long' argument supplies the command. In the NAME_LEN
 * case, the return value is the length of the command name (not counting a
 * trailing EOL). In the NAME case, the 'void*' argument must be a string buffer
 * large enough, and it will be populated with the name of the command (WITH a
 * trailing EOL). */
#define ENGINE_CTRL_GET_NAME_LEN_FROM_CMD	14
#define ENGINE_CTRL_GET_NAME_FROM_CMD		15
/* The next two are similar but give a "short description" of a command. */
#define ENGINE_CTRL_GET_DESC_LEN_FROM_CMD	16
#define ENGINE_CTRL_GET_DESC_FROM_CMD		17
/* With this command, the return value is the OR'd combination of
 * ENGINE_CMD_FLAG_*** values that indicate what kind of input a given
 * engine-specific ctrl command expects. */
#define ENGINE_CTRL_GET_CMD_FLAGS		18

/* ENGINE implementations should start the numbering of their own control
 * commands from this value. (ie. ENGINE_CMD_BASE, ENGINE_CMD_BASE + 1, etc). */
#define ENGINE_CMD_BASE				200

/* NB: These 2 nCipher "chil" control commands are deprecated, and their
 * functionality is now available through ENGINE-specific control commands
 * (exposed through the above-mentioned 'CMD'-handling). Code using these 2
 * commands should be migrated to the more general command handling before these
 * are removed. */

/* Flags specific to the nCipher "chil" engine */
#define ENGINE_CTRL_CHIL_SET_FORKCHECK		100
	/* Depending on the value of the (long)i argument, this sets or
	 * unsets the SimpleForkCheck flag in the CHIL API to enable or
	 * disable checking and workarounds for applications that fork().
	 */
#define ENGINE_CTRL_CHIL_NO_LOCKING		101
	/* This prevents the initialisation function from providing mutex
	 * callbacks to the nCipher library. */

/* If an ENGINE supports its own specific control commands and wishes the
 * framework to handle the above 'ENGINE_CMD_***'-manipulation commands on its
 * behalf, it should supply a null-terminated array of ENGINE_CMD_DEFN entries
 * to ENGINE_set_cmd_defns(). It should also implement a ctrl() handler that
 * supports the stated commands (ie. the "cmd_num" entries as described by the
 * array). NB: The array must be ordered in increasing order of cmd_num.
 * "null-terminated" means that the last ENGINE_CMD_DEFN element has cmd_num set
 * to zero and/or cmd_name set to NULL. */
typedef struct ENGINE_CMD_DEFN_st
	{
	unsigned int cmd_num; /* The command number */
	const char *cmd_name; /* The command name itself */
	const char *cmd_desc; /* A short description of the command */
	unsigned int cmd_flags; /* The input the command expects */
	} ENGINE_CMD_DEFN;

/* Generic function pointer */
typedef int (*ENGINE_GEN_FUNC_PTR)(void);
/* Generic function pointer taking no arguments */
typedef int (*ENGINE_GEN_INT_FUNC_PTR)(ENGINE *);
/* Specific control function pointer */
typedef int (*ENGINE_CTRL_FUNC_PTR)(ENGINE *, int, long, void *, void (*f)(void));
/* Generic load_key function pointer */
typedef EVP_PKEY * (*ENGINE_LOAD_KEY_PTR)(ENGINE *, const char *,
	UI_METHOD *ui_method, void *callback_data);
typedef int (*ENGINE_SSL_CLIENT_CERT_PTR)(ENGINE *, SSL *ssl,
	STACK_OF(X509_NAME) *ca_dn, X509 **pcert, EVP_PKEY **pkey,
	STACK_OF(X509) **pother, UI_METHOD *ui_method, void *callback_data);
/* These callback types are for an ENGINE's handler for cipher and digest logic.
 * These handlers have these prototypes;
 *   int foo(ENGINE *e, const EVP_CIPHER **cipher, const int **nids, int nid);
 *   int foo(ENGINE *e, const EVP_MD **digest, const int **nids, int nid);
 * Looking at how to implement these handlers in the case of cipher support, if
 * the framework wants the EVP_CIPHER for 'nid', it will call;
 *   foo(e, &p_evp_cipher, NULL, nid);    (return zero for failure)
 * If the framework wants a list of supported 'nid's, it will call;
 *   foo(e, NULL, &p_nids, 0); (returns number of 'nids' or -1 for error)
 */
/* Returns to a pointer to the array of supported cipher 'nid's. If the second
 * parameter is non-NULL it is set to the size of the returned array. */
typedef int (*ENGINE_CIPHERS_PTR)(ENGINE *, const EVP_CIPHER **, const int **, int);
typedef int (*ENGINE_DIGESTS_PTR)(ENGINE *, const EVP_MD **, const int **, int);

/* STRUCTURE functions ... all of these functions deal with pointers to ENGINE
 * structures where the pointers have a "structural reference". This means that
 * their reference is to allowed access to the structure but it does not imply
 * that the structure is functional. To simply increment or decrement the
 * structural reference count, use ENGINE_by_id and ENGINE_free. NB: This is not
 * required when iterating using ENGINE_get_next as it will automatically
 * decrement the structural reference count of the "current" ENGINE and
 * increment the structural reference count of the ENGINE it returns (unless it
 * is NULL). */

/* Get the first/last "ENGINE" type available. */
ENGINE *ENGINE_get_first(void);
ENGINE *ENGINE_get_last(void);
/* Iterate to the next/previous "ENGINE" type (NULL = end of the list). */
ENGINE *ENGINE_get_next(ENGINE *e);
ENGINE *ENGINE_get_prev(ENGINE *e);
/* Add another "ENGINE" type into the array. */
int ENGINE_add(ENGINE *e);
/* Remove an existing "ENGINE" type from the array. */
int ENGINE_remove(ENGINE *e);
/* Retrieve an engine from the list by its unique "id" value. */
ENGINE *ENGINE_by_id(const char *id);
/* Add all the built-in engines. */
void ENGINE_load_openssl(void);
void ENGINE_load_dynamic(void);
#ifndef OPENSSL_NO_STATIC_ENGINE
void ENGINE_load_4758cca(void);
void ENGINE_load_aep(void);
void ENGINE_load_atalla(void);
void ENGINE_load_chil(void);
void ENGINE_load_cswift(void);
#ifndef OPENSSL_NO_GMP
void ENGINE_load_gmp(void);
#endif
void ENGINE_load_nuron(void);
void ENGINE_load_sureware(void);
void ENGINE_load_ubsec(void);
#endif
void ENGINE_load_cryptodev(void);
void ENGINE_load_padlock(void);
void ENGINE_load_builtin_engines(void);
#ifndef OPENSSL_NO_CAPIENG
void ENGINE_load_capi(void);
#endif

/* Get and set global flags (ENGINE_TABLE_FLAG_***) for the implementation
 * "registry" handling. */
unsigned int ENGINE_get_table_flags(void);
void ENGINE_set_table_flags(unsigned int flags);

/* Manage registration of ENGINEs per "table". For each type, there are 3
 * functions;
 *   ENGINE_register_***(e) - registers the implementation from 'e' (if it has one)
 *   ENGINE_unregister_***(e) - unregister the implementation from 'e'
 *   ENGINE_register_all_***() - call ENGINE_register_***() for each 'e' in the list
 * Cleanup is automatically registered from each table when required, so
 * ENGINE_cleanup() will reverse any "register" operations. */

int ENGINE_register_RSA(ENGINE *e);
void ENGINE_unregister_RSA(ENGINE *e);
void ENGINE_register_all_RSA(void);

int ENGINE_register_DSA(ENGINE *e);
void ENGINE_unregister_DSA(ENGINE *e);
void ENGINE_register_all_DSA(void);

int ENGINE_register_ECDH(ENGINE *e);
void ENGINE_unregister_ECDH(ENGINE *e);
void ENGINE_register_all_ECDH(void);

int ENGINE_register_ECDSA(ENGINE *e);
void ENGINE_unregister_ECDSA(ENGINE *e);
void ENGINE_register_all_ECDSA(void);

int ENGINE_register_DH(ENGINE *e);
void ENGINE_unregister_DH(ENGINE *e);
void ENGINE_register_all_DH(void);

int ENGINE_register_RAND(ENGINE *e);
void ENGINE_unregister_RAND(ENGINE *e);
void ENGINE_register_all_RAND(void);

int ENGINE_register_STORE(ENGINE *e);
void ENGINE_unregister_STORE(ENGINE *e);
void ENGINE_register_all_STORE(void);

int ENGINE_register_ciphers(ENGINE *e);
void ENGINE_unregister_ciphers(ENGINE *e);
void ENGINE_register_all_ciphers(void);

int ENGINE_register_digests(ENGINE *e);
void ENGINE_unregister_digests(ENGINE *e);
void ENGINE_register_all_digests(void);

/* These functions register all support from the above categories. Note, use of
 * these functions can result in static linkage of code your application may not
 * need. If you only need a subset of functionality, consider using more
 * selective initialisation. */
int ENGINE_register_complete(ENGINE *e);
int ENGINE_register_all_complete(void);

/* Send parametrised control commands to the engine. The possibilities to send
 * down an integer, a pointer to data or a function pointer are provided. Any of
 * the parameters may or may not be NULL, depending on the command number. In
 * actuality, this function only requires a structural (rather than functional)
 * reference to an engine, but many control commands may require the engine be
 * functional. The caller should be aware of trying commands that require an
 * operational ENGINE, and only use functional references in such situations. */
int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)(void));

/* This function tests if an ENGINE-specific command is usable as a "setting".
 * Eg. in an application's config file that gets processed through
 * ENGINE_ctrl_cmd_string(). If this returns zero, it is not available to
 * ENGINE_ctrl_cmd_string(), only ENGINE_ctrl(). */
int ENGINE_cmd_is_executable(ENGINE *e, int cmd);

/* This function works like ENGINE_ctrl() with the exception of taking a
 * command name instead of a command number, and can handle optional commands.
 * See the comment on ENGINE_ctrl_cmd_string() for an explanation on how to
 * use the cmd_name and cmd_optional. */
int ENGINE_ctrl_cmd(ENGINE *e, const char *cmd_name,
        long i, void *p, void (*f)(void), int cmd_optional);

/* This function passes a command-name and argument to an ENGINE. The cmd_name
 * is converted to a command number and the control command is called using
 * 'arg' as an argument (unless the ENGINE doesn't support such a command, in
 * which case no control command is called). The command is checked for input
 * flags, and if necessary the argument will be converted to a numeric value. If
 * cmd_optional is non-zero, then if the ENGINE doesn't support the given
 * cmd_name the return value will be success anyway. This function is intended
 * for applications to use so that users (or config files) can supply
 * engine-specific config data to the ENGINE at run-time to control behaviour of
 * specific engines. As such, it shouldn't be used for calling ENGINE_ctrl()
 * functions that return data, deal with binary data, or that are otherwise
 * supposed to be used directly through ENGINE_ctrl() in application code. Any
 * "return" data from an ENGINE_ctrl() operation in this function will be lost -
 * the return value is interpreted as failure if the return value is zero,
 * success otherwise, and this function returns a boolean value as a result. In
 * other words, vendors of 'ENGINE'-enabled devices should write ENGINE
 * implementations with parameterisations that work in this scheme, so that
 * compliant ENGINE-based applications can work consistently with the same
 * configuration for the same ENGINE-enabled devices, across applications. */
int ENGINE_ctrl_cmd_string(ENGINE *e, const char *cmd_name, const char *arg,
				int cmd_optional);

/* These functions are useful for manufacturing new ENGINE structures. They
 * don't address reference counting at all - one uses them to populate an ENGINE
 * structure with personalised implementations of things prior to using it
 * directly or adding it to the builtin ENGINE list in OpenSSL. These are also
 * here so that the ENGINE structure doesn't have to be exposed and break binary
 * compatibility! */
ENGINE *ENGINE_new(void);
int ENGINE_free(ENGINE *e);
int ENGINE_up_ref(ENGINE *e);
int ENGINE_set_id(ENGINE *e, const char *id);
int ENGINE_set_name(ENGINE *e, const char *name);
int ENGINE_set_RSA(ENGINE *e, const RSA_METHOD *rsa_meth);
int ENGINE_set_DSA(ENGINE *e, const DSA_METHOD *dsa_meth);
int ENGINE_set_ECDH(ENGINE *e, const ECDH_METHOD *ecdh_meth);
int ENGINE_set_ECDSA(ENGINE *e, const ECDSA_METHOD *ecdsa_meth);
int ENGINE_set_DH(ENGINE *e, const DH_METHOD *dh_meth);
int ENGINE_set_RAND(ENGINE *e, const RAND_METHOD *rand_meth);
int ENGINE_set_STORE(ENGINE *e, const STORE_METHOD *store_meth);
int ENGINE_set_destroy_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR destroy_f);
int ENGINE_set_init_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR init_f);
int ENGINE_set_finish_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR finish_f);
int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f);
int ENGINE_set_load_privkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpriv_f);
int ENGINE_set_load_pubkey_function(ENGINE *e, ENGINE_LOAD_KEY_PTR loadpub_f);
int ENGINE_set_load_ssl_client_cert_function(ENGINE *e,
				ENGINE_SSL_CLIENT_CERT_PTR loadssl_f);
int ENGINE_set_ciphers(ENGINE *e, ENGINE_CIPHERS_PTR f);
int ENGINE_set_digests(ENGINE *e, ENGINE_DIGESTS_PTR f);
int ENGINE_set_flags(ENGINE *e, int flags);
int ENGINE_set_cmd_defns(ENGINE *e, const ENGINE_CMD_DEFN *defns);
/* These functions allow control over any per-structure ENGINE data. */
int ENGINE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
		CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
int ENGINE_set_ex_data(ENGINE *e, int idx, void *arg);
void *ENGINE_get_ex_data(const ENGINE *e, int idx);

/* This function cleans up anything that needs it. Eg. the ENGINE_add() function
 * automatically ensures the list cleanup function is registered to be called
 * from ENGINE_cleanup(). Similarly, all ENGINE_register_*** functions ensure
 * ENGINE_cleanup() will clean up after them. */
void ENGINE_cleanup(void);

/* These return values from within the ENGINE structure. These can be useful
 * with functional references as well as structural references - it depends
 * which you obtained. Using the result for functional purposes if you only
 * obtained a structural reference may be problematic! */
const char *ENGINE_get_id(const ENGINE *e);
const char *ENGINE_get_name(const ENGINE *e);
const RSA_METHOD *ENGINE_get_RSA(const ENGINE *e);
const DSA_METHOD *ENGINE_get_DSA(const ENGINE *e);
const ECDH_METHOD *ENGINE_get_ECDH(const ENGINE *e);
const ECDSA_METHOD *ENGINE_get_ECDSA(const ENGINE *e);
const DH_METHOD *ENGINE_get_DH(const ENGINE *e);
const RAND_METHOD *ENGINE_get_RAND(const ENGINE *e);
const STORE_METHOD *ENGINE_get_STORE(const ENGINE *e);
ENGINE_GEN_INT_FUNC_PTR ENGINE_get_destroy_function(const ENGINE *e);
ENGINE_GEN_INT_FUNC_PTR ENGINE_get_init_function(const ENGINE *e);
ENGINE_GEN_INT_FUNC_PTR ENGINE_get_finish_function(const ENGINE *e);
ENGINE_CTRL_FUNC_PTR ENGINE_get_ctrl_function(const ENGINE *e);
ENGINE_LOAD_KEY_PTR ENGINE_get_load_privkey_function(const ENGINE *e);
ENGINE_LOAD_KEY_PTR ENGINE_get_load_pubkey_function(const ENGINE *e);
ENGINE_SSL_CLIENT_CERT_PTR ENGINE_get_ssl_client_cert_function(const ENGINE *e);
ENGINE_CIPHERS_PTR ENGINE_get_ciphers(const ENGINE *e);
ENGINE_DIGESTS_PTR ENGINE_get_digests(const ENGINE *e);
const EVP_CIPHER *ENGINE_get_cipher(ENGINE *e, int nid);
const EVP_MD *ENGINE_get_digest(ENGINE *e, int nid);
const ENGINE_CMD_DEFN *ENGINE_get_cmd_defns(const ENGINE *e);
int ENGINE_get_flags(const ENGINE *e);

/* FUNCTIONAL functions. These functions deal with ENGINE structures
 * that have (or will) be initialised for use. Broadly speaking, the
 * structural functions are useful for iterating the list of available
 * engine types, creating new engine types, and other "list" operations.
 * These functions actually deal with ENGINEs that are to be used. As
 * such these functions can fail (if applicable) when particular
 * engines are unavailable - eg. if a hardware accelerator is not
 * attached or not functioning correctly. Each ENGINE has 2 reference
 * counts; structural and functional. Every time a functional reference
 * is obtained or released, a corresponding structural reference is
 * automatically obtained or released too. */

/* Initialise a engine type for use (or up its reference count if it's
 * already in use). This will fail if the engine is not currently
 * operational and cannot initialise. */
int ENGINE_init(ENGINE *e);
/* Free a functional reference to a engine type. This does not require
 * a corresponding call to ENGINE_free as it also releases a structural
 * reference. */
int ENGINE_finish(ENGINE *e);

/* The following functions handle keys that are stored in some secondary
 * location, handled by the engine.  The storage may be on a card or
 * whatever. */
EVP_PKEY *ENGINE_load_private_key(ENGINE *e, const char *key_id,
	UI_METHOD *ui_method, void *callback_data);
EVP_PKEY *ENGINE_load_public_key(ENGINE *e, const char *key_id,
	UI_METHOD *ui_method, void *callback_data);
int ENGINE_load_ssl_client_cert(ENGINE *e, SSL *s,
	STACK_OF(X509_NAME) *ca_dn, X509 **pcert, EVP_PKEY **ppkey,
	STACK_OF(X509) **pother,
	UI_METHOD *ui_method, void *callback_data);

/* This returns a pointer for the current ENGINE structure that
 * is (by default) performing any RSA operations. The value returned
 * is an incremented reference, so it should be free'd (ENGINE_finish)
 * before it is discarded. */
ENGINE *ENGINE_get_default_RSA(void);
/* Same for the other "methods" */
ENGINE *ENGINE_get_default_DSA(void);
ENGINE *ENGINE_get_default_ECDH(void);
ENGINE *ENGINE_get_default_ECDSA(void);
ENGINE *ENGINE_get_default_DH(void);
ENGINE *ENGINE_get_default_RAND(void);
/* These functions can be used to get a functional reference to perform
 * ciphering or digesting corresponding to "nid". */
ENGINE *ENGINE_get_cipher_engine(int nid);
ENGINE *ENGINE_get_digest_engine(int nid);

/* This sets a new default ENGINE structure for performing RSA
 * operations. If the result is non-zero (success) then the ENGINE
 * structure will have had its reference count up'd so the caller
 * should still free their own reference 'e'. */
int ENGINE_set_default_RSA(ENGINE *e);
int ENGINE_set_default_string(ENGINE *e, const char *def_list);
/* Same for the other "methods" */
int ENGINE_set_default_DSA(ENGINE *e);
int ENGINE_set_default_ECDH(ENGINE *e);
int ENGINE_set_default_ECDSA(ENGINE *e);
int ENGINE_set_default_DH(ENGINE *e);
int ENGINE_set_default_RAND(ENGINE *e);
int ENGINE_set_default_ciphers(ENGINE *e);
int ENGINE_set_default_digests(ENGINE *e);

/* The combination "set" - the flags are bitwise "OR"d from the
 * ENGINE_METHOD_*** defines above. As with the "ENGINE_register_complete()"
 * function, this function can result in unnecessary static linkage. If your
 * application requires only specific functionality, consider using more
 * selective functions. */
int ENGINE_set_default(ENGINE *e, unsigned int flags);

void ENGINE_add_conf_module(void);

/* Deprecated functions ... */
/* int ENGINE_clear_defaults(void); */

/**************************/
/* DYNAMIC ENGINE SUPPORT */
/**************************/

/* Binary/behaviour compatibility levels */
#define OSSL_DYNAMIC_VERSION		(unsigned long)0x00020000
/* Binary versions older than this are too old for us (whether we're a loader or
 * a loadee) */
#define OSSL_DYNAMIC_OLDEST		(unsigned long)0x00020000

/* When compiling an ENGINE entirely as an external shared library, loadable by
 * the "dynamic" ENGINE, these types are needed. The 'dynamic_fns' structure
 * type provides the calling application's (or library's) error functionality
 * and memory management function pointers to the loaded library. These should
 * be used/set in the loaded library code so that the loading application's
 * 'state' will be used/changed in all operations. The 'static_state' pointer
 * allows the loaded library to know if it shares the same static data as the
 * calling application (or library), and thus whether these callbacks need to be
 * set or not. */
typedef void *(*dyn_MEM_malloc_cb)(size_t);
typedef void *(*dyn_MEM_realloc_cb)(void *, size_t);
typedef void (*dyn_MEM_free_cb)(void *);
typedef struct st_dynamic_MEM_fns {
	dyn_MEM_malloc_cb			malloc_cb;
	dyn_MEM_realloc_cb			realloc_cb;
	dyn_MEM_free_cb				free_cb;
	} dynamic_MEM_fns;
/* FIXME: Perhaps the memory and locking code (crypto.h) should declare and use
 * these types so we (and any other dependant code) can simplify a bit?? */
typedef void (*dyn_lock_locking_cb)(int,int,const char *,int);
typedef int (*dyn_lock_add_lock_cb)(int*,int,int,const char *,int);
typedef struct CRYPTO_dynlock_value *(*dyn_dynlock_create_cb)(
						const char *,int);
typedef void (*dyn_dynlock_lock_cb)(int,struct CRYPTO_dynlock_value *,
						const char *,int);
typedef void (*dyn_dynlock_destroy_cb)(struct CRYPTO_dynlock_value *,
						const char *,int);
typedef struct st_dynamic_LOCK_fns {
	dyn_lock_locking_cb			lock_locking_cb;
	dyn_lock_add_lock_cb			lock_add_lock_cb;
	dyn_dynlock_create_cb			dynlock_create_cb;
	dyn_dynlock_lock_cb			dynlock_lock_cb;
	dyn_dynlock_destroy_cb			dynlock_destroy_cb;
	} dynamic_LOCK_fns;
/* The top-level structure */
typedef struct st_dynamic_fns {
	void 					*static_state;
	const ERR_FNS				*err_fns;
	const CRYPTO_EX_DATA_IMPL		*ex_data_fns;
	dynamic_MEM_fns				mem_fns;
	dynamic_LOCK_fns			lock_fns;
	} dynamic_fns;

/* The version checking function should be of this prototype. NB: The
 * ossl_version value passed in is the OSSL_DYNAMIC_VERSION of the loading code.
 * If this function returns zero, it indicates a (potential) version
 * incompatibility and the loaded library doesn't believe it can proceed.
 * Otherwise, the returned value is the (latest) version supported by the
 * loading library. The loader may still decide that the loaded code's version
 * is unsatisfactory and could veto the load. The function is expected to
 * be implemented with the symbol name "v_check", and a default implementation
 * can be fully instantiated with IMPLEMENT_DYNAMIC_CHECK_FN(). */
typedef unsigned long (*dynamic_v_check_fn)(unsigned long ossl_version);
#define IMPLEMENT_DYNAMIC_CHECK_FN() \
	OPENSSL_EXPORT unsigned long v_check(unsigned long v) { \
		if(v >= OSSL_DYNAMIC_OLDEST) return OSSL_DYNAMIC_VERSION; \
		return 0; }

/* This function is passed the ENGINE structure to initialise with its own
 * function and command settings. It should not adjust the structural or
 * functional reference counts. If this function returns zero, (a) the load will
 * be aborted, (b) the previous ENGINE state will be memcpy'd back onto the
 * structure, and (c) the shared library will be unloaded. So implementations
 * should do their own internal cleanup in failure circumstances otherwise they
 * could leak. The 'id' parameter, if non-NULL, represents the ENGINE id that
 * the loader is looking for. If this is NULL, the shared library can choose to
 * return failure or to initialise a 'default' ENGINE. If non-NULL, the shared
 * library must initialise only an ENGINE matching the passed 'id'. The function
 * is expected to be implemented with the symbol name "bind_engine". A standard
 * implementation can be instantiated with IMPLEMENT_DYNAMIC_BIND_FN(fn) where
 * the parameter 'fn' is a callback function that populates the ENGINE structure
 * and returns an int value (zero for failure). 'fn' should have prototype;
 *    [static] int fn(ENGINE *e, const char *id); */
typedef int (*dynamic_bind_engine)(ENGINE *e, const char *id,
				const dynamic_fns *fns);
#define IMPLEMENT_DYNAMIC_BIND_FN(fn) \
	OPENSSL_EXPORT \
	int bind_engine(ENGINE *e, const char *id, const dynamic_fns *fns) { \
		if(ENGINE_get_static_state() == fns->static_state) goto skip_cbs; \
		if(!CRYPTO_set_mem_functions(fns->mem_fns.malloc_cb, \
			fns->mem_fns.realloc_cb, fns->mem_fns.free_cb)) \
			return 0; \
		CRYPTO_set_locking_callback(fns->lock_fns.lock_locking_cb); \
		CRYPTO_set_add_lock_callback(fns->lock_fns.lock_add_lock_cb); \
		CRYPTO_set_dynlock_create_callback(fns->lock_fns.dynlock_create_cb); \
		CRYPTO_set_dynlock_lock_callback(fns->lock_fns.dynlock_lock_cb); \
		CRYPTO_set_dynlock_destroy_callback(fns->lock_fns.dynlock_destroy_cb); \
		if(!CRYPTO_set_ex_data_implementation(fns->ex_data_fns)) \
			return 0; \
		if(!ERR_set_implementation(fns->err_fns)) return 0; \
	skip_cbs: \
		if(!fn(e,id)) return 0; \
		return 1; }

/* If the loading application (or library) and the loaded ENGINE library share
 * the same static data (eg. they're both dynamically linked to the same
 * libcrypto.so) we need a way to avoid trying to set system callbacks - this
 * would fail, and for the same reason that it's unnecessary to try. If the
 * loaded ENGINE has (or gets from through the loader) its own copy of the
 * libcrypto static data, we will need to set the callbacks. The easiest way to
 * detect this is to have a function that returns a pointer to some static data
 * and let the loading application and loaded ENGINE compare their respective
 * values. */
void *ENGINE_get_static_state(void);

#if defined(__OpenBSD__) || defined(__FreeBSD__)
void ENGINE_setup_bsd_cryptodev(void);
#endif

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_ENGINE_strings(void);

/* Error codes for the ENGINE functions. */

/* Function codes. */
#define ENGINE_F_DYNAMIC_CTRL				 180
#define ENGINE_F_DYNAMIC_GET_DATA_CTX			 181
#define ENGINE_F_DYNAMIC_LOAD				 182
#define ENGINE_F_DYNAMIC_SET_DATA_CTX			 183
#define ENGINE_F_ENGINE_ADD				 105
#define ENGINE_F_ENGINE_BY_ID				 106
#define ENGINE_F_ENGINE_CMD_IS_EXECUTABLE		 170
#define ENGINE_F_ENGINE_CTRL				 142
#define ENGINE_F_ENGINE_CTRL_CMD			 178
#define ENGINE_F_ENGINE_CTRL_CMD_STRING			 171
#define ENGINE_F_ENGINE_FINISH				 107
#define ENGINE_F_ENGINE_FREE_UTIL			 108
#define ENGINE_F_ENGINE_GET_CIPHER			 185
#define ENGINE_F_ENGINE_GET_DEFAULT_TYPE		 177
#define ENGINE_F_ENGINE_GET_DIGEST			 186
#define ENGINE_F_ENGINE_GET_NEXT			 115
#define ENGINE_F_ENGINE_GET_PREV			 116
#define ENGINE_F_ENGINE_INIT				 119
#define ENGINE_F_ENGINE_LIST_ADD			 120
#define ENGINE_F_ENGINE_LIST_REMOVE			 121
#define ENGINE_F_ENGINE_LOAD_PRIVATE_KEY		 150
#define ENGINE_F_ENGINE_LOAD_PUBLIC_KEY			 151
#define ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT		 192
#define ENGINE_F_ENGINE_NEW				 122
#define ENGINE_F_ENGINE_REMOVE				 123
#define ENGINE_F_ENGINE_SET_DEFAULT_STRING		 189
#define ENGINE_F_ENGINE_SET_DEFAULT_TYPE		 126
#define ENGINE_F_ENGINE_SET_ID				 129
#define ENGINE_F_ENGINE_SET_NAME			 130
#define ENGINE_F_ENGINE_TABLE_REGISTER			 184
#define ENGINE_F_ENGINE_UNLOAD_KEY			 152
#define ENGINE_F_ENGINE_UNLOCKED_FINISH			 191
#define ENGINE_F_ENGINE_UP_REF				 190
#define ENGINE_F_INT_CTRL_HELPER			 172
#define ENGINE_F_INT_ENGINE_CONFIGURE			 188
#define ENGINE_F_INT_ENGINE_MODULE_INIT			 187
#define ENGINE_F_LOG_MESSAGE				 141

/* Reason codes. */
#define ENGINE_R_ALREADY_LOADED				 100
#define ENGINE_R_ARGUMENT_IS_NOT_A_NUMBER		 133
#define ENGINE_R_CMD_NOT_EXECUTABLE			 134
#define ENGINE_R_COMMAND_TAKES_INPUT			 135
#define ENGINE_R_COMMAND_TAKES_NO_INPUT			 136
#define ENGINE_R_CONFLICTING_ENGINE_ID			 103
#define ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED		 119
#define ENGINE_R_DH_NOT_IMPLEMENTED			 139
#define ENGINE_R_DSA_NOT_IMPLEMENTED			 140
#define ENGINE_R_DSO_FAILURE				 104
#define ENGINE_R_DSO_NOT_FOUND				 132
#define ENGINE_R_ENGINES_SECTION_ERROR			 148
#define ENGINE_R_ENGINE_IS_NOT_IN_LIST			 105
#define ENGINE_R_ENGINE_SECTION_ERROR			 149
#define ENGINE_R_FAILED_LOADING_PRIVATE_KEY		 128
#define ENGINE_R_FAILED_LOADING_PUBLIC_KEY		 129
#define ENGINE_R_FINISH_FAILED				 106
#define ENGINE_R_GET_HANDLE_FAILED			 107
#define ENGINE_R_ID_OR_NAME_MISSING			 108
#define ENGINE_R_INIT_FAILED				 109
#define ENGINE_R_INTERNAL_LIST_ERROR			 110
#define ENGINE_R_INVALID_ARGUMENT			 143
#define ENGINE_R_INVALID_CMD_NAME			 137
#define ENGINE_R_INVALID_CMD_NUMBER			 138
#define ENGINE_R_INVALID_INIT_VALUE			 151
#define ENGINE_R_INVALID_STRING				 150
#define ENGINE_R_NOT_INITIALISED			 117
#define ENGINE_R_NOT_LOADED				 112
#define ENGINE_R_NO_CONTROL_FUNCTION			 120
#define ENGINE_R_NO_INDEX				 144
#define ENGINE_R_NO_LOAD_FUNCTION			 125
#define ENGINE_R_NO_REFERENCE				 130
#define ENGINE_R_NO_SUCH_ENGINE				 116
#define ENGINE_R_NO_UNLOAD_FUNCTION			 126
#define ENGINE_R_PROVIDE_PARAMETERS			 113
#define ENGINE_R_RSA_NOT_IMPLEMENTED			 141
#define ENGINE_R_UNIMPLEMENTED_CIPHER			 146
#define ENGINE_R_UNIMPLEMENTED_DIGEST			 147
#define ENGINE_R_VERSION_INCOMPATIBILITY		 145

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/crypto.h0000755000175000017500000005723111341640430020321 0ustar  davidedavide/* crypto/crypto.h */
/* ====================================================================
 * Copyright (c) 1998-2003 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */
/* ====================================================================
 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
 * ECDH support in OpenSSL originally developed by 
 * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
 */

#ifndef HEADER_CRYPTO_H
#define HEADER_CRYPTO_H

#include 

#include 

#ifndef OPENSSL_NO_FP_API
#include 
#endif

#include 
#include 
#include 
#include 

#ifdef CHARSET_EBCDIC
#include 
#endif

/* Resolve problems on some operating systems with symbol names that clash
   one way or another */
#include 

#ifdef  __cplusplus
extern "C" {
#endif

/* Backward compatibility to SSLeay */
/* This is more to be used to check the correct DLL is being used
 * in the MS world. */
#define SSLEAY_VERSION_NUMBER	OPENSSL_VERSION_NUMBER
#define SSLEAY_VERSION		0
/* #define SSLEAY_OPTIONS	1 no longer supported */
#define SSLEAY_CFLAGS		2
#define SSLEAY_BUILT_ON		3
#define SSLEAY_PLATFORM		4
#define SSLEAY_DIR		5

/* Already declared in ossl_typ.h */
#if 0
typedef struct crypto_ex_data_st CRYPTO_EX_DATA;
/* Called when a new object is created */
typedef int CRYPTO_EX_new(void *parent, void *ptr, CRYPTO_EX_DATA *ad,
					int idx, long argl, void *argp);
/* Called when an object is free()ed */
typedef void CRYPTO_EX_free(void *parent, void *ptr, CRYPTO_EX_DATA *ad,
					int idx, long argl, void *argp);
/* Called when we need to dup an object */
typedef int CRYPTO_EX_dup(CRYPTO_EX_DATA *to, CRYPTO_EX_DATA *from, void *from_d, 
					int idx, long argl, void *argp);
#endif

/* A generic structure to pass assorted data in a expandable way */
typedef struct openssl_item_st
	{
	int code;
	void *value;		/* Not used for flag attributes */
	size_t value_size;	/* Max size of value for output, length for input */
	size_t *value_length;	/* Returned length of value for output */
	} OPENSSL_ITEM;


/* When changing the CRYPTO_LOCK_* list, be sure to maintin the text lock
 * names in cryptlib.c
 */

#define	CRYPTO_LOCK_ERR			1
#define	CRYPTO_LOCK_EX_DATA		2
#define	CRYPTO_LOCK_X509		3
#define	CRYPTO_LOCK_X509_INFO		4
#define	CRYPTO_LOCK_X509_PKEY		5
#define CRYPTO_LOCK_X509_CRL		6
#define CRYPTO_LOCK_X509_REQ		7
#define CRYPTO_LOCK_DSA			8
#define CRYPTO_LOCK_RSA			9
#define CRYPTO_LOCK_EVP_PKEY		10
#define CRYPTO_LOCK_X509_STORE		11
#define CRYPTO_LOCK_SSL_CTX		12
#define CRYPTO_LOCK_SSL_CERT		13
#define CRYPTO_LOCK_SSL_SESSION		14
#define CRYPTO_LOCK_SSL_SESS_CERT	15
#define CRYPTO_LOCK_SSL			16
#define CRYPTO_LOCK_SSL_METHOD		17
#define CRYPTO_LOCK_RAND		18
#define CRYPTO_LOCK_RAND2		19
#define CRYPTO_LOCK_MALLOC		20
#define CRYPTO_LOCK_BIO			21
#define CRYPTO_LOCK_GETHOSTBYNAME	22
#define CRYPTO_LOCK_GETSERVBYNAME	23
#define CRYPTO_LOCK_READDIR		24
#define CRYPTO_LOCK_RSA_BLINDING	25
#define CRYPTO_LOCK_DH			26
#define CRYPTO_LOCK_MALLOC2		27
#define CRYPTO_LOCK_DSO			28
#define CRYPTO_LOCK_DYNLOCK		29
#define CRYPTO_LOCK_ENGINE		30
#define CRYPTO_LOCK_UI			31
#define CRYPTO_LOCK_ECDSA               32
#define CRYPTO_LOCK_EC			33
#define CRYPTO_LOCK_ECDH		34
#define CRYPTO_LOCK_BN  		35
#define CRYPTO_LOCK_EC_PRE_COMP		36
#define CRYPTO_LOCK_STORE		37
#define CRYPTO_LOCK_COMP		38
#ifndef OPENSSL_FIPS
#define CRYPTO_NUM_LOCKS		39
#else
#define CRYPTO_LOCK_FIPS		39
#define CRYPTO_LOCK_FIPS2		40
#define CRYPTO_NUM_LOCKS		41
#endif

#define CRYPTO_LOCK		1
#define CRYPTO_UNLOCK		2
#define CRYPTO_READ		4
#define CRYPTO_WRITE		8

#ifndef OPENSSL_NO_LOCKING
#ifndef CRYPTO_w_lock
#define CRYPTO_w_lock(type)	\
	CRYPTO_lock(CRYPTO_LOCK|CRYPTO_WRITE,type,__FILE__,__LINE__)
#define CRYPTO_w_unlock(type)	\
	CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_WRITE,type,__FILE__,__LINE__)
#define CRYPTO_r_lock(type)	\
	CRYPTO_lock(CRYPTO_LOCK|CRYPTO_READ,type,__FILE__,__LINE__)
#define CRYPTO_r_unlock(type)	\
	CRYPTO_lock(CRYPTO_UNLOCK|CRYPTO_READ,type,__FILE__,__LINE__)
#define CRYPTO_add(addr,amount,type)	\
	CRYPTO_add_lock(addr,amount,type,__FILE__,__LINE__)
#endif
#else
#define CRYPTO_w_lock(a)
#define CRYPTO_w_unlock(a)
#define CRYPTO_r_lock(a)
#define CRYPTO_r_unlock(a)
#define CRYPTO_add(a,b,c)	((*(a))+=(b))
#endif

/* Some applications as well as some parts of OpenSSL need to allocate
   and deallocate locks in a dynamic fashion.  The following typedef
   makes this possible in a type-safe manner.  */
/* struct CRYPTO_dynlock_value has to be defined by the application. */
typedef struct
	{
	int references;
	struct CRYPTO_dynlock_value *data;
	} CRYPTO_dynlock;


/* The following can be used to detect memory leaks in the SSLeay library.
 * It used, it turns on malloc checking */

#define CRYPTO_MEM_CHECK_OFF	0x0	/* an enume */
#define CRYPTO_MEM_CHECK_ON	0x1	/* a bit */
#define CRYPTO_MEM_CHECK_ENABLE	0x2	/* a bit */
#define CRYPTO_MEM_CHECK_DISABLE 0x3	/* an enume */

/* The following are bit values to turn on or off options connected to the
 * malloc checking functionality */

/* Adds time to the memory checking information */
#define V_CRYPTO_MDEBUG_TIME	0x1 /* a bit */
/* Adds thread number to the memory checking information */
#define V_CRYPTO_MDEBUG_THREAD	0x2 /* a bit */

#define V_CRYPTO_MDEBUG_ALL (V_CRYPTO_MDEBUG_TIME | V_CRYPTO_MDEBUG_THREAD)


/* predec of the BIO type */
typedef struct bio_st BIO_dummy;

struct crypto_ex_data_st
	{
	STACK *sk;
	int dummy; /* gcc is screwing up this data structure :-( */
	};

/* This stuff is basically class callback functions
 * The current classes are SSL_CTX, SSL, SSL_SESSION, and a few more */

typedef struct crypto_ex_data_func_st
	{
	long argl;	/* Arbitary long */
	void *argp;	/* Arbitary void * */
	CRYPTO_EX_new *new_func;
	CRYPTO_EX_free *free_func;
	CRYPTO_EX_dup *dup_func;
	} CRYPTO_EX_DATA_FUNCS;

DECLARE_STACK_OF(CRYPTO_EX_DATA_FUNCS)

/* Per class, we have a STACK of CRYPTO_EX_DATA_FUNCS for each CRYPTO_EX_DATA
 * entry.
 */

#define CRYPTO_EX_INDEX_BIO		0
#define CRYPTO_EX_INDEX_SSL		1
#define CRYPTO_EX_INDEX_SSL_CTX		2
#define CRYPTO_EX_INDEX_SSL_SESSION	3
#define CRYPTO_EX_INDEX_X509_STORE	4
#define CRYPTO_EX_INDEX_X509_STORE_CTX	5
#define CRYPTO_EX_INDEX_RSA		6
#define CRYPTO_EX_INDEX_DSA		7
#define CRYPTO_EX_INDEX_DH		8
#define CRYPTO_EX_INDEX_ENGINE		9
#define CRYPTO_EX_INDEX_X509		10
#define CRYPTO_EX_INDEX_UI		11
#define CRYPTO_EX_INDEX_ECDSA		12
#define CRYPTO_EX_INDEX_ECDH		13
#define CRYPTO_EX_INDEX_COMP		14
#define CRYPTO_EX_INDEX_STORE		15

/* Dynamically assigned indexes start from this value (don't use directly, use
 * via CRYPTO_ex_data_new_class). */
#define CRYPTO_EX_INDEX_USER		100


/* This is the default callbacks, but we can have others as well:
 * this is needed in Win32 where the application malloc and the
 * library malloc may not be the same.
 */
#define CRYPTO_malloc_init()	CRYPTO_set_mem_functions(\
	malloc, realloc, free)

#if defined CRYPTO_MDEBUG_ALL || defined CRYPTO_MDEBUG_TIME || defined CRYPTO_MDEBUG_THREAD
# ifndef CRYPTO_MDEBUG /* avoid duplicate #define */
#  define CRYPTO_MDEBUG
# endif
#endif

/* Set standard debugging functions (not done by default
 * unless CRYPTO_MDEBUG is defined) */
void CRYPTO_malloc_debug_init(void);

int CRYPTO_mem_ctrl(int mode);
int CRYPTO_is_mem_check_on(void);

/* for applications */
#define MemCheck_start() CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON)
#define MemCheck_stop()	CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_OFF)

/* for library-internal use */
#define MemCheck_on()	CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ENABLE)
#define MemCheck_off()	CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_DISABLE)
#define is_MemCheck_on() CRYPTO_is_mem_check_on()

#define OPENSSL_malloc(num)	CRYPTO_malloc((int)num,__FILE__,__LINE__)
#define OPENSSL_strdup(str)	CRYPTO_strdup((str),__FILE__,__LINE__)
#define OPENSSL_realloc(addr,num) \
	CRYPTO_realloc((char *)addr,(int)num,__FILE__,__LINE__)
#define OPENSSL_realloc_clean(addr,old_num,num) \
	CRYPTO_realloc_clean(addr,old_num,num,__FILE__,__LINE__)
#define OPENSSL_remalloc(addr,num) \
	CRYPTO_remalloc((char **)addr,(int)num,__FILE__,__LINE__)
#define OPENSSL_freeFunc	CRYPTO_free
#define OPENSSL_free(addr)	CRYPTO_free(addr)

#define OPENSSL_malloc_locked(num) \
	CRYPTO_malloc_locked((int)num,__FILE__,__LINE__)
#define OPENSSL_free_locked(addr) CRYPTO_free_locked(addr)


const char *SSLeay_version(int type);
unsigned long SSLeay(void);

int OPENSSL_issetugid(void);

/* An opaque type representing an implementation of "ex_data" support */
typedef struct st_CRYPTO_EX_DATA_IMPL	CRYPTO_EX_DATA_IMPL;
/* Return an opaque pointer to the current "ex_data" implementation */
const CRYPTO_EX_DATA_IMPL *CRYPTO_get_ex_data_implementation(void);
/* Sets the "ex_data" implementation to be used (if it's not too late) */
int CRYPTO_set_ex_data_implementation(const CRYPTO_EX_DATA_IMPL *i);
/* Get a new "ex_data" class, and return the corresponding "class_index" */
int CRYPTO_ex_data_new_class(void);
/* Within a given class, get/register a new index */
int CRYPTO_get_ex_new_index(int class_index, long argl, void *argp,
		CRYPTO_EX_new *new_func, CRYPTO_EX_dup *dup_func,
		CRYPTO_EX_free *free_func);
/* Initialise/duplicate/free CRYPTO_EX_DATA variables corresponding to a given
 * class (invokes whatever per-class callbacks are applicable) */
int CRYPTO_new_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad);
int CRYPTO_dup_ex_data(int class_index, CRYPTO_EX_DATA *to,
		CRYPTO_EX_DATA *from);
void CRYPTO_free_ex_data(int class_index, void *obj, CRYPTO_EX_DATA *ad);
/* Get/set data in a CRYPTO_EX_DATA variable corresponding to a particular index
 * (relative to the class type involved) */
int CRYPTO_set_ex_data(CRYPTO_EX_DATA *ad, int idx, void *val);
void *CRYPTO_get_ex_data(const CRYPTO_EX_DATA *ad,int idx);
/* This function cleans up all "ex_data" state. It mustn't be called under
 * potential race-conditions. */
void CRYPTO_cleanup_all_ex_data(void);

int CRYPTO_get_new_lockid(char *name);

int CRYPTO_num_locks(void); /* return CRYPTO_NUM_LOCKS (shared libs!) */
void CRYPTO_lock(int mode, int type,const char *file,int line);
void CRYPTO_set_locking_callback(void (*func)(int mode,int type,
					      const char *file,int line));
void (*CRYPTO_get_locking_callback(void))(int mode,int type,const char *file,
		int line);
void CRYPTO_set_add_lock_callback(int (*func)(int *num,int mount,int type,
					      const char *file, int line));
int (*CRYPTO_get_add_lock_callback(void))(int *num,int mount,int type,
					  const char *file,int line);
void CRYPTO_set_id_callback(unsigned long (*func)(void));
unsigned long (*CRYPTO_get_id_callback(void))(void);
unsigned long CRYPTO_thread_id(void);
const char *CRYPTO_get_lock_name(int type);
int CRYPTO_add_lock(int *pointer,int amount,int type, const char *file,
		    int line);

void int_CRYPTO_set_do_dynlock_callback(
	void (*do_dynlock_cb)(int mode, int type, const char *file, int line));

int CRYPTO_get_new_dynlockid(void);
void CRYPTO_destroy_dynlockid(int i);
struct CRYPTO_dynlock_value *CRYPTO_get_dynlock_value(int i);
void CRYPTO_set_dynlock_create_callback(struct CRYPTO_dynlock_value *(*dyn_create_function)(const char *file, int line));
void CRYPTO_set_dynlock_lock_callback(void (*dyn_lock_function)(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line));
void CRYPTO_set_dynlock_destroy_callback(void (*dyn_destroy_function)(struct CRYPTO_dynlock_value *l, const char *file, int line));
struct CRYPTO_dynlock_value *(*CRYPTO_get_dynlock_create_callback(void))(const char *file,int line);
void (*CRYPTO_get_dynlock_lock_callback(void))(int mode, struct CRYPTO_dynlock_value *l, const char *file,int line);
void (*CRYPTO_get_dynlock_destroy_callback(void))(struct CRYPTO_dynlock_value *l, const char *file,int line);

/* CRYPTO_set_mem_functions includes CRYPTO_set_locked_mem_functions --
 * call the latter last if you need different functions */
int CRYPTO_set_mem_functions(void *(*m)(size_t),void *(*r)(void *,size_t), void (*f)(void *));
int CRYPTO_set_locked_mem_functions(void *(*m)(size_t), void (*free_func)(void *));
int CRYPTO_set_mem_ex_functions(void *(*m)(size_t,const char *,int),
                                void *(*r)(void *,size_t,const char *,int),
                                void (*f)(void *));
int CRYPTO_set_locked_mem_ex_functions(void *(*m)(size_t,const char *,int),
                                       void (*free_func)(void *));
int CRYPTO_set_mem_debug_functions(void (*m)(void *,int,const char *,int,int),
				   void (*r)(void *,void *,int,const char *,int,int),
				   void (*f)(void *,int),
				   void (*so)(long),
				   long (*go)(void));
void CRYPTO_set_mem_info_functions(
	int  (*push_info_fn)(const char *info, const char *file, int line),
	int  (*pop_info_fn)(void),
	int (*remove_all_info_fn)(void));
void CRYPTO_get_mem_functions(void *(**m)(size_t),void *(**r)(void *, size_t), void (**f)(void *));
void CRYPTO_get_locked_mem_functions(void *(**m)(size_t), void (**f)(void *));
void CRYPTO_get_mem_ex_functions(void *(**m)(size_t,const char *,int),
                                 void *(**r)(void *, size_t,const char *,int),
                                 void (**f)(void *));
void CRYPTO_get_locked_mem_ex_functions(void *(**m)(size_t,const char *,int),
                                        void (**f)(void *));
void CRYPTO_get_mem_debug_functions(void (**m)(void *,int,const char *,int,int),
				    void (**r)(void *,void *,int,const char *,int,int),
				    void (**f)(void *,int),
				    void (**so)(long),
				    long (**go)(void));

void *CRYPTO_malloc_locked(int num, const char *file, int line);
void CRYPTO_free_locked(void *);
void *CRYPTO_malloc(int num, const char *file, int line);
char *CRYPTO_strdup(const char *str, const char *file, int line);
void CRYPTO_free(void *);
void *CRYPTO_realloc(void *addr,int num, const char *file, int line);
void *CRYPTO_realloc_clean(void *addr,int old_num,int num,const char *file,
			   int line);
void *CRYPTO_remalloc(void *addr,int num, const char *file, int line);

void OPENSSL_cleanse(void *ptr, size_t len);

void CRYPTO_set_mem_debug_options(long bits);
long CRYPTO_get_mem_debug_options(void);

#define CRYPTO_push_info(info) \
        CRYPTO_push_info_(info, __FILE__, __LINE__);
int CRYPTO_push_info_(const char *info, const char *file, int line);
int CRYPTO_pop_info(void);
int CRYPTO_remove_all_info(void);


/* Default debugging functions (enabled by CRYPTO_malloc_debug_init() macro;
 * used as default in CRYPTO_MDEBUG compilations): */
/* The last argument has the following significance:
 *
 * 0:	called before the actual memory allocation has taken place
 * 1:	called after the actual memory allocation has taken place
 */
void CRYPTO_dbg_malloc(void *addr,int num,const char *file,int line,int before_p);
void CRYPTO_dbg_realloc(void *addr1,void *addr2,int num,const char *file,int line,int before_p);
void CRYPTO_dbg_free(void *addr,int before_p);
/* Tell the debugging code about options.  By default, the following values
 * apply:
 *
 * 0:                           Clear all options.
 * V_CRYPTO_MDEBUG_TIME (1):    Set the "Show Time" option.
 * V_CRYPTO_MDEBUG_THREAD (2):  Set the "Show Thread Number" option.
 * V_CRYPTO_MDEBUG_ALL (3):     1 + 2
 */
void CRYPTO_dbg_set_options(long bits);
long CRYPTO_dbg_get_options(void);

int CRYPTO_dbg_push_info(const char *info, const char *file, int line);
int CRYPTO_dbg_pop_info(void);
int CRYPTO_dbg_remove_all_info(void);

#ifndef OPENSSL_NO_FP_API
void CRYPTO_mem_leaks_fp(FILE *);
#endif
void CRYPTO_mem_leaks(struct bio_st *bio);
/* unsigned long order, char *file, int line, int num_bytes, char *addr */
typedef void *CRYPTO_MEM_LEAK_CB(unsigned long, const char *, int, int, void *);
void CRYPTO_mem_leaks_cb(CRYPTO_MEM_LEAK_CB *cb);

/* die if we have to */
void OpenSSLDie(const char *file,int line,const char *assertion);
#define OPENSSL_assert(e)       (void)((e) ? 0 : (OpenSSLDie(__FILE__, __LINE__, #e),1))

unsigned long *OPENSSL_ia32cap_loc(void);
#define OPENSSL_ia32cap (*(OPENSSL_ia32cap_loc()))
int OPENSSL_isservice(void);

#ifdef OPENSSL_FIPS
#define FIPS_ERROR_IGNORED(alg) OpenSSLDie(__FILE__, __LINE__, \
		alg " previous FIPS forbidden algorithm error ignored");

#define FIPS_BAD_ABORT(alg) OpenSSLDie(__FILE__, __LINE__, \
		#alg " Algorithm forbidden in FIPS mode");

#ifdef OPENSSL_FIPS_STRICT
#define FIPS_BAD_ALGORITHM(alg) FIPS_BAD_ABORT(alg)
#else
#define FIPS_BAD_ALGORITHM(alg) \
	{ \
	FIPSerr(FIPS_F_HASH_FINAL,FIPS_R_NON_FIPS_METHOD); \
	ERR_add_error_data(2, "Algorithm=", #alg); \
	return 0; \
	}
#endif

/* Low level digest API blocking macro */

#define FIPS_NON_FIPS_MD_Init(alg) \
	int alg##_Init(alg##_CTX *c) \
		{ \
		if (FIPS_mode()) \
			FIPS_BAD_ALGORITHM(alg) \
		return private_##alg##_Init(c); \
		} \
	int private_##alg##_Init(alg##_CTX *c)

/* For ciphers the API often varies from cipher to cipher and each needs to
 * be treated as a special case. Variable key length ciphers (Blowfish, RC4,
 * CAST) however are very similar and can use a blocking macro.
 */

#define FIPS_NON_FIPS_VCIPHER_Init(alg) \
	void alg##_set_key(alg##_KEY *key, int len, const unsigned char *data) \
		{ \
		if (FIPS_mode()) \
			FIPS_BAD_ABORT(alg) \
		private_##alg##_set_key(key, len, data); \
		} \
	void private_##alg##_set_key(alg##_KEY *key, int len, \
					const unsigned char *data)

#else

#define FIPS_NON_FIPS_VCIPHER_Init(alg) \
	void alg##_set_key(alg##_KEY *key, int len, const unsigned char *data)

#define FIPS_NON_FIPS_MD_Init(alg) \
	int alg##_Init(alg##_CTX *c) 

#endif /* def OPENSSL_FIPS */

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_CRYPTO_strings(void);

#define OPENSSL_HAVE_INIT	1
void OPENSSL_init(void);

/* Error codes for the CRYPTO functions. */

/* Function codes. */
#define CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX		 100
#define CRYPTO_F_CRYPTO_GET_NEW_DYNLOCKID		 103
#define CRYPTO_F_CRYPTO_GET_NEW_LOCKID			 101
#define CRYPTO_F_CRYPTO_SET_EX_DATA			 102
#define CRYPTO_F_DEF_ADD_INDEX				 104
#define CRYPTO_F_DEF_GET_CLASS				 105
#define CRYPTO_F_INT_DUP_EX_DATA			 106
#define CRYPTO_F_INT_FREE_EX_DATA			 107
#define CRYPTO_F_INT_NEW_EX_DATA			 108

/* Reason codes. */
#define CRYPTO_R_NO_DYNLOCK_CREATE_CALLBACK		 100

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/opensslconf.h0000755000175000017500000001547211341640430021333 0ustar  davidedavide/* opensslconf.h */
/* WARNING: Generated automatically from opensslconf.h.in by Configure. */

/* OpenSSL was configured with the following options: */
#ifndef OPENSSL_DOING_MAKEDEPEND


#ifndef OPENSSL_NO_CAMELLIA
# define OPENSSL_NO_CAMELLIA
#endif
#ifndef OPENSSL_NO_CAPIENG
# define OPENSSL_NO_CAPIENG
#endif
#ifndef OPENSSL_NO_CMS
# define OPENSSL_NO_CMS
#endif
#ifndef OPENSSL_NO_GMP
# define OPENSSL_NO_GMP
#endif
#ifndef OPENSSL_NO_JPAKE
# define OPENSSL_NO_JPAKE
#endif
#ifndef OPENSSL_NO_KRB5
# define OPENSSL_NO_KRB5
#endif
#ifndef OPENSSL_NO_MDC2
# define OPENSSL_NO_MDC2
#endif
#ifndef OPENSSL_NO_RC5
# define OPENSSL_NO_RC5
#endif
#ifndef OPENSSL_NO_RFC3779
# define OPENSSL_NO_RFC3779
#endif
#ifndef OPENSSL_NO_SEED
# define OPENSSL_NO_SEED
#endif

#endif /* OPENSSL_DOING_MAKEDEPEND */

#ifndef OPENSSL_NO_DYNAMIC_ENGINE
# define OPENSSL_NO_DYNAMIC_ENGINE
#endif

/* The OPENSSL_NO_* macros are also defined as NO_* if the application
   asks for it.  This is a transient feature that is provided for those
   who haven't had the time to do the appropriate changes in their
   applications.  */
#ifdef OPENSSL_ALGORITHM_DEFINES
# if defined(OPENSSL_NO_CAMELLIA) && !defined(NO_CAMELLIA)
#  define NO_CAMELLIA
# endif
# if defined(OPENSSL_NO_CAPIENG) && !defined(NO_CAPIENG)
#  define NO_CAPIENG
# endif
# if defined(OPENSSL_NO_CMS) && !defined(NO_CMS)
#  define NO_CMS
# endif
# if defined(OPENSSL_NO_GMP) && !defined(NO_GMP)
#  define NO_GMP
# endif
# if defined(OPENSSL_NO_JPAKE) && !defined(NO_JPAKE)
#  define NO_JPAKE
# endif
# if defined(OPENSSL_NO_KRB5) && !defined(NO_KRB5)
#  define NO_KRB5
# endif
# if defined(OPENSSL_NO_MDC2) && !defined(NO_MDC2)
#  define NO_MDC2
# endif
# if defined(OPENSSL_NO_RC5) && !defined(NO_RC5)
#  define NO_RC5
# endif
# if defined(OPENSSL_NO_RFC3779) && !defined(NO_RFC3779)
#  define NO_RFC3779
# endif
# if defined(OPENSSL_NO_SEED) && !defined(NO_SEED)
#  define NO_SEED
# endif
#endif

/* crypto/opensslconf.h.in */

#ifdef OPENSSL_DOING_MAKEDEPEND

/* Include any symbols here that have to be explicitly set to enable a feature
 * that should be visible to makedepend.
 *
 * [Our "make depend" doesn't actually look at this, we use actual build settings
 * instead; we want to make it easy to remove subdirectories with disabled algorithms.]
 */

#ifndef OPENSSL_FIPS
#define OPENSSL_FIPS
#endif

#endif

/* Generate 80386 code? */
#undef I386_ONLY

#if !(defined(VMS) || defined(__VMS)) /* VMS uses logical names instead */
#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR)
#define ENGINESDIR "/usr/local/ssl/lib/engines"
#define OPENSSLDIR "/usr/local/ssl"
#endif
#endif

#undef OPENSSL_UNISTD
#define OPENSSL_UNISTD 

#undef OPENSSL_EXPORT_VAR_AS_FUNCTION

#if defined(HEADER_IDEA_H) && !defined(IDEA_INT)
#define IDEA_INT unsigned int
#endif

#if defined(HEADER_MD2_H) && !defined(MD2_INT)
#define MD2_INT unsigned int
#endif

#if defined(HEADER_RC2_H) && !defined(RC2_INT)
/* I need to put in a mod for the alpha - eay */
#define RC2_INT unsigned int
#endif

#if defined(HEADER_RC4_H)
#if !defined(RC4_INT)
/* using int types make the structure larger but make the code faster
 * on most boxes I have tested - up to %20 faster. */
/*
 * I don't know what does "most" mean, but declaring "int" is a must on:
 * - Intel P6 because partial register stalls are very expensive;
 * - elder Alpha because it lacks byte load/store instructions;
 */
#define RC4_INT unsigned int
#endif
#if !defined(RC4_CHUNK)
/*
 * This enables code handling data aligned at natural CPU word
 * boundary. See crypto/rc4/rc4_enc.c for further details.
 */
#undef RC4_CHUNK
#endif
#endif

#if (defined(HEADER_NEW_DES_H) || defined(HEADER_DES_H)) && !defined(DES_LONG)
/* If this is set to 'unsigned int' on a DEC Alpha, this gives about a
 * %20 speed up (longs are 8 bytes, int's are 4). */
#ifndef DES_LONG
#define DES_LONG unsigned long
#endif
#endif

#if defined(HEADER_BN_H) && !defined(CONFIG_HEADER_BN_H)
#define CONFIG_HEADER_BN_H
#undef BN_LLONG

/* Should we define BN_DIV2W here? */

/* Only one for the following should be defined */
/* The prime number generation stuff may not work when
 * EIGHT_BIT but I don't care since I've only used this mode
 * for debuging the bignum libraries */
#undef SIXTY_FOUR_BIT_LONG
#undef SIXTY_FOUR_BIT
#define THIRTY_TWO_BIT
#undef SIXTEEN_BIT
#undef EIGHT_BIT
#endif

#if defined(HEADER_RC4_LOCL_H) && !defined(CONFIG_HEADER_RC4_LOCL_H)
#define CONFIG_HEADER_RC4_LOCL_H
/* if this is defined data[i] is used instead of *data, this is a %20
 * speedup on x86 */
#undef RC4_INDEX
#endif

#if defined(HEADER_BF_LOCL_H) && !defined(CONFIG_HEADER_BF_LOCL_H)
#define CONFIG_HEADER_BF_LOCL_H
#undef BF_PTR
#endif /* HEADER_BF_LOCL_H */

#if defined(HEADER_DES_LOCL_H) && !defined(CONFIG_HEADER_DES_LOCL_H)
#define CONFIG_HEADER_DES_LOCL_H
#ifndef DES_DEFAULT_OPTIONS
/* the following is tweaked from a config script, that is why it is a
 * protected undef/define */
#ifndef DES_PTR
#undef DES_PTR
#endif

/* This helps C compiler generate the correct code for multiple functional
 * units.  It reduces register dependancies at the expense of 2 more
 * registers */
#ifndef DES_RISC1
#undef DES_RISC1
#endif

#ifndef DES_RISC2
#undef DES_RISC2
#endif

#if defined(DES_RISC1) && defined(DES_RISC2)
YOU SHOULD NOT HAVE BOTH DES_RISC1 AND DES_RISC2 DEFINED!!!!!
#endif

/* Unroll the inner loop, this sometimes helps, sometimes hinders.
 * Very mucy CPU dependant */
#ifndef DES_UNROLL
#undef DES_UNROLL
#endif

/* These default values were supplied by
 * Peter Gutman 
 * They are only used if nothing else has been defined */
#if !defined(DES_PTR) && !defined(DES_RISC1) && !defined(DES_RISC2) && !defined(DES_UNROLL)
/* Special defines which change the way the code is built depending on the
   CPU and OS.  For SGI machines you can use _MIPS_SZLONG (32 or 64) to find
   even newer MIPS CPU's, but at the moment one size fits all for
   optimization options.  Older Sparc's work better with only UNROLL, but
   there's no way to tell at compile time what it is you're running on */
 
#if defined( sun )		/* Newer Sparc's */
#  define DES_PTR
#  define DES_RISC1
#  define DES_UNROLL
#elif defined( __ultrix )	/* Older MIPS */
#  define DES_PTR
#  define DES_RISC2
#  define DES_UNROLL
#elif defined( __osf1__ )	/* Alpha */
#  define DES_PTR
#  define DES_RISC2
#elif defined ( _AIX )		/* RS6000 */
  /* Unknown */
#elif defined( __hpux )		/* HP-PA */
  /* Unknown */
#elif defined( __aux )		/* 68K */
  /* Unknown */
#elif defined( __dgux )		/* 88K (but P6 in latest boxes) */
#  define DES_UNROLL
#elif defined( __sgi )		/* Newer MIPS */
#  define DES_PTR
#  define DES_RISC2
#  define DES_UNROLL
#elif defined(i386) || defined(__i386__)	/* x86 boxes, should be gcc */
#  define DES_PTR
#  define DES_RISC1
#  define DES_UNROLL
#endif /* Systems-specific speed defines */
#endif

#endif /* DES_DEFAULT_OPTIONS */
#endif /* HEADER_DES_LOCL_H */
xmail-1.27/win32ssl/include/openssl/md2.h0000755000175000017500000000756611341640430017471 0ustar  davidedavide/* crypto/md/md2.h */
/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_MD2_H
#define HEADER_MD2_H

#include  /* OPENSSL_NO_MD2, MD2_INT */
#ifdef OPENSSL_NO_MD2
#error MD2 is disabled.
#endif
#include 

#define MD2_DIGEST_LENGTH	16
#define MD2_BLOCK       	16

#ifdef  __cplusplus
extern "C" {
#endif

typedef struct MD2state_st
	{
	unsigned int num;
	unsigned char data[MD2_BLOCK];
	MD2_INT cksm[MD2_BLOCK];
	MD2_INT state[MD2_BLOCK];
	} MD2_CTX;

const char *MD2_options(void);
#ifdef OPENSSL_FIPS
int private_MD2_Init(MD2_CTX *c);
#endif
int MD2_Init(MD2_CTX *c);
int MD2_Update(MD2_CTX *c, const unsigned char *data, size_t len);
int MD2_Final(unsigned char *md, MD2_CTX *c);
unsigned char *MD2(const unsigned char *d, size_t n,unsigned char *md);
#ifdef  __cplusplus
}
#endif

#endif
xmail-1.27/win32ssl/include/openssl/fips_rand.h0000755000175000017500000000556711341640430020753 0ustar  davidedavide/* ====================================================================
 * Copyright (c) 2003 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

#ifndef HEADER_FIPS_RAND_H
#define HEADER_FIPS_RAND_H

#include "des.h"

#ifdef OPENSSL_FIPS

#ifdef  __cplusplus
extern "C" {
#endif

int FIPS_rand_set_key(const unsigned char *key, FIPS_RAND_SIZE_T keylen);
int FIPS_rand_seed(const void *buf, FIPS_RAND_SIZE_T num);
int FIPS_rand_bytes(unsigned char *out, FIPS_RAND_SIZE_T outlen);

int FIPS_rand_test_mode(void);
void FIPS_rand_reset(void);
int FIPS_rand_set_dt(unsigned char *dt);

int FIPS_rand_status(void);

const RAND_METHOD *FIPS_rand_method(void);

#ifdef  __cplusplus
}
#endif
#endif
#endif
xmail-1.27/win32ssl/include/openssl/dsa.h0000755000175000017500000002663211341640430017551 0ustar  davidedavide/* crypto/dsa/dsa.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

/*
 * The DSS routines are based on patches supplied by
 * Steven Schoch .  He basically did the
 * work and I have just tweaked them a little to fit into my
 * stylistic vision for SSLeay :-) */

#ifndef HEADER_DSA_H
#define HEADER_DSA_H

#include 

#ifdef OPENSSL_NO_DSA
#error DSA is disabled.
#endif

#ifndef OPENSSL_NO_BIO
#include 
#endif
#include 
#include 

#ifndef OPENSSL_NO_DEPRECATED
#include 
#ifndef OPENSSL_NO_DH
# include 
#endif
#endif

#ifndef OPENSSL_DSA_MAX_MODULUS_BITS
# define OPENSSL_DSA_MAX_MODULUS_BITS	10000
#endif

#define OPENSSL_DSA_FIPS_MIN_MODULUS_BITS 1024

#define DSA_FLAG_CACHE_MONT_P	0x01
#define DSA_FLAG_NO_EXP_CONSTTIME       0x02 /* new with 0.9.7h; the built-in DSA
                                              * implementation now uses constant time
                                              * modular exponentiation for secret exponents
                                              * by default. This flag causes the
                                              * faster variable sliding window method to
                                              * be used for all exponents.
                                              */

/* If this flag is set the DSA method is FIPS compliant and can be used
 * in FIPS mode. This is set in the validated module method. If an
 * application sets this flag in its own methods it is its reposibility
 * to ensure the result is compliant.
 */

#define DSA_FLAG_FIPS_METHOD			0x0400

/* If this flag is set the operations normally disabled in FIPS mode are
 * permitted it is then the applications responsibility to ensure that the
 * usage is compliant.
 */

#define DSA_FLAG_NON_FIPS_ALLOW			0x0400

#ifdef OPENSSL_FIPS
#define FIPS_DSA_SIZE_T	int
#endif

#ifdef  __cplusplus
extern "C" {
#endif

/* Already defined in ossl_typ.h */
/* typedef struct dsa_st DSA; */
/* typedef struct dsa_method DSA_METHOD; */

typedef struct DSA_SIG_st
	{
	BIGNUM *r;
	BIGNUM *s;
	} DSA_SIG;

struct dsa_method
	{
	const char *name;
	DSA_SIG * (*dsa_do_sign)(const unsigned char *dgst, int dlen, DSA *dsa);
	int (*dsa_sign_setup)(DSA *dsa, BN_CTX *ctx_in, BIGNUM **kinvp,
								BIGNUM **rp);
	int (*dsa_do_verify)(const unsigned char *dgst, int dgst_len,
							DSA_SIG *sig, DSA *dsa);
	int (*dsa_mod_exp)(DSA *dsa, BIGNUM *rr, BIGNUM *a1, BIGNUM *p1,
			BIGNUM *a2, BIGNUM *p2, BIGNUM *m, BN_CTX *ctx,
			BN_MONT_CTX *in_mont);
	int (*bn_mod_exp)(DSA *dsa, BIGNUM *r, BIGNUM *a, const BIGNUM *p,
				const BIGNUM *m, BN_CTX *ctx,
				BN_MONT_CTX *m_ctx); /* Can be null */
	int (*init)(DSA *dsa);
	int (*finish)(DSA *dsa);
	int flags;
	char *app_data;
	/* If this is non-NULL, it is used to generate DSA parameters */
	int (*dsa_paramgen)(DSA *dsa, int bits,
			unsigned char *seed, int seed_len,
			int *counter_ret, unsigned long *h_ret,
			BN_GENCB *cb);
	/* If this is non-NULL, it is used to generate DSA keys */
	int (*dsa_keygen)(DSA *dsa);
	};

struct dsa_st
	{
	/* This first variable is used to pick up errors where
	 * a DSA is passed instead of of a EVP_PKEY */
	int pad;
	long version;
	int write_params;
	BIGNUM *p;
	BIGNUM *q;	/* == 20 */
	BIGNUM *g;

	BIGNUM *pub_key;  /* y public key */
	BIGNUM *priv_key; /* x private key */

	BIGNUM *kinv;	/* Signing pre-calc */
	BIGNUM *r;	/* Signing pre-calc */

	int flags;
	/* Normally used to cache montgomery values */
	BN_MONT_CTX *method_mont_p;
	int references;
	CRYPTO_EX_DATA ex_data;
	const DSA_METHOD *meth;
	/* functional reference if 'meth' is ENGINE-provided */
	ENGINE *engine;
	};

#define DSAparams_dup(x) ASN1_dup_of_const(DSA,i2d_DSAparams,d2i_DSAparams,x)
#define d2i_DSAparams_fp(fp,x) (DSA *)ASN1_d2i_fp((char *(*)())DSA_new, \
		(char *(*)())d2i_DSAparams,(fp),(unsigned char **)(x))
#define i2d_DSAparams_fp(fp,x) ASN1_i2d_fp(i2d_DSAparams,(fp), \
		(unsigned char *)(x))
#define d2i_DSAparams_bio(bp,x) ASN1_d2i_bio_of(DSA,DSA_new,d2i_DSAparams,bp,x)
#define i2d_DSAparams_bio(bp,x) ASN1_i2d_bio_of_const(DSA,i2d_DSAparams,bp,x)


DSA_SIG * DSA_SIG_new(void);
void	DSA_SIG_free(DSA_SIG *a);
int	i2d_DSA_SIG(const DSA_SIG *a, unsigned char **pp);
DSA_SIG * d2i_DSA_SIG(DSA_SIG **v, const unsigned char **pp, long length);

DSA_SIG * DSA_do_sign(const unsigned char *dgst,int dlen,DSA *dsa);
int	DSA_do_verify(const unsigned char *dgst,int dgst_len,
		      DSA_SIG *sig,DSA *dsa);

const DSA_METHOD *DSA_OpenSSL(void);

void	DSA_set_default_method(const DSA_METHOD *);
const DSA_METHOD *DSA_get_default_method(void);
int	DSA_set_method(DSA *dsa, const DSA_METHOD *);

#ifdef OPENSSL_FIPS
DSA *	FIPS_dsa_new(void);
void	FIPS_dsa_free (DSA *r);
#endif

DSA *	DSA_new(void);
DSA *	DSA_new_method(ENGINE *engine);
void	DSA_free (DSA *r);
/* "up" the DSA object's reference count */
int	DSA_up_ref(DSA *r);
int	DSA_size(const DSA *);
	/* next 4 return -1 on error */
int	DSA_sign_setup( DSA *dsa,BN_CTX *ctx_in,BIGNUM **kinvp,BIGNUM **rp);
int	DSA_sign(int type,const unsigned char *dgst,int dlen,
		unsigned char *sig, unsigned int *siglen, DSA *dsa);
int	DSA_verify(int type,const unsigned char *dgst,int dgst_len,
		const unsigned char *sigbuf, int siglen, DSA *dsa);
int DSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
	     CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
int DSA_set_ex_data(DSA *d, int idx, void *arg);
void *DSA_get_ex_data(DSA *d, int idx);

DSA *	d2i_DSAPublicKey(DSA **a, const unsigned char **pp, long length);
DSA *	d2i_DSAPrivateKey(DSA **a, const unsigned char **pp, long length);
DSA * 	d2i_DSAparams(DSA **a, const unsigned char **pp, long length);

/* Deprecated version */
#ifndef OPENSSL_NO_DEPRECATED
DSA *	DSA_generate_parameters(int bits,
		unsigned char *seed,int seed_len,
		int *counter_ret, unsigned long *h_ret,void
		(*callback)(int, int, void *),void *cb_arg);
#endif /* !defined(OPENSSL_NO_DEPRECATED) */

/* New version */
int	DSA_generate_parameters_ex(DSA *dsa, int bits,
		unsigned char *seed,int seed_len,
		int *counter_ret, unsigned long *h_ret, BN_GENCB *cb);

int	DSA_generate_key(DSA *a);
int	i2d_DSAPublicKey(const DSA *a, unsigned char **pp);
int 	i2d_DSAPrivateKey(const DSA *a, unsigned char **pp);
int	i2d_DSAparams(const DSA *a,unsigned char **pp);

#ifndef OPENSSL_NO_BIO
int	DSAparams_print(BIO *bp, const DSA *x);
int	DSA_print(BIO *bp, const DSA *x, int off);
#endif
#ifndef OPENSSL_NO_FP_API
int	DSAparams_print_fp(FILE *fp, const DSA *x);
int	DSA_print_fp(FILE *bp, const DSA *x, int off);
#endif

#define DSS_prime_checks 50
/* Primality test according to FIPS PUB 186[-1], Appendix 2.1:
 * 50 rounds of Rabin-Miller */
#define DSA_is_prime(n, callback, cb_arg) \
	BN_is_prime(n, DSS_prime_checks, callback, NULL, cb_arg)

#ifndef OPENSSL_NO_DH
/* Convert DSA structure (key or just parameters) into DH structure
 * (be careful to avoid small subgroup attacks when using this!) */
DH *DSA_dup_DH(const DSA *r);
#endif

#ifdef OPENSSL_FIPS
int FIPS_dsa_sig_encode(unsigned char *out, DSA_SIG *sig);
int FIPS_dsa_sig_decode(DSA_SIG *sig, const unsigned char *in, int inlen);
#endif

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_DSA_strings(void);

/* Error codes for the DSA functions. */

/* Function codes. */
#define DSA_F_D2I_DSA_SIG				 110
#define DSA_F_DSAPARAMS_PRINT				 100
#define DSA_F_DSAPARAMS_PRINT_FP			 101
#define DSA_F_DSA_BUILTIN_KEYGEN			 119
#define DSA_F_DSA_BUILTIN_PARAMGEN			 118
#define DSA_F_DSA_DO_SIGN				 112
#define DSA_F_DSA_DO_VERIFY				 113
#define DSA_F_DSA_GENERATE_PARAMETERS			 117
#define DSA_F_DSA_NEW_METHOD				 103
#define DSA_F_DSA_PRINT					 104
#define DSA_F_DSA_PRINT_FP				 105
#define DSA_F_DSA_SET_DEFAULT_METHOD			 115
#define DSA_F_DSA_SET_METHOD				 116
#define DSA_F_DSA_SIGN					 106
#define DSA_F_DSA_SIGN_SETUP				 107
#define DSA_F_DSA_SIG_NEW				 109
#define DSA_F_DSA_VERIFY				 108
#define DSA_F_I2D_DSA_SIG				 111
#define DSA_F_SIG_CB					 114

/* Reason codes. */
#define DSA_R_BAD_Q_VALUE				 102
#define DSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE		 100
#define DSA_R_KEY_SIZE_TOO_SMALL			 106
#define DSA_R_MISSING_PARAMETERS			 101
#define DSA_R_MODULUS_TOO_LARGE				 103
#define DSA_R_NON_FIPS_METHOD				 104
#define DSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE	 105

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/md4.h0000755000175000017500000001116211341640430017456 0ustar  davidedavide/* crypto/md4/md4.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_MD4_H
#define HEADER_MD4_H

#include 
#include 

#ifdef  __cplusplus
extern "C" {
#endif

#ifdef OPENSSL_NO_MD4
#error MD4 is disabled.
#endif

/*
 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 * ! MD4_LONG has to be at least 32 bits wide. If it's wider, then !
 * ! MD4_LONG_LOG2 has to be defined along.			   !
 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 */

#if defined(OPENSSL_SYS_WIN16) || defined(__LP32__)
#define MD4_LONG unsigned long
#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__)
#define MD4_LONG unsigned long
#define MD4_LONG_LOG2 3
/*
 * _CRAY note. I could declare short, but I have no idea what impact
 * does it have on performance on none-T3E machines. I could declare
 * int, but at least on C90 sizeof(int) can be chosen at compile time.
 * So I've chosen long...
 *					
 */
#else
#define MD4_LONG unsigned int
#endif

#define MD4_CBLOCK	64
#define MD4_LBLOCK	(MD4_CBLOCK/4)
#define MD4_DIGEST_LENGTH 16

typedef struct MD4state_st
	{
	MD4_LONG A,B,C,D;
	MD4_LONG Nl,Nh;
	MD4_LONG data[MD4_LBLOCK];
	unsigned int num;
	} MD4_CTX;

#ifdef OPENSSL_FIPS
int private_MD4_Init(MD4_CTX *c);
#endif
int MD4_Init(MD4_CTX *c);
int MD4_Update(MD4_CTX *c, const void *data, size_t len);
int MD4_Final(unsigned char *md, MD4_CTX *c);
unsigned char *MD4(const unsigned char *d, size_t n, unsigned char *md);
void MD4_Transform(MD4_CTX *c, const unsigned char *b);
#ifdef  __cplusplus
}
#endif

#endif
xmail-1.27/win32ssl/include/openssl/idea.h0000755000175000017500000001057311341640430017701 0ustar  davidedavide/* crypto/idea/idea.h */
/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_IDEA_H
#define HEADER_IDEA_H

#include  /* IDEA_INT, OPENSSL_NO_IDEA */

#ifdef OPENSSL_NO_IDEA
#error IDEA is disabled.
#endif

#define IDEA_ENCRYPT	1
#define IDEA_DECRYPT	0

#define IDEA_BLOCK	8
#define IDEA_KEY_LENGTH	16

#ifdef  __cplusplus
extern "C" {
#endif

typedef struct idea_key_st
	{
	IDEA_INT data[9][6];
	} IDEA_KEY_SCHEDULE;

const char *idea_options(void);
void idea_ecb_encrypt(const unsigned char *in, unsigned char *out,
	IDEA_KEY_SCHEDULE *ks);
#ifdef OPENSSL_FIPS
void private_idea_set_encrypt_key(const unsigned char *key, IDEA_KEY_SCHEDULE *ks);
#endif
void idea_set_encrypt_key(const unsigned char *key, IDEA_KEY_SCHEDULE *ks);
void idea_set_decrypt_key(const IDEA_KEY_SCHEDULE *ek, IDEA_KEY_SCHEDULE *dk);
void idea_cbc_encrypt(const unsigned char *in, unsigned char *out,
	long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv,int enc);
void idea_cfb64_encrypt(const unsigned char *in, unsigned char *out,
	long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv,
	int *num,int enc);
void idea_ofb64_encrypt(const unsigned char *in, unsigned char *out,
	long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, int *num);
void idea_encrypt(unsigned long *in, IDEA_KEY_SCHEDULE *ks);
#ifdef  __cplusplus
}
#endif

#endif
xmail-1.27/win32ssl/include/openssl/pem.h0000755000175000017500000006713111341640430017562 0ustar  davidedavide/* crypto/pem/pem.h */
/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_PEM_H
#define HEADER_PEM_H

#include 
#ifndef OPENSSL_NO_BIO
#include 
#endif
#ifndef OPENSSL_NO_STACK
#include 
#endif
#include 
#include 
#include 

#ifdef  __cplusplus
extern "C" {
#endif

#define PEM_BUFSIZE		1024

#define PEM_OBJ_UNDEF		0
#define PEM_OBJ_X509		1
#define PEM_OBJ_X509_REQ	2
#define PEM_OBJ_CRL		3
#define PEM_OBJ_SSL_SESSION	4
#define PEM_OBJ_PRIV_KEY	10
#define PEM_OBJ_PRIV_RSA	11
#define PEM_OBJ_PRIV_DSA	12
#define PEM_OBJ_PRIV_DH		13
#define PEM_OBJ_PUB_RSA		14
#define PEM_OBJ_PUB_DSA		15
#define PEM_OBJ_PUB_DH		16
#define PEM_OBJ_DHPARAMS	17
#define PEM_OBJ_DSAPARAMS	18
#define PEM_OBJ_PRIV_RSA_PUBLIC	19
#define PEM_OBJ_PRIV_ECDSA	20
#define PEM_OBJ_PUB_ECDSA	21
#define PEM_OBJ_ECPARAMETERS	22

#define PEM_ERROR		30
#define PEM_DEK_DES_CBC         40
#define PEM_DEK_IDEA_CBC        45
#define PEM_DEK_DES_EDE         50
#define PEM_DEK_DES_ECB         60
#define PEM_DEK_RSA             70
#define PEM_DEK_RSA_MD2         80
#define PEM_DEK_RSA_MD5         90

#define PEM_MD_MD2		NID_md2
#define PEM_MD_MD5		NID_md5
#define PEM_MD_SHA		NID_sha
#define PEM_MD_MD2_RSA		NID_md2WithRSAEncryption
#define PEM_MD_MD5_RSA		NID_md5WithRSAEncryption
#define PEM_MD_SHA_RSA		NID_sha1WithRSAEncryption

#define PEM_STRING_X509_OLD	"X509 CERTIFICATE"
#define PEM_STRING_X509		"CERTIFICATE"
#define PEM_STRING_X509_PAIR	"CERTIFICATE PAIR"
#define PEM_STRING_X509_TRUSTED	"TRUSTED CERTIFICATE"
#define PEM_STRING_X509_REQ_OLD	"NEW CERTIFICATE REQUEST"
#define PEM_STRING_X509_REQ	"CERTIFICATE REQUEST"
#define PEM_STRING_X509_CRL	"X509 CRL"
#define PEM_STRING_EVP_PKEY	"ANY PRIVATE KEY"
#define PEM_STRING_PUBLIC	"PUBLIC KEY"
#define PEM_STRING_RSA		"RSA PRIVATE KEY"
#define PEM_STRING_RSA_PUBLIC	"RSA PUBLIC KEY"
#define PEM_STRING_DSA		"DSA PRIVATE KEY"
#define PEM_STRING_DSA_PUBLIC	"DSA PUBLIC KEY"
#define PEM_STRING_PKCS7	"PKCS7"
#define PEM_STRING_PKCS7_SIGNED	"PKCS #7 SIGNED DATA"
#define PEM_STRING_PKCS8	"ENCRYPTED PRIVATE KEY"
#define PEM_STRING_PKCS8INF	"PRIVATE KEY"
#define PEM_STRING_DHPARAMS	"DH PARAMETERS"
#define PEM_STRING_SSL_SESSION	"SSL SESSION PARAMETERS"
#define PEM_STRING_DSAPARAMS	"DSA PARAMETERS"
#define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY"
#define PEM_STRING_ECPARAMETERS "EC PARAMETERS"
#define PEM_STRING_ECPRIVATEKEY	"EC PRIVATE KEY"
#define PEM_STRING_CMS		"CMS"

  /* Note that this structure is initialised by PEM_SealInit and cleaned up
     by PEM_SealFinal (at least for now) */
typedef struct PEM_Encode_Seal_st
	{
	EVP_ENCODE_CTX encode;
	EVP_MD_CTX md;
	EVP_CIPHER_CTX cipher;
	} PEM_ENCODE_SEAL_CTX;

/* enc_type is one off */
#define PEM_TYPE_ENCRYPTED      10
#define PEM_TYPE_MIC_ONLY       20
#define PEM_TYPE_MIC_CLEAR      30
#define PEM_TYPE_CLEAR		40

typedef struct pem_recip_st
	{
	char *name;
	X509_NAME *dn;

	int cipher;
	int key_enc;
	/*	char iv[8]; unused and wrong size */
	} PEM_USER;

typedef struct pem_ctx_st
	{
	int type;		/* what type of object */

	struct	{
		int version;	
		int mode;		
		} proc_type;

	char *domain;

	struct	{
		int cipher;
	/* unused, and wrong size
	   unsigned char iv[8]; */
		} DEK_info;
		
	PEM_USER *originator;

	int num_recipient;
	PEM_USER **recipient;

#ifndef OPENSSL_NO_STACK
	STACK *x509_chain;	/* certificate chain */
#else
	char *x509_chain;	/* certificate chain */
#endif
	EVP_MD *md;		/* signature type */

	int md_enc;		/* is the md encrypted or not? */
	int md_len;		/* length of md_data */
	char *md_data;		/* message digest, could be pkey encrypted */

	EVP_CIPHER *dec;	/* date encryption cipher */
	int key_len;		/* key length */
	unsigned char *key;	/* key */
	/* unused, and wrong size
	   unsigned char iv[8]; */

	
	int  data_enc;		/* is the data encrypted */
	int data_len;
	unsigned char *data;
	} PEM_CTX;

/* These macros make the PEM_read/PEM_write functions easier to maintain and
 * write. Now they are all implemented with either:
 * IMPLEMENT_PEM_rw(...) or IMPLEMENT_PEM_rw_cb(...)
 */

#ifdef OPENSSL_NO_FP_API

#define IMPLEMENT_PEM_read_fp(name, type, str, asn1) /**/
#define IMPLEMENT_PEM_write_fp(name, type, str, asn1) /**/
#define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) /**/
#define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) /**/
#define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) /**/

#else

#define IMPLEMENT_PEM_read_fp(name, type, str, asn1) \
type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u)\
{ \
    return (type*)PEM_ASN1_read(CHECKED_D2I_OF(type, d2i_##asn1), \
				str, fp, \
				CHECKED_PPTR_OF(type, x), \
				cb, u); \
} 

#define IMPLEMENT_PEM_write_fp(name, type, str, asn1) \
int PEM_write_##name(FILE *fp, type *x) \
{ \
    return PEM_ASN1_write(CHECKED_I2D_OF(type, i2d_##asn1), \
			  str, fp, \
			  CHECKED_PTR_OF(type, x), \
			  NULL, NULL, 0, NULL, NULL); \
}

#define IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) \
int PEM_write_##name(FILE *fp, const type *x) \
{ \
    return PEM_ASN1_write(CHECKED_I2D_OF(const type, i2d_##asn1), \
			  str, fp, \
			  CHECKED_PTR_OF(const type, x), \
			  NULL, NULL, 0, NULL, NULL); \
}

#define IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) \
int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \
	     unsigned char *kstr, int klen, pem_password_cb *cb, \
		  void *u) \
	{ \
	    return PEM_ASN1_write(CHECKED_I2D_OF(type, i2d_##asn1), \
				  str, fp, \
				  CHECKED_PTR_OF(type, x), \
				  enc, kstr, klen, cb, u); \
	}

#define IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) \
int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \
	     unsigned char *kstr, int klen, pem_password_cb *cb, \
		  void *u) \
	{ \
	    return PEM_ASN1_write(CHECKED_I2D_OF(const type, i2d_##asn1), \
				  str, fp, \
				  CHECKED_PTR_OF(const type, x), \
				  enc, kstr, klen, cb, u); \
	}

#endif

#define IMPLEMENT_PEM_read_bio(name, type, str, asn1) \
type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u)\
{ \
    return (type*)PEM_ASN1_read_bio(CHECKED_D2I_OF(type, d2i_##asn1), \
				    str, bp, \
				    CHECKED_PPTR_OF(type, x), \
				    cb, u); \
}

#define IMPLEMENT_PEM_write_bio(name, type, str, asn1) \
int PEM_write_bio_##name(BIO *bp, type *x) \
{ \
    return PEM_ASN1_write_bio(CHECKED_I2D_OF(type, i2d_##asn1), \
			      str, bp, \
			      CHECKED_PTR_OF(type, x), \
			      NULL, NULL, 0, NULL, NULL); \
}

#define IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \
int PEM_write_bio_##name(BIO *bp, const type *x) \
{ \
    return PEM_ASN1_write_bio(CHECKED_I2D_OF(const type, i2d_##asn1), \
			      str, bp, \
			      CHECKED_PTR_OF(const type, x), \
			      NULL, NULL, 0, NULL, NULL); \
}

#define IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \
int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \
	     unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \
	{ \
	    return PEM_ASN1_write_bio(CHECKED_I2D_OF(type, i2d_##asn1), \
				      str, bp, \
				      CHECKED_PTR_OF(type, x), \
				      enc, kstr, klen, cb, u); \
	}

#define IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \
int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \
	     unsigned char *kstr, int klen, pem_password_cb *cb, void *u) \
	{ \
	    return PEM_ASN1_write_bio(CHECKED_I2D_OF(const type, i2d_##asn1), \
				      str, bp, \
				      CHECKED_PTR_OF(const type, x), \
				      enc, kstr, klen, cb, u); \
	}

#define IMPLEMENT_PEM_write(name, type, str, asn1) \
	IMPLEMENT_PEM_write_bio(name, type, str, asn1) \
	IMPLEMENT_PEM_write_fp(name, type, str, asn1) 

#define IMPLEMENT_PEM_write_const(name, type, str, asn1) \
	IMPLEMENT_PEM_write_bio_const(name, type, str, asn1) \
	IMPLEMENT_PEM_write_fp_const(name, type, str, asn1) 

#define IMPLEMENT_PEM_write_cb(name, type, str, asn1) \
	IMPLEMENT_PEM_write_cb_bio(name, type, str, asn1) \
	IMPLEMENT_PEM_write_cb_fp(name, type, str, asn1) 

#define IMPLEMENT_PEM_write_cb_const(name, type, str, asn1) \
	IMPLEMENT_PEM_write_cb_bio_const(name, type, str, asn1) \
	IMPLEMENT_PEM_write_cb_fp_const(name, type, str, asn1) 

#define IMPLEMENT_PEM_read(name, type, str, asn1) \
	IMPLEMENT_PEM_read_bio(name, type, str, asn1) \
	IMPLEMENT_PEM_read_fp(name, type, str, asn1) 

#define IMPLEMENT_PEM_rw(name, type, str, asn1) \
	IMPLEMENT_PEM_read(name, type, str, asn1) \
	IMPLEMENT_PEM_write(name, type, str, asn1)

#define IMPLEMENT_PEM_rw_const(name, type, str, asn1) \
	IMPLEMENT_PEM_read(name, type, str, asn1) \
	IMPLEMENT_PEM_write_const(name, type, str, asn1)

#define IMPLEMENT_PEM_rw_cb(name, type, str, asn1) \
	IMPLEMENT_PEM_read(name, type, str, asn1) \
	IMPLEMENT_PEM_write_cb(name, type, str, asn1)

/* These are the same except they are for the declarations */

#if defined(OPENSSL_SYS_WIN16) || defined(OPENSSL_NO_FP_API)

#define DECLARE_PEM_read_fp(name, type) /**/
#define DECLARE_PEM_write_fp(name, type) /**/
#define DECLARE_PEM_write_fp_const(name, type) /**/
#define DECLARE_PEM_write_cb_fp(name, type) /**/

#else

#define DECLARE_PEM_read_fp(name, type) \
	type *PEM_read_##name(FILE *fp, type **x, pem_password_cb *cb, void *u);

#define DECLARE_PEM_write_fp(name, type) \
	int PEM_write_##name(FILE *fp, type *x);

#define DECLARE_PEM_write_fp_const(name, type) \
	int PEM_write_##name(FILE *fp, const type *x);

#define DECLARE_PEM_write_cb_fp(name, type) \
	int PEM_write_##name(FILE *fp, type *x, const EVP_CIPHER *enc, \
	     unsigned char *kstr, int klen, pem_password_cb *cb, void *u);

#endif

#ifndef OPENSSL_NO_BIO
#define DECLARE_PEM_read_bio(name, type) \
	type *PEM_read_bio_##name(BIO *bp, type **x, pem_password_cb *cb, void *u);

#define DECLARE_PEM_write_bio(name, type) \
	int PEM_write_bio_##name(BIO *bp, type *x);

#define DECLARE_PEM_write_bio_const(name, type) \
	int PEM_write_bio_##name(BIO *bp, const type *x);

#define DECLARE_PEM_write_cb_bio(name, type) \
	int PEM_write_bio_##name(BIO *bp, type *x, const EVP_CIPHER *enc, \
	     unsigned char *kstr, int klen, pem_password_cb *cb, void *u);

#else

#define DECLARE_PEM_read_bio(name, type) /**/
#define DECLARE_PEM_write_bio(name, type) /**/
#define DECLARE_PEM_write_bio_const(name, type) /**/
#define DECLARE_PEM_write_cb_bio(name, type) /**/

#endif

#define DECLARE_PEM_write(name, type) \
	DECLARE_PEM_write_bio(name, type) \
	DECLARE_PEM_write_fp(name, type) 

#define DECLARE_PEM_write_const(name, type) \
	DECLARE_PEM_write_bio_const(name, type) \
	DECLARE_PEM_write_fp_const(name, type)

#define DECLARE_PEM_write_cb(name, type) \
	DECLARE_PEM_write_cb_bio(name, type) \
	DECLARE_PEM_write_cb_fp(name, type) 

#define DECLARE_PEM_read(name, type) \
	DECLARE_PEM_read_bio(name, type) \
	DECLARE_PEM_read_fp(name, type)

#define DECLARE_PEM_rw(name, type) \
	DECLARE_PEM_read(name, type) \
	DECLARE_PEM_write(name, type)

#define DECLARE_PEM_rw_const(name, type) \
	DECLARE_PEM_read(name, type) \
	DECLARE_PEM_write_const(name, type)

#define DECLARE_PEM_rw_cb(name, type) \
	DECLARE_PEM_read(name, type) \
	DECLARE_PEM_write_cb(name, type)

#ifdef SSLEAY_MACROS

#define PEM_write_SSL_SESSION(fp,x) \
		PEM_ASN1_write((int (*)())i2d_SSL_SESSION, \
			PEM_STRING_SSL_SESSION,fp, (char *)x, NULL,NULL,0,NULL,NULL)
#define PEM_write_X509(fp,x) \
		PEM_ASN1_write((int (*)())i2d_X509,PEM_STRING_X509,fp, \
			(char *)x, NULL,NULL,0,NULL,NULL)
#define PEM_write_X509_REQ(fp,x) PEM_ASN1_write( \
		(int (*)())i2d_X509_REQ,PEM_STRING_X509_REQ,fp,(char *)x, \
			NULL,NULL,0,NULL,NULL)
#define PEM_write_X509_CRL(fp,x) \
		PEM_ASN1_write((int (*)())i2d_X509_CRL,PEM_STRING_X509_CRL, \
			fp,(char *)x, NULL,NULL,0,NULL,NULL)
#define	PEM_write_RSAPrivateKey(fp,x,enc,kstr,klen,cb,u) \
		PEM_ASN1_write((int (*)())i2d_RSAPrivateKey,PEM_STRING_RSA,fp,\
			(char *)x,enc,kstr,klen,cb,u)
#define	PEM_write_RSAPublicKey(fp,x) \
		PEM_ASN1_write((int (*)())i2d_RSAPublicKey,\
			PEM_STRING_RSA_PUBLIC,fp,(char *)x,NULL,NULL,0,NULL,NULL)
#define	PEM_write_DSAPrivateKey(fp,x,enc,kstr,klen,cb,u) \
		PEM_ASN1_write((int (*)())i2d_DSAPrivateKey,PEM_STRING_DSA,fp,\
			(char *)x,enc,kstr,klen,cb,u)
#define	PEM_write_PrivateKey(bp,x,enc,kstr,klen,cb,u) \
		PEM_ASN1_write((int (*)())i2d_PrivateKey,\
		(((x)->type == EVP_PKEY_DSA)?PEM_STRING_DSA:PEM_STRING_RSA),\
			bp,(char *)x,enc,kstr,klen,cb,u)
#define PEM_write_PKCS7(fp,x) \
		PEM_ASN1_write((int (*)())i2d_PKCS7,PEM_STRING_PKCS7,fp, \
			(char *)x, NULL,NULL,0,NULL,NULL)
#define PEM_write_DHparams(fp,x) \
		PEM_ASN1_write((int (*)())i2d_DHparams,PEM_STRING_DHPARAMS,fp,\
			(char *)x,NULL,NULL,0,NULL,NULL)

#define PEM_write_NETSCAPE_CERT_SEQUENCE(fp,x) \
                PEM_ASN1_write((int (*)())i2d_NETSCAPE_CERT_SEQUENCE, \
			PEM_STRING_X509,fp, \
                        (char *)x, NULL,NULL,0,NULL,NULL)

#define	PEM_read_SSL_SESSION(fp,x,cb,u) (SSL_SESSION *)PEM_ASN1_read( \
	(char *(*)())d2i_SSL_SESSION,PEM_STRING_SSL_SESSION,fp,(char **)x,cb,u)
#define	PEM_read_X509(fp,x,cb,u) (X509 *)PEM_ASN1_read( \
	(char *(*)())d2i_X509,PEM_STRING_X509,fp,(char **)x,cb,u)
#define	PEM_read_X509_REQ(fp,x,cb,u) (X509_REQ *)PEM_ASN1_read( \
	(char *(*)())d2i_X509_REQ,PEM_STRING_X509_REQ,fp,(char **)x,cb,u)
#define	PEM_read_X509_CRL(fp,x,cb,u) (X509_CRL *)PEM_ASN1_read( \
	(char *(*)())d2i_X509_CRL,PEM_STRING_X509_CRL,fp,(char **)x,cb,u)
#define	PEM_read_RSAPrivateKey(fp,x,cb,u) (RSA *)PEM_ASN1_read( \
	(char *(*)())d2i_RSAPrivateKey,PEM_STRING_RSA,fp,(char **)x,cb,u)
#define	PEM_read_RSAPublicKey(fp,x,cb,u) (RSA *)PEM_ASN1_read( \
	(char *(*)())d2i_RSAPublicKey,PEM_STRING_RSA_PUBLIC,fp,(char **)x,cb,u)
#define	PEM_read_DSAPrivateKey(fp,x,cb,u) (DSA *)PEM_ASN1_read( \
	(char *(*)())d2i_DSAPrivateKey,PEM_STRING_DSA,fp,(char **)x,cb,u)
#define	PEM_read_PrivateKey(fp,x,cb,u) (EVP_PKEY *)PEM_ASN1_read( \
	(char *(*)())d2i_PrivateKey,PEM_STRING_EVP_PKEY,fp,(char **)x,cb,u)
#define	PEM_read_PKCS7(fp,x,cb,u) (PKCS7 *)PEM_ASN1_read( \
	(char *(*)())d2i_PKCS7,PEM_STRING_PKCS7,fp,(char **)x,cb,u)
#define	PEM_read_DHparams(fp,x,cb,u) (DH *)PEM_ASN1_read( \
	(char *(*)())d2i_DHparams,PEM_STRING_DHPARAMS,fp,(char **)x,cb,u)

#define PEM_read_NETSCAPE_CERT_SEQUENCE(fp,x,cb,u) \
		(NETSCAPE_CERT_SEQUENCE *)PEM_ASN1_read( \
        (char *(*)())d2i_NETSCAPE_CERT_SEQUENCE,PEM_STRING_X509,fp,\
							(char **)x,cb,u)

#define PEM_write_bio_X509(bp,x) \
		PEM_ASN1_write_bio((int (*)())i2d_X509,PEM_STRING_X509,bp, \
			(char *)x, NULL,NULL,0,NULL,NULL)
#define PEM_write_bio_X509_REQ(bp,x) PEM_ASN1_write_bio( \
		(int (*)())i2d_X509_REQ,PEM_STRING_X509_REQ,bp,(char *)x, \
			NULL,NULL,0,NULL,NULL)
#define PEM_write_bio_X509_CRL(bp,x) \
		PEM_ASN1_write_bio((int (*)())i2d_X509_CRL,PEM_STRING_X509_CRL,\
			bp,(char *)x, NULL,NULL,0,NULL,NULL)
#define	PEM_write_bio_RSAPrivateKey(bp,x,enc,kstr,klen,cb,u) \
		PEM_ASN1_write_bio((int (*)())i2d_RSAPrivateKey,PEM_STRING_RSA,\
			bp,(char *)x,enc,kstr,klen,cb,u)
#define	PEM_write_bio_RSAPublicKey(bp,x) \
		PEM_ASN1_write_bio((int (*)())i2d_RSAPublicKey, \
			PEM_STRING_RSA_PUBLIC,\
			bp,(char *)x,NULL,NULL,0,NULL,NULL)
#define	PEM_write_bio_DSAPrivateKey(bp,x,enc,kstr,klen,cb,u) \
		PEM_ASN1_write_bio((int (*)())i2d_DSAPrivateKey,PEM_STRING_DSA,\
			bp,(char *)x,enc,kstr,klen,cb,u)
#define	PEM_write_bio_PrivateKey(bp,x,enc,kstr,klen,cb,u) \
		PEM_ASN1_write_bio((int (*)())i2d_PrivateKey,\
		(((x)->type == EVP_PKEY_DSA)?PEM_STRING_DSA:PEM_STRING_RSA),\
			bp,(char *)x,enc,kstr,klen,cb,u)
#define PEM_write_bio_PKCS7(bp,x) \
		PEM_ASN1_write_bio((int (*)())i2d_PKCS7,PEM_STRING_PKCS7,bp, \
			(char *)x, NULL,NULL,0,NULL,NULL)
#define PEM_write_bio_DHparams(bp,x) \
		PEM_ASN1_write_bio((int (*)())i2d_DHparams,PEM_STRING_DHPARAMS,\
			bp,(char *)x,NULL,NULL,0,NULL,NULL)
#define PEM_write_bio_DSAparams(bp,x) \
		PEM_ASN1_write_bio((int (*)())i2d_DSAparams, \
			PEM_STRING_DSAPARAMS,bp,(char *)x,NULL,NULL,0,NULL,NULL)

#define PEM_write_bio_NETSCAPE_CERT_SEQUENCE(bp,x) \
                PEM_ASN1_write_bio((int (*)())i2d_NETSCAPE_CERT_SEQUENCE, \
			PEM_STRING_X509,bp, \
                        (char *)x, NULL,NULL,0,NULL,NULL)

#define	PEM_read_bio_X509(bp,x,cb,u) (X509 *)PEM_ASN1_read_bio( \
	(char *(*)())d2i_X509,PEM_STRING_X509,bp,(char **)x,cb,u)
#define	PEM_read_bio_X509_REQ(bp,x,cb,u) (X509_REQ *)PEM_ASN1_read_bio( \
	(char *(*)())d2i_X509_REQ,PEM_STRING_X509_REQ,bp,(char **)x,cb,u)
#define	PEM_read_bio_X509_CRL(bp,x,cb,u) (X509_CRL *)PEM_ASN1_read_bio( \
	(char *(*)())d2i_X509_CRL,PEM_STRING_X509_CRL,bp,(char **)x,cb,u)
#define	PEM_read_bio_RSAPrivateKey(bp,x,cb,u) (RSA *)PEM_ASN1_read_bio( \
	(char *(*)())d2i_RSAPrivateKey,PEM_STRING_RSA,bp,(char **)x,cb,u)
#define	PEM_read_bio_RSAPublicKey(bp,x,cb,u) (RSA *)PEM_ASN1_read_bio( \
	(char *(*)())d2i_RSAPublicKey,PEM_STRING_RSA_PUBLIC,bp,(char **)x,cb,u)
#define	PEM_read_bio_DSAPrivateKey(bp,x,cb,u) (DSA *)PEM_ASN1_read_bio( \
	(char *(*)())d2i_DSAPrivateKey,PEM_STRING_DSA,bp,(char **)x,cb,u)
#define	PEM_read_bio_PrivateKey(bp,x,cb,u) (EVP_PKEY *)PEM_ASN1_read_bio( \
	(char *(*)())d2i_PrivateKey,PEM_STRING_EVP_PKEY,bp,(char **)x,cb,u)

#define	PEM_read_bio_PKCS7(bp,x,cb,u) (PKCS7 *)PEM_ASN1_read_bio( \
	(char *(*)())d2i_PKCS7,PEM_STRING_PKCS7,bp,(char **)x,cb,u)
#define	PEM_read_bio_DHparams(bp,x,cb,u) (DH *)PEM_ASN1_read_bio( \
	(char *(*)())d2i_DHparams,PEM_STRING_DHPARAMS,bp,(char **)x,cb,u)
#define	PEM_read_bio_DSAparams(bp,x,cb,u) (DSA *)PEM_ASN1_read_bio( \
	(char *(*)())d2i_DSAparams,PEM_STRING_DSAPARAMS,bp,(char **)x,cb,u)

#define PEM_read_bio_NETSCAPE_CERT_SEQUENCE(bp,x,cb,u) \
		(NETSCAPE_CERT_SEQUENCE *)PEM_ASN1_read_bio( \
        (char *(*)())d2i_NETSCAPE_CERT_SEQUENCE,PEM_STRING_X509,bp,\
							(char **)x,cb,u)

#endif

#if 1
/* "userdata": new with OpenSSL 0.9.4 */
typedef int pem_password_cb(char *buf, int size, int rwflag, void *userdata);
#else
/* OpenSSL 0.9.3, 0.9.3a */
typedef int pem_password_cb(char *buf, int size, int rwflag);
#endif

int	PEM_get_EVP_CIPHER_INFO(char *header, EVP_CIPHER_INFO *cipher);
int	PEM_do_header (EVP_CIPHER_INFO *cipher, unsigned char *data,long *len,
	pem_password_cb *callback,void *u);

#ifndef OPENSSL_NO_BIO
int	PEM_read_bio(BIO *bp, char **name, char **header,
		unsigned char **data,long *len);
int	PEM_write_bio(BIO *bp,const char *name,char *hdr,unsigned char *data,
		long len);
int PEM_bytes_read_bio(unsigned char **pdata, long *plen, char **pnm, const char *name, BIO *bp,
	     pem_password_cb *cb, void *u);
void *	PEM_ASN1_read_bio(d2i_of_void *d2i, const char *name, BIO *bp,
			  void **x, pem_password_cb *cb, void *u);

#define PEM_ASN1_read_bio_of(type,d2i,name,bp,x,cb,u) \
    ((type*)PEM_ASN1_read_bio(CHECKED_D2I_OF(type, d2i), \
			      name, bp,			\
			      CHECKED_PPTR_OF(type, x), \
			      cb, u))

int	PEM_ASN1_write_bio(i2d_of_void *i2d,const char *name,BIO *bp,char *x,
			   const EVP_CIPHER *enc,unsigned char *kstr,int klen,
			   pem_password_cb *cb, void *u);

#define PEM_ASN1_write_bio_of(type,i2d,name,bp,x,enc,kstr,klen,cb,u) \
    (PEM_ASN1_write_bio(CHECKED_I2D_OF(type, i2d), \
			name, bp,		   \
			CHECKED_PTR_OF(type, x), \
			enc, kstr, klen, cb, u))

STACK_OF(X509_INFO) *	PEM_X509_INFO_read_bio(BIO *bp, STACK_OF(X509_INFO) *sk, pem_password_cb *cb, void *u);
int	PEM_X509_INFO_write_bio(BIO *bp,X509_INFO *xi, EVP_CIPHER *enc,
		unsigned char *kstr, int klen, pem_password_cb *cd, void *u);
#endif

#ifndef OPENSSL_SYS_WIN16
int	PEM_read(FILE *fp, char **name, char **header,
		unsigned char **data,long *len);
int	PEM_write(FILE *fp,char *name,char *hdr,unsigned char *data,long len);
void *  PEM_ASN1_read(d2i_of_void *d2i, const char *name, FILE *fp, void **x,
		      pem_password_cb *cb, void *u);
int	PEM_ASN1_write(i2d_of_void *i2d,const char *name,FILE *fp,
		       char *x,const EVP_CIPHER *enc,unsigned char *kstr,
		       int klen,pem_password_cb *callback, void *u);
STACK_OF(X509_INFO) *	PEM_X509_INFO_read(FILE *fp, STACK_OF(X509_INFO) *sk,
	pem_password_cb *cb, void *u);
#endif

int	PEM_SealInit(PEM_ENCODE_SEAL_CTX *ctx, EVP_CIPHER *type,
		EVP_MD *md_type, unsigned char **ek, int *ekl,
		unsigned char *iv, EVP_PKEY **pubk, int npubk);
void	PEM_SealUpdate(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *out, int *outl,
		unsigned char *in, int inl);
int	PEM_SealFinal(PEM_ENCODE_SEAL_CTX *ctx, unsigned char *sig,int *sigl,
		unsigned char *out, int *outl, EVP_PKEY *priv);

void    PEM_SignInit(EVP_MD_CTX *ctx, EVP_MD *type);
void    PEM_SignUpdate(EVP_MD_CTX *ctx,unsigned char *d,unsigned int cnt);
int	PEM_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret,
		unsigned int *siglen, EVP_PKEY *pkey);

int	PEM_def_callback(char *buf, int num, int w, void *key);
void	PEM_proc_type(char *buf, int type);
void	PEM_dek_info(char *buf, const char *type, int len, char *str);

#ifndef SSLEAY_MACROS

#include 

DECLARE_PEM_rw(X509, X509)

DECLARE_PEM_rw(X509_AUX, X509)

DECLARE_PEM_rw(X509_CERT_PAIR, X509_CERT_PAIR)

DECLARE_PEM_rw(X509_REQ, X509_REQ)
DECLARE_PEM_write(X509_REQ_NEW, X509_REQ)

DECLARE_PEM_rw(X509_CRL, X509_CRL)

DECLARE_PEM_rw(PKCS7, PKCS7)

DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE, NETSCAPE_CERT_SEQUENCE)

DECLARE_PEM_rw(PKCS8, X509_SIG)

DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO)

#ifndef OPENSSL_NO_RSA

DECLARE_PEM_rw_cb(RSAPrivateKey, RSA)

DECLARE_PEM_rw_const(RSAPublicKey, RSA)
DECLARE_PEM_rw(RSA_PUBKEY, RSA)

#endif

#ifndef OPENSSL_NO_DSA

DECLARE_PEM_rw_cb(DSAPrivateKey, DSA)

DECLARE_PEM_rw(DSA_PUBKEY, DSA)

DECLARE_PEM_rw_const(DSAparams, DSA)

#endif

#ifndef OPENSSL_NO_EC
DECLARE_PEM_rw_const(ECPKParameters, EC_GROUP)
DECLARE_PEM_rw_cb(ECPrivateKey, EC_KEY)
DECLARE_PEM_rw(EC_PUBKEY, EC_KEY)
#endif

#ifndef OPENSSL_NO_DH

DECLARE_PEM_rw_const(DHparams, DH)

#endif

DECLARE_PEM_rw_cb(PrivateKey, EVP_PKEY)

DECLARE_PEM_rw(PUBKEY, EVP_PKEY)

int PEM_write_bio_PKCS8PrivateKey_nid(BIO *bp, EVP_PKEY *x, int nid,
				  char *kstr, int klen,
				  pem_password_cb *cb, void *u);
int PEM_write_bio_PKCS8PrivateKey(BIO *, EVP_PKEY *, const EVP_CIPHER *,
                                  char *, int, pem_password_cb *, void *);
int i2d_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY *x, const EVP_CIPHER *enc,
				  char *kstr, int klen,
				  pem_password_cb *cb, void *u);
int i2d_PKCS8PrivateKey_nid_bio(BIO *bp, EVP_PKEY *x, int nid,
				  char *kstr, int klen,
				  pem_password_cb *cb, void *u);
EVP_PKEY *d2i_PKCS8PrivateKey_bio(BIO *bp, EVP_PKEY **x, pem_password_cb *cb, void *u);

int i2d_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY *x, const EVP_CIPHER *enc,
				  char *kstr, int klen,
				  pem_password_cb *cb, void *u);
int i2d_PKCS8PrivateKey_nid_fp(FILE *fp, EVP_PKEY *x, int nid,
				  char *kstr, int klen,
				  pem_password_cb *cb, void *u);
int PEM_write_PKCS8PrivateKey_nid(FILE *fp, EVP_PKEY *x, int nid,
				  char *kstr, int klen,
				  pem_password_cb *cb, void *u);

EVP_PKEY *d2i_PKCS8PrivateKey_fp(FILE *fp, EVP_PKEY **x, pem_password_cb *cb, void *u);

int PEM_write_PKCS8PrivateKey(FILE *fp,EVP_PKEY *x,const EVP_CIPHER *enc,
			      char *kstr,int klen, pem_password_cb *cd, void *u);

#endif /* SSLEAY_MACROS */


/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_PEM_strings(void);

/* Error codes for the PEM functions. */

/* Function codes. */
#define PEM_F_D2I_PKCS8PRIVATEKEY_BIO			 120
#define PEM_F_D2I_PKCS8PRIVATEKEY_FP			 121
#define PEM_F_DO_PK8PKEY				 126
#define PEM_F_DO_PK8PKEY_FP				 125
#define PEM_F_LOAD_IV					 101
#define PEM_F_PEM_ASN1_READ				 102
#define PEM_F_PEM_ASN1_READ_BIO				 103
#define PEM_F_PEM_ASN1_WRITE				 104
#define PEM_F_PEM_ASN1_WRITE_BIO			 105
#define PEM_F_PEM_DEF_CALLBACK				 100
#define PEM_F_PEM_DO_HEADER				 106
#define PEM_F_PEM_F_PEM_WRITE_PKCS8PRIVATEKEY		 118
#define PEM_F_PEM_GET_EVP_CIPHER_INFO			 107
#define PEM_F_PEM_PK8PKEY				 119
#define PEM_F_PEM_READ					 108
#define PEM_F_PEM_READ_BIO				 109
#define PEM_F_PEM_READ_BIO_PRIVATEKEY			 123
#define PEM_F_PEM_READ_PRIVATEKEY			 124
#define PEM_F_PEM_SEALFINAL				 110
#define PEM_F_PEM_SEALINIT				 111
#define PEM_F_PEM_SIGNFINAL				 112
#define PEM_F_PEM_WRITE					 113
#define PEM_F_PEM_WRITE_BIO				 114
#define PEM_F_PEM_X509_INFO_READ			 115
#define PEM_F_PEM_X509_INFO_READ_BIO			 116
#define PEM_F_PEM_X509_INFO_WRITE_BIO			 117

/* Reason codes. */
#define PEM_R_BAD_BASE64_DECODE				 100
#define PEM_R_BAD_DECRYPT				 101
#define PEM_R_BAD_END_LINE				 102
#define PEM_R_BAD_IV_CHARS				 103
#define PEM_R_BAD_PASSWORD_READ				 104
#define PEM_R_ERROR_CONVERTING_PRIVATE_KEY		 115
#define PEM_R_NOT_DEK_INFO				 105
#define PEM_R_NOT_ENCRYPTED				 106
#define PEM_R_NOT_PROC_TYPE				 107
#define PEM_R_NO_START_LINE				 108
#define PEM_R_PROBLEMS_GETTING_PASSWORD			 109
#define PEM_R_PUBLIC_KEY_NO_RSA				 110
#define PEM_R_READ_KEY					 111
#define PEM_R_SHORT_HEADER				 112
#define PEM_R_UNSUPPORTED_CIPHER			 113
#define PEM_R_UNSUPPORTED_ENCRYPTION			 114

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/asn1t.h0000755000175000017500000006665111341640430020035 0ustar  davidedavide/* asn1t.h */
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
 * project 2000.
 */
/* ====================================================================
 * Copyright (c) 2000 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    licensing@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */
#ifndef HEADER_ASN1T_H
#define HEADER_ASN1T_H

#include 
#include 
#include 

#ifdef OPENSSL_BUILD_SHLIBCRYPTO
# undef OPENSSL_EXTERN
# define OPENSSL_EXTERN OPENSSL_EXPORT
#endif

/* ASN1 template defines, structures and functions */

#ifdef  __cplusplus
extern "C" {
#endif


#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION

/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */
#define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr))


/* Macros for start and end of ASN1_ITEM definition */

#define ASN1_ITEM_start(itname) \
	OPENSSL_GLOBAL const ASN1_ITEM itname##_it = {

#define ASN1_ITEM_end(itname) \
		};

#else

/* Macro to obtain ASN1_ADB pointer from a type (only used internally) */
#define ASN1_ADB_ptr(iptr) ((const ASN1_ADB *)(iptr()))


/* Macros for start and end of ASN1_ITEM definition */

#define ASN1_ITEM_start(itname) \
	const ASN1_ITEM * itname##_it(void) \
	{ \
		static const ASN1_ITEM local_it = { 

#define ASN1_ITEM_end(itname) \
		}; \
	return &local_it; \
	}

#endif


/* Macros to aid ASN1 template writing */

#define ASN1_ITEM_TEMPLATE(tname) \
	static const ASN1_TEMPLATE tname##_item_tt 

#define ASN1_ITEM_TEMPLATE_END(tname) \
	;\
	ASN1_ITEM_start(tname) \
		ASN1_ITYPE_PRIMITIVE,\
		-1,\
		&tname##_item_tt,\
		0,\
		NULL,\
		0,\
		#tname \
	ASN1_ITEM_end(tname)


/* This is a ASN1 type which just embeds a template */
 
/* This pair helps declare a SEQUENCE. We can do:
 *
 * 	ASN1_SEQUENCE(stname) = {
 * 		... SEQUENCE components ...
 * 	} ASN1_SEQUENCE_END(stname)
 *
 * 	This will produce an ASN1_ITEM called stname_it
 *	for a structure called stname.
 *
 * 	If you want the same structure but a different
 *	name then use:
 *
 * 	ASN1_SEQUENCE(itname) = {
 * 		... SEQUENCE components ...
 * 	} ASN1_SEQUENCE_END_name(stname, itname)
 *
 *	This will create an item called itname_it using
 *	a structure called stname.
 */

#define ASN1_SEQUENCE(tname) \
	static const ASN1_TEMPLATE tname##_seq_tt[] 

#define ASN1_SEQUENCE_END(stname) ASN1_SEQUENCE_END_name(stname, stname)

#define ASN1_SEQUENCE_END_name(stname, tname) \
	;\
	ASN1_ITEM_start(tname) \
		ASN1_ITYPE_SEQUENCE,\
		V_ASN1_SEQUENCE,\
		tname##_seq_tt,\
		sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\
		NULL,\
		sizeof(stname),\
		#stname \
	ASN1_ITEM_end(tname)

#define ASN1_NDEF_SEQUENCE(tname) \
	ASN1_SEQUENCE(tname)

#define ASN1_NDEF_SEQUENCE_cb(tname, cb) \
	ASN1_SEQUENCE_cb(tname, cb)

#define ASN1_SEQUENCE_cb(tname, cb) \
	static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \
	ASN1_SEQUENCE(tname)

#define ASN1_BROKEN_SEQUENCE(tname) \
	static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_BROKEN, 0, 0, 0, 0}; \
	ASN1_SEQUENCE(tname)

#define ASN1_SEQUENCE_ref(tname, cb, lck) \
	static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_REFCOUNT, offsetof(tname, references), lck, cb, 0}; \
	ASN1_SEQUENCE(tname)

#define ASN1_SEQUENCE_enc(tname, enc, cb) \
	static const ASN1_AUX tname##_aux = {NULL, ASN1_AFLG_ENCODING, 0, 0, cb, offsetof(tname, enc)}; \
	ASN1_SEQUENCE(tname)

#define ASN1_NDEF_SEQUENCE_END(tname) \
	;\
	ASN1_ITEM_start(tname) \
		ASN1_ITYPE_NDEF_SEQUENCE,\
		V_ASN1_SEQUENCE,\
		tname##_seq_tt,\
		sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\
		NULL,\
		sizeof(tname),\
		#tname \
	ASN1_ITEM_end(tname)

#define ASN1_BROKEN_SEQUENCE_END(stname) ASN1_SEQUENCE_END_ref(stname, stname)

#define ASN1_SEQUENCE_END_enc(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname)

#define ASN1_SEQUENCE_END_cb(stname, tname) ASN1_SEQUENCE_END_ref(stname, tname)

#define ASN1_SEQUENCE_END_ref(stname, tname) \
	;\
	ASN1_ITEM_start(tname) \
		ASN1_ITYPE_SEQUENCE,\
		V_ASN1_SEQUENCE,\
		tname##_seq_tt,\
		sizeof(tname##_seq_tt) / sizeof(ASN1_TEMPLATE),\
		&tname##_aux,\
		sizeof(stname),\
		#stname \
	ASN1_ITEM_end(tname)


/* This pair helps declare a CHOICE type. We can do:
 *
 * 	ASN1_CHOICE(chname) = {
 * 		... CHOICE options ...
 * 	ASN1_CHOICE_END(chname)
 *
 * 	This will produce an ASN1_ITEM called chname_it
 *	for a structure called chname. The structure
 *	definition must look like this:
 *	typedef struct {
 *		int type;
 *		union {
 *			ASN1_SOMETHING *opt1;
 *			ASN1_SOMEOTHER *opt2;
 *		} value;
 *	} chname;
 *	
 *	the name of the selector must be 'type'.
 * 	to use an alternative selector name use the
 *      ASN1_CHOICE_END_selector() version.
 */

#define ASN1_CHOICE(tname) \
	static const ASN1_TEMPLATE tname##_ch_tt[] 

#define ASN1_CHOICE_cb(tname, cb) \
	static const ASN1_AUX tname##_aux = {NULL, 0, 0, 0, cb, 0}; \
	ASN1_CHOICE(tname)

#define ASN1_CHOICE_END(stname) ASN1_CHOICE_END_name(stname, stname)

#define ASN1_CHOICE_END_name(stname, tname) ASN1_CHOICE_END_selector(stname, tname, type)

#define ASN1_CHOICE_END_selector(stname, tname, selname) \
	;\
	ASN1_ITEM_start(tname) \
		ASN1_ITYPE_CHOICE,\
		offsetof(stname,selname) ,\
		tname##_ch_tt,\
		sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\
		NULL,\
		sizeof(stname),\
		#stname \
	ASN1_ITEM_end(tname)

#define ASN1_CHOICE_END_cb(stname, tname, selname) \
	;\
	ASN1_ITEM_start(tname) \
		ASN1_ITYPE_CHOICE,\
		offsetof(stname,selname) ,\
		tname##_ch_tt,\
		sizeof(tname##_ch_tt) / sizeof(ASN1_TEMPLATE),\
		&tname##_aux,\
		sizeof(stname),\
		#stname \
	ASN1_ITEM_end(tname)

/* This helps with the template wrapper form of ASN1_ITEM */

#define ASN1_EX_TEMPLATE_TYPE(flags, tag, name, type) { \
	(flags), (tag), 0,\
	#name, ASN1_ITEM_ref(type) }

/* These help with SEQUENCE or CHOICE components */

/* used to declare other types */

#define ASN1_EX_TYPE(flags, tag, stname, field, type) { \
	(flags), (tag), offsetof(stname, field),\
	#field, ASN1_ITEM_ref(type) }

/* used when the structure is combined with the parent */

#define ASN1_EX_COMBINE(flags, tag, type) { \
	(flags)|ASN1_TFLG_COMBINE, (tag), 0, NULL, ASN1_ITEM_ref(type) }

/* implicit and explicit helper macros */

#define ASN1_IMP_EX(stname, field, type, tag, ex) \
		ASN1_EX_TYPE(ASN1_TFLG_IMPLICIT | ex, tag, stname, field, type)

#define ASN1_EXP_EX(stname, field, type, tag, ex) \
		ASN1_EX_TYPE(ASN1_TFLG_EXPLICIT | ex, tag, stname, field, type)

/* Any defined by macros: the field used is in the table itself */

#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION
#define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) }
#define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, (const ASN1_ITEM *)&(tblname##_adb) }
#else
#define ASN1_ADB_OBJECT(tblname) { ASN1_TFLG_ADB_OID, -1, 0, #tblname, tblname##_adb }
#define ASN1_ADB_INTEGER(tblname) { ASN1_TFLG_ADB_INT, -1, 0, #tblname, tblname##_adb }
#endif
/* Plain simple type */
#define ASN1_SIMPLE(stname, field, type) ASN1_EX_TYPE(0,0, stname, field, type)

/* OPTIONAL simple type */
#define ASN1_OPT(stname, field, type) ASN1_EX_TYPE(ASN1_TFLG_OPTIONAL, 0, stname, field, type)

/* IMPLICIT tagged simple type */
#define ASN1_IMP(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, 0)

/* IMPLICIT tagged OPTIONAL simple type */
#define ASN1_IMP_OPT(stname, field, type, tag) ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL)

/* Same as above but EXPLICIT */

#define ASN1_EXP(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, 0)
#define ASN1_EXP_OPT(stname, field, type, tag) ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL)

/* SEQUENCE OF type */
#define ASN1_SEQUENCE_OF(stname, field, type) \
		ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, stname, field, type)

/* OPTIONAL SEQUENCE OF */
#define ASN1_SEQUENCE_OF_OPT(stname, field, type) \
		ASN1_EX_TYPE(ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type)

/* Same as above but for SET OF */

#define ASN1_SET_OF(stname, field, type) \
		ASN1_EX_TYPE(ASN1_TFLG_SET_OF, 0, stname, field, type)

#define ASN1_SET_OF_OPT(stname, field, type) \
		ASN1_EX_TYPE(ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL, 0, stname, field, type)

/* Finally compound types of SEQUENCE, SET, IMPLICIT, EXPLICIT and OPTIONAL */

#define ASN1_IMP_SET_OF(stname, field, type, tag) \
			ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF)

#define ASN1_EXP_SET_OF(stname, field, type, tag) \
			ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF)

#define ASN1_IMP_SET_OF_OPT(stname, field, type, tag) \
			ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL)

#define ASN1_EXP_SET_OF_OPT(stname, field, type, tag) \
			ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SET_OF|ASN1_TFLG_OPTIONAL)

#define ASN1_IMP_SEQUENCE_OF(stname, field, type, tag) \
			ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF)

#define ASN1_IMP_SEQUENCE_OF_OPT(stname, field, type, tag) \
			ASN1_IMP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL)

#define ASN1_EXP_SEQUENCE_OF(stname, field, type, tag) \
			ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF)

#define ASN1_EXP_SEQUENCE_OF_OPT(stname, field, type, tag) \
			ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_SEQUENCE_OF|ASN1_TFLG_OPTIONAL)

/* EXPLICIT using indefinite length constructed form */
#define ASN1_NDEF_EXP(stname, field, type, tag) \
			ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_NDEF)

/* EXPLICIT OPTIONAL using indefinite length constructed form */
#define ASN1_NDEF_EXP_OPT(stname, field, type, tag) \
			ASN1_EXP_EX(stname, field, type, tag, ASN1_TFLG_OPTIONAL|ASN1_TFLG_NDEF)

/* Macros for the ASN1_ADB structure */

#define ASN1_ADB(name) \
	static const ASN1_ADB_TABLE name##_adbtbl[] 

#ifndef OPENSSL_EXPORT_VAR_AS_FUNCTION

#define ASN1_ADB_END(name, flags, field, app_table, def, none) \
	;\
	static const ASN1_ADB name##_adb = {\
		flags,\
		offsetof(name, field),\
		app_table,\
		name##_adbtbl,\
		sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\
		def,\
		none\
	}

#else

#define ASN1_ADB_END(name, flags, field, app_table, def, none) \
	;\
	static const ASN1_ITEM *name##_adb(void) \
	{ \
	static const ASN1_ADB internal_adb = \
		{\
		flags,\
		offsetof(name, field),\
		app_table,\
		name##_adbtbl,\
		sizeof(name##_adbtbl) / sizeof(ASN1_ADB_TABLE),\
		def,\
		none\
		}; \
		return (const ASN1_ITEM *) &internal_adb; \
	} \
	void dummy_function(void)

#endif

#define ADB_ENTRY(val, template) {val, template}

#define ASN1_ADB_TEMPLATE(name) \
	static const ASN1_TEMPLATE name##_tt 

/* This is the ASN1 template structure that defines
 * a wrapper round the actual type. It determines the
 * actual position of the field in the value structure,
 * various flags such as OPTIONAL and the field name.
 */

struct ASN1_TEMPLATE_st {
unsigned long flags;		/* Various flags */
long tag;			/* tag, not used if no tagging */
unsigned long offset;		/* Offset of this field in structure */
#ifndef NO_ASN1_FIELD_NAMES
const char *field_name;		/* Field name */
#endif
ASN1_ITEM_EXP *item;		/* Relevant ASN1_ITEM or ASN1_ADB */
};

/* Macro to extract ASN1_ITEM and ASN1_ADB pointer from ASN1_TEMPLATE */

#define ASN1_TEMPLATE_item(t) (t->item_ptr)
#define ASN1_TEMPLATE_adb(t) (t->item_ptr)

typedef struct ASN1_ADB_TABLE_st ASN1_ADB_TABLE;
typedef struct ASN1_ADB_st ASN1_ADB;

struct ASN1_ADB_st {
	unsigned long flags;	/* Various flags */
	unsigned long offset;	/* Offset of selector field */
	STACK_OF(ASN1_ADB_TABLE) **app_items; /* Application defined items */
	const ASN1_ADB_TABLE *tbl;	/* Table of possible types */
	long tblcount;		/* Number of entries in tbl */
	const ASN1_TEMPLATE *default_tt;  /* Type to use if no match */
	const ASN1_TEMPLATE *null_tt;  /* Type to use if selector is NULL */
};

struct ASN1_ADB_TABLE_st {
	long value;		/* NID for an object or value for an int */
	const ASN1_TEMPLATE tt;		/* item for this value */
};

/* template flags */

/* Field is optional */
#define ASN1_TFLG_OPTIONAL	(0x1)

/* Field is a SET OF */
#define ASN1_TFLG_SET_OF	(0x1 << 1)

/* Field is a SEQUENCE OF */
#define ASN1_TFLG_SEQUENCE_OF	(0x2 << 1)

/* Special case: this refers to a SET OF that
 * will be sorted into DER order when encoded *and*
 * the corresponding STACK will be modified to match
 * the new order.
 */
#define ASN1_TFLG_SET_ORDER	(0x3 << 1)

/* Mask for SET OF or SEQUENCE OF */
#define ASN1_TFLG_SK_MASK	(0x3 << 1)

/* These flags mean the tag should be taken from the
 * tag field. If EXPLICIT then the underlying type
 * is used for the inner tag.
 */

/* IMPLICIT tagging */
#define ASN1_TFLG_IMPTAG	(0x1 << 3)


/* EXPLICIT tagging, inner tag from underlying type */
#define ASN1_TFLG_EXPTAG	(0x2 << 3)

#define ASN1_TFLG_TAG_MASK	(0x3 << 3)

/* context specific IMPLICIT */
#define ASN1_TFLG_IMPLICIT	ASN1_TFLG_IMPTAG|ASN1_TFLG_CONTEXT

/* context specific EXPLICIT */
#define ASN1_TFLG_EXPLICIT	ASN1_TFLG_EXPTAG|ASN1_TFLG_CONTEXT

/* If tagging is in force these determine the
 * type of tag to use. Otherwise the tag is
 * determined by the underlying type. These 
 * values reflect the actual octet format.
 */

/* Universal tag */ 
#define ASN1_TFLG_UNIVERSAL	(0x0<<6)
/* Application tag */ 
#define ASN1_TFLG_APPLICATION	(0x1<<6)
/* Context specific tag */ 
#define ASN1_TFLG_CONTEXT	(0x2<<6)
/* Private tag */ 
#define ASN1_TFLG_PRIVATE	(0x3<<6)

#define ASN1_TFLG_TAG_CLASS	(0x3<<6)

/* These are for ANY DEFINED BY type. In this case
 * the 'item' field points to an ASN1_ADB structure
 * which contains a table of values to decode the
 * relevant type
 */

#define ASN1_TFLG_ADB_MASK	(0x3<<8)

#define ASN1_TFLG_ADB_OID	(0x1<<8)

#define ASN1_TFLG_ADB_INT	(0x1<<9)

/* This flag means a parent structure is passed
 * instead of the field: this is useful is a
 * SEQUENCE is being combined with a CHOICE for
 * example. Since this means the structure and
 * item name will differ we need to use the
 * ASN1_CHOICE_END_name() macro for example.
 */

#define ASN1_TFLG_COMBINE	(0x1<<10)

/* This flag when present in a SEQUENCE OF, SET OF
 * or EXPLICIT causes indefinite length constructed
 * encoding to be used if required.
 */

#define ASN1_TFLG_NDEF		(0x1<<11)

/* This is the actual ASN1 item itself */

struct ASN1_ITEM_st {
char itype;			/* The item type, primitive, SEQUENCE, CHOICE or extern */
long utype;			/* underlying type */
const ASN1_TEMPLATE *templates;	/* If SEQUENCE or CHOICE this contains the contents */
long tcount;			/* Number of templates if SEQUENCE or CHOICE */
const void *funcs;		/* functions that handle this type */
long size;			/* Structure size (usually)*/
#ifndef NO_ASN1_FIELD_NAMES
const char *sname;		/* Structure name */
#endif
};

/* These are values for the itype field and
 * determine how the type is interpreted.
 *
 * For PRIMITIVE types the underlying type
 * determines the behaviour if items is NULL.
 *
 * Otherwise templates must contain a single 
 * template and the type is treated in the
 * same way as the type specified in the template.
 *
 * For SEQUENCE types the templates field points
 * to the members, the size field is the
 * structure size.
 *
 * For CHOICE types the templates field points
 * to each possible member (typically a union)
 * and the 'size' field is the offset of the
 * selector.
 *
 * The 'funcs' field is used for application
 * specific functions. 
 *
 * For COMPAT types the funcs field gives a
 * set of functions that handle this type, this
 * supports the old d2i, i2d convention.
 *
 * The EXTERN type uses a new style d2i/i2d.
 * The new style should be used where possible
 * because it avoids things like the d2i IMPLICIT
 * hack.
 *
 * MSTRING is a multiple string type, it is used
 * for a CHOICE of character strings where the
 * actual strings all occupy an ASN1_STRING
 * structure. In this case the 'utype' field
 * has a special meaning, it is used as a mask
 * of acceptable types using the B_ASN1 constants.
 *
 * NDEF_SEQUENCE is the same as SEQUENCE except
 * that it will use indefinite length constructed
 * encoding if requested.
 *
 */

#define ASN1_ITYPE_PRIMITIVE		0x0

#define ASN1_ITYPE_SEQUENCE		0x1

#define ASN1_ITYPE_CHOICE		0x2

#define ASN1_ITYPE_COMPAT		0x3

#define ASN1_ITYPE_EXTERN		0x4

#define ASN1_ITYPE_MSTRING		0x5

#define ASN1_ITYPE_NDEF_SEQUENCE	0x6

/* Cache for ASN1 tag and length, so we
 * don't keep re-reading it for things
 * like CHOICE
 */

struct ASN1_TLC_st{
	char valid;	/* Values below are valid */
	int ret;	/* return value */
	long plen;	/* length */
	int ptag;	/* class value */
	int pclass;	/* class value */
	int hdrlen;	/* header length */
};

/* Typedefs for ASN1 function pointers */

typedef ASN1_VALUE * ASN1_new_func(void);
typedef void ASN1_free_func(ASN1_VALUE *a);
typedef ASN1_VALUE * ASN1_d2i_func(ASN1_VALUE **a, const unsigned char ** in, long length);
typedef int ASN1_i2d_func(ASN1_VALUE * a, unsigned char **in);

typedef int ASN1_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it,
					int tag, int aclass, char opt, ASN1_TLC *ctx);

typedef int ASN1_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, int tag, int aclass);
typedef int ASN1_ex_new_func(ASN1_VALUE **pval, const ASN1_ITEM *it);
typedef void ASN1_ex_free_func(ASN1_VALUE **pval, const ASN1_ITEM *it);

typedef int ASN1_primitive_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, const ASN1_ITEM *it);
typedef int ASN1_primitive_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it);

typedef struct ASN1_COMPAT_FUNCS_st {
	ASN1_new_func *asn1_new;
	ASN1_free_func *asn1_free;
	ASN1_d2i_func *asn1_d2i;
	ASN1_i2d_func *asn1_i2d;
} ASN1_COMPAT_FUNCS;

typedef struct ASN1_EXTERN_FUNCS_st {
	void *app_data;
	ASN1_ex_new_func *asn1_ex_new;
	ASN1_ex_free_func *asn1_ex_free;
	ASN1_ex_free_func *asn1_ex_clear;
	ASN1_ex_d2i *asn1_ex_d2i;
	ASN1_ex_i2d *asn1_ex_i2d;
} ASN1_EXTERN_FUNCS;

typedef struct ASN1_PRIMITIVE_FUNCS_st {
	void *app_data;
	unsigned long flags;
	ASN1_ex_new_func *prim_new;
	ASN1_ex_free_func *prim_free;
	ASN1_ex_free_func *prim_clear;
	ASN1_primitive_c2i *prim_c2i;
	ASN1_primitive_i2c *prim_i2c;
} ASN1_PRIMITIVE_FUNCS;

/* This is the ASN1_AUX structure: it handles various
 * miscellaneous requirements. For example the use of
 * reference counts and an informational callback.
 *
 * The "informational callback" is called at various
 * points during the ASN1 encoding and decoding. It can
 * be used to provide minor customisation of the structures
 * used. This is most useful where the supplied routines
 * *almost* do the right thing but need some extra help
 * at a few points. If the callback returns zero then
 * it is assumed a fatal error has occurred and the 
 * main operation should be abandoned.
 *
 * If major changes in the default behaviour are required
 * then an external type is more appropriate.
 */

typedef int ASN1_aux_cb(int operation, ASN1_VALUE **in, const ASN1_ITEM *it);

typedef struct ASN1_AUX_st {
	void *app_data;
	int flags;
	int ref_offset;		/* Offset of reference value */
	int ref_lock;		/* Lock type to use */
	ASN1_aux_cb *asn1_cb;
	int enc_offset;		/* Offset of ASN1_ENCODING structure */
} ASN1_AUX;

/* Flags in ASN1_AUX */

/* Use a reference count */
#define ASN1_AFLG_REFCOUNT	1
/* Save the encoding of structure (useful for signatures) */
#define ASN1_AFLG_ENCODING	2
/* The Sequence length is invalid */
#define ASN1_AFLG_BROKEN	4

/* operation values for asn1_cb */

#define ASN1_OP_NEW_PRE		0
#define ASN1_OP_NEW_POST	1
#define ASN1_OP_FREE_PRE	2
#define ASN1_OP_FREE_POST	3
#define ASN1_OP_D2I_PRE		4
#define ASN1_OP_D2I_POST	5
#define ASN1_OP_I2D_PRE		6
#define ASN1_OP_I2D_POST	7

/* Macro to implement a primitive type */
#define IMPLEMENT_ASN1_TYPE(stname) IMPLEMENT_ASN1_TYPE_ex(stname, stname, 0)
#define IMPLEMENT_ASN1_TYPE_ex(itname, vname, ex) \
				ASN1_ITEM_start(itname) \
					ASN1_ITYPE_PRIMITIVE, V_##vname, NULL, 0, NULL, ex, #itname \
				ASN1_ITEM_end(itname)

/* Macro to implement a multi string type */
#define IMPLEMENT_ASN1_MSTRING(itname, mask) \
				ASN1_ITEM_start(itname) \
					ASN1_ITYPE_MSTRING, mask, NULL, 0, NULL, sizeof(ASN1_STRING), #itname \
				ASN1_ITEM_end(itname)

/* Macro to implement an ASN1_ITEM in terms of old style funcs */

#define IMPLEMENT_COMPAT_ASN1(sname) IMPLEMENT_COMPAT_ASN1_type(sname, V_ASN1_SEQUENCE)

#define IMPLEMENT_COMPAT_ASN1_type(sname, tag) \
	static const ASN1_COMPAT_FUNCS sname##_ff = { \
		(ASN1_new_func *)sname##_new, \
		(ASN1_free_func *)sname##_free, \
		(ASN1_d2i_func *)d2i_##sname, \
		(ASN1_i2d_func *)i2d_##sname, \
	}; \
	ASN1_ITEM_start(sname) \
		ASN1_ITYPE_COMPAT, \
		tag, \
		NULL, \
		0, \
		&sname##_ff, \
		0, \
		#sname \
	ASN1_ITEM_end(sname)

#define IMPLEMENT_EXTERN_ASN1(sname, tag, fptrs) \
	ASN1_ITEM_start(sname) \
		ASN1_ITYPE_EXTERN, \
		tag, \
		NULL, \
		0, \
		&fptrs, \
		0, \
		#sname \
	ASN1_ITEM_end(sname)

/* Macro to implement standard functions in terms of ASN1_ITEM structures */

#define IMPLEMENT_ASN1_FUNCTIONS(stname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, stname, stname)

#define IMPLEMENT_ASN1_FUNCTIONS_name(stname, itname) IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, itname)

#define IMPLEMENT_ASN1_FUNCTIONS_ENCODE_name(stname, itname) \
			IMPLEMENT_ASN1_FUNCTIONS_ENCODE_fname(stname, itname, itname)

#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS(stname) \
		IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, stname, stname)

#define IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname) \
	stname *fname##_new(void) \
	{ \
		return (stname *)ASN1_item_new(ASN1_ITEM_rptr(itname)); \
	} \
	void fname##_free(stname *a) \
	{ \
		ASN1_item_free((ASN1_VALUE *)a, ASN1_ITEM_rptr(itname)); \
	}

#define IMPLEMENT_ASN1_FUNCTIONS_fname(stname, itname, fname) \
	IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \
	IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname)

#define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_fname(stname, itname, fname) \
	stname *d2i_##fname(stname **a, const unsigned char **in, long len) \
	{ \
		return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\
	} \
	int i2d_##fname(stname *a, unsigned char **out) \
	{ \
		return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\
	} 

#define IMPLEMENT_ASN1_NDEF_FUNCTION(stname) \
	int i2d_##stname##_NDEF(stname *a, unsigned char **out) \
	{ \
		return ASN1_item_ndef_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(stname));\
	} 

/* This includes evil casts to remove const: they will go away when full
 * ASN1 constification is done.
 */
#define IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \
	stname *d2i_##fname(stname **a, const unsigned char **in, long len) \
	{ \
		return (stname *)ASN1_item_d2i((ASN1_VALUE **)a, in, len, ASN1_ITEM_rptr(itname));\
	} \
	int i2d_##fname(const stname *a, unsigned char **out) \
	{ \
		return ASN1_item_i2d((ASN1_VALUE *)a, out, ASN1_ITEM_rptr(itname));\
	} 

#define IMPLEMENT_ASN1_DUP_FUNCTION(stname) \
	stname * stname##_dup(stname *x) \
        { \
        return ASN1_item_dup(ASN1_ITEM_rptr(stname), x); \
        }

#define IMPLEMENT_ASN1_FUNCTIONS_const(name) \
		IMPLEMENT_ASN1_FUNCTIONS_const_fname(name, name, name)

#define IMPLEMENT_ASN1_FUNCTIONS_const_fname(stname, itname, fname) \
	IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(stname, itname, fname) \
	IMPLEMENT_ASN1_ALLOC_FUNCTIONS_fname(stname, itname, fname)

/* external definitions for primitive types */

DECLARE_ASN1_ITEM(ASN1_BOOLEAN)
DECLARE_ASN1_ITEM(ASN1_TBOOLEAN)
DECLARE_ASN1_ITEM(ASN1_FBOOLEAN)
DECLARE_ASN1_ITEM(ASN1_SEQUENCE)
DECLARE_ASN1_ITEM(CBIGNUM)
DECLARE_ASN1_ITEM(BIGNUM)
DECLARE_ASN1_ITEM(LONG)
DECLARE_ASN1_ITEM(ZLONG)

DECLARE_STACK_OF(ASN1_VALUE)

/* Functions used internally by the ASN1 code */

int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it);
void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
int ASN1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
int ASN1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it);

void ASN1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
int ASN1_template_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_TEMPLATE *tt);
int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len, const ASN1_ITEM *it,
				int tag, int aclass, char opt, ASN1_TLC *ctx);

int ASN1_item_ex_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_ITEM *it, int tag, int aclass);
int ASN1_template_i2d(ASN1_VALUE **pval, unsigned char **out, const ASN1_TEMPLATE *tt);
void ASN1_primitive_free(ASN1_VALUE **pval, const ASN1_ITEM *it);

int asn1_ex_i2c(ASN1_VALUE **pval, unsigned char *cont, int *putype, const ASN1_ITEM *it);
int asn1_ex_c2i(ASN1_VALUE **pval, const unsigned char *cont, int len, int utype, char *free_cont, const ASN1_ITEM *it);

int asn1_get_choice_selector(ASN1_VALUE **pval, const ASN1_ITEM *it);
int asn1_set_choice_selector(ASN1_VALUE **pval, int value, const ASN1_ITEM *it);

ASN1_VALUE ** asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);

const ASN1_TEMPLATE *asn1_do_adb(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt, int nullerr);

int asn1_do_lock(ASN1_VALUE **pval, int op, const ASN1_ITEM *it);

void asn1_enc_init(ASN1_VALUE **pval, const ASN1_ITEM *it);
void asn1_enc_free(ASN1_VALUE **pval, const ASN1_ITEM *it);
int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval, const ASN1_ITEM *it);
int asn1_enc_save(ASN1_VALUE **pval, const unsigned char *in, int inlen, const ASN1_ITEM *it);

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/des_old.h0000755000175000017500000004347611341640430020420 0ustar  davidedavide/* crypto/des/des_old.h -*- mode:C; c-file-style: "eay" -*- */

/* WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
 *
 * The function names in here are deprecated and are only present to
 * provide an interface compatible with openssl 0.9.6 and older as
 * well as libdes.  OpenSSL now provides functions where "des_" has
 * been replaced with "DES_" in the names, to make it possible to
 * make incompatible changes that are needed for C type security and
 * other stuff.
 *
 * This include files has two compatibility modes:
 *
 *   - If OPENSSL_DES_LIBDES_COMPATIBILITY is defined, you get an API
 *     that is compatible with libdes and SSLeay.
 *   - If OPENSSL_DES_LIBDES_COMPATIBILITY isn't defined, you get an
 *     API that is compatible with OpenSSL 0.9.5x to 0.9.6x.
 *
 * Note that these modes break earlier snapshots of OpenSSL, where
 * libdes compatibility was the only available mode or (later on) the
 * prefered compatibility mode.  However, after much consideration
 * (and more or less violent discussions with external parties), it
 * was concluded that OpenSSL should be compatible with earlier versions
 * of itself before anything else.  Also, in all honesty, libdes is
 * an old beast that shouldn't really be used any more.
 *
 * Please consider starting to use the DES_ functions rather than the
 * des_ ones.  The des_ functions will disappear completely before
 * OpenSSL 1.0!
 *
 * WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
 */

/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL
 * project 2001.
 */
/* ====================================================================
 * Copyright (c) 1998-2002 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

#ifndef HEADER_DES_H
#define HEADER_DES_H

#include 	/* OPENSSL_EXTERN, OPENSSL_NO_DES, DES_LONG */

#ifdef OPENSSL_NO_DES
#error DES is disabled.
#endif

#ifndef HEADER_NEW_DES_H
#error You must include des.h, not des_old.h directly.
#endif

#ifdef _KERBEROS_DES_H
#error  replaces .
#endif

#include 

#ifdef OPENSSL_BUILD_SHLIBCRYPTO
# undef OPENSSL_EXTERN
# define OPENSSL_EXTERN OPENSSL_EXPORT
#endif

#ifdef  __cplusplus
extern "C" {
#endif

#ifdef _
#undef _
#endif

typedef unsigned char _ossl_old_des_cblock[8];
typedef struct _ossl_old_des_ks_struct
	{
	union	{
		_ossl_old_des_cblock _;
		/* make sure things are correct size on machines with
		 * 8 byte longs */
		DES_LONG pad[2];
		} ks;
	} _ossl_old_des_key_schedule[16];

#ifndef OPENSSL_DES_LIBDES_COMPATIBILITY
#define des_cblock DES_cblock
#define const_des_cblock const_DES_cblock
#define des_key_schedule DES_key_schedule
#define des_ecb3_encrypt(i,o,k1,k2,k3,e)\
	DES_ecb3_encrypt((i),(o),&(k1),&(k2),&(k3),(e))
#define des_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e)\
	DES_ede3_cbc_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(e))
#define des_ede3_cbcm_encrypt(i,o,l,k1,k2,k3,iv1,iv2,e)\
	DES_ede3_cbcm_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv1),(iv2),(e))
#define des_ede3_cfb64_encrypt(i,o,l,k1,k2,k3,iv,n,e)\
	DES_ede3_cfb64_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(n),(e))
#define des_ede3_ofb64_encrypt(i,o,l,k1,k2,k3,iv,n)\
	DES_ede3_ofb64_encrypt((i),(o),(l),&(k1),&(k2),&(k3),(iv),(n))
#define des_options()\
	DES_options()
#define des_cbc_cksum(i,o,l,k,iv)\
	DES_cbc_cksum((i),(o),(l),&(k),(iv))
#define des_cbc_encrypt(i,o,l,k,iv,e)\
	DES_cbc_encrypt((i),(o),(l),&(k),(iv),(e))
#define des_ncbc_encrypt(i,o,l,k,iv,e)\
	DES_ncbc_encrypt((i),(o),(l),&(k),(iv),(e))
#define des_xcbc_encrypt(i,o,l,k,iv,inw,outw,e)\
	DES_xcbc_encrypt((i),(o),(l),&(k),(iv),(inw),(outw),(e))
#define des_cfb_encrypt(i,o,n,l,k,iv,e)\
	DES_cfb_encrypt((i),(o),(n),(l),&(k),(iv),(e))
#define des_ecb_encrypt(i,o,k,e)\
	DES_ecb_encrypt((i),(o),&(k),(e))
#define des_encrypt1(d,k,e)\
	DES_encrypt1((d),&(k),(e))
#define des_encrypt2(d,k,e)\
	DES_encrypt2((d),&(k),(e))
#define des_encrypt3(d,k1,k2,k3)\
	DES_encrypt3((d),&(k1),&(k2),&(k3))
#define des_decrypt3(d,k1,k2,k3)\
	DES_decrypt3((d),&(k1),&(k2),&(k3))
#define des_xwhite_in2out(k,i,o)\
	DES_xwhite_in2out((k),(i),(o))
#define des_enc_read(f,b,l,k,iv)\
	DES_enc_read((f),(b),(l),&(k),(iv))
#define des_enc_write(f,b,l,k,iv)\
	DES_enc_write((f),(b),(l),&(k),(iv))
#define des_fcrypt(b,s,r)\
	DES_fcrypt((b),(s),(r))
#if 0
#define des_crypt(b,s)\
	DES_crypt((b),(s))
#if !defined(PERL5) && !defined(__FreeBSD__) && !defined(NeXT) && !defined(__OpenBSD__)
#define crypt(b,s)\
	DES_crypt((b),(s))
#endif
#endif
#define des_ofb_encrypt(i,o,n,l,k,iv)\
	DES_ofb_encrypt((i),(o),(n),(l),&(k),(iv))
#define des_pcbc_encrypt(i,o,l,k,iv,e)\
	DES_pcbc_encrypt((i),(o),(l),&(k),(iv),(e))
#define des_quad_cksum(i,o,l,c,s)\
	DES_quad_cksum((i),(o),(l),(c),(s))
#define des_random_seed(k)\
	_ossl_096_des_random_seed((k))
#define des_random_key(r)\
	DES_random_key((r))
#define des_read_password(k,p,v) \
	DES_read_password((k),(p),(v))
#define des_read_2passwords(k1,k2,p,v) \
	DES_read_2passwords((k1),(k2),(p),(v))
#define des_set_odd_parity(k)\
	DES_set_odd_parity((k))
#define des_check_key_parity(k)\
	DES_check_key_parity((k))
#define des_is_weak_key(k)\
	DES_is_weak_key((k))
#define des_set_key(k,ks)\
	DES_set_key((k),&(ks))
#define des_key_sched(k,ks)\
	DES_key_sched((k),&(ks))
#define des_set_key_checked(k,ks)\
	DES_set_key_checked((k),&(ks))
#define des_set_key_unchecked(k,ks)\
	DES_set_key_unchecked((k),&(ks))
#define des_string_to_key(s,k)\
	DES_string_to_key((s),(k))
#define des_string_to_2keys(s,k1,k2)\
	DES_string_to_2keys((s),(k1),(k2))
#define des_cfb64_encrypt(i,o,l,ks,iv,n,e)\
	DES_cfb64_encrypt((i),(o),(l),&(ks),(iv),(n),(e))
#define des_ofb64_encrypt(i,o,l,ks,iv,n)\
	DES_ofb64_encrypt((i),(o),(l),&(ks),(iv),(n))
		

#define des_ecb2_encrypt(i,o,k1,k2,e) \
	des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e))

#define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \
	des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e))

#define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \
	des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e))

#define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \
	des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n))

#define des_check_key DES_check_key
#define des_rw_mode DES_rw_mode
#else /* libdes compatibility */
/* Map all symbol names to _ossl_old_des_* form, so we avoid all
   clashes with libdes */
#define des_cblock _ossl_old_des_cblock
#define des_key_schedule _ossl_old_des_key_schedule
#define des_ecb3_encrypt(i,o,k1,k2,k3,e)\
	_ossl_old_des_ecb3_encrypt((i),(o),(k1),(k2),(k3),(e))
#define des_ede3_cbc_encrypt(i,o,l,k1,k2,k3,iv,e)\
	_ossl_old_des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(e))
#define des_ede3_cfb64_encrypt(i,o,l,k1,k2,k3,iv,n,e)\
	_ossl_old_des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(n),(e))
#define des_ede3_ofb64_encrypt(i,o,l,k1,k2,k3,iv,n)\
	_ossl_old_des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k3),(iv),(n))
#define des_options()\
	_ossl_old_des_options()
#define des_cbc_cksum(i,o,l,k,iv)\
	_ossl_old_des_cbc_cksum((i),(o),(l),(k),(iv))
#define des_cbc_encrypt(i,o,l,k,iv,e)\
	_ossl_old_des_cbc_encrypt((i),(o),(l),(k),(iv),(e))
#define des_ncbc_encrypt(i,o,l,k,iv,e)\
	_ossl_old_des_ncbc_encrypt((i),(o),(l),(k),(iv),(e))
#define des_xcbc_encrypt(i,o,l,k,iv,inw,outw,e)\
	_ossl_old_des_xcbc_encrypt((i),(o),(l),(k),(iv),(inw),(outw),(e))
#define des_cfb_encrypt(i,o,n,l,k,iv,e)\
	_ossl_old_des_cfb_encrypt((i),(o),(n),(l),(k),(iv),(e))
#define des_ecb_encrypt(i,o,k,e)\
	_ossl_old_des_ecb_encrypt((i),(o),(k),(e))
#define des_encrypt(d,k,e)\
	_ossl_old_des_encrypt((d),(k),(e))
#define des_encrypt2(d,k,e)\
	_ossl_old_des_encrypt2((d),(k),(e))
#define des_encrypt3(d,k1,k2,k3)\
	_ossl_old_des_encrypt3((d),(k1),(k2),(k3))
#define des_decrypt3(d,k1,k2,k3)\
	_ossl_old_des_decrypt3((d),(k1),(k2),(k3))
#define des_xwhite_in2out(k,i,o)\
	_ossl_old_des_xwhite_in2out((k),(i),(o))
#define des_enc_read(f,b,l,k,iv)\
	_ossl_old_des_enc_read((f),(b),(l),(k),(iv))
#define des_enc_write(f,b,l,k,iv)\
	_ossl_old_des_enc_write((f),(b),(l),(k),(iv))
#define des_fcrypt(b,s,r)\
	_ossl_old_des_fcrypt((b),(s),(r))
#define des_crypt(b,s)\
	_ossl_old_des_crypt((b),(s))
#if 0
#define crypt(b,s)\
	_ossl_old_crypt((b),(s))
#endif
#define des_ofb_encrypt(i,o,n,l,k,iv)\
	_ossl_old_des_ofb_encrypt((i),(o),(n),(l),(k),(iv))
#define des_pcbc_encrypt(i,o,l,k,iv,e)\
	_ossl_old_des_pcbc_encrypt((i),(o),(l),(k),(iv),(e))
#define des_quad_cksum(i,o,l,c,s)\
	_ossl_old_des_quad_cksum((i),(o),(l),(c),(s))
#define des_random_seed(k)\
	_ossl_old_des_random_seed((k))
#define des_random_key(r)\
	_ossl_old_des_random_key((r))
#define des_read_password(k,p,v) \
	_ossl_old_des_read_password((k),(p),(v))
#define des_read_2passwords(k1,k2,p,v) \
	_ossl_old_des_read_2passwords((k1),(k2),(p),(v))
#define des_set_odd_parity(k)\
	_ossl_old_des_set_odd_parity((k))
#define des_is_weak_key(k)\
	_ossl_old_des_is_weak_key((k))
#define des_set_key(k,ks)\
	_ossl_old_des_set_key((k),(ks))
#define des_key_sched(k,ks)\
	_ossl_old_des_key_sched((k),(ks))
#define des_string_to_key(s,k)\
	_ossl_old_des_string_to_key((s),(k))
#define des_string_to_2keys(s,k1,k2)\
	_ossl_old_des_string_to_2keys((s),(k1),(k2))
#define des_cfb64_encrypt(i,o,l,ks,iv,n,e)\
	_ossl_old_des_cfb64_encrypt((i),(o),(l),(ks),(iv),(n),(e))
#define des_ofb64_encrypt(i,o,l,ks,iv,n)\
	_ossl_old_des_ofb64_encrypt((i),(o),(l),(ks),(iv),(n))
		

#define des_ecb2_encrypt(i,o,k1,k2,e) \
	des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e))

#define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \
	des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e))

#define des_ede2_cfb64_encrypt(i,o,l,k1,k2,iv,n,e) \
	des_ede3_cfb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n),(e))

#define des_ede2_ofb64_encrypt(i,o,l,k1,k2,iv,n) \
	des_ede3_ofb64_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(n))

#define des_check_key DES_check_key
#define des_rw_mode DES_rw_mode
#endif

const char *_ossl_old_des_options(void);
void _ossl_old_des_ecb3_encrypt(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,
	_ossl_old_des_key_schedule ks1,_ossl_old_des_key_schedule ks2,
	_ossl_old_des_key_schedule ks3, int enc);
DES_LONG _ossl_old_des_cbc_cksum(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,
	long length,_ossl_old_des_key_schedule schedule,_ossl_old_des_cblock *ivec);
void _ossl_old_des_cbc_encrypt(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,long length,
	_ossl_old_des_key_schedule schedule,_ossl_old_des_cblock *ivec,int enc);
void _ossl_old_des_ncbc_encrypt(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,long length,
	_ossl_old_des_key_schedule schedule,_ossl_old_des_cblock *ivec,int enc);
void _ossl_old_des_xcbc_encrypt(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,long length,
	_ossl_old_des_key_schedule schedule,_ossl_old_des_cblock *ivec,
	_ossl_old_des_cblock *inw,_ossl_old_des_cblock *outw,int enc);
void _ossl_old_des_cfb_encrypt(unsigned char *in,unsigned char *out,int numbits,
	long length,_ossl_old_des_key_schedule schedule,_ossl_old_des_cblock *ivec,int enc);
void _ossl_old_des_ecb_encrypt(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,
	_ossl_old_des_key_schedule ks,int enc);
void _ossl_old_des_encrypt(DES_LONG *data,_ossl_old_des_key_schedule ks, int enc);
void _ossl_old_des_encrypt2(DES_LONG *data,_ossl_old_des_key_schedule ks, int enc);
void _ossl_old_des_encrypt3(DES_LONG *data, _ossl_old_des_key_schedule ks1,
	_ossl_old_des_key_schedule ks2, _ossl_old_des_key_schedule ks3);
void _ossl_old_des_decrypt3(DES_LONG *data, _ossl_old_des_key_schedule ks1,
	_ossl_old_des_key_schedule ks2, _ossl_old_des_key_schedule ks3);
void _ossl_old_des_ede3_cbc_encrypt(_ossl_old_des_cblock *input, _ossl_old_des_cblock *output, 
	long length, _ossl_old_des_key_schedule ks1, _ossl_old_des_key_schedule ks2, 
	_ossl_old_des_key_schedule ks3, _ossl_old_des_cblock *ivec, int enc);
void _ossl_old_des_ede3_cfb64_encrypt(unsigned char *in, unsigned char *out,
	long length, _ossl_old_des_key_schedule ks1, _ossl_old_des_key_schedule ks2,
	_ossl_old_des_key_schedule ks3, _ossl_old_des_cblock *ivec, int *num, int enc);
void _ossl_old_des_ede3_ofb64_encrypt(unsigned char *in, unsigned char *out,
	long length, _ossl_old_des_key_schedule ks1, _ossl_old_des_key_schedule ks2,
	_ossl_old_des_key_schedule ks3, _ossl_old_des_cblock *ivec, int *num);
#if 0
void _ossl_old_des_xwhite_in2out(_ossl_old_des_cblock (*des_key), _ossl_old_des_cblock (*in_white),
	_ossl_old_des_cblock (*out_white));
#endif

int _ossl_old_des_enc_read(int fd,char *buf,int len,_ossl_old_des_key_schedule sched,
	_ossl_old_des_cblock *iv);
int _ossl_old_des_enc_write(int fd,char *buf,int len,_ossl_old_des_key_schedule sched,
	_ossl_old_des_cblock *iv);
char *_ossl_old_des_fcrypt(const char *buf,const char *salt, char *ret);
char *_ossl_old_des_crypt(const char *buf,const char *salt);
#if !defined(PERL5) && !defined(NeXT)
char *_ossl_old_crypt(const char *buf,const char *salt);
#endif
void _ossl_old_des_ofb_encrypt(unsigned char *in,unsigned char *out,
	int numbits,long length,_ossl_old_des_key_schedule schedule,_ossl_old_des_cblock *ivec);
void _ossl_old_des_pcbc_encrypt(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,long length,
	_ossl_old_des_key_schedule schedule,_ossl_old_des_cblock *ivec,int enc);
DES_LONG _ossl_old_des_quad_cksum(_ossl_old_des_cblock *input,_ossl_old_des_cblock *output,
	long length,int out_count,_ossl_old_des_cblock *seed);
void _ossl_old_des_random_seed(_ossl_old_des_cblock key);
void _ossl_old_des_random_key(_ossl_old_des_cblock ret);
int _ossl_old_des_read_password(_ossl_old_des_cblock *key,const char *prompt,int verify);
int _ossl_old_des_read_2passwords(_ossl_old_des_cblock *key1,_ossl_old_des_cblock *key2,
	const char *prompt,int verify);
void _ossl_old_des_set_odd_parity(_ossl_old_des_cblock *key);
int _ossl_old_des_is_weak_key(_ossl_old_des_cblock *key);
int _ossl_old_des_set_key(_ossl_old_des_cblock *key,_ossl_old_des_key_schedule schedule);
int _ossl_old_des_key_sched(_ossl_old_des_cblock *key,_ossl_old_des_key_schedule schedule);
void _ossl_old_des_string_to_key(char *str,_ossl_old_des_cblock *key);
void _ossl_old_des_string_to_2keys(char *str,_ossl_old_des_cblock *key1,_ossl_old_des_cblock *key2);
void _ossl_old_des_cfb64_encrypt(unsigned char *in, unsigned char *out, long length,
	_ossl_old_des_key_schedule schedule, _ossl_old_des_cblock *ivec, int *num, int enc);
void _ossl_old_des_ofb64_encrypt(unsigned char *in, unsigned char *out, long length,
	_ossl_old_des_key_schedule schedule, _ossl_old_des_cblock *ivec, int *num);

void _ossl_096_des_random_seed(des_cblock *key);

/* The following definitions provide compatibility with the MIT Kerberos
 * library. The _ossl_old_des_key_schedule structure is not binary compatible. */

#define _KERBEROS_DES_H

#define KRBDES_ENCRYPT DES_ENCRYPT
#define KRBDES_DECRYPT DES_DECRYPT

#ifdef KERBEROS
#  define ENCRYPT DES_ENCRYPT
#  define DECRYPT DES_DECRYPT
#endif

#ifndef NCOMPAT
#  define C_Block des_cblock
#  define Key_schedule des_key_schedule
#  define KEY_SZ DES_KEY_SZ
#  define string_to_key des_string_to_key
#  define read_pw_string des_read_pw_string
#  define random_key des_random_key
#  define pcbc_encrypt des_pcbc_encrypt
#  define set_key des_set_key
#  define key_sched des_key_sched
#  define ecb_encrypt des_ecb_encrypt
#  define cbc_encrypt des_cbc_encrypt
#  define ncbc_encrypt des_ncbc_encrypt
#  define xcbc_encrypt des_xcbc_encrypt
#  define cbc_cksum des_cbc_cksum
#  define quad_cksum des_quad_cksum
#  define check_parity des_check_key_parity
#endif

#define des_fixup_key_parity DES_fixup_key_parity

#ifdef  __cplusplus
}
#endif

/* for DES_read_pw_string et al */
#include 

#endif
xmail-1.27/win32ssl/include/openssl/x509_vfy.h0000755000175000017500000005045611341640430020374 0ustar  davidedavide/* crypto/x509/x509_vfy.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_X509_H
#include 
/* openssl/x509.h ends up #include-ing this file at about the only
 * appropriate moment. */
#endif

#ifndef HEADER_X509_VFY_H
#define HEADER_X509_VFY_H

#include 
#ifndef OPENSSL_NO_LHASH
#include 
#endif
#include 
#include 
#include 

#ifdef  __cplusplus
extern "C" {
#endif

/* Outer object */
typedef struct x509_hash_dir_st
	{
	int num_dirs;
	char **dirs;
	int *dirs_type;
	int num_dirs_alloced;
	} X509_HASH_DIR_CTX;

typedef struct x509_file_st
	{
	int num_paths;	/* number of paths to files or directories */
	int num_alloced;
	char **paths;	/* the list of paths or directories */
	int *path_type;
	} X509_CERT_FILE_CTX;

/*******************************/
/*
SSL_CTX -> X509_STORE    
		-> X509_LOOKUP
			->X509_LOOKUP_METHOD
		-> X509_LOOKUP
			->X509_LOOKUP_METHOD
 
SSL	-> X509_STORE_CTX
		->X509_STORE    

The X509_STORE holds the tables etc for verification stuff.
A X509_STORE_CTX is used while validating a single certificate.
The X509_STORE has X509_LOOKUPs for looking up certs.
The X509_STORE then calls a function to actually verify the
certificate chain.
*/

#define X509_LU_RETRY		-1
#define X509_LU_FAIL		0
#define X509_LU_X509		1
#define X509_LU_CRL		2
#define X509_LU_PKEY		3

typedef struct x509_object_st
	{
	/* one of the above types */
	int type;
	union	{
		char *ptr;
		X509 *x509;
		X509_CRL *crl;
		EVP_PKEY *pkey;
		} data;
	} X509_OBJECT;

typedef struct x509_lookup_st X509_LOOKUP;

DECLARE_STACK_OF(X509_LOOKUP)
DECLARE_STACK_OF(X509_OBJECT)

/* This is a static that defines the function interface */
typedef struct x509_lookup_method_st
	{
	const char *name;
	int (*new_item)(X509_LOOKUP *ctx);
	void (*free)(X509_LOOKUP *ctx);
	int (*init)(X509_LOOKUP *ctx);
	int (*shutdown)(X509_LOOKUP *ctx);
	int (*ctrl)(X509_LOOKUP *ctx,int cmd,const char *argc,long argl,
			char **ret);
	int (*get_by_subject)(X509_LOOKUP *ctx,int type,X509_NAME *name,
			      X509_OBJECT *ret);
	int (*get_by_issuer_serial)(X509_LOOKUP *ctx,int type,X509_NAME *name,
				    ASN1_INTEGER *serial,X509_OBJECT *ret);
	int (*get_by_fingerprint)(X509_LOOKUP *ctx,int type,
				  unsigned char *bytes,int len,
				  X509_OBJECT *ret);
	int (*get_by_alias)(X509_LOOKUP *ctx,int type,char *str,int len,
			    X509_OBJECT *ret);
	} X509_LOOKUP_METHOD;

/* This structure hold all parameters associated with a verify operation
 * by including an X509_VERIFY_PARAM structure in related structures the
 * parameters used can be customized
 */

typedef struct X509_VERIFY_PARAM_st
	{
	char *name;
	time_t check_time;	/* Time to use */
	unsigned long inh_flags; /* Inheritance flags */
	unsigned long flags;	/* Various verify flags */
	int purpose;		/* purpose to check untrusted certificates */
	int trust;		/* trust setting to check */
	int depth;		/* Verify depth */
	STACK_OF(ASN1_OBJECT) *policies;	/* Permissible policies */
	} X509_VERIFY_PARAM;

DECLARE_STACK_OF(X509_VERIFY_PARAM)

/* This is used to hold everything.  It is used for all certificate
 * validation.  Once we have a certificate chain, the 'verify'
 * function is then called to actually check the cert chain. */
struct x509_store_st
	{
	/* The following is a cache of trusted certs */
	int cache; 	/* if true, stash any hits */
	STACK_OF(X509_OBJECT) *objs;	/* Cache of all objects */

	/* These are external lookup methods */
	STACK_OF(X509_LOOKUP) *get_cert_methods;

	X509_VERIFY_PARAM *param;

	/* Callbacks for various operations */
	int (*verify)(X509_STORE_CTX *ctx);	/* called to verify a certificate */
	int (*verify_cb)(int ok,X509_STORE_CTX *ctx);	/* error callback */
	int (*get_issuer)(X509 **issuer, X509_STORE_CTX *ctx, X509 *x);	/* get issuers cert from ctx */
	int (*check_issued)(X509_STORE_CTX *ctx, X509 *x, X509 *issuer); /* check issued */
	int (*check_revocation)(X509_STORE_CTX *ctx); /* Check revocation status of chain */
	int (*get_crl)(X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); /* retrieve CRL */
	int (*check_crl)(X509_STORE_CTX *ctx, X509_CRL *crl); /* Check CRL validity */
	int (*cert_crl)(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); /* Check certificate against CRL */
	int (*cleanup)(X509_STORE_CTX *ctx);

	CRYPTO_EX_DATA ex_data;
	int references;
	} /* X509_STORE */;

int X509_STORE_set_depth(X509_STORE *store, int depth);

#define X509_STORE_set_verify_cb_func(ctx,func) ((ctx)->verify_cb=(func))
#define X509_STORE_set_verify_func(ctx,func)	((ctx)->verify=(func))

/* This is the functions plus an instance of the local variables. */
struct x509_lookup_st
	{
	int init;			/* have we been started */
	int skip;			/* don't use us. */
	X509_LOOKUP_METHOD *method;	/* the functions */
	char *method_data;		/* method data */

	X509_STORE *store_ctx;	/* who owns us */
	} /* X509_LOOKUP */;

/* This is a used when verifying cert chains.  Since the
 * gathering of the cert chain can take some time (and have to be
 * 'retried', this needs to be kept and passed around. */
struct x509_store_ctx_st      /* X509_STORE_CTX */
	{
	X509_STORE *ctx;
	int current_method;	/* used when looking up certs */

	/* The following are set by the caller */
	X509 *cert;		/* The cert to check */
	STACK_OF(X509) *untrusted;	/* chain of X509s - untrusted - passed in */
	STACK_OF(X509_CRL) *crls;	/* set of CRLs passed in */

	X509_VERIFY_PARAM *param;
	void *other_ctx;	/* Other info for use with get_issuer() */

	/* Callbacks for various operations */
	int (*verify)(X509_STORE_CTX *ctx);	/* called to verify a certificate */
	int (*verify_cb)(int ok,X509_STORE_CTX *ctx);		/* error callback */
	int (*get_issuer)(X509 **issuer, X509_STORE_CTX *ctx, X509 *x);	/* get issuers cert from ctx */
	int (*check_issued)(X509_STORE_CTX *ctx, X509 *x, X509 *issuer); /* check issued */
	int (*check_revocation)(X509_STORE_CTX *ctx); /* Check revocation status of chain */
	int (*get_crl)(X509_STORE_CTX *ctx, X509_CRL **crl, X509 *x); /* retrieve CRL */
	int (*check_crl)(X509_STORE_CTX *ctx, X509_CRL *crl); /* Check CRL validity */
	int (*cert_crl)(X509_STORE_CTX *ctx, X509_CRL *crl, X509 *x); /* Check certificate against CRL */
	int (*check_policy)(X509_STORE_CTX *ctx);
	int (*cleanup)(X509_STORE_CTX *ctx);

	/* The following is built up */
	int valid;		/* if 0, rebuild chain */
	int last_untrusted;	/* index of last untrusted cert */
	STACK_OF(X509) *chain; 		/* chain of X509s - built up and trusted */
	X509_POLICY_TREE *tree;	/* Valid policy tree */

	int explicit_policy;	/* Require explicit policy value */

	/* When something goes wrong, this is why */
	int error_depth;
	int error;
	X509 *current_cert;
	X509 *current_issuer;	/* cert currently being tested as valid issuer */
	X509_CRL *current_crl;	/* current CRL */

	CRYPTO_EX_DATA ex_data;
	} /* X509_STORE_CTX */;

void X509_STORE_CTX_set_depth(X509_STORE_CTX *ctx, int depth);

#define X509_STORE_CTX_set_app_data(ctx,data) \
	X509_STORE_CTX_set_ex_data(ctx,0,data)
#define X509_STORE_CTX_get_app_data(ctx) \
	X509_STORE_CTX_get_ex_data(ctx,0)

#define X509_L_FILE_LOAD	1
#define X509_L_ADD_DIR		2

#define X509_LOOKUP_load_file(x,name,type) \
		X509_LOOKUP_ctrl((x),X509_L_FILE_LOAD,(name),(long)(type),NULL)

#define X509_LOOKUP_add_dir(x,name,type) \
		X509_LOOKUP_ctrl((x),X509_L_ADD_DIR,(name),(long)(type),NULL)

#define		X509_V_OK					0
/* illegal error (for uninitialized values, to avoid X509_V_OK): 1 */

#define		X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT		2
#define		X509_V_ERR_UNABLE_TO_GET_CRL			3
#define		X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE	4
#define		X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE	5
#define		X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY	6
#define		X509_V_ERR_CERT_SIGNATURE_FAILURE		7
#define		X509_V_ERR_CRL_SIGNATURE_FAILURE		8
#define		X509_V_ERR_CERT_NOT_YET_VALID			9
#define		X509_V_ERR_CERT_HAS_EXPIRED			10
#define		X509_V_ERR_CRL_NOT_YET_VALID			11
#define		X509_V_ERR_CRL_HAS_EXPIRED			12
#define		X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD	13
#define		X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD	14
#define		X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD	15
#define		X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD	16
#define		X509_V_ERR_OUT_OF_MEM				17
#define		X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT		18
#define		X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN		19
#define		X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY	20
#define		X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE	21
#define		X509_V_ERR_CERT_CHAIN_TOO_LONG			22
#define		X509_V_ERR_CERT_REVOKED				23
#define		X509_V_ERR_INVALID_CA				24
#define		X509_V_ERR_PATH_LENGTH_EXCEEDED			25
#define		X509_V_ERR_INVALID_PURPOSE			26
#define		X509_V_ERR_CERT_UNTRUSTED			27
#define		X509_V_ERR_CERT_REJECTED			28
/* These are 'informational' when looking for issuer cert */
#define		X509_V_ERR_SUBJECT_ISSUER_MISMATCH		29
#define		X509_V_ERR_AKID_SKID_MISMATCH			30
#define		X509_V_ERR_AKID_ISSUER_SERIAL_MISMATCH		31
#define		X509_V_ERR_KEYUSAGE_NO_CERTSIGN			32

#define		X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER		33
#define		X509_V_ERR_UNHANDLED_CRITICAL_EXTENSION		34
#define		X509_V_ERR_KEYUSAGE_NO_CRL_SIGN			35
#define		X509_V_ERR_UNHANDLED_CRITICAL_CRL_EXTENSION	36
#define		X509_V_ERR_INVALID_NON_CA			37
#define		X509_V_ERR_PROXY_PATH_LENGTH_EXCEEDED		38
#define		X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE	39
#define		X509_V_ERR_PROXY_CERTIFICATES_NOT_ALLOWED	40

#define		X509_V_ERR_INVALID_EXTENSION			41
#define		X509_V_ERR_INVALID_POLICY_EXTENSION		42
#define		X509_V_ERR_NO_EXPLICIT_POLICY			43

#define		X509_V_ERR_UNNESTED_RESOURCE			44

/* The application is not happy */
#define		X509_V_ERR_APPLICATION_VERIFICATION		50

/* Certificate verify flags */

/* Send issuer+subject checks to verify_cb */
#define	X509_V_FLAG_CB_ISSUER_CHECK		0x1
/* Use check time instead of current time */
#define	X509_V_FLAG_USE_CHECK_TIME		0x2
/* Lookup CRLs */
#define	X509_V_FLAG_CRL_CHECK			0x4
/* Lookup CRLs for whole chain */
#define	X509_V_FLAG_CRL_CHECK_ALL		0x8
/* Ignore unhandled critical extensions */
#define	X509_V_FLAG_IGNORE_CRITICAL		0x10
/* Disable workarounds for broken certificates */
#define	X509_V_FLAG_X509_STRICT			0x20
/* Enable proxy certificate validation */
#define	X509_V_FLAG_ALLOW_PROXY_CERTS		0x40
/* Enable policy checking */
#define X509_V_FLAG_POLICY_CHECK		0x80
/* Policy variable require-explicit-policy */
#define X509_V_FLAG_EXPLICIT_POLICY		0x100
/* Policy variable inhibit-any-policy */
#define	X509_V_FLAG_INHIBIT_ANY			0x200
/* Policy variable inhibit-policy-mapping */
#define X509_V_FLAG_INHIBIT_MAP			0x400
/* Notify callback that policy is OK */
#define X509_V_FLAG_NOTIFY_POLICY		0x800

#define X509_VP_FLAG_DEFAULT			0x1
#define X509_VP_FLAG_OVERWRITE			0x2
#define X509_VP_FLAG_RESET_FLAGS		0x4
#define X509_VP_FLAG_LOCKED			0x8
#define X509_VP_FLAG_ONCE			0x10

/* Internal use: mask of policy related options */
#define X509_V_FLAG_POLICY_MASK (X509_V_FLAG_POLICY_CHECK \
				| X509_V_FLAG_EXPLICIT_POLICY \
				| X509_V_FLAG_INHIBIT_ANY \
				| X509_V_FLAG_INHIBIT_MAP)

int X509_OBJECT_idx_by_subject(STACK_OF(X509_OBJECT) *h, int type,
	     X509_NAME *name);
X509_OBJECT *X509_OBJECT_retrieve_by_subject(STACK_OF(X509_OBJECT) *h,int type,X509_NAME *name);
X509_OBJECT *X509_OBJECT_retrieve_match(STACK_OF(X509_OBJECT) *h, X509_OBJECT *x);
void X509_OBJECT_up_ref_count(X509_OBJECT *a);
void X509_OBJECT_free_contents(X509_OBJECT *a);
X509_STORE *X509_STORE_new(void );
void X509_STORE_free(X509_STORE *v);

int X509_STORE_set_flags(X509_STORE *ctx, unsigned long flags);
int X509_STORE_set_purpose(X509_STORE *ctx, int purpose);
int X509_STORE_set_trust(X509_STORE *ctx, int trust);
int X509_STORE_set1_param(X509_STORE *ctx, X509_VERIFY_PARAM *pm);

X509_STORE_CTX *X509_STORE_CTX_new(void);

int X509_STORE_CTX_get1_issuer(X509 **issuer, X509_STORE_CTX *ctx, X509 *x);

void X509_STORE_CTX_free(X509_STORE_CTX *ctx);
int X509_STORE_CTX_init(X509_STORE_CTX *ctx, X509_STORE *store,
			 X509 *x509, STACK_OF(X509) *chain);
void X509_STORE_CTX_trusted_stack(X509_STORE_CTX *ctx, STACK_OF(X509) *sk);
void X509_STORE_CTX_cleanup(X509_STORE_CTX *ctx);

X509_LOOKUP *X509_STORE_add_lookup(X509_STORE *v, X509_LOOKUP_METHOD *m);

X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void);
X509_LOOKUP_METHOD *X509_LOOKUP_file(void);

int X509_STORE_add_cert(X509_STORE *ctx, X509 *x);
int X509_STORE_add_crl(X509_STORE *ctx, X509_CRL *x);

int X509_STORE_get_by_subject(X509_STORE_CTX *vs,int type,X509_NAME *name,
	X509_OBJECT *ret);

int X509_LOOKUP_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc,
	long argl, char **ret);

#ifndef OPENSSL_NO_STDIO
int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type);
int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type);
int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type);
#endif


X509_LOOKUP *X509_LOOKUP_new(X509_LOOKUP_METHOD *method);
void X509_LOOKUP_free(X509_LOOKUP *ctx);
int X509_LOOKUP_init(X509_LOOKUP *ctx);
int X509_LOOKUP_by_subject(X509_LOOKUP *ctx, int type, X509_NAME *name,
	X509_OBJECT *ret);
int X509_LOOKUP_by_issuer_serial(X509_LOOKUP *ctx, int type, X509_NAME *name,
	ASN1_INTEGER *serial, X509_OBJECT *ret);
int X509_LOOKUP_by_fingerprint(X509_LOOKUP *ctx, int type,
	unsigned char *bytes, int len, X509_OBJECT *ret);
int X509_LOOKUP_by_alias(X509_LOOKUP *ctx, int type, char *str,
	int len, X509_OBJECT *ret);
int X509_LOOKUP_shutdown(X509_LOOKUP *ctx);

#ifndef OPENSSL_NO_STDIO
int	X509_STORE_load_locations (X509_STORE *ctx,
		const char *file, const char *dir);
int	X509_STORE_set_default_paths(X509_STORE *ctx);
#endif

int X509_STORE_CTX_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
	CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
int	X509_STORE_CTX_set_ex_data(X509_STORE_CTX *ctx,int idx,void *data);
void *	X509_STORE_CTX_get_ex_data(X509_STORE_CTX *ctx,int idx);
int	X509_STORE_CTX_get_error(X509_STORE_CTX *ctx);
void	X509_STORE_CTX_set_error(X509_STORE_CTX *ctx,int s);
int	X509_STORE_CTX_get_error_depth(X509_STORE_CTX *ctx);
X509 *	X509_STORE_CTX_get_current_cert(X509_STORE_CTX *ctx);
STACK_OF(X509) *X509_STORE_CTX_get_chain(X509_STORE_CTX *ctx);
STACK_OF(X509) *X509_STORE_CTX_get1_chain(X509_STORE_CTX *ctx);
void	X509_STORE_CTX_set_cert(X509_STORE_CTX *c,X509 *x);
void	X509_STORE_CTX_set_chain(X509_STORE_CTX *c,STACK_OF(X509) *sk);
void	X509_STORE_CTX_set0_crls(X509_STORE_CTX *c,STACK_OF(X509_CRL) *sk);
int X509_STORE_CTX_set_purpose(X509_STORE_CTX *ctx, int purpose);
int X509_STORE_CTX_set_trust(X509_STORE_CTX *ctx, int trust);
int X509_STORE_CTX_purpose_inherit(X509_STORE_CTX *ctx, int def_purpose,
				int purpose, int trust);
void X509_STORE_CTX_set_flags(X509_STORE_CTX *ctx, unsigned long flags);
void X509_STORE_CTX_set_time(X509_STORE_CTX *ctx, unsigned long flags,
								time_t t);
void X509_STORE_CTX_set_verify_cb(X509_STORE_CTX *ctx,
				  int (*verify_cb)(int, X509_STORE_CTX *));
  
X509_POLICY_TREE *X509_STORE_CTX_get0_policy_tree(X509_STORE_CTX *ctx);
int X509_STORE_CTX_get_explicit_policy(X509_STORE_CTX *ctx);

X509_VERIFY_PARAM *X509_STORE_CTX_get0_param(X509_STORE_CTX *ctx);
void X509_STORE_CTX_set0_param(X509_STORE_CTX *ctx, X509_VERIFY_PARAM *param);
int X509_STORE_CTX_set_default(X509_STORE_CTX *ctx, const char *name);

/* X509_VERIFY_PARAM functions */

X509_VERIFY_PARAM *X509_VERIFY_PARAM_new(void);
void X509_VERIFY_PARAM_free(X509_VERIFY_PARAM *param);
int X509_VERIFY_PARAM_inherit(X509_VERIFY_PARAM *to,
						const X509_VERIFY_PARAM *from);
int X509_VERIFY_PARAM_set1(X509_VERIFY_PARAM *to, 
						const X509_VERIFY_PARAM *from);
int X509_VERIFY_PARAM_set1_name(X509_VERIFY_PARAM *param, const char *name);
int X509_VERIFY_PARAM_set_flags(X509_VERIFY_PARAM *param, unsigned long flags);
int X509_VERIFY_PARAM_clear_flags(X509_VERIFY_PARAM *param,
							unsigned long flags);
unsigned long X509_VERIFY_PARAM_get_flags(X509_VERIFY_PARAM *param);
int X509_VERIFY_PARAM_set_purpose(X509_VERIFY_PARAM *param, int purpose);
int X509_VERIFY_PARAM_set_trust(X509_VERIFY_PARAM *param, int trust);
void X509_VERIFY_PARAM_set_depth(X509_VERIFY_PARAM *param, int depth);
void X509_VERIFY_PARAM_set_time(X509_VERIFY_PARAM *param, time_t t);
int X509_VERIFY_PARAM_add0_policy(X509_VERIFY_PARAM *param,
						ASN1_OBJECT *policy);
int X509_VERIFY_PARAM_set1_policies(X509_VERIFY_PARAM *param, 
					STACK_OF(ASN1_OBJECT) *policies);
int X509_VERIFY_PARAM_get_depth(const X509_VERIFY_PARAM *param);

int X509_VERIFY_PARAM_add0_table(X509_VERIFY_PARAM *param);
const X509_VERIFY_PARAM *X509_VERIFY_PARAM_lookup(const char *name);
void X509_VERIFY_PARAM_table_cleanup(void);

int X509_policy_check(X509_POLICY_TREE **ptree, int *pexplicit_policy,
			STACK_OF(X509) *certs,
			STACK_OF(ASN1_OBJECT) *policy_oids,
			unsigned int flags);

void X509_policy_tree_free(X509_POLICY_TREE *tree);

int X509_policy_tree_level_count(const X509_POLICY_TREE *tree);
X509_POLICY_LEVEL *
	X509_policy_tree_get0_level(const X509_POLICY_TREE *tree, int i);

STACK_OF(X509_POLICY_NODE) *
	X509_policy_tree_get0_policies(const X509_POLICY_TREE *tree);

STACK_OF(X509_POLICY_NODE) *
	X509_policy_tree_get0_user_policies(const X509_POLICY_TREE *tree);

int X509_policy_level_node_count(X509_POLICY_LEVEL *level);

X509_POLICY_NODE *X509_policy_level_get0_node(X509_POLICY_LEVEL *level, int i);

const ASN1_OBJECT *X509_policy_node_get0_policy(const X509_POLICY_NODE *node);

STACK_OF(POLICYQUALINFO) *
	X509_policy_node_get0_qualifiers(const X509_POLICY_NODE *node);
const X509_POLICY_NODE *
	X509_policy_node_get0_parent(const X509_POLICY_NODE *node);

#ifdef  __cplusplus
}
#endif
#endif

xmail-1.27/win32ssl/include/openssl/rc4.h0000755000175000017500000000734211341640430017467 0ustar  davidedavide/* crypto/rc4/rc4.h */
/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_RC4_H
#define HEADER_RC4_H

#include  /* OPENSSL_NO_RC4, RC4_INT */
#ifdef OPENSSL_NO_RC4
#error RC4 is disabled.
#endif

#ifdef  __cplusplus
extern "C" {
#endif

typedef struct rc4_key_st
	{
	RC4_INT x,y;
	RC4_INT data[256];
	} RC4_KEY;

 
const char *RC4_options(void);
#ifdef OPENSSL_FIPS
void private_RC4_set_key(RC4_KEY *key, int len, const unsigned char *data);
#endif
void RC4_set_key(RC4_KEY *key, int len, const unsigned char *data);
void RC4(RC4_KEY *key, unsigned long len, const unsigned char *indata,
		unsigned char *outdata);

#ifdef  __cplusplus
}
#endif

#endif
xmail-1.27/win32ssl/include/openssl/rc2.h0000755000175000017500000001046511341640430017465 0ustar  davidedavide/* crypto/rc2/rc2.h */
/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_RC2_H
#define HEADER_RC2_H

#include  /* OPENSSL_NO_RC2, RC2_INT */
#ifdef OPENSSL_NO_RC2
#error RC2 is disabled.
#endif

#define RC2_ENCRYPT	1
#define RC2_DECRYPT	0

#define RC2_BLOCK	8
#define RC2_KEY_LENGTH	16

#ifdef  __cplusplus
extern "C" {
#endif

typedef struct rc2_key_st
	{
	RC2_INT data[64];
	} RC2_KEY;

#ifdef OPENSSL_FIPS 
void private_RC2_set_key(RC2_KEY *key, int len, const unsigned char *data,int bits);
#endif
void RC2_set_key(RC2_KEY *key, int len, const unsigned char *data,int bits);
void RC2_ecb_encrypt(const unsigned char *in,unsigned char *out,RC2_KEY *key,
		     int enc);
void RC2_encrypt(unsigned long *data,RC2_KEY *key);
void RC2_decrypt(unsigned long *data,RC2_KEY *key);
void RC2_cbc_encrypt(const unsigned char *in, unsigned char *out, long length,
	RC2_KEY *ks, unsigned char *iv, int enc);
void RC2_cfb64_encrypt(const unsigned char *in, unsigned char *out,
		       long length, RC2_KEY *schedule, unsigned char *ivec,
		       int *num, int enc);
void RC2_ofb64_encrypt(const unsigned char *in, unsigned char *out,
		       long length, RC2_KEY *schedule, unsigned char *ivec,
		       int *num);

#ifdef  __cplusplus
}
#endif

#endif
xmail-1.27/win32ssl/include/openssl/buffer.h0000755000175000017500000001072511341640430020247 0ustar  davidedavide/* crypto/buffer/buffer.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_BUFFER_H
#define HEADER_BUFFER_H

#include 

#ifdef  __cplusplus
extern "C" {
#endif

#include 

#if !defined(NO_SYS_TYPES_H)
#include 
#endif

/* Already declared in ossl_typ.h */
/* typedef struct buf_mem_st BUF_MEM; */

struct buf_mem_st
	{
	int length;	/* current number of bytes */
	char *data;
	int max;	/* size of buffer */
	};

BUF_MEM *BUF_MEM_new(void);
void	BUF_MEM_free(BUF_MEM *a);
int	BUF_MEM_grow(BUF_MEM *str, int len);
int	BUF_MEM_grow_clean(BUF_MEM *str, int len);
char *	BUF_strdup(const char *str);
char *	BUF_strndup(const char *str, size_t siz);
void *	BUF_memdup(const void *data, size_t siz);

/* safe string functions */
size_t BUF_strlcpy(char *dst,const char *src,size_t siz);
size_t BUF_strlcat(char *dst,const char *src,size_t siz);


/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_BUF_strings(void);

/* Error codes for the BUF functions. */

/* Function codes. */
#define BUF_F_BUF_MEMDUP				 103
#define BUF_F_BUF_MEM_GROW				 100
#define BUF_F_BUF_MEM_GROW_CLEAN			 105
#define BUF_F_BUF_MEM_NEW				 101
#define BUF_F_BUF_STRDUP				 102
#define BUF_F_BUF_STRNDUP				 104

/* Reason codes. */

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/ec.h0000755000175000017500000005161511341640430017370 0ustar  davidedavide/* crypto/ec/ec.h */
/*
 * Originally written by Bodo Moeller for the OpenSSL project.
 */
/* ====================================================================
 * Copyright (c) 1998-2003 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */
/* ====================================================================
 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
 *
 * Portions of the attached software ("Contribution") are developed by 
 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
 *
 * The Contribution is licensed pursuant to the OpenSSL open source
 * license provided above.
 *
 * The elliptic curve binary polynomial software is originally written by 
 * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories.
 *
 */

#ifndef HEADER_EC_H
#define HEADER_EC_H

#include 

#ifdef OPENSSL_NO_EC
#error EC is disabled.
#endif

#include 
#include 
#ifndef OPENSSL_NO_DEPRECATED
#include 
#endif

#ifdef  __cplusplus
extern "C" {
#elif defined(__SUNPRO_C)
# if __SUNPRO_C >= 0x520
# pragma error_messages (off,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE)
# endif
#endif


#ifndef OPENSSL_ECC_MAX_FIELD_BITS
# define OPENSSL_ECC_MAX_FIELD_BITS 661
#endif

typedef enum {
	/* values as defined in X9.62 (ECDSA) and elsewhere */
	POINT_CONVERSION_COMPRESSED = 2,
	POINT_CONVERSION_UNCOMPRESSED = 4,
	POINT_CONVERSION_HYBRID = 6
} point_conversion_form_t;


typedef struct ec_method_st EC_METHOD;

typedef struct ec_group_st
	/*
	 EC_METHOD *meth;
	 -- field definition
	 -- curve coefficients
	 -- optional generator with associated information (order, cofactor)
	 -- optional extra data (precomputed table for fast computation of multiples of generator)
	 -- ASN1 stuff
	*/
	EC_GROUP;

typedef struct ec_point_st EC_POINT;


/* EC_METHODs for curves over GF(p).
 * EC_GFp_simple_method provides the basis for the optimized methods.
 */
const EC_METHOD *EC_GFp_simple_method(void);
const EC_METHOD *EC_GFp_mont_method(void);
const EC_METHOD *EC_GFp_nist_method(void);

/* EC_METHOD for curves over GF(2^m).
 */
const EC_METHOD *EC_GF2m_simple_method(void);


EC_GROUP *EC_GROUP_new(const EC_METHOD *);
void EC_GROUP_free(EC_GROUP *);
void EC_GROUP_clear_free(EC_GROUP *);
int EC_GROUP_copy(EC_GROUP *, const EC_GROUP *);
EC_GROUP *EC_GROUP_dup(const EC_GROUP *);

const EC_METHOD *EC_GROUP_method_of(const EC_GROUP *);
int EC_METHOD_get_field_type(const EC_METHOD *);

int EC_GROUP_set_generator(EC_GROUP *, const EC_POINT *generator, const BIGNUM *order, const BIGNUM *cofactor);
const EC_POINT *EC_GROUP_get0_generator(const EC_GROUP *);
int EC_GROUP_get_order(const EC_GROUP *, BIGNUM *order, BN_CTX *);
int EC_GROUP_get_cofactor(const EC_GROUP *, BIGNUM *cofactor, BN_CTX *);

void EC_GROUP_set_curve_name(EC_GROUP *, int nid);
int EC_GROUP_get_curve_name(const EC_GROUP *);

void EC_GROUP_set_asn1_flag(EC_GROUP *, int flag);
int EC_GROUP_get_asn1_flag(const EC_GROUP *);

void EC_GROUP_set_point_conversion_form(EC_GROUP *, point_conversion_form_t);
point_conversion_form_t EC_GROUP_get_point_conversion_form(const EC_GROUP *);

unsigned char *EC_GROUP_get0_seed(const EC_GROUP *);
size_t EC_GROUP_get_seed_len(const EC_GROUP *);
size_t EC_GROUP_set_seed(EC_GROUP *, const unsigned char *, size_t len);

int EC_GROUP_set_curve_GFp(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
int EC_GROUP_get_curve_GFp(const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *);
int EC_GROUP_set_curve_GF2m(EC_GROUP *, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
int EC_GROUP_get_curve_GF2m(const EC_GROUP *, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *);

/* returns the number of bits needed to represent a field element */
int EC_GROUP_get_degree(const EC_GROUP *);

/* EC_GROUP_check() returns 1 if 'group' defines a valid group, 0 otherwise */
int EC_GROUP_check(const EC_GROUP *group, BN_CTX *ctx);
/* EC_GROUP_check_discriminant() returns 1 if the discriminant of the
 * elliptic curve is not zero, 0 otherwise */
int EC_GROUP_check_discriminant(const EC_GROUP *, BN_CTX *);

/* EC_GROUP_cmp() returns 0 if both groups are equal and 1 otherwise */
int EC_GROUP_cmp(const EC_GROUP *, const EC_GROUP *, BN_CTX *);

/* EC_GROUP_new_GF*() calls EC_GROUP_new() and EC_GROUP_set_GF*()
 * after choosing an appropriate EC_METHOD */
EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *);

/* EC_GROUP_new_by_curve_name() creates a EC_GROUP structure
 * specified by a curve name (in form of a NID) */
EC_GROUP *EC_GROUP_new_by_curve_name(int nid);
/* handling of internal curves */
typedef struct { 
	int nid;
	const char *comment;
	} EC_builtin_curve;
/* EC_builtin_curves(EC_builtin_curve *r, size_t size) returns number 
 * of all available curves or zero if a error occurred. 
 * In case r ist not zero nitems EC_builtin_curve structures 
 * are filled with the data of the first nitems internal groups */
size_t EC_get_builtin_curves(EC_builtin_curve *r, size_t nitems);


/* EC_POINT functions */

EC_POINT *EC_POINT_new(const EC_GROUP *);
void EC_POINT_free(EC_POINT *);
void EC_POINT_clear_free(EC_POINT *);
int EC_POINT_copy(EC_POINT *, const EC_POINT *);
EC_POINT *EC_POINT_dup(const EC_POINT *, const EC_GROUP *);
 
const EC_METHOD *EC_POINT_method_of(const EC_POINT *);

int EC_POINT_set_to_infinity(const EC_GROUP *, EC_POINT *);
int EC_POINT_set_Jprojective_coordinates_GFp(const EC_GROUP *, EC_POINT *,
	const BIGNUM *x, const BIGNUM *y, const BIGNUM *z, BN_CTX *);
int EC_POINT_get_Jprojective_coordinates_GFp(const EC_GROUP *, const EC_POINT *,
	BIGNUM *x, BIGNUM *y, BIGNUM *z, BN_CTX *);
int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *, EC_POINT *,
	const BIGNUM *x, const BIGNUM *y, BN_CTX *);
int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *, const EC_POINT *,
	BIGNUM *x, BIGNUM *y, BN_CTX *);
int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *, EC_POINT *,
	const BIGNUM *x, int y_bit, BN_CTX *);

int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *, EC_POINT *,
	const BIGNUM *x, const BIGNUM *y, BN_CTX *);
int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *, const EC_POINT *,
	BIGNUM *x, BIGNUM *y, BN_CTX *);
int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *, EC_POINT *,
	const BIGNUM *x, int y_bit, BN_CTX *);

size_t EC_POINT_point2oct(const EC_GROUP *, const EC_POINT *, point_conversion_form_t form,
        unsigned char *buf, size_t len, BN_CTX *);
int EC_POINT_oct2point(const EC_GROUP *, EC_POINT *,
        const unsigned char *buf, size_t len, BN_CTX *);

/* other interfaces to point2oct/oct2point: */
BIGNUM *EC_POINT_point2bn(const EC_GROUP *, const EC_POINT *,
	point_conversion_form_t form, BIGNUM *, BN_CTX *);
EC_POINT *EC_POINT_bn2point(const EC_GROUP *, const BIGNUM *,
	EC_POINT *, BN_CTX *);
char *EC_POINT_point2hex(const EC_GROUP *, const EC_POINT *,
	point_conversion_form_t form, BN_CTX *);
EC_POINT *EC_POINT_hex2point(const EC_GROUP *, const char *,
	EC_POINT *, BN_CTX *);

int EC_POINT_add(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, BN_CTX *);
int EC_POINT_dbl(const EC_GROUP *, EC_POINT *r, const EC_POINT *a, BN_CTX *);
int EC_POINT_invert(const EC_GROUP *, EC_POINT *, BN_CTX *);

int EC_POINT_is_at_infinity(const EC_GROUP *, const EC_POINT *);
int EC_POINT_is_on_curve(const EC_GROUP *, const EC_POINT *, BN_CTX *);
int EC_POINT_cmp(const EC_GROUP *, const EC_POINT *a, const EC_POINT *b, BN_CTX *);

int EC_POINT_make_affine(const EC_GROUP *, EC_POINT *, BN_CTX *);
int EC_POINTs_make_affine(const EC_GROUP *, size_t num, EC_POINT *[], BN_CTX *);


int EC_POINTs_mul(const EC_GROUP *, EC_POINT *r, const BIGNUM *, size_t num, const EC_POINT *[], const BIGNUM *[], BN_CTX *);
int EC_POINT_mul(const EC_GROUP *, EC_POINT *r, const BIGNUM *, const EC_POINT *, const BIGNUM *, BN_CTX *);

/* EC_GROUP_precompute_mult() stores multiples of generator for faster point multiplication */
int EC_GROUP_precompute_mult(EC_GROUP *, BN_CTX *);
/* EC_GROUP_have_precompute_mult() reports whether such precomputation has been done */
int EC_GROUP_have_precompute_mult(const EC_GROUP *);



/* ASN1 stuff */

/* EC_GROUP_get_basis_type() returns the NID of the basis type
 * used to represent the field elements */
int EC_GROUP_get_basis_type(const EC_GROUP *);
int EC_GROUP_get_trinomial_basis(const EC_GROUP *, unsigned int *k);
int EC_GROUP_get_pentanomial_basis(const EC_GROUP *, unsigned int *k1, 
	unsigned int *k2, unsigned int *k3);

#define OPENSSL_EC_NAMED_CURVE	0x001

typedef struct ecpk_parameters_st ECPKPARAMETERS;

EC_GROUP *d2i_ECPKParameters(EC_GROUP **, const unsigned char **in, long len);
int i2d_ECPKParameters(const EC_GROUP *, unsigned char **out);

#define d2i_ECPKParameters_bio(bp,x) ASN1_d2i_bio_of(EC_GROUP,NULL,d2i_ECPKParameters,bp,x)
#define i2d_ECPKParameters_bio(bp,x) ASN1_i2d_bio_of_const(EC_GROUP,i2d_ECPKParameters,bp,x)
#define d2i_ECPKParameters_fp(fp,x) (EC_GROUP *)ASN1_d2i_fp(NULL, \
                (char *(*)())d2i_ECPKParameters,(fp),(unsigned char **)(x))
#define i2d_ECPKParameters_fp(fp,x) ASN1_i2d_fp(i2d_ECPKParameters,(fp), \
		(unsigned char *)(x))

#ifndef OPENSSL_NO_BIO
int     ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off);
#endif
#ifndef OPENSSL_NO_FP_API
int     ECPKParameters_print_fp(FILE *fp, const EC_GROUP *x, int off);
#endif

/* the EC_KEY stuff */
typedef struct ec_key_st EC_KEY;

/* some values for the encoding_flag */
#define EC_PKEY_NO_PARAMETERS	0x001
#define EC_PKEY_NO_PUBKEY	0x002

EC_KEY *EC_KEY_new(void);
EC_KEY *EC_KEY_new_by_curve_name(int nid);
void EC_KEY_free(EC_KEY *);
EC_KEY *EC_KEY_copy(EC_KEY *, const EC_KEY *);
EC_KEY *EC_KEY_dup(const EC_KEY *);

int EC_KEY_up_ref(EC_KEY *);

const EC_GROUP *EC_KEY_get0_group(const EC_KEY *);
int EC_KEY_set_group(EC_KEY *, const EC_GROUP *);
const BIGNUM *EC_KEY_get0_private_key(const EC_KEY *);
int EC_KEY_set_private_key(EC_KEY *, const BIGNUM *);
const EC_POINT *EC_KEY_get0_public_key(const EC_KEY *);
int EC_KEY_set_public_key(EC_KEY *, const EC_POINT *);
unsigned EC_KEY_get_enc_flags(const EC_KEY *);
void EC_KEY_set_enc_flags(EC_KEY *, unsigned int);
point_conversion_form_t EC_KEY_get_conv_form(const EC_KEY *);
void EC_KEY_set_conv_form(EC_KEY *, point_conversion_form_t);
/* functions to set/get method specific data  */
void *EC_KEY_get_key_method_data(EC_KEY *, 
	void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
void EC_KEY_insert_key_method_data(EC_KEY *, void *data,
	void *(*dup_func)(void *), void (*free_func)(void *), void (*clear_free_func)(void *));
/* wrapper functions for the underlying EC_GROUP object */
void EC_KEY_set_asn1_flag(EC_KEY *, int);
int EC_KEY_precompute_mult(EC_KEY *, BN_CTX *ctx);

/* EC_KEY_generate_key() creates a ec private (public) key */
int EC_KEY_generate_key(EC_KEY *);
/* EC_KEY_check_key() */
int EC_KEY_check_key(const EC_KEY *);

/* de- and encoding functions for SEC1 ECPrivateKey */
EC_KEY *d2i_ECPrivateKey(EC_KEY **a, const unsigned char **in, long len);
int i2d_ECPrivateKey(EC_KEY *a, unsigned char **out);
/* de- and encoding functions for EC parameters */
EC_KEY *d2i_ECParameters(EC_KEY **a, const unsigned char **in, long len);
int i2d_ECParameters(EC_KEY *a, unsigned char **out);
/* de- and encoding functions for EC public key
 * (octet string, not DER -- hence 'o2i' and 'i2o') */
EC_KEY *o2i_ECPublicKey(EC_KEY **a, const unsigned char **in, long len);
int i2o_ECPublicKey(EC_KEY *a, unsigned char **out);

#ifndef OPENSSL_NO_BIO
int	ECParameters_print(BIO *bp, const EC_KEY *x);
int	EC_KEY_print(BIO *bp, const EC_KEY *x, int off);
#endif
#ifndef OPENSSL_NO_FP_API
int	ECParameters_print_fp(FILE *fp, const EC_KEY *x);
int	EC_KEY_print_fp(FILE *fp, const EC_KEY *x, int off);
#endif

#define ECParameters_dup(x) ASN1_dup_of(EC_KEY,i2d_ECParameters,d2i_ECParameters,x)

#ifndef __cplusplus
#if defined(__SUNPRO_C)
#  if __SUNPRO_C >= 0x520
# pragma error_messages (default,E_ARRAY_OF_INCOMPLETE_NONAME,E_ARRAY_OF_INCOMPLETE)
#  endif
# endif
#endif

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_EC_strings(void);

/* Error codes for the EC functions. */

/* Function codes. */
#define EC_F_COMPUTE_WNAF				 143
#define EC_F_D2I_ECPARAMETERS				 144
#define EC_F_D2I_ECPKPARAMETERS				 145
#define EC_F_D2I_ECPRIVATEKEY				 146
#define EC_F_ECPARAMETERS_PRINT				 147
#define EC_F_ECPARAMETERS_PRINT_FP			 148
#define EC_F_ECPKPARAMETERS_PRINT			 149
#define EC_F_ECPKPARAMETERS_PRINT_FP			 150
#define EC_F_ECP_NIST_MOD_192				 203
#define EC_F_ECP_NIST_MOD_224				 204
#define EC_F_ECP_NIST_MOD_256				 205
#define EC_F_ECP_NIST_MOD_521				 206
#define EC_F_EC_ASN1_GROUP2CURVE			 153
#define EC_F_EC_ASN1_GROUP2FIELDID			 154
#define EC_F_EC_ASN1_GROUP2PARAMETERS			 155
#define EC_F_EC_ASN1_GROUP2PKPARAMETERS			 156
#define EC_F_EC_ASN1_PARAMETERS2GROUP			 157
#define EC_F_EC_ASN1_PKPARAMETERS2GROUP			 158
#define EC_F_EC_EX_DATA_SET_DATA			 211
#define EC_F_EC_GF2M_MONTGOMERY_POINT_MULTIPLY		 208
#define EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT	 159
#define EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE		 195
#define EC_F_EC_GF2M_SIMPLE_OCT2POINT			 160
#define EC_F_EC_GF2M_SIMPLE_POINT2OCT			 161
#define EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES 162
#define EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES 163
#define EC_F_EC_GF2M_SIMPLE_SET_COMPRESSED_COORDINATES	 164
#define EC_F_EC_GFP_MONT_FIELD_DECODE			 133
#define EC_F_EC_GFP_MONT_FIELD_ENCODE			 134
#define EC_F_EC_GFP_MONT_FIELD_MUL			 131
#define EC_F_EC_GFP_MONT_FIELD_SET_TO_ONE		 209
#define EC_F_EC_GFP_MONT_FIELD_SQR			 132
#define EC_F_EC_GFP_MONT_GROUP_SET_CURVE		 189
#define EC_F_EC_GFP_MONT_GROUP_SET_CURVE_GFP		 135
#define EC_F_EC_GFP_NIST_FIELD_MUL			 200
#define EC_F_EC_GFP_NIST_FIELD_SQR			 201
#define EC_F_EC_GFP_NIST_GROUP_SET_CURVE		 202
#define EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT	 165
#define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE		 166
#define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE_GFP		 100
#define EC_F_EC_GFP_SIMPLE_GROUP_SET_GENERATOR		 101
#define EC_F_EC_GFP_SIMPLE_MAKE_AFFINE			 102
#define EC_F_EC_GFP_SIMPLE_OCT2POINT			 103
#define EC_F_EC_GFP_SIMPLE_POINT2OCT			 104
#define EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE		 137
#define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES	 167
#define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES_GFP 105
#define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES	 168
#define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES_GFP 128
#define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES	 169
#define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES_GFP 129
#define EC_F_EC_GROUP_CHECK				 170
#define EC_F_EC_GROUP_CHECK_DISCRIMINANT		 171
#define EC_F_EC_GROUP_COPY				 106
#define EC_F_EC_GROUP_GET0_GENERATOR			 139
#define EC_F_EC_GROUP_GET_COFACTOR			 140
#define EC_F_EC_GROUP_GET_CURVE_GF2M			 172
#define EC_F_EC_GROUP_GET_CURVE_GFP			 130
#define EC_F_EC_GROUP_GET_DEGREE			 173
#define EC_F_EC_GROUP_GET_ORDER				 141
#define EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS		 193
#define EC_F_EC_GROUP_GET_TRINOMIAL_BASIS		 194
#define EC_F_EC_GROUP_NEW				 108
#define EC_F_EC_GROUP_NEW_BY_CURVE_NAME			 174
#define EC_F_EC_GROUP_NEW_FROM_DATA			 175
#define EC_F_EC_GROUP_PRECOMPUTE_MULT			 142
#define EC_F_EC_GROUP_SET_CURVE_GF2M			 176
#define EC_F_EC_GROUP_SET_CURVE_GFP			 109
#define EC_F_EC_GROUP_SET_EXTRA_DATA			 110
#define EC_F_EC_GROUP_SET_GENERATOR			 111
#define EC_F_EC_KEY_CHECK_KEY				 177
#define EC_F_EC_KEY_COPY				 178
#define EC_F_EC_KEY_GENERATE_KEY			 179
#define EC_F_EC_KEY_NEW					 182
#define EC_F_EC_KEY_PRINT				 180
#define EC_F_EC_KEY_PRINT_FP				 181
#define EC_F_EC_POINTS_MAKE_AFFINE			 136
#define EC_F_EC_POINTS_MUL				 138
#define EC_F_EC_POINT_ADD				 112
#define EC_F_EC_POINT_CMP				 113
#define EC_F_EC_POINT_COPY				 114
#define EC_F_EC_POINT_DBL				 115
#define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M	 183
#define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP	 116
#define EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP	 117
#define EC_F_EC_POINT_INVERT				 210
#define EC_F_EC_POINT_IS_AT_INFINITY			 118
#define EC_F_EC_POINT_IS_ON_CURVE			 119
#define EC_F_EC_POINT_MAKE_AFFINE			 120
#define EC_F_EC_POINT_MUL				 184
#define EC_F_EC_POINT_NEW				 121
#define EC_F_EC_POINT_OCT2POINT				 122
#define EC_F_EC_POINT_POINT2OCT				 123
#define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M	 185
#define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP	 124
#define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M	 186
#define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP	 125
#define EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP	 126
#define EC_F_EC_POINT_SET_TO_INFINITY			 127
#define EC_F_EC_PRE_COMP_DUP				 207
#define EC_F_EC_PRE_COMP_NEW				 196
#define EC_F_EC_WNAF_MUL				 187
#define EC_F_EC_WNAF_PRECOMPUTE_MULT			 188
#define EC_F_I2D_ECPARAMETERS				 190
#define EC_F_I2D_ECPKPARAMETERS				 191
#define EC_F_I2D_ECPRIVATEKEY				 192
#define EC_F_I2O_ECPUBLICKEY				 151
#define EC_F_O2I_ECPUBLICKEY				 152

/* Reason codes. */
#define EC_R_ASN1_ERROR					 115
#define EC_R_ASN1_UNKNOWN_FIELD				 116
#define EC_R_BUFFER_TOO_SMALL				 100
#define EC_R_D2I_ECPKPARAMETERS_FAILURE			 117
#define EC_R_DISCRIMINANT_IS_ZERO			 118
#define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE		 119
#define EC_R_FIELD_TOO_LARGE				 138
#define EC_R_GROUP2PKPARAMETERS_FAILURE			 120
#define EC_R_I2D_ECPKPARAMETERS_FAILURE			 121
#define EC_R_INCOMPATIBLE_OBJECTS			 101
#define EC_R_INVALID_ARGUMENT				 112
#define EC_R_INVALID_COMPRESSED_POINT			 110
#define EC_R_INVALID_COMPRESSION_BIT			 109
#define EC_R_INVALID_ENCODING				 102
#define EC_R_INVALID_FIELD				 103
#define EC_R_INVALID_FORM				 104
#define EC_R_INVALID_GROUP_ORDER			 122
#define EC_R_INVALID_PENTANOMIAL_BASIS			 132
#define EC_R_INVALID_PRIVATE_KEY			 123
#define EC_R_INVALID_TRINOMIAL_BASIS			 137
#define EC_R_MISSING_PARAMETERS				 124
#define EC_R_MISSING_PRIVATE_KEY			 125
#define EC_R_NOT_A_NIST_PRIME				 135
#define EC_R_NOT_A_SUPPORTED_NIST_PRIME			 136
#define EC_R_NOT_IMPLEMENTED				 126
#define EC_R_NOT_INITIALIZED				 111
#define EC_R_NO_FIELD_MOD				 133
#define EC_R_PASSED_NULL_PARAMETER			 134
#define EC_R_PKPARAMETERS2GROUP_FAILURE			 127
#define EC_R_POINT_AT_INFINITY				 106
#define EC_R_POINT_IS_NOT_ON_CURVE			 107
#define EC_R_SLOT_FULL					 108
#define EC_R_UNDEFINED_GENERATOR			 113
#define EC_R_UNDEFINED_ORDER				 128
#define EC_R_UNKNOWN_GROUP				 129
#define EC_R_UNKNOWN_ORDER				 114
#define EC_R_UNSUPPORTED_FIELD				 131
#define EC_R_WRONG_ORDER				 130

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/comp.h0000755000175000017500000000367211341640430017737 0ustar  davidedavide
#ifndef HEADER_COMP_H
#define HEADER_COMP_H

#include 

#ifdef  __cplusplus
extern "C" {
#endif

typedef struct comp_ctx_st COMP_CTX;

typedef struct comp_method_st
	{
	int type;		/* NID for compression library */
	const char *name;	/* A text string to identify the library */
	int (*init)(COMP_CTX *ctx);
	void (*finish)(COMP_CTX *ctx);
	int (*compress)(COMP_CTX *ctx,
			unsigned char *out, unsigned int olen,
			unsigned char *in, unsigned int ilen);
	int (*expand)(COMP_CTX *ctx,
		      unsigned char *out, unsigned int olen,
		      unsigned char *in, unsigned int ilen);
	/* The following two do NOTHING, but are kept for backward compatibility */
	long (*ctrl)(void);
	long (*callback_ctrl)(void);
	} COMP_METHOD;

struct comp_ctx_st
	{
	COMP_METHOD *meth;
	unsigned long compress_in;
	unsigned long compress_out;
	unsigned long expand_in;
	unsigned long expand_out;

	CRYPTO_EX_DATA	ex_data;
	};


COMP_CTX *COMP_CTX_new(COMP_METHOD *meth);
void COMP_CTX_free(COMP_CTX *ctx);
int COMP_compress_block(COMP_CTX *ctx, unsigned char *out, int olen,
	unsigned char *in, int ilen);
int COMP_expand_block(COMP_CTX *ctx, unsigned char *out, int olen,
	unsigned char *in, int ilen);
COMP_METHOD *COMP_rle(void );
COMP_METHOD *COMP_zlib(void );
void COMP_zlib_cleanup(void);

#ifdef HEADER_BIO_H
#ifdef ZLIB
BIO_METHOD *BIO_f_zlib(void);
#endif
#endif

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_COMP_strings(void);

/* Error codes for the COMP functions. */

/* Function codes. */
#define COMP_F_BIO_ZLIB_FLUSH				 99
#define COMP_F_BIO_ZLIB_NEW				 100
#define COMP_F_BIO_ZLIB_READ				 101
#define COMP_F_BIO_ZLIB_WRITE				 102

/* Reason codes. */
#define COMP_R_ZLIB_DEFLATE_ERROR			 99
#define COMP_R_ZLIB_INFLATE_ERROR			 100
#define COMP_R_ZLIB_NOT_SUPPORTED			 101

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/ui.h0000755000175000017500000004004211341640430017406 0ustar  davidedavide/* crypto/ui/ui.h -*- mode:C; c-file-style: "eay" -*- */
/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL
 * project 2001.
 */
/* ====================================================================
 * Copyright (c) 2001 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

#ifndef HEADER_UI_H
#define HEADER_UI_H

#ifndef OPENSSL_NO_DEPRECATED
#include 
#endif
#include 
#include 

#ifdef  __cplusplus
extern "C" {
#endif

/* Declared already in ossl_typ.h */
/* typedef struct ui_st UI; */
/* typedef struct ui_method_st UI_METHOD; */


/* All the following functions return -1 or NULL on error and in some cases
   (UI_process()) -2 if interrupted or in some other way cancelled.
   When everything is fine, they return 0, a positive value or a non-NULL
   pointer, all depending on their purpose. */

/* Creators and destructor.   */
UI *UI_new(void);
UI *UI_new_method(const UI_METHOD *method);
void UI_free(UI *ui);

/* The following functions are used to add strings to be printed and prompt
   strings to prompt for data.  The names are UI_{add,dup}__string
   and UI_{add,dup}_input_boolean.

   UI_{add,dup}__string have the following meanings:
	add	add a text or prompt string.  The pointers given to these
		functions are used verbatim, no copying is done.
	dup	make a copy of the text or prompt string, then add the copy
		to the collection of strings in the user interface.
	
		The function is a name for the functionality that the given
		string shall be used for.  It can be one of:
			input	use the string as data prompt.
			verify	use the string as verification prompt.  This
				is used to verify a previous input.
			info	use the string for informational output.
			error	use the string for error output.
   Honestly, there's currently no difference between info and error for the
   moment.

   UI_{add,dup}_input_boolean have the same semantics for "add" and "dup",
   and are typically used when one wants to prompt for a yes/no response.


   All of the functions in this group take a UI and a prompt string.
   The string input and verify addition functions also take a flag argument,
   a buffer for the result to end up with, a minimum input size and a maximum
   input size (the result buffer MUST be large enough to be able to contain
   the maximum number of characters).  Additionally, the verify addition
   functions takes another buffer to compare the result against.
   The boolean input functions take an action description string (which should
   be safe to ignore if the expected user action is obvious, for example with
   a dialog box with an OK button and a Cancel button), a string of acceptable
   characters to mean OK and to mean Cancel.  The two last strings are checked
   to make sure they don't have common characters.  Additionally, the same
   flag argument as for the string input is taken, as well as a result buffer.
   The result buffer is required to be at least one byte long.  Depending on
   the answer, the first character from the OK or the Cancel character strings
   will be stored in the first byte of the result buffer.  No NUL will be
   added, so the result is *not* a string.

   On success, the all return an index of the added information.  That index
   is usefull when retrieving results with UI_get0_result(). */
int UI_add_input_string(UI *ui, const char *prompt, int flags,
	char *result_buf, int minsize, int maxsize);
int UI_dup_input_string(UI *ui, const char *prompt, int flags,
	char *result_buf, int minsize, int maxsize);
int UI_add_verify_string(UI *ui, const char *prompt, int flags,
	char *result_buf, int minsize, int maxsize, const char *test_buf);
int UI_dup_verify_string(UI *ui, const char *prompt, int flags,
	char *result_buf, int minsize, int maxsize, const char *test_buf);
int UI_add_input_boolean(UI *ui, const char *prompt, const char *action_desc,
	const char *ok_chars, const char *cancel_chars,
	int flags, char *result_buf);
int UI_dup_input_boolean(UI *ui, const char *prompt, const char *action_desc,
	const char *ok_chars, const char *cancel_chars,
	int flags, char *result_buf);
int UI_add_info_string(UI *ui, const char *text);
int UI_dup_info_string(UI *ui, const char *text);
int UI_add_error_string(UI *ui, const char *text);
int UI_dup_error_string(UI *ui, const char *text);

/* These are the possible flags.  They can be or'ed together. */
/* Use to have echoing of input */
#define UI_INPUT_FLAG_ECHO		0x01
/* Use a default password.  Where that password is found is completely
   up to the application, it might for example be in the user data set
   with UI_add_user_data().  It is not recommended to have more than
   one input in each UI being marked with this flag, or the application
   might get confused. */
#define UI_INPUT_FLAG_DEFAULT_PWD	0x02

/* The user of these routines may want to define flags of their own.  The core
   UI won't look at those, but will pass them on to the method routines.  They
   must use higher bits so they don't get confused with the UI bits above.
   UI_INPUT_FLAG_USER_BASE tells which is the lowest bit to use.  A good
   example of use is this:

	#define MY_UI_FLAG1	(0x01 << UI_INPUT_FLAG_USER_BASE)

*/
#define UI_INPUT_FLAG_USER_BASE	16


/* The following function helps construct a prompt.  object_desc is a
   textual short description of the object, for example "pass phrase",
   and object_name is the name of the object (might be a card name or
   a file name.
   The returned string shall always be allocated on the heap with
   OPENSSL_malloc(), and need to be free'd with OPENSSL_free().

   If the ui_method doesn't contain a pointer to a user-defined prompt
   constructor, a default string is built, looking like this:

	"Enter {object_desc} for {object_name}:"

   So, if object_desc has the value "pass phrase" and object_name has
   the value "foo.key", the resulting string is:

	"Enter pass phrase for foo.key:"
*/
char *UI_construct_prompt(UI *ui_method,
	const char *object_desc, const char *object_name);


/* The following function is used to store a pointer to user-specific data.
   Any previous such pointer will be returned and replaced.

   For callback purposes, this function makes a lot more sense than using
   ex_data, since the latter requires that different parts of OpenSSL or
   applications share the same ex_data index.

   Note that the UI_OpenSSL() method completely ignores the user data.
   Other methods may not, however.  */
void *UI_add_user_data(UI *ui, void *user_data);
/* We need a user data retrieving function as well.  */
void *UI_get0_user_data(UI *ui);

/* Return the result associated with a prompt given with the index i. */
const char *UI_get0_result(UI *ui, int i);

/* When all strings have been added, process the whole thing. */
int UI_process(UI *ui);

/* Give a user interface parametrised control commands.  This can be used to
   send down an integer, a data pointer or a function pointer, as well as
   be used to get information from a UI. */
int UI_ctrl(UI *ui, int cmd, long i, void *p, void (*f)(void));

/* The commands */
/* Use UI_CONTROL_PRINT_ERRORS with the value 1 to have UI_process print the
   OpenSSL error stack before printing any info or added error messages and
   before any prompting. */
#define UI_CTRL_PRINT_ERRORS		1
/* Check if a UI_process() is possible to do again with the same instance of
   a user interface.  This makes UI_ctrl() return 1 if it is redoable, and 0
   if not. */
#define UI_CTRL_IS_REDOABLE		2


/* Some methods may use extra data */
#define UI_set_app_data(s,arg)         UI_set_ex_data(s,0,arg)
#define UI_get_app_data(s)             UI_get_ex_data(s,0)
int UI_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
	CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
int UI_set_ex_data(UI *r,int idx,void *arg);
void *UI_get_ex_data(UI *r, int idx);

/* Use specific methods instead of the built-in one */
void UI_set_default_method(const UI_METHOD *meth);
const UI_METHOD *UI_get_default_method(void);
const UI_METHOD *UI_get_method(UI *ui);
const UI_METHOD *UI_set_method(UI *ui, const UI_METHOD *meth);

/* The method with all the built-in thingies */
UI_METHOD *UI_OpenSSL(void);


/* ---------- For method writers ---------- */
/* A method contains a number of functions that implement the low level
   of the User Interface.  The functions are:

	an opener	This function starts a session, maybe by opening
			a channel to a tty, or by opening a window.
	a writer	This function is called to write a given string,
			maybe to the tty, maybe as a field label in a
			window.
	a flusher	This function is called to flush everything that
			has been output so far.  It can be used to actually
			display a dialog box after it has been built.
	a reader	This function is called to read a given prompt,
			maybe from the tty, maybe from a field in a
			window.  Note that it's called wth all string
			structures, not only the prompt ones, so it must
			check such things itself.
	a closer	This function closes the session, maybe by closing
			the channel to the tty, or closing the window.

   All these functions are expected to return:

	0	on error.
	1	on success.
	-1	on out-of-band events, for example if some prompting has
		been canceled (by pressing Ctrl-C, for example).  This is
		only checked when returned by the flusher or the reader.

   The way this is used, the opener is first called, then the writer for all
   strings, then the flusher, then the reader for all strings and finally the
   closer.  Note that if you want to prompt from a terminal or other command
   line interface, the best is to have the reader also write the prompts
   instead of having the writer do it.  If you want to prompt from a dialog
   box, the writer can be used to build up the contents of the box, and the
   flusher to actually display the box and run the event loop until all data
   has been given, after which the reader only grabs the given data and puts
   them back into the UI strings.

   All method functions take a UI as argument.  Additionally, the writer and
   the reader take a UI_STRING.
*/

/* The UI_STRING type is the data structure that contains all the needed info
   about a string or a prompt, including test data for a verification prompt.
*/
DECLARE_STACK_OF(UI_STRING)
typedef struct ui_string_st UI_STRING;

/* The different types of strings that are currently supported.
   This is only needed by method authors. */
enum UI_string_types
	{
	UIT_NONE=0,
	UIT_PROMPT,		/* Prompt for a string */
	UIT_VERIFY,		/* Prompt for a string and verify */
	UIT_BOOLEAN,		/* Prompt for a yes/no response */
	UIT_INFO,		/* Send info to the user */
	UIT_ERROR		/* Send an error message to the user */
	};

/* Create and manipulate methods */
UI_METHOD *UI_create_method(char *name);
void UI_destroy_method(UI_METHOD *ui_method);
int UI_method_set_opener(UI_METHOD *method, int (*opener)(UI *ui));
int UI_method_set_writer(UI_METHOD *method, int (*writer)(UI *ui, UI_STRING *uis));
int UI_method_set_flusher(UI_METHOD *method, int (*flusher)(UI *ui));
int UI_method_set_reader(UI_METHOD *method, int (*reader)(UI *ui, UI_STRING *uis));
int UI_method_set_closer(UI_METHOD *method, int (*closer)(UI *ui));
int (*UI_method_get_opener(UI_METHOD *method))(UI*);
int (*UI_method_get_writer(UI_METHOD *method))(UI*,UI_STRING*);
int (*UI_method_get_flusher(UI_METHOD *method))(UI*);
int (*UI_method_get_reader(UI_METHOD *method))(UI*,UI_STRING*);
int (*UI_method_get_closer(UI_METHOD *method))(UI*);

/* The following functions are helpers for method writers to access relevant
   data from a UI_STRING. */

/* Return type of the UI_STRING */
enum UI_string_types UI_get_string_type(UI_STRING *uis);
/* Return input flags of the UI_STRING */
int UI_get_input_flags(UI_STRING *uis);
/* Return the actual string to output (the prompt, info or error) */
const char *UI_get0_output_string(UI_STRING *uis);
/* Return the optional action string to output (the boolean promtp instruction) */
const char *UI_get0_action_string(UI_STRING *uis);
/* Return the result of a prompt */
const char *UI_get0_result_string(UI_STRING *uis);
/* Return the string to test the result against.  Only useful with verifies. */
const char *UI_get0_test_string(UI_STRING *uis);
/* Return the required minimum size of the result */
int UI_get_result_minsize(UI_STRING *uis);
/* Return the required maximum size of the result */
int UI_get_result_maxsize(UI_STRING *uis);
/* Set the result of a UI_STRING. */
int UI_set_result(UI *ui, UI_STRING *uis, const char *result);


/* A couple of popular utility functions */
int UI_UTIL_read_pw_string(char *buf,int length,const char *prompt,int verify);
int UI_UTIL_read_pw(char *buf,char *buff,int size,const char *prompt,int verify);


/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_UI_strings(void);

/* Error codes for the UI functions. */

/* Function codes. */
#define UI_F_GENERAL_ALLOCATE_BOOLEAN			 108
#define UI_F_GENERAL_ALLOCATE_PROMPT			 109
#define UI_F_GENERAL_ALLOCATE_STRING			 100
#define UI_F_UI_CTRL					 111
#define UI_F_UI_DUP_ERROR_STRING			 101
#define UI_F_UI_DUP_INFO_STRING				 102
#define UI_F_UI_DUP_INPUT_BOOLEAN			 110
#define UI_F_UI_DUP_INPUT_STRING			 103
#define UI_F_UI_DUP_VERIFY_STRING			 106
#define UI_F_UI_GET0_RESULT				 107
#define UI_F_UI_NEW_METHOD				 104
#define UI_F_UI_SET_RESULT				 105

/* Reason codes. */
#define UI_R_COMMON_OK_AND_CANCEL_CHARACTERS		 104
#define UI_R_INDEX_TOO_LARGE				 102
#define UI_R_INDEX_TOO_SMALL				 103
#define UI_R_NO_RESULT_BUFFER				 105
#define UI_R_RESULT_TOO_LARGE				 100
#define UI_R_RESULT_TOO_SMALL				 101
#define UI_R_UNKNOWN_CONTROL_COMMAND			 106

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/objects.h0000755000175000017500000010116411341640430020425 0ustar  davidedavide/* crypto/objects/objects.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_OBJECTS_H
#define HEADER_OBJECTS_H

#define USE_OBJ_MAC

#ifdef USE_OBJ_MAC
#include 
#else
#define SN_undef			"UNDEF"
#define LN_undef			"undefined"
#define NID_undef			0
#define OBJ_undef			0L

#define SN_Algorithm			"Algorithm"
#define LN_algorithm			"algorithm"
#define NID_algorithm			38
#define OBJ_algorithm			1L,3L,14L,3L,2L

#define LN_rsadsi			"rsadsi"
#define NID_rsadsi			1
#define OBJ_rsadsi			1L,2L,840L,113549L

#define LN_pkcs				"pkcs"
#define NID_pkcs			2
#define OBJ_pkcs			OBJ_rsadsi,1L

#define SN_md2				"MD2"
#define LN_md2				"md2"
#define NID_md2				3
#define OBJ_md2				OBJ_rsadsi,2L,2L

#define SN_md5				"MD5"
#define LN_md5				"md5"
#define NID_md5				4
#define OBJ_md5				OBJ_rsadsi,2L,5L

#define SN_rc4				"RC4"
#define LN_rc4				"rc4"
#define NID_rc4				5
#define OBJ_rc4				OBJ_rsadsi,3L,4L

#define LN_rsaEncryption		"rsaEncryption"
#define NID_rsaEncryption		6
#define OBJ_rsaEncryption		OBJ_pkcs,1L,1L

#define SN_md2WithRSAEncryption		"RSA-MD2"
#define LN_md2WithRSAEncryption		"md2WithRSAEncryption"
#define NID_md2WithRSAEncryption	7
#define OBJ_md2WithRSAEncryption	OBJ_pkcs,1L,2L

#define SN_md5WithRSAEncryption		"RSA-MD5"
#define LN_md5WithRSAEncryption		"md5WithRSAEncryption"
#define NID_md5WithRSAEncryption	8
#define OBJ_md5WithRSAEncryption	OBJ_pkcs,1L,4L

#define SN_pbeWithMD2AndDES_CBC		"PBE-MD2-DES"
#define LN_pbeWithMD2AndDES_CBC		"pbeWithMD2AndDES-CBC"
#define NID_pbeWithMD2AndDES_CBC	9
#define OBJ_pbeWithMD2AndDES_CBC	OBJ_pkcs,5L,1L

#define SN_pbeWithMD5AndDES_CBC		"PBE-MD5-DES"
#define LN_pbeWithMD5AndDES_CBC		"pbeWithMD5AndDES-CBC"
#define NID_pbeWithMD5AndDES_CBC	10
#define OBJ_pbeWithMD5AndDES_CBC	OBJ_pkcs,5L,3L

#define LN_X500				"X500"
#define NID_X500			11
#define OBJ_X500			2L,5L

#define LN_X509				"X509"
#define NID_X509			12
#define OBJ_X509			OBJ_X500,4L

#define SN_commonName			"CN"
#define LN_commonName			"commonName"
#define NID_commonName			13
#define OBJ_commonName			OBJ_X509,3L

#define SN_countryName			"C"
#define LN_countryName			"countryName"
#define NID_countryName			14
#define OBJ_countryName			OBJ_X509,6L

#define SN_localityName			"L"
#define LN_localityName			"localityName"
#define NID_localityName		15
#define OBJ_localityName		OBJ_X509,7L

/* Postal Address? PA */

/* should be "ST" (rfc1327) but MS uses 'S' */
#define SN_stateOrProvinceName		"ST"
#define LN_stateOrProvinceName		"stateOrProvinceName"
#define NID_stateOrProvinceName		16
#define OBJ_stateOrProvinceName		OBJ_X509,8L

#define SN_organizationName		"O"
#define LN_organizationName		"organizationName"
#define NID_organizationName		17
#define OBJ_organizationName		OBJ_X509,10L

#define SN_organizationalUnitName	"OU"
#define LN_organizationalUnitName	"organizationalUnitName"
#define NID_organizationalUnitName	18
#define OBJ_organizationalUnitName	OBJ_X509,11L

#define SN_rsa				"RSA"
#define LN_rsa				"rsa"
#define NID_rsa				19
#define OBJ_rsa				OBJ_X500,8L,1L,1L

#define LN_pkcs7			"pkcs7"
#define NID_pkcs7			20
#define OBJ_pkcs7			OBJ_pkcs,7L

#define LN_pkcs7_data			"pkcs7-data"
#define NID_pkcs7_data			21
#define OBJ_pkcs7_data			OBJ_pkcs7,1L

#define LN_pkcs7_signed			"pkcs7-signedData"
#define NID_pkcs7_signed		22
#define OBJ_pkcs7_signed		OBJ_pkcs7,2L

#define LN_pkcs7_enveloped		"pkcs7-envelopedData"
#define NID_pkcs7_enveloped		23
#define OBJ_pkcs7_enveloped		OBJ_pkcs7,3L

#define LN_pkcs7_signedAndEnveloped	"pkcs7-signedAndEnvelopedData"
#define NID_pkcs7_signedAndEnveloped	24
#define OBJ_pkcs7_signedAndEnveloped	OBJ_pkcs7,4L

#define LN_pkcs7_digest			"pkcs7-digestData"
#define NID_pkcs7_digest		25
#define OBJ_pkcs7_digest		OBJ_pkcs7,5L

#define LN_pkcs7_encrypted		"pkcs7-encryptedData"
#define NID_pkcs7_encrypted		26
#define OBJ_pkcs7_encrypted		OBJ_pkcs7,6L

#define LN_pkcs3			"pkcs3"
#define NID_pkcs3			27
#define OBJ_pkcs3			OBJ_pkcs,3L

#define LN_dhKeyAgreement		"dhKeyAgreement"
#define NID_dhKeyAgreement		28
#define OBJ_dhKeyAgreement		OBJ_pkcs3,1L

#define SN_des_ecb			"DES-ECB"
#define LN_des_ecb			"des-ecb"
#define NID_des_ecb			29
#define OBJ_des_ecb			OBJ_algorithm,6L

#define SN_des_cfb64			"DES-CFB"
#define LN_des_cfb64			"des-cfb"
#define NID_des_cfb64			30
/* IV + num */
#define OBJ_des_cfb64			OBJ_algorithm,9L

#define SN_des_cbc			"DES-CBC"
#define LN_des_cbc			"des-cbc"
#define NID_des_cbc			31
/* IV */
#define OBJ_des_cbc			OBJ_algorithm,7L

#define SN_des_ede			"DES-EDE"
#define LN_des_ede			"des-ede"
#define NID_des_ede			32
/* ?? */
#define OBJ_des_ede			OBJ_algorithm,17L

#define SN_des_ede3			"DES-EDE3"
#define LN_des_ede3			"des-ede3"
#define NID_des_ede3			33

#define SN_idea_cbc			"IDEA-CBC"
#define LN_idea_cbc			"idea-cbc"
#define NID_idea_cbc			34
#define OBJ_idea_cbc			1L,3L,6L,1L,4L,1L,188L,7L,1L,1L,2L

#define SN_idea_cfb64			"IDEA-CFB"
#define LN_idea_cfb64			"idea-cfb"
#define NID_idea_cfb64			35

#define SN_idea_ecb			"IDEA-ECB"
#define LN_idea_ecb			"idea-ecb"
#define NID_idea_ecb			36

#define SN_rc2_cbc			"RC2-CBC"
#define LN_rc2_cbc			"rc2-cbc"
#define NID_rc2_cbc			37
#define OBJ_rc2_cbc			OBJ_rsadsi,3L,2L

#define SN_rc2_ecb			"RC2-ECB"
#define LN_rc2_ecb			"rc2-ecb"
#define NID_rc2_ecb			38

#define SN_rc2_cfb64			"RC2-CFB"
#define LN_rc2_cfb64			"rc2-cfb"
#define NID_rc2_cfb64			39

#define SN_rc2_ofb64			"RC2-OFB"
#define LN_rc2_ofb64			"rc2-ofb"
#define NID_rc2_ofb64			40

#define SN_sha				"SHA"
#define LN_sha				"sha"
#define NID_sha				41
#define OBJ_sha				OBJ_algorithm,18L

#define SN_shaWithRSAEncryption		"RSA-SHA"
#define LN_shaWithRSAEncryption		"shaWithRSAEncryption"
#define NID_shaWithRSAEncryption	42
#define OBJ_shaWithRSAEncryption	OBJ_algorithm,15L

#define SN_des_ede_cbc			"DES-EDE-CBC"
#define LN_des_ede_cbc			"des-ede-cbc"
#define NID_des_ede_cbc			43

#define SN_des_ede3_cbc			"DES-EDE3-CBC"
#define LN_des_ede3_cbc			"des-ede3-cbc"
#define NID_des_ede3_cbc		44
#define OBJ_des_ede3_cbc		OBJ_rsadsi,3L,7L

#define SN_des_ofb64			"DES-OFB"
#define LN_des_ofb64			"des-ofb"
#define NID_des_ofb64			45
#define OBJ_des_ofb64			OBJ_algorithm,8L

#define SN_idea_ofb64			"IDEA-OFB"
#define LN_idea_ofb64			"idea-ofb"
#define NID_idea_ofb64			46

#define LN_pkcs9			"pkcs9"
#define NID_pkcs9			47
#define OBJ_pkcs9			OBJ_pkcs,9L

#define SN_pkcs9_emailAddress		"Email"
#define LN_pkcs9_emailAddress		"emailAddress"
#define NID_pkcs9_emailAddress		48
#define OBJ_pkcs9_emailAddress		OBJ_pkcs9,1L

#define LN_pkcs9_unstructuredName	"unstructuredName"
#define NID_pkcs9_unstructuredName	49
#define OBJ_pkcs9_unstructuredName	OBJ_pkcs9,2L

#define LN_pkcs9_contentType		"contentType"
#define NID_pkcs9_contentType		50
#define OBJ_pkcs9_contentType		OBJ_pkcs9,3L

#define LN_pkcs9_messageDigest		"messageDigest"
#define NID_pkcs9_messageDigest		51
#define OBJ_pkcs9_messageDigest		OBJ_pkcs9,4L

#define LN_pkcs9_signingTime		"signingTime"
#define NID_pkcs9_signingTime		52
#define OBJ_pkcs9_signingTime		OBJ_pkcs9,5L

#define LN_pkcs9_countersignature	"countersignature"
#define NID_pkcs9_countersignature	53
#define OBJ_pkcs9_countersignature	OBJ_pkcs9,6L

#define LN_pkcs9_challengePassword	"challengePassword"
#define NID_pkcs9_challengePassword	54
#define OBJ_pkcs9_challengePassword	OBJ_pkcs9,7L

#define LN_pkcs9_unstructuredAddress	"unstructuredAddress"
#define NID_pkcs9_unstructuredAddress	55
#define OBJ_pkcs9_unstructuredAddress	OBJ_pkcs9,8L

#define LN_pkcs9_extCertAttributes	"extendedCertificateAttributes"
#define NID_pkcs9_extCertAttributes	56
#define OBJ_pkcs9_extCertAttributes	OBJ_pkcs9,9L

#define SN_netscape			"Netscape"
#define LN_netscape			"Netscape Communications Corp."
#define NID_netscape			57
#define OBJ_netscape			2L,16L,840L,1L,113730L

#define SN_netscape_cert_extension	"nsCertExt"
#define LN_netscape_cert_extension	"Netscape Certificate Extension"
#define NID_netscape_cert_extension	58
#define OBJ_netscape_cert_extension	OBJ_netscape,1L

#define SN_netscape_data_type		"nsDataType"
#define LN_netscape_data_type		"Netscape Data Type"
#define NID_netscape_data_type		59
#define OBJ_netscape_data_type		OBJ_netscape,2L

#define SN_des_ede_cfb64		"DES-EDE-CFB"
#define LN_des_ede_cfb64		"des-ede-cfb"
#define NID_des_ede_cfb64		60

#define SN_des_ede3_cfb64		"DES-EDE3-CFB"
#define LN_des_ede3_cfb64		"des-ede3-cfb"
#define NID_des_ede3_cfb64		61

#define SN_des_ede_ofb64		"DES-EDE-OFB"
#define LN_des_ede_ofb64		"des-ede-ofb"
#define NID_des_ede_ofb64		62

#define SN_des_ede3_ofb64		"DES-EDE3-OFB"
#define LN_des_ede3_ofb64		"des-ede3-ofb"
#define NID_des_ede3_ofb64		63

/* I'm not sure about the object ID */
#define SN_sha1				"SHA1"
#define LN_sha1				"sha1"
#define NID_sha1			64
#define OBJ_sha1			OBJ_algorithm,26L
/* 28 Jun 1996 - eay */
/* #define OBJ_sha1			1L,3L,14L,2L,26L,05L <- wrong */

#define SN_sha1WithRSAEncryption	"RSA-SHA1"
#define LN_sha1WithRSAEncryption	"sha1WithRSAEncryption"
#define NID_sha1WithRSAEncryption	65
#define OBJ_sha1WithRSAEncryption	OBJ_pkcs,1L,5L

#define SN_dsaWithSHA			"DSA-SHA"
#define LN_dsaWithSHA			"dsaWithSHA"
#define NID_dsaWithSHA			66
#define OBJ_dsaWithSHA			OBJ_algorithm,13L

#define SN_dsa_2			"DSA-old"
#define LN_dsa_2			"dsaEncryption-old"
#define NID_dsa_2			67
#define OBJ_dsa_2			OBJ_algorithm,12L

/* proposed by microsoft to RSA */
#define SN_pbeWithSHA1AndRC2_CBC	"PBE-SHA1-RC2-64"
#define LN_pbeWithSHA1AndRC2_CBC	"pbeWithSHA1AndRC2-CBC"
#define NID_pbeWithSHA1AndRC2_CBC	68
#define OBJ_pbeWithSHA1AndRC2_CBC	OBJ_pkcs,5L,11L 

/* proposed by microsoft to RSA as pbeWithSHA1AndRC4: it is now
 * defined explicitly in PKCS#5 v2.0 as id-PBKDF2 which is something
 * completely different.
 */
#define LN_id_pbkdf2			"PBKDF2"
#define NID_id_pbkdf2			69
#define OBJ_id_pbkdf2			OBJ_pkcs,5L,12L 

#define SN_dsaWithSHA1_2		"DSA-SHA1-old"
#define LN_dsaWithSHA1_2		"dsaWithSHA1-old"
#define NID_dsaWithSHA1_2		70
/* Got this one from 'sdn706r20.pdf' which is actually an NSA document :-) */
#define OBJ_dsaWithSHA1_2		OBJ_algorithm,27L

#define SN_netscape_cert_type		"nsCertType"
#define LN_netscape_cert_type		"Netscape Cert Type"
#define NID_netscape_cert_type		71
#define OBJ_netscape_cert_type		OBJ_netscape_cert_extension,1L

#define SN_netscape_base_url		"nsBaseUrl"
#define LN_netscape_base_url		"Netscape Base Url"
#define NID_netscape_base_url		72
#define OBJ_netscape_base_url		OBJ_netscape_cert_extension,2L

#define SN_netscape_revocation_url	"nsRevocationUrl"
#define LN_netscape_revocation_url	"Netscape Revocation Url"
#define NID_netscape_revocation_url	73
#define OBJ_netscape_revocation_url	OBJ_netscape_cert_extension,3L

#define SN_netscape_ca_revocation_url	"nsCaRevocationUrl"
#define LN_netscape_ca_revocation_url	"Netscape CA Revocation Url"
#define NID_netscape_ca_revocation_url	74
#define OBJ_netscape_ca_revocation_url	OBJ_netscape_cert_extension,4L

#define SN_netscape_renewal_url		"nsRenewalUrl"
#define LN_netscape_renewal_url		"Netscape Renewal Url"
#define NID_netscape_renewal_url	75
#define OBJ_netscape_renewal_url	OBJ_netscape_cert_extension,7L

#define SN_netscape_ca_policy_url	"nsCaPolicyUrl"
#define LN_netscape_ca_policy_url	"Netscape CA Policy Url"
#define NID_netscape_ca_policy_url	76
#define OBJ_netscape_ca_policy_url	OBJ_netscape_cert_extension,8L

#define SN_netscape_ssl_server_name	"nsSslServerName"
#define LN_netscape_ssl_server_name	"Netscape SSL Server Name"
#define NID_netscape_ssl_server_name	77
#define OBJ_netscape_ssl_server_name	OBJ_netscape_cert_extension,12L

#define SN_netscape_comment		"nsComment"
#define LN_netscape_comment		"Netscape Comment"
#define NID_netscape_comment		78
#define OBJ_netscape_comment		OBJ_netscape_cert_extension,13L

#define SN_netscape_cert_sequence	"nsCertSequence"
#define LN_netscape_cert_sequence	"Netscape Certificate Sequence"
#define NID_netscape_cert_sequence	79
#define OBJ_netscape_cert_sequence	OBJ_netscape_data_type,5L

#define SN_desx_cbc			"DESX-CBC"
#define LN_desx_cbc			"desx-cbc"
#define NID_desx_cbc			80

#define SN_id_ce			"id-ce"
#define NID_id_ce			81
#define OBJ_id_ce			2L,5L,29L

#define SN_subject_key_identifier	"subjectKeyIdentifier"
#define LN_subject_key_identifier	"X509v3 Subject Key Identifier"
#define NID_subject_key_identifier	82
#define OBJ_subject_key_identifier	OBJ_id_ce,14L

#define SN_key_usage			"keyUsage"
#define LN_key_usage			"X509v3 Key Usage"
#define NID_key_usage			83
#define OBJ_key_usage			OBJ_id_ce,15L

#define SN_private_key_usage_period	"privateKeyUsagePeriod"
#define LN_private_key_usage_period	"X509v3 Private Key Usage Period"
#define NID_private_key_usage_period	84
#define OBJ_private_key_usage_period	OBJ_id_ce,16L

#define SN_subject_alt_name		"subjectAltName"
#define LN_subject_alt_name		"X509v3 Subject Alternative Name"
#define NID_subject_alt_name		85
#define OBJ_subject_alt_name		OBJ_id_ce,17L

#define SN_issuer_alt_name		"issuerAltName"
#define LN_issuer_alt_name		"X509v3 Issuer Alternative Name"
#define NID_issuer_alt_name		86
#define OBJ_issuer_alt_name		OBJ_id_ce,18L

#define SN_basic_constraints		"basicConstraints"
#define LN_basic_constraints		"X509v3 Basic Constraints"
#define NID_basic_constraints		87
#define OBJ_basic_constraints		OBJ_id_ce,19L

#define SN_crl_number			"crlNumber"
#define LN_crl_number			"X509v3 CRL Number"
#define NID_crl_number			88
#define OBJ_crl_number			OBJ_id_ce,20L

#define SN_certificate_policies		"certificatePolicies"
#define LN_certificate_policies		"X509v3 Certificate Policies"
#define NID_certificate_policies	89
#define OBJ_certificate_policies	OBJ_id_ce,32L

#define SN_authority_key_identifier	"authorityKeyIdentifier"
#define LN_authority_key_identifier	"X509v3 Authority Key Identifier"
#define NID_authority_key_identifier	90
#define OBJ_authority_key_identifier	OBJ_id_ce,35L

#define SN_bf_cbc			"BF-CBC"
#define LN_bf_cbc			"bf-cbc"
#define NID_bf_cbc			91
#define OBJ_bf_cbc			1L,3L,6L,1L,4L,1L,3029L,1L,2L

#define SN_bf_ecb			"BF-ECB"
#define LN_bf_ecb			"bf-ecb"
#define NID_bf_ecb			92

#define SN_bf_cfb64			"BF-CFB"
#define LN_bf_cfb64			"bf-cfb"
#define NID_bf_cfb64			93

#define SN_bf_ofb64			"BF-OFB"
#define LN_bf_ofb64			"bf-ofb"
#define NID_bf_ofb64			94

#define SN_mdc2				"MDC2"
#define LN_mdc2				"mdc2"
#define NID_mdc2			95
#define OBJ_mdc2			2L,5L,8L,3L,101L
/* An alternative?			1L,3L,14L,3L,2L,19L */

#define SN_mdc2WithRSA			"RSA-MDC2"
#define LN_mdc2WithRSA			"mdc2withRSA"
#define NID_mdc2WithRSA			96
#define OBJ_mdc2WithRSA			2L,5L,8L,3L,100L

#define SN_rc4_40			"RC4-40"
#define LN_rc4_40			"rc4-40"
#define NID_rc4_40			97

#define SN_rc2_40_cbc			"RC2-40-CBC"
#define LN_rc2_40_cbc			"rc2-40-cbc"
#define NID_rc2_40_cbc			98

#define SN_givenName			"G"
#define LN_givenName			"givenName"
#define NID_givenName			99
#define OBJ_givenName			OBJ_X509,42L

#define SN_surname			"S"
#define LN_surname			"surname"
#define NID_surname			100
#define OBJ_surname			OBJ_X509,4L

#define SN_initials			"I"
#define LN_initials			"initials"
#define NID_initials			101
#define OBJ_initials			OBJ_X509,43L

#define SN_uniqueIdentifier		"UID"
#define LN_uniqueIdentifier		"uniqueIdentifier"
#define NID_uniqueIdentifier		102
#define OBJ_uniqueIdentifier		OBJ_X509,45L

#define SN_crl_distribution_points	"crlDistributionPoints"
#define LN_crl_distribution_points	"X509v3 CRL Distribution Points"
#define NID_crl_distribution_points	103
#define OBJ_crl_distribution_points	OBJ_id_ce,31L

#define SN_md5WithRSA			"RSA-NP-MD5"
#define LN_md5WithRSA			"md5WithRSA"
#define NID_md5WithRSA			104
#define OBJ_md5WithRSA			OBJ_algorithm,3L

#define SN_serialNumber			"SN"
#define LN_serialNumber			"serialNumber"
#define NID_serialNumber		105
#define OBJ_serialNumber		OBJ_X509,5L

#define SN_title			"T"
#define LN_title			"title"
#define NID_title			106
#define OBJ_title			OBJ_X509,12L

#define SN_description			"D"
#define LN_description			"description"
#define NID_description			107
#define OBJ_description			OBJ_X509,13L

/* CAST5 is CAST-128, I'm just sticking with the documentation */
#define SN_cast5_cbc			"CAST5-CBC"
#define LN_cast5_cbc			"cast5-cbc"
#define NID_cast5_cbc			108
#define OBJ_cast5_cbc			1L,2L,840L,113533L,7L,66L,10L

#define SN_cast5_ecb			"CAST5-ECB"
#define LN_cast5_ecb			"cast5-ecb"
#define NID_cast5_ecb			109

#define SN_cast5_cfb64			"CAST5-CFB"
#define LN_cast5_cfb64			"cast5-cfb"
#define NID_cast5_cfb64			110

#define SN_cast5_ofb64			"CAST5-OFB"
#define LN_cast5_ofb64			"cast5-ofb"
#define NID_cast5_ofb64			111

#define LN_pbeWithMD5AndCast5_CBC	"pbeWithMD5AndCast5CBC"
#define NID_pbeWithMD5AndCast5_CBC	112
#define OBJ_pbeWithMD5AndCast5_CBC	1L,2L,840L,113533L,7L,66L,12L

/* This is one sun will soon be using :-(
 * id-dsa-with-sha1 ID  ::= {
 *   iso(1) member-body(2) us(840) x9-57 (10040) x9cm(4) 3 }
 */
#define SN_dsaWithSHA1			"DSA-SHA1"
#define LN_dsaWithSHA1			"dsaWithSHA1"
#define NID_dsaWithSHA1			113
#define OBJ_dsaWithSHA1			1L,2L,840L,10040L,4L,3L

#define NID_md5_sha1			114
#define SN_md5_sha1			"MD5-SHA1"
#define LN_md5_sha1			"md5-sha1"

#define SN_sha1WithRSA			"RSA-SHA1-2"
#define LN_sha1WithRSA			"sha1WithRSA"
#define NID_sha1WithRSA			115
#define OBJ_sha1WithRSA			OBJ_algorithm,29L

#define SN_dsa				"DSA"
#define LN_dsa				"dsaEncryption"
#define NID_dsa				116
#define OBJ_dsa				1L,2L,840L,10040L,4L,1L

#define SN_ripemd160			"RIPEMD160"
#define LN_ripemd160			"ripemd160"
#define NID_ripemd160			117
#define OBJ_ripemd160			1L,3L,36L,3L,2L,1L

/* The name should actually be rsaSignatureWithripemd160, but I'm going
 * to continue using the convention I'm using with the other ciphers */
#define SN_ripemd160WithRSA		"RSA-RIPEMD160"
#define LN_ripemd160WithRSA		"ripemd160WithRSA"
#define NID_ripemd160WithRSA		119
#define OBJ_ripemd160WithRSA		1L,3L,36L,3L,3L,1L,2L

/* Taken from rfc2040
 *  RC5_CBC_Parameters ::= SEQUENCE {
 *	version           INTEGER (v1_0(16)),
 *	rounds            INTEGER (8..127),
 *	blockSizeInBits   INTEGER (64, 128),
 *	iv                OCTET STRING OPTIONAL
 *	}
 */
#define SN_rc5_cbc			"RC5-CBC"
#define LN_rc5_cbc			"rc5-cbc"
#define NID_rc5_cbc			120
#define OBJ_rc5_cbc			OBJ_rsadsi,3L,8L

#define SN_rc5_ecb			"RC5-ECB"
#define LN_rc5_ecb			"rc5-ecb"
#define NID_rc5_ecb			121

#define SN_rc5_cfb64			"RC5-CFB"
#define LN_rc5_cfb64			"rc5-cfb"
#define NID_rc5_cfb64			122

#define SN_rc5_ofb64			"RC5-OFB"
#define LN_rc5_ofb64			"rc5-ofb"
#define NID_rc5_ofb64			123

#define SN_rle_compression		"RLE"
#define LN_rle_compression		"run length compression"
#define NID_rle_compression		124
#define OBJ_rle_compression		1L,1L,1L,1L,666L,1L

#define SN_zlib_compression		"ZLIB"
#define LN_zlib_compression		"zlib compression"
#define NID_zlib_compression		125
#define OBJ_zlib_compression		1L,1L,1L,1L,666L,2L

#define SN_ext_key_usage		"extendedKeyUsage"
#define LN_ext_key_usage		"X509v3 Extended Key Usage"
#define NID_ext_key_usage		126
#define OBJ_ext_key_usage		OBJ_id_ce,37

#define SN_id_pkix			"PKIX"
#define NID_id_pkix			127
#define OBJ_id_pkix			1L,3L,6L,1L,5L,5L,7L

#define SN_id_kp			"id-kp"
#define NID_id_kp			128
#define OBJ_id_kp			OBJ_id_pkix,3L

/* PKIX extended key usage OIDs */

#define SN_server_auth			"serverAuth"
#define LN_server_auth			"TLS Web Server Authentication"
#define NID_server_auth			129
#define OBJ_server_auth			OBJ_id_kp,1L

#define SN_client_auth			"clientAuth"
#define LN_client_auth			"TLS Web Client Authentication"
#define NID_client_auth			130
#define OBJ_client_auth			OBJ_id_kp,2L

#define SN_code_sign			"codeSigning"
#define LN_code_sign			"Code Signing"
#define NID_code_sign			131
#define OBJ_code_sign			OBJ_id_kp,3L

#define SN_email_protect		"emailProtection"
#define LN_email_protect		"E-mail Protection"
#define NID_email_protect		132
#define OBJ_email_protect		OBJ_id_kp,4L

#define SN_time_stamp			"timeStamping"
#define LN_time_stamp			"Time Stamping"
#define NID_time_stamp			133
#define OBJ_time_stamp			OBJ_id_kp,8L

/* Additional extended key usage OIDs: Microsoft */

#define SN_ms_code_ind			"msCodeInd"
#define LN_ms_code_ind			"Microsoft Individual Code Signing"
#define NID_ms_code_ind			134
#define OBJ_ms_code_ind			1L,3L,6L,1L,4L,1L,311L,2L,1L,21L

#define SN_ms_code_com			"msCodeCom"
#define LN_ms_code_com			"Microsoft Commercial Code Signing"
#define NID_ms_code_com			135
#define OBJ_ms_code_com			1L,3L,6L,1L,4L,1L,311L,2L,1L,22L

#define SN_ms_ctl_sign			"msCTLSign"
#define LN_ms_ctl_sign			"Microsoft Trust List Signing"
#define NID_ms_ctl_sign			136
#define OBJ_ms_ctl_sign			1L,3L,6L,1L,4L,1L,311L,10L,3L,1L

#define SN_ms_sgc			"msSGC"
#define LN_ms_sgc			"Microsoft Server Gated Crypto"
#define NID_ms_sgc			137
#define OBJ_ms_sgc			1L,3L,6L,1L,4L,1L,311L,10L,3L,3L

#define SN_ms_efs			"msEFS"
#define LN_ms_efs			"Microsoft Encrypted File System"
#define NID_ms_efs			138
#define OBJ_ms_efs			1L,3L,6L,1L,4L,1L,311L,10L,3L,4L

/* Additional usage: Netscape */

#define SN_ns_sgc			"nsSGC"
#define LN_ns_sgc			"Netscape Server Gated Crypto"
#define NID_ns_sgc			139
#define OBJ_ns_sgc			OBJ_netscape,4L,1L

#define SN_delta_crl			"deltaCRL"
#define LN_delta_crl			"X509v3 Delta CRL Indicator"
#define NID_delta_crl			140
#define OBJ_delta_crl			OBJ_id_ce,27L

#define SN_crl_reason			"CRLReason"
#define LN_crl_reason			"CRL Reason Code"
#define NID_crl_reason			141
#define OBJ_crl_reason			OBJ_id_ce,21L

#define SN_invalidity_date		"invalidityDate"
#define LN_invalidity_date		"Invalidity Date"
#define NID_invalidity_date		142
#define OBJ_invalidity_date		OBJ_id_ce,24L

#define SN_sxnet			"SXNetID"
#define LN_sxnet			"Strong Extranet ID"
#define NID_sxnet			143
#define OBJ_sxnet			1L,3L,101L,1L,4L,1L

/* PKCS12 and related OBJECT IDENTIFIERS */

#define OBJ_pkcs12			OBJ_pkcs,12L
#define OBJ_pkcs12_pbeids		OBJ_pkcs12, 1

#define SN_pbe_WithSHA1And128BitRC4	"PBE-SHA1-RC4-128"
#define LN_pbe_WithSHA1And128BitRC4	"pbeWithSHA1And128BitRC4"
#define NID_pbe_WithSHA1And128BitRC4	144
#define OBJ_pbe_WithSHA1And128BitRC4	OBJ_pkcs12_pbeids, 1L

#define SN_pbe_WithSHA1And40BitRC4	"PBE-SHA1-RC4-40"
#define LN_pbe_WithSHA1And40BitRC4	"pbeWithSHA1And40BitRC4"
#define NID_pbe_WithSHA1And40BitRC4	145
#define OBJ_pbe_WithSHA1And40BitRC4	OBJ_pkcs12_pbeids, 2L

#define SN_pbe_WithSHA1And3_Key_TripleDES_CBC	"PBE-SHA1-3DES"
#define LN_pbe_WithSHA1And3_Key_TripleDES_CBC	"pbeWithSHA1And3-KeyTripleDES-CBC"
#define NID_pbe_WithSHA1And3_Key_TripleDES_CBC	146
#define OBJ_pbe_WithSHA1And3_Key_TripleDES_CBC	OBJ_pkcs12_pbeids, 3L

#define SN_pbe_WithSHA1And2_Key_TripleDES_CBC	"PBE-SHA1-2DES"
#define LN_pbe_WithSHA1And2_Key_TripleDES_CBC	"pbeWithSHA1And2-KeyTripleDES-CBC"
#define NID_pbe_WithSHA1And2_Key_TripleDES_CBC	147
#define OBJ_pbe_WithSHA1And2_Key_TripleDES_CBC	OBJ_pkcs12_pbeids, 4L

#define SN_pbe_WithSHA1And128BitRC2_CBC		"PBE-SHA1-RC2-128"
#define LN_pbe_WithSHA1And128BitRC2_CBC		"pbeWithSHA1And128BitRC2-CBC"
#define NID_pbe_WithSHA1And128BitRC2_CBC	148
#define OBJ_pbe_WithSHA1And128BitRC2_CBC	OBJ_pkcs12_pbeids, 5L

#define SN_pbe_WithSHA1And40BitRC2_CBC	"PBE-SHA1-RC2-40"
#define LN_pbe_WithSHA1And40BitRC2_CBC	"pbeWithSHA1And40BitRC2-CBC"
#define NID_pbe_WithSHA1And40BitRC2_CBC	149
#define OBJ_pbe_WithSHA1And40BitRC2_CBC	OBJ_pkcs12_pbeids, 6L

#define OBJ_pkcs12_Version1	OBJ_pkcs12, 10L

#define OBJ_pkcs12_BagIds	OBJ_pkcs12_Version1, 1L

#define LN_keyBag		"keyBag"
#define NID_keyBag		150
#define OBJ_keyBag		OBJ_pkcs12_BagIds, 1L

#define LN_pkcs8ShroudedKeyBag	"pkcs8ShroudedKeyBag"
#define NID_pkcs8ShroudedKeyBag	151
#define OBJ_pkcs8ShroudedKeyBag	OBJ_pkcs12_BagIds, 2L

#define LN_certBag		"certBag"
#define NID_certBag		152
#define OBJ_certBag		OBJ_pkcs12_BagIds, 3L

#define LN_crlBag		"crlBag"
#define NID_crlBag		153
#define OBJ_crlBag		OBJ_pkcs12_BagIds, 4L

#define LN_secretBag		"secretBag"
#define NID_secretBag		154
#define OBJ_secretBag		OBJ_pkcs12_BagIds, 5L

#define LN_safeContentsBag	"safeContentsBag"
#define NID_safeContentsBag	155
#define OBJ_safeContentsBag	OBJ_pkcs12_BagIds, 6L

#define LN_friendlyName		"friendlyName"
#define	NID_friendlyName	156
#define OBJ_friendlyName	OBJ_pkcs9, 20L

#define LN_localKeyID		"localKeyID"
#define	NID_localKeyID		157
#define OBJ_localKeyID		OBJ_pkcs9, 21L

#define OBJ_certTypes		OBJ_pkcs9, 22L

#define LN_x509Certificate	"x509Certificate"
#define	NID_x509Certificate	158
#define OBJ_x509Certificate	OBJ_certTypes, 1L

#define LN_sdsiCertificate	"sdsiCertificate"
#define	NID_sdsiCertificate	159
#define OBJ_sdsiCertificate	OBJ_certTypes, 2L

#define OBJ_crlTypes		OBJ_pkcs9, 23L

#define LN_x509Crl		"x509Crl"
#define	NID_x509Crl		160
#define OBJ_x509Crl		OBJ_crlTypes, 1L

/* PKCS#5 v2 OIDs */

#define LN_pbes2		"PBES2"
#define NID_pbes2		161
#define OBJ_pbes2		OBJ_pkcs,5L,13L

#define LN_pbmac1		"PBMAC1"
#define NID_pbmac1		162
#define OBJ_pbmac1		OBJ_pkcs,5L,14L

#define LN_hmacWithSHA1		"hmacWithSHA1"
#define NID_hmacWithSHA1	163
#define OBJ_hmacWithSHA1	OBJ_rsadsi,2L,7L

/* Policy Qualifier Ids */

#define LN_id_qt_cps		"Policy Qualifier CPS"
#define SN_id_qt_cps		"id-qt-cps"
#define NID_id_qt_cps		164
#define OBJ_id_qt_cps		OBJ_id_pkix,2L,1L

#define LN_id_qt_unotice	"Policy Qualifier User Notice"
#define SN_id_qt_unotice	"id-qt-unotice"
#define NID_id_qt_unotice	165
#define OBJ_id_qt_unotice	OBJ_id_pkix,2L,2L

#define SN_rc2_64_cbc			"RC2-64-CBC"
#define LN_rc2_64_cbc			"rc2-64-cbc"
#define NID_rc2_64_cbc			166

#define SN_SMIMECapabilities		"SMIME-CAPS"
#define LN_SMIMECapabilities		"S/MIME Capabilities"
#define NID_SMIMECapabilities		167
#define OBJ_SMIMECapabilities		OBJ_pkcs9,15L

#define SN_pbeWithMD2AndRC2_CBC		"PBE-MD2-RC2-64"
#define LN_pbeWithMD2AndRC2_CBC		"pbeWithMD2AndRC2-CBC"
#define NID_pbeWithMD2AndRC2_CBC	168
#define OBJ_pbeWithMD2AndRC2_CBC	OBJ_pkcs,5L,4L

#define SN_pbeWithMD5AndRC2_CBC		"PBE-MD5-RC2-64"
#define LN_pbeWithMD5AndRC2_CBC		"pbeWithMD5AndRC2-CBC"
#define NID_pbeWithMD5AndRC2_CBC	169
#define OBJ_pbeWithMD5AndRC2_CBC	OBJ_pkcs,5L,6L

#define SN_pbeWithSHA1AndDES_CBC	"PBE-SHA1-DES"
#define LN_pbeWithSHA1AndDES_CBC	"pbeWithSHA1AndDES-CBC"
#define NID_pbeWithSHA1AndDES_CBC	170
#define OBJ_pbeWithSHA1AndDES_CBC	OBJ_pkcs,5L,10L

/* Extension request OIDs */

#define LN_ms_ext_req			"Microsoft Extension Request"
#define SN_ms_ext_req			"msExtReq"
#define NID_ms_ext_req			171
#define OBJ_ms_ext_req			1L,3L,6L,1L,4L,1L,311L,2L,1L,14L

#define LN_ext_req			"Extension Request"
#define SN_ext_req			"extReq"
#define NID_ext_req			172
#define OBJ_ext_req			OBJ_pkcs9,14L

#define SN_name				"name"
#define LN_name				"name"
#define NID_name			173
#define OBJ_name			OBJ_X509,41L

#define SN_dnQualifier			"dnQualifier"
#define LN_dnQualifier			"dnQualifier"
#define NID_dnQualifier			174
#define OBJ_dnQualifier			OBJ_X509,46L

#define SN_id_pe			"id-pe"
#define NID_id_pe			175
#define OBJ_id_pe			OBJ_id_pkix,1L

#define SN_id_ad			"id-ad"
#define NID_id_ad			176
#define OBJ_id_ad			OBJ_id_pkix,48L

#define SN_info_access			"authorityInfoAccess"
#define LN_info_access			"Authority Information Access"
#define NID_info_access			177
#define OBJ_info_access			OBJ_id_pe,1L

#define SN_ad_OCSP			"OCSP"
#define LN_ad_OCSP			"OCSP"
#define NID_ad_OCSP			178
#define OBJ_ad_OCSP			OBJ_id_ad,1L

#define SN_ad_ca_issuers		"caIssuers"
#define LN_ad_ca_issuers		"CA Issuers"
#define NID_ad_ca_issuers		179
#define OBJ_ad_ca_issuers		OBJ_id_ad,2L

#define SN_OCSP_sign			"OCSPSigning"
#define LN_OCSP_sign			"OCSP Signing"
#define NID_OCSP_sign			180
#define OBJ_OCSP_sign			OBJ_id_kp,9L
#endif /* USE_OBJ_MAC */

#include 
#include 

#define	OBJ_NAME_TYPE_UNDEF		0x00
#define	OBJ_NAME_TYPE_MD_METH		0x01
#define	OBJ_NAME_TYPE_CIPHER_METH	0x02
#define	OBJ_NAME_TYPE_PKEY_METH		0x03
#define	OBJ_NAME_TYPE_COMP_METH		0x04
#define	OBJ_NAME_TYPE_NUM		0x05

#define	OBJ_NAME_ALIAS			0x8000

#define OBJ_BSEARCH_VALUE_ON_NOMATCH		0x01
#define OBJ_BSEARCH_FIRST_VALUE_ON_MATCH	0x02


#ifdef  __cplusplus
extern "C" {
#endif

typedef struct obj_name_st
	{
	int type;
	int alias;
	const char *name;
	const char *data;
	} OBJ_NAME;

#define		OBJ_create_and_add_object(a,b,c) OBJ_create(a,b,c)


int OBJ_NAME_init(void);
int OBJ_NAME_new_index(unsigned long (*hash_func)(const char *),
		       int (*cmp_func)(const char *, const char *),
		       void (*free_func)(const char *, int, const char *));
const char *OBJ_NAME_get(const char *name,int type);
int OBJ_NAME_add(const char *name,int type,const char *data);
int OBJ_NAME_remove(const char *name,int type);
void OBJ_NAME_cleanup(int type); /* -1 for everything */
void OBJ_NAME_do_all(int type,void (*fn)(const OBJ_NAME *,void *arg),
		     void *arg);
void OBJ_NAME_do_all_sorted(int type,void (*fn)(const OBJ_NAME *,void *arg),
			    void *arg);

ASN1_OBJECT *	OBJ_dup(const ASN1_OBJECT *o);
ASN1_OBJECT *	OBJ_nid2obj(int n);
const char *	OBJ_nid2ln(int n);
const char *	OBJ_nid2sn(int n);
int		OBJ_obj2nid(const ASN1_OBJECT *o);
ASN1_OBJECT *	OBJ_txt2obj(const char *s, int no_name);
int	OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name);
int		OBJ_txt2nid(const char *s);
int		OBJ_ln2nid(const char *s);
int		OBJ_sn2nid(const char *s);
int		OBJ_cmp(const ASN1_OBJECT *a,const ASN1_OBJECT *b);
const char *	OBJ_bsearch(const char *key,const char *base,int num,int size,
	int (*cmp)(const void *, const void *));
const char *	OBJ_bsearch_ex(const char *key,const char *base,int num,
	int size, int (*cmp)(const void *, const void *), int flags);

int		OBJ_new_nid(int num);
int		OBJ_add_object(const ASN1_OBJECT *obj);
int		OBJ_create(const char *oid,const char *sn,const char *ln);
void		OBJ_cleanup(void );
int		OBJ_create_objects(BIO *in);

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_OBJ_strings(void);

/* Error codes for the OBJ functions. */

/* Function codes. */
#define OBJ_F_OBJ_ADD_OBJECT				 105
#define OBJ_F_OBJ_CREATE				 100
#define OBJ_F_OBJ_DUP					 101
#define OBJ_F_OBJ_NAME_NEW_INDEX			 106
#define OBJ_F_OBJ_NID2LN				 102
#define OBJ_F_OBJ_NID2OBJ				 103
#define OBJ_F_OBJ_NID2SN				 104

/* Reason codes. */
#define OBJ_R_MALLOC_FAILURE				 100
#define OBJ_R_UNKNOWN_NID				 101

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/bn.h0000755000175000017500000010143211341640430017371 0ustar  davidedavide/* crypto/bn/bn.h */
/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */
/* ====================================================================
 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
 *
 * Portions of the attached software ("Contribution") are developed by 
 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
 *
 * The Contribution is licensed pursuant to the Eric Young open source
 * license provided above.
 *
 * The binary polynomial arithmetic software is originally written by 
 * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories.
 *
 */

#ifndef HEADER_BN_H
#define HEADER_BN_H

#include 
#ifndef OPENSSL_NO_FP_API
#include  /* FILE */
#endif
#include 

#ifdef  __cplusplus
extern "C" {
#endif

/* These preprocessor symbols control various aspects of the bignum headers and
 * library code. They're not defined by any "normal" configuration, as they are
 * intended for development and testing purposes. NB: defining all three can be
 * useful for debugging application code as well as openssl itself.
 *
 * BN_DEBUG - turn on various debugging alterations to the bignum code
 * BN_DEBUG_RAND - uses random poisoning of unused words to trip up
 * mismanagement of bignum internals. You must also define BN_DEBUG.
 */
/* #define BN_DEBUG */
/* #define BN_DEBUG_RAND */

#define BN_MUL_COMBA
#define BN_SQR_COMBA
#define BN_RECURSION

/* This next option uses the C libraries (2 word)/(1 word) function.
 * If it is not defined, I use my C version (which is slower).
 * The reason for this flag is that when the particular C compiler
 * library routine is used, and the library is linked with a different
 * compiler, the library is missing.  This mostly happens when the
 * library is built with gcc and then linked using normal cc.  This would
 * be a common occurrence because gcc normally produces code that is
 * 2 times faster than system compilers for the big number stuff.
 * For machines with only one compiler (or shared libraries), this should
 * be on.  Again this in only really a problem on machines
 * using "long long's", are 32bit, and are not using my assembler code. */
#if defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_WINDOWS) || \
    defined(OPENSSL_SYS_WIN32) || defined(linux)
# ifndef BN_DIV2W
#  define BN_DIV2W
# endif
#endif

/* assuming long is 64bit - this is the DEC Alpha
 * unsigned long long is only 64 bits :-(, don't define
 * BN_LLONG for the DEC Alpha */
#ifdef SIXTY_FOUR_BIT_LONG
#define BN_ULLONG	unsigned long long
#define BN_ULONG	unsigned long
#define BN_LONG		long
#define BN_BITS		128
#define BN_BYTES	8
#define BN_BITS2	64
#define BN_BITS4	32
#define BN_MASK		(0xffffffffffffffffffffffffffffffffLL)
#define BN_MASK2	(0xffffffffffffffffL)
#define BN_MASK2l	(0xffffffffL)
#define BN_MASK2h	(0xffffffff00000000L)
#define BN_MASK2h1	(0xffffffff80000000L)
#define BN_TBIT		(0x8000000000000000L)
#define BN_DEC_CONV	(10000000000000000000UL)
#define BN_DEC_FMT1	"%lu"
#define BN_DEC_FMT2	"%019lu"
#define BN_DEC_NUM	19
#endif

/* This is where the long long data type is 64 bits, but long is 32.
 * For machines where there are 64bit registers, this is the mode to use.
 * IRIX, on R4000 and above should use this mode, along with the relevant
 * assembler code :-).  Do NOT define BN_LLONG.
 */
#ifdef SIXTY_FOUR_BIT
#undef BN_LLONG
#undef BN_ULLONG
#define BN_ULONG	unsigned long long
#define BN_LONG		long long
#define BN_BITS		128
#define BN_BYTES	8
#define BN_BITS2	64
#define BN_BITS4	32
#define BN_MASK2	(0xffffffffffffffffLL)
#define BN_MASK2l	(0xffffffffL)
#define BN_MASK2h	(0xffffffff00000000LL)
#define BN_MASK2h1	(0xffffffff80000000LL)
#define BN_TBIT		(0x8000000000000000LL)
#define BN_DEC_CONV	(10000000000000000000ULL)
#define BN_DEC_FMT1	"%llu"
#define BN_DEC_FMT2	"%019llu"
#define BN_DEC_NUM	19
#endif

#ifdef THIRTY_TWO_BIT
#ifdef BN_LLONG
# if defined(OPENSSL_SYS_WIN32) && !defined(__GNUC__)
#  define BN_ULLONG	unsigned __int64
# else
#  define BN_ULLONG	unsigned long long
# endif
#endif
#define BN_ULONG	unsigned long
#define BN_LONG		long
#define BN_BITS		64
#define BN_BYTES	4
#define BN_BITS2	32
#define BN_BITS4	16
#ifdef OPENSSL_SYS_WIN32
/* VC++ doesn't like the LL suffix */
#define BN_MASK		(0xffffffffffffffffL)
#else
#define BN_MASK		(0xffffffffffffffffLL)
#endif
#define BN_MASK2	(0xffffffffL)
#define BN_MASK2l	(0xffff)
#define BN_MASK2h1	(0xffff8000L)
#define BN_MASK2h	(0xffff0000L)
#define BN_TBIT		(0x80000000L)
#define BN_DEC_CONV	(1000000000L)
#define BN_DEC_FMT1	"%lu"
#define BN_DEC_FMT2	"%09lu"
#define BN_DEC_NUM	9
#endif

#ifdef SIXTEEN_BIT
#ifndef BN_DIV2W
#define BN_DIV2W
#endif
#define BN_ULLONG	unsigned long
#define BN_ULONG	unsigned short
#define BN_LONG		short
#define BN_BITS		32
#define BN_BYTES	2
#define BN_BITS2	16
#define BN_BITS4	8
#define BN_MASK		(0xffffffff)
#define BN_MASK2	(0xffff)
#define BN_MASK2l	(0xff)
#define BN_MASK2h1	(0xff80)
#define BN_MASK2h	(0xff00)
#define BN_TBIT		(0x8000)
#define BN_DEC_CONV	(100000)
#define BN_DEC_FMT1	"%u"
#define BN_DEC_FMT2	"%05u"
#define BN_DEC_NUM	5
#endif

#ifdef EIGHT_BIT
#ifndef BN_DIV2W
#define BN_DIV2W
#endif
#define BN_ULLONG	unsigned short
#define BN_ULONG	unsigned char
#define BN_LONG		char
#define BN_BITS		16
#define BN_BYTES	1
#define BN_BITS2	8
#define BN_BITS4	4
#define BN_MASK		(0xffff)
#define BN_MASK2	(0xff)
#define BN_MASK2l	(0xf)
#define BN_MASK2h1	(0xf8)
#define BN_MASK2h	(0xf0)
#define BN_TBIT		(0x80)
#define BN_DEC_CONV	(100)
#define BN_DEC_FMT1	"%u"
#define BN_DEC_FMT2	"%02u"
#define BN_DEC_NUM	2
#endif

#define BN_DEFAULT_BITS	1280

#define BN_FLG_MALLOCED		0x01
#define BN_FLG_STATIC_DATA	0x02
#define BN_FLG_CONSTTIME	0x04 /* avoid leaking exponent information through timing,
                                      * BN_mod_exp_mont() will call BN_mod_exp_mont_consttime,
                                      * BN_div() will call BN_div_no_branch,
                                      * BN_mod_inverse() will call BN_mod_inverse_no_branch.
                                      */

#ifndef OPENSSL_NO_DEPRECATED
#define BN_FLG_EXP_CONSTTIME BN_FLG_CONSTTIME /* deprecated name for the flag */
                                      /* avoid leaking exponent information through timings
                                      * (BN_mod_exp_mont() will call BN_mod_exp_mont_consttime) */
#endif

#ifndef OPENSSL_NO_DEPRECATED
#define BN_FLG_FREE		0x8000	/* used for debuging */
#endif
#define BN_set_flags(b,n)	((b)->flags|=(n))
#define BN_get_flags(b,n)	((b)->flags&(n))

/* get a clone of a BIGNUM with changed flags, for *temporary* use only
 * (the two BIGNUMs cannot not be used in parallel!) */
#define BN_with_flags(dest,b,n)  ((dest)->d=(b)->d, \
                                  (dest)->top=(b)->top, \
                                  (dest)->dmax=(b)->dmax, \
                                  (dest)->neg=(b)->neg, \
                                  (dest)->flags=(((dest)->flags & BN_FLG_MALLOCED) \
                                                 |  ((b)->flags & ~BN_FLG_MALLOCED) \
                                                 |  BN_FLG_STATIC_DATA \
                                                 |  (n)))

/* Already declared in ossl_typ.h */
#if 0
typedef struct bignum_st BIGNUM;
/* Used for temp variables (declaration hidden in bn_lcl.h) */
typedef struct bignum_ctx BN_CTX;
typedef struct bn_blinding_st BN_BLINDING;
typedef struct bn_mont_ctx_st BN_MONT_CTX;
typedef struct bn_recp_ctx_st BN_RECP_CTX;
typedef struct bn_gencb_st BN_GENCB;
#endif

struct bignum_st
	{
	BN_ULONG *d;	/* Pointer to an array of 'BN_BITS2' bit chunks. */
	int top;	/* Index of last used d +1. */
	/* The next are internal book keeping for bn_expand. */
	int dmax;	/* Size of the d array. */
	int neg;	/* one if the number is negative */
	int flags;
	};

/* Used for montgomery multiplication */
struct bn_mont_ctx_st
	{
	int ri;        /* number of bits in R */
	BIGNUM RR;     /* used to convert to montgomery form */
	BIGNUM N;      /* The modulus */
	BIGNUM Ni;     /* R*(1/R mod N) - N*Ni = 1
	                * (Ni is only stored for bignum algorithm) */
#if 0
	/* OpenSSL 0.9.9 preview: */
	BN_ULONG n0[2];/* least significant word(s) of Ni */
#else
	BN_ULONG n0;   /* least significant word of Ni */
#endif
	int flags;
	};

/* Used for reciprocal division/mod functions
 * It cannot be shared between threads
 */
struct bn_recp_ctx_st
	{
	BIGNUM N;	/* the divisor */
	BIGNUM Nr;	/* the reciprocal */
	int num_bits;
	int shift;
	int flags;
	};

/* Used for slow "generation" functions. */
struct bn_gencb_st
	{
	unsigned int ver;	/* To handle binary (in)compatibility */
	void *arg;		/* callback-specific data */
	union
		{
		/* if(ver==1) - handles old style callbacks */
		void (*cb_1)(int, int, void *);
		/* if(ver==2) - new callback style */
		int (*cb_2)(int, int, BN_GENCB *);
		} cb;
	};
/* Wrapper function to make using BN_GENCB easier,  */
int BN_GENCB_call(BN_GENCB *cb, int a, int b);
/* Macro to populate a BN_GENCB structure with an "old"-style callback */
#define BN_GENCB_set_old(gencb, callback, cb_arg) { \
		BN_GENCB *tmp_gencb = (gencb); \
		tmp_gencb->ver = 1; \
		tmp_gencb->arg = (cb_arg); \
		tmp_gencb->cb.cb_1 = (callback); }
/* Macro to populate a BN_GENCB structure with a "new"-style callback */
#define BN_GENCB_set(gencb, callback, cb_arg) { \
		BN_GENCB *tmp_gencb = (gencb); \
		tmp_gencb->ver = 2; \
		tmp_gencb->arg = (cb_arg); \
		tmp_gencb->cb.cb_2 = (callback); }

#define BN_prime_checks 0 /* default: select number of iterations
			     based on the size of the number */

/* number of Miller-Rabin iterations for an error rate  of less than 2^-80
 * for random 'b'-bit input, b >= 100 (taken from table 4.4 in the Handbook
 * of Applied Cryptography [Menezes, van Oorschot, Vanstone; CRC Press 1996];
 * original paper: Damgaard, Landrock, Pomerance: Average case error estimates
 * for the strong probable prime test. -- Math. Comp. 61 (1993) 177-194) */
#define BN_prime_checks_for_size(b) ((b) >= 1300 ?  2 : \
                                (b) >=  850 ?  3 : \
                                (b) >=  650 ?  4 : \
                                (b) >=  550 ?  5 : \
                                (b) >=  450 ?  6 : \
                                (b) >=  400 ?  7 : \
                                (b) >=  350 ?  8 : \
                                (b) >=  300 ?  9 : \
                                (b) >=  250 ? 12 : \
                                (b) >=  200 ? 15 : \
                                (b) >=  150 ? 18 : \
                                /* b >= 100 */ 27)

#define BN_num_bytes(a)	((BN_num_bits(a)+7)/8)

/* Note that BN_abs_is_word didn't work reliably for w == 0 until 0.9.8 */
#define BN_abs_is_word(a,w) ((((a)->top == 1) && ((a)->d[0] == (BN_ULONG)(w))) || \
				(((w) == 0) && ((a)->top == 0)))
#define BN_is_zero(a)       ((a)->top == 0)
#define BN_is_one(a)        (BN_abs_is_word((a),1) && !(a)->neg)
#define BN_is_word(a,w)     (BN_abs_is_word((a),(w)) && (!(w) || !(a)->neg))
#define BN_is_odd(a)	    (((a)->top > 0) && ((a)->d[0] & 1))

#define BN_one(a)	(BN_set_word((a),1))
#define BN_zero_ex(a) \
	do { \
		BIGNUM *_tmp_bn = (a); \
		_tmp_bn->top = 0; \
		_tmp_bn->neg = 0; \
	} while(0)
#ifdef OPENSSL_NO_DEPRECATED
#define BN_zero(a)	BN_zero_ex(a)
#else
#define BN_zero(a)	(BN_set_word((a),0))
#endif

const BIGNUM *BN_value_one(void);
char *	BN_options(void);
BN_CTX *BN_CTX_new(void);
#ifndef OPENSSL_NO_DEPRECATED
void	BN_CTX_init(BN_CTX *c);
#endif
void	BN_CTX_free(BN_CTX *c);
void	BN_CTX_start(BN_CTX *ctx);
BIGNUM *BN_CTX_get(BN_CTX *ctx);
void	BN_CTX_end(BN_CTX *ctx);
int     BN_rand(BIGNUM *rnd, int bits, int top,int bottom);
int     BN_pseudo_rand(BIGNUM *rnd, int bits, int top,int bottom);
int	BN_rand_range(BIGNUM *rnd, const BIGNUM *range);
int	BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range);
int	BN_num_bits(const BIGNUM *a);
int	BN_num_bits_word(BN_ULONG);
BIGNUM *BN_new(void);
void	BN_init(BIGNUM *);
void	BN_clear_free(BIGNUM *a);
BIGNUM *BN_copy(BIGNUM *a, const BIGNUM *b);
void	BN_swap(BIGNUM *a, BIGNUM *b);
BIGNUM *BN_bin2bn(const unsigned char *s,int len,BIGNUM *ret);
int	BN_bn2bin(const BIGNUM *a, unsigned char *to);
BIGNUM *BN_mpi2bn(const unsigned char *s,int len,BIGNUM *ret);
int	BN_bn2mpi(const BIGNUM *a, unsigned char *to);
int	BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
int	BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
int	BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
int	BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
int	BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx);
int	BN_sqr(BIGNUM *r, const BIGNUM *a,BN_CTX *ctx);
/** BN_set_negative sets sign of a BIGNUM
 * \param  b  pointer to the BIGNUM object
 * \param  n  0 if the BIGNUM b should be positive and a value != 0 otherwise 
 */
void	BN_set_negative(BIGNUM *b, int n);
/** BN_is_negative returns 1 if the BIGNUM is negative
 * \param  a  pointer to the BIGNUM object
 * \return 1 if a < 0 and 0 otherwise
 */
#define BN_is_negative(a) ((a)->neg != 0)

int	BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m, const BIGNUM *d,
	BN_CTX *ctx);
#define BN_mod(rem,m,d,ctx) BN_div(NULL,(rem),(m),(d),(ctx))
int	BN_nnmod(BIGNUM *r, const BIGNUM *m, const BIGNUM *d, BN_CTX *ctx);
int	BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);
int	BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m);
int	BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m, BN_CTX *ctx);
int	BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m);
int	BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
	const BIGNUM *m, BN_CTX *ctx);
int	BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
int	BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
int	BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m);
int	BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m, BN_CTX *ctx);
int	BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m);

BN_ULONG BN_mod_word(const BIGNUM *a, BN_ULONG w);
BN_ULONG BN_div_word(BIGNUM *a, BN_ULONG w);
int	BN_mul_word(BIGNUM *a, BN_ULONG w);
int	BN_add_word(BIGNUM *a, BN_ULONG w);
int	BN_sub_word(BIGNUM *a, BN_ULONG w);
int	BN_set_word(BIGNUM *a, BN_ULONG w);
BN_ULONG BN_get_word(const BIGNUM *a);

int	BN_cmp(const BIGNUM *a, const BIGNUM *b);
void	BN_free(BIGNUM *a);
int	BN_is_bit_set(const BIGNUM *a, int n);
int	BN_lshift(BIGNUM *r, const BIGNUM *a, int n);
int	BN_lshift1(BIGNUM *r, const BIGNUM *a);
int	BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,BN_CTX *ctx);

int	BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
	const BIGNUM *m,BN_CTX *ctx);
int	BN_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
	const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
int BN_mod_exp_mont_consttime(BIGNUM *rr, const BIGNUM *a, const BIGNUM *p,
	const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *in_mont);
int	BN_mod_exp_mont_word(BIGNUM *r, BN_ULONG a, const BIGNUM *p,
	const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx);
int	BN_mod_exp2_mont(BIGNUM *r, const BIGNUM *a1, const BIGNUM *p1,
	const BIGNUM *a2, const BIGNUM *p2,const BIGNUM *m,
	BN_CTX *ctx,BN_MONT_CTX *m_ctx);
int	BN_mod_exp_simple(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
	const BIGNUM *m,BN_CTX *ctx);

int	BN_mask_bits(BIGNUM *a,int n);
#ifndef OPENSSL_NO_FP_API
int	BN_print_fp(FILE *fp, const BIGNUM *a);
#endif
#ifdef HEADER_BIO_H
int	BN_print(BIO *fp, const BIGNUM *a);
#else
int	BN_print(void *fp, const BIGNUM *a);
#endif
int	BN_reciprocal(BIGNUM *r, const BIGNUM *m, int len, BN_CTX *ctx);
int	BN_rshift(BIGNUM *r, const BIGNUM *a, int n);
int	BN_rshift1(BIGNUM *r, const BIGNUM *a);
void	BN_clear(BIGNUM *a);
BIGNUM *BN_dup(const BIGNUM *a);
int	BN_ucmp(const BIGNUM *a, const BIGNUM *b);
int	BN_set_bit(BIGNUM *a, int n);
int	BN_clear_bit(BIGNUM *a, int n);
char *	BN_bn2hex(const BIGNUM *a);
char *	BN_bn2dec(const BIGNUM *a);
int 	BN_hex2bn(BIGNUM **a, const char *str);
int 	BN_dec2bn(BIGNUM **a, const char *str);
int	BN_gcd(BIGNUM *r,const BIGNUM *a,const BIGNUM *b,BN_CTX *ctx);
int	BN_kronecker(const BIGNUM *a,const BIGNUM *b,BN_CTX *ctx); /* returns -2 for error */
BIGNUM *BN_mod_inverse(BIGNUM *ret,
	const BIGNUM *a, const BIGNUM *n,BN_CTX *ctx);
BIGNUM *BN_mod_sqrt(BIGNUM *ret,
	const BIGNUM *a, const BIGNUM *n,BN_CTX *ctx);

/* Deprecated versions */
#ifndef OPENSSL_NO_DEPRECATED
BIGNUM *BN_generate_prime(BIGNUM *ret,int bits,int safe,
	const BIGNUM *add, const BIGNUM *rem,
	void (*callback)(int,int,void *),void *cb_arg);
int	BN_is_prime(const BIGNUM *p,int nchecks,
	void (*callback)(int,int,void *),
	BN_CTX *ctx,void *cb_arg);
int	BN_is_prime_fasttest(const BIGNUM *p,int nchecks,
	void (*callback)(int,int,void *),BN_CTX *ctx,void *cb_arg,
	int do_trial_division);
#endif /* !defined(OPENSSL_NO_DEPRECATED) */

/* Newer versions */
int	BN_generate_prime_ex(BIGNUM *ret,int bits,int safe, const BIGNUM *add,
		const BIGNUM *rem, BN_GENCB *cb);
int	BN_is_prime_ex(const BIGNUM *p,int nchecks, BN_CTX *ctx, BN_GENCB *cb);
int	BN_is_prime_fasttest_ex(const BIGNUM *p,int nchecks, BN_CTX *ctx,
		int do_trial_division, BN_GENCB *cb);

int BN_X931_generate_Xpq(BIGNUM *Xp, BIGNUM *Xq, int nbits, BN_CTX *ctx);

int BN_X931_derive_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2,
			const BIGNUM *Xp, const BIGNUM *Xp1, const BIGNUM *Xp2,
			const BIGNUM *e, BN_CTX *ctx, BN_GENCB *cb);
int BN_X931_generate_prime_ex(BIGNUM *p, BIGNUM *p1, BIGNUM *p2,
			BIGNUM *Xp1, BIGNUM *Xp2,
			const BIGNUM *Xp,
			const BIGNUM *e, BN_CTX *ctx,
			BN_GENCB *cb);

BN_MONT_CTX *BN_MONT_CTX_new(void );
void BN_MONT_CTX_init(BN_MONT_CTX *ctx);
int BN_mod_mul_montgomery(BIGNUM *r,const BIGNUM *a,const BIGNUM *b,
	BN_MONT_CTX *mont, BN_CTX *ctx);
#define BN_to_montgomery(r,a,mont,ctx)	BN_mod_mul_montgomery(\
	(r),(a),&((mont)->RR),(mont),(ctx))
int BN_from_montgomery(BIGNUM *r,const BIGNUM *a,
	BN_MONT_CTX *mont, BN_CTX *ctx);
void BN_MONT_CTX_free(BN_MONT_CTX *mont);
int BN_MONT_CTX_set(BN_MONT_CTX *mont,const BIGNUM *mod,BN_CTX *ctx);
BN_MONT_CTX *BN_MONT_CTX_copy(BN_MONT_CTX *to,BN_MONT_CTX *from);
BN_MONT_CTX *BN_MONT_CTX_set_locked(BN_MONT_CTX **pmont, int lock,
					const BIGNUM *mod, BN_CTX *ctx);

/* BN_BLINDING flags */
#define	BN_BLINDING_NO_UPDATE	0x00000001
#define	BN_BLINDING_NO_RECREATE	0x00000002

BN_BLINDING *BN_BLINDING_new(const BIGNUM *A, const BIGNUM *Ai, /* const */ BIGNUM *mod);
void BN_BLINDING_free(BN_BLINDING *b);
int BN_BLINDING_update(BN_BLINDING *b,BN_CTX *ctx);
int BN_BLINDING_convert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx);
int BN_BLINDING_invert(BIGNUM *n, BN_BLINDING *b, BN_CTX *ctx);
int BN_BLINDING_convert_ex(BIGNUM *n, BIGNUM *r, BN_BLINDING *b, BN_CTX *);
int BN_BLINDING_invert_ex(BIGNUM *n, const BIGNUM *r, BN_BLINDING *b, BN_CTX *);
unsigned long BN_BLINDING_get_thread_id(const BN_BLINDING *);
void BN_BLINDING_set_thread_id(BN_BLINDING *, unsigned long);
unsigned long BN_BLINDING_get_flags(const BN_BLINDING *);
void BN_BLINDING_set_flags(BN_BLINDING *, unsigned long);
BN_BLINDING *BN_BLINDING_create_param(BN_BLINDING *b,
	const BIGNUM *e, /* const */ BIGNUM *m, BN_CTX *ctx,
	int (*bn_mod_exp)(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
			  const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx),
	BN_MONT_CTX *m_ctx);

#ifndef OPENSSL_NO_DEPRECATED
void BN_set_params(int mul,int high,int low,int mont);
int BN_get_params(int which); /* 0, mul, 1 high, 2 low, 3 mont */
#endif

void	BN_RECP_CTX_init(BN_RECP_CTX *recp);
BN_RECP_CTX *BN_RECP_CTX_new(void);
void	BN_RECP_CTX_free(BN_RECP_CTX *recp);
int	BN_RECP_CTX_set(BN_RECP_CTX *recp,const BIGNUM *rdiv,BN_CTX *ctx);
int	BN_mod_mul_reciprocal(BIGNUM *r, const BIGNUM *x, const BIGNUM *y,
	BN_RECP_CTX *recp,BN_CTX *ctx);
int	BN_mod_exp_recp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
	const BIGNUM *m, BN_CTX *ctx);
int	BN_div_recp(BIGNUM *dv, BIGNUM *rem, const BIGNUM *m,
	BN_RECP_CTX *recp, BN_CTX *ctx);

/* Functions for arithmetic over binary polynomials represented by BIGNUMs. 
 *
 * The BIGNUM::neg property of BIGNUMs representing binary polynomials is
 * ignored.
 *
 * Note that input arguments are not const so that their bit arrays can
 * be expanded to the appropriate size if needed.
 */

int	BN_GF2m_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b); /*r = a + b*/
#define BN_GF2m_sub(r, a, b) BN_GF2m_add(r, a, b)
int	BN_GF2m_mod(BIGNUM *r, const BIGNUM *a, const BIGNUM *p); /*r=a mod p*/
int	BN_GF2m_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
	const BIGNUM *p, BN_CTX *ctx); /* r = (a * b) mod p */
int	BN_GF2m_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
	BN_CTX *ctx); /* r = (a * a) mod p */
int	BN_GF2m_mod_inv(BIGNUM *r, const BIGNUM *b, const BIGNUM *p,
	BN_CTX *ctx); /* r = (1 / b) mod p */
int	BN_GF2m_mod_div(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
	const BIGNUM *p, BN_CTX *ctx); /* r = (a / b) mod p */
int	BN_GF2m_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
	const BIGNUM *p, BN_CTX *ctx); /* r = (a ^ b) mod p */
int	BN_GF2m_mod_sqrt(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
	BN_CTX *ctx); /* r = sqrt(a) mod p */
int	BN_GF2m_mod_solve_quad(BIGNUM *r, const BIGNUM *a, const BIGNUM *p,
	BN_CTX *ctx); /* r^2 + r = a mod p */
#define BN_GF2m_cmp(a, b) BN_ucmp((a), (b))
/* Some functions allow for representation of the irreducible polynomials
 * as an unsigned int[], say p.  The irreducible f(t) is then of the form:
 *     t^p[0] + t^p[1] + ... + t^p[k]
 * where m = p[0] > p[1] > ... > p[k] = 0.
 */
int	BN_GF2m_mod_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[]);
	/* r = a mod p */
int	BN_GF2m_mod_mul_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
	const unsigned int p[], BN_CTX *ctx); /* r = (a * b) mod p */
int	BN_GF2m_mod_sqr_arr(BIGNUM *r, const BIGNUM *a, const unsigned int p[],
	BN_CTX *ctx); /* r = (a * a) mod p */
int	BN_GF2m_mod_inv_arr(BIGNUM *r, const BIGNUM *b, const unsigned int p[],
	BN_CTX *ctx); /* r = (1 / b) mod p */
int	BN_GF2m_mod_div_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
	const unsigned int p[], BN_CTX *ctx); /* r = (a / b) mod p */
int	BN_GF2m_mod_exp_arr(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
	const unsigned int p[], BN_CTX *ctx); /* r = (a ^ b) mod p */
int	BN_GF2m_mod_sqrt_arr(BIGNUM *r, const BIGNUM *a,
	const unsigned int p[], BN_CTX *ctx); /* r = sqrt(a) mod p */
int	BN_GF2m_mod_solve_quad_arr(BIGNUM *r, const BIGNUM *a,
	const unsigned int p[], BN_CTX *ctx); /* r^2 + r = a mod p */
int	BN_GF2m_poly2arr(const BIGNUM *a, unsigned int p[], int max);
int	BN_GF2m_arr2poly(const unsigned int p[], BIGNUM *a);

/* faster mod functions for the 'NIST primes' 
 * 0 <= a < p^2 */
int BN_nist_mod_192(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
int BN_nist_mod_224(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
int BN_nist_mod_256(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
int BN_nist_mod_384(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
int BN_nist_mod_521(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);

const BIGNUM *BN_get0_nist_prime_192(void);
const BIGNUM *BN_get0_nist_prime_224(void);
const BIGNUM *BN_get0_nist_prime_256(void);
const BIGNUM *BN_get0_nist_prime_384(void);
const BIGNUM *BN_get0_nist_prime_521(void);

/* library internal functions */

#define bn_expand(a,bits) ((((((bits+BN_BITS2-1))/BN_BITS2)) <= (a)->dmax)?\
	(a):bn_expand2((a),(bits+BN_BITS2-1)/BN_BITS2))
#define bn_wexpand(a,words) (((words) <= (a)->dmax)?(a):bn_expand2((a),(words)))
BIGNUM *bn_expand2(BIGNUM *a, int words);
#ifndef OPENSSL_NO_DEPRECATED
BIGNUM *bn_dup_expand(const BIGNUM *a, int words); /* unused */
#endif

/* Bignum consistency macros
 * There is one "API" macro, bn_fix_top(), for stripping leading zeroes from
 * bignum data after direct manipulations on the data. There is also an
 * "internal" macro, bn_check_top(), for verifying that there are no leading
 * zeroes. Unfortunately, some auditing is required due to the fact that
 * bn_fix_top() has become an overabused duct-tape because bignum data is
 * occasionally passed around in an inconsistent state. So the following
 * changes have been made to sort this out;
 * - bn_fix_top()s implementation has been moved to bn_correct_top()
 * - if BN_DEBUG isn't defined, bn_fix_top() maps to bn_correct_top(), and
 *   bn_check_top() is as before.
 * - if BN_DEBUG *is* defined;
 *   - bn_check_top() tries to pollute unused words even if the bignum 'top' is
 *     consistent. (ed: only if BN_DEBUG_RAND is defined)
 *   - bn_fix_top() maps to bn_check_top() rather than "fixing" anything.
 * The idea is to have debug builds flag up inconsistent bignums when they
 * occur. If that occurs in a bn_fix_top(), we examine the code in question; if
 * the use of bn_fix_top() was appropriate (ie. it follows directly after code
 * that manipulates the bignum) it is converted to bn_correct_top(), and if it
 * was not appropriate, we convert it permanently to bn_check_top() and track
 * down the cause of the bug. Eventually, no internal code should be using the
 * bn_fix_top() macro. External applications and libraries should try this with
 * their own code too, both in terms of building against the openssl headers
 * with BN_DEBUG defined *and* linking with a version of OpenSSL built with it
 * defined. This not only improves external code, it provides more test
 * coverage for openssl's own code.
 */

#ifdef BN_DEBUG

/* We only need assert() when debugging */
#include 

#ifdef BN_DEBUG_RAND
/* To avoid "make update" cvs wars due to BN_DEBUG, use some tricks */
#ifndef RAND_pseudo_bytes
int RAND_pseudo_bytes(unsigned char *buf,int num);
#define BN_DEBUG_TRIX
#endif
#define bn_pollute(a) \
	do { \
		const BIGNUM *_bnum1 = (a); \
		if(_bnum1->top < _bnum1->dmax) { \
			unsigned char _tmp_char; \
			/* We cast away const without the compiler knowing, any \
			 * *genuinely* constant variables that aren't mutable \
			 * wouldn't be constructed with top!=dmax. */ \
			BN_ULONG *_not_const; \
			memcpy(&_not_const, &_bnum1->d, sizeof(BN_ULONG*)); \
			RAND_pseudo_bytes(&_tmp_char, 1); \
			memset((unsigned char *)(_not_const + _bnum1->top), _tmp_char, \
				(_bnum1->dmax - _bnum1->top) * sizeof(BN_ULONG)); \
		} \
	} while(0)
#ifdef BN_DEBUG_TRIX
#undef RAND_pseudo_bytes
#endif
#else
#define bn_pollute(a)
#endif
#define bn_check_top(a) \
	do { \
		const BIGNUM *_bnum2 = (a); \
		if (_bnum2 != NULL) { \
			assert((_bnum2->top == 0) || \
				(_bnum2->d[_bnum2->top - 1] != 0)); \
			bn_pollute(_bnum2); \
		} \
	} while(0)

#define bn_fix_top(a)		bn_check_top(a)

#else /* !BN_DEBUG */

#define bn_pollute(a)
#define bn_check_top(a)
#define bn_fix_top(a)		bn_correct_top(a)

#endif

#define bn_correct_top(a) \
        { \
        BN_ULONG *ftl; \
	if ((a)->top > 0) \
		{ \
		for (ftl= &((a)->d[(a)->top-1]); (a)->top > 0; (a)->top--) \
		if (*(ftl--)) break; \
		} \
	bn_pollute(a); \
	}

BN_ULONG bn_mul_add_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w);
BN_ULONG bn_mul_words(BN_ULONG *rp, const BN_ULONG *ap, int num, BN_ULONG w);
void     bn_sqr_words(BN_ULONG *rp, const BN_ULONG *ap, int num);
BN_ULONG bn_div_words(BN_ULONG h, BN_ULONG l, BN_ULONG d);
BN_ULONG bn_add_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,int num);
BN_ULONG bn_sub_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,int num);

/* Primes from RFC 2409 */
BIGNUM *get_rfc2409_prime_768(BIGNUM *bn);
BIGNUM *get_rfc2409_prime_1024(BIGNUM *bn);

/* Primes from RFC 3526 */
BIGNUM *get_rfc3526_prime_1536(BIGNUM *bn);
BIGNUM *get_rfc3526_prime_2048(BIGNUM *bn);
BIGNUM *get_rfc3526_prime_3072(BIGNUM *bn);
BIGNUM *get_rfc3526_prime_4096(BIGNUM *bn);
BIGNUM *get_rfc3526_prime_6144(BIGNUM *bn);
BIGNUM *get_rfc3526_prime_8192(BIGNUM *bn);

int BN_bntest_rand(BIGNUM *rnd, int bits, int top,int bottom);

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_BN_strings(void);

/* Error codes for the BN functions. */

/* Function codes. */
#define BN_F_BNRAND					 127
#define BN_F_BN_BLINDING_CONVERT_EX			 100
#define BN_F_BN_BLINDING_CREATE_PARAM			 128
#define BN_F_BN_BLINDING_INVERT_EX			 101
#define BN_F_BN_BLINDING_NEW				 102
#define BN_F_BN_BLINDING_UPDATE				 103
#define BN_F_BN_BN2DEC					 104
#define BN_F_BN_BN2HEX					 105
#define BN_F_BN_CTX_GET					 116
#define BN_F_BN_CTX_NEW					 106
#define BN_F_BN_CTX_START				 129
#define BN_F_BN_DIV					 107
#define BN_F_BN_DIV_NO_BRANCH				 138
#define BN_F_BN_DIV_RECP				 130
#define BN_F_BN_EXP					 123
#define BN_F_BN_EXPAND2					 108
#define BN_F_BN_EXPAND_INTERNAL				 120
#define BN_F_BN_GF2M_MOD				 131
#define BN_F_BN_GF2M_MOD_EXP				 132
#define BN_F_BN_GF2M_MOD_MUL				 133
#define BN_F_BN_GF2M_MOD_SOLVE_QUAD			 134
#define BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR			 135
#define BN_F_BN_GF2M_MOD_SQR				 136
#define BN_F_BN_GF2M_MOD_SQRT				 137
#define BN_F_BN_MOD_EXP2_MONT				 118
#define BN_F_BN_MOD_EXP_MONT				 109
#define BN_F_BN_MOD_EXP_MONT_CONSTTIME			 124
#define BN_F_BN_MOD_EXP_MONT_WORD			 117
#define BN_F_BN_MOD_EXP_RECP				 125
#define BN_F_BN_MOD_EXP_SIMPLE				 126
#define BN_F_BN_MOD_INVERSE				 110
#define BN_F_BN_MOD_INVERSE_NO_BRANCH			 139
#define BN_F_BN_MOD_LSHIFT_QUICK			 119
#define BN_F_BN_MOD_MUL_RECIPROCAL			 111
#define BN_F_BN_MOD_SQRT				 121
#define BN_F_BN_MPI2BN					 112
#define BN_F_BN_NEW					 113
#define BN_F_BN_RAND					 114
#define BN_F_BN_RAND_RANGE				 122
#define BN_F_BN_USUB					 115

/* Reason codes. */
#define BN_R_ARG2_LT_ARG3				 100
#define BN_R_BAD_RECIPROCAL				 101
#define BN_R_BIGNUM_TOO_LONG				 114
#define BN_R_CALLED_WITH_EVEN_MODULUS			 102
#define BN_R_DIV_BY_ZERO				 103
#define BN_R_ENCODING_ERROR				 104
#define BN_R_EXPAND_ON_STATIC_BIGNUM_DATA		 105
#define BN_R_INPUT_NOT_REDUCED				 110
#define BN_R_INVALID_LENGTH				 106
#define BN_R_INVALID_RANGE				 115
#define BN_R_NOT_A_SQUARE				 111
#define BN_R_NOT_INITIALIZED				 107
#define BN_R_NO_INVERSE					 108
#define BN_R_NO_SOLUTION				 116
#define BN_R_P_IS_NOT_PRIME				 112
#define BN_R_TOO_MANY_ITERATIONS			 113
#define BN_R_TOO_MANY_TEMPORARY_VARIABLES		 109

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/txt_db.h0000755000175000017500000001031411341640430020254 0ustar  davidedavide/* crypto/txt_db/txt_db.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_TXT_DB_H
#define HEADER_TXT_DB_H

#include 
#ifndef OPENSSL_NO_BIO
#include 
#endif
#include 
#include 

#define DB_ERROR_OK			0
#define DB_ERROR_MALLOC			1
#define DB_ERROR_INDEX_CLASH    	2
#define DB_ERROR_INDEX_OUT_OF_RANGE	3
#define DB_ERROR_NO_INDEX		4
#define DB_ERROR_INSERT_INDEX_CLASH    	5

#ifdef  __cplusplus
extern "C" {
#endif

typedef struct txt_db_st
	{
	int num_fields;
	STACK /* char ** */ *data;
	LHASH **index;
	int (**qual)(char **);
	long error;
	long arg1;
	long arg2;
	char **arg_row;
	} TXT_DB;

#ifndef OPENSSL_NO_BIO
TXT_DB *TXT_DB_read(BIO *in, int num);
long TXT_DB_write(BIO *out, TXT_DB *db);
#else
TXT_DB *TXT_DB_read(char *in, int num);
long TXT_DB_write(char *out, TXT_DB *db);
#endif
int TXT_DB_create_index(TXT_DB *db,int field,int (*qual)(char **),
		LHASH_HASH_FN_TYPE hash, LHASH_COMP_FN_TYPE cmp);
void TXT_DB_free(TXT_DB *db);
char **TXT_DB_get_by_index(TXT_DB *db, int idx, char **value);
int TXT_DB_insert(TXT_DB *db,char **value);

#ifdef  __cplusplus
}
#endif

#endif
xmail-1.27/win32ssl/include/openssl/dtls1.h0000755000175000017500000001426311341640430020026 0ustar  davidedavide/* ssl/dtls1.h */
/* 
 * DTLS implementation written by Nagendra Modadugu
 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.  
 */
/* ====================================================================
 * Copyright (c) 1999-2005 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

#ifndef HEADER_DTLS1_H 
#define HEADER_DTLS1_H 

#include 
#include 

#ifdef  __cplusplus
extern "C" {
#endif

#define DTLS1_VERSION			0xFEFF
#define DTLS1_BAD_VER			0x0100

#if 0
/* this alert description is not specified anywhere... */
#define DTLS1_AD_MISSING_HANDSHAKE_MESSAGE    110
#endif

/* lengths of messages */
#define DTLS1_COOKIE_LENGTH                     32

#define DTLS1_RT_HEADER_LENGTH                  13

#define DTLS1_HM_HEADER_LENGTH                  12

#define DTLS1_HM_BAD_FRAGMENT                   -2
#define DTLS1_HM_FRAGMENT_RETRY                 -3

#define DTLS1_CCS_HEADER_LENGTH                  1

#ifdef DTLS1_AD_MISSING_HANDSHAKE_MESSAGE
#define DTLS1_AL_HEADER_LENGTH                   7
#else
#define DTLS1_AL_HEADER_LENGTH                   2
#endif


typedef struct dtls1_bitmap_st
	{
	PQ_64BIT map;
	unsigned long length;     /* sizeof the bitmap in bits */
	PQ_64BIT max_seq_num;  /* max record number seen so far */
	} DTLS1_BITMAP;

struct hm_header_st
	{
	unsigned char type;
	unsigned long msg_len;
	unsigned short seq;
	unsigned long frag_off;
	unsigned long frag_len;
	unsigned int is_ccs;
	};

struct ccs_header_st
	{
	unsigned char type;
	unsigned short seq;
	};

struct dtls1_timeout_st
	{
	/* Number of read timeouts so far */
	unsigned int read_timeouts;
	
	/* Number of write timeouts so far */
	unsigned int write_timeouts;
	
	/* Number of alerts received so far */
	unsigned int num_alerts;
	};

typedef struct record_pqueue_st
	{
	unsigned short epoch;
	pqueue q;
	} record_pqueue;

typedef struct hm_fragment_st
	{
	struct hm_header_st msg_header;
	unsigned char *fragment;
	} hm_fragment;

typedef struct dtls1_state_st
	{
	unsigned int send_cookie;
	unsigned char cookie[DTLS1_COOKIE_LENGTH];
	unsigned char rcvd_cookie[DTLS1_COOKIE_LENGTH];
	unsigned int cookie_len;

	/* 
	 * The current data and handshake epoch.  This is initially
	 * undefined, and starts at zero once the initial handshake is
	 * completed 
	 */
	unsigned short r_epoch;
	unsigned short w_epoch;

	/* records being received in the current epoch */
	DTLS1_BITMAP bitmap;

	/* renegotiation starts a new set of sequence numbers */
	DTLS1_BITMAP next_bitmap;

	/* handshake message numbers */
	unsigned short handshake_write_seq;
	unsigned short next_handshake_write_seq;

	unsigned short handshake_read_seq;

	/* Received handshake records (processed and unprocessed) */
	record_pqueue unprocessed_rcds;
	record_pqueue processed_rcds;

	/* Buffered handshake messages */
	pqueue buffered_messages;

	/* Buffered (sent) handshake records */
	pqueue sent_messages;

	unsigned int mtu; /* max wire packet size */

	struct hm_header_st w_msg_hdr;
	struct hm_header_st r_msg_hdr;

	struct dtls1_timeout_st timeout;
	
	/* storage for Alert/Handshake protocol data received but not
	 * yet processed by ssl3_read_bytes: */
	unsigned char alert_fragment[DTLS1_AL_HEADER_LENGTH];
	unsigned int alert_fragment_len;
	unsigned char handshake_fragment[DTLS1_HM_HEADER_LENGTH];
	unsigned int handshake_fragment_len;

	unsigned int retransmitting;

	} DTLS1_STATE;

typedef struct dtls1_record_data_st
	{
	unsigned char *packet;
	unsigned int   packet_length;
	SSL3_BUFFER    rbuf;
	SSL3_RECORD    rrec;
	} DTLS1_RECORD_DATA;


/* Timeout multipliers (timeout slice is defined in apps/timeouts.h */
#define DTLS1_TMO_READ_COUNT                      2
#define DTLS1_TMO_WRITE_COUNT                     2

#define DTLS1_TMO_ALERT_COUNT                     12

#ifdef  __cplusplus
}
#endif
#endif

xmail-1.27/win32ssl/include/openssl/store.h0000755000175000017500000006356111341640430020140 0ustar  davidedavide/* crypto/store/store.h -*- mode:C; c-file-style: "eay" -*- */
/* Written by Richard Levitte (richard@levitte.org) for the OpenSSL
 * project 2003.
 */
/* ====================================================================
 * Copyright (c) 2003 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

#ifndef HEADER_STORE_H
#define HEADER_STORE_H

#include 
#ifndef OPENSSL_NO_DEPRECATED
#include 
#include 
#include 
#endif

#ifdef  __cplusplus
extern "C" {
#endif

/* Already defined in ossl_typ.h */
/* typedef struct store_st STORE; */
/* typedef struct store_method_st STORE_METHOD; */


/* All the following functions return 0, a negative number or NULL on error.
   When everything is fine, they return a positive value or a non-NULL
   pointer, all depending on their purpose. */

/* Creators and destructor.   */
STORE *STORE_new_method(const STORE_METHOD *method);
STORE *STORE_new_engine(ENGINE *engine);
void STORE_free(STORE *ui);


/* Give a user interface parametrised control commands.  This can be used to
   send down an integer, a data pointer or a function pointer, as well as
   be used to get information from a STORE. */
int STORE_ctrl(STORE *store, int cmd, long i, void *p, void (*f)(void));

/* A control to set the directory with keys and certificates.  Used by the
   built-in directory level method. */
#define STORE_CTRL_SET_DIRECTORY	0x0001
/* A control to set a file to load.  Used by the built-in file level method. */
#define STORE_CTRL_SET_FILE		0x0002
/* A control to set a configuration file to load.  Can be used by any method
   that wishes to load a configuration file. */
#define STORE_CTRL_SET_CONF_FILE	0x0003
/* A control to set a the section of the loaded configuration file.  Can be
   used by any method that wishes to load a configuration file. */
#define STORE_CTRL_SET_CONF_SECTION	0x0004


/* Some methods may use extra data */
#define STORE_set_app_data(s,arg)	STORE_set_ex_data(s,0,arg)
#define STORE_get_app_data(s)		STORE_get_ex_data(s,0)
int STORE_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
	CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
int STORE_set_ex_data(STORE *r,int idx,void *arg);
void *STORE_get_ex_data(STORE *r, int idx);

/* Use specific methods instead of the built-in one */
const STORE_METHOD *STORE_get_method(STORE *store);
const STORE_METHOD *STORE_set_method(STORE *store, const STORE_METHOD *meth);

/* The standard OpenSSL methods. */
/* This is the in-memory method.  It does everything except revoking and updating,
   and is of course volatile.  It's used by other methods that have an in-memory
   cache. */
const STORE_METHOD *STORE_Memory(void);
#if 0 /* Not yet implemented */
/* This is the directory store.  It does everything except revoking and updating,
   and uses STORE_Memory() to cache things in memory. */
const STORE_METHOD *STORE_Directory(void);
/* This is the file store.  It does everything except revoking and updating,
   and uses STORE_Memory() to cache things in memory.  Certificates are added
   to it with the store operation, and it will only get cached certificates. */
const STORE_METHOD *STORE_File(void);
#endif

/* Store functions take a type code for the type of data they should store
   or fetch */
typedef enum STORE_object_types
	{
	STORE_OBJECT_TYPE_X509_CERTIFICATE=	0x01, /* X509 * */
	STORE_OBJECT_TYPE_X509_CRL=		0x02, /* X509_CRL * */
	STORE_OBJECT_TYPE_PRIVATE_KEY=		0x03, /* EVP_PKEY * */
	STORE_OBJECT_TYPE_PUBLIC_KEY=		0x04, /* EVP_PKEY * */
	STORE_OBJECT_TYPE_NUMBER=		0x05, /* BIGNUM * */
	STORE_OBJECT_TYPE_ARBITRARY=		0x06, /* BUF_MEM * */
	STORE_OBJECT_TYPE_NUM=			0x06  /* The amount of known
							 object types */
	} STORE_OBJECT_TYPES;
/* List of text strings corresponding to the object types. */
extern const char * const STORE_object_type_string[STORE_OBJECT_TYPE_NUM+1];

/* Some store functions take a parameter list.  Those parameters come with
   one of the following codes. The comments following the codes below indicate
   what type the value should be a pointer to. */
typedef enum STORE_params
	{
	STORE_PARAM_EVP_TYPE=			0x01, /* int */
	STORE_PARAM_BITS=			0x02, /* size_t */
	STORE_PARAM_KEY_PARAMETERS=		0x03, /* ??? */
	STORE_PARAM_KEY_NO_PARAMETERS=		0x04, /* N/A */
	STORE_PARAM_AUTH_PASSPHRASE=		0x05, /* char * */
	STORE_PARAM_AUTH_KRB5_TICKET=		0x06, /* void * */
	STORE_PARAM_TYPE_NUM=			0x06  /* The amount of known
							 parameter types */
	} STORE_PARAM_TYPES;
/* Parameter value sizes.  -1 means unknown, anything else is the required size. */
extern const int STORE_param_sizes[STORE_PARAM_TYPE_NUM+1];

/* Store functions take attribute lists.  Those attributes come with codes.
   The comments following the codes below indicate what type the value should
   be a pointer to. */
typedef enum STORE_attribs
	{
	STORE_ATTR_END=				0x00,
	STORE_ATTR_FRIENDLYNAME=		0x01, /* C string */
	STORE_ATTR_KEYID=			0x02, /* 160 bit string (SHA1) */
	STORE_ATTR_ISSUERKEYID=			0x03, /* 160 bit string (SHA1) */
	STORE_ATTR_SUBJECTKEYID=		0x04, /* 160 bit string (SHA1) */
	STORE_ATTR_ISSUERSERIALHASH=		0x05, /* 160 bit string (SHA1) */
	STORE_ATTR_ISSUER=			0x06, /* X509_NAME * */
	STORE_ATTR_SERIAL=			0x07, /* BIGNUM * */
	STORE_ATTR_SUBJECT=			0x08, /* X509_NAME * */
	STORE_ATTR_CERTHASH=			0x09, /* 160 bit string (SHA1) */
	STORE_ATTR_EMAIL=			0x0a, /* C string */
	STORE_ATTR_FILENAME=			0x0b, /* C string */
	STORE_ATTR_TYPE_NUM=			0x0b, /* The amount of known
							 attribute types */
	STORE_ATTR_OR=				0xff  /* This is a special
							 separator, which
							 expresses the OR
							 operation.  */
	} STORE_ATTR_TYPES;
/* Attribute value sizes.  -1 means unknown, anything else is the required size. */
extern const int STORE_attr_sizes[STORE_ATTR_TYPE_NUM+1];

typedef enum STORE_certificate_status
	{
	STORE_X509_VALID=			0x00,
	STORE_X509_EXPIRED=			0x01,
	STORE_X509_SUSPENDED=			0x02,
	STORE_X509_REVOKED=			0x03
	} STORE_CERTIFICATE_STATUS;

/* Engine store functions will return a structure that contains all the necessary
 * information, including revokation status for certificates.  This is really not
 * needed for application authors, as the ENGINE framework functions will extract
 * the OpenSSL-specific information when at all possible.  However, for engine
 * authors, it's crucial to know this structure.  */
typedef struct STORE_OBJECT_st
	{
	STORE_OBJECT_TYPES type;
	union
		{
		struct
			{
			STORE_CERTIFICATE_STATUS status;
			X509 *certificate;
			} x509;
		X509_CRL *crl;
		EVP_PKEY *key;
		BIGNUM *number;
		BUF_MEM *arbitrary;
		} data;
	} STORE_OBJECT;
DECLARE_STACK_OF(STORE_OBJECT)
STORE_OBJECT *STORE_OBJECT_new(void);
void STORE_OBJECT_free(STORE_OBJECT *data);



/* The following functions handle the storage. They return 0, a negative number
   or NULL on error, anything else on success. */
X509 *STORE_get_certificate(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
int STORE_store_certificate(STORE *e, X509 *data, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
int STORE_modify_certificate(STORE *e, OPENSSL_ITEM search_attributes[],
	OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[],
	OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]);
int STORE_revoke_certificate(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
int STORE_delete_certificate(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
void *STORE_list_certificate_start(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
X509 *STORE_list_certificate_next(STORE *e, void *handle);
int STORE_list_certificate_end(STORE *e, void *handle);
int STORE_list_certificate_endp(STORE *e, void *handle);
EVP_PKEY *STORE_generate_key(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
EVP_PKEY *STORE_get_private_key(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
int STORE_store_private_key(STORE *e, EVP_PKEY *data,
	OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]);
int STORE_modify_private_key(STORE *e, OPENSSL_ITEM search_attributes[],
	OPENSSL_ITEM add_sttributes[], OPENSSL_ITEM modify_attributes[],
	OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]);
int STORE_revoke_private_key(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
int STORE_delete_private_key(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
void *STORE_list_private_key_start(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
EVP_PKEY *STORE_list_private_key_next(STORE *e, void *handle);
int STORE_list_private_key_end(STORE *e, void *handle);
int STORE_list_private_key_endp(STORE *e, void *handle);
EVP_PKEY *STORE_get_public_key(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
int STORE_store_public_key(STORE *e, EVP_PKEY *data, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
int STORE_modify_public_key(STORE *e, OPENSSL_ITEM search_attributes[],
	OPENSSL_ITEM add_sttributes[], OPENSSL_ITEM modify_attributes[],
	OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]);
int STORE_revoke_public_key(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
int STORE_delete_public_key(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
void *STORE_list_public_key_start(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
EVP_PKEY *STORE_list_public_key_next(STORE *e, void *handle);
int STORE_list_public_key_end(STORE *e, void *handle);
int STORE_list_public_key_endp(STORE *e, void *handle);
X509_CRL *STORE_generate_crl(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
X509_CRL *STORE_get_crl(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
int STORE_store_crl(STORE *e, X509_CRL *data, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
int STORE_modify_crl(STORE *e, OPENSSL_ITEM search_attributes[],
	OPENSSL_ITEM add_sttributes[], OPENSSL_ITEM modify_attributes[],
	OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]);
int STORE_delete_crl(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
void *STORE_list_crl_start(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
X509_CRL *STORE_list_crl_next(STORE *e, void *handle);
int STORE_list_crl_end(STORE *e, void *handle);
int STORE_list_crl_endp(STORE *e, void *handle);
int STORE_store_number(STORE *e, BIGNUM *data, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
int STORE_modify_number(STORE *e, OPENSSL_ITEM search_attributes[],
	OPENSSL_ITEM add_sttributes[], OPENSSL_ITEM modify_attributes[],
	OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]);
BIGNUM *STORE_get_number(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
int STORE_delete_number(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
int STORE_store_arbitrary(STORE *e, BUF_MEM *data, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
int STORE_modify_arbitrary(STORE *e, OPENSSL_ITEM search_attributes[],
	OPENSSL_ITEM add_sttributes[], OPENSSL_ITEM modify_attributes[],
	OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]);
BUF_MEM *STORE_get_arbitrary(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);
int STORE_delete_arbitrary(STORE *e, OPENSSL_ITEM attributes[],
	OPENSSL_ITEM parameters[]);


/* Create and manipulate methods */
STORE_METHOD *STORE_create_method(char *name);
void STORE_destroy_method(STORE_METHOD *store_method);

/* These callback types are use for store handlers */
typedef int (*STORE_INITIALISE_FUNC_PTR)(STORE *);
typedef void (*STORE_CLEANUP_FUNC_PTR)(STORE *);
typedef STORE_OBJECT *(*STORE_GENERATE_OBJECT_FUNC_PTR)(STORE *, STORE_OBJECT_TYPES type, OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]);
typedef STORE_OBJECT *(*STORE_GET_OBJECT_FUNC_PTR)(STORE *, STORE_OBJECT_TYPES type, OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]);
typedef void *(*STORE_START_OBJECT_FUNC_PTR)(STORE *, STORE_OBJECT_TYPES type, OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]);
typedef STORE_OBJECT *(*STORE_NEXT_OBJECT_FUNC_PTR)(STORE *, void *handle);
typedef int (*STORE_END_OBJECT_FUNC_PTR)(STORE *, void *handle);
typedef int (*STORE_HANDLE_OBJECT_FUNC_PTR)(STORE *, STORE_OBJECT_TYPES type, OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]);
typedef int (*STORE_STORE_OBJECT_FUNC_PTR)(STORE *, STORE_OBJECT_TYPES type, STORE_OBJECT *data, OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]);
typedef int (*STORE_MODIFY_OBJECT_FUNC_PTR)(STORE *, STORE_OBJECT_TYPES type, OPENSSL_ITEM search_attributes[], OPENSSL_ITEM add_attributes[], OPENSSL_ITEM modify_attributes[], OPENSSL_ITEM delete_attributes[], OPENSSL_ITEM parameters[]);
typedef int (*STORE_GENERIC_FUNC_PTR)(STORE *, OPENSSL_ITEM attributes[], OPENSSL_ITEM parameters[]);
typedef int (*STORE_CTRL_FUNC_PTR)(STORE *, int cmd, long l, void *p, void (*f)(void));

int STORE_method_set_initialise_function(STORE_METHOD *sm, STORE_INITIALISE_FUNC_PTR init_f);
int STORE_method_set_cleanup_function(STORE_METHOD *sm, STORE_CLEANUP_FUNC_PTR clean_f);
int STORE_method_set_generate_function(STORE_METHOD *sm, STORE_GENERATE_OBJECT_FUNC_PTR generate_f);
int STORE_method_set_get_function(STORE_METHOD *sm, STORE_GET_OBJECT_FUNC_PTR get_f);
int STORE_method_set_store_function(STORE_METHOD *sm, STORE_STORE_OBJECT_FUNC_PTR store_f);
int STORE_method_set_modify_function(STORE_METHOD *sm, STORE_MODIFY_OBJECT_FUNC_PTR store_f);
int STORE_method_set_revoke_function(STORE_METHOD *sm, STORE_HANDLE_OBJECT_FUNC_PTR revoke_f);
int STORE_method_set_delete_function(STORE_METHOD *sm, STORE_HANDLE_OBJECT_FUNC_PTR delete_f);
int STORE_method_set_list_start_function(STORE_METHOD *sm, STORE_START_OBJECT_FUNC_PTR list_start_f);
int STORE_method_set_list_next_function(STORE_METHOD *sm, STORE_NEXT_OBJECT_FUNC_PTR list_next_f);
int STORE_method_set_list_end_function(STORE_METHOD *sm, STORE_END_OBJECT_FUNC_PTR list_end_f);
int STORE_method_set_update_store_function(STORE_METHOD *sm, STORE_GENERIC_FUNC_PTR);
int STORE_method_set_lock_store_function(STORE_METHOD *sm, STORE_GENERIC_FUNC_PTR);
int STORE_method_set_unlock_store_function(STORE_METHOD *sm, STORE_GENERIC_FUNC_PTR);
int STORE_method_set_ctrl_function(STORE_METHOD *sm, STORE_CTRL_FUNC_PTR ctrl_f);

STORE_INITIALISE_FUNC_PTR STORE_method_get_initialise_function(STORE_METHOD *sm);
STORE_CLEANUP_FUNC_PTR STORE_method_get_cleanup_function(STORE_METHOD *sm);
STORE_GENERATE_OBJECT_FUNC_PTR STORE_method_get_generate_function(STORE_METHOD *sm);
STORE_GET_OBJECT_FUNC_PTR STORE_method_get_get_function(STORE_METHOD *sm);
STORE_STORE_OBJECT_FUNC_PTR STORE_method_get_store_function(STORE_METHOD *sm);
STORE_MODIFY_OBJECT_FUNC_PTR STORE_method_get_modify_function(STORE_METHOD *sm);
STORE_HANDLE_OBJECT_FUNC_PTR STORE_method_get_revoke_function(STORE_METHOD *sm);
STORE_HANDLE_OBJECT_FUNC_PTR STORE_method_get_delete_function(STORE_METHOD *sm);
STORE_START_OBJECT_FUNC_PTR STORE_method_get_list_start_function(STORE_METHOD *sm);
STORE_NEXT_OBJECT_FUNC_PTR STORE_method_get_list_next_function(STORE_METHOD *sm);
STORE_END_OBJECT_FUNC_PTR STORE_method_get_list_end_function(STORE_METHOD *sm);
STORE_GENERIC_FUNC_PTR STORE_method_get_update_store_function(STORE_METHOD *sm);
STORE_GENERIC_FUNC_PTR STORE_method_get_lock_store_function(STORE_METHOD *sm);
STORE_GENERIC_FUNC_PTR STORE_method_get_unlock_store_function(STORE_METHOD *sm);
STORE_CTRL_FUNC_PTR STORE_method_get_ctrl_function(STORE_METHOD *sm);

/* Method helper structures and functions. */

/* This structure is the result of parsing through the information in a list
   of OPENSSL_ITEMs.  It stores all the necessary information in a structured
   way.*/
typedef struct STORE_attr_info_st STORE_ATTR_INFO;

/* Parse a list of OPENSSL_ITEMs and return a pointer to a STORE_ATTR_INFO.
   Note that we do this in the list form, since the list of OPENSSL_ITEMs can
   come in blocks separated with STORE_ATTR_OR.  Note that the value returned
   by STORE_parse_attrs_next() must be freed with STORE_ATTR_INFO_free(). */
void *STORE_parse_attrs_start(OPENSSL_ITEM *attributes);
STORE_ATTR_INFO *STORE_parse_attrs_next(void *handle);
int STORE_parse_attrs_end(void *handle);
int STORE_parse_attrs_endp(void *handle);

/* Creator and destructor */
STORE_ATTR_INFO *STORE_ATTR_INFO_new(void);
int STORE_ATTR_INFO_free(STORE_ATTR_INFO *attrs);

/* Manipulators */
char *STORE_ATTR_INFO_get0_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code);
unsigned char *STORE_ATTR_INFO_get0_sha1str(STORE_ATTR_INFO *attrs,
	STORE_ATTR_TYPES code);
X509_NAME *STORE_ATTR_INFO_get0_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code);
BIGNUM *STORE_ATTR_INFO_get0_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code);
int STORE_ATTR_INFO_set_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
	char *cstr, size_t cstr_size);
int STORE_ATTR_INFO_set_sha1str(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
	unsigned char *sha1str, size_t sha1str_size);
int STORE_ATTR_INFO_set_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
	X509_NAME *dn);
int STORE_ATTR_INFO_set_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
	BIGNUM *number);
int STORE_ATTR_INFO_modify_cstr(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
	char *cstr, size_t cstr_size);
int STORE_ATTR_INFO_modify_sha1str(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
	unsigned char *sha1str, size_t sha1str_size);
int STORE_ATTR_INFO_modify_dn(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
	X509_NAME *dn);
int STORE_ATTR_INFO_modify_number(STORE_ATTR_INFO *attrs, STORE_ATTR_TYPES code,
	BIGNUM *number);

/* Compare on basis of a bit pattern formed by the STORE_ATTR_TYPES values
   in each contained attribute. */
int STORE_ATTR_INFO_compare(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b);
/* Check if the set of attributes in a is within the range of attributes
   set in b. */
int STORE_ATTR_INFO_in_range(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b);
/* Check if the set of attributes in a are also set in b. */
int STORE_ATTR_INFO_in(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b);
/* Same as STORE_ATTR_INFO_in(), but also checks the attribute values. */
int STORE_ATTR_INFO_in_ex(STORE_ATTR_INFO *a, STORE_ATTR_INFO *b);


/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_STORE_strings(void);

/* Error codes for the STORE functions. */

/* Function codes. */
#define STORE_F_MEM_DELETE				 134
#define STORE_F_MEM_GENERATE				 135
#define STORE_F_MEM_LIST_END				 168
#define STORE_F_MEM_LIST_NEXT				 136
#define STORE_F_MEM_LIST_START				 137
#define STORE_F_MEM_MODIFY				 169
#define STORE_F_MEM_STORE				 138
#define STORE_F_STORE_ATTR_INFO_GET0_CSTR		 139
#define STORE_F_STORE_ATTR_INFO_GET0_DN			 140
#define STORE_F_STORE_ATTR_INFO_GET0_NUMBER		 141
#define STORE_F_STORE_ATTR_INFO_GET0_SHA1STR		 142
#define STORE_F_STORE_ATTR_INFO_MODIFY_CSTR		 143
#define STORE_F_STORE_ATTR_INFO_MODIFY_DN		 144
#define STORE_F_STORE_ATTR_INFO_MODIFY_NUMBER		 145
#define STORE_F_STORE_ATTR_INFO_MODIFY_SHA1STR		 146
#define STORE_F_STORE_ATTR_INFO_SET_CSTR		 147
#define STORE_F_STORE_ATTR_INFO_SET_DN			 148
#define STORE_F_STORE_ATTR_INFO_SET_NUMBER		 149
#define STORE_F_STORE_ATTR_INFO_SET_SHA1STR		 150
#define STORE_F_STORE_CERTIFICATE			 170
#define STORE_F_STORE_CTRL				 161
#define STORE_F_STORE_DELETE_ARBITRARY			 158
#define STORE_F_STORE_DELETE_CERTIFICATE		 102
#define STORE_F_STORE_DELETE_CRL			 103
#define STORE_F_STORE_DELETE_NUMBER			 104
#define STORE_F_STORE_DELETE_PRIVATE_KEY		 105
#define STORE_F_STORE_DELETE_PUBLIC_KEY			 106
#define STORE_F_STORE_GENERATE_CRL			 107
#define STORE_F_STORE_GENERATE_KEY			 108
#define STORE_F_STORE_GET_ARBITRARY			 159
#define STORE_F_STORE_GET_CERTIFICATE			 109
#define STORE_F_STORE_GET_CRL				 110
#define STORE_F_STORE_GET_NUMBER			 111
#define STORE_F_STORE_GET_PRIVATE_KEY			 112
#define STORE_F_STORE_GET_PUBLIC_KEY			 113
#define STORE_F_STORE_LIST_CERTIFICATE_END		 114
#define STORE_F_STORE_LIST_CERTIFICATE_ENDP		 153
#define STORE_F_STORE_LIST_CERTIFICATE_NEXT		 115
#define STORE_F_STORE_LIST_CERTIFICATE_START		 116
#define STORE_F_STORE_LIST_CRL_END			 117
#define STORE_F_STORE_LIST_CRL_ENDP			 154
#define STORE_F_STORE_LIST_CRL_NEXT			 118
#define STORE_F_STORE_LIST_CRL_START			 119
#define STORE_F_STORE_LIST_PRIVATE_KEY_END		 120
#define STORE_F_STORE_LIST_PRIVATE_KEY_ENDP		 155
#define STORE_F_STORE_LIST_PRIVATE_KEY_NEXT		 121
#define STORE_F_STORE_LIST_PRIVATE_KEY_START		 122
#define STORE_F_STORE_LIST_PUBLIC_KEY_END		 123
#define STORE_F_STORE_LIST_PUBLIC_KEY_ENDP		 156
#define STORE_F_STORE_LIST_PUBLIC_KEY_NEXT		 124
#define STORE_F_STORE_LIST_PUBLIC_KEY_START		 125
#define STORE_F_STORE_MODIFY_ARBITRARY			 162
#define STORE_F_STORE_MODIFY_CERTIFICATE		 163
#define STORE_F_STORE_MODIFY_CRL			 164
#define STORE_F_STORE_MODIFY_NUMBER			 165
#define STORE_F_STORE_MODIFY_PRIVATE_KEY		 166
#define STORE_F_STORE_MODIFY_PUBLIC_KEY			 167
#define STORE_F_STORE_NEW_ENGINE			 133
#define STORE_F_STORE_NEW_METHOD			 132
#define STORE_F_STORE_PARSE_ATTRS_END			 151
#define STORE_F_STORE_PARSE_ATTRS_ENDP			 172
#define STORE_F_STORE_PARSE_ATTRS_NEXT			 152
#define STORE_F_STORE_PARSE_ATTRS_START			 171
#define STORE_F_STORE_REVOKE_CERTIFICATE		 129
#define STORE_F_STORE_REVOKE_PRIVATE_KEY		 130
#define STORE_F_STORE_REVOKE_PUBLIC_KEY			 131
#define STORE_F_STORE_STORE_ARBITRARY			 157
#define STORE_F_STORE_STORE_CERTIFICATE			 100
#define STORE_F_STORE_STORE_CRL				 101
#define STORE_F_STORE_STORE_NUMBER			 126
#define STORE_F_STORE_STORE_PRIVATE_KEY			 127
#define STORE_F_STORE_STORE_PUBLIC_KEY			 128

/* Reason codes. */
#define STORE_R_ALREADY_HAS_A_VALUE			 127
#define STORE_R_FAILED_DELETING_ARBITRARY		 132
#define STORE_R_FAILED_DELETING_CERTIFICATE		 100
#define STORE_R_FAILED_DELETING_KEY			 101
#define STORE_R_FAILED_DELETING_NUMBER			 102
#define STORE_R_FAILED_GENERATING_CRL			 103
#define STORE_R_FAILED_GENERATING_KEY			 104
#define STORE_R_FAILED_GETTING_ARBITRARY		 133
#define STORE_R_FAILED_GETTING_CERTIFICATE		 105
#define STORE_R_FAILED_GETTING_KEY			 106
#define STORE_R_FAILED_GETTING_NUMBER			 107
#define STORE_R_FAILED_LISTING_CERTIFICATES		 108
#define STORE_R_FAILED_LISTING_KEYS			 109
#define STORE_R_FAILED_MODIFYING_ARBITRARY		 138
#define STORE_R_FAILED_MODIFYING_CERTIFICATE		 139
#define STORE_R_FAILED_MODIFYING_CRL			 140
#define STORE_R_FAILED_MODIFYING_NUMBER			 141
#define STORE_R_FAILED_MODIFYING_PRIVATE_KEY		 142
#define STORE_R_FAILED_MODIFYING_PUBLIC_KEY		 143
#define STORE_R_FAILED_REVOKING_CERTIFICATE		 110
#define STORE_R_FAILED_REVOKING_KEY			 111
#define STORE_R_FAILED_STORING_ARBITRARY		 134
#define STORE_R_FAILED_STORING_CERTIFICATE		 112
#define STORE_R_FAILED_STORING_KEY			 113
#define STORE_R_FAILED_STORING_NUMBER			 114
#define STORE_R_NOT_IMPLEMENTED				 128
#define STORE_R_NO_CONTROL_FUNCTION			 144
#define STORE_R_NO_DELETE_ARBITRARY_FUNCTION		 135
#define STORE_R_NO_DELETE_NUMBER_FUNCTION		 115
#define STORE_R_NO_DELETE_OBJECT_FUNCTION		 116
#define STORE_R_NO_GENERATE_CRL_FUNCTION		 117
#define STORE_R_NO_GENERATE_OBJECT_FUNCTION		 118
#define STORE_R_NO_GET_OBJECT_ARBITRARY_FUNCTION	 136
#define STORE_R_NO_GET_OBJECT_FUNCTION			 119
#define STORE_R_NO_GET_OBJECT_NUMBER_FUNCTION		 120
#define STORE_R_NO_LIST_OBJECT_ENDP_FUNCTION		 131
#define STORE_R_NO_LIST_OBJECT_END_FUNCTION		 121
#define STORE_R_NO_LIST_OBJECT_NEXT_FUNCTION		 122
#define STORE_R_NO_LIST_OBJECT_START_FUNCTION		 123
#define STORE_R_NO_MODIFY_OBJECT_FUNCTION		 145
#define STORE_R_NO_REVOKE_OBJECT_FUNCTION		 124
#define STORE_R_NO_STORE				 129
#define STORE_R_NO_STORE_OBJECT_ARBITRARY_FUNCTION	 137
#define STORE_R_NO_STORE_OBJECT_FUNCTION		 125
#define STORE_R_NO_STORE_OBJECT_NUMBER_FUNCTION		 126
#define STORE_R_NO_VALUE				 130

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/opensslv.h0000755000175000017500000000724511341640430020652 0ustar  davidedavide#ifndef HEADER_OPENSSLV_H
#define HEADER_OPENSSLV_H

/* Numeric release version identifier:
 * MNNFFPPS: major minor fix patch status
 * The status nibble has one of the values 0 for development, 1 to e for betas
 * 1 to 14, and f for release.  The patch level is exactly that.
 * For example:
 * 0.9.3-dev	  0x00903000
 * 0.9.3-beta1	  0x00903001
 * 0.9.3-beta2-dev 0x00903002
 * 0.9.3-beta2    0x00903002 (same as ...beta2-dev)
 * 0.9.3	  0x0090300f
 * 0.9.3a	  0x0090301f
 * 0.9.4	  0x0090400f
 * 1.2.3z	  0x102031af
 *
 * For continuity reasons (because 0.9.5 is already out, and is coded
 * 0x00905100), between 0.9.5 and 0.9.6 the coding of the patch level
 * part is slightly different, by setting the highest bit.  This means
 * that 0.9.5a looks like this: 0x0090581f.  At 0.9.6, we can start
 * with 0x0090600S...
 *
 * (Prior to 0.9.3-dev a different scheme was used: 0.9.2b is 0x0922.)
 * (Prior to 0.9.5a beta1, a different scheme was used: MMNNFFRBB for
 *  major minor fix final patch/beta)
 */
#define OPENSSL_VERSION_NUMBER	0x009080cfL
#ifdef OPENSSL_FIPS
#define OPENSSL_VERSION_TEXT	"OpenSSL 0.9.8l-fips 5 Nov 2009"
#else
#define OPENSSL_VERSION_TEXT	"OpenSSL 0.9.8l 5 Nov 2009"
#endif
#define OPENSSL_VERSION_PTEXT	" part of " OPENSSL_VERSION_TEXT


/* The macros below are to be used for shared library (.so, .dll, ...)
 * versioning.  That kind of versioning works a bit differently between
 * operating systems.  The most usual scheme is to set a major and a minor
 * number, and have the runtime loader check that the major number is equal
 * to what it was at application link time, while the minor number has to
 * be greater or equal to what it was at application link time.  With this
 * scheme, the version number is usually part of the file name, like this:
 *
 *	libcrypto.so.0.9
 *
 * Some unixen also make a softlink with the major verson number only:
 *
 *	libcrypto.so.0
 *
 * On Tru64 and IRIX 6.x it works a little bit differently.  There, the
 * shared library version is stored in the file, and is actually a series
 * of versions, separated by colons.  The rightmost version present in the
 * library when linking an application is stored in the application to be
 * matched at run time.  When the application is run, a check is done to
 * see if the library version stored in the application matches any of the
 * versions in the version string of the library itself.
 * This version string can be constructed in any way, depending on what
 * kind of matching is desired.  However, to implement the same scheme as
 * the one used in the other unixen, all compatible versions, from lowest
 * to highest, should be part of the string.  Consecutive builds would
 * give the following versions strings:
 *
 *	3.0
 *	3.0:3.1
 *	3.0:3.1:3.2
 *	4.0
 *	4.0:4.1
 *
 * Notice how version 4 is completely incompatible with version, and
 * therefore give the breach you can see.
 *
 * There may be other schemes as well that I haven't yet discovered.
 *
 * So, here's the way it works here: first of all, the library version
 * number doesn't need at all to match the overall OpenSSL version.
 * However, it's nice and more understandable if it actually does.
 * The current library version is stored in the macro SHLIB_VERSION_NUMBER,
 * which is just a piece of text in the format "M.m.e" (Major, minor, edit).
 * For the sake of Tru64, IRIX, and any other OS that behaves in similar ways,
 * we need to keep a history of version numbers, which is done in the
 * macro SHLIB_VERSION_HISTORY.  The numbers are separated by colons and
 * should only keep the versions that are binary compatible with the current.
 */
#define SHLIB_VERSION_HISTORY ""
#define SHLIB_VERSION_NUMBER "0.9.8"


#endif /* HEADER_OPENSSLV_H */
xmail-1.27/win32ssl/include/openssl/symhacks.h0000755000175000017500000005032611341640430020621 0ustar  davidedavide/* ====================================================================
 * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

#ifndef HEADER_SYMHACKS_H
#define HEADER_SYMHACKS_H

#include 

/* Hacks to solve the problem with linkers incapable of handling very long
   symbol names.  In the case of VMS, the limit is 31 characters on VMS for
   VAX. */
#ifdef OPENSSL_SYS_VMS

/* Hack a long name in crypto/cryptlib.c */
#undef int_CRYPTO_set_do_dynlock_callback
#define int_CRYPTO_set_do_dynlock_callback	int_CRYPTO_set_do_dynlock_cb

/* Hack a long name in crypto/ex_data.c */
#undef CRYPTO_get_ex_data_implementation
#define CRYPTO_get_ex_data_implementation	CRYPTO_get_ex_data_impl
#undef CRYPTO_set_ex_data_implementation
#define CRYPTO_set_ex_data_implementation	CRYPTO_set_ex_data_impl

/* Hack a long name in crypto/asn1/a_mbstr.c */
#undef ASN1_STRING_set_default_mask_asc
#define ASN1_STRING_set_default_mask_asc	ASN1_STRING_set_def_mask_asc

#if 0 /* No longer needed, since safestack macro magic does the job */
/* Hack the names created with DECLARE_ASN1_SET_OF(PKCS7_SIGNER_INFO) */
#undef i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO
#define i2d_ASN1_SET_OF_PKCS7_SIGNER_INFO	i2d_ASN1_SET_OF_PKCS7_SIGINF
#undef d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO
#define d2i_ASN1_SET_OF_PKCS7_SIGNER_INFO	d2i_ASN1_SET_OF_PKCS7_SIGINF
#endif

#if 0 /* No longer needed, since safestack macro magic does the job */
/* Hack the names created with DECLARE_ASN1_SET_OF(PKCS7_RECIP_INFO) */
#undef i2d_ASN1_SET_OF_PKCS7_RECIP_INFO
#define i2d_ASN1_SET_OF_PKCS7_RECIP_INFO	i2d_ASN1_SET_OF_PKCS7_RECINF
#undef d2i_ASN1_SET_OF_PKCS7_RECIP_INFO
#define d2i_ASN1_SET_OF_PKCS7_RECIP_INFO	d2i_ASN1_SET_OF_PKCS7_RECINF
#endif

#if 0 /* No longer needed, since safestack macro magic does the job */
/* Hack the names created with DECLARE_ASN1_SET_OF(ACCESS_DESCRIPTION) */
#undef i2d_ASN1_SET_OF_ACCESS_DESCRIPTION
#define i2d_ASN1_SET_OF_ACCESS_DESCRIPTION	i2d_ASN1_SET_OF_ACC_DESC
#undef d2i_ASN1_SET_OF_ACCESS_DESCRIPTION
#define d2i_ASN1_SET_OF_ACCESS_DESCRIPTION	d2i_ASN1_SET_OF_ACC_DESC
#endif

/* Hack the names created with DECLARE_PEM_rw(NETSCAPE_CERT_SEQUENCE) */
#undef PEM_read_NETSCAPE_CERT_SEQUENCE
#define PEM_read_NETSCAPE_CERT_SEQUENCE		PEM_read_NS_CERT_SEQ
#undef PEM_write_NETSCAPE_CERT_SEQUENCE
#define PEM_write_NETSCAPE_CERT_SEQUENCE	PEM_write_NS_CERT_SEQ
#undef PEM_read_bio_NETSCAPE_CERT_SEQUENCE
#define PEM_read_bio_NETSCAPE_CERT_SEQUENCE	PEM_read_bio_NS_CERT_SEQ
#undef PEM_write_bio_NETSCAPE_CERT_SEQUENCE
#define PEM_write_bio_NETSCAPE_CERT_SEQUENCE	PEM_write_bio_NS_CERT_SEQ
#undef PEM_write_cb_bio_NETSCAPE_CERT_SEQUENCE
#define PEM_write_cb_bio_NETSCAPE_CERT_SEQUENCE	PEM_write_cb_bio_NS_CERT_SEQ

/* Hack the names created with DECLARE_PEM_rw(PKCS8_PRIV_KEY_INFO) */
#undef PEM_read_PKCS8_PRIV_KEY_INFO
#define PEM_read_PKCS8_PRIV_KEY_INFO		PEM_read_P8_PRIV_KEY_INFO
#undef PEM_write_PKCS8_PRIV_KEY_INFO
#define PEM_write_PKCS8_PRIV_KEY_INFO		PEM_write_P8_PRIV_KEY_INFO
#undef PEM_read_bio_PKCS8_PRIV_KEY_INFO
#define PEM_read_bio_PKCS8_PRIV_KEY_INFO	PEM_read_bio_P8_PRIV_KEY_INFO
#undef PEM_write_bio_PKCS8_PRIV_KEY_INFO
#define PEM_write_bio_PKCS8_PRIV_KEY_INFO	PEM_write_bio_P8_PRIV_KEY_INFO
#undef PEM_write_cb_bio_PKCS8_PRIV_KEY_INFO
#define PEM_write_cb_bio_PKCS8_PRIV_KEY_INFO	PEM_wrt_cb_bio_P8_PRIV_KEY_INFO

/* Hack other PEM names */
#undef PEM_write_bio_PKCS8PrivateKey_nid
#define PEM_write_bio_PKCS8PrivateKey_nid	PEM_write_bio_PKCS8PrivKey_nid

/* Hack some long X509 names */
#undef X509_REVOKED_get_ext_by_critical
#define X509_REVOKED_get_ext_by_critical	X509_REVOKED_get_ext_by_critic
#undef X509_policy_tree_get0_user_policies
#define X509_policy_tree_get0_user_policies	X509_pcy_tree_get0_usr_policies
#undef X509_policy_node_get0_qualifiers
#define X509_policy_node_get0_qualifiers	X509_pcy_node_get0_qualifiers
#undef X509_STORE_CTX_get_explicit_policy
#define X509_STORE_CTX_get_explicit_policy	X509_STORE_CTX_get_expl_policy

/* Hack some long CRYPTO names */
#undef CRYPTO_set_dynlock_destroy_callback
#define CRYPTO_set_dynlock_destroy_callback     CRYPTO_set_dynlock_destroy_cb
#undef CRYPTO_set_dynlock_create_callback
#define CRYPTO_set_dynlock_create_callback      CRYPTO_set_dynlock_create_cb
#undef CRYPTO_set_dynlock_lock_callback
#define CRYPTO_set_dynlock_lock_callback        CRYPTO_set_dynlock_lock_cb
#undef CRYPTO_get_dynlock_lock_callback
#define CRYPTO_get_dynlock_lock_callback        CRYPTO_get_dynlock_lock_cb
#undef CRYPTO_get_dynlock_destroy_callback
#define CRYPTO_get_dynlock_destroy_callback     CRYPTO_get_dynlock_destroy_cb
#undef CRYPTO_get_dynlock_create_callback
#define CRYPTO_get_dynlock_create_callback      CRYPTO_get_dynlock_create_cb
#undef CRYPTO_set_locked_mem_ex_functions
#define CRYPTO_set_locked_mem_ex_functions      CRYPTO_set_locked_mem_ex_funcs
#undef CRYPTO_get_locked_mem_ex_functions
#define CRYPTO_get_locked_mem_ex_functions      CRYPTO_get_locked_mem_ex_funcs

/* Hack some long SSL names */
#undef SSL_CTX_set_default_verify_paths
#define SSL_CTX_set_default_verify_paths        SSL_CTX_set_def_verify_paths
#undef SSL_get_ex_data_X509_STORE_CTX_idx
#define SSL_get_ex_data_X509_STORE_CTX_idx      SSL_get_ex_d_X509_STORE_CTX_idx
#undef SSL_add_file_cert_subjects_to_stack
#define SSL_add_file_cert_subjects_to_stack     SSL_add_file_cert_subjs_to_stk
#undef SSL_add_dir_cert_subjects_to_stack
#define SSL_add_dir_cert_subjects_to_stack      SSL_add_dir_cert_subjs_to_stk
#undef SSL_CTX_use_certificate_chain_file
#define SSL_CTX_use_certificate_chain_file      SSL_CTX_use_cert_chain_file
#undef SSL_CTX_set_cert_verify_callback
#define SSL_CTX_set_cert_verify_callback        SSL_CTX_set_cert_verify_cb
#undef SSL_CTX_set_default_passwd_cb_userdata
#define SSL_CTX_set_default_passwd_cb_userdata  SSL_CTX_set_def_passwd_cb_ud
#undef SSL_COMP_get_compression_methods
#define SSL_COMP_get_compression_methods	SSL_COMP_get_compress_methods

/* Hack some long ENGINE names */
#undef ENGINE_get_default_BN_mod_exp_crt
#define ENGINE_get_default_BN_mod_exp_crt	ENGINE_get_def_BN_mod_exp_crt
#undef ENGINE_set_default_BN_mod_exp_crt
#define ENGINE_set_default_BN_mod_exp_crt	ENGINE_set_def_BN_mod_exp_crt
#undef ENGINE_set_load_privkey_function
#define ENGINE_set_load_privkey_function        ENGINE_set_load_privkey_fn
#undef ENGINE_get_load_privkey_function
#define ENGINE_get_load_privkey_function        ENGINE_get_load_privkey_fn
#undef ENGINE_set_load_ssl_client_cert_function
#define ENGINE_set_load_ssl_client_cert_function \
						ENGINE_set_ld_ssl_clnt_cert_fn
#undef ENGINE_get_ssl_client_cert_function
#define ENGINE_get_ssl_client_cert_function	ENGINE_get_ssl_client_cert_fn

/* Hack some long OCSP names */
#undef OCSP_REQUEST_get_ext_by_critical
#define OCSP_REQUEST_get_ext_by_critical        OCSP_REQUEST_get_ext_by_crit
#undef OCSP_BASICRESP_get_ext_by_critical
#define OCSP_BASICRESP_get_ext_by_critical      OCSP_BASICRESP_get_ext_by_crit
#undef OCSP_SINGLERESP_get_ext_by_critical
#define OCSP_SINGLERESP_get_ext_by_critical     OCSP_SINGLERESP_get_ext_by_crit

/* Hack some long DES names */
#undef _ossl_old_des_ede3_cfb64_encrypt
#define _ossl_old_des_ede3_cfb64_encrypt	_ossl_odes_ede3_cfb64_encrypt
#undef _ossl_old_des_ede3_ofb64_encrypt
#define _ossl_old_des_ede3_ofb64_encrypt	_ossl_odes_ede3_ofb64_encrypt

/* Hack some long EVP names */
#undef OPENSSL_add_all_algorithms_noconf
#define OPENSSL_add_all_algorithms_noconf	OPENSSL_add_all_algo_noconf
#undef OPENSSL_add_all_algorithms_conf
#define OPENSSL_add_all_algorithms_conf		OPENSSL_add_all_algo_conf

/* Hack some long EC names */
#undef EC_GROUP_set_point_conversion_form
#define EC_GROUP_set_point_conversion_form	EC_GROUP_set_point_conv_form
#undef EC_GROUP_get_point_conversion_form
#define EC_GROUP_get_point_conversion_form	EC_GROUP_get_point_conv_form
#undef EC_GROUP_clear_free_all_extra_data
#define EC_GROUP_clear_free_all_extra_data	EC_GROUP_clr_free_all_xtra_data
#undef EC_POINT_set_Jprojective_coordinates_GFp
#define EC_POINT_set_Jprojective_coordinates_GFp \
                                                EC_POINT_set_Jproj_coords_GFp
#undef EC_POINT_get_Jprojective_coordinates_GFp
#define EC_POINT_get_Jprojective_coordinates_GFp \
                                                EC_POINT_get_Jproj_coords_GFp
#undef EC_POINT_set_affine_coordinates_GFp
#define EC_POINT_set_affine_coordinates_GFp     EC_POINT_set_affine_coords_GFp
#undef EC_POINT_get_affine_coordinates_GFp
#define EC_POINT_get_affine_coordinates_GFp     EC_POINT_get_affine_coords_GFp
#undef EC_POINT_set_compressed_coordinates_GFp
#define EC_POINT_set_compressed_coordinates_GFp EC_POINT_set_compr_coords_GFp
#undef EC_POINT_set_affine_coordinates_GF2m
#define EC_POINT_set_affine_coordinates_GF2m    EC_POINT_set_affine_coords_GF2m
#undef EC_POINT_get_affine_coordinates_GF2m
#define EC_POINT_get_affine_coordinates_GF2m    EC_POINT_get_affine_coords_GF2m
#undef EC_POINT_set_compressed_coordinates_GF2m
#define EC_POINT_set_compressed_coordinates_GF2m \
                                                EC_POINT_set_compr_coords_GF2m
#undef ec_GF2m_simple_group_clear_finish
#define ec_GF2m_simple_group_clear_finish        ec_GF2m_simple_grp_clr_finish
#undef ec_GF2m_simple_group_check_discriminant
#define ec_GF2m_simple_group_check_discriminant	ec_GF2m_simple_grp_chk_discrim
#undef ec_GF2m_simple_point_clear_finish
#define ec_GF2m_simple_point_clear_finish        ec_GF2m_simple_pt_clr_finish
#undef ec_GF2m_simple_point_set_to_infinity
#define ec_GF2m_simple_point_set_to_infinity     ec_GF2m_simple_pt_set_to_inf
#undef ec_GF2m_simple_points_make_affine
#define ec_GF2m_simple_points_make_affine        ec_GF2m_simple_pts_make_affine
#undef ec_GF2m_simple_point_set_affine_coordinates
#define ec_GF2m_simple_point_set_affine_coordinates \
                                                ec_GF2m_smp_pt_set_af_coords
#undef ec_GF2m_simple_point_get_affine_coordinates
#define ec_GF2m_simple_point_get_affine_coordinates \
                                                ec_GF2m_smp_pt_get_af_coords
#undef ec_GF2m_simple_set_compressed_coordinates
#define ec_GF2m_simple_set_compressed_coordinates \
                                                ec_GF2m_smp_set_compr_coords
#undef ec_GFp_simple_group_set_curve_GFp
#define ec_GFp_simple_group_set_curve_GFp       ec_GFp_simple_grp_set_curve_GFp
#undef ec_GFp_simple_group_get_curve_GFp
#define ec_GFp_simple_group_get_curve_GFp       ec_GFp_simple_grp_get_curve_GFp
#undef ec_GFp_simple_group_clear_finish
#define ec_GFp_simple_group_clear_finish        ec_GFp_simple_grp_clear_finish
#undef ec_GFp_simple_group_set_generator
#define ec_GFp_simple_group_set_generator       ec_GFp_simple_grp_set_generator
#undef ec_GFp_simple_group_get0_generator
#define ec_GFp_simple_group_get0_generator      ec_GFp_simple_grp_gt0_generator
#undef ec_GFp_simple_group_get_cofactor
#define ec_GFp_simple_group_get_cofactor        ec_GFp_simple_grp_get_cofactor
#undef ec_GFp_simple_point_clear_finish
#define ec_GFp_simple_point_clear_finish        ec_GFp_simple_pt_clear_finish
#undef ec_GFp_simple_point_set_to_infinity
#define ec_GFp_simple_point_set_to_infinity     ec_GFp_simple_pt_set_to_inf
#undef ec_GFp_simple_points_make_affine
#define ec_GFp_simple_points_make_affine        ec_GFp_simple_pts_make_affine
#undef ec_GFp_simple_group_get_curve_GFp
#define ec_GFp_simple_group_get_curve_GFp       ec_GFp_simple_grp_get_curve_GFp
#undef ec_GFp_simple_set_Jprojective_coordinates_GFp
#define ec_GFp_simple_set_Jprojective_coordinates_GFp \
                                                ec_GFp_smp_set_Jproj_coords_GFp
#undef ec_GFp_simple_get_Jprojective_coordinates_GFp
#define ec_GFp_simple_get_Jprojective_coordinates_GFp \
                                                ec_GFp_smp_get_Jproj_coords_GFp
#undef ec_GFp_simple_point_set_affine_coordinates_GFp
#define ec_GFp_simple_point_set_affine_coordinates_GFp \
                                                ec_GFp_smp_pt_set_af_coords_GFp
#undef ec_GFp_simple_point_get_affine_coordinates_GFp
#define ec_GFp_simple_point_get_affine_coordinates_GFp \
                                                ec_GFp_smp_pt_get_af_coords_GFp
#undef ec_GFp_simple_set_compressed_coordinates_GFp
#define ec_GFp_simple_set_compressed_coordinates_GFp \
                                                ec_GFp_smp_set_compr_coords_GFp
#undef ec_GFp_simple_point_set_affine_coordinates
#define ec_GFp_simple_point_set_affine_coordinates \
                                                ec_GFp_smp_pt_set_af_coords
#undef ec_GFp_simple_point_get_affine_coordinates
#define ec_GFp_simple_point_get_affine_coordinates \
                                                ec_GFp_smp_pt_get_af_coords
#undef ec_GFp_simple_set_compressed_coordinates
#define ec_GFp_simple_set_compressed_coordinates \
                                                ec_GFp_smp_set_compr_coords
#undef ec_GFp_simple_group_check_discriminant
#define ec_GFp_simple_group_check_discriminant	ec_GFp_simple_grp_chk_discrim

/* Hack som long STORE names */
#undef STORE_method_set_initialise_function
#define STORE_method_set_initialise_function	STORE_meth_set_initialise_fn
#undef STORE_method_set_cleanup_function
#define STORE_method_set_cleanup_function	STORE_meth_set_cleanup_fn
#undef STORE_method_set_generate_function
#define STORE_method_set_generate_function	STORE_meth_set_generate_fn
#undef STORE_method_set_modify_function
#define STORE_method_set_modify_function	STORE_meth_set_modify_fn
#undef STORE_method_set_revoke_function
#define STORE_method_set_revoke_function	STORE_meth_set_revoke_fn
#undef STORE_method_set_delete_function
#define STORE_method_set_delete_function	STORE_meth_set_delete_fn
#undef STORE_method_set_list_start_function
#define STORE_method_set_list_start_function	STORE_meth_set_list_start_fn
#undef STORE_method_set_list_next_function
#define STORE_method_set_list_next_function	STORE_meth_set_list_next_fn
#undef STORE_method_set_list_end_function
#define STORE_method_set_list_end_function	STORE_meth_set_list_end_fn
#undef STORE_method_set_update_store_function
#define STORE_method_set_update_store_function	STORE_meth_set_update_store_fn
#undef STORE_method_set_lock_store_function
#define STORE_method_set_lock_store_function	STORE_meth_set_lock_store_fn
#undef STORE_method_set_unlock_store_function
#define STORE_method_set_unlock_store_function	STORE_meth_set_unlock_store_fn
#undef STORE_method_get_initialise_function
#define STORE_method_get_initialise_function	STORE_meth_get_initialise_fn
#undef STORE_method_get_cleanup_function
#define STORE_method_get_cleanup_function	STORE_meth_get_cleanup_fn
#undef STORE_method_get_generate_function
#define STORE_method_get_generate_function	STORE_meth_get_generate_fn
#undef STORE_method_get_modify_function
#define STORE_method_get_modify_function	STORE_meth_get_modify_fn
#undef STORE_method_get_revoke_function
#define STORE_method_get_revoke_function	STORE_meth_get_revoke_fn
#undef STORE_method_get_delete_function
#define STORE_method_get_delete_function	STORE_meth_get_delete_fn
#undef STORE_method_get_list_start_function
#define STORE_method_get_list_start_function	STORE_meth_get_list_start_fn
#undef STORE_method_get_list_next_function
#define STORE_method_get_list_next_function	STORE_meth_get_list_next_fn
#undef STORE_method_get_list_end_function
#define STORE_method_get_list_end_function	STORE_meth_get_list_end_fn
#undef STORE_method_get_update_store_function
#define STORE_method_get_update_store_function	STORE_meth_get_update_store_fn
#undef STORE_method_get_lock_store_function
#define STORE_method_get_lock_store_function	STORE_meth_get_lock_store_fn
#undef STORE_method_get_unlock_store_function
#define STORE_method_get_unlock_store_function	STORE_meth_get_unlock_store_fn

/* Hack some long CMS names */
#undef CMS_RecipientInfo_ktri_get0_algs
#define CMS_RecipientInfo_ktri_get0_algs	CMS_RecipInfo_ktri_get0_algs
#undef CMS_RecipientInfo_ktri_get0_signer_id
#define CMS_RecipientInfo_ktri_get0_signer_id	CMS_RecipInfo_ktri_get0_sigr_id
#undef CMS_OtherRevocationInfoFormat_it
#define CMS_OtherRevocationInfoFormat_it	CMS_OtherRevocInfoFormat_it
#undef CMS_KeyAgreeRecipientIdentifier_it
#define CMS_KeyAgreeRecipientIdentifier_it	CMS_KeyAgreeRecipIdentifier_it
#undef CMS_OriginatorIdentifierOrKey_it
#define CMS_OriginatorIdentifierOrKey_it	CMS_OriginatorIdOrKey_it
#undef cms_SignerIdentifier_get0_signer_id
#define cms_SignerIdentifier_get0_signer_id	cms_SignerId_get0_signer_id

#endif /* defined OPENSSL_SYS_VMS */


/* Case insensiteve linking causes problems.... */
#if defined(OPENSSL_SYS_WIN16) || defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_OS2)
#undef ERR_load_CRYPTO_strings
#define ERR_load_CRYPTO_strings			ERR_load_CRYPTOlib_strings
#undef OCSP_crlID_new
#define OCSP_crlID_new                          OCSP_crlID2_new

#undef d2i_ECPARAMETERS
#define d2i_ECPARAMETERS                        d2i_UC_ECPARAMETERS
#undef i2d_ECPARAMETERS
#define i2d_ECPARAMETERS                        i2d_UC_ECPARAMETERS
#undef d2i_ECPKPARAMETERS
#define d2i_ECPKPARAMETERS                      d2i_UC_ECPKPARAMETERS
#undef i2d_ECPKPARAMETERS
#define i2d_ECPKPARAMETERS                      i2d_UC_ECPKPARAMETERS

/* These functions do not seem to exist!  However, I'm paranoid...
   Original command in x509v3.h:
   These functions are being redefined in another directory,
   and clash when the linker is case-insensitive, so let's
   hide them a little, by giving them an extra 'o' at the
   beginning of the name... */
#undef X509v3_cleanup_extensions
#define X509v3_cleanup_extensions               oX509v3_cleanup_extensions
#undef X509v3_add_extension
#define X509v3_add_extension                    oX509v3_add_extension
#undef X509v3_add_netscape_extensions
#define X509v3_add_netscape_extensions          oX509v3_add_netscape_extensions
#undef X509v3_add_standard_extensions
#define X509v3_add_standard_extensions          oX509v3_add_standard_extensions


#endif


#endif /* ! defined HEADER_VMS_IDHACKS_H */
/* This one clashes with CMS_data_create */
#undef cms_Data_create
#define cms_Data_create				priv_cms_Data_create
xmail-1.27/win32ssl/include/openssl/pqueue.h0000755000175000017500000000667711341640430020315 0ustar  davidedavide/* crypto/pqueue/pqueue.h */
/* 
 * DTLS implementation written by Nagendra Modadugu
 * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.  
 */
/* ====================================================================
 * Copyright (c) 1999-2005 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

#ifndef HEADER_PQUEUE_H
#define HEADER_PQUEUE_H

#include 
#include 
#include 

#include 

typedef struct _pqueue *pqueue;

typedef struct _pitem
	{
	PQ_64BIT priority;
	void *data;
	struct _pitem *next;
	} pitem;

typedef struct _pitem *piterator;

pitem *pitem_new(PQ_64BIT priority, void *data);
void   pitem_free(pitem *item);

pqueue pqueue_new(void);
void   pqueue_free(pqueue pq);

pitem *pqueue_insert(pqueue pq, pitem *item);
pitem *pqueue_peek(pqueue pq);
pitem *pqueue_pop(pqueue pq);
pitem *pqueue_find(pqueue pq, PQ_64BIT priority);
pitem *pqueue_iterator(pqueue pq);
pitem *pqueue_next(piterator *iter);

void   pqueue_print(pqueue pq);

#endif /* ! HEADER_PQUEUE_H */
xmail-1.27/win32ssl/include/openssl/ecdsa.h0000755000175000017500000002452211341640430020055 0ustar  davidedavide/* crypto/ecdsa/ecdsa.h */
/**
 * \file   crypto/ecdsa/ecdsa.h Include file for the OpenSSL ECDSA functions
 * \author Written by Nils Larsch for the OpenSSL project
 */
/* ====================================================================
 * Copyright (c) 2000-2003 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    licensing@OpenSSL.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */
#ifndef HEADER_ECDSA_H
#define HEADER_ECDSA_H

#include 

#ifdef OPENSSL_NO_ECDSA
#error ECDSA is disabled.
#endif

#include 
#include 
#ifndef OPENSSL_NO_DEPRECATED
#include 
#endif

#ifdef __cplusplus
extern "C" {
#endif

typedef struct ECDSA_SIG_st
	{
	BIGNUM *r;
	BIGNUM *s;
	} ECDSA_SIG;

/** ECDSA_SIG *ECDSA_SIG_new(void)
 * allocates and initialize a ECDSA_SIG structure
 * \return pointer to a ECDSA_SIG structure or NULL if an error occurred
 */
ECDSA_SIG *ECDSA_SIG_new(void);

/** ECDSA_SIG_free
 * frees a ECDSA_SIG structure
 * \param a pointer to the ECDSA_SIG structure
 */
void	  ECDSA_SIG_free(ECDSA_SIG *a);

/** i2d_ECDSA_SIG
 * DER encode content of ECDSA_SIG object (note: this function modifies *pp
 * (*pp += length of the DER encoded signature)).
 * \param a  pointer to the ECDSA_SIG object
 * \param pp pointer to a unsigned char pointer for the output or NULL
 * \return the length of the DER encoded ECDSA_SIG object or 0 
 */
int	  i2d_ECDSA_SIG(const ECDSA_SIG *a, unsigned char **pp);

/** d2i_ECDSA_SIG
 * decodes a DER encoded ECDSA signature (note: this function changes *pp
 * (*pp += len)). 
 * \param v pointer to ECDSA_SIG pointer (may be NULL)
 * \param pp buffer with the DER encoded signature
 * \param len bufferlength
 * \return pointer to the decoded ECDSA_SIG structure (or NULL)
 */
ECDSA_SIG *d2i_ECDSA_SIG(ECDSA_SIG **v, const unsigned char **pp, long len);

/** ECDSA_do_sign
 * computes the ECDSA signature of the given hash value using
 * the supplied private key and returns the created signature.
 * \param dgst pointer to the hash value
 * \param dgst_len length of the hash value
 * \param eckey pointer to the EC_KEY object containing a private EC key
 * \return pointer to a ECDSA_SIG structure or NULL
 */
ECDSA_SIG *ECDSA_do_sign(const unsigned char *dgst,int dgst_len,EC_KEY *eckey);

/** ECDSA_do_sign_ex
 * computes ECDSA signature of a given hash value using the supplied
 * private key (note: sig must point to ECDSA_size(eckey) bytes of memory).
 * \param dgst pointer to the hash value to sign
 * \param dgstlen length of the hash value
 * \param kinv optional pointer to a pre-computed inverse k
 * \param rp optional pointer to the pre-computed rp value (see 
 *        ECDSA_sign_setup
 * \param eckey pointer to the EC_KEY object containing a private EC key
 * \return pointer to a ECDSA_SIG structure or NULL
 */
ECDSA_SIG *ECDSA_do_sign_ex(const unsigned char *dgst, int dgstlen, 
		const BIGNUM *kinv, const BIGNUM *rp, EC_KEY *eckey);

/** ECDSA_do_verify
 * verifies that the supplied signature is a valid ECDSA
 * signature of the supplied hash value using the supplied public key.
 * \param dgst pointer to the hash value
 * \param dgst_len length of the hash value
 * \param sig  pointer to the ECDSA_SIG structure
 * \param eckey pointer to the EC_KEY object containing a public EC key
 * \return 1 if the signature is valid, 0 if the signature is invalid and -1 on error
 */
int	  ECDSA_do_verify(const unsigned char *dgst, int dgst_len,
		const ECDSA_SIG *sig, EC_KEY* eckey);

const ECDSA_METHOD *ECDSA_OpenSSL(void);

/** ECDSA_set_default_method
 * sets the default ECDSA method
 * \param meth the new default ECDSA_METHOD
 */
void	  ECDSA_set_default_method(const ECDSA_METHOD *meth);

/** ECDSA_get_default_method
 * returns the default ECDSA method
 * \return pointer to ECDSA_METHOD structure containing the default method
 */
const ECDSA_METHOD *ECDSA_get_default_method(void);

/** ECDSA_set_method
 * sets method to be used for the ECDSA operations
 * \param eckey pointer to the EC_KEY object
 * \param meth  pointer to the new method
 * \return 1 on success and 0 otherwise 
 */
int 	  ECDSA_set_method(EC_KEY *eckey, const ECDSA_METHOD *meth);

/** ECDSA_size
 * returns the maximum length of the DER encoded signature
 * \param  eckey pointer to a EC_KEY object
 * \return numbers of bytes required for the DER encoded signature
 */
int	  ECDSA_size(const EC_KEY *eckey);

/** ECDSA_sign_setup
 * precompute parts of the signing operation. 
 * \param eckey pointer to the EC_KEY object containing a private EC key
 * \param ctx  pointer to a BN_CTX object (may be NULL)
 * \param kinv pointer to a BIGNUM pointer for the inverse of k
 * \param rp   pointer to a BIGNUM pointer for x coordinate of k * generator
 * \return 1 on success and 0 otherwise
 */
int 	  ECDSA_sign_setup(EC_KEY *eckey, BN_CTX *ctx, BIGNUM **kinv, 
		BIGNUM **rp);

/** ECDSA_sign
 * computes ECDSA signature of a given hash value using the supplied
 * private key (note: sig must point to ECDSA_size(eckey) bytes of memory).
 * \param type this parameter is ignored
 * \param dgst pointer to the hash value to sign
 * \param dgstlen length of the hash value
 * \param sig buffer to hold the DER encoded signature
 * \param siglen pointer to the length of the returned signature
 * \param eckey pointer to the EC_KEY object containing a private EC key
 * \return 1 on success and 0 otherwise
 */
int	  ECDSA_sign(int type, const unsigned char *dgst, int dgstlen, 
		unsigned char *sig, unsigned int *siglen, EC_KEY *eckey);


/** ECDSA_sign_ex
 * computes ECDSA signature of a given hash value using the supplied
 * private key (note: sig must point to ECDSA_size(eckey) bytes of memory).
 * \param type this parameter is ignored
 * \param dgst pointer to the hash value to sign
 * \param dgstlen length of the hash value
 * \param sig buffer to hold the DER encoded signature
 * \param siglen pointer to the length of the returned signature
 * \param kinv optional pointer to a pre-computed inverse k
 * \param rp optional pointer to the pre-computed rp value (see 
 *        ECDSA_sign_setup
 * \param eckey pointer to the EC_KEY object containing a private EC key
 * \return 1 on success and 0 otherwise
 */
int	  ECDSA_sign_ex(int type, const unsigned char *dgst, int dgstlen, 
		unsigned char *sig, unsigned int *siglen, const BIGNUM *kinv,
		const BIGNUM *rp, EC_KEY *eckey);

/** ECDSA_verify
 * verifies that the given signature is valid ECDSA signature
 * of the supplied hash value using the specified public key.
 * \param type this parameter is ignored
 * \param dgst pointer to the hash value 
 * \param dgstlen length of the hash value
 * \param sig  pointer to the DER encoded signature
 * \param siglen length of the DER encoded signature
 * \param eckey pointer to the EC_KEY object containing a public EC key
 * \return 1 if the signature is valid, 0 if the signature is invalid and -1 on error
 */
int 	  ECDSA_verify(int type, const unsigned char *dgst, int dgstlen, 
		const unsigned char *sig, int siglen, EC_KEY *eckey);

/* the standard ex_data functions */
int 	  ECDSA_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new 
		*new_func, CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func);
int 	  ECDSA_set_ex_data(EC_KEY *d, int idx, void *arg);
void 	  *ECDSA_get_ex_data(EC_KEY *d, int idx);


/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_ECDSA_strings(void);

/* Error codes for the ECDSA functions. */

/* Function codes. */
#define ECDSA_F_ECDSA_DATA_NEW_METHOD			 100
#define ECDSA_F_ECDSA_DO_SIGN				 101
#define ECDSA_F_ECDSA_DO_VERIFY				 102
#define ECDSA_F_ECDSA_SIGN_SETUP			 103

/* Reason codes. */
#define ECDSA_R_BAD_SIGNATURE				 100
#define ECDSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE		 101
#define ECDSA_R_ERR_EC_LIB				 102
#define ECDSA_R_MISSING_PARAMETERS			 103
#define ECDSA_R_NEED_NEW_SETUP_VALUES			 106
#define ECDSA_R_RANDOM_NUMBER_GENERATION_FAILED		 104
#define ECDSA_R_SIGNATURE_MALLOC_FAILED			 105

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/hmac.h0000755000175000017500000001051511341640430017703 0ustar  davidedavide/* crypto/hmac/hmac.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */
#ifndef HEADER_HMAC_H
#define HEADER_HMAC_H

#include 

#ifdef OPENSSL_NO_HMAC
#error HMAC is disabled.
#endif

#include 

#define HMAC_MAX_MD_CBLOCK	128	/* largest known is SHA512 */

#ifdef  __cplusplus
extern "C" {
#endif

typedef struct hmac_ctx_st
	{
	const EVP_MD *md;
	EVP_MD_CTX md_ctx;
	EVP_MD_CTX i_ctx;
	EVP_MD_CTX o_ctx;
	unsigned int key_length;
	unsigned char key[HMAC_MAX_MD_CBLOCK];
	} HMAC_CTX;

#define HMAC_size(e)	(EVP_MD_size((e)->md))


void HMAC_CTX_init(HMAC_CTX *ctx);
void HMAC_CTX_cleanup(HMAC_CTX *ctx);

#define HMAC_cleanup(ctx) HMAC_CTX_cleanup(ctx) /* deprecated */

void HMAC_Init(HMAC_CTX *ctx, const void *key, int len,
	       const EVP_MD *md); /* deprecated */
void HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int len,
		  const EVP_MD *md, ENGINE *impl);
void HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len);
void HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len);
unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len,
		    const unsigned char *d, size_t n, unsigned char *md,
		    unsigned int *md_len);

void HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags);

#ifdef  __cplusplus
}
#endif

#endif
xmail-1.27/win32ssl/include/openssl/ssl3.h0000755000175000017500000005412011341640430017657 0ustar  davidedavide/* ssl/ssl3.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */
/* ====================================================================
 * Copyright (c) 1998-2002 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */
/* ====================================================================
 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
 * ECC cipher suite support in OpenSSL originally developed by 
 * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
 */

#ifndef HEADER_SSL3_H 
#define HEADER_SSL3_H 

#ifndef OPENSSL_NO_COMP
#include 
#endif
#include 
#include 
#include 
#include 

#ifdef  __cplusplus
extern "C" {
#endif

#define SSL3_CK_RSA_NULL_MD5			0x03000001
#define SSL3_CK_RSA_NULL_SHA			0x03000002
#define SSL3_CK_RSA_RC4_40_MD5 			0x03000003
#define SSL3_CK_RSA_RC4_128_MD5			0x03000004
#define SSL3_CK_RSA_RC4_128_SHA			0x03000005
#define SSL3_CK_RSA_RC2_40_MD5			0x03000006
#define SSL3_CK_RSA_IDEA_128_SHA		0x03000007
#define SSL3_CK_RSA_DES_40_CBC_SHA		0x03000008
#define SSL3_CK_RSA_DES_64_CBC_SHA		0x03000009
#define SSL3_CK_RSA_DES_192_CBC3_SHA		0x0300000A

#define SSL3_CK_DH_DSS_DES_40_CBC_SHA		0x0300000B
#define SSL3_CK_DH_DSS_DES_64_CBC_SHA		0x0300000C
#define SSL3_CK_DH_DSS_DES_192_CBC3_SHA 	0x0300000D
#define SSL3_CK_DH_RSA_DES_40_CBC_SHA		0x0300000E
#define SSL3_CK_DH_RSA_DES_64_CBC_SHA		0x0300000F
#define SSL3_CK_DH_RSA_DES_192_CBC3_SHA 	0x03000010

#define SSL3_CK_EDH_DSS_DES_40_CBC_SHA		0x03000011
#define SSL3_CK_EDH_DSS_DES_64_CBC_SHA		0x03000012
#define SSL3_CK_EDH_DSS_DES_192_CBC3_SHA	0x03000013
#define SSL3_CK_EDH_RSA_DES_40_CBC_SHA		0x03000014
#define SSL3_CK_EDH_RSA_DES_64_CBC_SHA		0x03000015
#define SSL3_CK_EDH_RSA_DES_192_CBC3_SHA	0x03000016

#define SSL3_CK_ADH_RC4_40_MD5			0x03000017
#define SSL3_CK_ADH_RC4_128_MD5			0x03000018
#define SSL3_CK_ADH_DES_40_CBC_SHA		0x03000019
#define SSL3_CK_ADH_DES_64_CBC_SHA		0x0300001A
#define SSL3_CK_ADH_DES_192_CBC_SHA		0x0300001B

#define SSL3_CK_FZA_DMS_NULL_SHA		0x0300001C
#define SSL3_CK_FZA_DMS_FZA_SHA			0x0300001D
#if 0 /* Because it clashes with KRB5, is never used any more, and is safe
	 to remove according to David Hopwood 
	 of the ietf-tls list */
#define SSL3_CK_FZA_DMS_RC4_SHA			0x0300001E
#endif

/*    VRS Additional Kerberos5 entries
 */
#define SSL3_CK_KRB5_DES_64_CBC_SHA		0x0300001E
#define SSL3_CK_KRB5_DES_192_CBC3_SHA		0x0300001F
#define SSL3_CK_KRB5_RC4_128_SHA		0x03000020
#define SSL3_CK_KRB5_IDEA_128_CBC_SHA	       	0x03000021
#define SSL3_CK_KRB5_DES_64_CBC_MD5       	0x03000022
#define SSL3_CK_KRB5_DES_192_CBC3_MD5       	0x03000023
#define SSL3_CK_KRB5_RC4_128_MD5	       	0x03000024
#define SSL3_CK_KRB5_IDEA_128_CBC_MD5 		0x03000025

#define SSL3_CK_KRB5_DES_40_CBC_SHA 		0x03000026
#define SSL3_CK_KRB5_RC2_40_CBC_SHA 		0x03000027
#define SSL3_CK_KRB5_RC4_40_SHA	 		0x03000028
#define SSL3_CK_KRB5_DES_40_CBC_MD5 		0x03000029
#define SSL3_CK_KRB5_RC2_40_CBC_MD5 		0x0300002A
#define SSL3_CK_KRB5_RC4_40_MD5	 		0x0300002B

#define SSL3_TXT_RSA_NULL_MD5			"NULL-MD5"
#define SSL3_TXT_RSA_NULL_SHA			"NULL-SHA"
#define SSL3_TXT_RSA_RC4_40_MD5 		"EXP-RC4-MD5"
#define SSL3_TXT_RSA_RC4_128_MD5		"RC4-MD5"
#define SSL3_TXT_RSA_RC4_128_SHA		"RC4-SHA"
#define SSL3_TXT_RSA_RC2_40_MD5			"EXP-RC2-CBC-MD5"
#define SSL3_TXT_RSA_IDEA_128_SHA		"IDEA-CBC-SHA"
#define SSL3_TXT_RSA_DES_40_CBC_SHA		"EXP-DES-CBC-SHA"
#define SSL3_TXT_RSA_DES_64_CBC_SHA		"DES-CBC-SHA"
#define SSL3_TXT_RSA_DES_192_CBC3_SHA		"DES-CBC3-SHA"

#define SSL3_TXT_DH_DSS_DES_40_CBC_SHA		"EXP-DH-DSS-DES-CBC-SHA"
#define SSL3_TXT_DH_DSS_DES_64_CBC_SHA		"DH-DSS-DES-CBC-SHA"
#define SSL3_TXT_DH_DSS_DES_192_CBC3_SHA 	"DH-DSS-DES-CBC3-SHA"
#define SSL3_TXT_DH_RSA_DES_40_CBC_SHA		"EXP-DH-RSA-DES-CBC-SHA"
#define SSL3_TXT_DH_RSA_DES_64_CBC_SHA		"DH-RSA-DES-CBC-SHA"
#define SSL3_TXT_DH_RSA_DES_192_CBC3_SHA 	"DH-RSA-DES-CBC3-SHA"

#define SSL3_TXT_EDH_DSS_DES_40_CBC_SHA		"EXP-EDH-DSS-DES-CBC-SHA"
#define SSL3_TXT_EDH_DSS_DES_64_CBC_SHA		"EDH-DSS-DES-CBC-SHA"
#define SSL3_TXT_EDH_DSS_DES_192_CBC3_SHA	"EDH-DSS-DES-CBC3-SHA"
#define SSL3_TXT_EDH_RSA_DES_40_CBC_SHA		"EXP-EDH-RSA-DES-CBC-SHA"
#define SSL3_TXT_EDH_RSA_DES_64_CBC_SHA		"EDH-RSA-DES-CBC-SHA"
#define SSL3_TXT_EDH_RSA_DES_192_CBC3_SHA	"EDH-RSA-DES-CBC3-SHA"

#define SSL3_TXT_ADH_RC4_40_MD5			"EXP-ADH-RC4-MD5"
#define SSL3_TXT_ADH_RC4_128_MD5		"ADH-RC4-MD5"
#define SSL3_TXT_ADH_DES_40_CBC_SHA		"EXP-ADH-DES-CBC-SHA"
#define SSL3_TXT_ADH_DES_64_CBC_SHA		"ADH-DES-CBC-SHA"
#define SSL3_TXT_ADH_DES_192_CBC_SHA		"ADH-DES-CBC3-SHA"

#define SSL3_TXT_FZA_DMS_NULL_SHA		"FZA-NULL-SHA"
#define SSL3_TXT_FZA_DMS_FZA_SHA		"FZA-FZA-CBC-SHA"
#define SSL3_TXT_FZA_DMS_RC4_SHA		"FZA-RC4-SHA"

#define SSL3_TXT_KRB5_DES_64_CBC_SHA		"KRB5-DES-CBC-SHA"
#define SSL3_TXT_KRB5_DES_192_CBC3_SHA		"KRB5-DES-CBC3-SHA"
#define SSL3_TXT_KRB5_RC4_128_SHA		"KRB5-RC4-SHA"
#define SSL3_TXT_KRB5_IDEA_128_CBC_SHA	       	"KRB5-IDEA-CBC-SHA"
#define SSL3_TXT_KRB5_DES_64_CBC_MD5       	"KRB5-DES-CBC-MD5"
#define SSL3_TXT_KRB5_DES_192_CBC3_MD5       	"KRB5-DES-CBC3-MD5"
#define SSL3_TXT_KRB5_RC4_128_MD5		"KRB5-RC4-MD5"
#define SSL3_TXT_KRB5_IDEA_128_CBC_MD5 		"KRB5-IDEA-CBC-MD5"

#define SSL3_TXT_KRB5_DES_40_CBC_SHA 		"EXP-KRB5-DES-CBC-SHA"
#define SSL3_TXT_KRB5_RC2_40_CBC_SHA 		"EXP-KRB5-RC2-CBC-SHA"
#define SSL3_TXT_KRB5_RC4_40_SHA	 	"EXP-KRB5-RC4-SHA"
#define SSL3_TXT_KRB5_DES_40_CBC_MD5 		"EXP-KRB5-DES-CBC-MD5"
#define SSL3_TXT_KRB5_RC2_40_CBC_MD5 		"EXP-KRB5-RC2-CBC-MD5"
#define SSL3_TXT_KRB5_RC4_40_MD5	 	"EXP-KRB5-RC4-MD5"

#define SSL3_SSL_SESSION_ID_LENGTH		32
#define SSL3_MAX_SSL_SESSION_ID_LENGTH		32

#define SSL3_MASTER_SECRET_SIZE			48
#define SSL3_RANDOM_SIZE			32
#define SSL3_SESSION_ID_SIZE			32
#define SSL3_RT_HEADER_LENGTH			5

/* Due to MS stuffing up, this can change.... */
#if defined(OPENSSL_SYS_WIN16) || \
	(defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_WIN32))
#define SSL3_RT_MAX_EXTRA			(14000)
#else
#define SSL3_RT_MAX_EXTRA			(16384)
#endif

#define SSL3_RT_MAX_PLAIN_LENGTH		16384
#ifdef OPENSSL_NO_COMP
#define SSL3_RT_MAX_COMPRESSED_LENGTH	SSL3_RT_MAX_PLAIN_LENGTH
#else
#define SSL3_RT_MAX_COMPRESSED_LENGTH	(1024+SSL3_RT_MAX_PLAIN_LENGTH)
#endif
#define SSL3_RT_MAX_ENCRYPTED_LENGTH	(1024+SSL3_RT_MAX_COMPRESSED_LENGTH)
#define SSL3_RT_MAX_PACKET_SIZE		(SSL3_RT_MAX_ENCRYPTED_LENGTH+SSL3_RT_HEADER_LENGTH)
#define SSL3_RT_MAX_DATA_SIZE			(1024*1024)

#define SSL3_MD_CLIENT_FINISHED_CONST	"\x43\x4C\x4E\x54"
#define SSL3_MD_SERVER_FINISHED_CONST	"\x53\x52\x56\x52"

#define SSL3_VERSION			0x0300
#define SSL3_VERSION_MAJOR		0x03
#define SSL3_VERSION_MINOR		0x00

#define SSL3_RT_CHANGE_CIPHER_SPEC	20
#define SSL3_RT_ALERT			21
#define SSL3_RT_HANDSHAKE		22
#define SSL3_RT_APPLICATION_DATA	23

#define SSL3_AL_WARNING			1
#define SSL3_AL_FATAL			2

#define SSL3_AD_CLOSE_NOTIFY		 0
#define SSL3_AD_UNEXPECTED_MESSAGE	10	/* fatal */
#define SSL3_AD_BAD_RECORD_MAC		20	/* fatal */
#define SSL3_AD_DECOMPRESSION_FAILURE	30	/* fatal */
#define SSL3_AD_HANDSHAKE_FAILURE	40	/* fatal */
#define SSL3_AD_NO_CERTIFICATE		41
#define SSL3_AD_BAD_CERTIFICATE		42
#define SSL3_AD_UNSUPPORTED_CERTIFICATE	43
#define SSL3_AD_CERTIFICATE_REVOKED	44
#define SSL3_AD_CERTIFICATE_EXPIRED	45
#define SSL3_AD_CERTIFICATE_UNKNOWN	46
#define SSL3_AD_ILLEGAL_PARAMETER	47	/* fatal */

typedef struct ssl3_record_st
	{
/*r */	int type;               /* type of record */
/*rw*/	unsigned int length;    /* How many bytes available */
/*r */	unsigned int off;       /* read/write offset into 'buf' */
/*rw*/	unsigned char *data;    /* pointer to the record data */
/*rw*/	unsigned char *input;   /* where the decode bytes are */
/*r */	unsigned char *comp;    /* only used with decompression - malloc()ed */
/*r */  unsigned long epoch;    /* epoch number, needed by DTLS1 */
/*r */  PQ_64BIT seq_num;       /* sequence number, needed by DTLS1 */
	} SSL3_RECORD;

typedef struct ssl3_buffer_st
	{
	unsigned char *buf;     /* at least SSL3_RT_MAX_PACKET_SIZE bytes,
	                         * see ssl3_setup_buffers() */
	size_t len;             /* buffer size */
	int offset;             /* where to 'copy from' */
	int left;               /* how many bytes left */
	} SSL3_BUFFER;

#define SSL3_CT_RSA_SIGN			1
#define SSL3_CT_DSS_SIGN			2
#define SSL3_CT_RSA_FIXED_DH			3
#define SSL3_CT_DSS_FIXED_DH			4
#define SSL3_CT_RSA_EPHEMERAL_DH		5
#define SSL3_CT_DSS_EPHEMERAL_DH		6
#define SSL3_CT_FORTEZZA_DMS			20
/* SSL3_CT_NUMBER is used to size arrays and it must be large
 * enough to contain all of the cert types defined either for
 * SSLv3 and TLSv1.
 */
#define SSL3_CT_NUMBER			7


#define SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS		0x0001
#define SSL3_FLAGS_DELAY_CLIENT_FINISHED		0x0002
#define SSL3_FLAGS_POP_BUFFER				0x0004
#define TLS1_FLAGS_TLS_PADDING_BUG			0x0008
#define SSL3_FLAGS_ALLOW_UNSAFE_LEGACY_RENEGOTIATION	0x0010

typedef struct ssl3_state_st
	{
	long flags;
	int delay_buf_pop_ret;

	unsigned char read_sequence[8];
	unsigned char read_mac_secret[EVP_MAX_MD_SIZE];
	unsigned char write_sequence[8];
	unsigned char write_mac_secret[EVP_MAX_MD_SIZE];

	unsigned char server_random[SSL3_RANDOM_SIZE];
	unsigned char client_random[SSL3_RANDOM_SIZE];

	/* flags for countermeasure against known-IV weakness */
	int need_empty_fragments;
	int empty_fragment_done;

	SSL3_BUFFER rbuf;	/* read IO goes into here */
	SSL3_BUFFER wbuf;	/* write IO goes into here */

	SSL3_RECORD rrec;	/* each decoded record goes in here */
	SSL3_RECORD wrec;	/* goes out from here */

	/* storage for Alert/Handshake protocol data received but not
	 * yet processed by ssl3_read_bytes: */
	unsigned char alert_fragment[2];
	unsigned int alert_fragment_len;
	unsigned char handshake_fragment[4];
	unsigned int handshake_fragment_len;

	/* partial write - check the numbers match */
	unsigned int wnum;	/* number of bytes sent so far */
	int wpend_tot;		/* number bytes written */
	int wpend_type;
	int wpend_ret;		/* number of bytes submitted */
	const unsigned char *wpend_buf;

	/* used during startup, digest all incoming/outgoing packets */
	EVP_MD_CTX finish_dgst1;
	EVP_MD_CTX finish_dgst2;

	/* this is set whenerver we see a change_cipher_spec message
	 * come in when we are not looking for one */
	int change_cipher_spec;

	int warn_alert;
	int fatal_alert;
	/* we allow one fatal and one warning alert to be outstanding,
	 * send close alert via the warning alert */
	int alert_dispatch;
	unsigned char send_alert[2];

	/* This flag is set when we should renegotiate ASAP, basically when
	 * there is no more data in the read or write buffers */
	int renegotiate;
	int total_renegotiations;
	int num_renegotiations;

	int in_read_app_data;

	struct	{
		/* actually only needs to be 16+20 */
		unsigned char cert_verify_md[EVP_MAX_MD_SIZE*2];

		/* actually only need to be 16+20 for SSLv3 and 12 for TLS */
		unsigned char finish_md[EVP_MAX_MD_SIZE*2];
		int finish_md_len;
		unsigned char peer_finish_md[EVP_MAX_MD_SIZE*2];
		int peer_finish_md_len;
		
		unsigned long message_size;
		int message_type;

		/* used to hold the new cipher we are going to use */
		SSL_CIPHER *new_cipher;
#ifndef OPENSSL_NO_DH
		DH *dh;
#endif

#ifndef OPENSSL_NO_ECDH
		EC_KEY *ecdh; /* holds short lived ECDH key */
#endif

		/* used when SSL_ST_FLUSH_DATA is entered */
		int next_state;			

		int reuse_message;

		/* used for certificate requests */
		int cert_req;
		int ctype_num;
		char ctype[SSL3_CT_NUMBER];
		STACK_OF(X509_NAME) *ca_names;

		int use_rsa_tmp;

		int key_block_length;
		unsigned char *key_block;

		const EVP_CIPHER *new_sym_enc;
		const EVP_MD *new_hash;
#ifndef OPENSSL_NO_COMP
		const SSL_COMP *new_compression;
#else
		char *new_compression;
#endif
		int cert_request;
		} tmp;

	} SSL3_STATE;


/* SSLv3 */
/*client */
/* extra state */
#define SSL3_ST_CW_FLUSH		(0x100|SSL_ST_CONNECT)
/* write to server */
#define SSL3_ST_CW_CLNT_HELLO_A		(0x110|SSL_ST_CONNECT)
#define SSL3_ST_CW_CLNT_HELLO_B		(0x111|SSL_ST_CONNECT)
/* read from server */
#define SSL3_ST_CR_SRVR_HELLO_A		(0x120|SSL_ST_CONNECT)
#define SSL3_ST_CR_SRVR_HELLO_B		(0x121|SSL_ST_CONNECT)
#define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A (0x126|SSL_ST_CONNECT)
#define DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B (0x127|SSL_ST_CONNECT)
#define SSL3_ST_CR_CERT_A		(0x130|SSL_ST_CONNECT)
#define SSL3_ST_CR_CERT_B		(0x131|SSL_ST_CONNECT)
#define SSL3_ST_CR_KEY_EXCH_A		(0x140|SSL_ST_CONNECT)
#define SSL3_ST_CR_KEY_EXCH_B		(0x141|SSL_ST_CONNECT)
#define SSL3_ST_CR_CERT_REQ_A		(0x150|SSL_ST_CONNECT)
#define SSL3_ST_CR_CERT_REQ_B		(0x151|SSL_ST_CONNECT)
#define SSL3_ST_CR_SRVR_DONE_A		(0x160|SSL_ST_CONNECT)
#define SSL3_ST_CR_SRVR_DONE_B		(0x161|SSL_ST_CONNECT)
/* write to server */
#define SSL3_ST_CW_CERT_A		(0x170|SSL_ST_CONNECT)
#define SSL3_ST_CW_CERT_B		(0x171|SSL_ST_CONNECT)
#define SSL3_ST_CW_CERT_C		(0x172|SSL_ST_CONNECT)
#define SSL3_ST_CW_CERT_D		(0x173|SSL_ST_CONNECT)
#define SSL3_ST_CW_KEY_EXCH_A		(0x180|SSL_ST_CONNECT)
#define SSL3_ST_CW_KEY_EXCH_B		(0x181|SSL_ST_CONNECT)
#define SSL3_ST_CW_CERT_VRFY_A		(0x190|SSL_ST_CONNECT)
#define SSL3_ST_CW_CERT_VRFY_B		(0x191|SSL_ST_CONNECT)
#define SSL3_ST_CW_CHANGE_A		(0x1A0|SSL_ST_CONNECT)
#define SSL3_ST_CW_CHANGE_B		(0x1A1|SSL_ST_CONNECT)
#define SSL3_ST_CW_FINISHED_A		(0x1B0|SSL_ST_CONNECT)
#define SSL3_ST_CW_FINISHED_B		(0x1B1|SSL_ST_CONNECT)
/* read from server */
#define SSL3_ST_CR_CHANGE_A		(0x1C0|SSL_ST_CONNECT)
#define SSL3_ST_CR_CHANGE_B		(0x1C1|SSL_ST_CONNECT)
#define SSL3_ST_CR_FINISHED_A		(0x1D0|SSL_ST_CONNECT)
#define SSL3_ST_CR_FINISHED_B		(0x1D1|SSL_ST_CONNECT)
#define SSL3_ST_CR_SESSION_TICKET_A	(0x1E0|SSL_ST_CONNECT)
#define SSL3_ST_CR_SESSION_TICKET_B	(0x1E1|SSL_ST_CONNECT)
#define SSL3_ST_CR_CERT_STATUS_A	(0x1F0|SSL_ST_CONNECT)
#define SSL3_ST_CR_CERT_STATUS_B	(0x1F1|SSL_ST_CONNECT)

/* server */
/* extra state */
#define SSL3_ST_SW_FLUSH		(0x100|SSL_ST_ACCEPT)
/* read from client */
/* Do not change the number values, they do matter */
#define SSL3_ST_SR_CLNT_HELLO_A		(0x110|SSL_ST_ACCEPT)
#define SSL3_ST_SR_CLNT_HELLO_B		(0x111|SSL_ST_ACCEPT)
#define SSL3_ST_SR_CLNT_HELLO_C		(0x112|SSL_ST_ACCEPT)
/* write to client */
#define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_A (0x113|SSL_ST_ACCEPT)
#define DTLS1_ST_SW_HELLO_VERIFY_REQUEST_B (0x114|SSL_ST_ACCEPT)
#define SSL3_ST_SW_HELLO_REQ_A		(0x120|SSL_ST_ACCEPT)
#define SSL3_ST_SW_HELLO_REQ_B		(0x121|SSL_ST_ACCEPT)
#define SSL3_ST_SW_HELLO_REQ_C		(0x122|SSL_ST_ACCEPT)
#define SSL3_ST_SW_SRVR_HELLO_A		(0x130|SSL_ST_ACCEPT)
#define SSL3_ST_SW_SRVR_HELLO_B		(0x131|SSL_ST_ACCEPT)
#define SSL3_ST_SW_CERT_A		(0x140|SSL_ST_ACCEPT)
#define SSL3_ST_SW_CERT_B		(0x141|SSL_ST_ACCEPT)
#define SSL3_ST_SW_KEY_EXCH_A		(0x150|SSL_ST_ACCEPT)
#define SSL3_ST_SW_KEY_EXCH_B		(0x151|SSL_ST_ACCEPT)
#define SSL3_ST_SW_CERT_REQ_A		(0x160|SSL_ST_ACCEPT)
#define SSL3_ST_SW_CERT_REQ_B		(0x161|SSL_ST_ACCEPT)
#define SSL3_ST_SW_SRVR_DONE_A		(0x170|SSL_ST_ACCEPT)
#define SSL3_ST_SW_SRVR_DONE_B		(0x171|SSL_ST_ACCEPT)
/* read from client */
#define SSL3_ST_SR_CERT_A		(0x180|SSL_ST_ACCEPT)
#define SSL3_ST_SR_CERT_B		(0x181|SSL_ST_ACCEPT)
#define SSL3_ST_SR_KEY_EXCH_A		(0x190|SSL_ST_ACCEPT)
#define SSL3_ST_SR_KEY_EXCH_B		(0x191|SSL_ST_ACCEPT)
#define SSL3_ST_SR_CERT_VRFY_A		(0x1A0|SSL_ST_ACCEPT)
#define SSL3_ST_SR_CERT_VRFY_B		(0x1A1|SSL_ST_ACCEPT)
#define SSL3_ST_SR_CHANGE_A		(0x1B0|SSL_ST_ACCEPT)
#define SSL3_ST_SR_CHANGE_B		(0x1B1|SSL_ST_ACCEPT)
#define SSL3_ST_SR_FINISHED_A		(0x1C0|SSL_ST_ACCEPT)
#define SSL3_ST_SR_FINISHED_B		(0x1C1|SSL_ST_ACCEPT)
/* write to client */
#define SSL3_ST_SW_CHANGE_A		(0x1D0|SSL_ST_ACCEPT)
#define SSL3_ST_SW_CHANGE_B		(0x1D1|SSL_ST_ACCEPT)
#define SSL3_ST_SW_FINISHED_A		(0x1E0|SSL_ST_ACCEPT)
#define SSL3_ST_SW_FINISHED_B		(0x1E1|SSL_ST_ACCEPT)
#define SSL3_ST_SW_SESSION_TICKET_A	(0x1F0|SSL_ST_ACCEPT)
#define SSL3_ST_SW_SESSION_TICKET_B	(0x1F1|SSL_ST_ACCEPT)
#define SSL3_ST_SW_CERT_STATUS_A	(0x200|SSL_ST_ACCEPT)
#define SSL3_ST_SW_CERT_STATUS_B	(0x201|SSL_ST_ACCEPT)

#define SSL3_MT_HELLO_REQUEST			0
#define SSL3_MT_CLIENT_HELLO			1
#define SSL3_MT_SERVER_HELLO			2
#define	SSL3_MT_NEWSESSION_TICKET		4
#define SSL3_MT_CERTIFICATE			11
#define SSL3_MT_SERVER_KEY_EXCHANGE		12
#define SSL3_MT_CERTIFICATE_REQUEST		13
#define SSL3_MT_SERVER_DONE			14
#define SSL3_MT_CERTIFICATE_VERIFY		15
#define SSL3_MT_CLIENT_KEY_EXCHANGE		16
#define SSL3_MT_FINISHED			20
#define SSL3_MT_CERTIFICATE_STATUS		22
#define DTLS1_MT_HELLO_VERIFY_REQUEST    3


#define SSL3_MT_CCS				1

/* These are used when changing over to a new cipher */
#define SSL3_CC_READ		0x01
#define SSL3_CC_WRITE		0x02
#define SSL3_CC_CLIENT		0x10
#define SSL3_CC_SERVER		0x20
#define SSL3_CHANGE_CIPHER_CLIENT_WRITE	(SSL3_CC_CLIENT|SSL3_CC_WRITE)	
#define SSL3_CHANGE_CIPHER_SERVER_READ	(SSL3_CC_SERVER|SSL3_CC_READ)
#define SSL3_CHANGE_CIPHER_CLIENT_READ	(SSL3_CC_CLIENT|SSL3_CC_READ)
#define SSL3_CHANGE_CIPHER_SERVER_WRITE	(SSL3_CC_SERVER|SSL3_CC_WRITE)

#ifdef  __cplusplus
}
#endif
#endif

xmail-1.27/win32ssl/include/openssl/rand.h0000755000175000017500000001414211341640430017717 0ustar  davidedavide/* crypto/rand/rand.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_RAND_H
#define HEADER_RAND_H

#include 
#include 
#include 

#if defined(OPENSSL_SYS_WINDOWS)
#include 
#endif

#ifdef  __cplusplus
extern "C" {
#endif

#if defined(OPENSSL_FIPS)
#define FIPS_RAND_SIZE_T int
#endif

/* Already defined in ossl_typ.h */
/* typedef struct rand_meth_st RAND_METHOD; */

struct rand_meth_st
	{
	void (*seed)(const void *buf, int num);
	int (*bytes)(unsigned char *buf, int num);
	void (*cleanup)(void);
	void (*add)(const void *buf, int num, double entropy);
	int (*pseudorand)(unsigned char *buf, int num);
	int (*status)(void);
	};

#ifdef BN_DEBUG
extern int rand_predictable;
#endif

int RAND_set_rand_method(const RAND_METHOD *meth);
const RAND_METHOD *RAND_get_rand_method(void);
#ifndef OPENSSL_NO_ENGINE
int RAND_set_rand_engine(ENGINE *engine);
#endif
RAND_METHOD *RAND_SSLeay(void);
void RAND_cleanup(void );
int  RAND_bytes(unsigned char *buf,int num);
int  RAND_pseudo_bytes(unsigned char *buf,int num);
void RAND_seed(const void *buf,int num);
void RAND_add(const void *buf,int num,double entropy);
int  RAND_load_file(const char *file,long max_bytes);
int  RAND_write_file(const char *file);
const char *RAND_file_name(char *file,size_t num);
int RAND_status(void);
int RAND_query_egd_bytes(const char *path, unsigned char *buf, int bytes);
int RAND_egd(const char *path);
int RAND_egd_bytes(const char *path,int bytes);
int RAND_poll(void);
#ifndef OPENSSL_NO_ENGINE
#ifdef OPENSSL_FIPS
void int_RAND_init_engine_callbacks(void);
void int_RAND_set_callbacks(
	int (*set_rand_func)(const RAND_METHOD *meth,
						const RAND_METHOD **pmeth),
	const RAND_METHOD *(*get_rand_func)(const RAND_METHOD **pmeth));
#endif
#endif

#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32)

void RAND_screen(void);
int RAND_event(UINT, WPARAM, LPARAM);

#endif

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_RAND_strings(void);

/* Error codes for the RAND functions. */

/* Function codes. */
#define RAND_F_ENG_RAND_GET_RAND_METHOD			 108
#define RAND_F_FIPS_RAND				 103
#define RAND_F_FIPS_RAND_BYTES				 102
#define RAND_F_FIPS_RAND_GET_RAND_METHOD		 109
#define RAND_F_FIPS_RAND_SET_DT				 106
#define RAND_F_FIPS_SET_DT				 104
#define RAND_F_FIPS_SET_PRNG_SEED			 107
#define RAND_F_FIPS_SET_TEST_MODE			 105
#define RAND_F_RAND_GET_RAND_METHOD			 101
#define RAND_F_SSLEAY_RAND_BYTES			 100

/* Reason codes. */
#define RAND_R_NON_FIPS_METHOD				 105
#define RAND_R_NOT_IN_TEST_MODE				 106
#define RAND_R_NO_KEY_SET				 107
#define RAND_R_PRNG_ASKING_FOR_TOO_MUCH			 101
#define RAND_R_PRNG_ERROR				 108
#define RAND_R_PRNG_KEYED				 109
#define RAND_R_PRNG_NOT_REKEYED				 102
#define RAND_R_PRNG_NOT_RESEEDED			 103
#define RAND_R_PRNG_NOT_SEEDED				 100
#define RAND_R_PRNG_SEED_MUST_NOT_MATCH_KEY		 110
#define RAND_R_PRNG_STUCK				 104

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/krb5_asn.h0000755000175000017500000001673211341640430020506 0ustar  davidedavide/* krb5_asn.h */
/* Written by Vern Staats  for the OpenSSL project,
** using ocsp/{*.h,*asn*.c} as a starting point
*/

/* ====================================================================
 * Copyright (c) 1998-2000 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 * ====================================================================
 *
 * This product includes cryptographic software written by Eric Young
 * (eay@cryptsoft.com).  This product includes software written by Tim
 * Hudson (tjh@cryptsoft.com).
 *
 */

#ifndef HEADER_KRB5_ASN_H
#define HEADER_KRB5_ASN_H

/*
#include 
*/
#include 

#ifdef  __cplusplus
extern "C" {
#endif


/*	ASN.1 from Kerberos RFC 1510
*/

/*	EncryptedData ::=   SEQUENCE {
**		etype[0]                      INTEGER, -- EncryptionType
**		kvno[1]                       INTEGER OPTIONAL,
**		cipher[2]                     OCTET STRING -- ciphertext
**	}
*/
typedef	struct	krb5_encdata_st
	{
	ASN1_INTEGER			*etype;
	ASN1_INTEGER			*kvno;
	ASN1_OCTET_STRING		*cipher;
	}	KRB5_ENCDATA;

DECLARE_STACK_OF(KRB5_ENCDATA)

/*	PrincipalName ::=   SEQUENCE {
**		name-type[0]                  INTEGER,
**		name-string[1]                SEQUENCE OF GeneralString
**	}
*/
typedef	struct	krb5_princname_st
	{
	ASN1_INTEGER			*nametype;
	STACK_OF(ASN1_GENERALSTRING)	*namestring;
	}	KRB5_PRINCNAME;

DECLARE_STACK_OF(KRB5_PRINCNAME)


/*	Ticket ::=	[APPLICATION 1] SEQUENCE {
**		tkt-vno[0]                    INTEGER,
**		realm[1]                      Realm,
**		sname[2]                      PrincipalName,
**		enc-part[3]                   EncryptedData
**	}
*/
typedef	struct	krb5_tktbody_st
	{
	ASN1_INTEGER			*tktvno;
	ASN1_GENERALSTRING		*realm;
	KRB5_PRINCNAME			*sname;
	KRB5_ENCDATA			*encdata;
	}	KRB5_TKTBODY;

typedef STACK_OF(KRB5_TKTBODY) KRB5_TICKET;
DECLARE_STACK_OF(KRB5_TKTBODY)


/*	AP-REQ ::=      [APPLICATION 14] SEQUENCE {
**		pvno[0]                       INTEGER,
**		msg-type[1]                   INTEGER,
**		ap-options[2]                 APOptions,
**		ticket[3]                     Ticket,
**		authenticator[4]              EncryptedData
**	}
**
**	APOptions ::=   BIT STRING {
**		reserved(0), use-session-key(1), mutual-required(2) }
*/
typedef	struct	krb5_ap_req_st
	{
	ASN1_INTEGER			*pvno;
	ASN1_INTEGER			*msgtype;
	ASN1_BIT_STRING			*apoptions;
	KRB5_TICKET			*ticket;
	KRB5_ENCDATA			*authenticator;
	}	KRB5_APREQBODY;

typedef STACK_OF(KRB5_APREQBODY) KRB5_APREQ;
DECLARE_STACK_OF(KRB5_APREQBODY)


/*	Authenticator Stuff	*/


/*	Checksum ::=   SEQUENCE {
**		cksumtype[0]                  INTEGER,
**		checksum[1]                   OCTET STRING
**	}
*/
typedef	struct	krb5_checksum_st
	{
	ASN1_INTEGER			*ctype;
	ASN1_OCTET_STRING		*checksum;
	}	KRB5_CHECKSUM;

DECLARE_STACK_OF(KRB5_CHECKSUM)


/*	EncryptionKey ::=   SEQUENCE {
**		keytype[0]                    INTEGER,
**		keyvalue[1]                   OCTET STRING
**	}
*/
typedef struct  krb5_encryptionkey_st
	{
	ASN1_INTEGER			*ktype;
	ASN1_OCTET_STRING		*keyvalue;
	}	KRB5_ENCKEY;

DECLARE_STACK_OF(KRB5_ENCKEY)


/*	AuthorizationData ::=   SEQUENCE OF SEQUENCE {
**		ad-type[0]                    INTEGER,
**              ad-data[1]                    OCTET STRING
**	}
*/
typedef struct	krb5_authorization_st
	{
	ASN1_INTEGER			*adtype;
	ASN1_OCTET_STRING		*addata;
	}	KRB5_AUTHDATA;

DECLARE_STACK_OF(KRB5_AUTHDATA)

			
/*	-- Unencrypted authenticator
**	Authenticator ::=    [APPLICATION 2] SEQUENCE    {
**		authenticator-vno[0]          INTEGER,
**		crealm[1]                     Realm,
**		cname[2]                      PrincipalName,
**		cksum[3]                      Checksum OPTIONAL,
**		cusec[4]                      INTEGER,
**		ctime[5]                      KerberosTime,
**		subkey[6]                     EncryptionKey OPTIONAL,
**		seq-number[7]                 INTEGER OPTIONAL,
**		authorization-data[8]         AuthorizationData OPTIONAL
**	}
*/
typedef struct	krb5_authenticator_st
	{
	ASN1_INTEGER			*avno;
	ASN1_GENERALSTRING		*crealm;
	KRB5_PRINCNAME			*cname;
	KRB5_CHECKSUM			*cksum;
	ASN1_INTEGER			*cusec;
	ASN1_GENERALIZEDTIME		*ctime;
	KRB5_ENCKEY			*subkey;
	ASN1_INTEGER			*seqnum;
	KRB5_AUTHDATA			*authorization;
	}	KRB5_AUTHENTBODY;

typedef STACK_OF(KRB5_AUTHENTBODY) KRB5_AUTHENT;
DECLARE_STACK_OF(KRB5_AUTHENTBODY)


/*  DECLARE_ASN1_FUNCTIONS(type) = DECLARE_ASN1_FUNCTIONS_name(type, type) =
**	type *name##_new(void);
**	void name##_free(type *a);
**	DECLARE_ASN1_ENCODE_FUNCTIONS(type, name, name) =
**	 DECLARE_ASN1_ENCODE_FUNCTIONS(type, itname, name) =
**	  type *d2i_##name(type **a, const unsigned char **in, long len);
**	  int i2d_##name(type *a, unsigned char **out);
**	  DECLARE_ASN1_ITEM(itname) = OPENSSL_EXTERN const ASN1_ITEM itname##_it
*/

DECLARE_ASN1_FUNCTIONS(KRB5_ENCDATA)
DECLARE_ASN1_FUNCTIONS(KRB5_PRINCNAME)
DECLARE_ASN1_FUNCTIONS(KRB5_TKTBODY)
DECLARE_ASN1_FUNCTIONS(KRB5_APREQBODY)
DECLARE_ASN1_FUNCTIONS(KRB5_TICKET)
DECLARE_ASN1_FUNCTIONS(KRB5_APREQ)

DECLARE_ASN1_FUNCTIONS(KRB5_CHECKSUM)
DECLARE_ASN1_FUNCTIONS(KRB5_ENCKEY)
DECLARE_ASN1_FUNCTIONS(KRB5_AUTHDATA)
DECLARE_ASN1_FUNCTIONS(KRB5_AUTHENTBODY)
DECLARE_ASN1_FUNCTIONS(KRB5_AUTHENT)


/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */

#ifdef  __cplusplus
}
#endif
#endif

xmail-1.27/win32ssl/include/openssl/asn1_mac.h0000755000175000017500000004501411341640430020457 0ustar  davidedavide/* crypto/asn1/asn1_mac.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_ASN1_MAC_H
#define HEADER_ASN1_MAC_H

#include 

#ifdef  __cplusplus
extern "C" {
#endif

#ifndef ASN1_MAC_ERR_LIB
#define ASN1_MAC_ERR_LIB	ERR_LIB_ASN1
#endif 

#define ASN1_MAC_H_err(f,r,line) \
	ERR_PUT_error(ASN1_MAC_ERR_LIB,(f),(r),__FILE__,(line))

#define M_ASN1_D2I_vars(a,type,func) \
	ASN1_const_CTX c; \
	type ret=NULL; \
	\
	c.pp=(const unsigned char **)pp; \
	c.q= *(const unsigned char **)pp; \
	c.error=ERR_R_NESTED_ASN1_ERROR; \
	if ((a == NULL) || ((*a) == NULL)) \
		{ if ((ret=(type)func()) == NULL) \
			{ c.line=__LINE__; goto err; } } \
	else	ret=(*a);

#define M_ASN1_D2I_Init() \
	c.p= *(const unsigned char **)pp; \
	c.max=(length == 0)?0:(c.p+length);

#define M_ASN1_D2I_Finish_2(a) \
	if (!asn1_const_Finish(&c)) \
		{ c.line=__LINE__; goto err; } \
	*(const unsigned char **)pp=c.p; \
	if (a != NULL) (*a)=ret; \
	return(ret);

#define M_ASN1_D2I_Finish(a,func,e) \
	M_ASN1_D2I_Finish_2(a); \
err:\
	ASN1_MAC_H_err((e),c.error,c.line); \
	asn1_add_error(*(const unsigned char **)pp,(int)(c.q- *pp)); \
	if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \
	return(NULL)

#define M_ASN1_D2I_start_sequence() \
	if (!asn1_GetSequence(&c,&length)) \
		{ c.line=__LINE__; goto err; }
/* Begin reading ASN1 without a surrounding sequence */
#define M_ASN1_D2I_begin() \
	c.slen = length;

/* End reading ASN1 with no check on length */
#define M_ASN1_D2I_Finish_nolen(a, func, e) \
	*pp=c.p; \
	if (a != NULL) (*a)=ret; \
	return(ret); \
err:\
	ASN1_MAC_H_err((e),c.error,c.line); \
	asn1_add_error(*pp,(int)(c.q- *pp)); \
	if ((ret != NULL) && ((a == NULL) || (*a != ret))) func(ret); \
	return(NULL)

#define M_ASN1_D2I_end_sequence() \
	(((c.inf&1) == 0)?(c.slen <= 0): \
		(c.eos=ASN1_const_check_infinite_end(&c.p,c.slen)))

/* Don't use this with d2i_ASN1_BOOLEAN() */
#define M_ASN1_D2I_get(b, func) \
	c.q=c.p; \
	if (func(&(b),&c.p,c.slen) == NULL) \
		{c.line=__LINE__; goto err; } \
	c.slen-=(c.p-c.q);

/* Don't use this with d2i_ASN1_BOOLEAN() */
#define M_ASN1_D2I_get_x(type,b,func) \
	c.q=c.p; \
	if (((D2I_OF(type))func)(&(b),&c.p,c.slen) == NULL) \
		{c.line=__LINE__; goto err; } \
	c.slen-=(c.p-c.q);

/* use this instead () */
#define M_ASN1_D2I_get_int(b,func) \
	c.q=c.p; \
	if (func(&(b),&c.p,c.slen) < 0) \
		{c.line=__LINE__; goto err; } \
	c.slen-=(c.p-c.q);

#define M_ASN1_D2I_get_opt(b,func,type) \
	if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) \
		== (V_ASN1_UNIVERSAL|(type)))) \
		{ \
		M_ASN1_D2I_get(b,func); \
		}

#define M_ASN1_D2I_get_imp(b,func, type) \
	M_ASN1_next=(_tmp& V_ASN1_CONSTRUCTED)|type; \
	c.q=c.p; \
	if (func(&(b),&c.p,c.slen) == NULL) \
		{c.line=__LINE__; M_ASN1_next_prev = _tmp; goto err; } \
	c.slen-=(c.p-c.q);\
	M_ASN1_next_prev=_tmp;

#define M_ASN1_D2I_get_IMP_opt(b,func,tag,type) \
	if ((c.slen != 0) && ((M_ASN1_next & (~V_ASN1_CONSTRUCTED)) == \
		(V_ASN1_CONTEXT_SPECIFIC|(tag)))) \
		{ \
		unsigned char _tmp = M_ASN1_next; \
		M_ASN1_D2I_get_imp(b,func, type);\
		}

#define M_ASN1_D2I_get_set(r,func,free_func) \
		M_ASN1_D2I_get_imp_set(r,func,free_func, \
			V_ASN1_SET,V_ASN1_UNIVERSAL);

#define M_ASN1_D2I_get_set_type(type,r,func,free_func) \
		M_ASN1_D2I_get_imp_set_type(type,r,func,free_func, \
			V_ASN1_SET,V_ASN1_UNIVERSAL);

#define M_ASN1_D2I_get_set_opt(r,func,free_func) \
	if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
		V_ASN1_CONSTRUCTED|V_ASN1_SET)))\
		{ M_ASN1_D2I_get_set(r,func,free_func); }

#define M_ASN1_D2I_get_set_opt_type(type,r,func,free_func) \
	if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
		V_ASN1_CONSTRUCTED|V_ASN1_SET)))\
		{ M_ASN1_D2I_get_set_type(type,r,func,free_func); }

#define M_ASN1_I2D_len_SET_opt(a,f) \
	if ((a != NULL) && (sk_num(a) != 0)) \
		M_ASN1_I2D_len_SET(a,f);

#define M_ASN1_I2D_put_SET_opt(a,f) \
	if ((a != NULL) && (sk_num(a) != 0)) \
		M_ASN1_I2D_put_SET(a,f);

#define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \
	if ((a != NULL) && (sk_num(a) != 0)) \
		M_ASN1_I2D_put_SEQUENCE(a,f);

#define M_ASN1_I2D_put_SEQUENCE_opt_type(type,a,f) \
	if ((a != NULL) && (sk_##type##_num(a) != 0)) \
		M_ASN1_I2D_put_SEQUENCE_type(type,a,f);

#define M_ASN1_D2I_get_IMP_set_opt(b,func,free_func,tag) \
	if ((c.slen != 0) && \
		(M_ASN1_next == \
		(V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\
		{ \
		M_ASN1_D2I_get_imp_set(b,func,free_func,\
			tag,V_ASN1_CONTEXT_SPECIFIC); \
		}

#define M_ASN1_D2I_get_IMP_set_opt_type(type,b,func,free_func,tag) \
	if ((c.slen != 0) && \
		(M_ASN1_next == \
		(V_ASN1_CONTEXT_SPECIFIC|V_ASN1_CONSTRUCTED|(tag))))\
		{ \
		M_ASN1_D2I_get_imp_set_type(type,b,func,free_func,\
			tag,V_ASN1_CONTEXT_SPECIFIC); \
		}

#define M_ASN1_D2I_get_seq(r,func,free_func) \
		M_ASN1_D2I_get_imp_set(r,func,free_func,\
			V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL);

#define M_ASN1_D2I_get_seq_type(type,r,func,free_func) \
		M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\
					    V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL)

#define M_ASN1_D2I_get_seq_opt(r,func,free_func) \
	if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
		V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\
		{ M_ASN1_D2I_get_seq(r,func,free_func); }

#define M_ASN1_D2I_get_seq_opt_type(type,r,func,free_func) \
	if ((c.slen != 0) && (M_ASN1_next == (V_ASN1_UNIVERSAL| \
		V_ASN1_CONSTRUCTED|V_ASN1_SEQUENCE)))\
		{ M_ASN1_D2I_get_seq_type(type,r,func,free_func); }

#define M_ASN1_D2I_get_IMP_set(r,func,free_func,x) \
		M_ASN1_D2I_get_imp_set(r,func,free_func,\
			x,V_ASN1_CONTEXT_SPECIFIC);

#define M_ASN1_D2I_get_IMP_set_type(type,r,func,free_func,x) \
		M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,\
			x,V_ASN1_CONTEXT_SPECIFIC);

#define M_ASN1_D2I_get_imp_set(r,func,free_func,a,b) \
	c.q=c.p; \
	if (d2i_ASN1_SET(&(r),&c.p,c.slen,(char *(*)())func,\
		(void (*)())free_func,a,b) == NULL) \
		{ c.line=__LINE__; goto err; } \
	c.slen-=(c.p-c.q);

#define M_ASN1_D2I_get_imp_set_type(type,r,func,free_func,a,b) \
	c.q=c.p; \
	if (d2i_ASN1_SET_OF_##type(&(r),&c.p,c.slen,func,\
				   free_func,a,b) == NULL) \
		{ c.line=__LINE__; goto err; } \
	c.slen-=(c.p-c.q);

#define M_ASN1_D2I_get_set_strings(r,func,a,b) \
	c.q=c.p; \
	if (d2i_ASN1_STRING_SET(&(r),&c.p,c.slen,a,b) == NULL) \
		{ c.line=__LINE__; goto err; } \
	c.slen-=(c.p-c.q);

#define M_ASN1_D2I_get_EXP_opt(r,func,tag) \
	if ((c.slen != 0L) && (M_ASN1_next == \
		(V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
		{ \
		int Tinf,Ttag,Tclass; \
		long Tlen; \
		\
		c.q=c.p; \
		Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
		if (Tinf & 0x80) \
			{ c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
			c.line=__LINE__; goto err; } \
		if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
					Tlen = c.slen - (c.p - c.q) - 2; \
		if (func(&(r),&c.p,Tlen) == NULL) \
			{ c.line=__LINE__; goto err; } \
		if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
			Tlen = c.slen - (c.p - c.q); \
			if(!ASN1_const_check_infinite_end(&c.p, Tlen)) \
				{ c.error=ERR_R_MISSING_ASN1_EOS; \
				c.line=__LINE__; goto err; } \
		}\
		c.slen-=(c.p-c.q); \
		}

#define M_ASN1_D2I_get_EXP_set_opt(r,func,free_func,tag,b) \
	if ((c.slen != 0) && (M_ASN1_next == \
		(V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
		{ \
		int Tinf,Ttag,Tclass; \
		long Tlen; \
		\
		c.q=c.p; \
		Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
		if (Tinf & 0x80) \
			{ c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
			c.line=__LINE__; goto err; } \
		if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
					Tlen = c.slen - (c.p - c.q) - 2; \
		if (d2i_ASN1_SET(&(r),&c.p,Tlen,(char *(*)())func, \
			(void (*)())free_func, \
			b,V_ASN1_UNIVERSAL) == NULL) \
			{ c.line=__LINE__; goto err; } \
		if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
			Tlen = c.slen - (c.p - c.q); \
			if(!ASN1_check_infinite_end(&c.p, Tlen)) \
				{ c.error=ERR_R_MISSING_ASN1_EOS; \
				c.line=__LINE__; goto err; } \
		}\
		c.slen-=(c.p-c.q); \
		}

#define M_ASN1_D2I_get_EXP_set_opt_type(type,r,func,free_func,tag,b) \
	if ((c.slen != 0) && (M_ASN1_next == \
		(V_ASN1_CONSTRUCTED|V_ASN1_CONTEXT_SPECIFIC|tag))) \
		{ \
		int Tinf,Ttag,Tclass; \
		long Tlen; \
		\
		c.q=c.p; \
		Tinf=ASN1_get_object(&c.p,&Tlen,&Ttag,&Tclass,c.slen); \
		if (Tinf & 0x80) \
			{ c.error=ERR_R_BAD_ASN1_OBJECT_HEADER; \
			c.line=__LINE__; goto err; } \
		if (Tinf == (V_ASN1_CONSTRUCTED+1)) \
					Tlen = c.slen - (c.p - c.q) - 2; \
		if (d2i_ASN1_SET_OF_##type(&(r),&c.p,Tlen,func, \
			free_func,b,V_ASN1_UNIVERSAL) == NULL) \
			{ c.line=__LINE__; goto err; } \
		if (Tinf == (V_ASN1_CONSTRUCTED+1)) { \
			Tlen = c.slen - (c.p - c.q); \
			if(!ASN1_check_infinite_end(&c.p, Tlen)) \
				{ c.error=ERR_R_MISSING_ASN1_EOS; \
				c.line=__LINE__; goto err; } \
		}\
		c.slen-=(c.p-c.q); \
		}

/* New macros */
#define M_ASN1_New_Malloc(ret,type) \
	if ((ret=(type *)OPENSSL_malloc(sizeof(type))) == NULL) \
		{ c.line=__LINE__; goto err2; }

#define M_ASN1_New(arg,func) \
	if (((arg)=func()) == NULL) return(NULL)

#define M_ASN1_New_Error(a) \
/*	err:	ASN1_MAC_H_err((a),ERR_R_NESTED_ASN1_ERROR,c.line); \
		return(NULL);*/ \
	err2:	ASN1_MAC_H_err((a),ERR_R_MALLOC_FAILURE,c.line); \
		return(NULL)


/* BIG UGLY WARNING!  This is so damn ugly I wanna puke.  Unfortunately,
   some macros that use ASN1_const_CTX still insist on writing in the input
   stream.  ARGH!  ARGH!  ARGH!  Let's get rid of this macro package.
   Please?						-- Richard Levitte */
#define M_ASN1_next		(*((unsigned char *)(c.p)))
#define M_ASN1_next_prev	(*((unsigned char *)(c.q)))

/*************************************************/

#define M_ASN1_I2D_vars(a)	int r=0,ret=0; \
				unsigned char *p; \
				if (a == NULL) return(0)

/* Length Macros */
#define M_ASN1_I2D_len(a,f)	ret+=f(a,NULL)
#define M_ASN1_I2D_len_IMP_opt(a,f)	if (a != NULL) M_ASN1_I2D_len(a,f)

#define M_ASN1_I2D_len_SET(a,f) \
		ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET);

#define M_ASN1_I2D_len_SET_type(type,a,f) \
		ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SET, \
					    V_ASN1_UNIVERSAL,IS_SET);

#define M_ASN1_I2D_len_SEQUENCE(a,f) \
		ret+=i2d_ASN1_SET(a,NULL,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \
				  IS_SEQUENCE);

#define M_ASN1_I2D_len_SEQUENCE_type(type,a,f) \
		ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,V_ASN1_SEQUENCE, \
					    V_ASN1_UNIVERSAL,IS_SEQUENCE)

#define M_ASN1_I2D_len_SEQUENCE_opt(a,f) \
		if ((a != NULL) && (sk_num(a) != 0)) \
			M_ASN1_I2D_len_SEQUENCE(a,f);

#define M_ASN1_I2D_len_SEQUENCE_opt_type(type,a,f) \
		if ((a != NULL) && (sk_##type##_num(a) != 0)) \
			M_ASN1_I2D_len_SEQUENCE_type(type,a,f);

#define M_ASN1_I2D_len_IMP_SET(a,f,x) \
		ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET);

#define M_ASN1_I2D_len_IMP_SET_type(type,a,f,x) \
		ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \
					    V_ASN1_CONTEXT_SPECIFIC,IS_SET);

#define M_ASN1_I2D_len_IMP_SET_opt(a,f,x) \
		if ((a != NULL) && (sk_num(a) != 0)) \
			ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \
					  IS_SET);

#define M_ASN1_I2D_len_IMP_SET_opt_type(type,a,f,x) \
		if ((a != NULL) && (sk_##type##_num(a) != 0)) \
			ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \
					       V_ASN1_CONTEXT_SPECIFIC,IS_SET);

#define M_ASN1_I2D_len_IMP_SEQUENCE(a,f,x) \
		ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \
				  IS_SEQUENCE);

#define M_ASN1_I2D_len_IMP_SEQUENCE_opt(a,f,x) \
		if ((a != NULL) && (sk_num(a) != 0)) \
			ret+=i2d_ASN1_SET(a,NULL,f,x,V_ASN1_CONTEXT_SPECIFIC, \
					  IS_SEQUENCE);

#define M_ASN1_I2D_len_IMP_SEQUENCE_opt_type(type,a,f,x) \
		if ((a != NULL) && (sk_##type##_num(a) != 0)) \
			ret+=i2d_ASN1_SET_OF_##type(a,NULL,f,x, \
						    V_ASN1_CONTEXT_SPECIFIC, \
						    IS_SEQUENCE);

#define M_ASN1_I2D_len_EXP_opt(a,f,mtag,v) \
		if (a != NULL)\
			{ \
			v=f(a,NULL); \
			ret+=ASN1_object_size(1,v,mtag); \
			}

#define M_ASN1_I2D_len_EXP_SET_opt(a,f,mtag,tag,v) \
		if ((a != NULL) && (sk_num(a) != 0))\
			{ \
			v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL,IS_SET); \
			ret+=ASN1_object_size(1,v,mtag); \
			}

#define M_ASN1_I2D_len_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \
		if ((a != NULL) && (sk_num(a) != 0))\
			{ \
			v=i2d_ASN1_SET(a,NULL,f,tag,V_ASN1_UNIVERSAL, \
				       IS_SEQUENCE); \
			ret+=ASN1_object_size(1,v,mtag); \
			}

#define M_ASN1_I2D_len_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \
		if ((a != NULL) && (sk_##type##_num(a) != 0))\
			{ \
			v=i2d_ASN1_SET_OF_##type(a,NULL,f,tag, \
						 V_ASN1_UNIVERSAL, \
						 IS_SEQUENCE); \
			ret+=ASN1_object_size(1,v,mtag); \
			}

/* Put Macros */
#define M_ASN1_I2D_put(a,f)	f(a,&p)

#define M_ASN1_I2D_put_IMP_opt(a,f,t)	\
		if (a != NULL) \
			{ \
			unsigned char *q=p; \
			f(a,&p); \
			*q=(V_ASN1_CONTEXT_SPECIFIC|t|(*q&V_ASN1_CONSTRUCTED));\
			}

#define M_ASN1_I2D_put_SET(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SET,\
			V_ASN1_UNIVERSAL,IS_SET)
#define M_ASN1_I2D_put_SET_type(type,a,f) \
     i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET)
#define M_ASN1_I2D_put_IMP_SET(a,f,x) i2d_ASN1_SET(a,&p,f,x,\
			V_ASN1_CONTEXT_SPECIFIC,IS_SET)
#define M_ASN1_I2D_put_IMP_SET_type(type,a,f,x) \
     i2d_ASN1_SET_OF_##type(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC,IS_SET)
#define M_ASN1_I2D_put_IMP_SEQUENCE(a,f,x) i2d_ASN1_SET(a,&p,f,x,\
			V_ASN1_CONTEXT_SPECIFIC,IS_SEQUENCE)

#define M_ASN1_I2D_put_SEQUENCE(a,f) i2d_ASN1_SET(a,&p,f,V_ASN1_SEQUENCE,\
					     V_ASN1_UNIVERSAL,IS_SEQUENCE)

#define M_ASN1_I2D_put_SEQUENCE_type(type,a,f) \
     i2d_ASN1_SET_OF_##type(a,&p,f,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL, \
			    IS_SEQUENCE)

#define M_ASN1_I2D_put_SEQUENCE_opt(a,f) \
		if ((a != NULL) && (sk_num(a) != 0)) \
			M_ASN1_I2D_put_SEQUENCE(a,f);

#define M_ASN1_I2D_put_IMP_SET_opt(a,f,x) \
		if ((a != NULL) && (sk_num(a) != 0)) \
			{ i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \
				       IS_SET); }

#define M_ASN1_I2D_put_IMP_SET_opt_type(type,a,f,x) \
		if ((a != NULL) && (sk_##type##_num(a) != 0)) \
			{ i2d_ASN1_SET_OF_##type(a,&p,f,x, \
						 V_ASN1_CONTEXT_SPECIFIC, \
						 IS_SET); }

#define M_ASN1_I2D_put_IMP_SEQUENCE_opt(a,f,x) \
		if ((a != NULL) && (sk_num(a) != 0)) \
			{ i2d_ASN1_SET(a,&p,f,x,V_ASN1_CONTEXT_SPECIFIC, \
				       IS_SEQUENCE); }

#define M_ASN1_I2D_put_IMP_SEQUENCE_opt_type(type,a,f,x) \
		if ((a != NULL) && (sk_##type##_num(a) != 0)) \
			{ i2d_ASN1_SET_OF_##type(a,&p,f,x, \
						 V_ASN1_CONTEXT_SPECIFIC, \
						 IS_SEQUENCE); }

#define M_ASN1_I2D_put_EXP_opt(a,f,tag,v) \
		if (a != NULL) \
			{ \
			ASN1_put_object(&p,1,v,tag,V_ASN1_CONTEXT_SPECIFIC); \
			f(a,&p); \
			}

#define M_ASN1_I2D_put_EXP_SET_opt(a,f,mtag,tag,v) \
		if ((a != NULL) && (sk_num(a) != 0)) \
			{ \
			ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
			i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SET); \
			}

#define M_ASN1_I2D_put_EXP_SEQUENCE_opt(a,f,mtag,tag,v) \
		if ((a != NULL) && (sk_num(a) != 0)) \
			{ \
			ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
			i2d_ASN1_SET(a,&p,f,tag,V_ASN1_UNIVERSAL,IS_SEQUENCE); \
			}

#define M_ASN1_I2D_put_EXP_SEQUENCE_opt_type(type,a,f,mtag,tag,v) \
		if ((a != NULL) && (sk_##type##_num(a) != 0)) \
			{ \
			ASN1_put_object(&p,1,v,mtag,V_ASN1_CONTEXT_SPECIFIC); \
			i2d_ASN1_SET_OF_##type(a,&p,f,tag,V_ASN1_UNIVERSAL, \
					       IS_SEQUENCE); \
			}

#define M_ASN1_I2D_seq_total() \
		r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE); \
		if (pp == NULL) return(r); \
		p= *pp; \
		ASN1_put_object(&p,1,ret,V_ASN1_SEQUENCE,V_ASN1_UNIVERSAL)

#define M_ASN1_I2D_INF_seq_start(tag,ctx) \
		*(p++)=(V_ASN1_CONSTRUCTED|(tag)|(ctx)); \
		*(p++)=0x80

#define M_ASN1_I2D_INF_seq_end() *(p++)=0x00; *(p++)=0x00

#define M_ASN1_I2D_finish()	*pp=p; \
				return(r);

int asn1_GetSequence(ASN1_const_CTX *c, long *length);
void asn1_add_error(const unsigned char *address,int offset);
#ifdef  __cplusplus
}
#endif

#endif
xmail-1.27/win32ssl/include/openssl/fips.h0000755000175000017500000001345611341640430017743 0ustar  davidedavide/* ====================================================================
 * Copyright (c) 2003 The OpenSSL Project.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer. 
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. All advertising materials mentioning features or use of this
 *    software must display the following acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
 *
 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
 *    endorse or promote products derived from this software without
 *    prior written permission. For written permission, please contact
 *    openssl-core@openssl.org.
 *
 * 5. Products derived from this software may not be called "OpenSSL"
 *    nor may "OpenSSL" appear in their names without prior written
 *    permission of the OpenSSL Project.
 *
 * 6. Redistributions of any form whatsoever must retain the following
 *    acknowledgment:
 *    "This product includes software developed by the OpenSSL Project
 *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
 *
 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
 * OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

#include 

#ifndef OPENSSL_FIPS
#error FIPS is disabled.
#endif

#ifdef OPENSSL_FIPS

#ifdef  __cplusplus
extern "C" {
#endif

struct dsa_st;
struct evp_pkey_st;
struct env_md_st;
struct evp_cipher_st;
struct evp_cipher_ctx_st;

int FIPS_mode_set(int onoff);
int FIPS_mode(void);
const void *FIPS_rand_check(void);
int FIPS_selftest_failed(void);
void FIPS_selftest_check(void);
void FIPS_corrupt_sha1(void);
int FIPS_selftest_sha1(void);
void FIPS_corrupt_aes(void);
int FIPS_selftest_aes(void);
void FIPS_corrupt_des(void);
int FIPS_selftest_des(void);
void FIPS_corrupt_rsa(void);
void FIPS_corrupt_rsa_keygen(void);
int FIPS_selftest_rsa(void);
void FIPS_corrupt_dsa(void);
void FIPS_corrupt_dsa_keygen(void);
int FIPS_selftest_dsa(void);
void FIPS_corrupt_rng(void);
void FIPS_rng_stick(void);
int FIPS_selftest_rng(void);
int FIPS_selftest_hmac(void);

int fips_pkey_signature_test(struct evp_pkey_st *pkey,
			const unsigned char *tbs, int tbslen,
			const unsigned char *kat, unsigned int katlen,
			const struct env_md_st *digest, unsigned int md_flags,
			const char *fail_str);

int fips_cipher_test(struct evp_cipher_ctx_st *ctx,
			const struct evp_cipher_st *cipher,
			const unsigned char *key,
			const unsigned char *iv,
			const unsigned char *plaintext,
			const unsigned char *ciphertext,
			int len);

/* BEGIN ERROR CODES */
/* The following lines are auto generated by the script mkerr.pl. Any changes
 * made after this point may be overwritten when the script is next run.
 */
void ERR_load_FIPS_strings(void);

/* Error codes for the FIPS functions. */

/* Function codes. */
#define FIPS_F_DH_BUILTIN_GENPARAMS			 100
#define FIPS_F_DSA_BUILTIN_PARAMGEN			 101
#define FIPS_F_DSA_DO_SIGN				 102
#define FIPS_F_DSA_DO_VERIFY				 103
#define FIPS_F_EVP_CIPHERINIT_EX			 124
#define FIPS_F_EVP_DIGESTINIT_EX			 125
#define FIPS_F_FIPS_CHECK_DSA				 104
#define FIPS_F_FIPS_CHECK_INCORE_FINGERPRINT		 105
#define FIPS_F_FIPS_CHECK_RSA				 106
#define FIPS_F_FIPS_DSA_CHECK				 107
#define FIPS_F_FIPS_MODE_SET				 108
#define FIPS_F_FIPS_PKEY_SIGNATURE_TEST			 109
#define FIPS_F_FIPS_SELFTEST_AES			 110
#define FIPS_F_FIPS_SELFTEST_DES			 111
#define FIPS_F_FIPS_SELFTEST_DSA			 112
#define FIPS_F_FIPS_SELFTEST_HMAC			 113
#define FIPS_F_FIPS_SELFTEST_RNG			 114
#define FIPS_F_FIPS_SELFTEST_SHA1			 115
#define FIPS_F_HASH_FINAL				 123
#define FIPS_F_RSA_BUILTIN_KEYGEN			 116
#define FIPS_F_RSA_EAY_PRIVATE_DECRYPT			 117
#define FIPS_F_RSA_EAY_PRIVATE_ENCRYPT			 118
#define FIPS_F_RSA_EAY_PUBLIC_DECRYPT			 119
#define FIPS_F_RSA_EAY_PUBLIC_ENCRYPT			 120
#define FIPS_F_RSA_X931_GENERATE_KEY_EX			 121
#define FIPS_F_SSLEAY_RAND_BYTES			 122

/* Reason codes. */
#define FIPS_R_CANNOT_READ_EXE				 103
#define FIPS_R_CANNOT_READ_EXE_DIGEST			 104
#define FIPS_R_CONTRADICTING_EVIDENCE			 114
#define FIPS_R_EXE_DIGEST_DOES_NOT_MATCH		 105
#define FIPS_R_FINGERPRINT_DOES_NOT_MATCH		 110
#define FIPS_R_FINGERPRINT_DOES_NOT_MATCH_NONPIC_RELOCATED 111
#define FIPS_R_FINGERPRINT_DOES_NOT_MATCH_SEGMENT_ALIASING 112
#define FIPS_R_FIPS_MODE_ALREADY_SET			 102
#define FIPS_R_FIPS_SELFTEST_FAILED			 106
#define FIPS_R_INVALID_KEY_LENGTH			 109
#define FIPS_R_KEY_TOO_SHORT				 108
#define FIPS_R_NON_FIPS_METHOD				 100
#define FIPS_R_PAIRWISE_TEST_FAILED			 107
#define FIPS_R_RSA_DECRYPT_ERROR			 115
#define FIPS_R_RSA_ENCRYPT_ERROR			 116
#define FIPS_R_SELFTEST_FAILED				 101
#define FIPS_R_TEST_FAILURE				 117
#define FIPS_R_UNSUPPORTED_PLATFORM			 113

#ifdef  __cplusplus
}
#endif
#endif
xmail-1.27/win32ssl/include/openssl/sha.h0000755000175000017500000001633611341640430017555 0ustar  davidedavide/* crypto/sha/sha.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_SHA_H
#define HEADER_SHA_H

#include 
#include 

#ifdef  __cplusplus
extern "C" {
#endif

#if defined(OPENSSL_NO_SHA) || (defined(OPENSSL_NO_SHA0) && defined(OPENSSL_NO_SHA1))
#error SHA is disabled.
#endif

#if defined(OPENSSL_FIPS)
#define FIPS_SHA_SIZE_T size_t
#endif

/*
 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 * ! SHA_LONG has to be at least 32 bits wide. If it's wider, then !
 * ! SHA_LONG_LOG2 has to be defined along.                        !
 * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 */

#if defined(OPENSSL_SYS_WIN16) || defined(__LP32__)
#define SHA_LONG unsigned long
#elif defined(OPENSSL_SYS_CRAY) || defined(__ILP64__)
#define SHA_LONG unsigned long
#define SHA_LONG_LOG2 3
#else
#define SHA_LONG unsigned int
#endif

#define SHA_LBLOCK	16
#define SHA_CBLOCK	(SHA_LBLOCK*4)	/* SHA treats input data as a
					 * contiguous array of 32 bit
					 * wide big-endian values. */
#define SHA_LAST_BLOCK  (SHA_CBLOCK-8)
#define SHA_DIGEST_LENGTH 20

typedef struct SHAstate_st
	{
	SHA_LONG h0,h1,h2,h3,h4;
	SHA_LONG Nl,Nh;
	SHA_LONG data[SHA_LBLOCK];
	unsigned int num;
	} SHA_CTX;

#ifndef OPENSSL_NO_SHA0
#ifdef OPENSSL_FIPS
int private_SHA_Init(SHA_CTX *c);
#endif
int SHA_Init(SHA_CTX *c);
int SHA_Update(SHA_CTX *c, const void *data, size_t len);
int SHA_Final(unsigned char *md, SHA_CTX *c);
unsigned char *SHA(const unsigned char *d, size_t n, unsigned char *md);
void SHA_Transform(SHA_CTX *c, const unsigned char *data);
#endif
#ifndef OPENSSL_NO_SHA1
int SHA1_Init(SHA_CTX *c);
int SHA1_Update(SHA_CTX *c, const void *data, size_t len);
int SHA1_Final(unsigned char *md, SHA_CTX *c);
unsigned char *SHA1(const unsigned char *d, size_t n, unsigned char *md);
void SHA1_Transform(SHA_CTX *c, const unsigned char *data);
#endif

#define SHA256_CBLOCK	(SHA_LBLOCK*4)	/* SHA-256 treats input data as a
					 * contiguous array of 32 bit
					 * wide big-endian values. */
#define SHA224_DIGEST_LENGTH	28
#define SHA256_DIGEST_LENGTH	32

typedef struct SHA256state_st
	{
	SHA_LONG h[8];
	SHA_LONG Nl,Nh;
	SHA_LONG data[SHA_LBLOCK];
	unsigned int num,md_len;
	} SHA256_CTX;

#ifndef OPENSSL_NO_SHA256
int SHA224_Init(SHA256_CTX *c);
int SHA224_Update(SHA256_CTX *c, const void *data, size_t len);
int SHA224_Final(unsigned char *md, SHA256_CTX *c);
unsigned char *SHA224(const unsigned char *d, size_t n,unsigned char *md);
int SHA256_Init(SHA256_CTX *c);
int SHA256_Update(SHA256_CTX *c, const void *data, size_t len);
int SHA256_Final(unsigned char *md, SHA256_CTX *c);
unsigned char *SHA256(const unsigned char *d, size_t n,unsigned char *md);
void SHA256_Transform(SHA256_CTX *c, const unsigned char *data);
#endif

#define SHA384_DIGEST_LENGTH	48
#define SHA512_DIGEST_LENGTH	64

#ifndef OPENSSL_NO_SHA512
/*
 * Unlike 32-bit digest algorithms, SHA-512 *relies* on SHA_LONG64
 * being exactly 64-bit wide. See Implementation Notes in sha512.c
 * for further details.
 */
#define SHA512_CBLOCK	(SHA_LBLOCK*8)	/* SHA-512 treats input data as a
					 * contiguous array of 64 bit
					 * wide big-endian values. */
#if (defined(_WIN32) || defined(_WIN64)) && !defined(__MINGW32__)
#define SHA_LONG64 unsigned __int64
#define U64(C)     C##UI64
#elif defined(__arch64__)
#define SHA_LONG64 unsigned long
#define U64(C)     C##UL
#else
#define SHA_LONG64 unsigned long long
#define U64(C)     C##ULL
#endif

typedef struct SHA512state_st
	{
	SHA_LONG64 h[8];
	SHA_LONG64 Nl,Nh;
	union {
		SHA_LONG64	d[SHA_LBLOCK];
		unsigned char	p[SHA512_CBLOCK];
	} u;
	unsigned int num,md_len;
	} SHA512_CTX;
#endif

#ifndef OPENSSL_NO_SHA512
int SHA384_Init(SHA512_CTX *c);
int SHA384_Update(SHA512_CTX *c, const void *data, size_t len);
int SHA384_Final(unsigned char *md, SHA512_CTX *c);
unsigned char *SHA384(const unsigned char *d, size_t n,unsigned char *md);
int SHA512_Init(SHA512_CTX *c);
int SHA512_Update(SHA512_CTX *c, const void *data, size_t len);
int SHA512_Final(unsigned char *md, SHA512_CTX *c);
unsigned char *SHA512(const unsigned char *d, size_t n,unsigned char *md);
void SHA512_Transform(SHA512_CTX *c, const unsigned char *data);
#endif

#ifdef  __cplusplus
}
#endif

#endif
xmail-1.27/win32ssl/include/openssl/lhash.h0000755000175000017500000001640511341640430020076 0ustar  davidedavide/* crypto/lhash/lhash.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

/* Header for dynamic hash table routines
 * Author - Eric Young
 */

#ifndef HEADER_LHASH_H
#define HEADER_LHASH_H

#include 
#ifndef OPENSSL_NO_FP_API
#include 
#endif

#ifndef OPENSSL_NO_BIO
#include 
#endif

#ifdef  __cplusplus
extern "C" {
#endif

typedef struct lhash_node_st
	{
	void *data;
	struct lhash_node_st *next;
#ifndef OPENSSL_NO_HASH_COMP
	unsigned long hash;
#endif
	} LHASH_NODE;

typedef int (*LHASH_COMP_FN_TYPE)(const void *, const void *);
typedef unsigned long (*LHASH_HASH_FN_TYPE)(const void *);
typedef void (*LHASH_DOALL_FN_TYPE)(void *);
typedef void (*LHASH_DOALL_ARG_FN_TYPE)(void *, void *);

/* Macros for declaring and implementing type-safe wrappers for LHASH callbacks.
 * This way, callbacks can be provided to LHASH structures without function
 * pointer casting and the macro-defined callbacks provide per-variable casting
 * before deferring to the underlying type-specific callbacks. NB: It is
 * possible to place a "static" in front of both the DECLARE and IMPLEMENT
 * macros if the functions are strictly internal. */

/* First: "hash" functions */
#define DECLARE_LHASH_HASH_FN(f_name,o_type) \
	unsigned long f_name##_LHASH_HASH(const void *);
#define IMPLEMENT_LHASH_HASH_FN(f_name,o_type) \
	unsigned long f_name##_LHASH_HASH(const void *arg) { \
		o_type a = (o_type)arg; \
		return f_name(a); }
#define LHASH_HASH_FN(f_name) f_name##_LHASH_HASH

/* Second: "compare" functions */
#define DECLARE_LHASH_COMP_FN(f_name,o_type) \
	int f_name##_LHASH_COMP(const void *, const void *);
#define IMPLEMENT_LHASH_COMP_FN(f_name,o_type) \
	int f_name##_LHASH_COMP(const void *arg1, const void *arg2) { \
		o_type a = (o_type)arg1; \
		o_type b = (o_type)arg2; \
		return f_name(a,b); }
#define LHASH_COMP_FN(f_name) f_name##_LHASH_COMP

/* Third: "doall" functions */
#define DECLARE_LHASH_DOALL_FN(f_name,o_type) \
	void f_name##_LHASH_DOALL(void *);
#define IMPLEMENT_LHASH_DOALL_FN(f_name,o_type) \
	void f_name##_LHASH_DOALL(void *arg) { \
		o_type a = (o_type)arg; \
		f_name(a); }
#define LHASH_DOALL_FN(f_name) f_name##_LHASH_DOALL

/* Fourth: "doall_arg" functions */
#define DECLARE_LHASH_DOALL_ARG_FN(f_name,o_type,a_type) \
	void f_name##_LHASH_DOALL_ARG(void *, void *);
#define IMPLEMENT_LHASH_DOALL_ARG_FN(f_name,o_type,a_type) \
	void f_name##_LHASH_DOALL_ARG(void *arg1, void *arg2) { \
		o_type a = (o_type)arg1; \
		a_type b = (a_type)arg2; \
		f_name(a,b); }
#define LHASH_DOALL_ARG_FN(f_name) f_name##_LHASH_DOALL_ARG

typedef struct lhash_st
	{
	LHASH_NODE **b;
	LHASH_COMP_FN_TYPE comp;
	LHASH_HASH_FN_TYPE hash;
	unsigned int num_nodes;
	unsigned int num_alloc_nodes;
	unsigned int p;
	unsigned int pmax;
	unsigned long up_load; /* load times 256 */
	unsigned long down_load; /* load times 256 */
	unsigned long num_items;

	unsigned long num_expands;
	unsigned long num_expand_reallocs;
	unsigned long num_contracts;
	unsigned long num_contract_reallocs;
	unsigned long num_hash_calls;
	unsigned long num_comp_calls;
	unsigned long num_insert;
	unsigned long num_replace;
	unsigned long num_delete;
	unsigned long num_no_delete;
	unsigned long num_retrieve;
	unsigned long num_retrieve_miss;
	unsigned long num_hash_comps;

	int error;
	} LHASH;

#define LH_LOAD_MULT	256

/* Indicates a malloc() error in the last call, this is only bad
 * in lh_insert(). */
#define lh_error(lh)	((lh)->error)

LHASH *lh_new(LHASH_HASH_FN_TYPE h, LHASH_COMP_FN_TYPE c);
void lh_free(LHASH *lh);
void *lh_insert(LHASH *lh, void *data);
void *lh_delete(LHASH *lh, const void *data);
void *lh_retrieve(LHASH *lh, const void *data);
void lh_doall(LHASH *lh, LHASH_DOALL_FN_TYPE func);
void lh_doall_arg(LHASH *lh, LHASH_DOALL_ARG_FN_TYPE func, void *arg);
unsigned long lh_strhash(const char *c);
unsigned long lh_num_items(const LHASH *lh);

#ifndef OPENSSL_NO_FP_API
void lh_stats(const LHASH *lh, FILE *out);
void lh_node_stats(const LHASH *lh, FILE *out);
void lh_node_usage_stats(const LHASH *lh, FILE *out);
#endif

#ifndef OPENSSL_NO_BIO
void lh_stats_bio(const LHASH *lh, BIO *out);
void lh_node_stats_bio(const LHASH *lh, BIO *out);
void lh_node_usage_stats_bio(const LHASH *lh, BIO *out);
#endif
#ifdef  __cplusplus
}
#endif

#endif

xmail-1.27/win32ssl/include/openssl/err.h0000755000175000017500000003123111341640430017561 0ustar  davidedavide/* crypto/err/err.h */
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#ifndef HEADER_ERR_H
#define HEADER_ERR_H

#include 

#ifndef OPENSSL_NO_FP_API
#include 
#include 
#endif

#include 
#ifndef OPENSSL_NO_BIO
#include 
#endif
#ifndef OPENSSL_NO_LHASH
#include 
#endif

#ifdef	__cplusplus
extern "C" {
#endif

#ifndef OPENSSL_NO_ERR
#define ERR_PUT_error(a,b,c,d,e)	ERR_put_error(a,b,c,d,e)
#else
#define ERR_PUT_error(a,b,c,d,e)	ERR_put_error(a,b,c,NULL,0)
#endif

#include 

#define ERR_TXT_MALLOCED	0x01
#define ERR_TXT_STRING		0x02

#define ERR_FLAG_MARK		0x01

#define ERR_NUM_ERRORS	16
typedef struct err_state_st
	{
	unsigned long pid;
	int err_flags[ERR_NUM_ERRORS];
	unsigned long err_buffer[ERR_NUM_ERRORS];
	char *err_data[ERR_NUM_ERRORS];
	int err_data_flags[ERR_NUM_ERRORS];
	const char *err_file[ERR_NUM_ERRORS];
	int err_line[ERR_NUM_ERRORS];
	int top,bottom;
	} ERR_STATE;

/* library */
#define ERR_LIB_NONE		1
#define ERR_LIB_SYS		2
#define ERR_LIB_BN		3
#define ERR_LIB_RSA		4
#define ERR_LIB_DH		5
#define ERR_LIB_EVP		6
#define ERR_LIB_BUF		7
#define ERR_LIB_OBJ		8
#define ERR_LIB_PEM		9
#define ERR_LIB_DSA		10
#define ERR_LIB_X509		11
/* #define ERR_LIB_METH         12 */
#define ERR_LIB_ASN1		13
#define ERR_LIB_CONF		14
#define ERR_LIB_CRYPTO		15
#define ERR_LIB_EC		16
#define ERR_LIB_SSL		20
/* #define ERR_LIB_SSL23        21 */
/* #define ERR_LIB_SSL2         22 */
/* #define ERR_LIB_SSL3         23 */
/* #define ERR_LIB_RSAREF       30 */
/* #define ERR_LIB_PROXY        31 */
#define ERR_LIB_BIO		32
#define ERR_LIB_PKCS7		33
#define ERR_LIB_X509V3		34
#define ERR_LIB_PKCS12		35
#define ERR_LIB_RAND		36
#define ERR_LIB_DSO		37
#define ERR_LIB_ENGINE		38
#define ERR_LIB_OCSP            39
#define ERR_LIB_UI              40
#define ERR_LIB_COMP            41
#define ERR_LIB_ECDSA		42
#define ERR_LIB_ECDH		43
#define ERR_LIB_STORE           44
#define ERR_LIB_FIPS		45
#define ERR_LIB_CMS		46
#define ERR_LIB_JPAKE		47

#define ERR_LIB_USER		128

#define SYSerr(f,r)  ERR_PUT_error(ERR_LIB_SYS,(f),(r),__FILE__,__LINE__)
#define BNerr(f,r)   ERR_PUT_error(ERR_LIB_BN,(f),(r),__FILE__,__LINE__)
#define RSAerr(f,r)  ERR_PUT_error(ERR_LIB_RSA,(f),(r),__FILE__,__LINE__)
#define DHerr(f,r)   ERR_PUT_error(ERR_LIB_DH,(f),(r),__FILE__,__LINE__)
#define EVPerr(f,r)  ERR_PUT_error(ERR_LIB_EVP,(f),(r),__FILE__,__LINE__)
#define BUFerr(f,r)  ERR_PUT_error(ERR_LIB_BUF,(f),(r),__FILE__,__LINE__)
#define OBJerr(f,r)  ERR_PUT_error(ERR_LIB_OBJ,(f),(r),__FILE__,__LINE__)
#define PEMerr(f,r)  ERR_PUT_error(ERR_LIB_PEM,(f),(r),__FILE__,__LINE__)
#define DSAerr(f,r)  ERR_PUT_error(ERR_LIB_DSA,(f),(r),__FILE__,__LINE__)
#define X509err(f,r) ERR_PUT_error(ERR_LIB_X509,(f),(r),__FILE__,__LINE__)
#define ASN1err(f,r) ERR_PUT_error(ERR_LIB_ASN1,(f),(r),__FILE__,__LINE__)
#define CONFerr(f,r) ERR_PUT_error(ERR_LIB_CONF,(f),(r),__FILE__,__LINE__)
#define CRYPTOerr(f,r) ERR_PUT_error(ERR_LIB_CRYPTO,(f),(r),__FILE__,__LINE__)
#define ECerr(f,r)   ERR_PUT_error(ERR_LIB_EC,(f),(r),__FILE__,__LINE__)
#define SSLerr(f,r)  ERR_PUT_error(ERR_LIB_SSL,(f),(r),__FILE__,__LINE__)
#define BIOerr(f,r)  ERR_PUT_error(ERR_LIB_BIO,(f),(r),__FILE__,__LINE__)
#define PKCS7err(f,r) ERR_PUT_error(ERR_LIB_PKCS7,(f),(r),__FILE__,__LINE__)
#define X509V3err(f,r) ERR_PUT_error(ERR_LIB_X509V3,(f),(r),__FILE__,__LINE__)
#define PKCS12err(f,r) ERR_PUT_error(ERR_LIB_PKCS12,(f),(r),__FILE__,__LINE__)
#define RANDerr(f,r) ERR_PUT_error(ERR_LIB_RAND,(f),(r),__FILE__,__LINE__)
#define DSOerr(f,r) ERR_PUT_error(ERR_LIB_DSO,(f),(r),__FILE__,__LINE__)
#define ENGINEerr(f,r) ERR_PUT_error(ERR_LIB_ENGINE,(f),(r),__FILE__,__LINE__)
#define OCSPerr(f,r) ERR_PUT_error(ERR_LIB_OCSP,(f),(r),__FILE__,__LINE__)
#define UIerr(f,r) ERR_PUT_error(ERR_LIB_UI,(f),(r),__FILE__,__LINE__)
#define COMPerr(f,r) ERR_PUT_error(ERR_LIB_COMP,(f),(r),__FILE__,__LINE__)
#define ECDSAerr(f,r)  ERR_PUT_error(ERR_LIB_ECDSA,(f),(r),__FILE__,__LINE__)
#define ECDHerr(f,r)  ERR_PUT_error(ERR_LIB_ECDH,(f),(r),__FILE__,__LINE__)
#define STOREerr(f,r) ERR_PUT_error(ERR_LIB_STORE,(f),(r),__FILE__,__LINE__)
#define FIPSerr(f,r) ERR_PUT_error(ERR_LIB_FIPS,(f),(r),__FILE__,__LINE__)
#define CMSerr(f,r) ERR_PUT_error(ERR_LIB_CMS,(f),(r),__FILE__,__LINE__)
#define JPAKEerr(f,r) ERR_PUT_error(ERR_LIB_JPAKE,(f),(r),__FILE__,__LINE__)

/* Borland C seems too stupid to be able to shift and do longs in
 * the pre-processor :-( */
#define ERR_PACK(l,f,r)		(((((unsigned long)l)&0xffL)*0x1000000)| \
				((((unsigned long)f)&0xfffL)*0x1000)| \
				((((unsigned long)r)&0xfffL)))
#define ERR_GET_LIB(l)		(int)((((unsigned long)l)>>24L)&0xffL)
#define ERR_GET_FUNC(l)		(int)((((unsigned long)l)>>12L)&0xfffL)
#define ERR_GET_REASON(l)	(int)((l)&0xfffL)
#define ERR_FATAL_ERROR(l)	(int)((l)&ERR_R_FATAL)


/* OS functions */
#define SYS_F_FOPEN		1
#define SYS_F_CONNECT		2
#define SYS_F_GETSERVBYNAME	3
#define SYS_F_SOCKET		4
#define SYS_F_IOCTLSOCKET	5
#define SYS_F_BIND		6
#define SYS_F_LISTEN		7
#define SYS_F_ACCEPT		8
#define SYS_F_WSASTARTUP	9 /* Winsock stuff */
#define SYS_F_OPENDIR		10
#define SYS_F_FREAD		11


/* reasons */
#define ERR_R_SYS_LIB	ERR_LIB_SYS       /* 2 */
#define ERR_R_BN_LIB	ERR_LIB_BN        /* 3 */
#define ERR_R_RSA_LIB	ERR_LIB_RSA       /* 4 */
#define ERR_R_DH_LIB	ERR_LIB_DH        /* 5 */
#define ERR_R_EVP_LIB	ERR_LIB_EVP       /* 6 */
#define ERR_R_BUF_LIB	ERR_LIB_BUF       /* 7 */
#define ERR_R_OBJ_LIB	ERR_LIB_OBJ       /* 8 */
#define ERR_R_PEM_LIB	ERR_LIB_PEM       /* 9 */
#define ERR_R_DSA_LIB	ERR_LIB_DSA      /* 10 */
#define ERR_R_X509_LIB	ERR_LIB_X509     /* 11 */
#define ERR_R_ASN1_LIB	ERR_LIB_ASN1     /* 13 */
#define ERR_R_CONF_LIB	ERR_LIB_CONF     /* 14 */
#define ERR_R_CRYPTO_LIB ERR_LIB_CRYPTO  /* 15 */
#define ERR_R_EC_LIB	ERR_LIB_EC       /* 16 */
#define ERR_R_SSL_LIB	ERR_LIB_SSL      /* 20 */
#define ERR_R_BIO_LIB	ERR_LIB_BIO      /* 32 */
#define ERR_R_PKCS7_LIB	ERR_LIB_PKCS7    /* 33 */
#define ERR_R_X509V3_LIB ERR_LIB_X509V3  /* 34 */
#define ERR_R_PKCS12_LIB ERR_LIB_PKCS12  /* 35 */
#define ERR_R_RAND_LIB	ERR_LIB_RAND     /* 36 */
#define ERR_R_DSO_LIB	ERR_LIB_DSO      /* 37 */
#define ERR_R_ENGINE_LIB ERR_LIB_ENGINE  /* 38 */
#define ERR_R_OCSP_LIB  ERR_LIB_OCSP     /* 39 */
#define ERR_R_UI_LIB    ERR_LIB_UI       /* 40 */
#define ERR_R_COMP_LIB	ERR_LIB_COMP     /* 41 */
#define ERR_R_ECDSA_LIB ERR_LIB_ECDSA	 /* 42 */
#define ERR_R_ECDH_LIB  ERR_LIB_ECDH	 /* 43 */
#define ERR_R_STORE_LIB ERR_LIB_STORE    /* 44 */

#define ERR_R_NESTED_ASN1_ERROR			58
#define ERR_R_BAD_ASN1_OBJECT_HEADER		59
#define ERR_R_BAD_GET_ASN1_OBJECT_CALL		60
#define ERR_R_EXPECTING_AN_ASN1_SEQUENCE	61
#define ERR_R_ASN1_LENGTH_MISMATCH		62
#define ERR_R_MISSING_ASN1_EOS			63

/* fatal error */
#define ERR_R_FATAL				64
#define	ERR_R_MALLOC_FAILURE			(1|ERR_R_FATAL)
#define	ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED	(2|ERR_R_FATAL)
#define	ERR_R_PASSED_NULL_PARAMETER		(3|ERR_R_FATAL)
#define	ERR_R_INTERNAL_ERROR			(4|ERR_R_FATAL)
#define	ERR_R_DISABLED				(5|ERR_R_FATAL)

/* 99 is the maximum possible ERR_R_... code, higher values
 * are reserved for the individual libraries */


typedef struct ERR_string_data_st
	{
	unsigned long error;
	const char *string;
	} ERR_STRING_DATA;

void ERR_put_error(int lib, int func,int reason,const char *file,int line);
void ERR_set_error_data(char *data,int flags);

unsigned long ERR_get_error(void);
unsigned long ERR_get_error_line(const char **file,int *line);
unsigned long ERR_get_error_line_data(const char **file,int *line,
				      const char **data, int *flags);
unsigned long ERR_peek_error(void);
unsigned long ERR_peek_error_line(const char **file,int *line);
unsigned long ERR_peek_error_line_data(const char **file,int *line,
				       const char **data,int *flags);
unsigned long ERR_peek_last_error(void);
unsigned long ERR_peek_last_error_line(const char **file,int *line);
unsigned long ERR_peek_last_error_line_data(const char **file,int *line,
				       const char **data,int *flags);
void ERR_clear_error(void );
char *ERR_error_string(unsigned long e,char *buf);
void ERR_error_string_n(unsigned long e, char *buf, size_t len);
const char *ERR_lib_error_string(unsigned long e);
const char *ERR_func_error_string(unsigned long e);
const char *ERR_reason_error_string(unsigned long e);
void ERR_print_errors_cb(int (*cb)(const char *str, size_t len, void *u),
			 void *u);
#ifndef OPENSSL_NO_FP_API
void ERR_print_errors_fp(FILE *fp);
#endif
#ifndef OPENSSL_NO_BIO
void ERR_print_errors(BIO *bp);
void ERR_add_error_data(int num, ...);
#endif
void ERR_load_strings(int lib,ERR_STRING_DATA str[]);
void ERR_unload_strings(int lib,ERR_STRING_DATA str[]);
void ERR_load_ERR_strings(void);
void ERR_load_crypto_strings(void);
void ERR_free_strings(void);

void ERR_remove_state(unsigned long pid); /* if zero we look it up */
ERR_STATE *ERR_get_state(void);

#ifndef OPENSSL_NO_LHASH
LHASH *ERR_get_string_table(void);
LHASH *ERR_get_err_state_table(void);
void ERR_release_err_state_table(LHASH **hash);
#endif

int ERR_get_next_error_library(void);

int ERR_set_mark(void);
int ERR_pop_to_mark(void);

#ifdef OPENSSL_FIPS
void int_ERR_set_state_func(ERR_STATE *(*get_func)(void),
				void (*remove_func)(unsigned long pid));
void int_ERR_lib_init(void);
#endif

/* Already defined in ossl_typ.h */
/* typedef struct st_ERR_FNS ERR_FNS; */
/* An application can use this function and provide the return value to loaded
 * modules that should use the application's ERR state/functionality */
const ERR_FNS *ERR_get_implementation(void);
/* A loaded module should call this function prior to any ERR operations using
 * the application's "ERR_FNS". */
int ERR_set_implementation(const ERR_FNS *fns);

#ifdef	__cplusplus
}
#endif

#endif
xmail-1.27/MainWin.cpp0000644000175000017500000002652511341640430014103 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#include "SysInclude.h"
#include "SysDep.h"
#include "SvrDefines.h"
#include "SList.h"
#include "ShBlocks.h"
#include "UsrUtils.h"
#include "SvrUtils.h"
#include "MessQueue.h"
#include "SMAILUtils.h"
#include "QueueUtils.h"
#include "AppDefines.h"
#include "MailSvr.h"

#define NULFILE         "nul"

/* Service startup */
#define SZDEPENDENCIES              _T("Tcpip\0")
#define SERVER_START_WAIT           8000
#define SERVER_STOP_WAIT            4000

static int MnSetupStdHandles(void);
static VOID WINAPI ServiceCtrl(DWORD dwCtrlCode);
static VOID WINAPI ServiceMain(DWORD dwArgc, LPTSTR lpszArgv[]);
static BOOL CmdInstallService(DWORD dwStartType);
static BOOL CmdRemoveService(void);
static int CmdDebugService(int argc, TCHAR * argv[]);
static BOOL ReportStatusToSCMgr(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwWaitHint);
static LPTSTR GetLastErrorText(LPTSTR lpszBuf, DWORD dwSize);
static VOID AddToMessageLog(LPCTSTR lpszMsg);
static int GetServiceNameFromModule(LPCTSTR pszModule, LPTSTR pszName, int iSize);

static SERVICE_STATUS ssStatus;
static SERVICE_STATUS_HANDLE sshStatusHandle = NULL;
static DWORD dwErr = 0;
static BOOL bDebug = FALSE;
static TCHAR szErr[2048] = _T("");
static TCHAR szServicePath[MAX_PATH] = _T("");
static TCHAR szServiceName[128] = _T("");
static TCHAR szServiceDispName[256] = _T("");

static int MnSetupStdHandles(void)
{
	HANDLE hInFile = CreateFile(NULFILE, GENERIC_READ | GENERIC_WRITE,
				    FILE_SHARE_READ | FILE_SHARE_WRITE,
				    NULL, OPEN_EXISTING, 0, NULL);

	if (hInFile == INVALID_HANDLE_VALUE) {
		AddToMessageLog(_T("CreateFile"));
		return -1;
	}

	HANDLE hOutFile = CreateFile(NULFILE, GENERIC_READ | GENERIC_WRITE,
				     FILE_SHARE_READ | FILE_SHARE_WRITE,
				     NULL, OPEN_EXISTING, 0, NULL);

	if (hOutFile == INVALID_HANDLE_VALUE) {
		AddToMessageLog(_T("CreateFile"));
		CloseHandle(hInFile);
		return -1;
	}

	HANDLE hErrFile = CreateFile(NULFILE, GENERIC_READ | GENERIC_WRITE,
				     FILE_SHARE_READ | FILE_SHARE_WRITE,
				     NULL, OPEN_EXISTING, 0, NULL);

	if (hErrFile == INVALID_HANDLE_VALUE) {
		AddToMessageLog(_T("CreateFile"));
		CloseHandle(hOutFile);
		CloseHandle(hInFile);
		return -1;
	}

	if (!SetStdHandle(STD_INPUT_HANDLE, hInFile) ||
	    !SetStdHandle(STD_OUTPUT_HANDLE, hOutFile) ||
	    !SetStdHandle(STD_ERROR_HANDLE, hErrFile)) {
		AddToMessageLog(_T("SetStdHandle"));
		CloseHandle(hErrFile);
		CloseHandle(hOutFile);
		CloseHandle(hInFile);
		return -1;
	}

	return 0;
}

int _tmain(int argc, TCHAR * argv[])
{
	if (GetModuleFileName(NULL, szServicePath, CountOf(szServicePath)) == 0) {
		_tprintf(_T("Unable to get module name - %s\n"),
			 GetLastErrorText(szErr, CountOf(szErr)));
		return 1;
	}
	GetServiceNameFromModule(szServicePath, szServiceName, CountOf(szServiceName));
	_stprintf(szServiceDispName, _T("%s Server"), szServiceName);

	SERVICE_TABLE_ENTRY DispTable[] = {
		{ szServiceName, (LPSERVICE_MAIN_FUNCTION) ServiceMain },
		{ NULL, NULL }
	};

	if (argc > 1) {
		if (_tcsicmp(_T("--install"), argv[1]) == 0) {
			CmdInstallService(SERVICE_DEMAND_START);
			return 0;
		}
		if (_tcsicmp(_T("--install-auto"), argv[1]) == 0) {
			CmdInstallService(SERVICE_AUTO_START);
			return 0;
		} else if (_tcsicmp(_T("--remove"), argv[1]) == 0) {
			CmdRemoveService();
			return 0;
		} else if (_tcsicmp(_T("--debug"), argv[1]) == 0) {
			bDebug = TRUE;
			CmdDebugService(argc, argv);
			return 0;
		}
	}

	_tprintf(_T("%s --install          = Install the service\n"), argv[0]);
	_tprintf(_T("%s --remove           = Remove the service\n"), argv[0]);
	_tprintf(_T("%s --debug [params]   = Run as a console app for debugging\n"), argv[0]);

	_tprintf(_T("\nStartServiceCtrlDispatcher being called.\n"));
	_tprintf(_T("This may take several seconds.  Please wait.\n"));

	/* Setup std handles */
	if (MnSetupStdHandles() < 0)
		return 1;

	/* Service loop */
	if (!StartServiceCtrlDispatcher(DispTable))
		AddToMessageLog(_T("StartServiceCtrlDispatcher"));

	return 0;
}

static void WINAPI ServiceMain(DWORD dwArgc, LPTSTR lpszArgv[])
{
	if ((sshStatusHandle = RegisterServiceCtrlHandler(szServiceName, ServiceCtrl)) != NULL) {
		ZeroData(ssStatus);

		ssStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
		ssStatus.dwServiceSpecificExitCode = 0;

		if (ReportStatusToSCMgr(SERVICE_START_PENDING, NO_ERROR, SERVER_START_WAIT)) {
			ReportStatusToSCMgr(SERVICE_RUNNING, NO_ERROR, 0);

			/* Run server */
			int iSvrResult = SvrMain((int) dwArgc, lpszArgv);

			if (iSvrResult < 0) {

				AddToMessageLog(ErrGetErrorString(iSvrResult));

			}
		}

		ReportStatusToSCMgr(SERVICE_STOPPED, dwErr, 0);
	} else
		AddToMessageLog(_T("RegisterServiceCtrlHandler"));

}

static VOID WINAPI ServiceCtrl(DWORD dwCtrlCode)
{
	switch (dwCtrlCode) {
	case SERVICE_CONTROL_SHUTDOWN:
	case SERVICE_CONTROL_STOP:
	{
		ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, SERVER_STOP_WAIT);

		/* Signal the server to stop and wait for completion */
		SvrStopServer(false);

		while (SvrInShutdown()) {
			Sleep(SERVER_STOP_WAIT / 2);
			ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR,
					    SERVER_STOP_WAIT);
		}

		ReportStatusToSCMgr(SERVICE_STOPPED, 0, 0);
	}
	break;

	default:
		ReportStatusToSCMgr(ssStatus.dwCurrentState, NO_ERROR, 0);
	}

}

static BOOL ReportStatusToSCMgr(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwWaitHint)
{
	static DWORD dwCheckPoint = 1;
	BOOL bResult = TRUE;

	if (!bDebug) {
		if (dwCurrentState == SERVICE_START_PENDING)
			ssStatus.dwControlsAccepted = 0;
		else
			ssStatus.dwControlsAccepted =
				SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;

		ssStatus.dwCurrentState = dwCurrentState;
		ssStatus.dwWin32ExitCode = dwWin32ExitCode;
		ssStatus.dwWaitHint = dwWaitHint;

		if ((dwCurrentState == SERVICE_RUNNING) || (dwCurrentState == SERVICE_STOPPED))
			ssStatus.dwCheckPoint = 0;
		else
			ssStatus.dwCheckPoint = dwCheckPoint++;

		if (!(bResult = SetServiceStatus(sshStatusHandle, &ssStatus)))
			AddToMessageLog(_T("SetServiceStatus"));

	}

	return bResult;
}

static VOID AddToMessageLog(LPCTSTR lpszMsg)
{
	HANDLE hEventSource = NULL;
	LPTSTR lpszStrings[2];
	TCHAR szMsg[512] = _T("");
	TCHAR szErrMsg[2048] = _T("");

	if (!bDebug) {
		dwErr = GetLastError();

		GetLastErrorText(szErr, CountOf(szErr));

		_stprintf(szMsg, _T("%s error: %d"), szServiceName, dwErr);
		_stprintf(szErrMsg, _T("{%s}: %s"), lpszMsg, szErr);

		lpszStrings[0] = szMsg;
		lpszStrings[1] = szErrMsg;

		if ((hEventSource = RegisterEventSource(NULL, szServiceName)) != NULL) {
			ReportEvent(hEventSource,	// handle of event source
				    EVENTLOG_ERROR_TYPE,	// event type
				    0,	// event category
				    0,	// event ID
				    NULL,	// current user's SID
				    2,	// strings in lpszStrings
				    0,	// no bytes of raw data
				    (const char **) lpszStrings,	// array of error strings
				    NULL);	// no raw data

			DeregisterEventSource(hEventSource);
		}
	}

}

static BOOL CmdInstallService(DWORD dwStartType)
{
	SC_HANDLE schService = NULL;
	SC_HANDLE schSCManager = NULL;

	if ((schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) != NULL) {
		schService = CreateService(schSCManager,	// SCManager database
					   szServiceName,	// name of service
					   szServiceDispName,	// name to display
					   SERVICE_ALL_ACCESS,	// desired access
					   SERVICE_WIN32_OWN_PROCESS,	// service type
					   dwStartType,	// start type
					   SERVICE_ERROR_NORMAL,	// error control type
					   szServicePath,	// service's binary
					   NULL,	// no load ordering group
					   NULL,	// no tag identifier
					   SZDEPENDENCIES,	// dependencies
					   NULL,	// LocalSystem account
					   NULL);	// no password

		if (schService != NULL) {
			_tprintf(_T("%s installed.\n"), szServiceDispName);
			CloseServiceHandle(schService);
			CloseServiceHandle(schSCManager);

			return TRUE;
		} else
			_tprintf(_T("CreateService failed - %s\n"),
				 GetLastErrorText(szErr, CountOf(szErr)));

		CloseServiceHandle(schSCManager);
	} else
		_tprintf(_T("OpenSCManager failed - %s\n"),
			 GetLastErrorText(szErr, CountOf(szErr)));

	return FALSE;
}

static BOOL CmdRemoveService(void)
{
	SC_HANDLE schService = NULL;
	SC_HANDLE schSCManager = NULL;

	if ((schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) != NULL) {
		schService = OpenService(schSCManager, szServiceName, SERVICE_ALL_ACCESS);

		if (schService != NULL) {
			if (ControlService(schService, SERVICE_CONTROL_STOP, &ssStatus)) {
				_tprintf(_T("Stopping %s."), szServiceDispName);
				Sleep(1000);

				while (QueryServiceStatus(schService, &ssStatus)) {
					if (ssStatus.dwCurrentState == SERVICE_STOP_PENDING) {
						_tprintf(_T("."));
						Sleep(1000);
					} else
						break;
				}

				if (ssStatus.dwCurrentState == SERVICE_STOPPED)
					_tprintf(_T("\n%s stopped.\n"), szServiceDispName);
				else
					_tprintf(_T("\n%s failed to stop.\n"), szServiceDispName);

			}

			if (DeleteService(schService)) {
				_tprintf(_T("%s removed.\n"), szServiceDispName);
				CloseServiceHandle(schService);
				CloseServiceHandle(schSCManager);

				return TRUE;
			} else
				_tprintf(_T("DeleteService failed - %s\n"),
					 GetLastErrorText(szErr, CountOf(szErr)));

			CloseServiceHandle(schService);
		} else
			_tprintf(_T("OpenService failed - %s\n"),
				 GetLastErrorText(szErr, CountOf(szErr)));

		CloseServiceHandle(schSCManager);
	} else
		_tprintf(_T("OpenSCManager failed - %s\n"),
			 GetLastErrorText(szErr, CountOf(szErr)));

	return FALSE;
}

static int CmdDebugService(int argc, LPTSTR argv[])
{
	_tprintf(_T("Debugging %s.\n"), szServiceDispName);

	/* Run server */
	return SvrMain(argc, argv);
}

static LPTSTR GetLastErrorText(LPTSTR lpszBuf, DWORD dwSize)
{
	DWORD dwRet;
	DWORD dwError = GetLastError();
	LPTSTR lpszTemp = NULL;

	dwRet = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
			      FORMAT_MESSAGE_ARGUMENT_ARRAY, NULL, dwError, LANG_NEUTRAL,
			      (LPTSTR) &lpszTemp, 0, NULL);

	if (dwRet == 0 || (long) dwSize < (long) (dwRet + 14))
		lpszBuf[0] = TCHAR('\0');
	else {
		lpszTemp[lstrlen(lpszTemp) - 2] = TCHAR('\0');
		_stprintf(lpszBuf, _T("%s (0x%x)"), lpszTemp, dwError);
	}
	if (lpszTemp != NULL)
		LocalFree((HLOCAL) lpszTemp);

	return lpszBuf;
}

static int GetServiceNameFromModule(LPCTSTR pszModule, LPTSTR pszName, int iSize)
{
	LPCTSTR pszSlash;
	LPCTSTR pszDot;

	if ((pszSlash = _tcsrchr(pszModule, (TCHAR) '\\')) == NULL)
		pszSlash = pszModule;
	else
		pszSlash++;
	if ((pszDot = _tcschr(pszSlash, (TCHAR) '.')) == NULL)
		pszDot = pszSlash + _tcslen(pszSlash);
	iSize = Min(iSize - 1, (int) (pszDot - pszSlash));
	Cpy2Sz(pszName, pszSlash, iSize);

	return 0;
}

xmail-1.27/sendmail.sh0000644000175000017500000000015111341640430014150 0ustar  davidedavide#!/bin/sh


if [ -z $MAIL_ROOT ]; then
	export MAIL_ROOT=/var/MailRoot
fi


/usr/sbin/sendmail.xmail $*

xmail-1.27/SysIncludeBSD.h0000644000175000017500000000367111341640430014616 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#ifndef _SYSINCLUDEFREEBSD_H
#define _SYSINCLUDEFREEBSD_H

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#if defined(__FREEBSD__)
#include 
#elif defined(__DARWIN__)
#include 
#else
#include 
#endif
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#if !defined(__DARWIN_10_5__)
#include 
#endif

#endif
xmail-1.27/UsrMailList.h0000644000175000017500000000332611341640430014410 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#ifndef _USRMAILLIST_H
#define _USRMAILLIST_H

#define INVALID_USRML_HANDLE        ((USRML_HANDLE) 0)

#define DEFAULT_MLUSER_PERMS        "RW"

struct MLUserInfo {
	char *pszAddress;
	char *pszPerms;
};

typedef struct USRML_HANDLE_struct {
} *USRML_HANDLE;

MLUserInfo *UsrMLAllocDefault(char const *pszAddress, char const *pszPerms);
int UsrMLFreeUser(MLUserInfo * pMLUI);
int UsrMLCheckUserPost(UserInfo * pUI, char const *pszUser, char const *pszLogonUser);
int UsrMLAddUser(UserInfo * pUI, MLUserInfo const *pMLUI);
int UsrMLRemoveUser(UserInfo * pUI, const char *pszMLUser);
int UsrMLGetUsersFileSnapShot(UserInfo * pUI, const char *pszFileName);
USRML_HANDLE UsrMLOpenDB(UserInfo * pUI);
void UsrMLCloseDB(USRML_HANDLE hUsersDB);
MLUserInfo *UsrMLGetFirstUser(USRML_HANDLE hUsersDB);
MLUserInfo *UsrMLGetNextUser(USRML_HANDLE hUsersDB);

#endif
xmail-1.27/BuffSock.h0000644000175000017500000000532611341640430013704 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#ifndef _BUFFSOCK_H
#define _BUFFSOCK_H

#define BSOCK_BIO_NAME "SOCK"
#define STD_SOCK_BUFFER_SIZE 4096

#define INVALID_BSOCK_HANDLE ((BSOCK_HANDLE) 0)

typedef struct BSOCK_HANDLE_struct {
} *BSOCK_HANDLE;

struct BSockLineBuffer {
	char *pszBuffer;
	int iSize;
};

struct BufSockIOOps {
	void *pPrivate;
	char const *(*pName)(void *);
	int (*pFree)(void *);
	int (*pRead)(void *, void *, int, int);
	int (*pWrite)(void *, void const *, int, int);
	int (*pSendFile)(void *, char const *, SYS_OFF_T, SYS_OFF_T, int);
};

BSOCK_HANDLE BSckAttach(SYS_SOCKET SockFD, int iBufferSize = STD_SOCK_BUFFER_SIZE);
SYS_SOCKET BSckDetach(BSOCK_HANDLE hBSock, int iCloseSocket = 0);
int BSckGetChar(BSOCK_HANDLE hBSock, int iTimeout);
char *BSckChGetString(BSOCK_HANDLE hBSock, char *pszBuffer, int iMaxChars, int iTimeout,
		      int *pLineLength = NULL, int *piGotNL = NULL);
char *BSckGetString(BSOCK_HANDLE hBSock, char *pszBuffer, int iMaxChars, int iTimeout,
		    int *pLineLength = NULL, int *piGotNL = NULL);
int BSckSendString(BSOCK_HANDLE hBSock, char const *pszBuffer, int iTimeout);
int BSckVSendString(BSOCK_HANDLE hBSock, int iTimeout, char const *pszFormat, ...);
int BSckSendData(BSOCK_HANDLE hBSock, char const *pszBuffer, int iSize, int iTimeout);
int BSckReadData(BSOCK_HANDLE hBSock, char *pszBuffer, int iSize, int iTimeout,
		 int iSizeFill = 0);
int BSckSendFile(BSOCK_HANDLE hBSock, char const *pszFilePath, SYS_OFF_T llBaseOffset,
		 SYS_OFF_T llEndOffset, int iTimeout);
SYS_SOCKET BSckGetAttachedSocket(BSOCK_HANDLE hBSock);
int BSckSetIOops(BSOCK_HANDLE hBSock, BufSockIOOps const *pIOops);
char const *BSckBioName(BSOCK_HANDLE hBSock);
int BSckBufferInit(BSockLineBuffer *pBLB, int iSize = -1);
void BSckBufferFree(BSockLineBuffer *pBLB);
char *BSckBufferGet(BSOCK_HANDLE hBSock, BSockLineBuffer *pBLB, int iTimeout,
		    int *piLnLength = NULL);

#endif
xmail-1.27/Base64Enc.h0000644000175000017500000000212011341640430013641 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#ifndef _BASE64ENC_H
#define _BASE64ENC_H

int Base64Encode(const char *pIn, int iInSize, char *pszOut, int *piOutSize);
int Base64Decode(const char *pszIn, int iInSize, char *pOut, int *piOutSize);

#endif
xmail-1.27/SysOsEventfd_eventfd.cpp0000644000175000017500000000524111341640430016640 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#include "SysInclude.h"
#include "SysDep.h"
#include "SysDepUnix.h"
#include "AppDefines.h"

struct EventfdData {
	pthread_mutex_t Mtx;
	int iSignaled;
	int iEventfd;
};

SYS_EVENTFD SysEventfdCreate(void)
{
	EventfdData *pEFD;

	if ((pEFD = (EventfdData *) SysAlloc(sizeof(EventfdData))) == NULL)
		return SYS_INVALID_EVENTFD;
	if (pthread_mutex_init(&pEFD->Mtx, NULL) != 0) {
		SysFree(pEFD);
		ErrSetErrorCode(ERR_MUTEXINIT);
		return SYS_INVALID_EVENTFD;
	}
	if ((pEFD->iEventfd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC)) == -1) {
		pthread_mutex_destroy(&pEFD->Mtx);
		SysFree(pEFD);
		ErrSetErrorCode(ERR_EVENTFD);
		return SYS_INVALID_EVENTFD;
	}

	return (SYS_EVENTFD) pEFD;
}

int SysEventfdClose(SYS_EVENTFD hEventfd)
{
	EventfdData *pEFD = (EventfdData *) hEventfd;

	if (pEFD != NULL) {
		close(pEFD->iEventfd);
		pthread_mutex_destroy(&pEFD->Mtx);
		SysFree(pEFD);
	}

	return 0;
}

int SysEventfdWaitFD(SYS_EVENTFD hEventfd)
{
	EventfdData *pEFD = (EventfdData *) hEventfd;

	return pEFD->iEventfd;
}

int SysEventfdSet(SYS_EVENTFD hEventfd)
{
	EventfdData *pEFD = (EventfdData *) hEventfd;
	SYS_UINT64 Value = 1;

	pthread_mutex_lock(&pEFD->Mtx);
	if (pEFD->iSignaled == 0) {
		write(pEFD->iEventfd, &Value, sizeof(Value));
		pEFD->iSignaled++;
	}
	pthread_mutex_unlock(&pEFD->Mtx);

	return 0;
}

int SysEventfdReset(SYS_EVENTFD hEventfd)
{
	EventfdData *pEFD = (EventfdData *) hEventfd;
	int iCount = 0;
	SYS_UINT64 Value;

	pthread_mutex_lock(&pEFD->Mtx);
	if (pEFD->iSignaled > 0) {
		/*
		 * We write no more than one byte on the pipe (see above the
		 * SysEventfdSet() function), so we need one read of one byte
		 * only to flush it.
		 */
		if (read(pEFD->iEventfd, &Value, sizeof(Value)) == sizeof(Value))
			iCount++;
		pEFD->iSignaled = 0;
	}
	pthread_mutex_unlock(&pEFD->Mtx);

	return iCount;
}

xmail-1.27/MailConfig.cpp0000644000175000017500000000352111341640430014540 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#include "SysInclude.h"
#include "SysDep.h"
#include "SvrDefines.h"
#include "ShBlocks.h"
#include "StrUtils.h"
#include "MessQueue.h"
#include "MailSvr.h"
#include "MailConfig.h"

char *CfgGetRootPath(char *pszPath, int iMaxPath)
{
	StrNCpy(pszPath, szMailPath, iMaxPath);

	return pszPath;
}

char *CfgGetBasedPath(const char *pszFullPath, char *pszBasePath, int iMaxPath)
{
	int iRootLength;
	char szRootPath[SYS_MAX_PATH] = "";

	CfgGetRootPath(szRootPath, sizeof(szRootPath));
	iRootLength = strlen(szRootPath);
	if (strncmp(pszFullPath, szRootPath, iRootLength) == 0)
		StrNCpy(pszBasePath, pszFullPath + iRootLength, iMaxPath);
	else
		StrNCpy(pszBasePath, pszFullPath, iMaxPath);

	return pszBasePath;
}

char *CfgGetFullPath(const char *pszRelativePath, char *pszFullPath, int iMaxPath)
{
	CfgGetRootPath(pszFullPath, iMaxPath);
	StrNCat(pszFullPath,
		(*pszRelativePath != SYS_SLASH_CHAR) ? pszRelativePath: pszRelativePath + 1,
		iMaxPath);

	return pszFullPath;
}
xmail-1.27/FINGSvr.cpp0000644000175000017500000002557411341640430013762 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#include "SysInclude.h"
#include "SysDep.h"
#include "SvrDefines.h"
#include "ShBlocks.h"
#include "SList.h"
#include "BuffSock.h"
#include "SSLBind.h"
#include "SSLConfig.h"
#include "StrUtils.h"
#include "ResLocks.h"
#include "MiscUtils.h"
#include "SvrUtils.h"
#include "UsrUtils.h"
#include "ExtAliases.h"
#include "UsrMailList.h"
#include "MessQueue.h"
#include "SMTPUtils.h"
#include "MailConfig.h"
#include "AppDefines.h"
#include "MailSvr.h"
#include "FINGSvr.h"

#define FING_IPMAP_FILE         "finger.ipmap.tab"
#define FING_LOG_FILE           "finger"

static int FINGLogEnabled(SHB_HANDLE hShbFING, FINGConfig *pFINGCfg = NULL);
static int FINGDumpUser(char const *pszUser, char const *pszDomain,
			BSOCK_HANDLE hBSock, FINGConfig *pFINGCfg);

static int FINGCheckPeerIP(SYS_SOCKET SockFD)
{
	char szIPMapFile[SYS_MAX_PATH] = "";

	CfgGetRootPath(szIPMapFile, sizeof(szIPMapFile));
	StrNCat(szIPMapFile, FING_IPMAP_FILE, sizeof(szIPMapFile));

	if (SysExistFile(szIPMapFile)) {
		SYS_INET_ADDR PeerInfo;

		if (SysGetPeerInfo(SockFD, PeerInfo) < 0)
			return ErrGetErrorCode();

		if (MscCheckAllowedIP(szIPMapFile, PeerInfo, true) < 0)
			return ErrGetErrorCode();
	}

	return 0;
}

static FINGConfig *FINGGetConfigCopy(SHB_HANDLE hShbFING)
{
	FINGConfig *pFINGCfg = (FINGConfig *) ShbLock(hShbFING);

	if (pFINGCfg == NULL)
		return NULL;

	FINGConfig *pFINGCfgCopy = (FINGConfig *) SysAlloc(sizeof(FINGConfig));

	if (pFINGCfgCopy != NULL)
		memcpy(pFINGCfgCopy, pFINGCfg, sizeof(FINGConfig));

	ShbUnlock(hShbFING);

	return pFINGCfgCopy;
}

static int FINGLogEnabled(SHB_HANDLE hShbFING, FINGConfig *pFINGCfg)
{
	int iDoUnlock = 0;

	if (pFINGCfg == NULL) {
		if ((pFINGCfg = (FINGConfig *) ShbLock(hShbFING)) == NULL)
			return ErrGetErrorCode();
		++iDoUnlock;
	}

	unsigned long ulFlags = pFINGCfg->ulFlags;

	if (iDoUnlock)
		ShbUnlock(hShbFING);

	return (ulFlags & FINGF_LOG_ENABLED) ? 1 : 0;
}

static int FINGLogSession(char const *pszSockHost, char const *pszSockDomain,
			  SYS_INET_ADDR & PeerInfo, char const *pszQuery)
{
	char szTime[256] = "";

	MscGetTimeNbrString(szTime, sizeof(szTime) - 1);

	RLCK_HANDLE hResLock = RLckLockEX(SVR_LOGS_DIR SYS_SLASH_STR FING_LOG_FILE);

	if (hResLock == INVALID_RLCK_HANDLE)
		return ErrGetErrorCode();

	char szIP[128] = "???.???.???.???";

	MscFileLog(FING_LOG_FILE, "\"%s\""
		   "\t\"%s\""
		   "\t\"%s\""
		   "\t\"%s\""
		   "\t\"%s\""
		   "\n", pszSockHost, pszSockDomain, SysInetNToA(PeerInfo, szIP, sizeof(szIP)),
		   szTime, pszQuery);

	RLckUnlockEX(hResLock);

	return 0;
}

static int FINGDumpMailingList(UserInfo * pUI, BSOCK_HANDLE hBSock, FINGConfig * pFINGCfg)
{
	USRML_HANDLE hUsersDB = UsrMLOpenDB(pUI);

	if (hUsersDB == INVALID_USRML_HANDLE)
		return ErrGetErrorCode();

	/* Mailing list scan */
	MLUserInfo *pMLUI = UsrMLGetFirstUser(hUsersDB);

	for (; pMLUI != NULL; pMLUI = UsrMLGetNextUser(hUsersDB)) {
		char szUser[MAX_ADDR_NAME] = "";
		char szDomain[MAX_ADDR_NAME] = "";

		if (USmtpSplitEmailAddr(pMLUI->pszAddress, szUser, szDomain) < 0) {
			ErrorPush();
			UsrMLFreeUser(pMLUI);
			UsrMLCloseDB(hUsersDB);
			return ErrorPop();
		}
		/* Dump user */
		FINGDumpUser(szUser, szDomain, hBSock, pFINGCfg);

		UsrMLFreeUser(pMLUI);
	}
	UsrMLCloseDB(hUsersDB);

	return 0;
}

static int FINGDumpUser(char const *pszUser, char const *pszDomain,
			BSOCK_HANDLE hBSock, FINGConfig *pFINGCfg)
{
	/* Lookup user */
	char szRealAddr[MAX_ADDR_NAME] = "";
	UserInfo *pUI = UsrGetUserByNameOrAlias(pszDomain, pszUser, szRealAddr);

	if (pUI != NULL) {
		if (UsrGetUserType(pUI) == usrTypeUser) {
			/* Local user case */
			char *pszRealName = UsrGetUserInfoVar(pUI, "RealName");
			char *pszHomePage = UsrGetUserInfoVar(pUI, "HomePage");
			char szRespBuffer[2048] = "";

			SysSNPrintf(szRespBuffer, sizeof(szRespBuffer),
				    "EMail       : %s\r\n"
				    "  Real Name : %s\r\n"
				    "  Home Page : %s",
				    szRealAddr,
				    (pszRealName != NULL) ? pszRealName : "??",
				    (pszHomePage != NULL) ? pszHomePage : "??");

			BSckSendString(hBSock, szRespBuffer, pFINGCfg->iTimeout);

			SysFree(pszRealName);
			SysFree(pszHomePage);
		} else {
			/* Local mailing list case */

			FINGDumpMailingList(pUI, hBSock, pFINGCfg);
		}
		UsrFreeUserInfo(pUI);
	} else {
		ErrSetErrorCode(ERR_USER_NOT_FOUND);
		return ERR_USER_NOT_FOUND;
	}

	return 0;
}

static int FINGProcessQuery(char const *pszQuery, BSOCK_HANDLE hBSock,
			    FINGConfig * pFINGCfg, char const *pszSockDomain,
			    SVRCFG_HANDLE hSvrConfig)
{
	/* Check for verbose query */
	int iVerbose = 0;

	if (pszQuery[0] == '/') {
		if (toupper(pszQuery[1]) != 'W') {
			BSckSendString(hBSock, "Invalid query", pFINGCfg->iTimeout);

			ErrSetErrorCode(ERR_FINGER_QUERY_FORMAT);
			return ERR_FINGER_QUERY_FORMAT;
		}

		++iVerbose;
		pszQuery += 2;
	}
	/* Discard spaces */
	for (; *pszQuery == ' '; pszQuery++);

	if (*pszQuery == '\0') {
		BSckSendString(hBSock, "Empty query not allowed", pFINGCfg->iTimeout);

		ErrSetErrorCode(ERR_FINGER_QUERY_FORMAT);
		return ERR_FINGER_QUERY_FORMAT;
	}
	/* Split user-domain */
	char szUser[MAX_ADDR_NAME] = "";
	char szDomain[MAX_ADDR_NAME] = "";

	if (strchr(pszQuery, '@') != NULL) {
		if (USmtpSplitEmailAddr(pszQuery, szUser, szDomain) < 0) {
			ErrorPush();

			BSckSendString(hBSock, "Invalid query", pFINGCfg->iTimeout);

			return ErrorPop();
		}
	} else
		StrSNCpy(szUser, pszQuery);

	/* Check if indirect query */
	if (strchr(szDomain, '@') != NULL) {
		BSckSendString(hBSock, "Indirect query not allowed", pFINGCfg->iTimeout);

		ErrSetErrorCode(ERR_FINGER_QUERY_FORMAT);
		return ERR_FINGER_QUERY_FORMAT;
	}
	/* Setup domain name in case of username only query */
	if (IsEmptyString(szDomain)) {
		if (SvrConfigVar("POP3Domain", szDomain, sizeof(szDomain), hSvrConfig) < 0) {
			if (strlen(pszSockDomain) == 0) {
				if (SvrConfigVar
				    ("RootDomain", szDomain, sizeof(szDomain), hSvrConfig) < 0) {
					ErrorPush();

					BSckSendString(hBSock, "User not found",
						       pFINGCfg->iTimeout);

					return ErrorPop();
				}
			} else
				StrSNCpy(szDomain, pszSockDomain);
		}
	}
	/* Dump user */
	if (FINGDumpUser(szUser, szDomain, hBSock, pFINGCfg) < 0) {
		ErrorPush();

		BSckSendString(hBSock, "User not found", pFINGCfg->iTimeout);

		return ErrorPop();
	}

	return 0;
}

static int FINGHandleSession(ThreadConfig const *pThCfg, BSOCK_HANDLE hBSock)
{
	FINGConfig *pFINGCfg = FINGGetConfigCopy(pThCfg->hThShb);

	/* Get client socket info */
	SYS_INET_ADDR PeerInfo;

	if (SysGetPeerInfo(BSckGetAttachedSocket(hBSock), PeerInfo) < 0) {
		ErrorPush();
		BSckSendString(hBSock, ErrGetErrorString(ErrorFetch()), pFINGCfg->iTimeout);
		SysFree(pFINGCfg);

		SysLogMessage(LOG_LEV_ERROR, "%s\n", ErrGetErrorString(ErrorFetch()));
		return ErrorPop();
	}

	/* Get server socket FQDN */
	char szSvrFQDN[MAX_HOST_NAME] = "";

	if (MscGetSockHost(BSckGetAttachedSocket(hBSock), szSvrFQDN,
			   sizeof(szSvrFQDN)) < 0) {
		ErrorPush();
		BSckSendString(hBSock, ErrGetErrorString(ErrorFetch()), pFINGCfg->iTimeout);
		SysFree(pFINGCfg);

		SysLogMessage(LOG_LEV_ERROR, "%s\n", ErrGetErrorString(ErrorFetch()));
		return ErrorPop();
	}

	char szSockHost[MAX_HOST_NAME] = "";
	char szSockDomain[MAX_HOST_NAME] = "";

	MscSplitFQDN(szSvrFQDN, szSockHost, sizeof(szSockHost),
		     szSockDomain, sizeof(szSockDomain));

	char szIP[128] = "???.???.???.???";

	SysLogMessage(LOG_LEV_MESSAGE, "FINGER client connection from [%s]\n",
		      SysInetNToA(PeerInfo, szIP, sizeof(szIP)));

	char szQuery[1024] = "";

	if (BSckGetString(hBSock, szQuery, sizeof(szQuery) - 1, pFINGCfg->iTimeout) != NULL &&
	    MscCmdStringCheck(szQuery) == 0) {
		/* Log FINGER question */
		if (FINGLogEnabled(hShbFING))
			FINGLogSession(szSockHost, szSockDomain, PeerInfo, szQuery);

		SysLogMessage(LOG_LEV_MESSAGE, "FINGER query [%s] : \"%s\"\n",
			      SysInetNToA(PeerInfo, szIP, sizeof(szIP)), szQuery);

		SVRCFG_HANDLE hSvrConfig = SvrGetConfigHandle();

		FINGProcessQuery(szQuery, hBSock, pFINGCfg, szSockDomain, hSvrConfig);

		if (hSvrConfig != INVALID_SVRCFG_HANDLE)
			SvrReleaseConfigHandle(hSvrConfig);
	}
	SysFree(pFINGCfg);

	SysLogMessage(LOG_LEV_MESSAGE, "FINGER client exit [%s]\n",
		      SysInetNToA(PeerInfo, szIP, sizeof(szIP)));

	return 0;
}

unsigned int FINGClientThread(void *pThreadData)
{
	ThreadCreateCtx *pThCtx = (ThreadCreateCtx *) pThreadData;

	/* Check IP permission */
	if (FINGCheckPeerIP(pThCtx->SockFD) < 0) {
		ErrorPush();
		SysLogMessage(LOG_LEV_ERROR, "%s\n", ErrGetErrorString());
		SysCloseSocket(pThCtx->SockFD);
		SysFree(pThCtx);
		return ErrorPop();
	}

	/* Link socket to the bufferer */
	BSOCK_HANDLE hBSock = BSckAttach(pThCtx->SockFD);

	if (hBSock == INVALID_BSOCK_HANDLE) {
		ErrorPush();
		SysCloseSocket(pThCtx->SockFD);
		SysFree(pThCtx);
		return ErrorPop();
	}

	/*
	 * Do we need to switch to TLS?
	 */
	if (pThCtx->pThCfg->ulFlags & THCF_USE_SSL) {
		int iError;
		SslServerBind SSLB;
		SslBindEnv SslE;

		if (CSslBindSetup(&SSLB) < 0) {
			ErrorPush();
			BSckDetach(hBSock, 1);
			SysFree(pThCtx);
			return ErrorPop();
		}
		ZeroData(SslE);

		iError = BSslBindServer(hBSock, &SSLB, MscSslEnvCB, &SslE);

		CSslBindCleanup(&SSLB);
		if (iError < 0) {
			ErrorPush();
			BSckDetach(hBSock, 1);
			SysFree(pThCtx);
			return ErrorPop();
		}
		/*
		 * We may want to add verify code here ...
		 */

		SysFree(SslE.pszIssuer);
		SysFree(SslE.pszSubject);
	}
	/* Increase threads count */
	FINGConfig *pFINGCfg = (FINGConfig *) ShbLock(pThCtx->pThCfg->hThShb);

	if (pFINGCfg == NULL) {
		ErrorPush();
		SysLogMessage(LOG_LEV_ERROR, "%s\n", ErrGetErrorString());
		BSckDetach(hBSock, 1);
		SysFree(pThCtx);
		return ErrorPop();
	}
	++pFINGCfg->lThreadCount;
	ShbUnlock(pThCtx->pThCfg->hThShb);

	/* Handle client session */
	FINGHandleSession(pThCtx->pThCfg, hBSock);

	/* Decrease threads count */
	pFINGCfg = (FINGConfig *) ShbLock(pThCtx->pThCfg->hThShb);

	if (pFINGCfg == NULL) {
		ErrorPush();
		SysLogMessage(LOG_LEV_ERROR, "%s\n", ErrGetErrorString());
		return ErrorPop();
	}
	--pFINGCfg->lThreadCount;
	ShbUnlock(pThCtx->pThCfg->hThShb);

	/* Unlink socket from the bufferer and close it */
	BSckDetach(hBSock, 1);
	SysFree(pThCtx);

	return 0;
}

xmail-1.27/SysDepUnix.h0000644000175000017500000000510111341640430014244 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#ifndef _SYSDEPUNIX_H
#define _SYSDEPUNIX_H

#define MIN_TCP_SEND_SIZE  (1024 * 8)
#define MAX_TCP_SEND_SIZE  (1024 * 128)
#define K_IO_TIME_RATIO    8

#define SYS_INVALID_EVENTFD     ((SYS_EVENTFD) 0)

#define SYS_CLOSE_PIPE(p)       do { close((p)[0]); close((p)[1]); } while (0)

typedef void *SYS_EVENTFD;

struct ThreadExitHook {
	void (*pfHook)(void *, SYS_THREAD, int);
	void *pPrivate;
};

struct WaitCond {
	pthread_mutex_t Mtx;
	pthread_cond_t Cond;
};

struct SemData {
	WaitCond Wait;
	int iSemCounter;
	int iMaxCount;
};

struct MutexData {
	WaitCond Wait;
	int iLocked;
};

struct EventData {
	WaitCond Wait;
	int iSignaled;
	int iManualReset;
};

struct PEventData {
	SYS_EVENTFD hEventfd;
	int iManualReset;
};

struct ThrData {
	WaitCond Wait;
	pthread_t ThreadId;
	unsigned int (*ThreadProc) (void *);
	void *pThreadData;
	int iThreadEnded;
	int iExitCode;
	int iUseCount;
};

union FilledDirent {
	struct dirent DE;
	char Pad[sizeof(struct dirent) + SYS_MAX_PATH];
};

struct FileFindData {
	char szPath[SYS_MAX_PATH];
	DIR *pDIR;
	FilledDirent FDE;
	struct stat FStat;
};

struct MMapData {
	unsigned long ulPageSize;
	int iFD;
	int iNumMaps;
	SYS_OFF_T llFileSize;
	unsigned long ulFlags;
};


int SysDepInitLibrary(void);
void SysDepCleanupLibrary(void);

int SysSendFileMMap(SYS_SOCKET SockFD, char const *pszFileName, SYS_OFF_T llBaseOffset,
		    SYS_OFF_T llEndOffset, int iTimeout);
int SysBlockFD(int iFD, int iBlocking);
int SysFdWait(int iFD, unsigned int uEvents, int iTimeout);

SYS_EVENTFD SysEventfdCreate(void);
int SysEventfdClose(SYS_EVENTFD hEventfd);
int SysEventfdWaitFD(SYS_EVENTFD hEventfd);
int SysEventfdSet(SYS_EVENTFD hEventfd);
int SysEventfdReset(SYS_EVENTFD hEventfd);

#endif

xmail-1.27/QueueUtils.h0000644000175000017500000000451111341640430014302 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#ifndef _QUEUEUTILS_H
#define _QUEUEUTILS_H

struct QueLogInfo {
	char *pszReason;
	char *pszServer;
};

int QueUtGetFrozenList(QUEUE_HANDLE hQueue, char const *pszListFile);
int QueUtUnFreezeMessage(QUEUE_HANDLE hQueue, int iLevel1, int iLevel2,
			 char const *pszMessageFile);
int QueUtDeleteFrozenMessage(QUEUE_HANDLE hQueue, int iLevel1, int iLevel2,
			     char const *pszMessageFile);
int QueUtGetFrozenMsgFile(QUEUE_HANDLE hQueue, int iLevel1, int iLevel2,
			  char const *pszMessageFile, char const *pszOutFile);
int QueUtGetFrozenLogFile(QUEUE_HANDLE hQueue, int iLevel1, int iLevel2,
			  char const *pszMessageFile, char const *pszOutFile);
int QueUtErrLogMessage(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char const *pszFormat, ...);
int QueUtGetLastLogInfo(char const *pszLogFilePath, QueLogInfo * pQLI);
void QueUtFreeLastLogInfo(QueLogInfo * pQLI);
bool QueUtRemoveSpoolErrors(void);
int QueUtNotifyPermErrDelivery(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage,
			       SPLF_HANDLE hFSpool, char const *pszReason,
			       char const *pszServer, bool bCleanup);
int QueUtNotifyTempErrDelivery(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage,
			       SPLF_HANDLE hFSpool, char const *pszReason,
			       char const *pszText, char const *pszServer);
int QueUtCleanupNotifyRoot(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage,
			   SPLF_HANDLE hFSpool, char const *pszReason);
int QueUtResendMessage(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, SPLF_HANDLE hFSpool);

#endif
xmail-1.27/xmail0000644000175000017500000000411011341640430013054 0ustar  davidedavide#!/bin/sh
#
# skeleton	example file to build /etc/init.d/ scripts.
#		This file should be used to construct scripts for /etc/init.d.
#
#		Written by Miquel van Smoorenburg .
#		Modified by Davide Libenzi 
#
# Version:	@(#)skeleton  1.8  03-Mar-1998  miquels@cistron.nl
#

XMAIL_ROOT=/var/MailRoot
XMAIL_CMD_LINE=""
PATH=$XMAIL_ROOT/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=$XMAIL_ROOT/bin/XMail
NAME=XMail
DESC="XMail Server"

test -f $DAEMON || exit 0

set -e
ulimit -c 20000
ulimit -s 128

start_xmail()
{
    MAIL_ROOT=$XMAIL_ROOT
    export MAIL_ROOT
    MAIL_CMD_LINE=$XMAIL_CMD_LINE
    export MAIL_CMD_LINE
    rm -f /var/run/$NAME.pid
    $DAEMON
    while [ ! -f /var/run/$NAME.pid ]
    do
        sleep 1
    done
}

stop_xmail()
{
    if [ -f /var/run/$NAME.pid ]
    then
        echo `date` > $XMAIL_ROOT/.shutdown
        kill -INT `cat /var/run/$NAME.pid`
        while [ -f $XMAIL_ROOT/.shutdown ]
        do
            sleep 1
        done
    fi
}


case "$1" in
  start)
      echo -n "Starting $DESC: "
      start_xmail
      echo "$NAME.[" `cat /var/run/$NAME.pid` "]"
	;;
  stop)
      echo -n "Stopping $DESC: "
      stop_xmail
      echo "$NAME."
	;;
  #reload)
	#
	#	If the daemon can reload its config files on the fly
	#	for example by sending it SIGHUP, do it here.
	#
	#	If the daemon responds to changes in its config file
	#	directly anyway, make this a do-nothing entry.
	#
	# echo "Reloading $DESC configuration files."
	# start-stop-daemon --stop --signal 1 --quiet --pidfile \
	#	/var/run/$NAME.pid --exec $DAEMON
  #;;
  restart|force-reload)
	#
	#	If the "reload" option is implemented, move the "force-reload"
	#	option to the "reload" entry above. If not, "force-reload" is
	#	just the same as "restart".
	#
	echo -n "Restarting $DESC: "
	stop_xmail
	sleep 1
	start_xmail
        echo "$NAME.[" `cat /var/run/$NAME.pid` "]"	
	;;
  *)
	N=/etc/init.d/$NAME
	# echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
	echo "Usage: $N {start|stop|restart|force-reload}" >&2
	exit 1
	;;
esac

exit 0
xmail-1.27/MiscUtils.h0000644000175000017500000001645311341640430014121 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#ifndef _MISCUTILS_H
#define _MISCUTILS_H

#include "Hash.h"

#define LOCK_FILE_WAITSTEP     1

#define INVALID_FSCAN_HANDLE   ((FSCAN_HANDLE) 0)

#define HASH_INIT_VALUE        5381

#define THCF_USE_SSL           (1 << 0)
#define THCF_SHUTDOWN          (1 << 1)

typedef struct FSCAN_HANDLE_struct {
} *FSCAN_HANDLE;

struct AddressFilter {
	SYS_INET_ADDR Addr;
	SYS_UINT8 Mask[sizeof(SYS_INET_ADDR)];
};

struct ThreadConfig {
	char const *pszName;
	unsigned int (*pfThreadProc)(void *);
	long (*pfThreadCnt)(ThreadConfig const *);
	SHB_HANDLE hThShb;
	unsigned long ulFlags;
	int iNumAddr;
	SYS_INET_ADDR SvrAddr[MAX_ACCEPT_ADDRESSES];
	int iNumSockFDs;
	SYS_SOCKET SockFDs[MAX_ACCEPT_ADDRESSES];
};

struct ThreadCreateCtx {
	SYS_SOCKET SockFD;
	ThreadConfig const *pThCfg;
};


int MscDatumAlloc(Datum *pDm, void const *pData, long lSize);
LstDatum *MscLstDatumAlloc(void const *pData, long lSize);
int MscLstDatumAddT(SysListHead *pHead, void const *pData, long lSize);
void MscFreeDatumList(SysListHead *pHead);
int MscUniqueFile(char const *pszDir, char *pszFilePath, int iMaxPath);
void MscSafeGetTmpFile(char *pszPath, int iMaxPath);
int MscRecvTextFile(char const *pszFileName, BSOCK_HANDLE hBSock, int iTimeout,
		    int (*pStopProc) (void *) = NULL, void *pParam = NULL);
int MscSendTextFile(char const *pszFileName, BSOCK_HANDLE hBSock, int iTimeout,
		    int (*pStopProc) (void *) = NULL, void *pParam = NULL);
int MscSendFileCRLF(char const *pszFilePath, BSOCK_HANDLE hBSock, int iTimeout);
char *MscTranslatePath(char *pszPath);
void *MscLoadFile(char const *pszFilePath, unsigned long *pulFileSize);
int MscLockFile(char const *pszFileName, int iMaxWait, int iWaitStep = LOCK_FILE_WAITSTEP);
int MscGetTimeNbrString(char *pszTimeStr, int iStringSize, time_t tTime = 0);
int MscGetTime(struct tm &tmLocal, int &iDiffHours, int &iDiffMins, time_t tCurr = 0);
char *MscStrftime(struct tm const *ptmTime, char *pszDateStr, int iSize);
int MscGetTimeStr(char *pszTimeStr, int iStringSize, time_t tCurr = 0);
int MscGetDirectorySize(char const *pszPath, bool bRecurse, SYS_OFF_T &llDirSize,
			unsigned long &ulNumFiles, int (*pFNValidate) (char const *) = NULL);
FSCAN_HANDLE MscFirstFile(char const *pszPath, int iListDirs, char *pszFileName, int iSize);
int MscNextFile(FSCAN_HANDLE hFileScan, char *pszFileName, int iSize);
void MscCloseFindFile(FSCAN_HANDLE hFileScan);
int MscGetFileList(char const *pszPath, int iListDirs, SysListHead *pHead);
int MscCreateEmptyFile(char const *pszFileName);
int MscClearDirectory(char const *pszPath, int iRecurseSubs = 1);
int MscCopyFile(char const *pszCopyTo, char const *pszCopyFrom);
int MscAppendFile(char const *pszCopyTo, char const *pszCopyFrom);
int MscCopyFile(FILE *pFileOut, FILE *pFileIn, SYS_OFF_T llBaseOffset,
		SYS_OFF_T llCopySize);
int MscDos2UnixFile(FILE *pFileOut, FILE *pFileIn);
int MscMoveFile(char const *pszOldName, char const *pszNewName);
char *MscGetString(FILE *pFile, char *pszBuffer, int iMaxChars,
		   int *piGotNL = NULL);
char *MscFGets(char *pszLine, int iLineSize, FILE *pFile);
char *MscGetConfigLine(char *pszLine, int iLineSize, FILE *pFile, bool bSkipComments = true);
int MscGetPeerHost(SYS_SOCKET SockFD, char *pszFQDN, int iSize);
int MscGetSockHost(SYS_SOCKET SockFD, char *pszFQDN, int iSize);
int MscGetServerAddress(char const *pszServer, SYS_INET_ADDR &SvrAddr, int iPortNo = 0);
int MscSplitFQDN(char const *pszFQDN, char *pszHost, int iHSize,
		 char *pszDomain, int iDSize);
char *MscLogFilePath(char const *pszLogFile, char *pszLogFilePath);
int MscFileLog(char const *pszLogFile, char const *pszFormat, ...);
int MscSplitPath(char const *pszFilePath, char *pszDir, int iDSize,
		 char *pszFName, int iFSize, char *pszExt, int iESize);
int MscGetFileName(char const *pszFilePath, char *pszFileName);
int MscCreateClientSocket(char const *pszServer, int iPortNo, int iSockType,
			  SYS_SOCKET *pSockFD, SYS_INET_ADDR *pSvrAddr,
			  SYS_INET_ADDR *pSockAddr, int iTimeout);
int MscCreateServerSockets(int iNumAddr, SYS_INET_ADDR const *pSvrAddr, int iFamily,
			   int iPortNo, int iListenSize, SYS_SOCKET *pSockFDs,
			   int &iNumSockFDs);
int MscGetMaxSockFD(SYS_SOCKET const *pSockFDs, int iNumSockFDs);
int MscAcceptServerConnection(SYS_SOCKET const *pSockFDs, int iNumSockFDs,
			      SYS_SOCKET *pConnSockFD, int &iNumConnSockFD, int iTimeout);
int MscLoadAddressFilter(char const *const *ppszFilter, int iNumTokens, AddressFilter &AF);
int MscAddressMatch(AddressFilter const &AF, SYS_INET_ADDR const &TestAddr);
int MscCheckAllowedIP(char const *pszMapFile, const SYS_INET_ADDR &PeerInfo, bool bDefault);
char **MscGetIPProperties(char const *pszFileName, const SYS_INET_ADDR *pPeerInfo);
int MscHostSubMatch(char const *pszHostName, char const *pszHostMatch);
char **MscGetHNProperties(char const *pszFileName, char const *pszHostName);
int MscMD5Authenticate(char const *pszPassword, char const *pszTimeStamp, char const *pszDigest);
char *MscExtractServerTimeStamp(char const *pszResponse, char *pszTimeStamp, int iMaxTimeStamp);
int MscRootedName(char const *pszHostName);
int MscCramMD5(char const *pszSecret, char const *pszChallenge, char *pszDigest);
unsigned long MscHashString(char const *pszBuffer, int iLength,
			    unsigned long ulHashInit = HASH_INIT_VALUE);
int MscSplitAddressPort(char const *pszConnSpec, char *pszAddress, int &iPortNo, int iDefPortNo);
SYS_UINT16 MscReadUint16(void const *pData);
SYS_UINT32 MscReadUint32(void const *pData);
SYS_UINT64 MscReadUint64(void const *pData);
void *MscWriteUint16(void *pData, SYS_UINT16 uValue);
void *MscWriteUint32(void *pData, SYS_UINT32 uValue);
void *MscWriteUint64(void *pData, SYS_UINT64 uValue);
int MscCmdStringCheck(char const *pszString);
int MscGetSectionSize(FileSection const *pFS, SYS_OFF_T *pllSize);
int MscIsIPDomain(char const *pszDomain, char *pszIP, int iIPSize);
int MscReplaceTokens(char **ppszTokens, char *(*pLkupProc)(void *, char const *, int),
		     void *pPriv);
int MscGetAddrString(SYS_INET_ADDR const &AddrInfo, char *pszAStr, int iSize);
unsigned int MscServiceThread(void *pThreadData);
int MscSslEnvCB(void *pPrivate, int iID, void const *pData);
int MscParseOptions(char const *pszOpts, int (*pfAssign)(void *, char const *, char const *),
		    void *pPrivate);
void MscSysFreeCB(void *pPrivate, void *pData);
void MscRandomizeStringsOrder(char **ppszStrings);
unsigned long MscStringHashCB(void *pPrivate, HashDatum const *pDatum);
int MscStringCompareCB(void *pPrivate, HashDatum const *pDatum1,
		       HashDatum const *pDatum2);

#endif

xmail-1.27/Errors.cpp0000644000175000017500000004726511341640430014021 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#include "SysInclude.h"
#include "SysDep.h"
#include "SvrDefines.h"
#include "StrUtils.h"

struct ErrorStrings {
	int iErrorCode;
	char const *pszError;
};

struct ErrorEnv {
	int iErrorNo;
	char *pszInfo[1];
};


static SYS_THREAD_ONCE OnceSetup = SYS_THREAD_ONCE_INIT;
static SYS_TLSKEY ErrTlsKey;
static ErrorStrings Errors[] = {
	{ ERR_SUCCESS, "Success" },
	{ ERR_SERVER_SHUTDOWN, "Server shutdown" },
	{ ERR_MEMORY, "Memory allocation error" },
	{ ERR_NETWORK, "Network kernel error" },
	{ ERR_SOCKET_CREATE, "Cannot create socket" },
	{ ERR_TIMEOUT, "Timeout error" },
	{ ERR_LOCKED, "Already locked" },
	{ ERR_SOCKET_BIND, "Socket bind error" },
	{ ERR_CONF_PATH, "Mail root path not found" },
	{ ERR_USERS_FILE_NOT_FOUND, "Users table file not found" },
	{ ERR_FILE_CREATE, "Unable to create file" },
	{ ERR_USER_NOT_FOUND, "User not found" },
	{ ERR_USER_EXIST, "User already exist" },
	{ ERR_WRITE_USERS_FILE, "Error writing users file" },
	{ ERR_NO_USER_PRFILE, "User profile file not found" },
	{ ERR_FILE_DELETE, "Unable to remove file" },
	{ ERR_DIR_CREATE, "Unable to create directory" },
	{ ERR_DIR_DELETE, "Unable to remove directory" },
	{ ERR_FILE_OPEN, "Unable to open file" },
	{ ERR_INVALID_FILE, "Invalid file structure" },
	{ ERR_FILE_WRITE, "Unable to write file" },
	{ ERR_MSG_NOT_IN_RANGE, "Message out of range" },
	{ ERR_MSG_DELETED, "Message deleted" },
	{ ERR_INVALID_PASSWORD, "Invalid password" },
	{ ERR_ALIAS_FILE_NOT_FOUND, "Users alias file not found" },
	{ ERR_ALIAS_EXIST, "Alias already exist" },
	{ ERR_WRITE_ALIAS_FILE, "Error writing alias file" },
	{ ERR_ALIAS_NOT_FOUND, "Alias not found" },
	{ ERR_SVR_PRFILE_NOT_LOCKED, "Server profile not locked" },
	{ ERR_GET_PEER_INFO, "Error getting peer address info" },
	{ ERR_SMTP_PATH_PARSE_ERROR, "Error parsing SMTP command line" },
	{ ERR_BAD_RETURN_PATH, "Bad return path syntax" },
	{ ERR_BAD_EMAIL_ADDR, "Bad email address" },
	{ ERR_RELAY_NOT_ALLOWED, "Relay not allowed" },
	{ ERR_BAD_FORWARD_PATH, "Bad forward path syntax" },
	{ ERR_GET_SOCK_INFO, "Error getting sock address info" },
	{ ERR_GET_SOCK_HOST, "Error getting sock host name" },
	{ ERR_NO_DOMAIN, "Unable to know server domain" },
	{ ERR_USER_NOT_LOCAL, "User not local" },
	{ ERR_BAD_SERVER_ADDR, "Invalid server address" },
	{ ERR_BAD_SERVER_RESPONSE, "Bad server response" },
	{ ERR_INVALID_POP3_RESPONSE, "Invalid POP3 response" },
	{ ERR_LINKS_FILE_NOT_FOUND, "POP3 links file not found" },
	{ ERR_LINK_EXIST, "POP3 link already exist" },
	{ ERR_WRITE_LINKS_FILE, "Error writing POP3 links file" },
	{ ERR_LINK_NOT_FOUND, "POP3 link not found" },
	{ ERR_SMTPGW_FILE_NOT_FOUND, "SMTP gateway file not found" },
	{ ERR_GATEWAY_ALREADY_EXIST, "SMTP gateway already exist" },
	{ ERR_GATEWAY_NOT_FOUND, "SMTP gateway not found" },
	{ ERR_USER_NOT_MAILINGLIST, "User is not a mailing list" },
	{ ERR_NO_USER_MLTABLE_FILE, "Mailing list users table file not found" },
	{ ERR_MLUSER_ALREADY_EXIST, "Mailing list user already exist" },
	{ ERR_MLUSER_NOT_FOUND, "Mailing list user not found" },
	{ ERR_SPOOL_FILE_NOT_FOUND, "Spool file not found" },
	{ ERR_INVALID_SPOOL_FILE, "Invalid spool file" },
	{ ERR_SPOOL_FILE_EXPIRED, "Spool file has reached max retry ops" },
	{ ERR_SMTPRELAY_FILE_NOT_FOUND, "SMTP relay file not found" },
	{ ERR_DOMAINS_FILE_NOT_FOUND, "POP3 domains file not found" },
	{ ERR_DOMAIN_NOT_HANDLED, "POP3 domain not handled" },
	{ ERR_BAD_SMTP_RESPONSE, "Bad SMTP response" },
	{ ERR_CFG_VAR_NOT_FOUND, "Config variable not found" },
	{ ERR_BAD_DNS_RESPONSE, "Bad DNS response" },
	{ ERR_SMTPGW_NOT_FOUND, "SMTP gateway not found" },
	{ ERR_INCOMPLETE_CONFIG, "Incomplete server configuration file" },
	{ ERR_MAIL_ERROR_LOOP, "Mail error loop detected" },
	{ ERR_EXTALIAS_FILE_NOT_FOUND, "External-Alias file not found" },
	{ ERR_EXTALIAS_EXIST, "External alias already exist" },
	{ ERR_WRITE_EXTALIAS_FILE, "Error writing External-Alias file" },
	{ ERR_EXTALIAS_NOT_FOUND, "External alias not found" },
	{ ERR_NO_USER_DEFAULT_PRFILE, "Unable to open default user profile" },
	{ ERR_FINGER_QUERY_FORMAT, "Error in FINGER query" },
	{ ERR_LOCKED_RESOURCE, "Resource already locked" },
	{ ERR_NO_PREDEFINED_MX, "No predefined mail exchanger" },
	{ ERR_NO_MORE_MXRECORDS, "No more MX records" },
	{ ERR_INVALID_MESSAGE_FORMAT, "Invalid message format" },
	{ ERR_SMTP_BAD_MAIL_FROM, "[MAIL FROM:] not permitted by remote SMTP server" },
	{ ERR_SMTP_BAD_RCPT_TO, "[RCPT TO:] not permitted by remote SMTP server" },
	{ ERR_SMTP_BAD_DATA, "[DATA] not permitted by remote SMTP server" },
	{ ERR_INVALID_MXRECS_STRING, "Invalid MX records string format" },
	{ ERR_SETSOCKOPT, "Error in function {setsockopt}" },
	{ ERR_CREATEEVENT, "Error in function {CreateEvent}" },
	{ ERR_CREATESEMAPHORE, "Error in function {CreateSemaphore}" },
	{ ERR_CLOSEHANDLE, "Error in function {CloseHandle}" },
	{ ERR_RELEASESEMAPHORE, "Error in function {ReleaseSemaphore}" },
	{ ERR_BEGINTHREADEX, "Error in function {_beginthreadex}" },
	{ ERR_CREATEFILEMAPPING, "Error in function {CreateFileMapping}" },
	{ ERR_MAPVIEWOFFILE, "Error in function {MapViewOfFile}" },
	{ ERR_UNMAPVIEWOFFILE, "Error in function {UnmapViewOfFile}" },
	{ ERR_SEMGET, "Error in function {semget}" },
	{ ERR_SEMCTL, "Error in function {semctl}" },
	{ ERR_SEMOP, "Error in function {semop}" },
	{ ERR_FORK, "Error in function {fork}" },
	{ ERR_SHMGET, "Error in function {shmget}" },
	{ ERR_SHMCTL, "Error in function {shmctl}" },
	{ ERR_SHMAT, "Error in function {shmat}" },
	{ ERR_SHMDT, "Error in function {shmdt}" },
	{ ERR_OPENDIR, "Error in function {opendir}" },
	{ ERR_STAT, "Error in function {stat}" },
	{ ERR_SMTP_BAD_CMD_SEQUENCE, "Bad SMTP command sequence" },
	{ ERR_NO_ROOT_DOMAIN_VAR, "RootDomain config var not found" },
	{ ERR_NS_NOT_FOUND, "Name Server for domain not found" },
	{ ERR_NO_DEFINED_MXS_FOR_DOMAIN, "No MX records defined for domain" },
	{ ERR_BAD_CTRL_COMMAND, "Bad CTRL command syntax" },
	{ ERR_DOMAIN_ALREADY_HANDLED, "Domain already exist" },
	{ ERR_BAD_CTRL_LOGIN, "Bad controller login" },
	{ ERR_CTRL_ACCOUNTS_FILE_NOT_FOUND, "Controller accounts file not found" },
	{ ERR_SPAMMER_IP, "Server registered spammer IP" },
	{ ERR_TRUNCATED_DGRAM_DNS_RESPONSE, "Truncated UDP DNS response" },
	{ ERR_NO_DGRAM_DNS_RESPONSE, "Unable to get UDP DNS response" },
	{ ERR_DNS_NOTFOUND, "Requested DNS record not found" },
	{ ERR_BAD_SMARTDNSHOST_SYNTAX, "Bad SmartDNSHost config syntax" },
	{ ERR_MAILBOX_SIZE, "User maximum mailbox size reached" },
	{ ERR_DYNDNS_CONFIG, "Bad \"DynDnsSetup\" config syntax" },
	{ ERR_PROCESS_EXECUTE, "Error executing external process" },
	{ ERR_BAD_MAILPROC_CMD_SYNTAX, "Bad mailproc.tab command syntax" },
	{ ERR_NO_MAILPROC_FILE, "User mail processing file not present" },
	{ ERR_DNS_RECURSION_NOT_AVAILABLE, "DNS recursion not available" },
	{ ERR_POP3_EXTERNAL_LINK_DISABLED, "External POP3 link disabled" },
	{ ERR_BAD_DOMAIN_PROC_CMD_SYNTAX, "Error in custom domain processing file syntax" },
	{ ERR_NOT_A_CUSTOM_DOMAIN, "Not a custom domain" },
	{ ERR_NO_MORE_TOKENS, "No more tokens" },
	{ ERR_SELECT, "Error in function {select}" },
	{ ERR_REGISTER_EVENT_SOURCE, "Error in function {RegisterEventSource}" },
	{ ERR_NOMORESEMS, "No more semaphores available" },
	{ ERR_INVALID_SEMAPHORE, "Invalid semaphore" },
	{ ERR_SHMEM_ALREADY_EXIST, "Shared memory already exist" },
	{ ERR_SHMEM_NOT_EXIST, "Shared memory not exist" },
	{ ERR_SEM_NOT_EXIST, "Semaphore not exist" },
	{ ERR_SERVER_BUSY, "Server too busy, retry later" },
	{ ERR_IP_NOT_ALLOWED, "Server does not like Your IP" },
	{ ERR_FILE_EOF, "End of file reached" },
	{ ERR_BAD_TAG_ADDRESS, "Bad tag ( From: , etc ... ) address" },
	{ ERR_MAILFROM_UNKNOWN, "Unable to extract \"MAIL FROM: <>\" address" },
	{ ERR_FILTERED_MESSAGE, "Message rejected by server filters" },
	{ ERR_NO_DOMAIN_FILTER, "Domain filter not defined" },
	{ ERR_POP3_RETR_BROKEN, "POP3 RETR operation broken in data retrieval" },
	{ ERR_CCLN_INVALID_RESPONSE, "Invalid controller response" },
	{ ERR_CCLN_ERROR_RESPONSE, "Controller response error" },
	{ ERR_INCOMPLETE_PROCESSING, "Custom domain processing incomplete" },
	{ ERR_NO_EXTERNAL_AUTH_DEFINED, "No external auth defined for requested username@domain" },
	{ ERR_EXTERNAL_AUTH_FAILURE, "External authentication error" },
	{ ERR_MD5_AUTH_FAILED, "MD5 authentication failed" },
	{ ERR_NO_SMTP_AUTH_CONFIG, "SMTP authentication config not found" },
	{ ERR_UNKNOWN_SMTP_AUTH, "Unknown SMTP authentication mode" },
	{ ERR_BAD_SMTP_AUTH_CONFIG, "Bad SMTP authentication config" },
	{ ERR_BAD_EXTRNPRG_EXITCODE, "Bad external program exit code" },
	{ ERR_BAD_SMTP_CMD_SYNTAX, "Bad SMTP command syntax" },
	{ ERR_SMTP_AUTH_FAILED, "SMTP client authentication failed" },
	{ ERR_BAD_SMTP_EXTAUTH_RESPONSE_FILE, "Bad external SMTP auth response file syntax" },
	{ ERR_SMTP_USE_FORBIDDEN, "Server use is forbidden" },
	{ ERR_SPAM_ADDRESS, "Server registered spammer domain" },
	{ ERR_SOCK_NOMORE_DATA, "End of socket stream data" },
	{ ERR_BAD_TAB_INDEX_FIELD, "Bad TAB field index" },
	{ ERR_FILE_READ, "Error reading file" },
	{ ERR_BAD_INDEX_FILE, "Bad index file format" },
	{ ERR_INDEX_HASH_NOT_FOUND, "Record hash not found in index" },
	{ ERR_RECORD_NOT_FOUND, "Record not found in TAB file" },
	{ ERR_HEAP_ALLOC, "Heap block alloc error" },
	{ ERR_HEAP_FREE, "Heap block free error" },
	{ ERR_RESOURCE_NOT_LOCKED, "Trying to unlock an unlocked resource" },
	{ ERR_LOCK_ENTRY_NOT_FOUND, "Resource lock entry not found" },
	{ ERR_LINE_TOO_LONG, "Stream line too long" },
	{ ERR_MAIL_LOOP_DETECTED, "Mail loop detected" },
	{ ERR_FILE_MOVE, "Unable to move file" },
	{ ERR_INVALID_MAILDIR_SUBPATH, "Error invalid Maildir sub path" },
	{ ERR_SMTP_TOO_MANY_RECIPIENTS, "Too many SMTP recipients" },
	{ ERR_DNS_CACHE_FILE_FMT, "Error in DNS cache file format" },
	{ ERR_DNS_CACHE_FILE_EXPIRED, "DNS cache file expired" },
	{ ERR_MMAP, "Error in function {mmap}" },
	{ ERR_NOT_LOCKED, "Not locked" },
	{ ERR_SMTPFWD_FILE_NOT_FOUND, "SMTP forward gateway file not found" },
	{ ERR_SMTPFWD_NOT_FOUND, "SMTP forward gateway not found" },
	{ ERR_USER_BREAK, "Operation interrupted" },
	{ ERR_SET_THREAD_PRIORITY, "Error setting thread priority" },
	{ ERR_NULL_SENDER, "Empty message sender" },
	{ ERR_RCPTTO_UNKNOWN, "Mail tag \"To:\" missing" },
	{ ERR_LOADMODULE, "Error loading dynamic module" },
	{ ERR_LOADMODULESYMBOL, "Error loading dynamic module symbol" },
	{ ERR_NOMORE_TLSKEYS, "No more TLS keys are available" },
	{ ERR_INVALID_TLSKEY, "Invalid TLS key" },
	{ ERR_ERRORINIT_FAILED, "Error initialization failed" },
	{ ERR_SENDFILE, "Error in function {sendfile}" },
	{ ERR_MUTEXINIT, "Error in function {pthread_mutex_init}" },
	{ ERR_CONDINIT, "Error in function {pthread_cond_init}" },
	{ ERR_THREADCREATE, "Error in function {pthread_create}" },
	{ ERR_CREATEMUTEX, "Error in function {CreateMutex}" },
	{ ERR_NO_LOCAL_SPOOL_FILES, "Local spool empty" },
	{ ERR_NO_HANDLED_DOMAIN, "Unable to retrieve an handled domain from peer IP" },
	{ ERR_INVALID_MAIL_DOMAIN, "Remote domain has no DNS/MX entries" },
	{ ERR_BAD_CMDSTR_CHARS, "Bad characters in command line" },
	{ ERR_FETCHMSG_UNDELIVERED, "POP3 fetched message failed delivery" },
	{ ERR_USER_VAR_NOT_FOUND, "User configuration variable not found" },
	{ ERR_NO_POP3_IP, "Invalid or not available POP3 connection IP" },
	{ ERR_NO_MESSAGE_FILE, "Message file not existent" },
	{ ERR_GET_DISK_SPACE_INFO, "Error getting disk space info" },
	{ ERR_GET_MEMORY_INFO, "Error getting memory info" },
	{ ERR_LOW_DISK_SPACE, "System low in disk space" },
	{ ERR_LOW_VM_SPACE, "System low in virtual memory" },
	{ ERR_USER_DISABLED, "Account disabled" },
	{ ERR_BAD_DNS_NAME_RECORD, "Bad format for DNS name record" },
	{ ERR_MESSAGE_SIZE, "Message exceeds fixed maximum message size" },
	{ ERR_SMTPSRV_MSG_SIZE, "Message too big for the remote SMTP server" },
	{ ERR_MAPS_CONTAINED, "The peer IP is mapped" },
	{ ERR_ADOMAIN_FILE_NOT_FOUND, "Domain aliases file not found" },
	{ ERR_ADOMAIN_EXIST, "Domain alias already exist" },
	{ ERR_ADOMAIN_NOT_FOUND, "Domain alias not found" },
	{ ERR_NOT_A_CMD_ALIAS, "Cmd alias not found" },
	{ ERR_GETSOCKOPT, "Error in function {getsockopt}" },
	{ ERR_NO_HDR_FETCH_TAGS, "No fetch headers tags string supplied" },
	{ ERR_SET_FILE_TIME, "Error setting file times" },
	{ ERR_LISTDIR_NOT_FOUND, "Listing directory not found" },
	{ ERR_DUPLICATE_HANDLE, "Error in function {DuplicateHandle}" },
	{ ERR_EMPTY_LOG, "Log file is empty" },
	{ ERR_BAD_RELATIVE_PATH, "Error in relative path syntax" },
	{ ERR_DNS_NXDOMAIN, "DNS name not exist" },
	{ ERR_BAD_RFCNAME, "Name does not respect RFC822" },
	{ ERR_CONNECT, "Error connecting to remote address" },
	{ ERR_MESSAGE_DELETED, "Message marked for deletion" },
	{ ERR_PIPE, "Pipe creation error" },
	{ ERR_WAITPID, "Error in function {waitpid}" },
	{ ERR_MUNMAP, "Error in function {munmap}" },
	{ ERR_INVALID_MMAP_OFFSET, "Invalid memory map offset" },
	{ ERR_UNMAPFILEVIEW, "File view unmap failed" },
	{ ERR_INVALID_IMAP_LINE, "Invalid IMAP syntax" },
	{ ERR_IMAP_RESP_NO, "IMAP response NO" },
	{ ERR_IMAP_RESP_BAD, "IMAP response BAD" },
	{ ERR_IMAP_RESP_BYE, "IMAP response BYE" },
	{ ERR_IMAP_UNKNOWN_AUTH, "Unknown IMAP authentication method" },
	{ ERR_NO_MESSAGE_AUTH, "Message authentication not found" },
	{ ERR_INVALID_PARAMETER, "Invalid parameter" },
	{ ERR_ALREADY_EXIST, "Already exist" },
	{ ERR_SSLCTX_CREATE, "Error creating SSL context" },
	{ ERR_SSL_CREATE, "Error creating SSL session" },
	{ ERR_SSL_CONNECT, "Error establishing SSL connection (connect)" },
	{ ERR_SSL_SETCERT, "Error setting the SSL certificate file" },
	{ ERR_SSL_SETKEY, "Error setting the SSL key file" },
	{ ERR_SSL_READ, "SSL read error" },
	{ ERR_SSL_WRITE, "SSL write error" },
	{ ERR_SSL_CERT_VALIDATE, "SSL certificate validation failed" },
	{ ERR_SSL_NOCERT, "SSL certificate missing" },
	{ ERR_NO_REMOTE_SSL, "Remote server does not support TLS" },
	{ ERR_SSL_ALREADY_ACTIVE, "TLS link already active" },
	{ ERR_SSL_CHECKKEY, "SSL private key check failed" },
	{ ERR_SSL_VERPATHS, "SSL verify-paths load failed" },
	{ ERR_TLS_MODE_REQUIRED, "TLS required for this session" },
	{ ERR_NOT_FOUND, "Not found" },
	{ ERR_NOREMOTE_POP3_UIDL, "Remote POP3 server does not support UIDL" },
	{ ERR_CORRUPTED, "Input data corrupted" },
	{ ERR_SSL_DISABLED, "TLS service disabled" },
	{ ERR_SSL_ACCEPT, "Error establishing SSL connection (accept)" },
	{ ERR_BAD_SEQUENCE, "Wrong sequence of commands" },
	{ ERR_EMPTY_ADDRESS, "Empty email address" },
	{ ERR_DNS_MAXDEPTH, "Maximum DNS quesry depth exceeded" },
	{ ERR_THREAD_SETSTACK, "Unable to set thread stack" },
	{ ERR_DNS_FORMAT, "Bad DNS query format" },
	{ ERR_DNS_SVRFAIL, "Remote DNS server failed" },
	{ ERR_DNS_NOTSUPPORTED, "DNS query not supported" },
	{ ERR_DNS_REFUSED, "DNS query refused" },
	{ ERR_INVALID_RELAY_ADDRESS, "Invalid relay address" },
	{ ERR_INVALID_HOSTNAME, "Invalid host name" },
	{ ERR_INVALID_INET_ADDR, "Invalid INET address" },
	{ ERR_SOCKET_SHUTDOWN, "Connection shutdown error" },
	{ ERR_SSL_SHUTDOWN, "SSL connection shutdown error" },
	{ ERR_TOO_MANY_ELEMENTS, "Too many elements" },
	{ ERR_GET_RAND_BYTES, "Failed to retrieve entropy bytes" },
	{ ERR_WAIT, "Failed to wait for event" },
	{ ERR_EVENTFD, "Failed to create for eventfd" },

};

static char const *pszErrors[ERROR_COUNT];


static void ErrFreeEnv(void *pData)
{
	ErrorEnv *pEV = (ErrorEnv *) pData;

	if (pEV != NULL) {
		char **ppszInfo = pEV->pszInfo;

		for (int i = 0; i < (int) CountOf(Errors); i++, ppszInfo++)
			if (*ppszInfo != NULL)
				SysFree(*ppszInfo), *ppszInfo = NULL;
		SysFree(pEV);
	}
}

static void ErrOnceSetup(void)
{
	int i, iIdx;

	SysCreateTlsKey(ErrTlsKey, ErrFreeEnv);
	for (i = 0; i < (int) CountOf(Errors); i++) {
		iIdx = -Errors[i].iErrorCode;
		if (iIdx >= 0 && iIdx < ERROR_COUNT)
			pszErrors[iIdx] = Errors[i].pszError;
	}
}

static ErrorEnv *ErrSetupEnv(void)
{
	SysThreadOnce(&OnceSetup, ErrOnceSetup);

	ErrorEnv *pEV = (ErrorEnv *) SysGetTlsKeyData(ErrTlsKey);

	if (pEV == NULL) {
		if ((pEV = (ErrorEnv *) SysAlloc(sizeof(ErrorEnv) +
						 ERROR_COUNT * sizeof(char *))) == NULL)
			return NULL;

		pEV->iErrorNo = ERR_SUCCESS;

		char **ppszInfo = pEV->pszInfo;

		for (int i = 0; i < ERROR_COUNT; i++, ppszInfo++)
			*ppszInfo = NULL;

		if (SysSetTlsKeyData(ErrTlsKey, pEV) < 0) {
			SysFree(pEV);
			return NULL;
		}
	}

	return pEV;
}

int ErrGetErrorCode(void)
{
	ErrorEnv *pEV = ErrSetupEnv();

	if (pEV == NULL)
		return ERR_ERRORINIT_FAILED;

	return pEV->iErrorNo;
}

int ErrSetErrorCode(int iError, char const *pszInfo, int iSize)
{
	ErrorEnv *pEV = ErrSetupEnv();

	if (pEV == NULL)
		return ERR_ERRORINIT_FAILED;

	pEV->iErrorNo = iError;
	if (pszInfo != NULL) {
		iError = -iError;
		if (iError >= 0 && iError < ERROR_COUNT) {
			if (pEV->pszInfo[iError] != NULL)
				SysFree(pEV->pszInfo[iError]);
			pEV->pszInfo[iError] = (char *) StrMemDup(pszInfo, iSize, 0);
		}
	}

	return 0;
}

const char *ErrGetErrorString(int iError)
{
	iError = -iError;

	return (iError >= 0 && iError < ERROR_COUNT && pszErrors[iError] != NULL) ?
		pszErrors[iError]: "Unknown error code";
}

const char *ErrGetErrorString(void)
{
	ErrorEnv *pEV = ErrSetupEnv();

	if (pEV == NULL)
		return ErrGetErrorString(ERR_ERRORINIT_FAILED);

	return ErrGetErrorString(pEV->iErrorNo);
}

char *ErrGetErrorStringInfo(int iError)
{
	ErrorEnv *pEV = ErrSetupEnv();

	if (pEV == NULL)
		return SysStrDup(ErrGetErrorString(iError));

	int iErrIndex = -iError;

	if (iErrIndex < 0 || iErrIndex >= ERROR_COUNT)
		return SysStrDup("Unknown error code");

	int iInfoLength = (pEV->pszInfo[iErrIndex] != NULL) ? strlen(pEV->pszInfo[iErrIndex]): 0;
	char const *pszError = pszErrors[iErrIndex] != NULL ? pszErrors[iErrIndex]: "Unknown error code";
	char *pszErrorInfo = (char *) SysAlloc(strlen(pszError) + iInfoLength + 256);

	if (pszErrorInfo == NULL)
		return NULL;

	if (pEV->pszInfo[iErrIndex] != NULL)
		sprintf(pszErrorInfo,
			"ErrCode   = %d\n"
			"ErrString = %s\n"
			"ErrInfo   = %s", iError, pszError, pEV->pszInfo[iErrIndex]);
	else
		sprintf(pszErrorInfo,
			"ErrCode   = %d\n" "ErrString = %s", iError, pszError);

	return pszErrorInfo;
}

int ErrLogMessage(int iLogLevel, char const *pszFormat, ...)
{
	char *pszErrorInfo = ErrGetErrorStringInfo(ErrGetErrorCode());

	if (pszErrorInfo == NULL)
		return ErrGetErrorCode();

	char *pszUserMessage = NULL;

	StrVSprint(pszUserMessage, pszFormat, pszFormat);
	if (pszUserMessage == NULL) {
		SysFree(pszErrorInfo);
		return ErrGetErrorCode();
	}

	SysLogMessage(iLogLevel, "<<\n" "%s\n" "%s" ">>\n", pszErrorInfo, pszUserMessage);

	SysFree(pszUserMessage);
	SysFree(pszErrorInfo);

	return 0;
}

int ErrFileLogString(char const *pszFileName, char const *pszMessage)
{
	char *pszErrorInfo = ErrGetErrorStringInfo(ErrGetErrorCode());

	if (pszErrorInfo == NULL)
		return ErrGetErrorCode();

	FILE *pLogFile = fopen(pszFileName, "a+t");

	if (pLogFile == NULL) {
		SysFree(pszErrorInfo);

		ErrSetErrorCode(ERR_FILE_CREATE, pszFileName);
		return ERR_FILE_CREATE;
	}

	fprintf(pLogFile, "<<\n" "%s\n" "%s" ">>\n", pszErrorInfo, pszMessage);

	fclose(pLogFile);
	SysFree(pszErrorInfo);

	return 0;
}

xmail-1.27/MailDomains.cpp0000644000175000017500000002661611341640430014737 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#include "SysInclude.h"
#include "SysDep.h"
#include "SvrDefines.h"
#include "ShBlocks.h"
#include "ResLocks.h"
#include "StrUtils.h"
#include "SList.h"
#include "BuffSock.h"
#include "MailConfig.h"
#include "MessQueue.h"
#include "MailSvr.h"
#include "MiscUtils.h"
#include "SvrUtils.h"
#include "POP3GwLink.h"
#include "ExtAliases.h"
#include "UsrUtils.h"
#include "UsrAuth.h"
#include "TabIndex.h"
#include "AliasDomain.h"
#include "SMAILUtils.h"
#include "MailDomains.h"

#define MAIL_DOMAINS_DIR            "domains"
#define MAIL_DOMAINS_FILE           "domains.tab"
#define MAIL_DOMAINS_LINE_MAX       512

enum PopDomainFileds {
	domDomain = 0,

	domMax
};

struct DomainsScanData {
	char szTmpDBFile[SYS_MAX_PATH];
	FILE *pDBFile;
	char szCurrDomain[256];
};

static int MDomRebuildDomainsIndexes(char const *pszDomainsFilePath);
static char *MDomGetDomainsFilePath(char *pszDomainsFilePath, int iMaxPath);

static int iIdxDomains_Domain[] = {
	domDomain,

	INDEX_SEQUENCE_TERMINATOR
};

int MDomCheckDomainsIndexes(void)
{
	char szDomainsFilePath[SYS_MAX_PATH] = "";

	MDomGetDomainsFilePath(szDomainsFilePath, sizeof(szDomainsFilePath));

	/* Align RmtDomain-RmtName index */
	if (TbixCheckIndex(szDomainsFilePath, iIdxDomains_Domain, false) < 0)
		return ErrGetErrorCode();

	return 0;
}

static int MDomRebuildDomainsIndexes(char const *pszDomainsFilePath)
{
	/* Rebuild RmtDomain-RmtName index */
	if (TbixCreateIndex(pszDomainsFilePath, iIdxDomains_Domain, false) < 0)
		return ErrGetErrorCode();

	return 0;
}

char *MDomGetDomainPath(char const *pszDomain, char *pszDomainPath, int iMaxPath, int iFinalSlash)
{
	/* Make the domain lower-case */
	char szLoDomain[SYS_MAX_PATH] = "";

	StrSNCpy(szLoDomain, pszDomain);
	StrLower(szLoDomain);

	CfgGetRootPath(pszDomainPath, iMaxPath);

	StrNCat(pszDomainPath, MAIL_DOMAINS_DIR, iMaxPath);
	AppendSlash(pszDomainPath);
	StrNCat(pszDomainPath, szLoDomain, iMaxPath);

	if (iFinalSlash)
		AppendSlash(pszDomainPath);

	return pszDomainPath;
}

static char *MDomGetDomainsFilePath(char *pszDomainsFilePath, int iMaxPath)
{
	CfgGetRootPath(pszDomainsFilePath, iMaxPath);

	StrNCat(pszDomainsFilePath, MAIL_DOMAINS_FILE, iMaxPath);

	return pszDomainsFilePath;
}

int MDomLookupDomain(char const *pszDomain)
{
	char szDomainsFilePath[SYS_MAX_PATH] = "";

	MDomGetDomainsFilePath(szDomainsFilePath, sizeof(szDomainsFilePath));

	char szResLock[SYS_MAX_PATH] = "";
	RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szDomainsFilePath, szResLock,
							  sizeof(szResLock)));

	if (hResLock == INVALID_RLCK_HANDLE)
		return ErrGetErrorCode();

	/* Lookup record using the specified index */
	char **ppszTabTokens = TbixLookup(szDomainsFilePath, iIdxDomains_Domain, false,
					  pszDomain,
					  NULL);

	if (ppszTabTokens == NULL) {
		RLckUnlockSH(hResLock);

		ErrSetErrorCode(ERR_DOMAIN_NOT_HANDLED, pszDomain);
		return ERR_DOMAIN_NOT_HANDLED;
	}
	StrFreeStrings(ppszTabTokens);
	RLckUnlockSH(hResLock);

	return 0;
}

int MDomAddDomain(char const *pszDomain)
{
	char szDomainsFilePath[SYS_MAX_PATH] = "";

	MDomGetDomainsFilePath(szDomainsFilePath, sizeof(szDomainsFilePath));

	char szResLock[SYS_MAX_PATH] = "";
	RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szDomainsFilePath, szResLock,
							  sizeof(szResLock)));

	if (hResLock == INVALID_RLCK_HANDLE)
		return ErrGetErrorCode();

	FILE *pDomainsFile = fopen(szDomainsFilePath, "r+t");

	if (pDomainsFile == NULL) {
		RLckUnlockEX(hResLock);

		ErrSetErrorCode(ERR_ALIAS_FILE_NOT_FOUND);
		return ERR_ALIAS_FILE_NOT_FOUND;
	}

	char szDomainsLine[MAIL_DOMAINS_LINE_MAX] = "";

	while (MscFGets(szDomainsLine, sizeof(szDomainsLine) - 1, pDomainsFile) != NULL) {
		char **ppszStrings = StrGetTabLineStrings(szDomainsLine);

		if (ppszStrings == NULL)
			continue;

		int iFieldsCount = StrStringsCount(ppszStrings);

		if ((iFieldsCount >= domMax) && (stricmp(pszDomain, ppszStrings[domDomain]) == 0)) {
			StrFreeStrings(ppszStrings);
			fclose(pDomainsFile);
			RLckUnlockEX(hResLock);

			ErrSetErrorCode(ERR_DOMAIN_ALREADY_HANDLED);
			return ERR_DOMAIN_ALREADY_HANDLED;
		}
		StrFreeStrings(ppszStrings);
	}
	fseek(pDomainsFile, 0, SEEK_END);

	fprintf(pDomainsFile, "\"%s\"\n", pszDomain);

	fclose(pDomainsFile);

	/* Rebuild indexes */
	if (MDomRebuildDomainsIndexes(szDomainsFilePath) < 0) {
		ErrorPush();
		RLckUnlockEX(hResLock);
		return ErrorPop();
	}
	/* Create domain directory */
	char szDomainPath[SYS_MAX_PATH] = "";

	MDomGetDomainPath(pszDomain, szDomainPath, sizeof(szDomainPath), 0);

	if (SysMakeDir(szDomainPath) < 0) {
		ErrorPush();
		RLckUnlockEX(hResLock);
		return ErrorPop();
	}
	/* Create cmd alias directory */
	if (USmlCreateCmdAliasDomainDir(pszDomain) < 0) {
		ErrorPush();
		RLckUnlockEX(hResLock);
		return ErrorPop();
	}
	RLckUnlockEX(hResLock);

	return 0;
}

int MDomRemoveDomain(char const *pszDomain)
{
	char szDomainsFilePath[SYS_MAX_PATH] = "";

	MDomGetDomainsFilePath(szDomainsFilePath, sizeof(szDomainsFilePath));

	char szTmpFile[SYS_MAX_PATH] = "";

	UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile));

	char szResLock[SYS_MAX_PATH] = "";
	RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szDomainsFilePath, szResLock,
							  sizeof(szResLock)));

	if (hResLock == INVALID_RLCK_HANDLE) {
		ErrorPush();
		CheckRemoveFile(szTmpFile);
		return ErrorPop();
	}

	FILE *pDomainsFile = fopen(szDomainsFilePath, "rt");

	if (pDomainsFile == NULL) {
		RLckUnlockEX(hResLock);
		CheckRemoveFile(szTmpFile);

		ErrSetErrorCode(ERR_DOMAINS_FILE_NOT_FOUND);
		return ERR_DOMAINS_FILE_NOT_FOUND;
	}

	FILE *pTmpFile = fopen(szTmpFile, "wt");

	if (pTmpFile == NULL) {
		fclose(pDomainsFile);
		RLckUnlockEX(hResLock);
		CheckRemoveFile(szTmpFile);

		ErrSetErrorCode(ERR_FILE_CREATE);
		return ERR_FILE_CREATE;
	}

	int iDomainsFound = 0;
	char szDomainsLine[MAIL_DOMAINS_LINE_MAX] = "";

	while (MscFGets(szDomainsLine, sizeof(szDomainsLine) - 1, pDomainsFile) != NULL) {
		char **ppszStrings = StrGetTabLineStrings(szDomainsLine);

		if (ppszStrings == NULL)
			continue;

		int iFieldsCount = StrStringsCount(ppszStrings);

		if ((iFieldsCount >= domMax) && (stricmp(pszDomain, ppszStrings[domDomain]) == 0)) {
			++iDomainsFound;
		} else
			fprintf(pTmpFile, "%s\n", szDomainsLine);
		StrFreeStrings(ppszStrings);
	}
	fclose(pDomainsFile);
	fclose(pTmpFile);

	if (iDomainsFound == 0) {
		SysRemove(szTmpFile);
		RLckUnlockEX(hResLock);

		ErrSetErrorCode(ERR_DOMAIN_NOT_HANDLED);
		return ERR_DOMAIN_NOT_HANDLED;
	}
	if (MscMoveFile(szTmpFile, szDomainsFilePath) < 0) {
		ErrorPush();
		RLckUnlockEX(hResLock);
		return ErrorPop();
	}

	/* Rebuild indexes */
	if (MDomRebuildDomainsIndexes(szDomainsFilePath) < 0) {
		ErrorPush();
		RLckUnlockEX(hResLock);
		return ErrorPop();
	}

	RLckUnlockEX(hResLock);

	/* Domain cleanup */
	if (UsrRemoveDomainUsers(pszDomain) < 0 ||
	    UsrRemoveDomainAliases(pszDomain) < 0 ||
	    ExAlRemoveDomainAliases(pszDomain) < 0 ||
	    GwLkRemoveDomainLinks(pszDomain) < 0 ||
	    ADomRemoveLinkedDomains(pszDomain) < 0)
		return ErrGetErrorCode();

	/* Try ( if defined ) to drop external auth domain */
	UAthDropDomain(AUTH_SERVICE_POP3, pszDomain);

	/* Directory cleanup */
	char szDomainPath[SYS_MAX_PATH] = "";

	MDomGetDomainPath(pszDomain, szDomainPath, sizeof(szDomainPath), 0);

	if (MscClearDirectory(szDomainPath) < 0)
		return ErrGetErrorCode();

	if (SysRemoveDir(szDomainPath) < 0)
		return ErrGetErrorCode();

	/* Remove the cmd alias directory */
	if (USmlDeleteCmdAliasDomainDir(pszDomain) < 0)
		return ErrGetErrorCode();

	return 0;
}

int MDomGetDomainsFileSnapShot(const char *pszFileName)
{
	char szDomainsFilePath[SYS_MAX_PATH] = "";

	MDomGetDomainsFilePath(szDomainsFilePath, sizeof(szDomainsFilePath));

	char szResLock[SYS_MAX_PATH] = "";
	RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szDomainsFilePath, szResLock,
							  sizeof(szResLock)));

	if (hResLock == INVALID_RLCK_HANDLE)
		return ErrGetErrorCode();

	if (MscCopyFile(pszFileName, szDomainsFilePath) < 0) {
		ErrorPush();
		RLckUnlockSH(hResLock);
		return ErrorPop();
	}
	RLckUnlockSH(hResLock);

	return 0;
}

DOMLS_HANDLE MDomOpenDB(void)
{
	DomainsScanData *pDSD = (DomainsScanData *) SysAlloc(sizeof(DomainsScanData));

	if (pDSD == NULL)
		return INVALID_DOMLS_HANDLE;

	UsrGetTmpFile(NULL, pDSD->szTmpDBFile, sizeof(pDSD->szTmpDBFile));

	if (MDomGetDomainsFileSnapShot(pDSD->szTmpDBFile) < 0) {
		CheckRemoveFile(pDSD->szTmpDBFile);
		SysFree(pDSD);
		return INVALID_DOMLS_HANDLE;
	}

	if ((pDSD->pDBFile = fopen(pDSD->szTmpDBFile, "rt")) == NULL) {
		SysRemove(pDSD->szTmpDBFile);
		SysFree(pDSD);
		return INVALID_DOMLS_HANDLE;
	}

	return (DOMLS_HANDLE) pDSD;
}

void MDomCloseDB(DOMLS_HANDLE hDomainsDB)
{
	DomainsScanData *pDSD = (DomainsScanData *) hDomainsDB;

	fclose(pDSD->pDBFile);
	SysRemove(pDSD->szTmpDBFile);
	SysFree(pDSD);
}

char const *MDomGetFirstDomain(DOMLS_HANDLE hDomainsDB)
{
	DomainsScanData *pDSD = (DomainsScanData *) hDomainsDB;

	rewind(pDSD->pDBFile);

	const char *pszDomain = NULL;
	char szDomainsLine[MAIL_DOMAINS_LINE_MAX] = "";

	while ((pszDomain == NULL) &&
	       (MscFGets(szDomainsLine, sizeof(szDomainsLine) - 1, pDSD->pDBFile) != NULL)) {
		char **ppszStrings = StrGetTabLineStrings(szDomainsLine);

		if (ppszStrings == NULL)
			continue;

		int iFieldsCount = StrStringsCount(ppszStrings);

		if (iFieldsCount >= domMax) {
			StrSNCpy(pDSD->szCurrDomain, ppszStrings[0]);
			pszDomain = pDSD->szCurrDomain;
		}
		StrFreeStrings(ppszStrings);
	}

	return pszDomain;
}

char const *MDomGetNextDomain(DOMLS_HANDLE hDomainsDB)
{
	DomainsScanData *pDSD = (DomainsScanData *) hDomainsDB;

	const char *pszDomain = NULL;
	char szDomainsLine[MAIL_DOMAINS_LINE_MAX] = "";

	while ((pszDomain == NULL) &&
	       (MscFGets(szDomainsLine, sizeof(szDomainsLine) - 1, pDSD->pDBFile) != NULL)) {
		char **ppszStrings = StrGetTabLineStrings(szDomainsLine);

		if (ppszStrings == NULL)
			continue;

		int iFieldsCount = StrStringsCount(ppszStrings);

		if (iFieldsCount >= domMax) {
			StrSNCpy(pDSD->szCurrDomain, ppszStrings[0]);
			pszDomain = pDSD->szCurrDomain;
		}
		StrFreeStrings(ppszStrings);
	}

	return pszDomain;
}

int MDomGetClientDomain(char const *pszFQDN, char *pszClientDomain, int iMaxDomain)
{
	for (; pszFQDN != NULL;) {
		if (MDomIsHandledDomain(pszFQDN) == 0) {
			StrNCpy(pszClientDomain, pszFQDN, iMaxDomain);

			return 0;
		}
		if ((pszFQDN = strchr(pszFQDN, '.')) != NULL)
			++pszFQDN;
	}

	ErrSetErrorCode(ERR_NO_HANDLED_DOMAIN);
	return ERR_NO_HANDLED_DOMAIN;
}

int MDomIsHandledDomain(char const *pszDomain)
{
	/* Check for alias domain */
	char szADomain[MAX_HOST_NAME] = "";

	if (ADomLookupDomain(pszDomain, szADomain, true))
		pszDomain = szADomain;

	return MDomLookupDomain(pszDomain);
}

xmail-1.27/SysDepLinux.cpp0000644000175000017500000001144211341640430014760 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#include "SysInclude.h"
#include "SysDep.h"
#include "SysDepUnix.h"
#include "AppDefines.h"

#define SINF_SIZE(s, f) (((SYS_INT64) (s).f) * (s).mem_unit)

int SysDepInitLibrary(void)
{
	return 0;
}

void SysDepCleanupLibrary(void)
{

}

#ifndef SYS_USE_MMSENDFILE

int SysSendFile(SYS_SOCKET SockFD, char const *pszFileName, SYS_OFF_T llBaseOffset,
		SYS_OFF_T llEndOffset, int iTimeout)
{
	int iFileID = open(pszFileName, O_RDONLY);

	if (iFileID == -1) {
		ErrSetErrorCode(ERR_FILE_OPEN, pszFileName);
		return ERR_FILE_OPEN;
	}

	SYS_OFF_T llFileSize = (SYS_OFF_T) lseek(iFileID, 0, SEEK_END);

	lseek(iFileID, 0, SEEK_SET);
	if (llEndOffset == -1)
		llEndOffset = llFileSize;

	/* Set send timeout */
	socklen_t OptLenght = sizeof(struct timeval);
	struct timeval oldTV;
	struct timeval newTV;

	if (getsockopt((int) SockFD, SOL_SOCKET, SO_SNDTIMEO, &oldTV, &OptLenght)) {
		close(iFileID);
		ErrSetErrorCode(ERR_GETSOCKOPT);
		return ERR_GETSOCKOPT;
	}

	newTV.tv_sec = iTimeout;
	newTV.tv_usec = 0;
	setsockopt((int) SockFD, SOL_SOCKET, SO_SNDTIMEO, &newTV, sizeof(newTV));

	/* Send the file */
	size_t iSndBuffSize = MIN_TCP_SEND_SIZE;
	time_t tStart;

	while (llBaseOffset < llEndOffset) {
		size_t iCurrSend = (size_t) Min((SYS_OFF_T) iSndBuffSize, llEndOffset - llBaseOffset);
		off_t ulStartOffset = (off_t) llBaseOffset;

		tStart = time(NULL);
		size_t iSendSize = sendfile((int) SockFD, iFileID, &ulStartOffset, iCurrSend);

		if (iSendSize != iCurrSend) {
			setsockopt((int) SockFD, SOL_SOCKET, SO_SNDTIMEO, &oldTV, sizeof(oldTV));
			close(iFileID);
			ErrSetErrorCode(ERR_SENDFILE);
			return ERR_SENDFILE;
		}

		if ((((time(NULL) - tStart) * K_IO_TIME_RATIO) < iTimeout) &&
		    (iSndBuffSize < MAX_TCP_SEND_SIZE))
			iSndBuffSize = Min(iSndBuffSize * 2, MAX_TCP_SEND_SIZE);

		llBaseOffset += iCurrSend;
	}
	setsockopt((int) SockFD, SOL_SOCKET, SO_SNDTIMEO, &oldTV, sizeof(oldTV));
	close(iFileID);

	return 0;
}

#else

int SysSendFile(SYS_SOCKET SockFD, char const *pszFileName, SYS_OFF_T llBaseOffset,
		SYS_OFF_T llEndOffset, int iTimeout)
{

	return SysSendFileMMap(SockFD, pszFileName, llBaseOffset, llEndOffset, iTimeout);
}

#endif

int SysSetThreadPriority(SYS_THREAD ThreadID, int iPriority)
{
	ThrData *pTD = (ThrData *) ThreadID;
	int iPolicy;
	struct sched_param SchParam;

	if (pthread_getschedparam(pTD->ThreadId, &iPolicy, &SchParam) != 0) {
		ErrSetErrorCode(ERR_SET_THREAD_PRIORITY);
		return ERR_SET_THREAD_PRIORITY;
	}

	int iMinPriority = sched_get_priority_min(iPolicy),
		iMaxPriority = sched_get_priority_max(iPolicy),
		iStdPriority = (iMinPriority + iMaxPriority) / 2;

	switch (iPriority) {
	case SYS_PRIORITY_NORMAL:
		SchParam.sched_priority = iStdPriority;
		break;

	case SYS_PRIORITY_LOWER:
		SchParam.sched_priority = iStdPriority - (iStdPriority - iMinPriority) / 3;
		break;

	case SYS_PRIORITY_HIGHER:
		SchParam.sched_priority = iStdPriority + (iStdPriority - iMinPriority) / 3;
		break;
	}
	if (pthread_setschedparam(pTD->ThreadId, iPolicy, &SchParam) != 0) {
		ErrSetErrorCode(ERR_SET_THREAD_PRIORITY);
		return ERR_SET_THREAD_PRIORITY;
	}

	return 0;
}

long SysGetTimeZone(void)
{
	return (long) timezone;
}

int SysGetDiskSpace(char const *pszPath, SYS_INT64 *pTotal, SYS_INT64 *pFree)
{
	struct statfs SFStat;

	if (statfs(pszPath, &SFStat) != 0) {
		ErrSetErrorCode(ERR_GET_DISK_SPACE_INFO);
		return ERR_GET_DISK_SPACE_INFO;
	}
	*pTotal = (SYS_INT64) SFStat.f_bsize * (SYS_INT64) SFStat.f_blocks;
	*pFree = (SYS_INT64) SFStat.f_bsize * (SYS_INT64) SFStat.f_bavail;

	return 0;
}

int SysMemoryInfo(SYS_INT64 *pRamTotal, SYS_INT64 *pRamFree,
		  SYS_INT64 *pVirtTotal, SYS_INT64 *pVirtFree)
{
	struct sysinfo SI;

	if (sysinfo(&SI) < 0) {
		ErrSetErrorCode(ERR_GET_MEMORY_INFO);
		return ERR_GET_MEMORY_INFO;
	}
	*pRamTotal = SINF_SIZE(SI, totalram);
	*pRamFree = SINF_SIZE(SI, freeram);
	*pVirtTotal = SINF_SIZE(SI, totalswap) + SINF_SIZE(SI, totalram);
	*pVirtFree = SINF_SIZE(SI, freeswap) + SINF_SIZE(SI, freeram);

	return 0;
}

xmail-1.27/SysDepSolaris.cpp0000644000175000017500000001007511341640430015276 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#include "SysInclude.h"
#include "SysDep.h"
#include "SysDepUnix.h"
#include "AppDefines.h"

#define MAX_THREAD_CONCURRENCY      512
#define MAX_SWAP_NAME_SIZE          256

int SysDepInitLibrary(void)
{
	thr_setconcurrency(MAX_THREAD_CONCURRENCY);

	return 0;
}

void SysDepCleanupLibrary(void)
{

}

int SysSetThreadPriority(SYS_THREAD ThreadID, int iPriority)
{
	ThrData *pTD = (ThrData *) ThreadID;
	int iPolicy, iMinPriority, iMaxPriority, iStdPriority;
	struct sched_param SchParam;

	if (pthread_getschedparam(pTD->ThreadId, &iPolicy, &SchParam) != 0) {
		ErrSetErrorCode(ERR_SET_THREAD_PRIORITY);
		return ERR_SET_THREAD_PRIORITY;
	}

	iMinPriority = sched_get_priority_min(iPolicy);
	iMaxPriority = sched_get_priority_max(iPolicy);
	iStdPriority = (iMinPriority + iMaxPriority) / 2;
	switch (iPriority) {
	case SYS_PRIORITY_NORMAL:
		SchParam.sched_priority = iStdPriority;
		break;

	case SYS_PRIORITY_LOWER:
		SchParam.sched_priority = iStdPriority - (iStdPriority - iMinPriority) / 3;
		break;

	case SYS_PRIORITY_HIGHER:
		SchParam.sched_priority = iStdPriority + (iStdPriority - iMinPriority) / 3;
		break;
	}
	if (pthread_setschedparam(pTD->ThreadId, iPolicy, &SchParam) != 0) {
		ErrSetErrorCode(ERR_SET_THREAD_PRIORITY);
		return ERR_SET_THREAD_PRIORITY;
	}

	return 0;
}

long SysGetTimeZone(void)
{
	return (long) timezone;
}

static int SysGetSwapInfo(SYS_INT64 *pSwapTotal, SYS_INT64 *pSwapFree)
{
	int i, iNumSwaps;
	SYS_INT64 PageSize;
	swaptbl_t *pSwTab;
	char *pszNameTab;

	*pSwapTotal = *pSwapFree = 0;
	if ((iNumSwaps = swapctl(SC_GETNSWP, 0)) == -1)
		return -1;
	if (iNumSwaps == 0)
		return 0;
	if ((pSwTab = (swaptbl_t *) SysAlloc(iNumSwaps * sizeof(swapent_t) +
					     sizeof(struct swaptable))) == NULL)
		return -1;

	if ((pszNameTab = (char *) malloc(iNumSwaps * MAX_SWAP_NAME_SIZE)) == NULL) {
		SysFree(pSwTab);
		return -1;
	}
	for (i = 0; i < iNumSwaps; i++)
		pSwTab->swt_ent[i].ste_path = pszNameTab + (i * MAX_SWAP_NAME_SIZE);

	pSwTab->swt_n = iNumSwaps;
	if ((iNumSwaps = swapctl(SC_LIST, pSwTab)) < 0) {
		SysFree(pszNameTab);
		SysFree(pSwTab);
		return -1;
	}

	PageSize = sysconf(_SC_PAGESIZE);
	for (i = 0; i < iNumSwaps; i++) {
		*pSwapTotal += (SYS_INT64) pSwTab->swt_ent[i].ste_pages * PageSize;
		*pSwapFree += (SYS_INT64) pSwTab->swt_ent[i].ste_free * PageSize;
	}
	SysFree(pszNameTab);
	SysFree(pSwTab);

	return 0;
}

int SysGetDiskSpace(char const *pszPath, SYS_INT64 *pTotal, SYS_INT64 *pFree)
{
	struct statvfs SFStat;

	if (statvfs(pszPath, &SFStat) != 0) {
		ErrSetErrorCode(ERR_GET_DISK_SPACE_INFO);
		return ERR_GET_DISK_SPACE_INFO;
	}
	*pTotal = (SYS_INT64) SFStat.f_bsize * (SYS_INT64) SFStat.f_blocks;
	*pFree = (SYS_INT64) SFStat.f_bsize * (SYS_INT64) SFStat.f_bavail;

	return 0;
}

int SysMemoryInfo(SYS_INT64 *pRamTotal, SYS_INT64 *pRamFree,
		  SYS_INT64 *pVirtTotal, SYS_INT64 *pVirtFree)
{
	SYS_INT64 PageSize, SwapTotal, SwapFree;

	if (SysGetSwapInfo(&SwapTotal, &SwapFree) < 0) {
		ErrSetErrorCode(ERR_GET_MEMORY_INFO);
		return ERR_GET_MEMORY_INFO;
	}
	PageSize = sysconf(_SC_PAGESIZE);

	*pRamTotal = sysconf(_SC_PHYS_PAGES) * PageSize;
	*pRamFree = sysconf(_SC_AVPHYS_PAGES) * PageSize;
	*pVirtTotal = SwapTotal + *pRamTotal;
	*pVirtFree = SwapFree + *pRamFree;

	return 0;
}

xmail-1.27/SSLBind.h0000644000175000017500000000316611341640430013440 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#ifndef _SSLBIND_H
#define _SSLBIND_H


#define BSSL_BIO_NAME "SSL"
#define BSSL_CERT_ISSUER 1
#define BSSL_CERT_SUBJECT 2

#define BSSLF_WANT_VERIFY (1 << 0)
#define BSSLF_WANT_CERT (1 << 1)
#define BSSLF_ALLOW_SEFLSIGNED (1 << 2)


struct SslServerBind {
	char *pszKeyFile;
	char *pszCertFile;
	unsigned long ulFlags;
	int iMaxDepth;
	char *pszCAFile;
	char *pszCAPath;
};

struct SslBindEnv {
	char *pszIssuer;
	char *pszSubject;
};


int BSslInit(void);
void BSslCleanup(void);
int BSslBindClient(BSOCK_HANDLE hBSock, SslServerBind const *pSSLB,
		   int (*pfEnvCB)(void *, int, void const *), void *pPrivate);
int BSslBindServer(BSOCK_HANDLE hBSock, SslServerBind const *pSSLB,
		   int (*pfEnvCB)(void *, int, void const *), void *pPrivate);

#endif

xmail-1.27/SysOsEventfd_pipe.cpp0000644000175000017500000000543511341640430016147 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#include "SysInclude.h"
#include "SysDep.h"
#include "SysDepUnix.h"
#include "AppDefines.h"

struct EventfdData {
	pthread_mutex_t Mtx;
	int iSignaled;
	int PipeFds[2];
};

SYS_EVENTFD SysEventfdCreate(void)
{
	EventfdData *pEFD;

	if ((pEFD = (EventfdData *) SysAlloc(sizeof(EventfdData))) == NULL)
		return SYS_INVALID_EVENTFD;
	if (pthread_mutex_init(&pEFD->Mtx, NULL) != 0) {
		SysFree(pEFD);
		ErrSetErrorCode(ERR_MUTEXINIT);
		return SYS_INVALID_EVENTFD;
	}
	if (pipe(pEFD->PipeFds) == -1) {
		pthread_mutex_destroy(&pEFD->Mtx);
		SysFree(pEFD);
		ErrSetErrorCode(ERR_PIPE);
		return SYS_INVALID_EVENTFD;
	}
	if (SysBlockFD(pEFD->PipeFds[0], 0) < 0 ||
	    SysBlockFD(pEFD->PipeFds[1], 0) < 0) {
		SYS_CLOSE_PIPE(pEFD->PipeFds);
		pthread_mutex_destroy(&pEFD->Mtx);
		SysFree(pEFD);
		return SYS_INVALID_EVENTFD;
	}

	return (SYS_EVENTFD) pEFD;
}

int SysEventfdClose(SYS_EVENTFD hEventfd)
{
	EventfdData *pEFD = (EventfdData *) hEventfd;

	if (pEFD != NULL) {
		SYS_CLOSE_PIPE(pEFD->PipeFds);
		pthread_mutex_destroy(&pEFD->Mtx);
		SysFree(pEFD);
	}

	return 0;
}

int SysEventfdWaitFD(SYS_EVENTFD hEventfd)
{
	EventfdData *pEFD = (EventfdData *) hEventfd;

	return pEFD->PipeFds[0];
}

int SysEventfdSet(SYS_EVENTFD hEventfd)
{
	EventfdData *pEFD = (EventfdData *) hEventfd;

	pthread_mutex_lock(&pEFD->Mtx);
	if (pEFD->iSignaled == 0) {
		write(pEFD->PipeFds[1], ".", 1);
		pEFD->iSignaled++;
	}
	pthread_mutex_unlock(&pEFD->Mtx);

	return 0;
}

int SysEventfdReset(SYS_EVENTFD hEventfd)
{
	EventfdData *pEFD = (EventfdData *) hEventfd;
	int iCount = 0;
	unsigned char uByte;

	pthread_mutex_lock(&pEFD->Mtx);
	if (pEFD->iSignaled > 0) {
		/*
		 * We write no more than one byte on the pipe (see above the
		 * SysEventfdSet() function), so we need one read of one byte
		 * only to flush it.
		 */
		if (read(pEFD->PipeFds[0], &uByte, 1) == 1)
			iCount++;
		pEFD->iSignaled = 0;
	}
	pthread_mutex_unlock(&pEFD->Mtx);

	return iCount;
}

xmail-1.27/StrUtils.h0000644000175000017500000000664611341640430014001 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#ifndef _STRUTILS_H
#define _STRUTILS_H

struct DynString {
	char *pszBuffer;
	int iStringSize;
	int iBufferSize;
};

void *StrMemDup(void const *pData, long lSize, long lExtra);
int StrCmdLineToken(char const *&pszCmdLine, char *pszToken);
char **StrGetArgs(char const *pszCmdLine, int &iArgsCount);
char *StrLower(char *pszString);
char *StrUpper(char *pszString);
char *StrCrypt(char const *pszString, char *pszCrypt);
char *StrDeCrypt(char const *pszString, char *pszDeCrypt);
char **StrBuildList(char const *pszString, ...);
char **StrTokenize(const char *pszString, const char *pszTokenizer);
void StrFreeStrings(char **ppszStrings);
int StrStringsCount(char const *const *ppszStrings);
bool StrStringsMatch(char const *const *ppszStrings, char const *pszMatch);
bool StrStringsIMatch(char const *const *ppszStrings, char const *pszMatch);
bool StrStringsRIWMatch(char const *const *pszMatches, char const *pszString);
char *StrConcat(char const *const *ppszStrings, char const *pszCStr);
char *StrDeQuote(char *pszString, int iChar);
char *StrQuote(const char *pszString, int iChar);
char **StrGetTabLineStrings(const char *pszUsrLine);
int StrWriteCRLFString(FILE *pFile, const char *pszString);
int StrWildMatch(char const *pszString, char const *pszMatch);
int StrIWildMatch(char const *pszString, char const *pszMatch);
char *StrLoadFile(FILE *pFile);
char *StrSprint(char const *pszFormat, ...);
int StrSplitString(char const *pszString, char const *pszSplitters,
		   char *pszStrLeft, int iSizeLeft, char *pszStrRight, int iSizeRight);
char *StrLTrim(char *pszString, char const *pszTrimChars);
char *StrRTrim(char *pszString, char const *pszTrimChars);
char *StrTrim(char *pszString, char const *pszTrimChars);
char *StrIStr(char const *pszBuffer, char const *pszMatch);
char *StrLimStr(char const *pszBuffer, char const *pszMatch, char const *pszLimits);
char *StrLimIStr(char const *pszBuffer, char const *pszMatch, char const *pszLimits);
int StrDynInit(DynString *pDS, char const *pszInit = NULL);
int StrDynFree(DynString *pDS);
int StrDynTruncate(DynString *pDS);
char const *StrDynGet(DynString *pDS);
char *StrDynDrop(DynString *pDS, int *piSize);
int StrDynSize(DynString *pDS);
int StrDynAdd(DynString *pDS, char const *pszBuffer, int iStringSize = -1);
int StrDynPrint(DynString *pDS, char const *pszFormat, ...);
char *StrNDup(char const *pszStr, int iSize);
int StrParamGet(char const *pszBuffer, char const *pszName, char *pszVal, int iMaxVal);
char *StrMacSubst(char const *pszIn, int *piSize,
		  char *(*pLkupProc)(void *, char const *, int), void *pPriv);

#endif
xmail-1.27/DNS.h0000644000175000017500000000676311341640430012634 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#ifndef _DNS_H
#define _DNS_H

#define DNS_QUERY_TCP           1
#define DNS_QUERY_UDP           2

#define DNS_STD_MAXDEPTH        32

#define QTYPE_A                 1
#define QTYPE_NS                2
#define QTYPE_MD                3
#define QTYPE_MF                4
#define QTYPE_CNAME             5
#define QTYPE_SOA               6
#define QTYPE_MB                7
#define QTYPE_MG                8
#define QTYPE_MR                9
#define QTYPE_NULL              10
#define QTYPE_WKS               11
#define QTYPE_PTR               12
#define QTYPE_HINFO             13
#define QTYPE_MINFO             14
#define QTYPE_MX                15
#define QTYPE_TXT               16

#define QTYPE_AAAA              28
#define QTYPE_ANSWER_MAX        29

#define QTYPE_AXFR              252
#define QTYPE_MAILB             253
#define QTYPE_MAILA             254
#define QTYPE_ALL               255

#define QCLASS_IN               1
#define QCLASS_CS               2
#define QCLASS_CH               3
#define QCLASS_HS               4

#define QCLASS_ALL              255

#define RCODE_FORMAT            1
#define RCODE_SVRFAIL           2
#define RCODE_NXDOMAIN          3
#define RCODE_NOTSUPPORTED      4
#define RCODE_REFUSED           5

struct DNS_HEADER {
	SYS_UINT16 Id;
#ifdef BIG_ENDIAN_BITFIELD
	SYS_UINT8 QR:1, OpCode:4, AA:1, TC:1, RD:1;
	SYS_UINT8 RA:1, Z:3, RCode:4;
#else
	SYS_UINT8 RD:1, TC:1, AA:1, OpCode:4, QR:1;
	SYS_UINT8 RCode:4, Z:3, RA:1;
#endif				// #ifdef BIG_ENDIAN_BITFIELD
	SYS_UINT16 QDCount;
	SYS_UINT16 ANCount;
	SYS_UINT16 NSCount;
	SYS_UINT16 ARCount;
};

struct DNSRecord {
	struct SysListHead Lnk;
	char szName[MAX_HOST_NAME];
	SYS_UINT32 TTL;
	SYS_UINT32 Class;
	union {
		struct {
			char szName[MAX_HOST_NAME];
		} NAME;
		struct {
			char szName[MAX_HOST_NAME];
			SYS_UINT16 Pref;
		} MX;
		struct {
			SYS_UINT32 IAddr4;
		} A;
		struct {
			SYS_UINT8 IAddr6[16];
		} AAAA;
		struct {
			char szName[MAX_HOST_NAME];
			char szAddr[MAX_ADDR_NAME];
			SYS_UINT32 Serial;
			SYS_UINT32 Refresh;
			SYS_UINT32 Retry;
			SYS_UINT32 Expire;
			SYS_UINT32 MinTTL;
		} SOA;
	} U;
};

struct DNSAnswer {
	int iQDCount;
	int iANCount;
	int iNSCount;
	int iARCount;
	int iAuth;
	struct SysListHead RecsLst[QTYPE_ANSWER_MAX];
};

void DNS_InitAnswer(DNSAnswer *pAns);
void DNS_FreeRecList(SysListHead *pHead);
void DNS_FreeAnswer(DNSAnswer *pAns);
int DNS_FatalError(int iError);
int DNS_Query(char const *pszName, unsigned int uQType, DNSAnswer *pAns,
	      int iMaxDepth = DNS_STD_MAXDEPTH);
int DNS_QueryDirect(char const *pszDNSServer, char const *pszName,
		    unsigned int uQType, int iQuerySockType, DNSAnswer *pAns);

#endif

xmail-1.27/DNS.cpp0000644000175000017500000005242511341640430013163 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#include "SysInclude.h"
#include "SysDep.h"
#include "SvrDefines.h"
#include "ShBlocks.h"
#include "StrUtils.h"
#include "BuffSock.h"
#include "SList.h"
#include "MailConfig.h"
#include "MessQueue.h"
#include "MailSvr.h"
#include "MiscUtils.h"
#include "SvrUtils.h"
#include "DNS.h"

#define DNS_PORTNO              53
#define DNS_SOCKET_TIMEOUT      16000
#define DNS_QUERY_EXTRA         1024
#define DNS_MAX_RESP_PACKET     1024
#define DNS_SEND_RETRIES        3
#define DNS_MAX_RR_DATA         256
#define DNS_RESPDATA_EXTRA      (2 * sizeof(int))

#if defined(BIG_ENDIAN_CPU)
#define DNS_LABEL_LEN_MASK      0x3fff
#else /* BIG_ENDIAN_CPU */
#define DNS_LABEL_LEN_MASK      0xff3f
#endif /* BIG_ENDIAN_CPU */

#define DNS_LABEL_LEN_INVMASK   0xc0

#define ROOTS_FILE              "dnsroots"

struct DNSQuery {
	DNS_HEADER DNSH;
	SYS_UINT8 QueryData[DNS_QUERY_EXTRA];
};

struct DNSResourceRecord {
	char szName[MAX_HOST_NAME];
	SYS_UINT16 Type;
	SYS_UINT16 Class;
	SYS_UINT32 TTL;
	SYS_UINT16 Lenght;
	SYS_UINT8 const *pBaseData;
	SYS_UINT8 const *pRespData;
};


void DNS_InitAnswer(DNSAnswer *pAns)
{
	int i;

	ZeroData(*pAns);
	for (i = 0; i < QTYPE_ANSWER_MAX; i++)
		SYS_INIT_LIST_HEAD(&pAns->RecsLst[i]);
}

void DNS_FreeRecList(SysListHead *pHead)
{
	SysListHead *pLnk;

	while ((pLnk = SYS_LIST_FIRST(pHead)) != NULL) {
		DNSRecord *pRec = SYS_LIST_ENTRY(pLnk, DNSRecord, Lnk);

		SYS_LIST_DEL(pLnk);
		SysFree(pRec);
	}
}

void DNS_FreeAnswer(DNSAnswer *pAns)
{
	int i;

	for (i = 0; i < QTYPE_ANSWER_MAX; i++)
		DNS_FreeRecList(&pAns->RecsLst[i]);
}

static DNSRecord *DNS_AllocRec(DNSAnswer *pAns, int iType,
			       DNSResourceRecord const *pRR)
{
	DNSRecord *pRec = (struct DNSRecord *) SysAlloc(sizeof(DNSRecord));

	if (pRec == NULL)
		return NULL;
	SYS_LIST_ADDT(&pRec->Lnk, &pAns->RecsLst[iType]);
	strcpy(pRec->szName, pRR->szName);
	pRec->TTL = pRR->TTL;
	pRec->Class = pRR->Class;

	return pRec;
}

static SYS_UINT8 *DNS_AllocRespData(int iSize)
{
	SYS_UINT8 *pBaseData = (SYS_UINT8 *) SysAlloc(iSize + DNS_RESPDATA_EXTRA);

	if (pBaseData == NULL)
		return NULL;
	*(int *) pBaseData = iSize;

	return pBaseData + DNS_RESPDATA_EXTRA;
}

static void DNS_FreeRespData(SYS_UINT8 *pRespData)
{
	if (pRespData != NULL)
		SysFree(pRespData - DNS_RESPDATA_EXTRA);
}

static int DNS_RespDataSize(SYS_UINT8 const *pRespData)
{
	SYS_UINT8 const *pBaseData = pRespData - DNS_RESPDATA_EXTRA;

	return *(int *) pBaseData;
}

static int DNS_GetText(SYS_UINT8 const *pBaseData, SYS_UINT8 const *pRespData,
		       char *pszText, int iMaxText, int *piRRLength)
{
	int iBaseLength = DNS_RespDataSize(pBaseData);
	int iCurrOffset = (int) (pRespData - pBaseData);
	int iDataLength = 0, iTextLength = 0, iBackLink = 0, iLabelLength;

	while (*pRespData != 0) {
		if (*pRespData & DNS_LABEL_LEN_INVMASK) {
			/* Got displacement from base-data (boundary checked) */
			if ((iCurrOffset = (int)
			     ntohs(MscReadUint16(pRespData) & DNS_LABEL_LEN_MASK)) >= iBaseLength) {
				ErrSetErrorCode(ERR_BAD_DNS_NAME_RECORD);
				return ERR_BAD_DNS_NAME_RECORD;
			}
			pRespData = pBaseData + iCurrOffset;
			if (!iBackLink)
				iDataLength += sizeof(SYS_UINT16), ++iBackLink;

			continue;
		}
		/* Extract label length (boundary checked) */
		iLabelLength = (int) *pRespData;
		if ((iMaxText > 0 && (iTextLength + iLabelLength + 2 >= iMaxText)) ||
		    (iCurrOffset + iLabelLength + 1 >= iBaseLength)) {
			ErrSetErrorCode(ERR_BAD_DNS_NAME_RECORD);
			return ERR_BAD_DNS_NAME_RECORD;
		}
		if (pszText != NULL) {
			/* Append to name and update pointers */
			memcpy(pszText, pRespData + 1, iLabelLength);
			pszText[iLabelLength] = '.';
			pszText += iLabelLength + 1;
		}
		iTextLength += iLabelLength + 1;

		/* If we've not got a back-jump, update the data length */
		if (!iBackLink)
			iDataLength += iLabelLength + 1;

		/* Move pointers */
		iCurrOffset += iLabelLength + 1;
		pRespData += iLabelLength + 1;
	}
	if (pszText != NULL)
		*pszText = '\0';
	if (piRRLength != NULL)
		*piRRLength = (!iBackLink) ? iDataLength + 1: iDataLength;

	return 0;
}

static int DNS_GetResourceRecord(SYS_UINT8 const *pBaseData, SYS_UINT8 const *pRespData,
				 DNSResourceRecord *pRR, int *piRRLength)
{
	int iRRLen;
	char *pszName;

	if (pRR != NULL) {
		ZeroData(*pRR);
		pRR->pBaseData = pBaseData;
		pszName = pRR->szName;
	} else
		pszName = NULL;

	/* Read name field */
	if (DNS_GetText(pBaseData, pRespData, pszName,
			pszName != NULL ? sizeof(pRR->szName): 0, &iRRLen) < 0)
		return ErrGetErrorCode();
	pRespData += iRRLen;

	/* Read type field */
	if (pRR != NULL)
		pRR->Type = ntohs(MscReadUint16(pRespData));
	pRespData += sizeof(SYS_UINT16);
	iRRLen += sizeof(SYS_UINT16);

	/* Read class field */
	if (pRR != NULL)
		pRR->Class = ntohs(MscReadUint16(pRespData));
	pRespData += sizeof(SYS_UINT16);
	iRRLen += sizeof(SYS_UINT16);

	/* Read TTL field */
	if (pRR != NULL)
		pRR->TTL = ntohl(MscReadUint32(pRespData));
	pRespData += sizeof(SYS_UINT32);
	iRRLen += sizeof(SYS_UINT32);

	/* Read lenght field */
	SYS_UINT16 Lenght = ntohs(MscReadUint16(pRespData));

	if (pRR != NULL)
		pRR->Lenght = Lenght;
	pRespData += sizeof(SYS_UINT16);
	iRRLen += sizeof(SYS_UINT16);

	/* Read RR data */
	if (pRR != NULL)
		pRR->pRespData = pRespData;
	iRRLen += (int) Lenght;
	if (piRRLength != NULL)
		*piRRLength = iRRLen;

	return 0;
}

static int DNS_NameCopy(SYS_UINT8 *pDNSQName, char const *pszInetName)
{
	int iNameLen = 0, iTokLen;
	char *pszToken, *pszSavePtr, *pszNameCopy;

	if ((pszNameCopy = SysStrDup(pszInetName)) == NULL)
		return ErrGetErrorCode();
	pszToken = SysStrTok(pszNameCopy, ".", &pszSavePtr);
	while (pszToken != NULL) {
		iTokLen = strlen(pszToken);

		*pDNSQName = (SYS_UINT8) iTokLen;

		strcpy((char *) pDNSQName + 1, pszToken);

		pDNSQName += iTokLen + 1;
		iNameLen += iTokLen + 1;

		pszToken = SysStrTok(NULL, ".", &pszSavePtr);
	}
	*pDNSQName = 0;
	SysFree(pszNameCopy);

	return iNameLen + 1;
}

static SYS_UINT16 DNS_GetUniqueQueryId(void)
{
	static SYS_UINT16 uDnsQueryId = 0;

	return (SYS_UINT16) (++uDnsQueryId * SysGetCurrentThreadId());
}

static int DNS_RequestSetup(DNSQuery **ppDNSQ, unsigned int uOpCode,
			    unsigned int uQType, char const *pszInetName,
			    int *piQLength, int iAskQR)
{
	int iNameLen;
	DNSQuery *pDNSQ;
	SYS_UINT8 *pQueryData;

	if ((pDNSQ = (DNSQuery *) SysAlloc(sizeof(DNSQuery))) == NULL)
		return ErrGetErrorCode();

	/* Setup query header */
	pDNSQ->DNSH.Id = DNS_GetUniqueQueryId();
	pDNSQ->DNSH.QR = 0;
	pDNSQ->DNSH.RD = (iAskQR) ? 1: 0;
	pDNSQ->DNSH.OpCode = uOpCode;
	pDNSQ->DNSH.QDCount = htons(1);
	pDNSQ->DNSH.ANCount = htons(0);
	pDNSQ->DNSH.NSCount = htons(0);
	pDNSQ->DNSH.ARCount = htons(0);

	pQueryData = pDNSQ->QueryData;

	/* Copy name to query */
	if ((iNameLen = DNS_NameCopy(pQueryData, pszInetName)) < 0)
		return ErrGetErrorCode();
	pQueryData += iNameLen;

	/* Set query type */
	MscWriteUint16(pQueryData, (SYS_UINT16) htons(uQType));
	pQueryData += sizeof(SYS_UINT16);

	/* Set query class */
	MscWriteUint16(pQueryData, (SYS_UINT16) htons(QCLASS_IN));
	pQueryData += sizeof(SYS_UINT16);

	*ppDNSQ = pDNSQ;
	*piQLength = (int) (pQueryData - (SYS_UINT8 *) pDNSQ);

	return 0;
}

static SYS_UINT8 *DNS_QuerySendStream(char const *pszDNSServer, int iPortNo, int iTimeout,
				      DNSQuery const *pDNSQ, int iQLenght)
{
	/* Open DNS server socket */
	SYS_SOCKET SockFD;
	SYS_INET_ADDR SvrAddr;
	SYS_INET_ADDR SockAddr;

	if (MscCreateClientSocket(pszDNSServer, iPortNo, SOCK_STREAM, &SockFD, &SvrAddr,
				  &SockAddr, iTimeout) < 0)
		return NULL;

	SYS_UINT16 QLenght = (SYS_UINT16) htons(iQLenght);

	/* Send packet lenght */
	if (SysSend(SockFD, (char *) &QLenght, sizeof(QLenght),
		    iTimeout) != sizeof(QLenght)) {
		ErrorPush();
		SysCloseSocket(SockFD);
		ErrSetErrorCode(ErrorFetch());
		return NULL;
	}
	/* Send packet */
	if (SysSend(SockFD, (char const *) pDNSQ, iQLenght, iTimeout) != iQLenght) {
		ErrorPush();
		SysCloseSocket(SockFD);
		ErrSetErrorCode(ErrorFetch());
		return NULL;
	}
	/* Receive packet lenght */
	if (SysRecv(SockFD, (char *) &QLenght, sizeof(QLenght),
		    iTimeout) != sizeof(QLenght)) {
		ErrorPush();
		SysCloseSocket(SockFD);
		ErrSetErrorCode(ErrorFetch());
		return NULL;
	}

	int iPacketLenght = (int) ntohs(QLenght);
	SYS_UINT8 *pRespData = DNS_AllocRespData(iPacketLenght + 1);

	if (pRespData == NULL) {
		ErrorPush();
		SysCloseSocket(SockFD);
		ErrSetErrorCode(ErrorFetch());
		return NULL;
	}
	/* Receive packet */
	if (SysRecv(SockFD, (char *) pRespData, iPacketLenght,
		    iTimeout) != iPacketLenght) {
		ErrorPush();
		DNS_FreeRespData(pRespData);
		SysCloseSocket(SockFD);
		ErrSetErrorCode(ErrorFetch());
		return NULL;
	}
	SysCloseSocket(SockFD);

	DNS_HEADER *pDNSH = (DNS_HEADER *) pRespData;

	if (pDNSQ->DNSH.RD && !pDNSH->RA) {
		DNS_FreeRespData(pRespData);
		ErrSetErrorCode(ERR_DNS_RECURSION_NOT_AVAILABLE);
		return NULL;
	}

	return pRespData;
}

static SYS_UINT8 *DNS_QuerySendDGram(char const *pszDNSServer, int iPortNo, int iTimeout,
				     DNSQuery const *pDNSQ, int iQLenght, int *piTrunc)
{
	int i, iPktSize;
	DNS_HEADER *pDNSH;
	SYS_UINT8 *pRespData;
	SYS_SOCKET SockFD;
	SYS_INET_ADDR SvrAddr, SockAddr, RecvAddr;
	SYS_UINT8 RespBuffer[1024];

	*piTrunc = 0;
	if (MscCreateClientSocket(pszDNSServer, iPortNo, SOCK_DGRAM, &SockFD, &SvrAddr,
				  &SockAddr, iTimeout) < 0)
		return NULL;

	for (i = 0; i < DNS_SEND_RETRIES; i++) {
		if (SysSendData(SockFD, (char const *) pDNSQ, iQLenght,
				iTimeout) != iQLenght)
			continue;

		ZeroData(RecvAddr);
		if ((iPktSize = SysRecvDataFrom(SockFD, &RecvAddr,
						(char *) RespBuffer, sizeof(RespBuffer),
						iTimeout)) < (int) sizeof(DNS_HEADER))
			continue;

		pDNSH = (DNS_HEADER *) RespBuffer;
		if (pDNSH->Id != pDNSQ->DNSH.Id)
			continue;

		if (pDNSQ->DNSH.RD && !pDNSH->RA) {
			SysCloseSocket(SockFD);
			ErrSetErrorCode(ERR_DNS_RECURSION_NOT_AVAILABLE);
			return NULL;
		}
		if (pDNSH->TC) {
			(*piTrunc)++;

			SysCloseSocket(SockFD);
			ErrSetErrorCode(ERR_TRUNCATED_DGRAM_DNS_RESPONSE);
			return NULL;
		}
		if ((pRespData = DNS_AllocRespData(iPktSize + 1)) == NULL) {
			ErrorPush();
			SysCloseSocket(SockFD);
			ErrSetErrorCode(ErrorFetch());
			return NULL;
		}
		memcpy(pRespData, RespBuffer, iPktSize);
		SysCloseSocket(SockFD);

		return pRespData;
	}
	SysCloseSocket(SockFD);

	ErrSetErrorCode(ERR_NO_DGRAM_DNS_RESPONSE);
	return NULL;
}

static SYS_UINT8 *DNS_QueryExec(char const *pszDNSServer, int iPortNo, int iTimeout,
				unsigned int uOpCode, unsigned int uQType,
				char const *pszInetName, int iAskQR)
{
	int iTrunc = 0;
	int iQLenght;
	DNSQuery *pDNSQ;
	SYS_UINT8 *pRespData;

	if (DNS_RequestSetup(&pDNSQ, uOpCode, uQType, pszInetName, &iQLenght,
			     iAskQR) < 0)
		return NULL;

	pRespData = DNS_QuerySendDGram(pszDNSServer, iPortNo, iTimeout,
				       pDNSQ, iQLenght, &iTrunc);
	if (pRespData == NULL && iTrunc)
		pRespData = DNS_QuerySendStream(pszDNSServer, iPortNo, iTimeout,
						pDNSQ, iQLenght);
	SysFree(pDNSQ);

	return pRespData;
}

static int DNS_DecodeRecord(DNSResourceRecord const *pRR, DNSAnswer *pAns)
{
	SYS_UINT8 const *pRRData = pRR->pRespData;
	DNSRecord *pRec;

	if (pRR->Type == QTYPE_MX) {
		if ((pRec = DNS_AllocRec(pAns, pRR->Type, pRR)) == NULL)
			return ErrGetErrorCode();

		pRec->U.MX.Pref = ntohs(MscReadUint16(pRRData));
		pRRData += sizeof(SYS_UINT16);

		if (DNS_GetText(pRR->pBaseData, pRRData, pRec->U.MX.szName,
				sizeof(pRec->U.MX.szName), NULL) < 0)
			return ErrGetErrorCode();
	} else if (pRR->Type == QTYPE_CNAME || pRR->Type == QTYPE_PTR ||
		   pRR->Type == QTYPE_NS) {
		if ((pRec = DNS_AllocRec(pAns, pRR->Type, pRR)) == NULL)
			return ErrGetErrorCode();
		if (DNS_GetText(pRR->pBaseData, pRRData, pRec->U.NAME.szName,
				sizeof(pRec->U.NAME.szName), NULL) < 0)
			return ErrGetErrorCode();
	} else if (pRR->Type == QTYPE_A) {
		if ((pRec = DNS_AllocRec(pAns, pRR->Type, pRR)) == NULL)
			return ErrGetErrorCode();
		pRec->U.A.IAddr4 = MscReadUint32(pRRData);
	} else if (pRR->Type == QTYPE_AAAA) {
		if ((pRec = DNS_AllocRec(pAns, pRR->Type, pRR)) == NULL)
			return ErrGetErrorCode();
		memcpy(pRec->U.AAAA.IAddr6, pRRData, sizeof(pRec->U.AAAA.IAddr6));
	} else if (pRR->Type == QTYPE_SOA) {
		int iRRLen;

		if ((pRec = DNS_AllocRec(pAns, pRR->Type, pRR)) == NULL)
			return ErrGetErrorCode();

		if (DNS_GetText(pRR->pBaseData, pRRData, pRec->U.SOA.szName,
				sizeof(pRec->U.SOA.szName), &iRRLen) < 0)
			return ErrGetErrorCode();
		pRRData += iRRLen;

		if (DNS_GetText(pRR->pBaseData, pRRData, pRec->U.SOA.szAddr,
				sizeof(pRec->U.SOA.szAddr), &iRRLen) < 0)
			return ErrGetErrorCode();
		pRRData += iRRLen;

		pRec->U.SOA.Serial = ntohl(MscReadUint32(pRRData));
		pRRData += sizeof(SYS_UINT32);

		pRec->U.SOA.Refresh = ntohl(MscReadUint32(pRRData));
		pRRData += sizeof(SYS_UINT32);

		pRec->U.SOA.Retry = ntohl(MscReadUint32(pRRData));
		pRRData += sizeof(SYS_UINT32);

		pRec->U.SOA.Expire = ntohl(MscReadUint32(pRRData));
		pRRData += sizeof(SYS_UINT32);

		pRec->U.SOA.MinTTL = ntohl(MscReadUint32(pRRData));
	} else {
		SysLogMessage(LOG_LEV_MESSAGE, "Unknown DNS record type %d\n",
			      (int) pRR->Type);

	}

	return 0;
}

static int DNS_MapRCodeError(unsigned int uRCode)
{
	switch (uRCode) {
	case RCODE_NXDOMAIN:
		return ERR_DNS_NXDOMAIN;
	case RCODE_FORMAT:
		return ERR_DNS_FORMAT;
	case RCODE_SVRFAIL:
		return ERR_DNS_SVRFAIL;
	case RCODE_NOTSUPPORTED:
		return ERR_DNS_NOTSUPPORTED;
	case RCODE_REFUSED:
		return ERR_DNS_REFUSED;
	}

	return ERR_BAD_DNS_RESPONSE;
}

static int DNS_GetQuery(SYS_UINT8 const *pBaseData, SYS_UINT8 const *pRespData,
			char *pszInetName, int iMaxName, SYS_UINT16 *pType,
			SYS_UINT16 *pClass, int *piRRLength)
{
	/* Read name field */
	int iQueryLen = 0;

	if (DNS_GetText(pBaseData, pRespData, pszInetName, iMaxName,
			&iQueryLen) < 0)
		return ErrGetErrorCode();

	pRespData += iQueryLen;

	/* Read type field */
	if (pType != NULL)
		*pType = ntohs(MscReadUint16(pRespData));

	pRespData += sizeof(SYS_UINT16);
	iQueryLen += sizeof(SYS_UINT16);

	/* Read class field */
	if (pClass != NULL)
		*pClass = ntohs(MscReadUint16(pRespData));

	pRespData += sizeof(SYS_UINT16);
	iQueryLen += sizeof(SYS_UINT16);

	if (piRRLength != NULL)
		*piRRLength = iQueryLen;

	return 0;
}

static int DNS_DecodeResponse(SYS_UINT8 *pRespData, DNSAnswer *pAns)
{
	DNSQuery *pDNSQ = (DNSQuery *) pRespData;
	SYS_UINT8 *pBaseData;
	int i, iRRLenght, iQLenght;
	SYS_UINT16 Type, Class;
	DNSResourceRecord RR;
	char szInetName[MAX_HOST_NAME];

	if (pDNSQ->DNSH.RCode != 0) {
		int iError = DNS_MapRCodeError(pDNSQ->DNSH.RCode);

		ErrSetErrorCode(iError);
		return iError;
	}

	pAns->iAuth = pDNSQ->DNSH.AA;
	pAns->iQDCount = ntohs(pDNSQ->DNSH.QDCount);
	pAns->iANCount = ntohs(pDNSQ->DNSH.ANCount);
	pAns->iNSCount = ntohs(pDNSQ->DNSH.NSCount);
	pAns->iARCount = ntohs(pDNSQ->DNSH.ARCount);

	pBaseData = pRespData;
	pRespData = pDNSQ->QueryData;

	/* Scan query data */
	for (i = 0; i < pAns->iQDCount; i++) {
		if (DNS_GetQuery(pBaseData, pRespData, szInetName, sizeof(szInetName),
				 &Type, &Class, &iQLenght) < 0)
			return ErrGetErrorCode();
		pRespData += iQLenght;
	}

	/* Scan answer data */
	for (i = 0; i < pAns->iANCount; i++) {
		if (DNS_GetResourceRecord(pBaseData, pRespData, &RR, &iRRLenght) < 0)
			return ErrGetErrorCode();
		pRespData += iRRLenght;
		DNS_DecodeRecord(&RR, pAns);
	}

	/* Scan name servers data */
	for (i = 0; i < pAns->iNSCount; i++) {
		if (DNS_GetResourceRecord(pBaseData, pRespData, &RR, &iRRLenght) < 0)
			return ErrGetErrorCode();

		pRespData += iRRLenght;
		DNS_DecodeRecord(&RR, pAns);
	}

	/* Scan additional records data */
	for (i = 0; i < pAns->iARCount; i++) {
		if (DNS_GetResourceRecord(pBaseData, pRespData, &RR, &iRRLenght) < 0)
			return ErrGetErrorCode();

		pRespData += iRRLenght;
		DNS_DecodeRecord(&RR, pAns);
	}

	return 0;
}

int DNS_FatalError(int iError)
{
	switch (iError) {
	case ERR_DNS_NXDOMAIN:
	case ERR_DNS_MAXDEPTH:
		return 1;
	}

	return 0;
}

static int DNS_RecurseQuery(SysListHead *pNsHead, char const *pszName,
			    unsigned int uQType, DNSAnswer *pAns, int iDepth,
			    int iMaxDepth)
{
	int iError;
	SYS_UINT8 *pRespData;
	SysListHead *pLnk;
	DNSRecord *pRec;
	SysListHead LstNS;

	if (iDepth > iMaxDepth) {
		SysLogMessage(LOG_LEV_MESSAGE, "Maximum DNS query depth %d exceeded ('%s')\n",
			      iMaxDepth, pszName);

		ErrSetErrorCode(ERR_DNS_MAXDEPTH, pszName);
		return ERR_DNS_MAXDEPTH;
	}
	for (pLnk = SYS_LIST_FIRST(pNsHead); pLnk != NULL;
	     pLnk = SYS_LIST_NEXT(pLnk, pNsHead)) {
		pRec = SYS_LIST_ENTRY(pLnk, DNSRecord, Lnk);
		DNS_InitAnswer(pAns);

		/*
		 * The record list passed to this function is a NS list, so
		 * the U.NAME member is valid.
		 */
		if ((pRespData = DNS_QueryExec(pRec->U.NAME.szName, DNS_PORTNO,
					       DNS_SOCKET_TIMEOUT, 0, uQType,
					       pszName, 0)) == NULL) {
			DNS_FreeAnswer(pAns);
			continue;
		}
		iError = DNS_DecodeResponse(pRespData, pAns);
		DNS_FreeRespData(pRespData);
		if (DNS_FatalError(iError)) {
			DNS_FreeAnswer(pAns);
			return iError;
		}
		if (iError != 0) {
			DNS_FreeAnswer(pAns);
			continue;
		}
		if (pAns->iANCount > 0)
			return 0;

		/*
		 * We've got no answers, but we may have had authority (NS) records.
		 * Steal the NS list from the DNSAnswer structure, so that we can
		 * free the strcture itself, and cycle through the stolen NS list.
		 * Otherwise we continue to the next NS ...
		 */
		SYS_INIT_LIST_HEAD(&LstNS);
		SYS_LIST_SPLICE(&pAns->RecsLst[QTYPE_NS], &LstNS);
		DNS_FreeAnswer(pAns);
		if (!SYS_LIST_EMTPY(&LstNS)) {
			iError = DNS_RecurseQuery(&LstNS, pszName, uQType, pAns,
						  iDepth + 1, iMaxDepth);

			DNS_FreeRecList(&LstNS);
			if (iError == 0 || DNS_FatalError(iError) ||
			    iError == ERR_DNS_NOTFOUND)
				return iError;
		}
	}

	ErrSetErrorCode(ERR_DNS_NOTFOUND);
	return ERR_DNS_NOTFOUND;
}

static char *DNS_GetRootsFile(char *pszRootsFilePath, int iMaxPath)
{
	CfgGetRootPath(pszRootsFilePath, iMaxPath);
	StrNCat(pszRootsFilePath, ROOTS_FILE, iMaxPath);

	return pszRootsFilePath;
}

static int DNS_LoadRoots(SysListHead *pHead)
{
	int iCount;
	FILE *pFile;
	DNSRecord *pRec;
	SysListHead TmpList;
	char szRootsFile[SYS_MAX_PATH];
	char szHost[MAX_HOST_NAME];

	DNS_GetRootsFile(szRootsFile, sizeof(szRootsFile));
	if ((pFile = fopen(szRootsFile, "rt")) == NULL) {
		ErrSetErrorCode(ERR_FILE_OPEN, szRootsFile);
		return ERR_FILE_OPEN;
	}
	SYS_INIT_LIST_HEAD(&TmpList);
	for (iCount = 0; MscFGets(szHost, sizeof(szHost) - 1, pFile) != NULL; iCount++) {
		if ((pRec = (struct DNSRecord *)
		     SysAlloc(sizeof(DNSRecord))) == NULL) {
			DNS_FreeRecList(&TmpList);
			fclose(pFile);
			return ErrGetErrorCode();
		}
		SYS_LIST_ADDT(&pRec->Lnk, &TmpList);
		strcpy(pRec->szName, ".");
		strcpy(pRec->U.NAME.szName, szHost);
	}
	fclose(pFile);
	SYS_INIT_LIST_HEAD(pHead);
	/*
	 * We need to randomize the DNS roots list, to avoid to always ping
	 * the same root during our queries ...
	 */
	if (iCount > 1) {
		int iSplit = rand() % iCount;
		SysListHead *pLnk;

		for (pLnk = SYS_LIST_FIRST(&TmpList); iSplit > 0;
		     iSplit--, pLnk = SYS_LIST_NEXT(pLnk, &TmpList));
		while (pLnk != NULL) {
			pRec = SYS_LIST_ENTRY(pLnk, DNSRecord, Lnk);
			pLnk = SYS_LIST_NEXT(pLnk, &TmpList);
			SYS_LIST_DEL(&pRec->Lnk);
			SYS_LIST_ADDT(&pRec->Lnk, pHead);
		}
		while ((pLnk = SYS_LIST_FIRST(&TmpList)) != NULL) {
			SYS_LIST_DEL(pLnk);
			SYS_LIST_ADDT(pLnk, pHead);
		}
	}

	return 0;
}

int DNS_Query(char const *pszName, unsigned int uQType, DNSAnswer *pAns,
	      int iMaxDepth)
{
	int iError;
	SysListHead LstNS;

	if (DNS_LoadRoots(&LstNS) < 0)
		return ErrGetErrorCode();

	iError = DNS_RecurseQuery(&LstNS, pszName, uQType, pAns, 0, iMaxDepth);

	DNS_FreeRecList(&LstNS);

	return iError;
}

int DNS_QueryDirect(char const *pszDNSServer, char const *pszName,
		    unsigned int uQType, int iQuerySockType, DNSAnswer *pAns)
{
	int iQLenght, iError, iTrunc = 0;
	DNSQuery *pDNSQ;
	SYS_UINT8 *pRespData;

	/* Setup DNS MX query with recursion requested */
	if (DNS_RequestSetup(&pDNSQ, 0, uQType, pszName, &iQLenght, 1) < 0)
		return ErrGetErrorCode();

	switch (iQuerySockType) {
	case DNS_QUERY_TCP:
		pRespData = DNS_QuerySendStream(pszDNSServer, DNS_PORTNO,
						DNS_SOCKET_TIMEOUT,
						pDNSQ, iQLenght);
		break;

	case DNS_QUERY_UDP:
	default:
		/* Try needed UDP query first, if it's truncated switch to TCP query */
		if ((pRespData = DNS_QuerySendDGram(pszDNSServer, DNS_PORTNO,
						    DNS_SOCKET_TIMEOUT,
						    pDNSQ, iQLenght,
						    &iTrunc)) == NULL && iTrunc)
			pRespData = DNS_QuerySendStream(pszDNSServer, DNS_PORTNO,
							DNS_SOCKET_TIMEOUT, pDNSQ,
							iQLenght);
	}
	SysFree(pDNSQ);
	if (pRespData == NULL)
		return ErrGetErrorCode();
	DNS_InitAnswer(pAns);

	iError = DNS_DecodeResponse(pRespData, pAns);

	DNS_FreeRespData(pRespData);

	return iError;
}

xmail-1.27/CTRLSvr.cpp0000644000175000017500000021277511341640430014004 0ustar  davidedavide/*
 *  XMail by Davide Libenzi (Intranet and Internet mail server)
 *  Copyright (C) 1999,..,2010  Davide Libenzi
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  Davide Libenzi 
 *
 */

#include "SysInclude.h"
#include "SysDep.h"
#include "SvrDefines.h"
#include "ShBlocks.h"
#include "SList.h"
#include "BuffSock.h"
#include "SSLBind.h"
#include "SSLConfig.h"
#include "ResLocks.h"
#include "MiscUtils.h"
#include "MD5.h"
#include "MailConfig.h"
#include "SvrUtils.h"
#include "UsrUtils.h"
#include "StrUtils.h"
#include "POP3Utils.h"
#include "MessQueue.h"
#include "SMAILUtils.h"
#include "QueueUtils.h"
#include "UsrMailList.h"
#include "POP3GwLink.h"
#include "MailDomains.h"
#include "AliasDomain.h"
#include "ExtAliases.h"
#include "SMTPUtils.h"
#include "MailConfig.h"
#include "AppDefines.h"
#include "MailSvr.h"
#include "CTRLSvr.h"

#define CTRL_ACCOUNTS_FILE      "ctrlaccounts.tab"
#define CTRL_ACCOUNTS_LINE_MAX  512
#define STD_CTRL_TIMEOUT        45000
#define CTRL_IPMAP_FILE         "ctrl.ipmap.tab"
#define CTRL_LOG_FILE           "ctrl"
#define CTRL_MAX_LINE_SIZE      4096
#define CTRL_QUIT_CMD_EXIT      1
#define CTRL_LISTFOLLOW_RESULT  100
#define CTRL_WAITDATA_RESULT    101
#define CTRL_VAR_DROP_VALUE     ".|rm"
#define CTRL_TLS_INIT_STR       "#!TLS"

enum CtrlAccountsFileds {
	accUsername = 0,
	accPassword,

	accMax
};

static int CTRLLogEnabled(SHB_HANDLE hShbCTRL, CTRLConfig *pCTRLCfg = NULL);
static int CTRLThreadCountAdd(long lCount, SHB_HANDLE hShbCTRL, CTRLConfig *pCTRLCfg = NULL);

static CTRLConfig *CTRLGetConfigCopy(SHB_HANDLE hShbCTRL)
{
	CTRLConfig *pCTRLCfg = (CTRLConfig *) ShbLock(hShbCTRL);

	if (pCTRLCfg == NULL)
		return NULL;

	CTRLConfig *pCTRLCfgCopy = (CTRLConfig *) SysAlloc(sizeof(CTRLConfig));

	if (pCTRLCfgCopy != NULL)
		memcpy(pCTRLCfgCopy, pCTRLCfg, sizeof(CTRLConfig));

	ShbUnlock(hShbCTRL);

	return pCTRLCfgCopy;
}

static int CTRLLogEnabled(SHB_HANDLE hShbCTRL, CTRLConfig *pCTRLCfg)
{
	int iDoUnlock = 0;

	if (pCTRLCfg == NULL) {
		if ((pCTRLCfg = (CTRLConfig *) ShbLock(hShbCTRL)) == NULL)
			return ErrGetErrorCode();
		++iDoUnlock;
	}

	unsigned long ulFlags = pCTRLCfg->ulFlags;

	if (iDoUnlock)
		ShbUnlock(hShbCTRL);

	return (ulFlags & CTRLF_LOG_ENABLED) ? 1: 0;
}

static int CTRLCheckPeerIP(SYS_SOCKET SockFD)
{
	char szIPMapFile[SYS_MAX_PATH] = "";

	CfgGetRootPath(szIPMapFile, sizeof(szIPMapFile));
	StrSNCat(szIPMapFile, CTRL_IPMAP_FILE);

	if (SysExistFile(szIPMapFile)) {
		SYS_INET_ADDR PeerInfo;

		if (SysGetPeerInfo(SockFD, PeerInfo) < 0)
			return ErrGetErrorCode();

		if (MscCheckAllowedIP(szIPMapFile, PeerInfo, true) < 0)
			return ErrGetErrorCode();
	}

	return 0;
}

static int CTRLLogSession(char const *pszUsername, char const *pszPassword,
			  SYS_INET_ADDR const &PeerInfo, int iStatus)
{
	char szTime[256] = "";

	MscGetTimeNbrString(szTime, sizeof(szTime) - 1);

	RLCK_HANDLE hResLock = RLckLockEX(SVR_LOGS_DIR SYS_SLASH_STR CTRL_LOG_FILE);

	if (hResLock == INVALID_RLCK_HANDLE)
		return ErrGetErrorCode();

	char szIP[128] = "???.???.???.???";

	MscFileLog(CTRL_LOG_FILE, "\"%s\""
		   "\t\"%s\""
		   "\t\"%s\""
		   "\t\"%s\""
		   "\t\"%s\""
		   "\n", SysInetNToA(PeerInfo, szIP, sizeof(szIP)), pszUsername, pszPassword,
		   szTime, (iStatus == 0) ? "REQ": ((iStatus > 0) ? "AUTH": "FAIL"));

	RLckUnlockEX(hResLock);

	return 0;
}

static int CTRLThreadCountAdd(long lCount, SHB_HANDLE hShbCTRL, CTRLConfig *pCTRLCfg)
{
	int iDoUnlock = 0;

	if (pCTRLCfg == NULL) {
		if ((pCTRLCfg = (CTRLConfig *) ShbLock(hShbCTRL)) == NULL)
			return ErrGetErrorCode();

		++iDoUnlock;
	}
	if ((pCTRLCfg->lThreadCount + lCount) > pCTRLCfg->lMaxThreads) {
		if (iDoUnlock)
			ShbUnlock(hShbCTRL);

		ErrSetErrorCode(ERR_SERVER_BUSY);
		return ERR_SERVER_BUSY;
	}
	pCTRLCfg->lThreadCount += lCount;
	if (iDoUnlock)
		ShbUnlock(hShbCTRL);

	return 0;
}

static int CTRLSendCmdResult(BSOCK_HANDLE hBSock, int iErrorCode, char const *pszMessage,
			     int iTimeout)
{
	int iSendResult;

	if (iErrorCode >= 0)
		iSendResult = BSckVSendString(hBSock, iTimeout, "+%05d %s", iErrorCode,
					      pszMessage);
	else
		iSendResult = BSckVSendString(hBSock, iTimeout, "-%05d %s", -iErrorCode,
					      pszMessage);

	return iSendResult;
}

static int CTRLSendCmdResult(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock, int iErrorCode,
			     char const *pszMessage)
{
	return CTRLSendCmdResult(hBSock, iErrorCode, pszMessage, pCTRLCfg->iTimeout);
}

static int CTRLSendCmdResult(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock, int iErrorCode)
{
	return (CTRLSendCmdResult(pCTRLCfg, hBSock, iErrorCode,
				  (iErrorCode >= 0) ? "OK": ErrGetErrorString(iErrorCode)));

}

static int CTRLVSendCmdResult(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock, int iErrorCode,
			      char const *pszFormat, ...)
{
	char *pszMessage = NULL;

	StrVSprint(pszMessage, pszFormat, pszFormat);

	if (pszMessage == NULL)
		return ErrGetErrorCode();

	int iSendResult = CTRLSendCmdResult(hBSock, iErrorCode, pszMessage, pCTRLCfg->iTimeout);

	SysFree(pszMessage);

	return iSendResult;
}

static char *CTRLGetAccountsFilePath(char *pszAccFilePath, int iMaxPath)
{
	CfgGetRootPath(pszAccFilePath, iMaxPath);

	StrNCat(pszAccFilePath, CTRL_ACCOUNTS_FILE, iMaxPath);

	return pszAccFilePath;
}

static int CTRLAccountCheck(CTRLConfig *pCTRLCfg, char const *pszUsername,
			    char const *pszPassword, char const *pszTimeStamp)
{
	char szAccFilePath[SYS_MAX_PATH] = "";

	CTRLGetAccountsFilePath(szAccFilePath, sizeof(szAccFilePath));

	char szResLock[SYS_MAX_PATH] = "";
	RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szAccFilePath, szResLock,
							  sizeof(szResLock)));

	if (hResLock == INVALID_RLCK_HANDLE)
		return ErrGetErrorCode();

	FILE *pAccountsFile = fopen(szAccFilePath, "rt");

	if (pAccountsFile == NULL) {
		RLckUnlockSH(hResLock);

		ErrSetErrorCode(ERR_CTRL_ACCOUNTS_FILE_NOT_FOUND);
		return ERR_CTRL_ACCOUNTS_FILE_NOT_FOUND;
	}

	char szAccountsLine[CTRL_ACCOUNTS_LINE_MAX] = "";

	while (MscFGets(szAccountsLine, sizeof(szAccountsLine) - 1, pAccountsFile) != NULL) {
		char **ppszStrings = StrGetTabLineStrings(szAccountsLine);

		if (ppszStrings == NULL)
			continue;

		int iFieldsCount = StrStringsCount(ppszStrings);

		if ((iFieldsCount >= accMax) &&
		    (stricmp(pszUsername, ppszStrings[accUsername]) == 0)) {

			char szClearPassword[256] = "";

			StrDeCrypt(ppszStrings[accPassword], szClearPassword);

			StrFreeStrings(ppszStrings);
			fclose(pAccountsFile);
			RLckUnlockSH(hResLock);

			/* Check for MD5 authentication ( # as first char of password ) */
			if (*pszPassword == '#') {
				if (MscMD5Authenticate
				    (szClearPassword, pszTimeStamp, pszPassword + 1) < 0) {
					ErrSetErrorCode(ERR_BAD_CTRL_LOGIN);
					return ERR_BAD_CTRL_LOGIN;
				}
			} else if (strcmp(szClearPassword, pszPassword) != 0) {
				ErrSetErrorCode(ERR_BAD_CTRL_LOGIN);
				return ERR_BAD_CTRL_LOGIN;
			}

			return 0;
		}
		StrFreeStrings(ppszStrings);
	}
	fclose(pAccountsFile);

	RLckUnlockSH(hResLock);

	ErrSetErrorCode(ERR_BAD_CTRL_LOGIN);
	return ERR_BAD_CTRL_LOGIN;
}

static int CTRLSslEnvCB(void *pPrivate, int iID, void const *pData)
{
	SslBindEnv *pSslE = (SslBindEnv *) pPrivate;

	/*
	 * Empty for now ...
	 */


	return 0;
}

static int CTRLLogin(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
		     char const *pszTimeStamp, SYS_INET_ADDR const &PeerInfo)
{
	char szLogin[256] = "";

	if (BSckGetString(hBSock, szLogin, sizeof(szLogin) - 1, pCTRLCfg->iTimeout) == NULL ||
	    MscCmdStringCheck(szLogin) < 0)
		return ErrGetErrorCode();

	if (strcmp(szLogin, CTRL_TLS_INIT_STR) == 0) {
		int iError;
		SslServerBind SSLB;
		SslBindEnv SslE;

		if (strcmp(BSckBioName(hBSock), BSSL_BIO_NAME) == 0) {
			CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_SSL_ALREADY_ACTIVE);
			ErrSetErrorCode(ERR_SSL_ALREADY_ACTIVE);
			return ERR_SSL_ALREADY_ACTIVE;
		} else if (!SvrTestConfigFlag("EnableCTRL-TLS", true)) {
			CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_SSL_DISABLED);
			ErrSetErrorCode(ERR_SSL_DISABLED);
			return ERR_SSL_DISABLED;
		}
		if (CSslBindSetup(&SSLB) < 0) {
			ErrorPush();
			CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
			return ErrorPop();
		}
		ZeroData(SslE);

		CTRLSendCmdResult(pCTRLCfg, hBSock, 0, "Ready to start TLS mode");

		iError = BSslBindServer(hBSock, &SSLB, CTRLSslEnvCB, &SslE);

		CSslBindCleanup(&SSLB);
		if (iError < 0)
			return iError;

		SysFree(SslE.pszIssuer);
		SysFree(SslE.pszSubject);
		if (BSckGetString(hBSock, szLogin, sizeof(szLogin) - 1,
				  pCTRLCfg->iTimeout) == NULL ||
		    MscCmdStringCheck(szLogin) < 0)
			return ErrGetErrorCode();
	}

	char **ppszTokens = StrGetTabLineStrings(szLogin);

	if (ppszTokens == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	int iTokensCount = StrStringsCount(ppszTokens);

	if (iTokensCount != 2) {
		StrFreeStrings(ppszTokens);

		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_LOGIN);
		ErrSetErrorCode(ERR_BAD_CTRL_LOGIN);
		return ERR_BAD_CTRL_LOGIN;
	}
	/* Log CTRL login request */
	if (CTRLLogEnabled(SHB_INVALID_HANDLE, pCTRLCfg))
		CTRLLogSession(ppszTokens[0], ppszTokens[1], PeerInfo, 0);

	/* Check user and password */
	if (CTRLAccountCheck(pCTRLCfg, ppszTokens[0], ppszTokens[1], pszTimeStamp) < 0) {
		ErrorPush();
		/* Log CTRL login failure */
		if (CTRLLogEnabled(SHB_INVALID_HANDLE, pCTRLCfg))
			CTRLLogSession(ppszTokens[0], ppszTokens[1], PeerInfo, -1);

		StrFreeStrings(ppszTokens);

		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}
	/* Log CTRL login authentication */
	if (CTRLLogEnabled(SHB_INVALID_HANDLE, pCTRLCfg))
		CTRLLogSession(ppszTokens[0], ppszTokens[1], PeerInfo, +1);

	StrFreeStrings(ppszTokens);

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_useradd(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			  char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 5) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	if (MDomIsHandledDomain(ppszTokens[1]) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	if (USmtpCheckDomainPart(ppszTokens[1]) < 0 ||
	    USmtpCheckAddressPart(ppszTokens[2]) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	UserInfo *pUI = UsrCreateDefaultUser(ppszTokens[1], ppszTokens[2], ppszTokens[3],
					     (ppszTokens[4][0] == 'M') ? usrTypeML: usrTypeUser);

	if (pUI == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}
	if (UsrAddUser(pUI) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		UsrFreeUserInfo(pUI);
		return ErrorPop();
	}

	UsrFreeUserInfo(pUI);

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_userdel(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			  char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 3) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	if (MDomIsHandledDomain(ppszTokens[1]) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	if (UsrRemoveUser(ppszTokens[1], ppszTokens[2], 0) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_userpasswd(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			     char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 4) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	if (MDomIsHandledDomain(ppszTokens[1]) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}
	/* Check real user account existence */
	UserInfo *pUI = UsrGetUserByName(ppszTokens[1], ppszTokens[2]);

	if (pUI == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}
	/* Set account password and do modify */
	SysFree(pUI->pszPassword);
	pUI->pszPassword = SysStrDup(ppszTokens[3]);

	if (UsrModifyUser(pUI) < 0) {
		ErrorPush();
		UsrFreeUserInfo(pUI);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	UsrFreeUserInfo(pUI);

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_aliasadd(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			   char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 4) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}
	/* Check real user account existence */
	char szAccountName[MAX_ADDR_NAME] = "";
	char szAccountDomain[MAX_ADDR_NAME] = "";

	if (USmtpSplitEmailAddr(ppszTokens[3], szAccountName, szAccountDomain) < 0) {
		StrSNCpy(szAccountName, ppszTokens[3]);
		StrSNCpy(szAccountDomain, ppszTokens[1]);
	}

	UserInfo *pUI = UsrGetUserByName(szAccountDomain, szAccountName);

	if (pUI == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	UsrFreeUserInfo(pUI);

	/* Check if we're overlapping an existing users with the new alias */
	if ((pUI = UsrGetUserByName(ppszTokens[1], ppszTokens[2])) != NULL) {
		UsrFreeUserInfo(pUI);

		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_USER_EXIST);

		ErrSetErrorCode(ERR_USER_EXIST);
		return ERR_USER_EXIST;
	}

	AliasInfo *pAI = UsrAllocAlias(ppszTokens[1], ppszTokens[2], ppszTokens[3]);

	if (pAI == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	if (UsrAddAlias(pAI) < 0) {
		ErrorPush();
		UsrFreeAlias(pAI);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	UsrFreeAlias(pAI);

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_aliasdel(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			   char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 3) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	if (UsrRemoveAlias(ppszTokens[1], ppszTokens[2]) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_aliaslist(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			    char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount > 4) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	char const *pszDomain = (iTokensCount > 1) ? ppszTokens[1]: NULL;
	char const *pszAlias = (iTokensCount > 2) ? ppszTokens[2]: NULL;
	char const *pszName = (iTokensCount > 3) ? ppszTokens[3]: NULL;

	ALSF_HANDLE hAliasDB = UsrAliasOpenDB();

	if (hAliasDB == INVALID_ALSF_HANDLE) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_LISTFOLLOW_RESULT);

	AliasInfo *pAI = UsrAliasGetFirst(hAliasDB);

	if (pAI != NULL) {
		do {
			if (((pszDomain == NULL) || StrIWildMatch(pAI->pszDomain, pszDomain)) &&
			    ((pszAlias == NULL) || StrIWildMatch(pAI->pszAlias, pszAlias)) &&
			    ((pszName == NULL) || StrIWildMatch(pAI->pszName, pszName))) {
				char szAliasLine[1024] = "";

				sprintf(szAliasLine,
					"\"%s\"\t"
					"\"%s\"\t"
					"\"%s\"", pAI->pszDomain, pAI->pszAlias, pAI->pszName);

				if (BSckSendString(hBSock, szAliasLine, pCTRLCfg->iTimeout) < 0) {
					ErrorPush();
					UsrFreeAlias(pAI);
					UsrAliasCloseDB(hAliasDB);
					return ErrorPop();
				}
			}

			UsrFreeAlias(pAI);

		} while ((pAI = UsrAliasGetNext(hAliasDB)) != NULL);
	}

	BSckSendString(hBSock, ".", pCTRLCfg->iTimeout);

	UsrAliasCloseDB(hAliasDB);

	return 0;
}

static int CTRLDo_exaliasadd(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			     char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 3) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	/* Split local and remote accounts addresses */
	char szLocName[MAX_ADDR_NAME] = "";
	char szLocDomain[MAX_ADDR_NAME] = "";
	char szRmtName[MAX_ADDR_NAME] = "";
	char szRmtDomain[MAX_ADDR_NAME] = "";

	if ((USmtpSplitEmailAddr(ppszTokens[1], szLocName, szLocDomain) < 0) ||
	    (USmtpSplitEmailAddr(ppszTokens[2], szRmtName, szRmtDomain) < 0)) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	/* Build the external alias structure */
	ExtAlias *pEA = ExAlAllocAlias();

	if (pEA == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	pEA->pszRmtDomain = SysStrDup(szRmtDomain);
	pEA->pszRmtName = SysStrDup(szRmtName);
	pEA->pszDomain = SysStrDup(szLocDomain);
	pEA->pszName = SysStrDup(szLocName);

	if (ExAlAddAlias(pEA) < 0) {
		ErrorPush();
		ExAlFreeAlias(pEA);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}
	ExAlFreeAlias(pEA);

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_exaliasdel(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			     char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 2) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	/* Split local and remote accounts addresses */
	char szRmtName[MAX_ADDR_NAME] = "";
	char szRmtDomain[MAX_ADDR_NAME] = "";

	if (USmtpSplitEmailAddr(ppszTokens[1], szRmtName, szRmtDomain) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	/* Build the external alias structure */
	ExtAlias *pEA = ExAlAllocAlias();

	if (pEA == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	pEA->pszRmtDomain = SysStrDup(szRmtDomain);
	pEA->pszRmtName = SysStrDup(szRmtName);

	if (ExAlRemoveAlias(pEA) < 0) {
		ErrorPush();
		ExAlFreeAlias(pEA);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}
	ExAlFreeAlias(pEA);

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_exaliaslist(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			      char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount > 3) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	/* Split local and remote accounts addresses */
	char const *pszLocNameMatch = "*";
	char const *pszLocDomainMatch = "*";
	char const *pszRmtNameMatch = "*";
	char const *pszRmtDomainMatch = "*";
	char szLocName[MAX_ADDR_NAME] = "";
	char szLocDomain[MAX_ADDR_NAME] = "";
	char szRmtName[MAX_ADDR_NAME] = "";
	char szRmtDomain[MAX_ADDR_NAME] = "";

	if (iTokensCount > 1) {
		if (USmtpSplitEmailAddr(ppszTokens[1], szLocName, szLocDomain) < 0) {
			ErrorPush();
			CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
			return ErrorPop();
		}
		pszLocNameMatch = szLocName;
		pszLocDomainMatch = szLocDomain;

		if (iTokensCount > 2) {
			if (USmtpSplitEmailAddr(ppszTokens[2], szRmtName, szRmtDomain) < 0) {
				ErrorPush();
				CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
				return ErrorPop();
			}
			pszRmtNameMatch = szRmtName;
			pszRmtDomainMatch = szRmtDomain;
		}
	}

	EXAL_HANDLE hLinksDB = ExAlOpenDB();

	if (hLinksDB == INVALID_EXAL_HANDLE) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_LISTFOLLOW_RESULT);

	ExtAlias *pEA;

	for (pEA = ExAlGetFirstAlias(hLinksDB); pEA != NULL;
	     pEA = ExAlGetNextAlias(hLinksDB)) {
		if (StrIWildMatch(pEA->pszRmtDomain, pszRmtDomainMatch) &&
		    StrIWildMatch(pEA->pszRmtName, pszRmtNameMatch) &&
		    StrIWildMatch(pEA->pszDomain, pszLocDomainMatch) &&
		    StrIWildMatch(pEA->pszName, pszLocNameMatch)) {
			char szAliasLine[1024] = "";

			sprintf(szAliasLine,
				"\"%s\"\t"
				"\"%s\"\t"
				"\"%s\"\t"
				"\"%s\"", pEA->pszRmtDomain, pEA->pszRmtName,
				pEA->pszDomain, pEA->pszName);

			if (BSckSendString(hBSock, szAliasLine, pCTRLCfg->iTimeout) < 0) {
				ErrorPush();
				ExAlFreeAlias(pEA);
				ExAlCloseDB(hLinksDB);
				return ErrorPop();
			}
		}

		ExAlFreeAlias(pEA);
	}

	BSckSendString(hBSock, ".", pCTRLCfg->iTimeout);

	ExAlCloseDB(hLinksDB);

	return 0;
}

static int CTRLDo_uservars(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			   char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 3) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	char const *pszDomain = ppszTokens[1];
	char const *pszName = ppszTokens[2];

	if (MDomIsHandledDomain(pszDomain) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	UserInfo *pUI = UsrGetUserByName(pszDomain, pszName);

	if (pUI == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	char **ppszVars = UsrGetProfileVars(pUI);

	if (ppszVars == NULL) {
		ErrorPush();
		UsrFreeUserInfo(pUI);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_LISTFOLLOW_RESULT);

	for (int ii = 0; ppszVars[ii] != NULL; ii++) {
		char *pszVar = UsrGetUserInfoVar(pUI, ppszVars[ii]);

		if (pszVar != NULL) {
			if (BSckVSendString(hBSock, pCTRLCfg->iTimeout, "\"%s\"\t\"%s\"",
					    ppszVars[ii], pszVar) < 0) {
				ErrorPush();
				SysFree(pszVar);
				StrFreeStrings(ppszVars);
				UsrFreeUserInfo(pUI);
				return ErrorPop();
			}
			SysFree(pszVar);
		}
	}
	StrFreeStrings(ppszVars);
	UsrFreeUserInfo(pUI);

	BSckSendString(hBSock, ".", pCTRLCfg->iTimeout);

	return 0;
}

static int CTRLDo_uservarsset(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			      char const *const *ppszTokens, int iTokensCount)
{
	if ((iTokensCount < 5) || (((iTokensCount - 3) % 2) != 0)) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	char const *pszDomain = ppszTokens[1];
	char const *pszName = ppszTokens[2];

	if (MDomIsHandledDomain(pszDomain) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	UserInfo *pUI = UsrGetUserByName(pszDomain, pszName);

	if (pUI == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	for (int ii = 3; ii < (iTokensCount - 1); ii += 2) {
		/* Check if the variable deletion is requested */
		if (strcmp(ppszTokens[ii + 1], CTRL_VAR_DROP_VALUE) == 0)
			UsrDelUserInfoVar(pUI, ppszTokens[ii]);
		else {
			/* Set user variable */
			if (UsrSetUserInfoVar(pUI, ppszTokens[ii], ppszTokens[ii + 1]) < 0) {
				ErrorPush();
				UsrFreeUserInfo(pUI);
				CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
				return ErrorPop();
			}
		}
	}
	UsrFlushUserVars(pUI);
	UsrFreeUserInfo(pUI);

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_userlist(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			   char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount > 3) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	char const *pszDomain = (iTokensCount > 1) ? ppszTokens[1]: NULL;
	char const *pszName = (iTokensCount > 2) ? ppszTokens[2]: NULL;

	USRF_HANDLE hUsersDB = UsrOpenDB();

	if (hUsersDB == INVALID_USRF_HANDLE) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_LISTFOLLOW_RESULT);

	UserInfo *pUI = UsrGetFirstUser(hUsersDB, 0);

	if (pUI != NULL) {
		do {
			if (((pszDomain == NULL) || StrIWildMatch(pUI->pszDomain, pszDomain)) &&
			    ((pszName == NULL) || StrIWildMatch(pUI->pszName, pszName))) {
				char szUserLine[1024] = "";

				SysSNPrintf(szUserLine, sizeof(szUserLine),
					    "\"%s\"\t"
					    "\"%s\"\t"
					    "\"%s\"\t"
					    "\"%s\"",
					    pUI->pszDomain, pUI->pszName, pUI->pszPassword,
					    pUI->pszType);
				if (BSckSendString(hBSock, szUserLine, pCTRLCfg->iTimeout) < 0) {
					ErrorPush();
					UsrFreeUserInfo(pUI);
					UsrCloseDB(hUsersDB);
					return ErrorPop();
				}
			}

			UsrFreeUserInfo(pUI);

		} while ((pUI = UsrGetNextUser(hUsersDB, 0)) != NULL);
	}

	BSckSendString(hBSock, ".", pCTRLCfg->iTimeout);

	UsrCloseDB(hUsersDB);

	return 0;
}

static int CTRLDo_usergetmproc(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			       char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount < 3) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	unsigned long ulGMPFlags = 0;

	if (iTokensCount >= 4) {
		char const *pszFlag;

		for (pszFlag = ppszTokens[3]; *pszFlag != '\0'; pszFlag++)
			switch (*pszFlag) {
			case 'u':
			case 'U':
				ulGMPFlags |= GMPROC_USER;
				break;
			case 'd':
			case 'D':
				ulGMPFlags |= GMPROC_DOMAIN;
				break;
			}
	} else
		ulGMPFlags = GMPROC_DOMAIN | GMPROC_USER;

	if (MDomIsHandledDomain(ppszTokens[1]) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	/* Check real user account existence */
	UserInfo *pUI = UsrGetUserByName(ppszTokens[1], ppszTokens[2]);

	if (pUI == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}
	/* Exist user custom message processing ? */
	char szMPFile[SYS_MAX_PATH] = "";

	UsrGetTmpFile(NULL, szMPFile, sizeof(szMPFile));
	if (UsrGetMailProcessFile(pUI, szMPFile, ulGMPFlags) < 0) {
		ErrorPush();
		UsrFreeUserInfo(pUI);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_LISTFOLLOW_RESULT);

	/* Send mailproc file */
	if (MscSendTextFile(szMPFile, hBSock, pCTRLCfg->iTimeout) < 0) {
		ErrorPush();
		SysRemove(szMPFile);
		UsrFreeUserInfo(pUI);
		return ErrorPop();
	}
	SysRemove(szMPFile);
	UsrFreeUserInfo(pUI);

	return 0;
}

static int CTRLDo_usersetmproc(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			       char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount < 3) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	int iWhichMP = GMPROC_USER;

	if (iTokensCount >= 4 &&
	    (ppszTokens[3][0] == 'd' || ppszTokens[3][0] == 'D'))
		iWhichMP = GMPROC_DOMAIN;

	if (MDomIsHandledDomain(ppszTokens[1]) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	/* Check real user account existence */
	UserInfo *pUI = UsrGetUserByName(ppszTokens[1], ppszTokens[2]);

	if (pUI == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_WAITDATA_RESULT);

	/* Read user data in file */
	char szMPFile[SYS_MAX_PATH] = "";

	UsrGetTmpFile(NULL, szMPFile, sizeof(szMPFile));

	if (MscRecvTextFile(szMPFile, hBSock, pCTRLCfg->iTimeout) < 0) {
		ErrorPush();
		CheckRemoveFile(szMPFile);
		UsrFreeUserInfo(pUI);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}
	/* Get file info for size checking */
	SYS_FILE_INFO FI;

	if (SysGetFileInfo(szMPFile, FI) < 0) {
		ErrorPush();
		CheckRemoveFile(szMPFile);
		UsrFreeUserInfo(pUI);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}
	/* Set mailproc file ( or delete it if size == 0 ) */
	if (UsrSetMailProcessFile(pUI, (FI.llSize != 0) ? szMPFile: NULL,
				  iWhichMP) < 0) {
		ErrorPush();
		SysRemove(szMPFile);
		UsrFreeUserInfo(pUI);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	SysRemove(szMPFile);
	UsrFreeUserInfo(pUI);

	return 0;
}

static int CTRLDo_userauth(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			   char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 4) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}
	/* Check real user account existence */
	UserInfo *pUI = UsrGetUserByName(ppszTokens[1], ppszTokens[2]);

	if (pUI == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}
	/* Check password */
	if (strcmp(pUI->pszPassword, ppszTokens[3]) != 0) {
		UsrFreeUserInfo(pUI);

		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_INVALID_PASSWORD);
		ErrSetErrorCode(ERR_INVALID_PASSWORD);
		return ERR_INVALID_PASSWORD;
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	UsrFreeUserInfo(pUI);

	return 0;
}

static int CTRLDo_userstat(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			   char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 3) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}
	/* Check real user account existence */
	char szRealAddress[MAX_ADDR_NAME] = "";
	UserInfo *pUI = UsrGetUserByNameOrAlias(ppszTokens[1], ppszTokens[2],
						szRealAddress);

	if (pUI == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}
	/* Get mailbox infos */
	SYS_OFF_T llMBSize = 0;
	unsigned long ulNumMessages = 0;

	if (UPopGetMailboxSize(pUI, llMBSize, ulNumMessages) < 0) {
		ErrorPush();
		UsrFreeUserInfo(pUI);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	time_t LTime = time(NULL);
	PopLastLoginInfo LoginInfo;
	char szIPAddr[128] = "0.0.0.0";
	char szLoginTime[128] = "";

	if (UPopGetLastLoginInfo(pUI, &LoginInfo) == 0) {
		SysInetNToA(LoginInfo.Address, szIPAddr, sizeof(szIPAddr));
		LTime = LoginInfo.LTime;
	}
	MscGetTimeStr(szLoginTime, sizeof(szLoginTime) - 1, LTime);

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_LISTFOLLOW_RESULT);

	if (BSckVSendString(hBSock, pCTRLCfg->iTimeout, "\"RealAddress\"\t\"%s\"",
			    szRealAddress) < 0 ||
	    BSckVSendString(hBSock, pCTRLCfg->iTimeout, "\"MailboxSize\"\t\"" SYS_OFFT_FMT "\"",
			    llMBSize) < 0 ||
	    BSckVSendString(hBSock, pCTRLCfg->iTimeout, "\"MailboxMessages\"\t\"%lu\"",
			    ulNumMessages) < 0 ||
	    BSckVSendString(hBSock, pCTRLCfg->iTimeout, "\"LastLoginTimeDate\"\t\"%s\"",
			    szLoginTime) < 0 ||
	    BSckVSendString(hBSock, pCTRLCfg->iTimeout, "\"LastLoginIP\"\t\"%s\"",
			    szIPAddr) < 0) {
		ErrorPush();
		UsrFreeUserInfo(pUI);
		return ErrorPop();
	}
	UsrFreeUserInfo(pUI);

	BSckSendString(hBSock, ".", pCTRLCfg->iTimeout);

	return 0;
}

static int CTRLDo_mluseradd(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			    char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount < 4) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	if (MDomIsHandledDomain(ppszTokens[1]) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	if (USmtpCheckAddress(ppszTokens[3]) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	UserInfo *pUI = UsrGetUserByName(ppszTokens[1], ppszTokens[2]);

	if (pUI == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	if (UsrGetUserType(pUI) != usrTypeML) {
		UsrFreeUserInfo(pUI);

		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_USER_NOT_MAILINGLIST);
		ErrSetErrorCode(ERR_USER_NOT_MAILINGLIST);
		return ERR_USER_NOT_MAILINGLIST;
	}

	char const *pszPerms = (iTokensCount > 4) ? ppszTokens[4]: DEFAULT_MLUSER_PERMS;
	MLUserInfo *pMLUI = UsrMLAllocDefault(ppszTokens[3], pszPerms);

	if (pMLUI == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		UsrFreeUserInfo(pUI);
		return ErrorPop();
	}

	if (UsrMLAddUser(pUI, pMLUI) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		UsrMLFreeUser(pMLUI);
		UsrFreeUserInfo(pUI);
		return ErrorPop();
	}

	UsrMLFreeUser(pMLUI);

	UsrFreeUserInfo(pUI);

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_mluserdel(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			    char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 4) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	if (MDomIsHandledDomain(ppszTokens[1]) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	UserInfo *pUI = UsrGetUserByName(ppszTokens[1], ppszTokens[2]);

	if (pUI == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	if (UsrGetUserType(pUI) != usrTypeML) {
		UsrFreeUserInfo(pUI);

		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_USER_NOT_MAILINGLIST);
		ErrSetErrorCode(ERR_USER_NOT_MAILINGLIST);
		return ERR_USER_NOT_MAILINGLIST;
	}

	if (UsrMLRemoveUser(pUI, ppszTokens[3]) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		UsrFreeUserInfo(pUI);
		return ErrorPop();
	}

	UsrFreeUserInfo(pUI);

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_mluserlist(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			     char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 3) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	if (MDomIsHandledDomain(ppszTokens[1]) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	UserInfo *pUI = UsrGetUserByName(ppszTokens[1], ppszTokens[2]);

	if (pUI == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	if (UsrGetUserType(pUI) != usrTypeML) {
		UsrFreeUserInfo(pUI);

		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_USER_NOT_MAILINGLIST);
		ErrSetErrorCode(ERR_USER_NOT_MAILINGLIST);
		return ERR_USER_NOT_MAILINGLIST;
	}

	USRML_HANDLE hUsersDB = UsrMLOpenDB(pUI);

	if (hUsersDB == INVALID_USRML_HANDLE) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		UsrFreeUserInfo(pUI);
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_LISTFOLLOW_RESULT);

	/* Mailing list scan */
	MLUserInfo *pMLUI = UsrMLGetFirstUser(hUsersDB);

	for (; pMLUI != NULL; pMLUI = UsrMLGetNextUser(hUsersDB)) {
		char szUserLine[512] = "";

		sprintf(szUserLine, "\"%s\"\t\"%s\"", pMLUI->pszAddress, pMLUI->pszPerms);

		if (BSckSendString(hBSock, szUserLine, pCTRLCfg->iTimeout) < 0) {
			ErrorPush();
			UsrMLFreeUser(pMLUI);
			UsrFreeUserInfo(pUI);
			UsrMLCloseDB(hUsersDB);
			return ErrorPop();
		}

		UsrMLFreeUser(pMLUI);
	}

	BSckSendString(hBSock, ".", pCTRLCfg->iTimeout);

	UsrFreeUserInfo(pUI);
	UsrMLCloseDB(hUsersDB);

	return 0;
}

static int CTRLDo_domainadd(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			    char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 2) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}
	if (USmtpCheckDomainPart(ppszTokens[1]) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	char szDomain[MAX_HOST_NAME] = "";

	StrSNCpy(szDomain, ppszTokens[1]);
	StrLower(szDomain);

	if (MDomIsHandledDomain(szDomain) == 0) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_ALREADY_EXIST);

		ErrSetErrorCode(ERR_ALREADY_EXIST);
		return ERR_ALREADY_EXIST;
	}
	if (MDomAddDomain(szDomain) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_domaindel(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			    char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 2) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	char szDomain[MAX_HOST_NAME] = "";

	StrSNCpy(szDomain, ppszTokens[1]);
	StrLower(szDomain);

	if (MDomRemoveDomain(szDomain) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_domainlist(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			     char const *const *ppszTokens, int iTokensCount)
{
	DOMLS_HANDLE hDomainsDB = MDomOpenDB();

	if (hDomainsDB == INVALID_DOMLS_HANDLE) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_LISTFOLLOW_RESULT);

	char const *pszDomain = MDomGetFirstDomain(hDomainsDB);

	if (pszDomain != NULL) {
		do {
			if ((iTokensCount < 2) || StrStringsRIWMatch(&ppszTokens[1], pszDomain)) {
				char szDomainLine[512] = "";

				sprintf(szDomainLine, "\"%s\"", pszDomain);

				if (BSckSendString(hBSock, szDomainLine, pCTRLCfg->iTimeout) < 0) {
					ErrorPush();
					MDomCloseDB(hDomainsDB);
					return ErrorPop();
				}
			}
		} while ((pszDomain = MDomGetNextDomain(hDomainsDB)) != NULL);
	}

	BSckSendString(hBSock, ".", pCTRLCfg->iTimeout);

	MDomCloseDB(hDomainsDB);

	return 0;
}

static int CTRLDo_custdomget(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			     char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 2) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}
	/* Try to get custom domain file ( if exist ) */
	char szCustDomainFile[SYS_MAX_PATH] = "";

	UsrGetTmpFile(NULL, szCustDomainFile, sizeof(szCustDomainFile));

	if (USmlGetCustomDomainFile(ppszTokens[1], szCustDomainFile) < 0) {
		ErrorPush();
		CheckRemoveFile(szCustDomainFile);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_LISTFOLLOW_RESULT);

	/* Send custom domain file */
	if (MscSendTextFile(szCustDomainFile, hBSock, pCTRLCfg->iTimeout) < 0) {
		ErrorPush();
		SysRemove(szCustDomainFile);
		return ErrorPop();
	}

	SysRemove(szCustDomainFile);

	return 0;
}

static int CTRLDo_custdomset(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			     char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 2) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	if (USmtpCheckDomainPart(ppszTokens[1]) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_WAITDATA_RESULT);

	/* Read user data in file */
	char szCustDomainFile[SYS_MAX_PATH] = "";

	UsrGetTmpFile(NULL, szCustDomainFile, sizeof(szCustDomainFile));

	if (MscRecvTextFile(szCustDomainFile, hBSock, pCTRLCfg->iTimeout) < 0) {
		ErrorPush();
		CheckRemoveFile(szCustDomainFile);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}
	/* Get file info for size checking */
	SYS_FILE_INFO FI;

	if (SysGetFileInfo(szCustDomainFile, FI) < 0) {
		ErrorPush();
		CheckRemoveFile(szCustDomainFile);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}
	/* Set custom domain file ( or delete it if size == 0 ) */
	if (USmlSetCustomDomainFile(ppszTokens[1],
				    (FI.llSize != 0) ? szCustDomainFile: NULL) < 0) {
		ErrorPush();
		SysRemove(szCustDomainFile);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	SysRemove(szCustDomainFile);

	return 0;
}

static int CTRLDo_custdomlist(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			      char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 1) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_LISTFOLLOW_RESULT);

	char szCustomPath[SYS_MAX_PATH] = "";

	USmlGetDomainCustomDir(szCustomPath, sizeof(szCustomPath), 0);

	char szCustFileName[SYS_MAX_PATH] = "";
	FSCAN_HANDLE hFileScan = MscFirstFile(szCustomPath, 0, szCustFileName,
					      sizeof(szCustFileName));

	if (hFileScan != INVALID_FSCAN_HANDLE) {
		do {
			char szCustDomain[SYS_MAX_PATH] = "";

			MscSplitPath(szCustFileName, NULL, 0, szCustDomain, sizeof(szCustDomain),
				     NULL, 0);
			if (BSckVSendString(hBSock, pCTRLCfg->iTimeout, "\"%s\"",
					    szCustDomain) < 0) {
				ErrorPush();
				MscCloseFindFile(hFileScan);
				return ErrorPop();
			}
		} while (MscNextFile(hFileScan, szCustFileName, sizeof(szCustFileName)));
		MscCloseFindFile(hFileScan);
	}

	BSckSendString(hBSock, ".", pCTRLCfg->iTimeout);

	return 0;
}

static int CTRLDo_noop(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
		       char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 1) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_quit(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
		       char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 1) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return CTRL_QUIT_CMD_EXIT;
}

static int CTRLDo_poplnkadd(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			    char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 7) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	POP3Link *pPopLnk = GwLkAllocLink(ppszTokens[1], ppszTokens[2],
					  ppszTokens[3], ppszTokens[4], ppszTokens[5],
					  ppszTokens[6]);

	if (pPopLnk == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}
	if (GwLkAddLink(pPopLnk) < 0) {
		ErrorPush();
		GwLkFreePOP3Link(pPopLnk);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}
	GwLkFreePOP3Link(pPopLnk);

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_poplnkdel(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			    char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 5) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	POP3Link *pPopLnk = GwLkAllocLink(ppszTokens[1], ppszTokens[2],
					  ppszTokens[3], ppszTokens[4], NULL, NULL);

	if (pPopLnk == NULL) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}
	if (GwLkRemoveLink(pPopLnk) < 0) {
		ErrorPush();
		GwLkFreePOP3Link(pPopLnk);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}
	GwLkFreePOP3Link(pPopLnk);

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_poplnklist(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			     char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount > 3) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	char const *pszDomain = (iTokensCount > 1) ? ppszTokens[1]: NULL;
	char const *pszName = (iTokensCount > 2) ? ppszTokens[2]: NULL;

	GWLKF_HANDLE hLinksDB = GwLkOpenDB();

	if (hLinksDB == INVALID_GWLKF_HANDLE) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_LISTFOLLOW_RESULT);

	POP3Link *pPopLnk = GwLkGetFirstUser(hLinksDB);

	if (pPopLnk != NULL) {
		do {
			if (((pszDomain == NULL) || (stricmp(pPopLnk->pszDomain, pszDomain) == 0))
			    && ((pszName == NULL) || (stricmp(pPopLnk->pszName, pszName) == 0))) {
				char const *pszEnable =
					(GwLkCheckEnabled(pPopLnk) == 0) ? "ON": "OFF";
				char szLinkLine[2048] = "";

				SysSNPrintf(szLinkLine, sizeof(szLinkLine),
					    "\"%s\"\t"
					    "\"%s\"\t"
					    "\"%s\"\t"
					    "\"%s\"\t"
					    "\"%s\"\t"
					    "\"%s\"\t"
					    "\"%s\"",
					    pPopLnk->pszDomain, pPopLnk->pszName,
					    pPopLnk->pszRmtDomain, pPopLnk->pszRmtName,
					    pPopLnk->pszRmtPassword, pPopLnk->pszAuthType, pszEnable);
				if (BSckSendString(hBSock, szLinkLine, pCTRLCfg->iTimeout) < 0) {
					ErrorPush();
					GwLkFreePOP3Link(pPopLnk);
					GwLkCloseDB(hLinksDB);
					return ErrorPop();
				}
			}
			GwLkFreePOP3Link(pPopLnk);
		} while ((pPopLnk = GwLkGetNextUser(hLinksDB)) != NULL);
	}

	BSckSendString(hBSock, ".", pCTRLCfg->iTimeout);

	GwLkCloseDB(hLinksDB);

	return 0;
}

static int CTRLDo_poplnkenable(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			       char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount < 4) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	bool bEnable = (atoi(ppszTokens[1])) ? true: false;
	char const *pszDomain = ppszTokens[2];
	char const *pszName = ppszTokens[3];
	char const *pszRmtDomain = (iTokensCount > 4) ? ppszTokens[4]: NULL;
	char const *pszRmtName = (iTokensCount > 5) ? ppszTokens[5]: NULL;

	if (GwLkEnable(pszDomain, pszName, pszRmtDomain, pszRmtName, bEnable) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLCheckRelativePath(char const *pszPath)
{
	/* Check 101 tricky path */
	if (strstr(pszPath, "..") != NULL) {
		ErrSetErrorCode(ERR_BAD_RELATIVE_PATH);
		return ERR_BAD_RELATIVE_PATH;
	}

	return 0;
}

static int CTRLDo_filelist(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			   char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 3) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}
	/* Check relative path syntax */
	if (CTRLCheckRelativePath(ppszTokens[1]) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}
	/* Setup listing file path */
	char szRelativePath[SYS_MAX_PATH] = "";
	char szFullPath[SYS_MAX_PATH] = "";

	StrSNCpy(szRelativePath, ppszTokens[1]);
	MscTranslatePath(szRelativePath);

	CfgGetFullPath(szRelativePath, szFullPath, sizeof(szFullPath));
	DelFinalSlash(szFullPath);

	/* Check directory existance */
	if (!SysExistDir(szFullPath)) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_LISTDIR_NOT_FOUND);
		ErrSetErrorCode(ERR_LISTDIR_NOT_FOUND);
		return ERR_LISTDIR_NOT_FOUND;
	}
	/* Send command continue response */
	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_LISTFOLLOW_RESULT);

	/* List files */
	char szFileName[SYS_MAX_PATH] = "";
	FSCAN_HANDLE hFileScan = MscFirstFile(szFullPath, 0, szFileName,
					      sizeof(szFileName));

	if (hFileScan != INVALID_FSCAN_HANDLE) {
		do {
			if (!SYS_IS_VALID_FILENAME(szFileName) ||
			    !StrWildMatch(szFileName, ppszTokens[2]))
				continue;

			SYS_FILE_INFO FI;
			char szFilePath[SYS_MAX_PATH] = "";

			SysSNPrintf(szFilePath, sizeof(szFilePath) - 1, "%s%s%s",
				    szFullPath, SYS_SLASH_STR, szFileName);
			if (SysGetFileInfo(szFilePath, FI) == 0) {
				if (BSckVSendString(hBSock, pCTRLCfg->iTimeout,
						    "\"%s\"\t\"" SYS_OFFT_FMT "\"",
						    szFileName, FI.llSize) < 0) {
					ErrorPush();
					MscCloseFindFile(hFileScan);
					return ErrorPop();
				}
			}
		} while (MscNextFile(hFileScan, szFileName, sizeof(szFileName)));
		MscCloseFindFile(hFileScan);
	}

	BSckSendString(hBSock, ".", pCTRLCfg->iTimeout);

	return 0;
}

static int CTRLDo_cfgfileget(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			     char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 2) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}
	/* Check relative path syntax */
	if (CTRLCheckRelativePath(ppszTokens[1]) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}
	/* Setup client target file path */
	char szRelativePath[SYS_MAX_PATH] = "";
	char szFullPath[SYS_MAX_PATH] = "";

	StrSNCpy(szRelativePath, ppszTokens[1]);
	MscTranslatePath(szRelativePath);

	CfgGetFullPath(szRelativePath, szFullPath, sizeof(szFullPath));
	DelFinalSlash(szFullPath);

	/* Share lock client target file */
	char szResLock[SYS_MAX_PATH] = "";
	RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szFullPath, szResLock,
							  sizeof(szResLock)));

	if (hResLock == INVALID_RLCK_HANDLE) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	/* Get a file snapshot */
	char szRequestedFile[SYS_MAX_PATH] = "";

	UsrGetTmpFile(NULL, szRequestedFile, sizeof(szRequestedFile));

	if (MscCopyFile(szRequestedFile, szFullPath) < 0) {
		ErrorPush();
		CheckRemoveFile(szRequestedFile);
		RLckUnlockSH(hResLock);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	RLckUnlockSH(hResLock);

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_LISTFOLLOW_RESULT);

	/* Send client target file */
	if (MscSendTextFile(szRequestedFile, hBSock, pCTRLCfg->iTimeout) < 0) {
		ErrorPush();
		SysRemove(szRequestedFile);
		return ErrorPop();
	}

	SysRemove(szRequestedFile);

	return 0;
}

static int CTRLDo_cfgfileset(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			     char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 2) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}
	/* Check relative path syntax */
	if (CTRLCheckRelativePath(ppszTokens[1]) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}
	/* Setup client target file path */
	char szRelativePath[SYS_MAX_PATH] = "";
	char szFullPath[SYS_MAX_PATH] = "";

	StrSNCpy(szRelativePath, ppszTokens[1]);
	MscTranslatePath(szRelativePath);

	CfgGetFullPath(szRelativePath, szFullPath, sizeof(szFullPath));
	DelFinalSlash(szFullPath);

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_WAITDATA_RESULT);

	/* Read user data in file */
	char szClientFile[SYS_MAX_PATH] = "";

	UsrGetTmpFile(NULL, szClientFile, sizeof(szClientFile));

	if (MscRecvTextFile(szClientFile, hBSock, pCTRLCfg->iTimeout) < 0) {
		ErrorPush();
		CheckRemoveFile(szClientFile);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}
	/* Get file info for size checking */
	SYS_FILE_INFO FI;

	if (SysGetFileInfo(szClientFile, FI) < 0) {
		ErrorPush();
		CheckRemoveFile(szClientFile);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}
	/* Exclusive lock client target file */
	char szResLock[SYS_MAX_PATH] = "";
	RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szFullPath, szResLock,
							  sizeof(szResLock)));

	if (hResLock == INVALID_RLCK_HANDLE) {
		ErrorPush();
		SysRemove(szClientFile);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	if (FI.llSize != 0) {
		if (MscCopyFile(szFullPath, szClientFile) < 0) {
			ErrorPush();
			RLckUnlockEX(hResLock);
			SysRemove(szClientFile);
			CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
			return ErrorPop();
		}
	} else
		SysRemove(szFullPath);

	RLckUnlockEX(hResLock);

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	SysRemove(szClientFile);

	return 0;
}

static int CTRLDo_frozlist(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			   char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount < 1) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}
	/* Build frozen list file */
	char szListFile[SYS_MAX_PATH] = "";

	UsrGetTmpFile(NULL, szListFile, sizeof(szListFile));

	if (QueUtGetFrozenList(hSpoolQueue, szListFile) < 0) {
		ErrorPush();
		CheckRemoveFile(szListFile);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_LISTFOLLOW_RESULT);

	/* Send client target file */
	if (MscSendTextFile(szListFile, hBSock, pCTRLCfg->iTimeout) < 0) {
		ErrorPush();
		SysRemove(szListFile);
		return ErrorPop();
	}

	SysRemove(szListFile);

	return 0;
}

static int CTRLDo_frozsubmit(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			     char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount < 4) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}
	/* Try to defroze frozen message */
	int iLevel1 = atoi(ppszTokens[1]);
	int iLevel2 = atoi(ppszTokens[2]);
	char szMessageFile[SYS_MAX_PATH] = "";

	StrSNCpy(szMessageFile, ppszTokens[3]);

	if (QueUtUnFreezeMessage(hSpoolQueue, iLevel1, iLevel2, szMessageFile) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_frozdel(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			  char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount < 4) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}
	/* Try to delete frozen message */
	int iLevel1 = atoi(ppszTokens[1]);
	int iLevel2 = atoi(ppszTokens[2]);
	char szMessageFile[SYS_MAX_PATH] = "";

	StrSNCpy(szMessageFile, ppszTokens[3]);

	if (QueUtDeleteFrozenMessage(hSpoolQueue, iLevel1, iLevel2, szMessageFile) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_frozgetlog(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			     char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount < 4) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}
	/* Try to delete frozen message */
	int iLevel1 = atoi(ppszTokens[1]);
	int iLevel2 = atoi(ppszTokens[2]);
	char szMessageFile[SYS_MAX_PATH] = "";

	StrSNCpy(szMessageFile, ppszTokens[3]);

	/* Get log file snapshot */
	char szFileSS[SYS_MAX_PATH] = "";

	UsrGetTmpFile(NULL, szFileSS, sizeof(szFileSS));

	if (QueUtGetFrozenLogFile(hSpoolQueue, iLevel1, iLevel2, szMessageFile, szFileSS) < 0) {
		ErrorPush();
		CheckRemoveFile(szFileSS);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_LISTFOLLOW_RESULT);

	/* Send client target file */
	if (MscSendTextFile(szFileSS, hBSock, pCTRLCfg->iTimeout) < 0) {
		ErrorPush();
		SysRemove(szFileSS);
		return ErrorPop();
	}

	SysRemove(szFileSS);

	return 0;
}

static int CTRLDo_frozgetmsg(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
			     char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount < 4) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}
	/* Try to delete frozen message */
	int iLevel1 = atoi(ppszTokens[1]);
	int iLevel2 = atoi(ppszTokens[2]);
	char szMessageFile[SYS_MAX_PATH] = "";

	StrSNCpy(szMessageFile, ppszTokens[3]);

	/* Get log file snapshot */
	char szFileSS[SYS_MAX_PATH] = "";

	UsrGetTmpFile(NULL, szFileSS, sizeof(szFileSS));

	if (QueUtGetFrozenMsgFile(hSpoolQueue, iLevel1, iLevel2, szMessageFile, szFileSS) < 0) {
		ErrorPush();
		CheckRemoveFile(szFileSS);
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_LISTFOLLOW_RESULT);

	/* Send client target file */
	if (MscSendTextFile(szFileSS, hBSock, pCTRLCfg->iTimeout) < 0) {
		ErrorPush();
		SysRemove(szFileSS);
		return ErrorPop();
	}

	SysRemove(szFileSS);

	return 0;
}

static int CTRLDo_etrn(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
		       char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount < 2) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}
	/* Do a matched flush of the rsnd arena */
	for (int ii = 1; ii < iTokensCount; ii++) {
		if (QueFlushRsndArena(hSpoolQueue, ppszTokens[ii]) < 0) {
			ErrorPush();
			CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
			return ErrorPop();
		}
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_aliasdomainadd(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
				 char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 3) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}
	/* Filter params */
	char szDomain[MAX_HOST_NAME] = "";
	char szADomain[MAX_HOST_NAME] = "";

	StrSNCpy(szDomain, ppszTokens[1]);
	StrLower(szDomain);

	StrSNCpy(szADomain, ppszTokens[2]);
	StrLower(szADomain);

	/* Target domain MUST exit ( alias of aliases are not permitted ) */
	if (MDomLookupDomain(szDomain) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}
	/* Alias domain MUST NOT exit */
	if ((MDomLookupDomain(szADomain) == 0) ||
	    ADomLookupDomain(szADomain, NULL, false)) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_ADOMAIN_EXIST);

		ErrSetErrorCode(ERR_ADOMAIN_EXIST);
		return ERR_ADOMAIN_EXIST;
	}
	/* Add alias domain */
	if (ADomAddADomain(szADomain, szDomain) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_aliasdomaindel(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
				 char const *const *ppszTokens, int iTokensCount)
{
	if (iTokensCount != 2) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}
	/* Filter params */
	char szADomain[MAX_HOST_NAME] = "";

	StrSNCpy(szADomain, ppszTokens[1]);
	StrLower(szADomain);

	/* Remove alias domain */
	if (ADomRemoveADomain(szADomain) < 0) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrorFetch());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, 0);

	return 0;
}

static int CTRLDo_aliasdomainlist(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock,
				  char const *const *ppszTokens, int iTokensCount)
{
	ADOMAIN_HANDLE hADomainDB = ADomOpenDB();

	if (hADomainDB == INVALID_ADOMAIN_HANDLE) {
		ErrorPush();
		CTRLSendCmdResult(pCTRLCfg, hBSock, ErrGetErrorCode());
		return ErrorPop();
	}

	CTRLSendCmdResult(pCTRLCfg, hBSock, CTRL_LISTFOLLOW_RESULT);

	char const *const *ppszStrings = ADomGetFirstDomain(hADomainDB);

	for (; ppszStrings != NULL; ppszStrings = ADomGetNextDomain(hADomainDB)) {
		if ((iTokensCount < 2) ||
		    ((iTokensCount == 2) && StrStringsRIWMatch(&ppszTokens[1], ppszStrings[adomDomain])) ||
		    ((iTokensCount == 3) && StrStringsRIWMatch(&ppszTokens[1], ppszStrings[adomDomain]) &&
		     StrStringsRIWMatch(&ppszTokens[2], ppszStrings[adomADomain]))) {
			if (BSckVSendString
			    (hBSock, pCTRLCfg->iTimeout, "\"%s\"\t\"%s\"",
			     ppszStrings[adomDomain], ppszStrings[adomADomain]) < 0) {
				ErrorPush();
				ADomCloseDB(hADomainDB);
				return ErrorPop();
			}
		}
	}

	ADomCloseDB(hADomainDB);

	BSckSendString(hBSock, ".", pCTRLCfg->iTimeout);

	return 0;
}

static int CTRLProcessCommand(CTRLConfig *pCTRLCfg, BSOCK_HANDLE hBSock, char const *pszCommand)
{
	char **ppszTokens = StrGetTabLineStrings(pszCommand);

	if (ppszTokens == NULL) {
		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	int iTokensCount = StrStringsCount(ppszTokens);

	if (iTokensCount < 1) {
		StrFreeStrings(ppszTokens);

		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	int iCmdResult = -1;

	if (stricmp(ppszTokens[0], "useradd") == 0)
		iCmdResult = CTRLDo_useradd(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "userdel") == 0)
		iCmdResult = CTRLDo_userdel(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "userpasswd") == 0)
		iCmdResult = CTRLDo_userpasswd(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "uservars") == 0)
		iCmdResult = CTRLDo_uservars(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "uservarsset") == 0)
		iCmdResult = CTRLDo_uservarsset(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "userlist") == 0)
		iCmdResult = CTRLDo_userlist(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "usergetmproc") == 0)
		iCmdResult = CTRLDo_usergetmproc(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "usersetmproc") == 0)
		iCmdResult = CTRLDo_usersetmproc(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "userauth") == 0)
		iCmdResult = CTRLDo_userauth(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "userstat") == 0)
		iCmdResult = CTRLDo_userstat(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "aliasadd") == 0)
		iCmdResult = CTRLDo_aliasadd(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "aliasdel") == 0)
		iCmdResult = CTRLDo_aliasdel(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "aliaslist") == 0)
		iCmdResult = CTRLDo_aliaslist(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "exaliasadd") == 0)
		iCmdResult = CTRLDo_exaliasadd(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "exaliasdel") == 0)
		iCmdResult = CTRLDo_exaliasdel(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "exaliaslist") == 0)
		iCmdResult = CTRLDo_exaliaslist(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "mluseradd") == 0)
		iCmdResult = CTRLDo_mluseradd(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "mluserdel") == 0)
		iCmdResult = CTRLDo_mluserdel(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "mluserlist") == 0)
		iCmdResult = CTRLDo_mluserlist(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "domainadd") == 0)
		iCmdResult = CTRLDo_domainadd(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "domaindel") == 0)
		iCmdResult = CTRLDo_domaindel(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "domainlist") == 0)
		iCmdResult = CTRLDo_domainlist(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "custdomget") == 0)
		iCmdResult = CTRLDo_custdomget(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "custdomset") == 0)
		iCmdResult = CTRLDo_custdomset(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "custdomlist") == 0)
		iCmdResult = CTRLDo_custdomlist(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "poplnkadd") == 0)
		iCmdResult = CTRLDo_poplnkadd(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "poplnkdel") == 0)
		iCmdResult = CTRLDo_poplnkdel(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "poplnklist") == 0)
		iCmdResult = CTRLDo_poplnklist(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "poplnkenable") == 0)
		iCmdResult = CTRLDo_poplnkenable(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "filelist") == 0)
		iCmdResult = CTRLDo_filelist(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "cfgfileget") == 0)
		iCmdResult = CTRLDo_cfgfileget(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "cfgfileset") == 0)
		iCmdResult = CTRLDo_cfgfileset(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "frozlist") == 0)
		iCmdResult = CTRLDo_frozlist(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "frozsubmit") == 0)
		iCmdResult = CTRLDo_frozsubmit(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "frozdel") == 0)
		iCmdResult = CTRLDo_frozdel(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "frozgetlog") == 0)
		iCmdResult = CTRLDo_frozgetlog(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "frozgetmsg") == 0)
		iCmdResult = CTRLDo_frozgetmsg(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "aliasdomainadd") == 0)
		iCmdResult = CTRLDo_aliasdomainadd(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "aliasdomaindel") == 0)
		iCmdResult = CTRLDo_aliasdomaindel(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "aliasdomainlist") == 0)
		iCmdResult = CTRLDo_aliasdomainlist(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "etrn") == 0)
		iCmdResult = CTRLDo_etrn(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "noop") == 0)
		iCmdResult = CTRLDo_noop(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else if (stricmp(ppszTokens[0], "quit") == 0)
		iCmdResult = CTRLDo_quit(pCTRLCfg, hBSock, ppszTokens, iTokensCount);
	else {
		StrFreeStrings(ppszTokens);

		CTRLSendCmdResult(pCTRLCfg, hBSock, ERR_BAD_CTRL_COMMAND);
		ErrSetErrorCode(ERR_BAD_CTRL_COMMAND);
		return ERR_BAD_CTRL_COMMAND;
	}

	StrFreeStrings(ppszTokens);

	return iCmdResult;
}

static int CTRLHandleSession(ThreadConfig const *pThCfg, BSOCK_HANDLE hBSock,
			     SYS_INET_ADDR const &PeerInfo)
{
	CTRLConfig *pCTRLCfg = CTRLGetConfigCopy(pThCfg->hThShb);

	if (pCTRLCfg == NULL)
		return ErrGetErrorCode();

	int iSessionTimeout = pCTRLCfg->iSessionTimeout;

	/* Build TimeStamp string */
	SYS_INET_ADDR SockInfo;
	char szTimeStamp[256] = "";

	SysGetSockInfo(BSckGetAttachedSocket(hBSock), SockInfo);

	char szIP[128] = "???.???.???.???";

	sprintf(szTimeStamp, "<%lu.%lu@%s>",
		(unsigned long) time(NULL), SysGetCurrentThreadId(),
		SysInetNToA(SockInfo, szIP, sizeof(szIP)));

	/* Welcome */
	char szTime[256] = "";

	MscGetTimeStr(szTime, sizeof(szTime) - 1);

	CTRLVSendCmdResult(pCTRLCfg, hBSock, 0, "%s %s CTRL Server; %s",
			   szTimeStamp, APP_NAME_VERSION_STR, szTime);

	/* User login */
	if (CTRLLogin(pCTRLCfg, hBSock, szTimeStamp, PeerInfo) < 0) {
		ErrorPush();
		SysFree(pCTRLCfg);
		return ErrorPop();
	}

	/* Command loop */
	char szCommand[CTRL_MAX_LINE_SIZE] = "";

	while (!SvrInShutdown() &&
	       BSckGetString(hBSock, szCommand, sizeof(szCommand) - 1,
			     iSessionTimeout) != NULL &&
	       MscCmdStringCheck(szCommand) == 0) {
		if (pThCfg->ulFlags & THCF_SHUTDOWN)
			break;

		/* Process client command */
		if (CTRLProcessCommand(pCTRLCfg, hBSock, szCommand) == CTRL_QUIT_CMD_EXIT)
			break;
	}
	SysFree(pCTRLCfg);

	return 0;
}

unsigned int CTRLClientThread(void *pThreadData)
{
	ThreadCreateCtx *pThCtx = (ThreadCreateCtx *) pThreadData;

	/* Link socket to the bufferer */
	BSOCK_HANDLE hBSock = BSckAttach(pThCtx->SockFD);

	if (hBSock == INVALID_BSOCK_HANDLE) {
		ErrorPush();
		SysCloseSocket(pThCtx->SockFD);
		SysFree(pThCtx);
		return ErrorPop();
	}

	/*
	 * Do we need to switch to TLS?
	 */
	if (pThCtx->pThCfg->ulFlags & THCF_USE_SSL) {
		int iError;
		SslServerBind SSLB;
		SslBindEnv SslE;

		if (CSslBindSetup(&SSLB) < 0) {
			ErrorPush();
			SysCloseSocket(pThCtx->SockFD);
			SysFree(pThCtx);
			return ErrorPop();
		}
		ZeroData(SslE);

		iError = BSslBindServer(hBSock, &SSLB, MscSslEnvCB, &SslE);

		CSslBindCleanup(&SSLB);
		if (iError < 0) {
			ErrorPush();
			SysCloseSocket(pThCtx->SockFD);
			SysFree(pThCtx);
			return ErrorPop();
		}
		/*
		 * We may want to add verify code here ...
		 */

		SysFree(SslE.pszIssuer);
		SysFree(SslE.pszSubject);
	}
	/* Check IP permission */
	if (CTRLCheckPeerIP(pThCtx->SockFD) < 0) {
		ErrorPush();
		SysLogMessage(LOG_LEV_ERROR, "%s (CTRL check peer IP)\n",
			      ErrGetErrorString(ErrorFetch()));
		CTRLSendCmdResult(hBSock, ErrorFetch(), ErrGetErrorString(), STD_CTRL_TIMEOUT);
		BSckDetach(hBSock, 1);
		SysFree(pThCtx);
		return ErrorPop();
	}
	/* Increase threads count */
	if (CTRLThreadCountAdd(+1, pThCtx->pThCfg->hThShb) < 0) {
		ErrorPush();
		SysLogMessage(LOG_LEV_ERROR, "%s (CTRL thread count)\n",
			      ErrGetErrorString(ErrorFetch()));
		CTRLSendCmdResult(hBSock, ErrorFetch(), ErrGetErrorString(), STD_CTRL_TIMEOUT);
		BSckDetach(hBSock, 1);
		SysFree(pThCtx);
		return ErrorPop();
	}
	/* Get client socket information */
	SYS_INET_ADDR PeerInfo;

	if (SysGetPeerInfo(pThCtx->SockFD, PeerInfo) < 0) {
		ErrorPush();
		SysLogMessage(LOG_LEV_ERROR, "%s\n", ErrGetErrorString());
		CTRLThreadCountAdd(-1, pThCtx->pThCfg->hThShb);
		BSckDetach(hBSock, 1);
		SysFree(pThCtx);
		return ErrorPop();
	}

	char szIP[128] = "???.???.???.???";

	SysLogMessage(LOG_LEV_MESSAGE, "CTRL client connection from [%s]\n",
		      SysInetNToA(PeerInfo, szIP, sizeof(szIP)));

	/* Handle client session */
	CTRLHandleSession(pThCtx->pThCfg, hBSock, PeerInfo);

	SysLogMessage(LOG_LEV_MESSAGE, "CTRL client exit [%s]\n",
		      SysInetNToA(PeerInfo, szIP, sizeof(szIP)));

	/* Decrease threads count */
	CTRLThreadCountAdd(-1, pThCtx->pThCfg->hThShb);

	/* Unlink socket from the bufferer and close it */
	BSckDetach(hBSock, 1);
	SysFree(pThCtx);

	return 0;
}

xmail-1.27/docs/0000755000175000017500000000000011341640463012761 5ustar  davidedavidexmail-1.27/docs/Readme.html0000644000175000017500000062660211341640462015057 0ustar  davidedavide



XMail mail server v 1.27










NAME

XMail - Internet/Intranet mail server.

[top]


LICENSE

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation (http://www.gnu.org); either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

[top]


OVERVIEW

XMail is an Internet and Intranet mail server featuring an SMTP server, POP3 server, finger server, multiple domains, no need for users to have a real system account, SMTP relay checking, RBL/RSS/ORBS/DUL and custom (IP based and address based) spam protection, SMTP authentication (PLAIN LOGIN CRAM-MD5 POP3-before-SMTP and custom), a POP3 account synchronizer with external POP3 accounts, account aliases, domain aliases, custom mail processing, direct mail files delivery, custom mail filters, mailing lists, remote administration, custom mail exchangers, logging, and multi-platform code.

XMail sources compile under GNU/Linux, FreeBSD, OpenBSD, NetBSD, OSX, Solaris and NT/2K.

This server was born due to the need of having a free and stable Mail Server to be used inside my old company, which used a Windows Network. I don't like to reinvent the wheel but the need of some special features drive me to start a new project. Probably if I could use a Linux server on my net, I would be able to satisfy my needs without writing code, but this is not the case. It should be also portable to other OSs, like Linux and other Unixes.

Another reason that drove me to write XMail is the presence of the same steps in setting up a typical mail server, i.e.:

 sendmail + qpopper + fetchmail

if one needs SMTP, POP3 and external synchronization, or:

 sendmail + qpopper

for only SMTP and POP3 (I've quoted sendmail, qpopper and fetchmail, but there are many other packages you can use to reach these needs). With XMail you get an all-in-one package with a central administration that can simplify the above common steps.

The first code of XMail Server is started on Windows NT and Linux, and now, the FreeBSD and Solaris version ready. The compilers supported are gcc for Linux, FreeBSD, OpenBSD and Solaris and M$ Visual C++ for NT/2K.

[top]


VERSION

current

1.27

release type

Gnu Public License http://www.gnu.org

release date

Feb 25, 2010

project by

Davide Libenzi <davidel@xmailserver.org> http://www.xmailserver.org/

credits

Michael Hartle <mhartle@hartle-klug.com>

Shawn Anderson <sanderson@eye-catcher.com>

Dick van der Kaaden <dick@netrex.nl>

Beau E, Cox <beau@beaucox.com>

warning

 ************************************************************
 *                     <<WARNING>>                          *
 *  If you're upgrading an existing version of XMail it's   *
 *  strongly suggested that you read all the ChangeLog      *
 *  notes that range from existing version to the new one.  *
 ************************************************************

See the Change Log.

[top]


DOCUMENTATION CONVENTIONS

This document contains various examples of entries you must make to the XMail configuration tables. These examples are written in a

 mono-spaced font like this.

The prototype statement is shown with explicit '[TAB]' and '[NEWLINE]' characters:

 "aliasdomain"[TAB]"realdomain"[NEWLINE]

while examples omit these characters:

 "simpson.org"   "simpson.com"
 "*.homer.net"   "homer.net"

'YOU MUST ALWAYS ENTER THE DATA EXACTLY AS SHOWN IN THE PROTOTYPE.'

When a prototype or example statement is too long to be easily shown on the screen or printed, the line is split into multiple lines by showing '=>' at the end of continued lines and indenting the continuation line(s):

 "domain"[TAB]"account"[TAB]"enc-passwd"[TAB]"account-id"[TAB]"account-dir"[TAB]=>
   "account-type"[NEWLINE]

'DO NOT ENTER THE => CHARACTERS. ENTER THE ENTIRE ENTRY AS ONE LINE.'

[top]


FEATURES

  • ESMTP/ESMTPS server

  • POP3/POP3S server

  • Finger server

  • Multiple domains

  • Users don't need a real system account

  • SMTP relay checking

  • Custom SMTP maps check

  • SMTP protection over spammers (IP based and address based)

  • SMTP authentication (PLAIN LOGIN CRAM-MD5 POP3/SMTP and custom)

  • SMTP ETRN command support

  • POP3 account synchronizer with external POP3 accounts

  • Account aliasing

  • Domain aliasing

  • Mailing lists

  • Custom mail processing

  • Locally generated mail files delivery

  • Remote administration

  • Custom mail exchangers

  • Logging

  • Multi platform (any Windows and almost any Unix OSs)

  • Fine grained message filters

  • Custom (external) POP3/SMTP authentication

  • TLS support for SMTP and POP3, both server and client side

[top]


PORTING STATUS

Right now the Linux and NT ports are stable, while the Solaris, FreeBSD, OpenBSD and OSX ones have not been tested as well as the previous OSs.

[top]


REQUIREMENTS

  • Any version of Linux that has glibc.

  • Windows NT with ws2_32.dll correctly installed.

  • A working DNS and gateway to the Internet (if you plan to use it).

  • To build from source for Linux you need any version of gcc and glibc installed.

  • To build from source for Windows you need MS Visual C++ (makefile included).

  • -or- any other working compiler that provides support for the Win32 SDK.

[top]


OBTAINING THE SOURCE

Always get the latest sources at the XMail home page http://www.xmailserver.org/ because otherwise you may be using an old version.

Use the correct distribution for your system and don't mix Unix files with Windows ones because this is one of the most common cause of XMail bad behavior.

When you unzip (or untar) the package you've to check that the MailRoot directory contained inside the package itself is complete (look at the directory tree listed below) because some unzippers don't restore empty directories.

[top]


BUILD

XMail depends on OpenSSL to provide SSL support, so the development package of OpenSSL (in Debian called libssl-dev) must be installed on your system. For Windows, the XMail source already contains a pre-built version of the OpenSSL libraries, include files, and executable. The OpenSSL web site can be found here http://www.openssl.org.

[Windows]

  You have to have the command line environment setup before (usually the vcvars32.bat
  script inside the Visual C++ directory). You also need to copy the openSSL DLLs
  (located in "win32ssl\dll") inside the same folder where the XMail.exe binary resides.
  C:> nmake /f Makefile.win
  
  If once you run the XMail binaries, Windows complains about missing DLLs, your system
  is probably missing the Microsoft CRT redistributable package, that you can download
  here L<http://www.xmailserver.org/vcredist_x86.exe>;.

[Linux]

  # make -f Makefile.lnx

[FreeBSD]

  # setenv OSTYPE FreeBSD
  # gmake -f Makefile.bsd

or (depending on the shell):

  # OSTYPE=FreeBSD gmake -f Makefile.bsd

[OpenBSD]

  # setenv OSTYPE OpenBSD
  # gmake -f Makefile.bsd

or (depending on the shell):

  # OSTYPE=OpenBSD gmake -f Makefile.bsd

[NetBSD]

  # setenv OSTYPE NetBSD
  # gmake -f Makefile.bsd

or (depending on the shell):

  # OSTYPE=NetBSD gmake -f Makefile.bsd

[OSX]

  # OSTYPE=Darwin make -f Makefile.bsd

or (depending on the shell):

  # setenv OSTYPE Darwin
  # make -f Makefile.bsd

[Solaris]

  # make -f Makefile.sso

Under Linux an init.d startup script is supplied (xmail) to allow you to run XMail as a standard rc? daemon. You must put it into /etc/init.d (it depends on which distro you're using) directory and then create K??xmail - S??xmail links into the proper directories.

Under Windows NT/2000/XP the XMail's executable is a Win32 service by default and if you want to have it built like a standard executable you've to comment the statement:

 "#define SERVICE" in MainWin.cpp

When it's built as a service (default) you can run:

 XMail --install

to install XMail as a manual startup service or:

 XMail --install-auto

to install XMail as an automatic startup service.

If you run '--install' and you want XMail to run at NT boot, you must go in ControlPanel->Services and edit the startup options of XMail. Once you have the service version of XMail you can run it in a 'normal' way by executing:

 XMail --debug [options]

[top]


CONFIGURATION

Linux/Solaris/FreeBSD/OpenBSD

  1. Build XMail.

  2. Log as root.

  3. Copy the supplied MailRoot directory where you want it to reside (normally /var).

  4. Do a # chmod 700 /var/MailRoot to setup MailRoot directory access rights.

  5. Strip XMail executables if you want to reduce their sizes (strip filename).

  6. Copy XMail executables to /var/MailRoot/bin.

  7. Optionally, you can setup a dedicated temporary files directory for XMail, by setting the environment variable XMAIL_TEMP, which defaults to /tmp/. XMail uses such directory when it has to create files that must be accessible to external programs like filters.

  8. If you have 'inetd' installed, comment out the lines of '/etc/inetd.conf' that involve SMTP, POP3, and Finger. Restart 'inetd' (kill -HUP ...).

  9. Since XMail uses syslog to log messages, enable syslogd if it's not running.

  10. Setup the 'SERVER.TAB' configuration file (after reading the rest of this document well).

  11. Add your users and domains (after reading the rest of this document well).

  12. Change or comment out (#) the example account in 'ctrlaccounts.tab' by using a non-trivial username and password.

  13. Copy the xmail startup script to your init.d directory (it's position depends on your distro). If you've setup XMail to work in a subdirectory other than '/var/MailRoot' you must edit the xmail startup script to customize its boot parameters.

  14. Use the 'sysv_inst.sh' shell script (from root user) to create SysV boot script - unless your distro has other tools to do this.

  15. To start XMail without reboot you can run (from root): /etc/rc.d/init.d/xmail start otherwise reboot your machine.

  16. Setup the file 'smtprelay.tab' if you want to extend mail relaying to IPs outside of the internet's private IP blocks (or you want to deny even those - that comes enabled by default with XMail).

  17. Look at [SSL CONFIGURATION] for information about how to create the required 'server.key' and 'server.cert' files.

For further configuration options, please see the [COMMAND LINE] section.

[configuration] [top]

NT/Win2K/XP

  1. Build XMail.

  2. Copy the supplied MailRoot directory where you want it to reside (normally 'C:\MailRoot').

  3. Setup the MailRoot directory (and subdirectories and file) permissions to allow access only to System and Administrators. Doing this you can run XMail as a console startup only if you're Administrator (service startup as System).

  4. Copy XMail executables to 'C:\MailRoot\bin'. Also copy the OpenSSL DLLs located in "win32ssl\dll" to 'C:\MailRoot\bin'.

  5. With 'regedit', create 'GNU' key inside 'HKEY_LOCAL_MACHINE\SOFTWARE\' and then 'XMail' key inside 'HKEY_LOCAL_MACHINE\SOFTWARE\GNU'. Note: If you are using a 32bit binary with a 64bit Windows, replace 'HKEY_LOCAL_MACHINE\SOFTWARE\' with 'HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\' here, and in the points below.

  6. Create a new string value named 'MAIL_ROOT' inside 'HKEY_LOCAL_MACHINE\SOFTWARE\GNU\XMail\' with value 'C:\MailRoot'.

  7. Optionally create a new string value named 'MAIL_CMD_LINE' inside 'HKEY_LOCAL_MACHINE\SOFTWARE\GNU\XMail\' to store your command line options (read well the rest of this document).

  8. Open an NT console (command prompt).

  9. Go inside 'C:\MailRoot\bin' and run: XMail --install for a manual startup, or: XMail --install-auto for an automatic startup.

  10. If you have other services that provide the same functionality as XMail, that is SMTP, POP3, or Finger servers, you must stop these services.

  11. Setup the 'SERVER.TAB' configuration option after reading the rest of this document well.

  12. Add your users and domains (after reading to the rest of this document well).

  13. Setup file permissions of the 'C:\MailRoot' directory to grant access only to 'SYSTEM' and 'Domain Admins'.

  14. Change or comment out (#) the example account in ctrlaccounts.tab by using a non-trivial username and password.

  15. To start XMail without reboot you can go to: ControlPanel -> Services -> XMail server and start the service, otherwise reboot your machine.

  16. Setup the file 'smtprelay.tab' if you want to extend mail relaying to IPs outside of the internet's private IP blocks (or you want to deny even those - that comes enabled by default with XMail).

  17. Look at [SSL CONFIGURATION] for information about how to create the required 'server.key' and 'server.cert' files.

For further configuration options, please see the [COMMAND LINE] section.

[configuration] [top]

Environment variables

[MAIL_ROOT]

If you want to start XMail as a simple test you must setup an environment variable MAIL_ROOT that points to the XMail Server root directory.

Linux/etc.:

 export MAIL_ROOT=/var/XMailRoot

Windows:

 set MAIL_ROOT=C:\MailRoot
[MAIL_CMD_LINE]

Allows the user to specify extra command line parameters (they will be appended to the ones specified in the command line).

[XMAIL_PID_DIR]

Allows the user to specify the PID directory (Unix only ports). The specified directory must NOT have the final slash (/) appended to the path.

[configuration] [top]

MailRoot structure

Mail root directory contain these files:

  aliases.tab <file>
  aliasdomain.tab <file>
  domains.tab <file>
  dnsroots    <file>
  extaliases.tab  <file>
  mailusers.tab   <file>
  message.id  <file>
  pop3links.tab   <file>
  server.tab  <file>
  server.cert <file>
  server.key <file>
  smtpgw.tab  <file>
  smtpfwd.tab <file>
  smtprelay.tab   <file>
  smtpauth.tab    <file>
  smtpextauth.tab <file>
  userdef.tab <file>
  ctrlaccounts.tab    <file>
  spammers.tab    <file>
  spam-address.tab    <file>
  pop3.ipmap.tab  <file>
  smtp.ipmap.tab  <file>
  ctrl.ipmap.tab  <file>
  finger.ipmap.tab    <file>
  filters.in.tab  <file>
  filters.out.tab <file>
  filters.post-rcpt.tab <file>
  filters.pre-data.tab <file>
  filters.post-data.tab <file>
  smtp.ipprop.tab <file>
  smtp.hnprop.tab <file>

and these directories:

  bin     <dir>
  cmdaliases  <dir>
  tabindex    <dir>
  dnscache    <dir>
    mx  <dir>
    ns  <dir>
  custdomains <dir>
  filters     <dir>
  logs        <dir>
  pop3locks   <dir>
  pop3linklocks   <dir>
  pop3links   <dir>
  spool       <dir>
    local       <dir>
    temp        <dir>
    0           <dir>
      0           <dir>
        mess        <dir>
        rsnd        <dir>
        info        <dir>
        temp        <dir>
        slog        <dir>
        lock        <dir>
        mprc        <dir>
        froz        <dir>
      ...
    ...
  userauth    <dir>
    pop3    <dir>
    smtp    <dir>
  domains     <dir>
  msgsync     <dir>

and for each domain DOMAIN handled a directory (inside domains):

    DOMAIN      <dir>
    userdef.tab <file>
    mailproc.tab    <file>  [ optional ]

inside of which reside, for each account ACCOUNT:

      ACCOUNT         <dir>
        user.tab    <file>
        mlusers.tab <file>  [ mailing list case ]
        mailproc.tab    <file>  [ optional ]
        pop3.ipmap.tab  <file>  [ optional ]

and

        mailbox     <dir>

for mailbox structure, while:

        Maildir     <dir>
          tmp <dir>
          new <dir>
          cur <dir>

for Maildir structure. The msgsync directory is used to store UIDL lists for PSYNC accounts that require leaving messages on the server. Inside the msgsync other directories will be created with the name of the remote server, directories that will store UIDL DB files.

[configuration] [top]

Configuration tables

TAB ('something.tab') files are text files (in the sense meant by the OS in use: <CR><LF> for NT and <CR> for Linux) with this format:

 "value1"[TAB]"value2"[TAB]...[NEWLINE]

The following sections explain each file's structure and use.

"ALIASES.TAB file"
"ALIASDOMAIN.TAB file"
"DOMAINS.TAB file"
"DNSROOTS file"
"EXTALIASES.TAB file"
"MAILUSERS.TAB file"
"MESSAGE.ID file"
"POP3LINKS.TAB file"
"SERVER.TAB file"
"SMTPGW.TAB file"
"SMTPFWD.TAB file"
"SMTPRELAY.TAB file"
"SMTPAUTH.TAB file"
"SMTPEXTAUTH.TAB file"
"USERDEF.TAB file"
"CTRLACCOUNTS.TAB file"
"SPAMMERS.TAB file"
"SPAM-ADDRESS.TAB file"
"POP3.IPMAP.TAB file"
"SMTP.IPMAP.TAB file"
"CTRL.IPMAP.TAB file"
"FINGER.IPMAP.TAB file"
"USER.TAB file"
"MLUSERS.TAB file"
"MAILPROC.TAB file"
"SMTP.IPPROP.TAB file"
"SMTP.HNPROP.TAB file"
"FILTERS.IN.TAB file"
"FILTERS.OUT.TAB file"
"FILTERS.POST-RCPT.TAB file"
"FILTERS.PRE-DATA.TAB file"
"FILTERS.POST-DATA.TAB file"

[configuration] [top]

ALIASES.TAB

 "domain"[TAB]"alias"[TAB]"realaccount"[NEWLINE]

Example:

 "home.bogus"    "davidel"   "dlibenzi"

define 'davidel' as alias for 'dlibenzi' in 'home.bogus' domain.

 "home.bogus"    "foo*bog"   "homer@internal-domain.org"

define an alias for all users whose name starts with 'foo' and ends with 'bog' that points to the locally handled account 'homer@internal-domain.org'.

 "home.bogus"    "??trips"   "travels"

define an alias for all users whose names start with any two chars and end with 'trips'. You can even have wildcards in the domain field, as:


 "*" "postmaster"    "postmaster@domain.net"

You 'CANNOT' edit this file while XMail is running because it is an indexed file.

[table index] [configuration] [top]

ALIASDOMAIN.TAB

 "aliasdomain"[TAB]"realdomain"[NEWLINE]

where 'aliasdomain' can use wildcards:

 "simpson.org"   "simpson.com"
 "*.homer.net"   "homer.net"

The first line defines 'simpson.org' as an alias of 'simpson.com' while the second remaps all subdomains of 'homer.net' to 'homer.net'.

You 'CANNOT' edit this file while XMail is running because it is an indexed file.

[table index] [configuration] [top]

DOMAINS.TAB

 "domain"[NEWLINE]

defines domains handled by the server.

[table index] [configuration] [top]

DNSROOTS

 host

This is a file that lists a root name server in each line (this is not a TAB file). This can be created from a query via nslookup for type=ns and host = '.'.

[table index] [configuration] [top]

EXTALIASES.TAB

 "external-domain"[TAB]"external-account"[TAB]"local-domain"[TAB]"local-user"[NEWLINE]

Example:

 "xmailserver.org"   "dlibenzi"  "home.bogus"    "dlibenzi"

This file is used in configurations in which the server does not run directly on Internet (like my case) but acts as internal mail exchanger and external mail gateway. This file defines 'Return-Path: <...>' mapping for internal mail delivery. If you are using an Mail client like Outlook, Eudora, KMail ... you have to configure your email address with the external account say 'dlibenzi@xmailserver.org'. When you post an internal message to 'foo@home.bogus' the mail client puts your external email address ('dlibenzi@xmailserver.org') in the 'MAIL FROM: <...>' SMTP request. Now if the user 'foo' replies to this message, it replies to 'dlibenzi@xmailserver.org', and then is sent to the external mail server. With the entry above in 'EXTALIASES.TAB' file the 'Return-Path: <...>' field is filled with 'dlibenzi@home.bogus' that leads to an internal mail reply.

You 'CANNOT' edit this file while XMail is running because it is an indexed file.

[table index] [configuration] [top]

MAILUSERS.TAB

 "domain"[TAB]"account"[TAB]"enc-passwd"[TAB]"account-id"[TAB]"account-dir"[TAB]=>
   "account-type"[NEWLINE]

(remember, enter as one line.) Example:

 "home.bogus"    "dlibenzi"  "XYZ..."    1   "dlibenzi"  "U"

defines an account 'dlibenzi' in domain 'home.bogus' with the encrypted password 'XYZ...', user id '1' and mail directory 'dlibenzi' inside '$MAIL_ROOT/domains/home.bogus'. To allow multiple domain handling the POP3 client must use the entire email address for the POP3 user account; for example, if a user has email user@domain it must supply:

 user@domain

as POP3 account login.

The directory 'account-dir' 'must' case match with the field 'account-dir' of this file. Note that user id 'must' be unique for all users (duplicate user ids are not allowed). The user id 0 is reserved by XMail and cannot be used.

The last field 'U' is the account type:

 "U" = User account
 "M" = Mailing list account

The encrypted password is generated by 'XMCrypt' whose source is 'XMCrypt.cpp'. Even if external authentication is used (see External Authentication) this file 'must' contain an entry for each user handled by XMail.

You 'CANNOT' edit this file while XMail is running because it is an indexed file.

[table index] [configuration] [top]

MESSAGE.ID

A file storing a sequential message number. Set it at 1 when you install the server and leave it be handled by the software.

[table index] [configuration] [top]

POP3LINKS.TAB

 "local-domain"[TAB]"local-account"[TAB]"external-domain"[TAB]=>
   "external-account"[TAB]"external-crypted-password"[TAB]"authtype"[NEWLINE]

(remember, enter as one line) where:

'authtype' = Comma-separated list of options:

CLR

Use clear-text USER/PASS authentication

APOP

Use POP3 APOP authentication (that does not send clear-text passwords over the wire). Fall back to 'CLR' if 'APOP' is not supported

FAPOP

Use POP3 APOP authentication (that does not send clear-text passwords over the wire).

STLS

Establish an SSL link with the server by issuing a POP3 STLS command. Continue with the non-encrypted link if STLS is not supported

FSTLS

Establish an SSL link with the server by issuing a POP3 STLS command.

POP3S

Establish a full POP3S connection with the remote server. Note that the POP3S port (default 995) must be set inside the external domain declaration.

Leave

Leave messages on the server, and download only the new ones. In order for this functionality to work, the remote POP3 server must support the UIDL command.

OutBind

Sets the IP address of the network interface that should be used when connecting to the remote host. This configuration should be used carefully, because XMail will fail if the selected IP of the interface does not have a route to the remote host using such IP.

Examples:

 "home.bogus"    "dlibenzi"  "xmailserver.org"   "dlibenzi" "XYZ..."=>
   "APOP"

This entry is used to synchronize the external account 'dlibenzi@xmailserver.org' with encrypted password 'XYZ...' with the local account 'dlibenzi@home.bogus' using 'APOP' authentication. It connects with the 'xmailserver.org' POP3 server and downloads all messages for 'dlibenzi@xmailserver.org' into the local account 'dlibenzi@home.bogus'. The remote server must support 'APOP' authentication to specify 'APOP' as authtype. Even if using APOP authentication is more secure because clear usernames and password do not travel on the network, when you're not sure about it, specify 'CLR' as authtype. For non local POP3 sync you've to specify a line like this one (@ as the first domain char):

 "@home.bogus.com"   "dlibenzi"  "xmailserver.org:110"   "dlibenzi" "XYZ..."=>
   "CLR"

This entry is used to synchronize the external account 'dlibenzi@xmailserver.org' with encrypted password 'XYZ...' with the account 'dlibenzi@home.bogus.com' using 'CLR' authentication. The message is pushed into the spool having as destination dlibenzi@home.bogus.com , so you've to have some kind of processing for that user or domain in your XMail configuration (for example custom domain processing). you can also have the option to setup a line like this one:

 "?home.bogus.com,felins.net,pets.org"   "dlibenzi"  "xmailserver.org"=>
   "dlibenzi"  "XYZ..."    "CLR"

and messages are dropped inside the spool by following these rules:

  1. XMail parses the message headers by searching for To:, Cc: and Bcc: addresses.

  2. Each address's domain is compared with the list of valid domains (felins.net, pets.org).

  3. For each valid address the username part is taken and joined with the '@' and the masquerade domain name (the name following '?').

  4. The message is spooled with the above built destination address.

Obviously the masquerade domain ('home.bogus.com') MUST be handled by the server or MUST be a valid external mail domain. So if a message having as To: address graycat@felins.net is fetched by the previous line a message is pushed into the spool with address graycat@home.bogus.com. Particular attention must be paid to prevent creating mail loops. Another option is:

 "&.local,felins.net,pets.org"   "dlibenzi"  "xmailserver.org" "dlibenzi"=>
   "XYZ..."    "CLR"

where a fetched message whose To: address is graycat@felins.net is replaced with graycat@felins.net.local. You can avoid the matching domain list after the masquerading domain but, in that case, you may have bad destination addresses inside the spool. The list MUST be comma separated WITHOUT spaces. XMail starts PSYNC session with a delay that you can specify with the -Yi nsec command line parameter (default 120). XMail also checks for the presence (inside MAIL_ROOT) of a file named '.psync-trigger' and, when this file is found, a PSYNC session starts and that file is removed.

[table index] [configuration] [top]

SERVER.TAB

 "varname"[TAB]"varvalue"[NEWLINE]

This file contains server configuration variables. See SERVER.TAB variables below for details.

[table index] [configuration] [top]

SMTPGW.TAB

 "domain"[TAB]"smtp-gateway"[NEWLINE]

Examples:

 "foo.example.com"   "@xmailserver.org"

sends all mail for 'foo.example.com' through the 'xmailserver.org' SMTP server, while:

 "*.dummy.net"   "@relay.xmailserver.org"

sends all mail for '*.dummy.net' through 'relay.xmailserver.org'.

The 'smtp-gateway' can be a complex routing also, for example:

 "*.dummy.net"   "@relay.xmailserver.org,@mail.nowhere.org"

sends all mail for '*.dummy.net' through '@relay.xmailserver.org,@mail.nowhere.org', in this way: relay.xmailserver.org --> mail.nowhere.org --> @DESTINATION.

[table index] [configuration] [top]

SMTPFWD.TAB

 "domain"[TAB]"smtp-mx-list"[NEWLINE]

The "smtp-mx-list" is a semicolon separated list of SMTP relays, and can also contain options as a comma-separated list (see [SMTP GATEWAY CONFIGURATION] for more information).

Examples:

 "foo.example.com"   "mail.xmailserver.org:7001;192.168.1.1:6123,NeedTLS=1;mx.xmailserver.org"

sends all mail for 'foo.example.com' using the provided list of mail exchangers, while:

 "*.dummy.net"   "mail.xmailserver.org,NeedTLS=1;192.168.1.1;mx.xmailserver.org:6423"

sends all mail for '*.dummy.net' through the provided list of mail exchangers. If the port (:nn) is not specified the default SMTP port (25) is assumed. you can also enable XMail to random-select the order of the gateway list by specifying:

 "*.dummy.net"   "#mail.xmailserver.org;192.168.1.1;mx.xmailserver.org:6423"

using the character '#' as the first char of the gateway list.

[table index] [configuration] [top]

SMTPRELAY.TAB

 "ipaddr"[TAB]"netmask"[NEWLINE]

Example:

 "212.131.173.0"   "255.255.255.0"

allows all hosts of the class 'C' network '212.131.173.XXX' to use the server as relay.

[table index] [configuration] [top]

SMTPAUTH.TAB

 "username"[TAB]"password"[TAB]"permissions"[NEWLINE]

is used to permit SMTP client authentication with protocols PLAIN, LOGIN, CRAM-MD5 and custom. With custom authentication a file containing all secrets (username + ':' + password) is passed as parameter to the custom authentication program which tests all secrets to find the one matching (if exist). For this reason it's better to keep the number of entries in this file as low as possible. Permissions are a string that can contain:

M

open mailing features

R

open relay features (bypass all other relay blocking traps)

V

VRFY command enabled (bypass SERVER.TAB variable)

T

ETRN command enabled (bypass SERVER.TAB variable)

Z

disable mail size checking (bypass SERVER.TAB variable)

S

ease SSL requirement for this user (bypass the "WantTLS" mail config variable)

When PLAIN, LOGIN or CRAM-MD5 authentication mode are used, first a lookup in 'MAILUSERS.TAB' accounts is performed to avoid duplicating information with 'SMTPAUTH.TAB'. Therefore when using these authentication modes a user must use as username the full email address (the : separator is permitted instead of @) and as password his POP3 password. If the lookup succeeds, the 'SERVER.TAB' variable 'DefaultSmtpPerms' is used to assign user SMTP permissions (default MR). If the lookup fails then 'SMTPAUTH.TAB' lookup is done.

[table index] [configuration] [top]

SMTPEXTAUTH.TAB

The 'SMTPEXTAUTH.TAB' file enables the XMail administrator to use external authentication methods to verify SMTP clients. If the 'SMTPEXTAUTH.TAB' does not exist, or it is empty, XMail standard authentication methods are used, and those will use either the 'MAILUSERS.TAB' or the 'SMTPAUTH.TAB' to verify account credentials. If the file 'SMTPEXTAUTH.TAB' is not empty, then the XMail standard authentication methods are not advertised in the AUTH response of the EHLO SMTP command. Instead, only the ones listed inside the 'SMTPEXTAUTH.TAB' are reported to the SMTP client. The 'SMTPEXTAUTH.TAB' file can contain multiple lines with the following format:

 "auth-name"[TAB]"program-path"[TAB]"arg-or-macro"...[NEWLINE]

This file can contain multiple lines whose 'auth-name' are listed during the EHLO command response. Where 'arg-or-macro' can be (see [MACRO SUBSTITUTION]):

AUTH

authentication method (PLAIN, LOGIN, CRAM-MD5, ...)

USER

SMTP client supplied username (available in PLAIN, LOGIN and CRAM-MD5)

PASS

SMTP client supplied password (available in PLAIN and LOGIN)

CHALL

challenge used by the server (available in CRAM-MD5)

DGEST

client response to server challenge (@CHALL - available in CRAM-MD5)

RFILE

a file path where the external authentication binary might supply extra information/credentials about the account (available in all authentications)

The RFILE file is composed by multiple lines with the following format:

  VAR=VALUE

Currently supported variables inside the RFILE file are:

Perms

Supply SMTP permissions for the account (see [SMTPAUTH.TAB] for detailed information)

Example:

 "PLAIN" "/usr/bin/my-auth" "-a" "@@AUTH" "-u" "@@USER" "-p" "@@PASS" "-r" "@@RFILE"

The external authentication binary may or may not fill a response file. If the authentication has been successful, the binary should exit with a code equal to zero. Any other exit code different from zero, will be interpreted as failure.

[table index] [configuration] [top]

USERDEF.TAB

 "varname"[TAB]"varvalue"[NEWLINE]

Example:

 "RealName"  "??"
 "HomePage"  "??"
 "Address"   "??"
 "Telephone" "??"
 "MaxMBSize" "10000"

contains user default values for new users that are not set during the new account creation. This file is looked up in two different places, first in '$MAIL_ROOT/domains/DOMAIN' then in '$MAIL_ROOT', where 'DOMAIN' is the name of the domain where we're going to create the new user.

For each 'domain' handled by the server we'll create a directory 'domain' inside $MAIL_ROOT. Inside $MAIL_ROOT/'domain' reside 'domain'->'account' directories ($MAIL_ROOT/'domain'/'account'). This folder contains a sub folder named 'mailbox' (or 'Maildir/(tmp,new,cur)') that stores all 'account' messages. It also contains a file named 'USER.TAB' that stores "account" variables, for example:

 "RealName"  "Davide Libenzi"
 "HomePage"  "http://www.xmailserver.org/davide.html";
 "MaxMBSize" "30000"

[table index] [configuration] [top]

CTRLACCOUNTS.TAB

 "username"[TAB]"password"[NEWLINE]

This file contains the accounts that are enabled to remote administer XMail. The password is encrypted with the 'XMCrypt' program supplied with the source distro.

'REMEMBER THAT THIS FILE HOLDS ADMIN ACCOUNTS, SO PLEASE CHOOSE COMPLEX USERNAMES AND PASSWORDS AND USE CTRL.IPMAP.TAB TO RESTRICT IP ACCESS! REMEMBER TO REMOVE THE EXAMPLE ACCOUNT FROM THIS FILE!'

[table index] [configuration] [top]

SPAMMERS.TAB

 "ipaddr"[TAB]"netmask"[NEWLINE]

or:

 "ipaddr"[TAB]"netmask"[TAB]"params"[NEWLINE]

or:

 "ipaddr/bits"[NEWLINE]

or:

 "ipaddr/bits"[TAB]"params"[NEWLINE]

Example:

 "212.131.173.0"  "255.255.255.0"
 "212.131.173.0/24"

registers all hosts of the class 'C' network '212.131.173.XXX' as spammers, and blocks them the use of XMail SMTP server. If a match is found on one of those records, XMail will reject the incoming SMTP connection at an early stage. It is possible to specify optional parameters to tell XMail which behaviour it should assume in case of a match. An example of such a setup is:

 "212.131.173.0/24"  "code=0"

In this case a code=0 tells XMail to flag the connection as possible spammer, but to await later SMTP session stages to reject the connection itself. In this case an authenticated SMTP session can override the SPAMMERS.TAB match. The optional "params" field lists parameters associated with the record, separated by a comma:

 "param1=value1,param2=value2,...,paramN=valueN"

Currently supported parameters are:

code

Specify the rejection code for the record. If the value is greater than zero, the connection is rejected soon, and the remote SMTP client is disconnected. If the value is zero, the connection is flagged as spammer but awaits later stages for rejection, by allowing authenticated SMTP connections to bypass the SPAMMERS.TAB match. If the value is less than zero, XMail will insert an "absolute value" seconds delay between SMTP commands. Default value for code is greater than zero (immediate rejection).

[table index] [configuration] [top]

SPAM-ADDRESS.TAB

 "spam-address"[NEWLINE]

Example:

 "*@rude.net"
 "*-admin@even.more.rude.net"

blocks mails coming from the entire domain 'rude.net' and coming from all addresses that end with '-admin@'even.more.rude.net.

[table index] [configuration] [top]

POP3.IPMAP.TAB

 "ipaddr"[TAB]"netmask"[TAB]"permission"[TAB]"precedence"[NEWLINE]

This file controls the global IP access permission to the POP3 server if located in the MAIL_ROOT path, and user IP access to its POP3 mailbox if located inside the user directory.

Example:

 "0.0.0.0"  "0.0.0.0"  "DENY"  "1"
 "212.131.173.0"  "255.255.255.0"  "ALLOW"  "2"

This configuration denies access to all IPs except the ones of the class 'C' network '212.131.173.XXX'.

Higher precedences win over lower ones.

[table index] [configuration] [top]

SMTP.IPMAP.TAB

 "ipaddr"[TAB]"netmask"[TAB]"permission"[TAB]"precedence"[NEWLINE]

This file controls IP access permission to SMTP server.

Example:

 "0.0.0.0"  "0.0.0.0"  "DENY"  "1"
 "212.131.173.0"  "255.255.255.0"  "ALLOW"  "2"

This configuration denies access to all IPs except the ones of the class 'C' network '212.131.173.XXX'.

Higher precedences win over lower ones.

[table index] [configuration] [top]

CTRL.IPMAP.TAB

 "ipaddr"[TAB]"netmask"[TAB]"permission"[TAB]"precedence"[NEWLINE]

This file control IP access permission to CTRL server. Example:

 "0.0.0.0"  "0.0.0.0"  "DENY"  "1"
 "212.131.173.0"  "255.255.255.0"  "ALLOW"  "2"

This configuration deny access to all IPs except the ones of the class 'C' network '212.131.173.XXX'. Higher precedences win over lower ones.

[table index] [configuration] [top]

FINGER.IPMAP.TAB

 "ipaddr"[TAB]"netmask"[TAB]"permission"[TAB]"precedence"[NEWLINE]

This file controls IP access permission to FINGER server. Example:

 "0.0.0.0"  "0.0.0.0"  "DENY"  "1"
 "212.131.173.0"  "255.255.255.0"  "ALLOW"  "2"

This configuration denies access to all IPs except the ones of the class 'C' network '212.131.173.XXX'. Higher precedences win over lower ones.

[table index] [configuration] [top]

USER.TAB

 "variable"[TAB]"value"[NEWLINE]

store user information such as:

 "RealName"  "Davide Libenzi"
 "HomePage"  "http://www.xmailserver.org/davide.html";
 "MaxMBSize" "30000"
 "ClosedML"  "0"

Please refer to USER.TAB variables below.

[table index] [configuration] [top]

MLUSERS.TAB

If the user is a mailing list this file must exist inside the user account subdirectory and contain a list of users subscribed to this list. The file format is:

 "user"[TAB]"perms"[NEWLINE]

where:

user

subscriber email address.

perms

subscriber permissions:

R

read.

W

write (check done using the 'MAIL FROM:<...>' SMTP return path).

A

write (check done using the email address used for SMTP authentication).

Example:

 "davidel@xmailserver.org"   "RW"
 "ghostuser@nightmare.net"   "R"
 "meawmeaw@kitty.cat"        "RA"

If the 'USER.TAB' file defines the 'ClosedML' variable as '1' then a client can post to this mailing list only if it's listed in 'MLUSERS.TAB' with RW permissions.

[table index] [configuration] [top]

MAILPROC.TAB

 "command"[TAB]"arg-or-macro"[TAB]...[NEWLINE]

stores commands (internals or externals) that have to be executed on a message file. The presence of this file is optional and if it does not exist the default processing is to store the message in user mailbox. The 'MAILPROC.TAB' file can be either per user or per domain, depending where the file is stored. If stored inside the user directory it applies only to the user whose directory hosts the 'MAILPROC.TAB', while if stored inside the domain directory it applies to all users of such domain. Each argument can be a macro also (see [MACRO SUBSTITUTION]):

FROM

is substituted for the sender of the message

RCPT

is substituted for the recipient of the message

RRCPT

is substituted for the real recipient ($(RCPT) could be an alias) of the message

FILE

is substituted for the message file path (the external command _must_ only read the file)

MSGID

is substituted for the (XMail unique) message id

MSGREF

is substituted for the reference SMTP message id

TMPFILE

creates a copy of the message file to a temporary one. It can be used with 'external' command but in this case it's external program responsibility to delete the temporary file. Do not use it with 'filter' commands since the filter will have no way to modify the real spool file

USERAUTH

name of the SMTP authenticated user, or "-" if no authentication has been supplied

Supported commands:

[EXTERNAL]

 "external"[TAB]"priority"[TAB]"wait-timeout"[TAB]"command-path"[TAB]=>
   "arg-or-macro"[TAB]...[NEWLINE]

where:

external

command keyword

priority

process priority: 0 = normal -1 = below normal +1 = above normal

wait-timeout

wait timeout for process execution in seconds: 0 = nowait

Be careful if using $(FILE) to give the external command enough timeout to complete, otherwise the file will be removed by XMail while the command is processing. This is because such file is a temporary one that is deleted when XMail exits from 'MAILPROC.TAB' file processing. In case the external command exit code will be '16', the command processing will stop and all the following commands listed inside the file will be skipped.

[FILTER]

 "filter"[TAB]"priority"[TAB]"wait-timeout"[TAB]"command-path"[TAB]=>
   "arg-or-macro"[TAB]...[NEWLINE]

where:

filter

command keyword

priority

process priority: 0 = normal -1 = below normal +1 = above normal

wait-timeout

wait timeout for process execution in seconds: 0 = nowait

With filters, it is not suggested to use $(TMPFILE), since the filter will never have the ability to change the message content in that way. Also, to avoid problems very difficult to troubleshoot, it is suggested to give the filter 'ENOUGH' timeout to complete (90 seconds or more). See [MESSAGE FILTERS] for detailed information about return codes. In the filter command, the "Stop Filter Processing" return flag will make XMail to stop the execution of the current custom processing file.

The 'filter' command will pass the message file to a custom external filter, that after inspecting it, has the option to accept, reject or modify it. Care should be taken to properly re-format the message after changing it, to avoid message corruption. The 'filter' command 'CANNOT' successfully change the private XMail's header part of the spool message.

[MAILBOX]

 "mailbox"[NEWLINE]

With this command the message is pushed into local user mailbox.

[REDIRECT]

 "redirect"[TAB]"domain-or-emailaddress"[TAB]...[NEWLINE]

Redirect message to internal or external domain or email address. If the message was for foo-user@custdomain.net and the file custdomain.net.tab contains a line:

 "redirect"  "target-domain.org"

the message is delivered to 'foo-user@target-domain.org'.

While the line:

 "redirect"  "user@target-domain.org"

redirects the message to user@target-domain.org.

[LREDIRECT]

 "lredirect"[TAB]"domain-or-emailaddress"[TAB]...[NEWLINE]

Redirect the message to internal or external domain (or email address) impersonating local domain during messages delivery. If the message was for foo-user@custdomain.net and the file custdomain.net.tab contains a line:

 "redirect"  "target-domain.org"

the message is delivered to 'foo-user@target-domain.org'.

While the line:

 "redirect"  "user@target-domain.org"

redirects the message to 'user@target-domain.org'. The difference between "redirect" and "lredirect" is the following. Suppose A@B sends a message to C@D, that has a redirect to E@F. With "redirect" E@F will see A@B has sender while with "lredirect" he will see C@D.

[SMTPRELAY]

 "smtprelay"[TAB]"server[:port][,options];server[:port][,options];..."[NEWLINE]

Send mail to the specified SMTP server list by trying the first, if fails the second and so on. Otherwise You can use this syntax:

 "smtprelay"[TAB]"#server[:port][,options];server[:port][,options];..."[NEWLINE]

to have XMail random-select the order the specified relays. Each gateway definition can also contain options as a comma-separated list (see [SMTP GATEWAY CONFIGURATION] for more information).

[table index] [configuration] [top]

SMTP.IPPROP.TAB

This file lists SMTP properties to be associated with the remote SMTP peer IP. The format of the file is:

 "ip-addr"[TAB]"var0=value0"...[TAB]"varN=valueN"[NEWLINE]

Example:

 "192.168.0.7/32"   "WhiteList=1"

Address selection mask are formed by an IP address (network) plus the number of valid bits inside the network mask. No space are allowed between the variable name and the '=' sign and between the '=' sign and the value. These are the currently defined variables:

WhiteList

If set to 1, all peer IP based checks will be skipped.

EaseTLS

If set to 1, drops the TLS requirement for SMTP sessions coming from the matched network.

SenderDomainCheck

If set to 0, bypasses the "CheckMailerDomain" 'SERVER.TAB' variable.

NoAuth

If set to 1, release the authentication policy for this IP.

EnableVRFY

If set to 1, enable VRFY commands from this IP.

EnableETRN

If set to 1, enable ETRN commands from this IP.

[table index] [configuration] [top]

SMTP.HNPROP.TAB

This file lists SMTP properties to be associated with the remote SMTP peer host name. The format of the file is:

 "host-spec"[TAB]"var0=value0"...[TAB]"varN=valueN"[NEWLINE]

If the "host-spec" starts with a dot ('.'), the properties listed for that record will be applied to all sub-domains of the "host-spec" domain. Since applying the 'SMTP.HNPROP.TAB' rules requires a DNS PTR lookup of the peer IP, you should be aware that this might introduce latencies into the XMail processing. If you do not have any hostname-based rules, do not create the 'SMTP.HNPROP.TAB' file at all, since the simple existence of the file would trigger the DNS PTR lookup. Example:

 "xmailserver.org"   "WhiteList=1"   "EaseTLS=1"

or:

 ".xmailserver.org"   "WhiteList=1"   "EaseTLS=1"

See [SMTP.IPPROP.TAB] for information about the properties allowed to be listed in this file.

[table index] [configuration] [top]

FILTERS.IN.TAB

See [MESSAGE FILTERS]

[table index] [configuration] [top]

FILTERS.OUT.TAB

See [MESSAGE FILTERS]

[table index] [configuration] [top]

FILTERS.POST-RCPT.TAB

See [SMTP MESSAGE FILTERS]

[table index] [configuration] [top]

FILTERS.PRE-DATA.TAB

See [SMTP MESSAGE FILTERS]

[table index] [configuration] [top]

FILTERS.POST-DATA.TAB

See [SMTP MESSAGE FILTERS]

[table index] [configuration] [top]


MACRO SUBSTITUTION

XMail support two kinds of macro declaration inside its TAB file. The old macro declaration done by prefixing the macro name with the '@@' sequence is still supported for backward compatibility, and has to be used when the macro is the only content of the parameter. Macro can also be declared as '$(MACRO)' and this form can be used anywhere inside the parameter declaration, like:

 "/var/spool/mail/$(USER).dat"

[top]


EXTERNAL AUTHENTICATION

You can use external modules (executables) to perform user authentication instead of using XMail 'mailusers.tab' lookups. Inside the userauth directory you'll find one directory for each service whose authentication can be handled externally (see SMTPEXTAUTH.TAB for SMTP). Suppose We must authenticate 'USERNAME' inside 'DOMAIN', XMail first tries to lookup (inside userauth/pop3) a file named:

'DOMAIN.tab'

else:

'.tab'

If one of these files is found, XMail authenticates 'USERNAME' - 'DOMAIN' using that file. The authentication file is a TAB file (see at the proper section in this document) which has the given structure:

 "auth-action"[TAB]"command"[TAB]"arg-or-macro"[TAB]...[NEWLINE]

Each argument can be a macro also (see [MACRO SUBSTITUTION]):

USER

the USERNAME to authenticate

DOMAIN

the DOMAIN to authenticate

PASSWD

the user password

PATH

user path

The values for 'auth-action' can be one of:

item userauth

executed when user authentication is required

useradd

executed when a user need to be added

useredit

executed when a user change is required

userdel

executed when a user deletion is required

domaindrop

executed when all domain users need to be deleted

The first line that stores the handling command for the requested action is executed as:

 command arg0 ... argN

that must return zero if successful. Any other exit code is interpreted as authentication operation failure, that. in 'userauth' case, means such user is not authenticated.

If the execution of the command fails for system reasons (command not found, access denied, etc ...) then the user is not authenticated.

If none of this file's id are found, then usual authentication is performed ('mailusers.tab'). The use of external authentication does not avoid the presence of the user entry in 'mailusers.tab'.

[top]


SMTP CLIENT AUTHENTICATION

When a message is to be sent through an SMTP server that requires authentication, XMail provides a way to handle this task by if the 'userauth/smtp' subdirectory is set up properly.

Suppose a mail is to be sent through the SMTP server 'mail.foo.net', this makes XMail to search for a file named (inside userauth/smtp):

'mail.foo.net.tab'

then:

'foo.net.tab'

then:

'net.tab'

If one of these files is found its content is used to authenticate the SMTP client session. The structure of this file, as the extension says, is the TAB one used for most of the configuration files inside XMail. Only the first valid line (uncommented #) is used to choose the authentication method and lines has this format:

 "auth-type"[TAB]"param1"...[TAB]"paramN"[NEWLINE]

Valid lines are:

 "PLAIN" "username"  "password"

or

 "LOGIN" "username"  "password"

or

 "CRAM-MD5"  "username"  "password"

[top]


CUSTOM DOMAIN MAIL PROCESSING

If a message that has as target domain of 'sub1.sub2.domain.net' arrives at the XMail server, 'AND' XMail does not have a real domain 'sub1.sub2.domain.net' inside its domain list, XMail decides if this domain gets a custom domain processing by trying to lookup:

 sub1.sub2.domain.net.tab
 .sub2.domain.net.tab
 .domain.net.tab
 .net.tab
 .tab

inside the 'custdomains' directory.

If one of these files is found the incoming mail gets custom domain processing by executing commands that are stored in such a file.

The format is:

 "command"[TAB]"arg-or-macro"[TAB]...[NEWLINE]

These tables store commands (internals or externals) that have to be executed on the message file. The presence of one of these files is optional and if none exist the default processing is applied to the message via SMTP.

Each argument can be a macro also (see [MACRO SUBSTITUTION]):

FROM

the sender of the message

RCPT

the target of the message

FILE

the message file path (the external command 'must only read' the file)

MSGID

the (XMail unique) message id

MSGREF

the reference SMTP message id

TMPFILE

creates a copy of the message file to a temporary one. It can be used with 'external' command but in this case it's external program's responsibility to delete the temporary file

USERAUTH

name of the SMTP authenticated user, or "-" if no authentication has been supplied

Supported commands:

[EXTERNAL]
 "external"[TAB]"priority"[TAB]"wait-timeout"[TAB]"command-path"[TAB]=>
   "arg-or-macro"[TAB]...[NEWLINE]

where:

external

command keyword

priority

process priority: 0 = normal -1 = below normal +1 = above normal

wait-timeout

wait timeout for process execution in seconds: 0 = nowait

Be careful if using $(FILE) to give the external command enough timeout to complete, otherwise the file will be removed by XMail while the command is processing. This is because such file is a temporary one that is deleted when XMail exits from file processing. In case the external command exit code will be '16', the command processing will stop and all the following commands listed inside the file will be skipped.

[FILTER]
 "filter"[TAB]"priority"[TAB]"wait-timeout"[TAB]"command-path"[TAB]=>
   "arg-or-macro"[TAB]...[NEWLINE]

where:

filter

command keyword

priority

process priority: 0 = normal -1 = below normal +1 = above normal

wait-timeout

wait timeout for process execution in seconds: 0 = nowait

With filters, it is not suggested to use $(TMPFILE), since the filter will never have the ability to change the message content in that way. Also, to avoid problems very difficult to troubleshoot, it is suggested to give the filter 'ENOUGH' timeout to complete (90 seconds or more). See [MESSAGE FILTERS] for detailed information about return codes. In the filter command, the "Stop Filter Processing" return flag will make XMail to stop the execution of the current custom processing file.

The 'filter' command will pass the message file to a custom external filter, that after inspecting it, has the option to accept, reject or modify it. Care should be taken to properly re-format the message after changing it, to avoid message corruption. The 'filter' command 'CANNOT' successfully change the private XMail's header part of the spool message.

[REDIRECT]
 "redirect"[TAB]"domain-or-emailaddress"[TAB]...[NEWLINE]

Redirect message to internal or external domain or email address. If the message was for foo-user@custdomain.net and the file custdomain.net.tab contains a line:

 "redirect"  "target-domain.org"

the message is delivered to 'foo-user@target-domain.org'.

While the line:

 "redirect"  "user@target-domain.org"

redirects the message to user@target-domain.org.

[LREDIRECT]
 "lredirect"[TAB]"domain-or-emailaddress"[TAB]...[NEWLINE]

Redirect the message to internal or external domain (or email address) impersonating local domain during messages delivery. If the message was for foo-user@custdomain.net and the file custdomain.net.tab contains a line:

 "redirect"  "target-domain.org"

the message is delivered to 'foo-user@target-domain.org'.

While the line:

 "redirect"  "user@target-domain.org"

redirects the message to 'user@target-domain.org'. The difference between "redirect" and "lredirect" is the following. Suppose A@B sends a message to C@D, that has a redirect to E@F. With "redirect" E@F will see A@B has sender while with "lredirect" he will see C@D.

[SMTPRELAY]
 "smtprelay"[TAB]"server[:port][,options];server[:port][,options];..."[NEWLINE]

Send mail to the specified SMTP server list by trying the first, if fails the second and so on. Otherwise You can use this syntax:

 "smtprelay"[TAB]"#server[:port][,options];server[:port][,options];..."[NEWLINE]

to have XMail random-select the order the specified relays. Each gateway definition can also contain options as a comma-separated list (see [SMTP GATEWAY CONFIGURATION] for more information).

[SMTP]
 "smtp"[NEWLINE]

Do SMTP delivery.

[top]


CMD ALIASES

CmdAliases implement aliases that are handled only through commands and can be thought of as a user level implementation of custom domain processing commands. The command set is the same of the one that is described above (Custom domain mail processing) and won't be explained again here.

For every handled domain (listed inside 'domains.tab') a directory with the same domain name is created inside the 'cmdaliases' subdirectory. This directory is automatically created and removed when you add/remove domains through the CTRL protocol (or 'CtrlClnt').

When a mail for 'USER@DOMAIN' is received by the server, the domain 'DOMAIN' is to be handled locally, and the standard users/aliases lookup fails, a file named 'USER.tab' is searched inside '$MAIL_ROOT/cmdaliases/DOMAIN'. If such file is found, commands listed inside the file (whose format must follow the one described in the previous section) are executed by the server as a matter of mail message processing. An important thing to remember is that all domain and user names, when applied to the file system, must be lower case.

The use of the command '[SMTP]' must be implemented with great care because it could create mail loops within the server.

[top]


SERVER.TAB VARIABLES

The following variables are for use int the SERVER.TAB configuration file.

[RootDomain]

Indicate the primary domain for the server.

[SmtpServerDomain]

If set, forces the domain name XMail uses inside the ESMTP greeting used to support CRAM-MD5 ESMTP authentication.

[POP3Domain]

Set the default domain for POP3 client connections.

[PostMaster]

Set the postmaster address.

[ErrorsAdmin]

The email address that receives notification messages for every message that has had delivery errors. If it is empty (allowed), the notification message is sent to the sender only.

[TempErrorsAdmin]

The email address that receives notification for temporary delivery failures. In case it's empty the notification message is sent to the sender only.

[DefaultSMTPGateways]

A semicolon separated list of SMTP servers XMail 'must' use to send its mails. The definition can also contain options as a comma-separated list (see [SMTP GATEWAY CONFIGURATION] for more information). Example:

  "192.168.0.1,NeedTLS=2;192.168.0.2"

This has the precedence over MX records.

[HeloDomain]

If this variable is specified and is not empty, its content is sent as HELO domain. Otherwise the reverse lookup of the local IP is sent as HELO domain. This helps to deal with remote SMTP servers that are set to check the reverse lookup of the incoming IP.

[CheckMailerDomain]

Enable validation of the sender domain ('MAIL FROM:<...@xxx>') by looking up DNS/MX entries.

[RemoveSpoolErrors]

Indicate if mail has to be removed or stored in 'froz' directory after a failure in delivery or filtering.

[NotifyMsgLinesExtra]

Number of lines of the bounced message that have to be listed inside the notify message (lines after the headers section). Default is zero.

[NotifySendLogToSender]

Enable/Disable sending the message log file inside the notify message to the sender. Default is off (zero).

[NotifyTryPattern]

List of delivery attempts that require the system to send a notification to the sender (and eventually to 'TempErrorsAdmin'). The list is a comma separated list of numbers (with no extra spaces) as in:

 "1,4,9"

Default is empty which means no notification is sent upon a delivery attempt failure.

[AllowNullSender]

Enable null sender ('MAIL FROM:<>') messages to be accepted by XMail.

[NoSenderBounce]

When building bounce messages, use the null SMTP sender ('MAIL FROM:<>') instead of the 'PostMaster' address. This will affect only the SMTP sender, while the message RFC822 headers will still contain the correct From: header.

[MaxMTAOps]

Set the maximum number of MTA relay steps before to declare the message as looped (default 16).

[ReceivedHdrType]

Set the verbosity of the Received: message headers tag.

'0'

Standard (client IP shown , server IP not). Default.

'1'

Verbose (client IP shown , server IP shown)

'2'

Strict (no IP shown)

'3'

Same as 0 but the client IP is not shown if the client authenticate itself.

'4'

Same as 1 but the client IP is not shown if the client authenticate itself.

[FetchHdrTags]

Set the list of headers tags to be used to extract addresses from POP3 fetched messages (POP3LINKS.TAB). This is a comma delimited list (no extra space or TABs must be included inside the list) as in:

 "+X-Deliver-To,To,Cc"

Tags preceded by a '+' character make XMail stop scanning when an address is found inside the header tag.

Tags preceded by a '+' character must be listed before other tags.

The string "+X-Deliver-To,To,Cc" is the default if nothing is specified.

[SMTP-MaxErrors]

Set the maximum number of errors allowed in a single SMTP session. When the maximum number of allowed errors is exceeded, the connection will be automatically dropped. If such variable is not set, or it is set to zero, the maximum number of errors will be unlimited.

[SmtpMsgIPBanSpammers]

Used to set the message that is sent to the SMTP client when the client IP is listed inside the file SPAMMER.TAB.

[SmtpMsgIPBanSpamAddress]

Used to set the message that is sent to the SMTP client when the client IP is listed inside the file SPAM-ADDRESS.TAB.

[SmtpMsgIPBanMaps]

Used to set the message that is sent to the SMTP client when the client IP is listed inside one of the "CustMapsList".

[SmtpMsgIPBan]

Used to set the message that is sent to the SMTP client when the client IP is listed inside the file SMTP.IPMAP.TAB.

[CustomSMTPMessage]

Set this to the message that you want to follow the standard SMTP error response sent by XMail, as in (one line, remember the =>):

 "Please open http://www.xmailserver.test/smtp_errors.html to get=>
    more information about this error"

Please be aware the RFC821 fix the maximum reply line length to 512 bytes.

[SMTP-IpMapDropCode]

Set the drop code for IPs blocked by the SMTP.IPMAP.TAB file:

'1'

the connection is dropped soon

"0"

the connection is kept alive but only authenticated users can send mail

'-S'

the peer can send messages but a delay of S seconds is introduced between commands

[AllowSmtpVRFY]

Enable the use of VRFY SMTP command. This flag may be forced by SMTP authentication.

[AllowSmtpETRN]

Enable the use of ETRN SMTP command. This flag may be forced by SMTP authentication.

[SmtpMinDiskSpace]

Minimum disk space (in Kb) that is requested before accepting an SMTP connection.

[SmtpMinVirtMemSpace]

Minimum virtual memory (in Kb) that is requested before accepting an SMTP connection.

[Pop3MinVirtMemSpace]

Minimum virtual memory (in Kb) that is requested before accepting a POP3 connection.

[Pop3SyncErrorAccount]

This defines the email account (MUST be handled locally) that receives all fetched email that XMail has not been able to deliver.

[EnableAuthSMTP-POP3]

Enable SMTP after POP3 authentication (default on).

[MaxMessageSize]

Set the maximum message size in Kb that is possible to send through the server.

[DefaultSmtpPerms]

This list SMTP permissions assigned to users looked up inside MAILUSERS.TAB during SMTP authentication. It also defines the permissions for users authenticated with SMTP after POP3.

[CustMapsList]

This is a list a user can use to set custom maps checking. The list has the given (strict) format:

maps-root:code,maps-root:code...

Where maps-root is the root for the DNS query (i.e. dialups.mail-abuse.org.) and the code can be:

'1'

the connection is dropped soon

"0"

the connection is kept alive but only authenticated users can send mail

'-S'

the peer can send messages but a delay of S seconds is introduced between commands

[SMTP-RDNSCheck]

Indicate if XMail must do an RDNS lookup before accepting a incoming SMTP connection. If 0, the check is not performed; if 1 and the check fails, the user receives a 'server use forbidden' at MAIL_FROM time; if -S (S > 0) and the check fails, a delay of S seconds between SMTP commands is used to prevent massive spamming.

SMTP authentication overrides the denial set by this option by giving authenticated users the ability to access the server from 'mapped' IPs.

[SmartDNSHost]

Setup a list of smart DNS hosts to which are directed DNS queries with recursion bit set to true. Such DNS hosts must support DNS recursion in queries. The format is:

 dns.home.bogus.net:tcp,192.168.1.1:udp,...
[DisableEmitAuthUser]

Enable/disable the emission the the 'X-AuthUser:' mail header for authenticated users. Valid values are "0" or '1', default is "0" (emission enabled).

[SmtpGwConfig]

Sets global SMTP gateway options. Those can be overridden by specific gateway options. See [SMTP GATEWAY CONFIGURATION] for information.

[Pop3LogPasswd]

Control if POP3 passwords are logged into the POP3 log file. Set to "0" to disable password logging, set to "1" to enable logging of failed logins, and the to "2" to always enable password logging. Default is "0".

[SmtpNoTLSAuths]

Lists a comma-separated sequence of SMTP authentications that are allowed while the connections is in non-TLS mode (clear text). Do not set this variable if you do not want to impose any restriction, or set it to the empty string if you do not want any authentication method to be allowed in clear-text mode.

[EnableCTRL-TLS]

Enable CTRL TLS negotiation (default "1").

[EnablePOP3-TLS]

Enable POP3 TLS (STLS) negotiation (default "1").

[EnableSMTP-TLS]

Enable SMTP TLS (STARTTLS) negotiation (default "1").

[SSLUseCertsFile]
[SSLUseCertsDir]
[SSLWantVerify]
[SSLAllowSelfSigned]
[SSLWantCert]
[SSLMaxCertsDepth]

See [SSL CONFIGURATION] for information.

[SmtpConfig]

Default SMTP server config loaded if specific server IP[,PORT] config is not found.

[SmtpConfig-IP | SmtpConfig-IP,PORT]

Specific IP or IP,PORT SMTP server config. Examples:

 "SmtpConfig-192.168.1.123" "..."
 "SmtpConfig-192.168.1.17,1025" "..."

The variable value is a comma separated sequence of configuration tokens whose meaning is:

MailAuth

authentication required to send mail to the server. Please note that by setting this value everything requires authentication, even for sending to local domains, and this is probably not what you want. The "mail-auth" is also synonym of "MailAuth".

WantTLS

TLS connection needed to talk to this server. This is either done by issuing a STARTTLS command over a standard SMTP session, or by using an SMTPS port

[top]


MESSAGE FILTERS

This feature offers a way to filter messages by providing the ability to execute external programs, such as scripts or real executables. These 'filters' may examine and/or modify messages and inform XMail of their actions with a return value.

This feature offers the ability to inspect and modify messages, giving a way to reject messages based on content, alter messages (address rewriting) and so on.

If this filters returns '4, 5 or 6' the message is rejected and is stopped in its travel. If the filter modifies the message it must return '7'.

Additional flags are allowed to be returned to XMail as a result of filter processing by adding the flags value to the exits code above listed. The currently defined flags are :

'16'

Stop selected filter list processing.

Filter flags are additive and if more than one flag need to be specified, their values must be added together. If a filter "raw" exit code is RC and the filter needs to return extra flags FILTER-SUM, the final return code FRC must be :

FRC = RC + FILTER-SUM

Example. Suppose a filter modified the message and hence needs to return 7 as return code. Suppose also that a filter wants to block the filter selection list processing by specifying a flags value of 16, the value to be returned will be :

FRC = 7 + 16 = 23

Filter selection is driven by two files 'FILTERS.IN.TAB' and 'FILTERS.OUT.TAB' located inside the $MAIL_ROOT/ directory and that have the following format:

 "sender"[TAB]"recipient"[TAB]"remote-addr"[TAB]"local-addr"[TAB]"filename"[NEWLINE]

For example:

 "*@bad-domain.com" "*" "0.0.0.0/0" "0.0.0.0/0" "av-filter.tab"
 "*" "clean@purified.net" "0.0.0.0/0" "0.0.0.0/0" "spam-block.tab"
 "*" "*" "192.168.1.0/24" "0.0.0.0/0" "archive.tab"

where the file "av-filter.tab" must be present inside the $MAIL_ROOT/filters directory. The "sender" and the "recipient" are resolved to the real account when possible. Address selection mask are formed by an IP address (network) plus the number of valid bits inside the network mask. The file 'FILTERS.IN.TAB' lists filters that have to be applied to inbound messages (going to local mailboxes) while the file 'FILTERS.OUT.TAB' lists filters that have to be applied to outbound messages (delivered remotely). All four (sender+recipient+remote-addr+local-addr) selection fields must have a match in order "filename" to be evaluated. The syntax of the filter file is:

 "command"[TAB]"arg-or-macro"[TAB]...[NEWLINE]

or:

 "!flags"[TAB]"command"[TAB]"arg-or-macro"[TAB]...[NEWLINE]

Each file may contain multiple commands, that will be executed in strictly sequential order. The first command that will trigger a rejection code will make the filtering process to end. The 'flags' parameter is a comma-separated list of flags that drives the filter execution. The syntax of each flag is either FLAG or FLAG=VAL. Currently supported flags are:

aex

exclude filter execution in case of authenticated sender

wlex

exclude filter execution in case the client IP is white-listed inside the SMTP.IPPROP.TAB file. This flag works only for SMTP filters.

timeo

sets the timeout value for this filter execution

Each argument can be a macro also (see [MACRO SUBSTITUTION]):

FROM

the sender of the message

RFROM

the sender of the message resolved to the real account, when possible (alias resolution)

RCPT

the target of the message

RRCPT

the target of the message resolved to the real account, when possible (alias resolution)

REMOTEADDR

remote IP address and port of the sender

LOCALADDR

local IP address and port where the message has been accepted

FILE

the message file path (the external command may modify the file if it returns '7' as command exit value.)

MSGID

with the (XMail unique) message id

MSGREF

the reference SMTP message id

USERAUTH

name of the SMTP authenticated user, or "-" if no authentication has been supplied

Here 'command' is the name of an external program that processes the message and returns its processing result. If it returns '6' the message is rejected and a notification message is sent to the sender. By returning '5' the message is rejected without notification. While returning '4' the message is rejected without notification and without being frozen (a '5' response could lead to a frozen message if the SERVER.TAB configuration enables this). If all filters return values different from '6, 5 and 4' the message continues its trip. The filter command may also modify the file (AV scanning, content filter, message rewriting, etc) by returning '7'. The filter 'MUST' return '7' in case it modifies the message. If the filter changes the message file it 'MUST' keep the message structure and it 'MUST' terminate all line with <CR><LF>. The filter has also the ability to return a one-line custom return message by creating a file named $(FILE).rej holding the message in the very first line. This file should be created 'ONLY' when the filter returns a rejection code ('6, 5 and 4')and 'NEVER' in case of passthrough code ('7') or modify code.

The spool files has this structure:

 Info Data           [ 1th line ]
 SmtpDomain          [ 2nd line ]
 SmtpMessageID       [ 3rd line ]
 MAIL FROM:<...>     [ 4th line ]
 RCPT TO:<...>       [ 5th line ]
 <<MAIL-DATA>>       [ 6th line ]
 ...

After the '<<MAIL-DATA>>' tag (5th line) the message follows. The message is composed of a headers section and, after the first empty line, the message body. The format of the "Info Data" line is:

 [ClientIP]:ClientPort;[ServerIP]:ServerPort;Time

'EXTREME' care must be used when modifying the message because the filter will be working on the real message, and a badly reformatted file will lead to message loss. The spool file header (any data before <<MAIL-DATA>>) 'MUST' be preserved as is by the filter in case of message rewrite happens.

[top]


SMTP MESSAGE FILTERS

Besides having the ability to perform off-line message filtering, XMail gives the user the power to run filters during the SMTP session. Three files drive the SMTP on-line filtering, and these are 'FILTERS.POST-RCPT.TAB', 'FILTERS.PRE-DATA.TAB' and 'FILTERS.POST-DATA.TAB'. The file 'FILTERS.POST-RCPT.TAB', contains one or more commands to be executed after the remote SMTP client sends the RCPT_TO command(s), and before XMail sends the response to the command. The file 'FILTERS.PRE-DATA.TAB' contains one or more commands to be executed after the remote SMTP client sends the DATA command, and before XMail sends the response to the command. Using such filters, the user can tell XMail if or if not accept the following transaction and, in case of rejection, the user is also allowed to specify a custom message to be sent to the remote SMTP client. The file 'FILTERS.POST-DATA.TAB' contains one or more commands to be executed after XMail received the whole client DATA, and before XMail sends the final response to the DATA command (final messages ack). The files 'FILTERS.POST-RCPT.TAB', 'FILTERS.PRE-DATA.TAB' and 'FILTERS.POST-DATA.TAB' contains zero or more lines with the following format:

 "command"[TAB]"arg-or-macro"[TAB]...[NEWLINE]

or:

 "!flags"[TAB]"command"[TAB]"arg-or-macro"[TAB]...[NEWLINE]

Each file may contain multiple commands, that will be executed in strictly sequential order. The first command that will trigger a rejection code will make the filtering process to end. The 'flags' parameter is a comma-separated list of flags that drives the filter execution. The syntax of each flag is either FLAG or FLAG=VAL. Currently supported flags are:

aex

exclude filter execution in case of authenticated sender

wlex

exclude filter execution in case the client IP is white-listed inside the SMTP.IPPROP.TAB file.

Each argument can be a macro also (see [MACRO SUBSTITUTION]):

FILE

message file path

USERAUTH

name of the SMTP authenticated user, or "-" if no authentication has been supplied

REMOTEADDR

remote IP address and port of the sender

LOCALADDR

local IP address and port where the message has been accepted

FROM

message sender address

CRCPT

last recipient submitted by the client. For post-rcpt filters, this will be used as to-validate recipient

RRCPT

last recipient submitted by the client, translated to the real account (in case of aliases)

Filter commands have the ability to inspect and modify the content of the message (or info) file. The exit code of commands executed by XMail are used to tell XMail the action that has to be performed as a consequence of the filter. The exit code is composed by a raw exit code and additional flags. Currently defined flags are:

'16'

Stop selected filter list processing.

Currently defined raw exit codes are:

'3'

Reject the message.

Any other exit codes will make XMail to accept the message, and can be used also when changing the content of the $(FILE) file. 'EXTREME' care must be used when changing the $(FILE) file, since XMail expect the file format to be correct. Also, it is important to preserve the <CR><LF> line termination of the file itself. When rejecting the message, the filter command has the ability to specify the SMTP status code that XMail will send to the remote SMTP client, by creating a file named $(FILE).rej containing the message in the very first line. Such file will be automatically removed by XMail. The data passed to filter commands inside $(FILE) varies depending if the command is listed inside 'FILTERS.POST-RCPT.TAB', 'FILTERS.PRE-DATA.TAB' or inside 'FILTERS.POST-DATA.TAB'. Commands listed inside 'FILTERS.POST-RCPT.TAB' and 'FILTERS.PRE-DATA.TAB' will receive the following data stored inside $(FILE):

 Info Data           [ 1th line ]
 SmtpDomain          [ 2nd line ]
 SmtpMessageID       [ 3rd line ]
 MAIL FROM:<...>     [ 4th line ]
 RCPT TO:<...> {...} [ 5th line ]
 ...

The file can have one or more "RCPT TO" lines. The format of the "Info Data" line is:

 ClientDomain;[ClientIP]:ClientPort;ServerDomain;[ServerIP]:ServerPort;Time;Logo

Note that in case of 'FILTERS.POST-RCPT.TAB', the $(FILE) data does not yet contain the current recipient to be validated. This needs to be fetched and passed to the external program using the $(CRCPT) macro (or $(RRCPT)). Commands listed inside 'FILTERS.POST-DATA.TAB' will receive the following data stored inside $(FILE):

 Info Data           [ 1th line ]
 SmtpDomain          [ 2nd line ]
 SmtpMessageID       [ 3rd line ]
 MAIL FROM:<...>     [ 4th line ]
 RCPT TO:<...> {...} [ 5th line ]
 ...
 <<MAIL-DATA>>
 ...

After the '<<MAIL-DATA>>' tag the message follows. The message is composed of a headers section and, after the first empty line, the message body. The format of the RCPT line is:

 RCPT TO:<address> {ra=real-address}

where "real-address" is the "address" after it has been translated (if aliases applies) to the real local address. Otherwise it holds the same value of "address". In case one or more SMTP filter operations are not needed, avoid to create zero sized files altogether, since this will result in faster processing.

[top]


USER.TAB VARIABLES

The following variables are for use in the USER.TAB configuration file.

[RealName]

Full user name, i.e.:

 "RealName"  "Davide Libenzi"
[HomePage]

User home page, i.e.:

 "HomePage"  "http://www.xmailserver.org/davide.html";
[MaxMBSize]

Max user mailbox size in Kb, i.e.:

 "MaxMBSize" "30000"
[ClosedML]

Specify if the mailing list is closed only to subscribed users, i.e.:

 "ClosedML"  "1"
[ListSender]

Specify the mailing list sender or administrator:

 "ListSender"    "ml-admin@xmailserver.org"

This variable should be set to avoid delivery error notifications to reach the original message senders.

[SmtpPerms]

User SMTP permissions (see SMTPAUTH.TAB for info).

[ReceiveEnable]

Set to '1' if the account can receive email, '0' if you want to disable the account from receiving messages.

[PopEnable]

Set to '1' if you want to enable the account to fetch POP3 messages, '0' otherwise.

[UseReplyTo]

Enable/Disable the emission of the Reply-To: header for mailing list's messages (default 1).

[MaxMessageSize]

Set the maximum message size (in Kb) that the user is able to send through the server. Overrides the SERVER.TAB variable.

[DisableEmitAuthUser]

Enable/disable the emission the the 'X-AuthUser:' mail header for authenticated users. Valid values are '0' or '1', default is '0' (emission enabled). This variable overrides the SERVER.TAB one when present.

[Pop3ScanCur]

In case of Maildir mailbox structure, scan the "cur" directory during POP3 message list build. Set to "0" to disable "cur" directory scanning, or to "1" to enable it.

[top]


MAIL ROUTING THROUGH ADDRESSES

A full implementation of SMTP protocol allows the ability to perform mail routing bypassing DNS MX records by means of setting, in a ruled way, the 'RCPT TO: <>' request. A mail from 'xuser@hostz' directed to '@hosta,@hostb:foouser@hostc' is received by '@hosta' then sent to '@hostb' using 'MAIL FROM: <@hosta:xuser@hostz>' and 'RCPT TO: <@hostb:foouser@hostc>'. The message is then sent to '@'hostc using 'MAIL FROM: <@hostb,@hosta:xuser@hostz>' and 'RCPT TO: <foouser@hostc>'.

[top]


XMAIL SPOOL DESIGN

The new spool filesystem tree format has been designed to enable XMail to handle very large queues. Instead of having a single spool directory (like versions older than 0.61) a two layer deep splitting has been introduced so that its structure is:

 0   <dir>
   0   <dir>
     mess    <dir>
     rsnd    <dir>
     info    <dir>
     temp    <dir>
     slog    <dir>
     cust    <dir>
     froz    <dir>
   ...
 ...

When XMail needs to create a new spool file a spool path is chosen in a random way and a new file with the format:

 mstime.tid.seq.hostname

is created inside the 'temp' subdirectory. When the spool file is ready to be committed, it's moved into the 'mess' subdirectory that holds newer spool files. If XMail fails sending a new message (the ones in mess subdirectory) it creates a log file (with the same name of the message file) inside the 'slog' subdirectory and move the file from 'mess' to 'rsnd'. During the message sending the message itself is locked by creating a file inside the 'lock' subdirectory (with the same name of the message file). If the message has permanent delivery errors or is expired and if the option 'RemoveSpoolErrors' of the 'SERVER.TAB' file is off, the message file is moved into the 'froz' subdirectory.

[top]


SMTP GATEWAY CONFIGURATION

An SMTP gateway definition inside XMail can be followed by a set of configuration options, that are in the form of a comma-separated VAR=VAL or FLAG definitions. Currently defined options are:

NeedTLS

If set to 1, instruct XMail to try to establish a TLS session with the remote host (by the means of a STARTTLS SMTP command). If set to 2, XMail will try to establish a TLS session, but it will fail if not able to do so (the remote server does not support STARTTLS, or reject our attempt to negotiate the TLS link).

OutBind

Sets the IP address of the network interface that should be used when connecting to the remote host. This configuration should be used carefully, because XMail will fail if the selected IP of the interface does not have a route to the remote host using such IP.

[top]


SSL CONFIGURATION

XMail uses to identify itself during SSL negotiations, by the mean of the two files 'server.cert' and 'server.key'. These files 'MUST' be available inside the 'MAIL_ROOT' directory. Both are in PEM format, and one represent the server certificate file/chain ('server.cert') while the other represent the server private key file ('server.key'). XMail uses the OpenSSL libraries for its SSL operations. http://www.openssl.org/docs/HOWTO/certificates.txt contains examples about how to create certificates to be use by XMail, while http://www.openssl.org/docs/HOWTO/keys.txt describes own to generate keys. In order to properly manage your XMail server when using SSL support, you need to have access to the OpenSSL binary. For Unix ports, this is available as a package, whose name varies depending on the distribution. For Windows, pre-built versions of theOpenSSL libraries and binary are supplied inside the "win32ssl" directory of the XMail source package. For example, to create a self-signed certificate, you first have to create a private key with:

  $ openssl genrsa 2048 > server.key

After you have created the private key, you can create you own copy of the self-signed certificate with:

  $ openssl req -new -x509 -key server.key -out server.cert
  C:> openssl req -new -x509 -key server.key -out server.cert -config openssl.cnf

Remeber that the Common Name (CN) that you supply to the OpenSSL binary, is the fully qualified host name that answers to the IP where your XMail server is listening. If you want to have a certificate signed by an authority, you need to generate a certificate request file:

  $ openssl req -new -key server.key -out cert.csr
  
  C:> openssl req -new -key server.key -out cert.csr -config openssl.cnf

The 'openssl.cnf' file is supplied inside the Xmail's Windows binary package, and inside the 'win32ssl\conf' directory of the source package. The 'cert.csr' file needs then to be submitted to the certificate authority in order to obtain a root-signed certificate file (that will be your 'server.cert'). The behaviour of the XMail SSL module is controlled by a few 'SERVER.TAB' variables:

[SSLWantVerify]

Tells the SSL link negotiation code to verify the remote peer certificate. If this is enabled, you need to use either SSLUseCertsFile or SSLUseCertsDir to provide a set of valid root certificates. You can also add your own certificates in the set, in order to provide access to your servers by clients using certificates signed by you.

[SSLWantCert]

Tells the SSL link negotiation code to fail if the remote peer does not supply a certificate.

[SSLAllowSelfSigned]

Allows self-signed certificates supplied by remote peers.

[SSLMaxCertsDepth]

Set the maximum certificate chain depth for the verification process.

[SSLUseCertsFile]

When using SSLWantVerify, the SSL code will verify the peer certificate using standard SSL certificate chain verification rules. It is possible to supply to XMail an extra list of valid certificates, by filling up a 'CERTS.PEM' file and setting SSLUseCertsFile to 1. The 'CERTS.PEM' is a concatenation of certificates in PEM format.

[SSLUseCertsDir]

In the same way as SSLUseCertsFile does, setting SSLUseCertsDir to 1 enables the usage of extra valid certificates stored inside the 'CERTS' XMail sub-directory. The 'CERTS' contains hashed file names that are created by feeding the directory path to the 'c_rehash' OpenSSL Perl script (a Windows-friendly version of 'c_rehash', named 'c_rehash.pl' is contained inside the 'win32ssl\bin' subdirectory of the source package). Unix users will find proper CA certificates inside the standard install paths of OpenSSL, while Windows users will find them inside the 'win32ssl\certs' subdirectory of the source package. To use 'c_rehash' you need to have the OpenSSL binaries (executable and shared libraries) correctly installed in your system, and the executable reachable from your PATH. Then you simply run it by passing the path to the PEM certificates directory ('CERTS'). The 'c_rehash' script will call the OpenSSL binary and will generated hashed file names (that are either symlinks or copies) that point/replicate the mapped certificate.

[top]


SMTP COMMANDS

These are commands understood by ESMTP server:

MAIL FROM:<>
RCPT TO:<>
DATA
HELO
EHLO
STARTTLS
AUTH
RSET
VRFY
ETRN
NOOP
HELP
QUIT

[top]


POP3 COMMANDS

These are commands understood by POP3 server:

USER
PASS
CAPA
STLS
APOP
STAT
LIST
UIDL
QUIT
RETR
TOP
DELE
NOOP
LAST
RSET

[top]


COMMAND LINE

Most of XMail configuration settings are command line tunables. These are command line switches organized by server.

[XMAIL]
-Ms pathname

Mail root path (also settable with MAIL_ROOT environment).

-Md

Activate debug (verbose) mode.

-Mr hours

Set log rotate hours step.

-Mx split-level

Set the queue split level. The value you set here is rounded to the lower prime number higher or equal than the value you've set.

-MR bytes

Set the size of the socket's receive buffer in bytes (rounded up to 1024).

-MS bytes

Set the size of the socket's send buffer in bytes (rounded up to 1024).

-MM

Setup XMail to use 'Maildir' delivery (default on Unix).

-Mm

Setup XMail to use 'mailbox' delivery (default on Windows).

-MD ndirs

Set the number of subdirectories allocated for the DNS cache files storage ( default 101 ).

-M4

Use only IPV4 records for host name lookups (default).

-M6

Use only IPV6 records for host name lookups.

-M5

Use IPV4 records if present, or IPV6 records otherwise, for host name lookups.

-M7

Use IPV6 records if present, or IPV4 records otherwise, for host name lookups.

[POP3]
-P-

Disable the service.

-P6

Bind to IPV6 address (in case no -PI option is specified)

-Pp port

Set POP3 server port (if you change this you must know what you're doing).

-Pt timeout

Set POP3 session timeout (seconds) after which the server closes. the connection if it does not receive any commands.

-Pl

Enable POP3 logging.

-Pw timeout

Set the delay timeout in response to a bad POP3 login. Such time is doubled at the next bad login.

-Ph

Hang the connection in bad login response.

-PI ip[:port]

Bind server to the specified ip address and (optional) port (can be multiple).

-PX nthreads

Set the maximum number of threads for POP3 server.

[POP3S]
-B-

Disable the service.

-B6

Bind to IPV6 address (in case no -BI option is specified)

-Bp port

Set POP3S server port (if you change this you must know what you're doing).

-BI ip[:port]

Bind server to the specified ip address and (optional) port (can be multiple).

[SMTP]
-S-

Disable the service.

-S6

Bind to IPV6 address (in case no -SI option is specified)

-Sp port

Set SMTP server port (if you change this you must know what you're doing).

-St timeout

Set SMTP session timeout (seconds) after which the server closes the connection if no commands are received.

-Sl

Enable SMTP logging.

-SI ip[:port]

Bind server to the specified ip address and (optional) port (can be multiple).

-SX nthreads

Set the maximum number of threads for SMTP server.

-Sr maxrcpts

Set the maximum number of recipients for a single SMTP message (default 100).

-Se nsecs

Set the expire timeout for a POP3 authentication IP (default 900).

[SMTPS]
-X-

Disable the service.

-X6

Bind to IPV6 address (in case no -XI option is specified)

-Xp port

Set SMTPS server port (if you change this you must know what you're doing).

-XI ip[:port]

Bind server to the specified ip address and (optional) port (can be multiple).

[SMAIL]
-Qn nthreads. Default 16, maximum 256.

Set the number of mailer threads.

-Qt timeout

Set the time to be wait for a next try after send failure. Default 480.

-Qi ratio

Set the increment ratio of the reschedule time in sending a messages. At every failure in delivery a message, reschedule time T is incremented by (T / ratio), therefore :

 T(i) = T(i-1) + T(i-1)/ratio.

If you set this ratio to zero, T remain unchanged over delivery tentatives. Default 16.

-Qr nretries

Set the maximum number of times to try to send the message. Default 32.

-Ql

Enable SMAIL logging.

-QT timeout

Timeout value for filters commands in seconds. Default 90.

-Qg

Enable filter logging.

[PSYNC]
-Y-

Disable the service.

-Yi interval

Set external POP3 accounts sync interval. Setting this to zero will disable the PSYNC task. Default 120.

-Yt nthreads

Set the number of POP3 sync threads.

-YT nsec

Sets the timeout for POP3 client connections.

-Yl

Enable PSYNC logging.

[FINGER]
-F-

Disable the service.

-F6

Bind to IPV6 address (in case no -FI option is specified)

-Fp port

Set FINGER server port (if you change this you must know what you're doing).

-Fl

Enable FINGER logging.

-FI ip[:port]

Bind server to the specified ip address and (optional) port (can be multiple).

[CTRL]
-C-

Disable the service.

-C6

Bind to IPV6 address (in case no -CI option is specified)

-Cp port

Set CTRL server port (if you change this you must know what you're doing).

-Ct timeout

Set CTRL session timeout (seconds) after which the server closes the connection if no commands are received.

-Cl

Enable CTRL logging.

-CI ip[:port]

Bind server to the specified ip address and (optional) port (can be multiple).

-CX nthreads

Set the maximum number of threads for CTRL server.

[CTRLS]
-W-

Disable the service.

-W6

Bind to IPV6 address (in case no -WI option is specified)

-Wp port

Set CTRLS server port.

-WI ip[:port]

Bind server to the specified ip address and (optional) port (can be multiple).

[LMAIL]
-Ln nthreads

Set the number of local mailer threads.

-Lt timeout

Set the sleep timeout for LMAIL threads (in seconds, default 2).

-Ll

Enable local mail logging.

[top]


XMAIL ADMIN PROTOCOL

It's possible to remote admin XMail due to the existence of a 'controller server' that runs with XMail and waits for TCP/IP connections on a port (6017 or tunable via a '-Cp nport') command line option.

Admin protocol details:

Description
Adding a user
Deleting a user
Changing a user's password
Authenticate user
Retrieve user statistics
Adding an alias
Deleting an alias
Listing aliases
Listing user vars
Setting user vars
Listing users
Getting mailproc.tab file
Setting mailproc.tab file
Adding a mailing list user
Deleting a mailing list user
Listing mailing list users
Adding a domain
Deleting a domain
Listing handled domains
Adding a domain alias
Deleting a domain alias
Listing alias domains
Getting custom domain file
Setting custom domain file
Listing custom domains
Adding a POP3 external link
Deleting a POP3 external link
Listing POP3 external links
Enabling a POP3 external link
Listing files
Getting configuration file
Setting configuration file
Listing frozen messages
Rescheduling frozen message
Deleting frozen message
Getting frozen message log file
Getting frozen message
Starting a queue flush
Do nothing command
Quit the connection
Do you want...?

Description

The XMail admin server 'speaks' a given protocol that can be used by external GUI utilities written with the more disparate scripting languages, to remote administer the mail server. The protocol is based on sending formatted command and waiting for formatted server responses and error codes. All the lines, commands, and responses are delimited by a <CR><LF> pair. The error code string (I'll call it RESSTRING) has the given format:

 "+DDDDD OK"<CR><LF>

if the command execution is successful while:

 "-DDDDD ErrorString"<CR><LF>

if the command failed.

The " character is not included in responses. DDDDD is a numeric error code while ErrorString is a description of the error. If DDDDD equals 00100, a lines list, terminated by a line with a single point (<CR><LF>.<CR><LF>), follows the response.

The input format for commands is similar to the one used in TAB files:

 "cmdstring"[TAB]"param1"[TAB]..."paramN"<CR><LF>

where 'cmdstring' is the command string identifying the action to be performed, and param1,... are the parameters of the command.

Immediately after the connection with XMail controller server is established the client receives a RESSTRING that is:

 +00000 <TimeStamp> XMail ...

if the server is ready, while:

 -DDDDD ...

(where DDDDDD is an error code) if not.

The TimeStamp string has the format:

 currtime.pid@ipaddress

and is used in MD5 authentication procedure.

As the first action immediately after the connection the client must send an authentication string with this format:

 "user"[TAB]"password"<CR><LF>

where user must be enabled to remote admin XMail. Clear text authentication should not be used due server security. Using MD5 authentication instead, the client must perform an MD5 checksum on the string composed by (<> included):

 <TimeStamp>password

and then send to the server:

 "user"[TAB]"#md5chksum"<CR><LF>

where md5chksum is the MD5 checksum (note '#' as first char of sent digest). The result of the authentication send is a RESSTRING. If the user does not receive a positive authentication response, the connection is closed by the server. It is possible to establish an SSL session with the server by issuing the "#!TLS" string as login string. In response to that, the server will send back a RESSTRING. In case of success RESSTRING, the client can proceed with the SSL link negotiation with the server.

[admin protocol] [top]

Adding a user

 "useradd"[TAB]"domain"[TAB]"username"[TAB]"password"[TAB]"usertype"<CR><LF>

where:

domain

domain name (must be handled by the server).

username

username to add.

password

user password.

usertype

'U' for normal user and 'M' for mailing list.

The result is a RESSTRING.

[admin protocol] [top]

Deleting a user


 "userdel"[TAB]"domain"[TAB]"username"<CR><LF>

where:

domain

domain name (must be handled by the server).

username

username to delete.

The result is a RESSTRING.

[admin protocol] [top]

Changing a user's password

 "userpasswd"[TAB]"domain"[TAB]"username"[TAB]"password"<CR><LF>

where:

domain

domain name (must be handled by the server).

username

username (must exist).

password

new password.

The result is a RESSTRING.

[admin protocol] [top]

Authenticate user

 "userauth"[TAB]"domain"[TAB]"username"[TAB]"password"<CR><LF>

where:

domain

domain name.

username

username.

password

password.

The result is a RESSTRING.

[admin protocol] [top]

Retrieve user statistics

 "userstat"[TAB]"domain"[TAB]"username"<CR><LF>

where:

domain

domain name.

username

username/alias.

The result is a RESSTRING. If successful (00100), a formatted matching users list follows terminated by a line containing a single dot (<CR><LF>.<CR><LF>). This is the format of the listing:

 "variable"[TAB]"value"<CR><LF>

Where valid variables are:

RealAddress

real address (maybe different is the supplied username is an alias).

MailboxSize

total size of the mailbox in bytes.

MailboxMessages

total number of messages.

LastLoginIP

last user login IP address.

LastLoginTimeDate

time of the last login.

[admin protocol] [top]

Adding an alias

 "aliasadd"[TAB]"domain"[TAB]"alias"[TAB]"account"<CR><LF>

where:

domain

domain name (must be handled by the server).

alias

alias to add.

account

real email account (locally handled). This can be a fully qualified email address or a username inside the same domain.

The result is a RESSTRING.

[admin protocol] [top]

Deleting an alias

 "aliasdel"[TAB]"domain"[TAB]"alias"<CR><LF>

where:

domain

domain name (must be handled by the server).

alias

alias to delete.

The result is a RESSTRING.

[admin protocol] [top]

Listing aliases

 "aliaslist"[TAB]"domain"[TAB]"alias"[TAB]"account"<CR><LF>

or

 "aliaslist"[TAB]"domain"[TAB]"alias"<CR><LF>

or

 "aliaslist"[TAB]"domain"<CR><LF>

or

 "aliaslist"<CR><LF>

where:

domain

domain name, optional (can contain wild cards).

alias

alias name, optional (can contain wildcards).

account

account, optional (can contain wildcards).

Example:

 "aliaslist"[TAB]"foo.bar"[TAB]"*"[TAB]"mickey"<CR><LF>

lists all aliases of user 'mickey' in domain 'foo.bar'.

The result is a RESSTRING. In successful cases (00100) a formatted matching users list follows, terminated by a line containing a single dot (<CR><LF>.<CR><LF>). This is the format of the listing:

 "domain"[TAB]"alias"[TAB]"username"<CR><LF>

[admin protocol] [top]

Adding an external alias

 "exaliasadd"[TAB]"local-address"[TAB]"remote-address"<CR><LF>

where:

local-address

local email address.

remote-address

remote email address.

For example, the following command string:

 "exaliasadd"[TAB]"dlibenzi@home.bogus"[TAB]"dlibenzi@xmailserver.org"<CR><LF>

will link the external email address 'dlibenzi@xmailserver.org' with the local email address 'dlibenzi@home.bogus'. The result is a RESSTRING.

[admin protocol] [top]

Deleting an external alias

 "exaliasdel"[TAB]"remote-address"<CR><LF>

where:

remote-address

remote email address.

The result is a RESSTRING.

[admin protocol] [top]

Listing external aliases

 "exaliaslist"[TAB]"local-address"[TAB]"remote-address"<CR><LF>

or

 "exaliaslist"[TAB]"local-address"<CR><LF>

or

 "exaliaslist"<CR><LF>

where:

local-address

local email address. This can contain wildcard characters.

remote-address

remote email address. This can contain wildcard characters.

Example:

 "exaliaslist"[TAB]"*@home.bogus"<CR><LF>

lists all the external aliases linked to local accounts in domain 'home.bogus'.

The result is a RESSTRING. In successful cases (00100) a formatted matching users list follows, terminated by a line containing a single dot (<CR><LF>.<CR><LF>). This is the format of the listing:

 "rmt-domain"[TAB]"rmt-name"[TAB]"loc-domain"[TAB]"loc-name"<CR><LF>

[admin protocol] [top]

Listing user vars

 "uservars"[TAB]"domain"[TAB]"username"<CR><LF>

where:

domain

domain name.

username

username.

The result is a RESSTRING. In successfully cases (00100) a formatted list of user vars follow, terminated by a line containing a single dot (<CR><LF>.<CR><LF>). This is the format of the listing:

 "varname"[TAB]"varvalue"<CR><LF>

[admin protocol] [top]

Setting user vars

 "uservarsset"[TAB]"domain"[TAB]"username"[TAB]"varname"[TAB]"varvalue" ... <CR><LF>

where:

domain

domain name.

username

username.

varname

variable name.

varvalue

variable value.

There can be multiple variable assignments with a single call. If 'varvalue' is the string '.|rm' the variable 'varname' is deleted. The result is a RESSTRING.

[admin protocol] [top]

Listing users

 "userlist"[TAB]"domain"[TAB]"username"<CR><LF>

or

 "userlist"[TAB]"domain"<CR><LF>

or

 "userlist"<CR><LF>

where:

domain

domain name, optional (can contain wild cards).

username

username, optional (can contain wild cards).

Example:

 "userlist"[TAB]"spacejam.foo"[TAB]"*admin"<CR><LF>

lists all users of domain 'spacejam.foo' that end with the word 'admin'.

The result are a RESSTRING. If successful (00100), a formatted matching users list follows terminated by a line containing a single dot (<CR><LF>.<CR><LF>). This is the format of the listing:

 "domain"[TAB]"username"[TAB]"password"[TAB]"usertype"<CR><LF>

[admin protocol] [top]

Getting mailproc.tab file

 "usergetmproc"[TAB]"domain"[TAB]"username"<CR><LF>
 
or
 "usergetmproc"[TAB]"domain"[TAB]"username"[TAB]"flags"<CR><LF>

where:

domain

domain name.

username

username.

flags

flags specifying which mailproc to retrieve. Use 'U' for user mailproc, or 'D' for domain mailproc (or 'DU' for a merge of both). If not specified, 'DU' is assumed.

Example:

 "usergetmproc"[TAB]"spacejam.foo"[TAB]"admin"<CR><LF>

gets mailproc.tab file for user 'admin' in domain 'spacejam.foo'.

The result is a RESSTRING. In successful cases (00100) the mailproc.tab file is listed line by line, terminated by a line containing a single dot (<CR><LF>.<CR><LF>).

[admin protocol] [top]

Setting mailproc.tab file

 "usersetmproc"[TAB]"domain"[TAB]"username"<CR><LF>
 
or
 "usersetmproc"[TAB]"domain"[TAB]"username"[TAB]"which"<CR><LF>

where:

domain

domain name.

username

username.

which

which mailproc.tab should be set. Use 'U' for the user one, and 'D' for the domain one. If not specified, 'U' is assumed.

Example:

 "usersetmproc"[TAB]"spacejam.foo"[TAB]"admin"<CR><LF>

sets mailproc.tab file for user 'admin' in domain 'spacejam.foo'.

The result is a RESSTRING. If successful (00101), the client must list the mailproc.tab file line by line, ending with a line containing a single dot (<CR><LF>.<CR><LF>). If a line of the file begins with a dot, another dot must be added at the beginning of the line. If the file has zero length the mailproc.tab is deleted. The client then gets another RESSTRING indicating the final command result.

[admin protocol] [top]

Adding a mailing list user

 "mluseradd"[TAB]"domain"[TAB]"mlusername"[TAB]"mailaddress"[TAB]"perms"<CR><LF>

or

 "mluseradd"[TAB]"domain"[TAB]"mlusername"[TAB]"mailaddress"<CR><LF>

where:

domain

domain name (must be handled by the server).

mlusername

mailing list username.

mailaddress

mail address to add to the mailing list 'mlusername@domain'.

perms

user permissions (R or RW or RA). When 'perms' is not specified the default is RW.

The result is a RESSTRING.

[admin protocol] [top]

Deleting a mailing list user

 "mluserdel"[TAB]"domain"[TAB]"mlusername"[TAB]"mailaddress"<CR><LF>

where:

domain

domain name (must be handled by the server).

mlusername

mailing list username.

mailaddress

mail address to delete from the mailing list 'mlusername@domain'.

The result is a RESSTRING.

[admin protocol] [top]

Listing mailing list users

 "mluserlist"[TAB]"domain"[TAB]"mlusername"<CR><LF>

where:

domain

domain name (must be handled by the server).

mlusername

mailing list username.

The result is a RESSTRING. If successful (00100), a formatted list of mailing list users follows terminated by a line containing a single dot (<CR><LF>.<CR><LF>).

[admin protocol] [top]

Adding a domain

 "domainadd"[TAB]"domain"<CR><LF>

where:

domain

domain name to add.

The result is a RESSTRING.

[admin protocol] [top]

Deleting a domain

 "domaindel"[TAB]"domain"<CR><LF>

where:

domain

domain name to delete.

The result is a RESSTRING. This is not always a safe operation.

[admin protocol] [top]

Listing handled domains

 "domainlist"<CR><LF>

or:

 "domainlist"[TAB]"wildmatch0"[TAB]...[TAB]"wildmatchN"<CR><LF>

The result is a RESSTRING. The wild match versions simply returns a filtered list of domains. If successful (00100), a formatted list of handled domains follows, terminated by a line containing a single dot (<CR><LF>.<CR><LF>).

[admin protocol] [top]

Adding a domain alias

 "aliasdomainadd"[TAB]"realdomain"[TAB]"aliasdomain"<CR><LF>

Example:

 "aliasdomainadd"[TAB]"xmailserver.org"[TAB]"xmailserver.com"<CR><LF>

defines 'xmailserver.com' as an alias of 'xmailserver.org', or:

 "aliasdomainadd"[TAB]"xmailserver.org"[TAB]"*.xmailserver.org"<CR><LF>

defines all subdomains of 'xmailserver.org' as aliases of 'xmailserver.org'.

[admin protocol] [top]

Deleting a domain alias

 "aliasdomaindel"[TAB]"aliasdomain"<CR><LF>

Example:

 "aliasdomaindel"[TAB]"*.xmailserver.org"<CR><LF>

removes the '*.xmailserver.org' domain alias.

[admin protocol] [top]

Listing alias domains

 "aliasdomainlist"<CR><LF>

or:

 "aliasdomainlist"[TAB]"wild-dom-match"<CR><LF>

or:

 "aliasdomainlist"[TAB]"wild-dom-match"[TAB]"wild-adom-match"<CR><LF>

The result is a RESSTRING. The wild match version simply returns a filtered list of alias domains. If successful (00100), a formatted list of alias domains follows, terminated by a line containing a single dot (<CR><LF>.<CR><LF>). The output format is:

 "real-domain"[TAB]"alias-domain"<CR><LF>

[admin protocol] [top]

Getting custom domain file

 "custdomget"[TAB]"domain"<CR><LF>

where:

domain

domain name.

Example:

 "custdomget"[TAB]"spacejam.foo"<CR><LF>

gets the custom domain file for domain 'spacejam.foo'.

The result is a RESSTRING. If successful (00100), the custom domain file is listed line by line terminated by a line containing a single dot (<CR><LF>.<CR><LF>).

[admin protocol] [top]

Setting custom domain file

 "custdomset"[TAB]"domain"<CR><LF>

where:

domain

domain name.

Example:

 "custdomset"[TAB]"spacejam.foo"<CR><LF>

sets custom domain file for domain 'spacejam.foo'.

The result is a RESSTRING. If successful (00101), the client must list the custom domain file line by line, ending with a line containing a single dot (<CR><LF>.<CR><LF>). If a line of the file begins with a dot, another dot must be added at the begin of the line. If the file has zero length the custom domain file is deleted. The client then gets another RESSTRING indicating the final command result.

[admin protocol] [top]

Listing custom domains

 "custdomlist"<CR><LF>

The result is a RESSTRING. If successful (00100), a formatted list of custom domains follows, terminated by a line containing a single dot (<CR><LF>.<CR><LF>).

[admin protocol] [top]

Adding a POP3 external link

 "poplnkadd"[TAB]"loc-domain"[TAB]"loc-username"[TAB]"extrn-domain"=>
   [TAB]"extrn-username"[TAB]"extrn-password"[TAB]"authtype"<CR><LF>

where:

loc-domain

local domain name (must be handled by the server).

loc-username

local username which receives mails.

extrn-domain

external domain.

extrn-username

external username.

extrn-password

external user password.

authtype

authentication method (see [POP3LINKS.TAB]).

The remote server must support 'APOP' authentication to specify APOP as authtype. Using APOP authentication is more secure because clear usernames and passwords do not travel on the network; if you're not sure about it, specify 'CLR' as authtype.

The result is a RESSTRING.

[admin protocol] [top]

Deleting a POP3 external link

 "poplnkdel"[TAB]"loc-domain"[TAB]"loc-username"[TAB]"extrn-domain"=>
   [TAB]"extrn-username"<CR><LF>

where:

loc-domain

local domain name (must be handled by the server).

loc-username

local username which receives mails.

extrn-domain

external domain.

extrn-username

external username.

The result is a RESSTRING.

[admin protocol] [top]

Listing POP3 external links

 "poplnklist"[TAB]"loc-domain"[TAB]"loc-username"<CR><LF>

or

 "poplnklist"[TAB]"loc-domain"<CR><LF>

or

 "poplnklist"<CR><LF>

The result is a RESSTRING. If successful (00100), a formatted list of handled domains follows, terminated by a line containing a single dot (<CR><LF>.<CR><LF>). The format of the listing is:

 "loc-domain"[TAB]"loc-username"[TAB]"extrn-domain"[TAB]"extrn-username"=>
   [TAB]"extrn-password"[TAB]"authtype"[TAB]"on-off"<CR><LF>

[admin protocol] [top]

Enabling a POP3 external link

 "poplnkenable"[TAB]"enable"[TAB]"loc-domain"[TAB]"loc-username"=>
   [TAB]"extrn-domain"[TAB]"extrn-username"<CR><LF>

or

 "poplnkenable"[TAB]"enable"[TAB]"loc-domain"[TAB]"loc-username"<CR><LF>

where:

enable

1 for enabling - 0 for disabling.

loc-domain

local domain name.

loc-username

local username which receives mails.

extrn-domain

external domain.

extrn-username

external username.

In the second format all users, links are affected by the enable operation.

The result is a RESSTRING.

[admin protocol] [top]

Listing files

 "filelist"[TAB]"relative-dir-path"[TAB]"match-string"<CR><LF>

where:

relative-dir-path

path relative to MAIL_ROOT path.

match-string

wild card match string for file list selection.

The result is a RESSTRING. If successful (00100), the directory is listed line by line, terminated by a line containing a single dot (<CR><LF>.<CR><LF>). The listing format is:

"filename"[TAB]"filesize"<CR><LF>

[admin protocol] [top]

Getting configuration file

 "cfgfileget"[TAB]"relative-file-path"<CR><LF>

where:

relative-file-path

path relative to MAIL_ROOT path.

Example:

 "cfgfileget"[TAB]"ctrlaccounts.tab"<CR><LF>

The result is a RESSTRING. If successful (00100), the file is listed line by line, terminated by a line containing a single dot (<CR><LF>.<CR><LF>). You CANNOT use this command with indexed files !

[admin protocol] [top]

Setting configuration file

 "cfgfileset"[TAB]"relative-file-path"<CR><LF>

where:

relative-file-path

path relative to MAIL_ROOT path.

Example:

 "cfgfileset"[TAB]"ctrlaccounts.tab"<CR><LF>

The result is a RESSTRING. IF successful (00101), the client must list the configuration file line by line, ending with a line containing a single dot (<CR><LF>.<CR><LF>). If a line of the file begins with a dot, another dot must be added at the beginning of the line. If the file has zero length the configuration file is deleted. The client then gets another RESSTRING indicating the final command result. Remember that configuration files have a strict syntax and that pushing a incorrect one can make XMail not work properly. You CANNOT use this command with indexed files!

[admin protocol] [top]

Listing frozen messages

 "frozlist"<CR><LF>

The result is a RESSTRING. If successful (00100), a formatted list of frozen messages follows, terminated by a line containing a single dot (<CR><LF>.<CR><LF>). The format of the listing is:

 "msgfile"[tab]"lev0"[TAB]"lev1"[TAB]"from"[TAB]"to"[TAB]"time"[TAB]"size"<CR><LF>

Where:

msgfile

message name or id.

lev0

queue fs level 0 (first level directory index).

lev1

queue fs level 1 (second level directory index).

from

message sender.

to

message destination.

time

message time ("YYYY-MM-DD HH:MM:SS").

size

message size in bytes.

[admin protocol] [top]

Rescheduling frozen message

 "frozsubmit"[TAB]"lev0"[TAB]"lev1"[TAB]"msgfile"<CR><LF>

where:

msgfile

message name or id.

lev0

queue fs level 0 (first level directory index).

lev1

queue fs level 1 (second level directory index).

You can get this information from the frozlist command. After a message has been successfully rescheduled it is deleted from the frozen fs path. The result is a RESSTRING.

[admin protocol] [top]

Deleting frozen message

 "frozdel"[TAB]"lev0"[TAB]"lev1"[TAB]"msgfile"<CR><LF>

where:

msgfile

message name or id.

lev0

queue fs level 0 (first level directory index).

lev1

queue fs level 1 (second level directory index).

You can get this information from the frozlist command. The result is a RESSTRING.

[admin protocol] [top]

Getting frozen message log file

 "frozgetlog"[TAB]"lev0"[TAB]"lev1"[TAB]"msgfile"<CR><LF>

where:

msgfile

message name or id.

lev0

queue fs level 0 (first level directory index).

lev1

queue fs level 1 (second level directory index).

You can get this information from the frozlist command. The result is a RESSTRING. If successful (00100), the frozen message log file follows, terminated by a line containing a single dot (<CR><LF>.<CR><LF>).

[admin protocol] [top]

Getting frozen message

 "frozgetmsg"[TAB]"lev0"[TAB]"lev1"[TAB]"msgfile"<CR><LF>

where:

msgfile

message name or id.

lev0

queue fs level 0 (first level directory index).

lev1

queue fs level 1 (second level directory index).

You can get this information from the frozlist command. The result is a RESSTRING. If successful (00100), the frozen message file follows, terminated by a line containing a single dot (<CR><LF>.<CR><LF>).

[admin protocol] [top]

Starting a queue flush

 "etrn"[TAB]"email-match0"...<CR><LF>

where:

email-match0

wild card email matching for destination address.

Example:

 "etrn"  "*@*.mydomain.com"  "your-domain.org"

starts queueing all messages with a matching destination address.

[admin protocol] [top]

Do nothing command

"noop"<CR><LF>

The result is a RESSTRING.

[admin protocol] [top]

Quit the connection

 "quit"<CR><LF>

The result is a RESSTRING.

[admin protocol] [top]

Do you want...?

Do you want to build GUI configuration tools using common scripting languages (Java, TCL/Tk, etc) and XMail controller protocol? Do you want to build Web configuration tools? Please let me know <davidel@xmailserver.org>.

[admin protocol] [top]


XMAIL LOCAL MAILER

XMail has the ability to deliver locally prepared mail files that if finds in the 'spool/local' directory. The format of these files is strict:

 mail from:<...>[CR][LF]
 rcpt to:<...>[CR][LF]
 ...
 [CR][LF]
 message text in RFC822 format with [CR][LF] line termination

All lines must be [CR][LF] terminated, with one mail-from statement, one or more rcpt-to statements, an empty line and the message text. Mail files must not be created directly inside the '/spool/local' directory but instead inside '/spool/temp' directory. When the file is prepared it has to be moved into '/spool/local'. The file name format is:

 stime-seqnr.pid.hostname

where:

stime

system time in sec from 01/01/1970.

seqnr

sequence number for the current file.

pid

process or thread id.

hostname

creator process host name.

Example:

 97456928-001.7892.home.bogus

XMail has a number of LMAIL threads that periodically scan the '/spool/local' directory watching for locally generated mail files. You can tune this number of threads with the '-Ln nthreads' command line option. The suggested number ranges from three to seven.

[top]


CtrlClnt (XMAIL ADMINISTRATION)

You can use CtrlClnt to send administration commands to XMail. These commands are defined in the previous section (XMAIL ADMIN PROTOCOL). The syntax of CtrlClnt is:

 CtrlClnt  [-snuptfSLcKCXHD]  ...

where:

-s server

set server address.

-n port

set server port [6017].

-u user

set username.

-p pass

set password.

-t timeout

set timeout [60].

-f filename

set dump filename [stdout].

-S

enable SSL link negotiation (talks to a CTRL port)

-L

use native SSL link (talks to a CTRLS port)

-K filename

set the SSL private key file (the environment variable "CTRL_KEY_FILE" also sets it)

-C filename

set the SSL certificate file (the environment variable "CTRL_CERT_FILE" also sets it)

-X filename

set the SSL certificate-list file (the environment variable "CTRL_CA_FILE" also sets it). See [SSL CONFIGURATION] for more information

-H dir

set the SSL certificate-store directory (the environment variable "CTRL_CA_PATH" also sets it). See [SSL CONFIGURATION] for more information

-D

enable debug output

With the command and parameters that follow adhering to the command syntax, i.e.:

 CtrlClnt  -s mail.foo.org -u davide.libenzi -p ciao=>
   useradd home.bogus foouser foopasswd U

executes the command useradd with parameters 'home.bogus foouser foopasswd U'.

CtrlClnt returns 0 if the command is successful and != 0 if not. If the command is a query, then the result is printed to stdout.

[top]


SERVER SHUTDOWN

[Linux]

Under Linux, XMail creates a file named XMail.pid in '/var/run' that contains the PID of the main XMail thread. By issuing a:

 kill -INT `cat /var/run/XMail.pid`

a system administrator can initiate the shutdown process (this can take several seconds). You can use the supplied 'xmail' startup script to start / stop / restart XMail:

 xmail start / stop / restart
[NT as console service]

Under NT console service (XMail --debug ...) you can hit Ctrl-C to initiate the shutdown process.

[NT as service]

Using [Control Panel]->[Services] you can start and stop XMail as you wish.

[All]

XMail detects a shutdown condition by checking the presence of a file named '.shutdown' in its main directory (MAIL_ROOT). You can initiate XMail shutdown process by creating (or copying) a file with that name into MAIL_ROOT.

[top]


MkUsers

This command line utility enables you to create the user accounts structure by giving it a formatted list of users parameters (or a formatted text file). The syntax of the list (or file) is:

 domain;username;password;real-name;homepage[NEWLINE]

where a line whose first character is '#' is treated as a comment. This utility can also be used to create a random number users (useful for me to test server performance).

These are MkUsers command line parameters:

-a numusers

number of users to create in auto-mode.

-d domain

domain name in auto-mode.

-f inputFile

input file name {stdin}.

-u username

radix user name in auto-mode.

-r rootdir

mail root path {./}.

-s mboxsize

mailbox maximum size {10000}.

-i useridbase

base user id {1};

-m

create Maildir boxes.

-h

show this message.

MkUsers creates, under the specified root directory, the given structure:

 rootdir            <dir>
   mailusers.tab    <file>
   domains          <dir>
     domainXXX      <dir>
       userXXX      <dir>
         user.tab   <file>
         mailbox    <dir>
       ...
    ...

for the mailbox structure, while:

 rootdir            <dir>
   mailusers.tab    <file>
   domains          <dir>
     domainXXX      <dir>
       userXXX      <dir>
         user.tab   <file>
         Maildir    <dir>
           tmp      <dir>
           new      <dir>
           cur      <dir>
       ...
     ...

for the Maildir structure.

If the file 'mailusers.tab' already exist in the mail root path, MkUsers exits without overwriting the existing copy. This protect you from accidentally overwriting your file when playing inside the real MAIL_ROOT directory. If you want to setup the root directory (-r ...) as MAIL_ROOT, you must delete by hand the existing file (you must know what you're doing). If you setup the root directory (-r ...) as MAIL_ROOT you MUST have XMail stopped before running MkUsers. Existing files and directories are not overwritten by MkUsers so you can keep your users db in the formatted text file (or generate it by a database dump for example) and run MkUsers to create the structure. Remember that you have to add new domains in the 'domains.tab' file by hand. MkUsers is intended as a bulk-mode utility, not to create single user; for this CtrlClnt (or other GUI/Web configuration utilities) is better suited.

[top]


sendmail

When building XMail, an executable called 'sendmail' is created. This is a replacement of the sendmail program used mostly on Unix systems; it uses the local mail delivery of XMail to send email generated onto the server machine. These sendmail options are supported (other options are simply ignored):

-f{mail from}

Set the sender of the email.

-F{ext mail from}

Set the extended sender of the email.

-t

Extract recipients from the 'To:'/'Cc:'/'Bcc:' header tags.

-i

Read the input until the End Of Stream, instead of stopping at the "\n.\n" sequence.

The syntax is:

 sendmail [-t] [-f...] [-F...] [--input-file fname] [--xinput-file fname]=>
   [--rcpt-file fname] [--] recipient ...

The message content is read from the standard input and must be RFC compliant.

The following parameters are XMail extensions meant to be used with mailing lists managers (using sendmail as a mail list exploder):

--input-file fname

take the message from the specified file instead from stdin (RFC format).

--xinput-file fname

take the message from the specified file instead from stdin (XMail format).

--rcpt-file fname

add recipients listed inside the specified file (list exploder).

To be RFC compliant means that the message MUST have the format:

 [Headers]
 NewLine
 Body

Suppose you have your message in the file 'msg.txt', you're 'xmailuser@smartdomain', and you want to send the message to 'user1@dom1' and 'user2@dom2'. The syntax is:

 sendmail -fxmailuser@smartdomain user1@dom1 user2@dom2 < msg.txt

or

 sendmail -fxmailuser@smartdomain --input-file msg.txt user1@dom1 user2@dom2

[top]


MISCELLANEOUS

  1. To handle multiple POP3 domains, the server makes a reverse lookup of the IP address upon which it receives the connection. Suppose the reverse lookup results in 'xxxx.yyyy.zzzz'. XMail checks if 'xxxx.yyyy.zzzz' is handled, then it checks 'yyyy.zzzz', and then 'zzzz'. The first resolved (in the given order) is the POP3 domain. To avoid the above behavior, it's sufficient that the POP3 client supply the entire email address as POP3 login username:

     foo@foodomain.net   ==> foo@foodomain.net

    and not:

     foo@foodomain.net   ==> foo

    This enables XMail to handle multiple domains in cases where more nic-names are mapped over a single IP address.

    To run finger queries you must specify:

     foo@foodomain.net@foodomain.net

    or as general rule:

     username@pop3domain@hostname

    You can use the optional configuration variable 'POP3Domain' (see SERVER.TAB VARIABLES above) to set the default domain for POP3 clients connections. This means that users of 'POP3Domain' can use only the name part of their email address as POP3 login, while users of other hosted domains must use their entire email as POP3 login.

  2. Important!

    • 'REMEMBER TO REMOVE THE EXAMPLE ACCOUNT FROM CTRLACCOUNTS.TAB FILE!'

    • Use ctrl.ipmap.tab to restrict CTRL server access.

    • Use a long password (mixed upper/lower case with digits) for ctrlaccounts.tab.

  3. The main cause of bugs with XMail is due a bad line termination of configuration files, so check that these files being correctly line terminated for your OS. Linux uses the standard <CR> while M$ uses <CR><LF>.

  4. If you get a bind error in Linux,you must comment pop3, smtp and finger entries in your /etc/inetd.conf.

  5. Remember to compile the file CTRL.IPMAP.TAB to restrict the access to the IPs you use to remote administer XMail server.

  6. If you have an heavily loaded server remember to setup the best number of XMAIL threads by specifying the '-Qn nthreads' option (you must do some tentatives to find the best value for your needs). Also you can limit the number of SMTP, POP3 and CTRL service threads by specifying the options '-SX maxthreads', '-PX maxthreads' and '-CX maxthreads'.

  7. If you have enabled logging, remember to setup the '-Mr hours' option depending on the traffic you get in your server. This avoids XMail having to work with very large log files and can improve server performance.

  8. If you are unable to start XMail (even if you followed this document's instructions), check the MailRoot directory with the one listed above. More than one unzipper does not restore empty directories by default.

Please report XMail errors and errors in this document. If you successfully build and run XMail please let me know at davidel@xmailserver.org, I don't want money ;)

[top]


THANKS

My mother Adelisa, for giving me the light.

My cat Grace, for her patience waiting for food while I'm coding.

All of the free source community, for giving me code and knowledge.

[top]

xmail-1.27/docs/ChangeLog.html0000644000175000017500000024460011341640463015504 0ustar davidedavide XMail Change Log v 1.27


NAME

XMail Change Log as of Version 1.27

[top]


CHANGE LOG

Feb 25, 2010 v 1.27

  • Support for using a chain of SSL certificates, instead of a single one.

  • Fixed SMTP explicit routing address parsing.

  • Fixed a bug that made XMail incorrectly handle extremely long header line lengths.

  • Faster shutdown time on Unix systems.

  • Tweaked DNS resolution to cope with lame name servers.

  • Support for greater than 2GB sizes in POP3 server and PSYNC.

  • Safer temporary file name generation.

  • Made the temporary directory on Unix, configurable via the "XMAIL_TEMP" environment variable.

  • Fixed a bug that was caused by the SSL code triggering the XMail binding locking code after XMail has already cleanup.

  • Fixed a bug in the SMTP external authentication.

  • Fixed Unix syslog logging facility to consider different logging levels.

  • Changed SMTP HELP response code to 214.

Jun 27, 2009 v 1.26

  • Fixed a bug where STARTTLS was resetting the session too much, by canceling certain flags/options read inside the SERVER.TAB.

  • Fixed a bug that happened if a message filter mistakenly remove the message file from under XMail control.

  • Fixed a bug that make XMail to wrongly report virtual memory sizes on 32 bit systems with larger than 4GB VM space.

  • Changed the line termination used to store messages into the mailboxes of Unix versions of XMail. Now messages are stored with the OS native LF termination, instead of the RFC CRLF that was used before. This allows other Unix softwares working together with XMail to not be confused by the extra CR present in the line termination.

  • The "smtprelay" behaviour with respect to 5xx responses from one of the servers in the relay list, has been changed. Now a 5xx response will stop the processing, instead of iterating on the remaining servers of the list.

  • Avoid to crawl all the USER.TAB file during a "userlist" CTRL command.

  • Fixed a bug that allowed non-RFC characters inside domain names.

  • Fixed OSX Leopard build error.

  • Added "timeo" option to flags execution.

  • Added "NoAuth", "EnableVRFY" and "EnableETRN" settings inside IP properties.

Jan 3, 2008 v 1.25

  • Added the ability to select SmtpConfig-IP options by local port too (SmtpConfig-IP,PORT).

  • Added a new -YT command line option to set the timeout used by a POP3 client connection.

  • Fixed a bug in the RFC822 ATEXT token definition.

  • If the recipient domain does not have an MX record, and does not have an A record, now XMail bounces immediately.

  • Fixed OpenSSL connection shutdown to avoid RST packet generation.

  • Changed SMTP AUTH LOGIN authentication to support the optional inline parameter.

  • Added IPV6 support. New command line options are available to select XMail's behaviour with respect to IPV4/IPV6 compatibility.

  • Fixed/strengthened RFC address parsing.

  • Drop the SMTP connection is case of timeout.

  • Fixed a bug caused by the new strict host/doman name check added in 1.24 (in the SMTPGW.TAB parsing).

  • Completely changed the DNS resolution code.

  • Do not try the A-record delivery in case of temporary DNS/network errors.

  • Added remote MTA message ID to SMAIL logging.

  • Added a new "POP3S" option to the POP3LINKS.TAB file, to allow connections to full POP3S remote servers.

  • Fixed a bug in the SMTP Outbind feature.

  • Changed POP3 log format to add information about the success or failure of the operation, and to report the number of messages and the total size of the mailbox (in case of successful login).

  • Added a new "Pop3LogPasswd" SERVER.TAB variable to control if POP3 passwords are logged into the POP3 log file.

  • Added a new "SmtpNoTLSAuths" SERVER.TAB variable. It allows to specify which SMTP authentications are allowed in non-TLS mode.

  • Fixed a small memory leak affecting users using the "OutBind" feature.

  • Removed the "SMTP-TLS" SERVER.TAB variable and replaced with "SmtpGwConfig" that supports the format described in "SMTP GATEWAY CONFIGURATION". The "SmtpGwConfig" allows the user to specify global options for remote SMTP connections.

  • Added $(RRCPT) macro to SMTP filters.

Jan 1, 2007 v 1.24

  •  ********************************************************************
     * Removed the DynDNS feature.
     ********************************************************************
  • Added the new "OutBind" options for PSYNC accounts. It allows to specify the IP of the interface to be used when talking to the remote server.

  • Added a new "OutBind" option to the "SmtpConfig" SERVER.TAB variables. It allows to specify the IP of the interface to be used when talking to the remote server.

  • Added a new SMTP.HNPROP.TAB file to drive remote peers SMTP properties through host name.

  • Added command line options to disable single services.

  •  ********************************************************************
     * The external SMTP authentication (both server and client) changed.
     * Changed is also the format of the SMTPEXTAUTH.TAB file.
     * The external SMTP client authentication has been removed.
     ********************************************************************
  • Added the new "Leave" options for PSYNC accounts, that allows messages to be left on the remote server. This option only works if the remote POP3 server supports the UIDL command.

  • Fixed a bug in the mailbox size check between SMTP and SMAIL layers. This resulted in EFULL errors never returned at SMTP level.

  • Fixed a bug in alias resolution for aliased users inside aliased domains.

  •  ********************************************************************
     * SSL support has been added. See the "SSL CONFIGURATION" section of
     * the documentation to find out how to properly configure XMail.
     * You MUST do this in order to have SSL support working.
     ********************************************************************
  •  ********************************************************************
     * The format of the "DefaultSMTPGateways" SERVER.TAB variable, of the
     * SMTPFWD.TAB relay list, and of the "smtprelay" list changed
     * (separator is now the ';' character and can have options attached,
     * separated by comma).
     * You need to adjust it according to the new format
     ********************************************************************
  • Added new "EnableCTRL-TLS", "EnableSMTP-TLS" and "EnablePOP3-TLS" SERVER.TAB variables.

  • Added SMTP gateway options to the "DefaultSMTPGateways" variable, to the SMTPFWD.TAB file, and to the "smtprelay" command inside the mail processing files.

    Added a new "WantTLS" option to the "SmtpConfig" SERVER.TAB variables.

  • Added a new "EaseTLS" option to the SMTP.IPPROP.TAB file.

  • Added a new 'S' SMTP auth option to bypass a "WantTLS" configuration.

  • Added "SSLUseCertsFile", "SSLUseCertsDir", "SSLWantVerify", "SSLAllowSelfSigned", "SSLWantCert" and "SSLMaxCertsDepth" SERVER.TAB variables to configure XMail's SSL behaviour.

  • Added STARTTLS SMTP support.

  • Added STLS POP3 support (and the new CAPA command).

  • Added SMTPS support.

  • Added POP3S support.

  • Added CTRLS support.

  • Added FAPOP, STLS and FSTLS authentication options to the POP3LINKS.TAB file..

  • Added a new "SMTP-TLS" SERVER.TAB variable to tell XMail if it has to try to negotiate TLS sessions with remote SMTP servers.

  • Added SSL support to the CTRL protocol and to the CtrlClnt client.

Nov 19, 2006 v 1.23

  • Changed the filter log to include the full exec string (separated by semicolon).

  • Fix CTRL "poplnkadd" and "poplnkdel" to accept local domains strings starting with special characters.

  • Added (finally!) a command line makefile (Makefile.win) to build the whole XMail package without the usage of the MS VC++ IDE.

  • Reject a CTRL "domainadd" command if an alias domain already exists with the same name.

  • Changed the CTRL "usergetmproc" command to allow the caller to specify if it is the user or the domain one that is wanted. Or a merges of both, if "DU" is specified in the optional 3th parameter.

  • Changed the CTRL "usersetmproc" command to allow the caller to specify if it is the user ('U') or the domain ('D') one that is wanted to be set.

  • Added complex/multiple macro substitution capabilities to external programs argoument lists.

  • Added strictier SMTP address validation.

  • Check the mailbox size for every message coming into the mailbox (before it was only done during the SMTP phase).

  • Do not try to send to the 'A' record if the recipient domain does not exist at all (NXDOMAIN). Bounce immediately instead, avoiding lengthy retry policies.

  • Added the "wlex" flag to filter lines (works for the SMTP ones only), to exclude execution of the filter line in case the client IP is white-listed inside the ipprop file.

  • Added the post-RCPT SMTP filter, that is called before XMail acks the client recipient. A new "RCPT=EFILTER" long entry is emitted in case a recipient is rejected by a filter.

  • Added @@CRCPT (current recipient) and @@FROM (sender email address) macros to SMTP filter substitution.

  • Allow cmdaliases to work on aliased domains. Before a cmdalias defined on an alias-target domain was not working before the cmdalias check was done before the alias domain resolution.

  • Added the ability to bypass the SMTP.IPMAP.TAB inclusion using SMTP authentication.

  • Added a new SERVER.TAB variable "SMTP-IpMapDropCode" to control the drop code to be used for IPs listed inside the SMTP.IPMAP.TAB. Like other codes inside XMail, 1 means drop now, 0 means allow if auth, and -N means add N seconds delay. An immediate drop will emit a "SNDRIP=EIPBAN" log entry.

  • Added a new SERVER.TAB variable "SmtpMsgIPBan" to control the SMTP message returned in case of SMTP.IPMAP.TAB inclusion.

  • Added log message when the maximum number of SMTP/POP3/CTRL threads is hit.

  • Fixed documentation about the spool info line and the SMTP filters info line.

  • Fixed a build problem on OpenBSD related to the lack of c_r (reentrant C library) library.

  • Fixed greetings message to be RFC2821 compliant (server host must be first).

  • Fixed a NAME_MAX build error ond *BSD and Solaris.

  • Added a "Pop3ScanCur" USER.TAB variable to control the scan of the Maildir's "cur" directory during POP3 message list build. Now XMail only scans the "new" directory as default.

Oct 12, 2005 v 1.22

  • The POP3 before SMTP authentication is now correctly interpreted as real SMTP authentication, by the mean of @@USERAUTH.

  • 'ATTENTION': Fixed a possible cause of buffer overflow in the XMail's sendmail binary.

  • Changed the DNS MX resolution to allow better handling of partially broken DNS servers configuations.

Jan 9, 2005 v 1.21

  • Added a fix for 64 bits porting compatibility.

  • Added the ability to exclude filters from execution in case of authenticated user. By pre-pending the filter command token with a token containing "!aex", the filters won't be run if the user authenticated himself.

  • Added @@USERAUTH macro even to standard in/out filters (before it was only defined for SMTP ones).

  • Added a new "NoSenderBounce" variable inside the SERVER.TAB file, to enable XMail generated bounce messages to have the empty SMTP sender ('MAIL FROM:<>').

  • Added a new "SMTP-MaxErrors" variable inside the SERVER.TAB file to set the maximum errors allowed in a single SMTP session (default zero, unlimited).

  • Added a "LastLoginTimeDate" variable to the "userstat" CTRL command.

  • Added external aliases support in the CTRL protocol.

  • The MESSAGE.ID file is now automatically created, if missing.

  • Changed the logic used to treat domain and user MAILPROC.TAB files. Before, a user's MAILPROC.TAB was overriding the domain one, while now the rules are merged together, with domain's ones first, followed by user's ones.

  • The maximum mailbox size of zero is now interpreted as unlimited.

  • Fixed XMail's sendmail to detect non-RFC822 data and handle it correctly.

  • The IP:PORT addresses emission in spool files (and Received: lines) has been changed to the form [IP]:PORT.

  • Added filter logging, that is enabled with the new -Qg command line option.

  • Fixed an error message in the SMTP server, that was triggered by the remote client not using the proper syntax for the "MAIL FROM:" and "RCPT TO:" commands.

  • Fixed explicit routing through SMTPGW.TAB file.

  • Fixed a possible problem with file locking that might be triggered from CTRL commands cfgfileget/cfgfileset.

  • Added a check to avoid the CTRL server to give an error when a domain created with older versions of XMail does not have the domain directory inside cmdaliases.

  • The SMTP server FQDN variable should be set to the value of "SmtpServerDomain", when this is used inside the SERVER.TAB file.

May 30, 2004 v 1.20

  • Fixed a possible memory leak and a possible source of crashes.

May 29, 2004 v 1.19

  • Implemented the "filter" command for custom mail processing (MAILPROC.TAB, cmdaliases and custom domains).

  • If "RemoveSpoolErrors" is set inside the SERVER.TAB file, messages are never frozen. Before there was a special case (delivery failure and delivery notification failure) that could have lead to frozen messages.

  • Made "aliasdomainadd" to check for the existence of the alias domain (and reject the command if existing).

  • Introduced a new environment variable recognized by XMail (XMAIL_PID_DIR), to let the user to specify a custom PID file directory (this is for Unix ports only).

  • Implemented ability to stop custom mail processing upon certain exit codes from external commands execution.

  • The SPAMMERS.TAB check is now bypassable (see doc for details).

  • 'ATTENTION': Changed the "aliasdomainlist" syntax and output format (see doc for details).

  • Made (on Unix setups) the PID file name to be dependent on the daemon file name.

  • Implemeted a domain-wise MAILPROC.TAB and extended its "redirect" and "lredirect" commands to support account specific (USER@DOMAIN) and domain targets (DOMAIN).

  • Implemented SMTP filters to allow users to reject the SMTP session before and after the remote client data has been received.

Mar 27, 2004 v 1.18

  • Restructured the external program execution environment on Unix ports. Simplified, as a consequence of this, the system dependent portion of XMail (SysDep*).

  • Fixed a bug in the address range parsing (x.y.w.z/s).

  • Fixed the alias lookup to perform a better "best match" wildcard selection.

  • Fixed a bug in the DNS resolved that made XMail to not correctly handle domain CNAMEs.

Sep 14, 2003 v 1.17

  • Added Bcc: removal from message headers in XMail's sendmail.

  • Added PSYNC logging (-Yl).

  • Added domain completion to XMail's sendmail when the specified sender address (-f or -F) does not contain one. The environment variable (or registry in Windows) DEFAULT_DOMAIN is looked up to try to complete the address.

  • Fixed a bug in the return code of SysAccept() in all Unix versions.

  • Fixed a bug that was triggered by external command and filter exiting soon. XMail was not able to correctly sync with the child process by losing it. This apply only to Unix versions of XMail.

  • A notification message is now sent to the sender if the message is handled with "smtp" or "smtprelay" commands and a permanent error happen when sending to the remote SMTP server.

Jul 8, 2003 v 1.16

  • Added a new configuration file "smtp.ipprop.tab" to be able to specify peer IP based configuration option, like for example IP white listing against IP checks.

  • 'ATTENTION': The filter return code has been changed and new return codes are expected to be returned by filters. Please che the documentation and update your filters before starting to use the new version.

  • Added the ability to specify a custom error message for filters.

  • Fixed a bug in the string quoting function that showed up when the string was empty ("").

  • Changed the order used by XMail to check the mailer domain. Now MX check is performed first, then A record check. This caused a slow down for domains having MX records but not A records.

  • Added two new Received: types to give the ability to hide client information if the SMTP client does authenticate with the server.

  • Added the rejection map name inside the SMTP log file in case of SNDRIP=EIPMAP error.

  • Modified XMail's sendmail to add the RFC822 Date: header if missing.

  • XMail now uses the name of the executable ( without .exe ) to both register the service name and fetch registry variables.

  • The POP3 server now picks up messages even from the Maildir's "cur" subdirectory.

May 3, 2003 v 1.15

  • Implemented a new filters feature that enable the user to stop the selected filters list processing upon receival of certain exit codes.

  • Fixed the wrong log file name generation when the daylight time is active.

  • Fixed a bug inside the DNS MX resolver.

  • Fixed a bug ( Windows OS bug ) that made XMail unable to create domains starting with reserved device names ( COM#, LPT, PRN, CON, ... ). So, for example, a domain named "com4.domain.org" couldn't be created because of this naming conflict.

  • Fixed a bug that made XMail to not apply filters for local mailing list.

  • Fixed a bug that made XMail to crash under certain conditions.

April 2, 2003 v 1.14

  • Added a "Server:" field to the notification message. It'll report the remote SMTP server host name and IP that issued the error. It will not be present if the error does not originate from a remote SMTP server.

  • Added a new command line parameter -MD to set the number of subdirectories allocated for the DNS cache files storage.

  • Messages with non RFC822 conforming headers are now handled by the PSYNC code.

  • 'ATTENTION': The filter architecture has been completely changed. To correctly update to this version you have to create two empty files "filters.in.tab" and "filters.out.tab" inside the $MAIL_ROOT directory. Please refer to the documentation for more information about the new filter architecture. If you are not currently using filters, the simple creation of the two files listed above will be sufficent.

  • 'ATTENTION': The internal spool file format is changed with the new line added ( the 1st one ) that contain various message information. Filters that rely on the internal spool file format must be changed to match the new structure.

  • Fixed a bug that made XMail to not correctly report zero sized files inside the mailbox.

  • Added file size to CTRL's "filelist" command.

  • Fixed a connect-error reporting bug on Windows platform.

January 25, 2003 v 1.12

  • Better check for user/domain names.

  • Changed search pattern for filters. Now a domain name is scanned for all sub-domains.

  • Fixed a boundary check inside the Base64 decoder.

  • Added the client FQDN inside the SMTP log file in case the RDNS check is enabled.

  • Added a new SERVER.TAB variable "SmtpMsgIPBanSpammers" to set the message that is sent to the SMTP client when the client IP is listed inside the file SPAMMER.TAB.

    Added a new SERVER.TAB variable "SmtpMsgIPBanMaps" to set the message that is sent to the SMTP client when the client IP is listed inside one of the "CustMapsList".

  • Added a new SERVER.TAB variable "SmtpMsgIPBanSpamAddress" to set the message that is sent to the SMTP client when the client IP is listed inside the file SPAM-ADDRESS.TAB.

  • Fixed a bug inside the custom account handling that made XMail to pass the old password instead of the new one.

  • Added OpenBSD support.

November 9, 2002 v 1.11

  • Added a new command line parameter -QT to enable a configurable timeout for filter commands.

  • Fixed a bug that made XMail to ignore cmdalias accounts when a wildcard alias was matching the account itself.

  • Added the 'smtprelay' command to the MAILPROC.TAB processing.

  • Removed the 'wait' command from all custom processing.

  • Added a new macro @@RRCPT to filters commands to extract the real local recipient.

  • Changed the way the EXTALIASES.TAB mapping modify the return path. It now change the "Reply-To:" instead of the "From:" to avoid problems with signature verification software.

  • Implemented logging on SMTP transactions rejected because of mapped IP or failing RDNS check.

  • Added a new SERVER.TAB variable "SmtpServerDomain" to force the SMTP domain used by XMail in its banner string ( for CRAM-MD5 ESMTP authentication ).

  • Improved DNS resolution for not existing domains.

[top]

July 27, 2002 v 1.10

  • Added a variable 'CustomSMTPMessage' inside the server's configuration file SERVER.TAB to enable the postmaster to set a custom message that is appended to the standard XMail error response.

  • Added log entries in case of relay lists mapped IPs.

  • Fixed a build error on FreeBSD.

  • Added a new SERVER.TAB variable 'DisableEmitAuthUser' to block the emission the the header 'X-Auth-User:' for authenticated user.

  • Added a new USER.TAB variable 'DisableEmitAuthUser' to block the emission the the header 'X-Auth-User:' for authenticated users (this variable overrides the SERVER.TAB one).

  • Added command line driven mailbox delivery mode (-MM = Maildir , -Mm = mailbox).

  • Added sysv_inst.sh shell script to help creating SysV boot scripts for XMail.

[top]

June 15, 2002 v 1.9

  • Fixed a bug in HOSTNAME:PORT handing code inside the PSYNC server.

  • Fixed a bug introduced in 1.8 in the Windows version that made XMail to have bad behaviour when used with external programs.

  • Fixed a bug that resulted in XMail generating frozen messages even if the SERVER.TAB variable was set to not create them.

  • Fixed a bug that made it possible to send a 'MAIL FROM:<@localdomain:remoteaddress>' and to have the message relayed if the IP of the current machine was inside the smtprelay.tab of the machine handling the MX of @localdomain.

  • Implemented internal mail loop checking (internal redirects).

  • Added a new MLUSERS.TAB permissions flags 'A', that is similar to 'W' by instead of checking the 'MAIL FROM:<...>' address check the SMTP authentication address (this will prevent malicious users to forge the address to gain write permissions on the list).

[top]

May 19, 2002 v 1.8

  • Changed XMail's behaviour upon receival on long (RFC compared) data lines on SMTP and POP3 fetch inbound doors. Before the operation was aborted while now data is accepted without truncation, that might make XMail to behave non conforming the RFC.

  • Added @@RRCPT macro to the 'external' MAILPROC.TAB command to emit the real recipient of the message (@@RCPT could be an alias).

  • Added HOSTNAME:PORT capability to POP3LINKS.TAB entries.

  • Added Linux/PowerPC port.

  • Added 'filelist' CTRL protocol command.

  • Added SMTP HELP command.

  • Changed bounce message format to add the last SMTP error and to make it works with Ecartis mail bounce processing.

  • Changed the XMail's sendmail implementation to accept '-f FROM' and '-F FROM' non standard sendmail paramenter specification.

  • Fixed a bug inside the PSYNC server code that made XMail to fail to resolve POP3 server addresses.

  • Various code cleanups.

[top]

March 03, 2002 v 1.7

  • Fixed a bug inside the POP3 server that caused bad responses to UIDL and LIST commands in case of certain command patterns.

  • Added support for HOSTNAME:PORT (or IP:PORT) for the DefaultSMTPGateways SERVER.TAB variable.

  • Added domain aliases cleanup upon main domain removal.

  • Added 'MaxMessageSize' inside USER.TAB files to override the global (SERVER.TAB) one.

[top]

March 03, 2002 v 1.6

  • Added a new USER.TAB variable 'UseReplyTo' (default 1) to make it possible to disable the emission of the Reply-To: header for mailing lists.

  • Fixed a bug that caused XMail to uncorrectly deliver POP3 fetched messages when used togheter with domain masquerading.

  • Changed index file structure to use an hash table for faster lookups and index rebuilding.

  • New files inside the tabindex directory now have the extension .hdx and old .idx files can be removed.

  • Added X-Deliver-To: header to messages redirected with MAILPROC.TAB file.

  • Added configurable Received: tag option in SERVER.TAB by using the variable 'ReceivedHdrType'.

  • Added a configurable list of header tags to be used to extract addresses for POP3 fetched messages by using the SERVER.TAB variable 'FetchHdrTags'.

  • History (change log) entries have been moved from the main documentation file and a new file (ChangeLog.txt) has been created to store change-log entries.

  • Removed RBL-MAPSCheck (currently blackholes.mail-abuse.org.), RSS-MAPSCheck (currently relays.mail-abuse.org.) and DUL-MAPSCheck (currently dialups.mail-abuse.org.) specific variables and now everything must be handled with CustMapsList (please look at the documentation).

  • Added NotifyMsgLinesExtra SERVER.TAB variable to specify the number of lines of the bounced message to include inside the notify reply (default zero, that means only header).

  • The message log file is now listed inside the notification message sent to ErrorsAdmin (or PostMaster ).

  • Added NotifySendLogToSender SERVER.TAB variable to enable/disable the send of the message log file inside the notify message to the sender (default is off).

  • Added TempErrorsAdmin SERVER.TAB variable to specify an account that will receive temporary delivery failures notifications (default is empty).

  • Added a new SERVER.TAB variable NotifyTryPattern to specify at which delivery attempt failure the system has to send the notification message.

  • Fixed a bug that caused alias domains to have higher priority lookup compared to standard domains.

[top]

February 05, 2002 v 1.5

  • Fixed a bug in wildcard aliases domain lookup.

  • Fixed a bug in CTRL command 'aliasdel' that failed to remove aliases with wildcard domains.

  • Fixed a bug that caused XMail to timeout on very slow network connections.

[top]

January 18, 2002 v 1.4

  • Fixed a bug that made XMail fail to parse custom maps lists in SERVER.TAB.

  • Fixed a bug that prevented XMail to add wildcard-domain aliases.

  • Added a filter feature to the CTRL commands 'domainlist' and 'aliasdomainlist'.

  • Added an extra message header field 'X-AuthUser:' to log the username used by the account to send the message.

  • Added Reply-To: RFC822 header for mailing lists sends.

  • Fixed a Win32 subsystem API to let XMail to correctly handle network shared MAIL_ROOTs.

[top]

December 19, 2001 v 1.3

  • ORBS maps test removed due old ORBS dead, the SERVER.TAB variable 'CustMapsList' can be used to setup new ORBS (and other) maps.

  • Fixed a bug in XMail's sendmail that was introduced in version 1.2 and made it to incorrectly interpret command line parameters.

  • Fixed a bug that made XMail not correctly recognize user type characters when lowercase.

  • Fixed a bug that caused XMail to not start is the MAIL_ROOT environment variable had a final slash on Windows.

  • Added a new filter return code (97) to reject messages without notification and without frozen processing.

  • Added two new command line options -MR and -MS to set the I/O socket buffers sizes in bytes (do not use them if You don't know what You're doing).

  • Changed system library to have a better performace, expecially on the Windows platform.

  • Users that are using XMail mainly inside their local LAN are strongly encouraged to switch to this version.

  • Fixed a bug that enabled insertion of aliases that overlapped real accounts.

[top]

November 12, 2001 v 1.2

  • A problem with log file names generation has been fixed.

  • Added a new CTRL command 'userstat'.

  • Implemented Linux/SPARC port and relative makefile (Makefile.slx).

  • Extended the XMail version of sendmail to support a filename as input (both XMail format that raw email format) and to accept a filename as recipient list.

  • Added a new kind of aliases named 'cmdaliases' that implements a sort of custom domains commands on a per-user basis (look at the CmdAliases section).

  •  ********************************************************************
     * You must create the directory 'cmdaliases' inside $MAIL_ROOT
     * to have 1.2 work correctly
     ********************************************************************
  • Fixed a bug that had XMail not check for the user variable SmtpPerms with CRAM-MD5 authetication.

  • Fixed a bug in the XMail's sendmail implementation that made it unable to detect the '.' end of message condition.

  • Fixed a bug in the XMail's sendmail implementation that made it to skip cascaded command line parameters (-Ooet).

  • Implemented a new XMail's sendmail switch -i to relax the <CR><LF>.<CR><LF> ond of message indicator.

[top]

October 09, 2001 v 1.1

  • Fixed a bug in the XMail version of sendmail that made messages to be double sent.

  • The macro @@TMPFILE has been removed from filters coz it's useless.

  • The command line parameter -Lt NSEC has been added to set the sleep timeout of LMAIL threads.

  • Added domain aliasing (see ALIASDOMAIN.TAB section).

  •  ********************************************************************    
     * You must create the file ALIASDOMAIN.TAB inside $MAIL_ROOT
     * (even if empty)
     ********************************************************************
  • Added CTRL commands 'aliasdomainadd', 'aliasdomaindel' and 'aliasdomainlist' to handle domain aliases through the CTRL protocol.

[top]

September 04, 2001 v 1.0

  • Added wildcard matching in the domain part of ALIASES.TAB (see ALIASES.TAB section).

  • Changed the PSYNC scheduling behaviour to allow sync interval equal to zero (disabled) and let the file .psync-trigger to schedule syncs.

  • Solaris on Intel support added.

  • A new filter return code (98) has been added to give the ability to reject message without notify the sender.

[top]

June 10, 2001 v 0.74

  • A stack shifting call method has been implemented to make virtually impossible for attackers to guess the stack frame pointer.

  • With this new feature, even if buffer overflows are present, the worst thing that could happen is a server crash and not the attacker that execute root code on the server machine.

  • Implemented the SIZE ESMTP extension and introduced a new SERVER.TAB variable 'MaxMessageSize' that set the maximum message size that the server will accept (in Kb).

  • If this variable is not set or if it's zero, any message will be accepted.

  • A new SMTP authentication permission ('Z') has been added to allow authenticated users to bypass the check.

  • The SMTP sender now check for the remote support of the SIZE ESMTP extension.

  • A new SERVER.TAB variable has been added 'CustMapsList' to enable the user to enter custom maps checking (look at the section 'SERVER.TAB variables').

  • Fixed a bug in 'frozdel' CTRL command.

[top]

June 08, 2001 v 0.73

  • Fixed a possible buffer overflow bug inside the DNS resolver.

[top]

May 23, 2001 v 0.72

  • Fixed build errors in MkUsers.cpp and SendMail.cpp (FreeBSD version).

  • Added the ability to specify a list of matching domains when using PSYNC with masquerading domains (see POP3LINKS.TAB section).

  • The auxiliary program sendmail now reads the MAIL_ROOT environment from registry (Win32 version) and if it fails it reads from the environment.

  • Fixed a bug that made XMail to crash if the first line of ALIASES.TAB was empty.

  • RPM packaging added.

  • Added a new feature to the custom domain commands 'redirect' and 'lredirect' that will accept email addresses as redirection target.

  • Fixed a bug in MkUsers.

  • Added system resource checking before accepting SMTP connections (see 'SmtpMinDiskSpace' and 'SmtpMinVirtMemSpace' SERVER.TAB variables).

  • Added system resource checking before accepting POP3 connections (see 'Pop3MinVirtMemSpace' SERVER.TAB variable).

  • A new command line param -t has been implemented in sendmail.

  • A new USER.TAB variable 'SmtpPerms' has been added to enable account based SMTP permissions.

  • If 'SmtpPerms' is not found the SERVER.TAB variable 'DefaultSmtpPerms' is checked.

  • A new USER.TAB variable 'ReceiveEnable' has been added to enable/disable the account from receiving emails.

  • A new USER.TAB variable 'PopEnable' has been added to enable/disable the account from fetching emails.

[top]

April 29, 2001 v 0.71

  • Removed the SERVER.TAB variable 'HeloUseRootDomain' and introduced a new one 'HeloDomain' to specify the name to send as HELO domain (look at variable documentation).

  • If 'HeloDomain' is not specified or if empty then the reverse lookup of the local IP is sent as HELO domain.

  • Added a new SERVER.TAB variable 'DUL-MAPSCheck' to implement the 'dialups.mail-abuse.org' maps check.

  • Changed the meaning of the SERVER.TAB variables SMTP-RDNSCheck, RBL-MAPSCheck, RSS-MAPSCheck, ORBS-MAPSCheck and DUL-MAPSCheck to give XMail the ability to delay SMTP commands for clients that fail the check.

  • The old behaviour (dropped connection) is obtained by setting values greater than zero, while You can set the delay (in seconds) by specifying negative values.

  • For SMTP-RDNSCheck and DUL-MAPSCheck variables the connection is no more dropped at welcome time but a 'server use forbidden' message is given at MAIL_FROM time.

  • In this way XMail give authenticated users the ability to get in from 'mapped' IPs.

  • Fixed a bug that cause XMail to crash if there is an empty line in a MLUSERS.TAB file.

  • Added a new SERVER.TAB variable 'ErrorsAdmin' that will receive the notification message for every message that has had delivery errors.

  • The feature to force XMail to initiate a PSYNC transfer has been added. This is implemented by making XMail to check for a file named '.psync-trigger' inside MAIL_ROOT. When this file is found a PSYNC tranfer is started and the file is deleted.

  • Added a new SERVER.TAB variable 'MaxMTAOps' to set the maximum number of relay steps before to declare the message as looped.

  • Added SMTP after POP3 authentication and one new command line switch (-Se) to set the expire time of the POP3 IP.

  • A new SERVER.TAB variable has been added to enable/disable SMTP after POP3 authentication (EnableAuthSMTP-POP3).

  • Added the replacement for sendmail that will use the local mail delivery of XMail (look at the sendmail section).

  • The ESMTP command ETRN has been added has long as a new SMTP perm flag 'T' to give access to this feature and a new SERVER.TAB variable 'AllowSmtpETRN' to set the default feature access.

  • Added a new CTRL command 'etrn' to support the same SMTP feature through the CTRL protocol.

  • Fixed a bug in filters selection that made XMail to case-sensitive compare user and domain filters.

  • Changed the name of the default filter to '.tab' instead of 'defaultfilter.tab'.

  • Finally, FreeBSD port added !!

[top]

April 08, 2001 v 0.70

  • Added the message ID to the received tag and extended the SMTP log file with the username of the authenticated user (if any).

  • Fixed a bug in external authentication (POP3).

  • The USERDEF.TAB file is now checked inside $MAIL_ROOT/domains/DOMAIN before and then in $MAIL_ROOT.

  • This permit per domain user default configuration.

  • Added a new CTRL server command 'frozsubmit' to reschedule a frozen message.

  • Added a new CTRL server command 'frozdel' to delete a frozen message.

  • Added a new CTRL server command 'frozgetlog' to retrieve the frozen file log file.

  • Added a new CTRL server command 'frozgetmsg' to retrieve the frozen message file.

[top]

February 22, 2001 v 0.69

  • Fixed a bug that made XMail to grant Read permissions to mailing lists users.

  • Fixed a bug that made XMail to delete SMTP rights granted during authentication when sending multiple messages.

  • Fixed a bug in SMTP CRAM-MD5 authentication.

  • Fixed a bug that caused XMail to break the header when an headers tag is made by 'tag-name:[CR][LF]tag-string'.

  • Added the delete functionality to the CTRL command 'uservarsset' by giving the string value '.|rm' the delete capability.

[top]

February 05, 2001 v 0.68

  • Fixed a buffer overflow vulnerability in CTRL server and added command string validation to all servers.

  • Added 8BITMIME and PIPELINING support (it was already compliant).

  • Added a new SERVER.TAB option 'HeloUseRootDomain' to make XMail to use the 'RootDomain' like HELO domain.

  • Added FINGER service access control based on the peer IP address. A new file FINGER.IPMAP.TAB has been added to MAIL_ROOT with the same meaning of the ones used with SMTP, POP3 and CTRL services.

  • Fixed a bug that caused XMail to drop the first character of the headers if there was no space between the colon and the header value.

  • Added extended SMTP log information by adding an extra (last) field to the log file.

  • Added a new SERVER.TAB variable 'AllowSmtpVRFY' (default off) to enable the SMTP VRFY command.

  • Added a new SMTP auth flag 'V' to enable VRFY command (bypassing SERVER.TAB settings).

  • Improved the POP3 sync method to fetch and distribute mail that uses an external POP3 mailbox to collect more accounts togheter. Before the method failed if the user was not in the first 'To:' address, while now all addresses contained in 'To:', 'Cc:' and 'Bcc:' are checked. There is also a new SERVER.TAB variable 'Pop3SyncErrorAccount' whose use is catch all emails that has been fetched but has had delivery errors.

[top]

January 04, 2001 v 0.67

  • Fixed a bug in 'poplnkenable' CTRL server command.

  • Changed the report of 'poplnklist' CTRL server command to include the authentication mode and the enabled status.

  • Fixed a bug in 'poplnkdel' that left around the .disable file.

  • A new directory 'pop3links' has to be added to store POP3 links disable files for non-local links.

  • This will fix also a bug in multi-account and masquerading POP3 sync.

  • A new way to retrieve the POP3 domain has been coded by doing a reverse DNS lookup from the server IP. If the result of the lookup will be xxxx.yyyy.zzzz then XMail will test if xxxx.yyyy.zzzz is handled, then yyyy.zzzz and then zzzz.

  • The first of these domains that is handled by XMail will be the POP3 domain.

  • Added a new SERVER.TAB variable 'CheckMailerDomain' that, if on ('1'), force XMail to validate the sender domain ('MAIL FROM:<...@xxx>') by looking up DNS/MX entries.

  • Fixed the bug that made XMail to not accept users to add if a wildcard alias were defined.

[top]

December 08, 2000 v 0.66

  • The SMTP command RSET no more clean the authentication status of the client.

  • Improved MX records resolution and fixed a bug in MD5 algo.

  • A new USER.TAB variable (for Mailing Lists) 'ListSender' has been added to hide real senders from SMTP protocol.

  • If this variable does not exist the 'MAIL FROM:<>' command will contain the 'real' sender address.

  • This variable should be set to the email address of the mailing list admin that will receive all the notification and error messages, preventing this error to reach real senders.

  • Fixed an RFC conformance bug in SMTP protocol that made XMail to accept the MAIL_FROM command even if the HELO (or EHLO) command was not issued.

  • Fixed a bug in SysExec() in Linux and Solaris versions that made all external programs to have a bad behaviour or fail. This bug was introduced in 0.65 version.

  • Fixed a bug in the Windows version that results in a failure to resolve MX queries.

  • This bug was introduced in 0.65.

[top]

November 25, 2000 v 0.65

  • Complete Linux library rewrite, now using PThread library instead of forking.

  • Solaris/SPARC port added (HPUX/PARISC incoming).

  • Removed the -Ma flags for the maximum number of accounts coz it's no more needed due the new Linux system library (now the memory shares is given for free instead of having to rely on IPC).

  • Removed the -Mk parameter due the IPC stuff removal.

  • Extra domain aliases has been added (see ALIASES.TAB section).

  • A new feature has been added to XMail to enable XMail users to prepare mail files in a given format, put them in /spool/local directory and get them delivered by the server (see 'XMail local mailer' section).

  • Two new directories 'local' and 'temp' must be created inside the 'spool' directory.

  • The meaning of the command line param '-Mr ...' has changed from days to hours.

[top]

November 02, 2000 v 0.64

  • Added permissions to mailing list users (see MLUSERS.TAB section). This enable You to have read only users as long as read/write users.

  • This is implemented by adding a new extra field to MLUSERS.TAB to store permissions ('R' or 'RW').

  • The lack of this extra field (old MLUSERS.TAB files) will be interpreted as 'RW'.

  • The command 'mluseradd' has been extended to hold the new permission parameter (see section 'XMail admin protocol').

  • Added a new CTRL command 'frozlist' to list files that are in frozen status (see section 'XMail admin protocol').

  • Fixed a bug in the new masquerading feature of XMail (POP3LINKS.TAB).

  • Fixed a bug that makes XMail crashes when a mail loop condition is detected.

  • Removed the strict RFC compliant check on messages.

[top]

October 27, 2000 v 0.63

  • Added a feature that makes usable the new POP3LINKS.TAB fetching option by masquerading incoming recipient. This can be done by replacing the domain part or by adding a constant string to the To: address (see POP3LINKS.TAB section).

[top]

September 12, 2000 v 0.62

  • Added a new custom domain processing command 'smtprelay' that can be used to route messages to other smtp servers (see section 'Custom domain mail processing').

  • New search method for custdomains/ files : now the test to find out if the domain sub1.sub2.domain.net will get a custom domain processing is done by looking up sub1.sub2.domain.net.tab , .sub2.domain.net.tab , .domain.net.tab , .net.tab and then .tab.

  • There is a new POP3 sync method now that enables users that receives mail for multiple recipients into a single external POP3 account to get all mail to be distributed locally.

  • You've to be sure, to not create mail loops, that all recipients domains are locally handled in a way or another (see section POP3LINKS.TAB).

  • Added the random order option to SMTPFWD.TAB gateways to randomly select the order of the try list (see section SMTPFWD.TAB).

  • Added the random order option to 'smtprelay' custom domain processing (see section 'Custom domain mail processing').

  • The use of realloc() function has been removed to make place for free()/malloc() due a glibc bug with such function.

[top]

September 12, 2000 v 0.61

  • Added a new CTRL command 'userauth' that helps to check users authentication.

  • This command can be used by external modules that need to check XMail username/password authentication (ex: external IMAP auth modules).

  • A new file SMTPFWD.TAB has been introduced to supply customizable mail exchangers for external domains (see section SMTPFWD.TAB).

  • Not local POP3 sync has been introduced to make it possible to download external POP3 accounts without having to setup local accounts (see section POP3LINKS.TAB).

  • This feature can be used, for example, to catch mails from a set of remote accounts and redirect these to another SMTP server.

  • Now it's possible to set per IP server port in command line params by specifying bindip[:port] PSYNC flags -Qx has been removed due the new queue system.

  • A new global command line parameter -Mx has been introduced to setup the queue split level even if my suggestion is to leave the default value (23 , that means that the queue is splitted in 23 * 23 = 529 subdirectories).

  •  ********************************************************************    
     * A new spool format has been coded to enable XMail to handle very
     * large sending queues.
     * See section 'XMail spool design' for a description of how the spool
     * works.
     * Due to the new spool format the following directories can be
     * removed:
     *
     * custdomains/spool
     * spool/tmp
     * spool/errors
     * spool/logs
     * spool/locks
     *
     * You've to leave XMail flush its queue (spool) before upgrading
     * to this version.
     * A more complex solution, if You've a lot of file pending into the
     * spool, is :
     *
     * 1) Stop XMail
     * 2) Upgrade to 0.61
     * 3) Start XMail and wait it has created all the queue tree structure
     * 4) Stop XMail
     * 5) Move all old spool/ files into 0/0/mess
     * 6) Rename all spool/logs/ files removing the .log extension
     * 7) Move all spool/logs/ file into 0/0/slog
     * 8) Now You can remove the above directories and restart XMail
     ********************************************************************
  • ORBS relays checking has been added and is activated by the new SERVER.TAB option 'ORBS-MAPSCheck'.

  • A new SERVER.TAB variable 'AllowNullSender' (default true) has been introduced to change the XMail default behaviour that reject null sender messages. Now if You want null sender messages to be rejected You've to set this variable to zero.

  • Fixed a bug in Linux XMail debug startup.

  • Now SMTP authentication does a previous lookup in mailusers.tab using the complete email address as username (@ or : as separators).

  • Authenticated users will get the permission stored in the new 'DefaultSmtpPerms' SERVER.TAB variable.

[top]

August 31, 2000 v 0.60

  • The XMail executable filename has been modified to XMail.

  • A better (even if not perfect) Linux SysV startup script (xmail) has been coded.

  • Fixed a bug in locking procedures (.lock file oriented) and introduced a correct SIGPIPE handling.

  • Improved I/O performance due to a new way of sending files through TCP/IP connections, to a more efficent way to copy message files and to a reduced number of temporary files that are created by XMail.

[top]

July 30, 2000 v 0.59

  • DNS MX queries caching has been added to lower DNS network traffic and to speed up message delivery.

  • A new directory dnscache must be added to MAIL_ROOT as long as the two subdirectories dnscache/mx and dnscache/ns .

  • A possible buffer overflow error has been fixed.

  • Some code rewrites.

[top]

July 22, 2000 v 0.58

  • Maildir mailbox format has been introduced as an optional mail storage other than the proprietary mailbox structure (You need to change CFLAGS definition in Makefile.lnx to build the Maildir version of XMail or edit SvrConfig.h defining CONFIG_MAILDIR for both Linux and NT version).

  • If You want to switch to the new Maildir version You MUST convert Your accounts and You MUST create a tmp directory inside $MAIL_ROOT/spool.

  • The maximum number of recipients for a single SMTP message has been made tunable by a new command line parameter (-Sr ... , default 100).

  • Fixed a small memory leak in SMTP server in case of multiple recipients.

  • New POP3 username/domain separator (:) has been introduced other than (@) that is not a valid char for Netscape mail system.

  • A buffer overflow bug has been corrected (the bug outcrop when a line is longer than the supplied buffer and a newline char is exactly placed at the buffer[sizeof(buffer)-1]).

  • Mail loop check has been introduced.

  • Fixed a bug that makes XMail unable to correctly handle SMTP lines terminated by <CR><CR><LF>.

  • SMTP server 'Received:' tag has been changed to suite 'MAIL FROM:<>' and 'RCPT TO:<>' addresses.

[top]

July 13, 2000 v 0.57

  • Fixed a SERIOUS bug introduced with the new indexing features of XMail that makes names case sensitive. You must also empty the tabindex directory to enable XMail to rebuild indexes in a case insensitive way. Update SOON to this version.

  • The maximum number of accounts has been removed due the new locking method.

  • Now the -Ma ... parameter give XMail a way to allocate locking resources, but it's not as strict as it was with previous versions.

  • New CTRL commands has been added (cfgfileget, cfgfileset).

  • A new command line utility to create user accounts based on a formatted text file has been added (watch at MkUsers section).

[top]

July 07, 2000 v 0.56

  •  ********************************************************************    
     *                            WARNING
     * The MAIL_ROOT directory organization has been changed !
     * A new directory  domains  MUST be created inside MAIL_ROOT to get
     * a cleaner configuration for XMail installations that handle
     * several domains.
     * In order to use this new version You MUST move Your domains
     * directories inside the new  domains  directory
     ********************************************************************
  • SMAIL scheduling times in sending messages has been changed (see -Qi command line option).

  • The file domains.tab has been put under index.

  • Completely rewrited lock procedures.

  • New CTRL commands has been added (usergetmproc, usersetmproc, custdomget, custdomset, custdomlist).

[top]

July 04, 2000 v 0.55

  • A syntax bug has been corrected, 'SMTP-RARPCheck' leave place to the correct 'SMTP-RDNSCheck'.

  • Now the files mailusers.tab , aliases.tab and extaliases.tab are indexed for a faster lookup in case of having several thousands of users and / or aliases. For this need a new directory named tabindex __MUST__ be added to MAIL_ROOT path.

  • As a consequence of this new feature You __CANNOT__ edit files under index while XMail is running.

  • POP3 mailbox locking method is changed to speedup startup time in case of thousand of users.

  • Remember to __ADD__ the directory pop3locks inside MAIL_ROOT path.

[top]

June 29, 2000 v 0.54

  • A user level grained control over incoming POP3 connections based on peer IP has been added (see at the section dedicated to POP3.IPMAP.TAB).

  • A new XMail command line parameter has been added to increase the maximum number of accounts that can be handled by the server (now defaults to 25000 while previous versions defaults to 7500).

  • Fixed a bug in XMail alias removal.

  • Some code rewrites.

[top]

June 21, 2000 v 0.53

  • The ability to setup a spammer protection based on sender address has been added (see section dedicated to SPAM-ADDRESS.TAB).

[top]

June 18, 2000 v 0.52

  • The ability to disable PSYNC server by setting sync timeout to zero (-Yi 0) has been added.

  • SMTP client authentication has been added (see SMTP Client Authentication section).

  • SMTP server authentication (PLAIN LOGIN CRAM-MD5) has been added (see SMTPAUTH.TAB description).

  • SMTP server custom authentication has been added (see SMTPEXTAUTH.TAB description).

[top]

June 12, 2000 v 0.51

  • Added 'aliaslist' command to controller server.

  • Wildcard matching has been added in 'userlist' and 'aliaslist' controller server commands.

  • Fixed a SERIOUS bug in SysExec() on Linux port - upgrade asap Your version.

[top]

June 07, 2000 v 0.50

  • MD5 authentication has been added to CTRL server to enforce server security (watch at XMail admin protocol section).

  • Users of CTRL protocol are ancouraged to use this new authentication mode.

  • POP3 TOP command has been implemented.

[top]

June 06, 2000

  • Fixed a SERIOUS bug in custom (external) POP3 authentication procedures, it always give auth :(( APOP POP3 authentication has been added to POP3 server as long as to PSYNC server (POP3 client).

  • PSYNC server configuration file (POP3LINKS.TAB) IS CHANGED to enable APOP authentication (watch at POP3LINKS.TAB section).

  • The command 'poplnkadd' of CTRL server has been extended to another parameter that store authentication method to be used.

[top]

June 01, 2000

  • Correct handling of mail routing through 'RCPT TO: <>' has been added (see Mail Routing Through Addresses section).

  • Added wildcard matching and complex mail routing in SMTPGW.TAB.

  • Fixed a bug in PSYNC server that makes XMail to test for '+OK ' response instead that for '+OK' (and '-ERR ' for '-ERR').

  • Added configuration steps in Part 7 of this doc.

  • The ability to handle custom (external) POP3 authentication procedures has been added (see section External Authentication).

[top]

May 29, 2000

  • Bug fixes in controller server and in PSYNC server.

  • Added --install-auto to install XMail as an autostart service (NT).

  • Better reliability in custom domain processing has been coded (REMEMBER to add the spool directory inside custdomains ).

  • Improved delivery error logs for a better problem understanding and fix.

  • Some code rewrites.

[top]

May 27, 2000

  • CtrlClnt improved in error control and bug fixes.

  • Changes in controller protocol for commands that has output.

  • The command 'userpasswd' has been added in controller server to allow user password changes.

  • Bug fixes in controller server.

  • Added wildchar (* ?) compare in aliases that allow to give a default processing to group of users (ie users that does not have an account).

  • XMail init.d startup script has been added (xmail).

[top]

May 26, 2000

  • Added CtrlClnt to give a access to remote administration of XMail (see CtrlClnt section).

  • This permit You to add, delete, list users as long as many other administration procedures (see XMail controller protocol).

[top]

May 24, 2000

  • Closed mailing lists has been added ('ClosedML' variable in USER.TAB).

  • The concept of filtering as message content testing has been extended to a message processing (address rewriting, attachment purging, etc ...).

  • Now message filtering can have a 'per user' processing to give a more fine grained control.

[top]

May 21, 2000

  • Added the way to specify a default domain filter with the presence of the file defaultfilter.tab into the filters subdirectory.

  • Improved PSYNC error handling.

  • Improved shutdown condition sensing (read Server Shutdown section).

[top]

May 08, 2000

  • Fixed a bug in SysDepLinux.cpp in function SysMakeDir() - permission mask changed to 0700.

  • Improved external programs execution behaviour under NT (no console is displayed).

  • Added the option to setup domain message filters with external programs exection (remember to add the filters subdirectory if You're upgrading an existing XMail).

  • This can help to filter messages based on its content to avoid mail worms and viruses that travel in attachments with given dangerous extensions.

[top]

April 26, 2000

  •  ********************************************************************    
     *                             WARNING
     * The spool file format is changed !
     * In order to use this new version You MUST flush the spool before
     * starting the new version of XMail.
     ********************************************************************
  • Modified SysRename() to MscMoveFile() to avoid errors in all cases where files are positioned on differents mount points (Unixes versions).

  • Added log files rotate function as long as a new command line parameter (-Mr ndays) to specify the rotate delay.

  • Added message-id to SMAIL and SMTP log file.

  • Added @@MSGID macro in custom mail processing (external commands).

  • Added @@MSGREF macro in custom mail processing (external commands).

  • Now messages coming from external POP3 links are pushed into the spool and not directly into the target user mailbox - this enable custom user mail processing also on this kind of messages.

  • Added 'lredirect' command to MAILPROC.TAB that makes XMail to impersonate the local domain when redirect messages.

  • Added 'lredirect' command to custom domain mail processing that makes XMail to impersonate the local domain when redirect messages.

[top]

April 04, 2000

  • A @@TMPFILE macro has been added to MAILPROC.TAB syntax as long as to custom domain processing syntax. It will create a temporary file which hold the copy of the message.

  • It's external program resposibility to delete such file when it has finished its processing.

  • Messages generated as response to a delivery failure has target address remapped with the meanings of the file EXTALIASES.TAB.

  • Fixed a bug that makes XMail write a bad 'Received: ...' message tag.

  • This error cause mail readers to display bad message's datetimes.

  • Added 'uservars' command to the controller protocol to list user defined variables.

  • Added 'uservarsset' command to the controller protocol to set user defined variables.

[top]

March 21, 2000

  • IP access control has been added to POP3, SMTP and CTRL servers (pop3.ipmap.tab , smtp.ipmap.tab , ctrl.ipmap.tab). I suggest You to setup at least ctrl.ipmap.tab.

  • Permanent SMTP error detect has been added to avoid to send N times a message that will be always rejected.

  • Some code rewrite.

[top]

March 18, 2000

  • Linux daemon startup code has been added.

  • Modified the means of 'smtprelay.tab' and 'spammers.tab' with the introduction of a netmask (MODIFY YOUR FILES EVEN IF FOR NOW THE OLD VERSION IS STILL SUPPORTED !).

  • Service threads limit has been added to POP3 and SMTP servers.

[top]

March 16, 2000

  • Fixed a bug in new Linux semaphore code.

[top]

March 13, 2000

  • Added 'POP3Domain' configuration variable that gives the possibility to set the default (primary) POP3 domain.

  • Users of such domain can log to the server using only the name part of their email address.

  • Enached daemon (or service) mode with no messages printed onto console.

  • A -Md flag has been added to activate the debug mode that will restore verbose behaviour.

  • Error messages, in daemon mode, will be now printed to syslog() (Linux) or to EventViewer (NT).

  • Improved semaphore handling in Linux that prevent from allocation a great number of semaphores. SysV semaphore array capability of Linux is used to reduce the number of allocated semaphores.

  • Code rewrite.

[top]

March 10, 2000

  • Fixed other possible points of buffer overflow attacks.

  • My Co. XMail server has reached 100000 messages exchanged without a single crash ! Custom domain mail processing has been added.

  • MAIL_CMD_LINE environment (or registry) has been added to give XMail a way to get a command line even when it's started as service.

  • Command line option -?I xxx.yyy.zzz.www has been added to bind to specified server interfaces.

[top]

March 08, 2000

  • Added UIDL POP3 server command to make XMail work with clients that needs that feature.

  • Fixed a bug that prevent to send mail introduced with the previous version.

[top]

March 06, 2000

  • Fixed a bug that can cause XMail to fall in a long CPU eating loop.

  • Added a delay to bad POP3 logins to prevent POP3 mailboxes attacks.

  • Added the option to shutdown the connection in a bad POP3 login case.

  • Fixed a bug that makes XMail (as NT service) shutdown at user logoff.

  • Fixed a bug that makes XMail unable to work with machine that are unable to RDNS its own socket addresses.

  • Fixed some possible points of buffer overflow attacks.

[top]

March 03, 2000

  • Added 'poplnkenable' controller command.

  • Added RSS maps check option (relays.mail-abuse.org).

[top]

March 01, 2000

  • Added VRFY SMTP command.

  • Coded a better Service exit under Windows NT.

  • Added MAILPROC.TAB that enable custom processing of user messages.

[top]

February 29, 2000

  • Fixed a compilation bug under certain distributions of Linux.

  • The ability to make a dynamic DNS registration has been added with the 'DynDnsSetup' configuration option in SERVER.TAB.

[top]

February 28, 2000

  • 'SmartDNSHost' option added to redirect all DNS queries to a list of DNS hosts. This option can be used to avoid MSProxyServer-WS2_32.DLL bug that not allow to send UDP packets out of the local net.

  • User mailbox size check has been added.

[top]

February 27, 2000

  • Added UDP DNS query support when searching MX records.

  • This fixes a bug that makes XMail unable to send its mails if it deals with name servers that works only in UDP.

[top]

February 25, 2000

  • Fixed a bug that prevent XMail POP3 server to handle multiple domains if there are more nic-names over a single IP address.

  • Improved controller protocol.

  • Added RBL maps check option (rbl.maps.vix.com).

  • Added 'spammers.tab' file that control SMTP client connections.

[top]

February 24, 2000

  • Added controller login check.

[top]

February 23, 2000

  • Fixed a bug caused by a case sensitive compare in domain and users names.

  • Improved controller protocol for remote admin.

[top]

February 22, 2000

  • Fixed a Linux compilation bug and implemented controller protocol for remote admin.

[top]

February 18, 2000

  • Log locking and some code rewrite.

[top]

February 16, 2000

  • Added DNSROOTS file to avoid to repeat queries for roots domains.

  • Fixed a bug that can lead to a infinite loop under DNS queries.

[top]

February 15, 2000

  • Some code rewrite.

  • Improved DNS search for MX records (bug fix).

[top]

February 07, 2000

  • Some code rewrite.

  • Now if there are no MX records for destination domain, it'll be tried an SMTP connection to that domain directly.

[top]

February 05, 2000

  • Some code rewrite and SMTP RDNS check added.

[top]

January 31, 2000

  • Bug Fixes, some code rewrite and added NT service startup.

[top]

January 26, 2000

  • Bug Fixes.

[top]

January 18, 2000

  • Bug Fixes.

[top]

January 13, 2000

  • Bug Fixes.

[top]

October 11, 1999

  • Initial Revision.

[top]

xmail-1.27/docs/Readme.txt0000644000175000017500000041315111341640463014724 0ustar davidedavideNAME XMail - Internet/Intranet mail server. [top] LICENSE This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation (); either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA [top] OVERVIEW XMail is an Internet and Intranet mail server featuring an SMTP server, POP3 server, finger server, multiple domains, no need for users to have a real system account, SMTP relay checking, RBL/RSS/ORBS/DUL and custom (IP based and address based) spam protection, SMTP authentication (PLAIN LOGIN CRAM-MD5 POP3-before-SMTP and custom), a POP3 account synchronizer with external POP3 accounts, account aliases, domain aliases, custom mail processing, direct mail files delivery, custom mail filters, mailing lists, remote administration, custom mail exchangers, logging, and multi-platform code. XMail sources compile under GNU/Linux, FreeBSD, OpenBSD, NetBSD, OSX, Solaris and NT/2K. This server was born due to the need of having a free and stable Mail Server to be used inside my old company, which used a Windows Network. I don't like to reinvent the wheel but the need of some special features drive me to start a new project. Probably if I could use a Linux server on my net, I would be able to satisfy my needs without writing code, but this is not the case. It should be also portable to other OSs, like Linux and other Unixes. Another reason that drove me to write XMail is the presence of the same steps in setting up a typical mail server, i.e.: sendmail + qpopper + fetchmail if one needs SMTP, POP3 and external synchronization, or: sendmail + qpopper for only SMTP and POP3 (I've quoted sendmail, qpopper and fetchmail, but there are many other packages you can use to reach these needs). With XMail you get an all-in-one package with a central administration that can simplify the above common steps. The first code of XMail Server is started on Windows NT and Linux, and now, the FreeBSD and Solaris version ready. The compilers supported are gcc for Linux, FreeBSD, OpenBSD and Solaris and M$ Visual C++ for NT/2K. [top] VERSION current 1.27 release type Gnu Public License release date Feb 25, 2010 project by Davide Libenzi credits Michael Hartle Shawn Anderson Dick van der Kaaden Beau E, Cox warning ************************************************************ * <> * * If you're upgrading an existing version of XMail it's * * strongly suggested that you read all the ChangeLog * * notes that range from existing version to the new one. * ************************************************************ [top] DOCUMENTATION CONVENTIONS This document contains various examples of entries you must make to the XMail configuration tables. These examples are written in a mono-spaced font like this. The prototype statement is shown with explicit '[TAB]' and '[NEWLINE]' characters: "aliasdomain"[TAB]"realdomain"[NEWLINE] while examples omit these characters: "simpson.org" "simpson.com" "*.homer.net" "homer.net" 'YOU MUST ALWAYS ENTER THE DATA EXACTLY AS SHOWN IN THE PROTOTYPE.' When a prototype or example statement is too long to be easily shown on the screen or printed, the line is split into multiple lines by showing '=>' at the end of continued lines and indenting the continuation line(s): "domain"[TAB]"account"[TAB]"enc-passwd"[TAB]"account-id"[TAB]"account-dir"[TAB]=> "account-type"[NEWLINE] 'DO NOT ENTER THE => CHARACTERS. ENTER THE ENTIRE ENTRY AS ONE LINE.' [top] FEATURES * ESMTP/ESMTPS server * POP3/POP3S server * Finger server * Multiple domains * Users don't need a real system account * SMTP relay checking * Custom SMTP maps check * SMTP protection over spammers (IP based and address based) * SMTP authentication (PLAIN LOGIN CRAM-MD5 POP3/SMTP and custom) * SMTP ETRN command support * POP3 account synchronizer with external POP3 accounts * Account aliasing * Domain aliasing * Mailing lists * Custom mail processing * Locally generated mail files delivery * Remote administration * Custom mail exchangers * Logging * Multi platform (any Windows and almost any Unix OSs) * Fine grained message filters * Custom (external) POP3/SMTP authentication * TLS support for SMTP and POP3, both server and client side [top] PORTING STATUS Right now the Linux and NT ports are stable, while the Solaris, FreeBSD, OpenBSD and OSX ones have not been tested as well as the previous OSs. [top] REQUIREMENTS * Any version of Linux that has glibc. * Windows NT with ws2_32.dll correctly installed. * A working DNS and gateway to the Internet (if you plan to use it). * To build from source for Linux you need any version of gcc and glibc installed. * To build from source for Windows you need MS Visual C++ (makefile included). * -or- any other working compiler that provides support for the Win32 SDK. [top] OBTAINING THE SOURCE Always get the latest sources at the XMail home page because otherwise you may be using an old version. Use the correct distribution for your system and don't mix Unix files with Windows ones because this is one of the most common cause of XMail bad behavior. When you unzip (or untar) the package you've to check that the MailRoot directory contained inside the package itself is complete (look at the directory tree listed below) because some unzippers don't restore empty directories. [top] BUILD XMail depends on OpenSSL to provide SSL support, so the development package of OpenSSL (in Debian called libssl-dev) must be installed on your system. For Windows, the XMail source already contains a pre-built version of the OpenSSL libraries, include files, and executable. The OpenSSL web site can be found here . [Windows] You have to have the command line environment setup before (usually the vcvars32.bat script inside the Visual C++ directory). You also need to copy the openSSL DLLs (located in "win32ssl\dll") inside the same folder where the XMail.exe binary resides. C:> nmake /f Makefile.win If once you run the XMail binaries, Windows complains about missing DLLs, your system is probably missing the Microsoft CRT redistributable package, that you can download here L. [Linux] # make -f Makefile.lnx [FreeBSD] # setenv OSTYPE FreeBSD # gmake -f Makefile.bsd or (depending on the shell): # OSTYPE=FreeBSD gmake -f Makefile.bsd [OpenBSD] # setenv OSTYPE OpenBSD # gmake -f Makefile.bsd or (depending on the shell): # OSTYPE=OpenBSD gmake -f Makefile.bsd [NetBSD] # setenv OSTYPE NetBSD # gmake -f Makefile.bsd or (depending on the shell): # OSTYPE=NetBSD gmake -f Makefile.bsd [OSX] # OSTYPE=Darwin make -f Makefile.bsd or (depending on the shell): # setenv OSTYPE Darwin # make -f Makefile.bsd [Solaris] # make -f Makefile.sso Under Linux an init.d startup script is supplied (xmail) to allow you to run XMail as a standard rc? daemon. You must put it into /etc/init.d (it depends on which distro you're using) directory and then create K??xmail - S??xmail links into the proper directories. Under Windows NT/2000/XP the XMail's executable is a Win32 service by default and if you want to have it built like a standard executable you've to comment the statement: "#define SERVICE" in MainWin.cpp When it's built as a service (default) you can run: XMail --install to install XMail as a manual startup service or: XMail --install-auto to install XMail as an automatic startup service. If you run '--install' and you want XMail to run at NT boot, you must go in ControlPanel->Services and edit the startup options of XMail. Once you have the service version of XMail you can run it in a 'normal' way by executing: XMail --debug [options] [top] CONFIGURATION Linux/Solaris/FreeBSD/OpenBSD 1. Build XMail. 2. Log as root. 3. Copy the supplied MailRoot directory where you want it to reside (normally /var). 4. Do a # chmod 700 /var/MailRoot to setup MailRoot directory access rights. 5. Strip XMail executables if you want to reduce their sizes (strip filename). 6. Copy XMail executables to /var/MailRoot/bin. 7. Optionally, you can setup a dedicated temporary files directory for XMail, by setting the environment variable XMAIL_TEMP, which defaults to /tmp/. XMail uses such directory when it has to create files that must be accessible to external programs like filters. 8. If you have 'inetd' installed, comment out the lines of '/etc/inetd.conf' that involve SMTP, POP3, and Finger. Restart 'inetd' (kill -HUP ...). 9. Since XMail uses syslog to log messages, enable syslogd if it's not running. 10. Setup the 'SERVER.TAB' configuration file (after reading the rest of this document well). 11. Add your users and domains (after reading the rest of this document well). 12. Change or comment out (#) the example account in 'ctrlaccounts.tab' by using a non-trivial username and password. 13. Copy the xmail startup script to your init.d directory (it's position depends on your distro). If you've setup XMail to work in a subdirectory other than '/var/MailRoot' you must edit the xmail startup script to customize its boot parameters. 14. Use the 'sysv_inst.sh' shell script (from root user) to create SysV boot script - unless your distro has other tools to do this. 15. To start XMail without reboot you can run (from root): /etc/rc.d/init.d/xmail start otherwise reboot your machine. 16. Setup the file 'smtprelay.tab' if you want to extend mail relaying to IPs outside of the internet's private IP blocks (or you want to deny even those - that comes enabled by default with XMail). 17 Look at [SSL CONFIGURATION] for information about how to create the required 'server.key' and 'server.cert' files. For further configuration options, please see the [COMMAND LINE] section. [configuration] [top] NT/Win2K/XP 1. Build XMail. 2. Copy the supplied MailRoot directory where you want it to reside (normally 'C:\MailRoot'). 3. Setup the MailRoot directory (and subdirectories and file) permissions to allow access only to System and Administrators. Doing this you can run XMail as a console startup only if you're Administrator (service startup as System). 4. Copy XMail executables to 'C:\MailRoot\bin'. Also copy the OpenSSL DLLs located in "win32ssl\dll" to 'C:\MailRoot\bin'. 5. With 'regedit', create 'GNU' key inside 'HKEY_LOCAL_MACHINE\SOFTWARE\' and then 'XMail' key inside 'HKEY_LOCAL_MACHINE\SOFTWARE\GNU'. Note: If you are using a 32bit binary with a 64bit Windows, replace 'HKEY_LOCAL_MACHINE\SOFTWARE\' with 'HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\' here, and in the points below. 6. Create a new string value named 'MAIL_ROOT' inside 'HKEY_LOCAL_MACHINE\SOFTWARE\GNU\XMail\' with value 'C:\MailRoot'. 7. Optionally create a new string value named 'MAIL_CMD_LINE' inside 'HKEY_LOCAL_MACHINE\SOFTWARE\GNU\XMail\' to store your command line options (read well the rest of this document). 8. Open an NT console (command prompt). 9. Go inside 'C:\MailRoot\bin' and run: XMail --install for a manual startup, or: XMail --install-auto for an automatic startup. 10. If you have other services that provide the same functionality as XMail, that is SMTP, POP3, or Finger servers, you must stop these services. 11. Setup the 'SERVER.TAB' configuration option after reading the rest of this document well. 12. Add your users and domains (after reading to the rest of this document well). 13. Setup file permissions of the 'C:\MailRoot' directory to grant access only to 'SYSTEM' and 'Domain Admins'. 14. Change or comment out (#) the example account in ctrlaccounts.tab by using a non-trivial username and password. 15. To start XMail without reboot you can go to: ControlPanel -> Services -> XMail server and start the service, otherwise reboot your machine. 16. Setup the file 'smtprelay.tab' if you want to extend mail relaying to IPs outside of the internet's private IP blocks (or you want to deny even those - that comes enabled by default with XMail). 17 Look at [SSL CONFIGURATION] for information about how to create the required 'server.key' and 'server.cert' files. For further configuration options, please see the [COMMAND LINE] section. [configuration] [top] Environment variables [MAIL_ROOT] If you want to start XMail as a simple test you must setup an environment variable MAIL_ROOT that points to the XMail Server root directory. Linux/etc.: export MAIL_ROOT=/var/XMailRoot Windows: set MAIL_ROOT=C:\MailRoot [MAIL_CMD_LINE] Allows the user to specify extra command line parameters (they will be appended to the ones specified in the command line). [XMAIL_PID_DIR] Allows the user to specify the PID directory (Unix only ports). The specified directory must NOT have the final slash (/) appended to the path. [configuration] [top] MailRoot structure Mail root directory contain these files: aliases.tab aliasdomain.tab domains.tab dnsroots extaliases.tab mailusers.tab message.id pop3links.tab server.tab server.cert server.key smtpgw.tab smtpfwd.tab smtprelay.tab smtpauth.tab smtpextauth.tab userdef.tab ctrlaccounts.tab spammers.tab spam-address.tab pop3.ipmap.tab smtp.ipmap.tab ctrl.ipmap.tab finger.ipmap.tab filters.in.tab filters.out.tab filters.post-rcpt.tab filters.pre-data.tab filters.post-data.tab smtp.ipprop.tab smtp.hnprop.tab and these directories: bin cmdaliases tabindex dnscache mx ns custdomains filters logs pop3locks pop3linklocks pop3links spool local temp 0 0 mess rsnd info temp slog lock mprc froz ... ... userauth pop3 smtp domains msgsync and for each domain DOMAIN handled a directory (inside domains): DOMAIN userdef.tab mailproc.tab [ optional ] inside of which reside, for each account ACCOUNT: ACCOUNT user.tab mlusers.tab [ mailing list case ] mailproc.tab [ optional ] pop3.ipmap.tab [ optional ] and mailbox for mailbox structure, while: Maildir tmp new cur for Maildir structure. The msgsync directory is used to store UIDL lists for PSYNC accounts that require leaving messages on the server. Inside the msgsync other directories will be created with the name of the remote server, directories that will store UIDL DB files. [configuration] [top] Configuration tables TAB ('something.tab') files are text files (in the sense meant by the OS in use: for NT and for Linux) with this format: "value1"[TAB]"value2"[TAB]...[NEWLINE] The following sections explain each file's structure and use. "ALIASES.TAB file" "ALIASDOMAIN.TAB file" "DOMAINS.TAB file" "DNSROOTS file" "EXTALIASES.TAB file" "MAILUSERS.TAB file" "MESSAGE.ID file" "POP3LINKS.TAB file" "SERVER.TAB file" "SMTPGW.TAB file" "SMTPFWD.TAB file" "SMTPRELAY.TAB file" "SMTPAUTH.TAB file" "SMTPEXTAUTH.TAB file" "USERDEF.TAB file" "CTRLACCOUNTS.TAB file" "SPAMMERS.TAB file" "SPAM-ADDRESS.TAB file" "POP3.IPMAP.TAB file" "SMTP.IPMAP.TAB file" "CTRL.IPMAP.TAB file" "FINGER.IPMAP.TAB file" "USER.TAB file" "MLUSERS.TAB file" "MAILPROC.TAB file" "SMTP.IPPROP.TAB file" "SMTP.HNPROP.TAB file" "FILTERS.IN.TAB file" "FILTERS.OUT.TAB file" "FILTERS.POST-RCPT.TAB file" "FILTERS.PRE-DATA.TAB file" "FILTERS.POST-DATA.TAB file" [configuration] [top] ALIASES.TAB "domain"[TAB]"alias"[TAB]"realaccount"[NEWLINE] Example: "home.bogus" "davidel" "dlibenzi" define 'davidel' as alias for 'dlibenzi' in 'home.bogus' domain. "home.bogus" "foo*bog" "homer@internal-domain.org" define an alias for all users whose name starts with 'foo' and ends with 'bog' that points to the locally handled account 'homer@internal-domain.org'. "home.bogus" "??trips" "travels" define an alias for all users whose names start with any two chars and end with 'trips'. You can even have wildcards in the domain field, as: "*" "postmaster" "postmaster@domain.net" You 'CANNOT' edit this file while XMail is running because it is an indexed file. [table index] [configuration] [top] ALIASDOMAIN.TAB "aliasdomain"[TAB]"realdomain"[NEWLINE] where 'aliasdomain' can use wildcards: "simpson.org" "simpson.com" "*.homer.net" "homer.net" The first line defines 'simpson.org' as an alias of 'simpson.com' while the second remaps all subdomains of 'homer.net' to 'homer.net'. You 'CANNOT' edit this file while XMail is running because it is an indexed file. [table index] [configuration] [top] DOMAINS.TAB "domain"[NEWLINE] defines domains handled by the server. [table index] [configuration] [top] DNSROOTS host This is a file that lists a root name server in each line (this is not a TAB file). This can be created from a query via nslookup for type=ns and host = '.'. [table index] [configuration] [top] EXTALIASES.TAB "external-domain"[TAB]"external-account"[TAB]"local-domain"[TAB]"local-user"[NEWLINE] Example: "xmailserver.org" "dlibenzi" "home.bogus" "dlibenzi" This file is used in configurations in which the server does not run directly on Internet (like my case) but acts as internal mail exchanger and external mail gateway. This file defines 'Return-Path: <...>' mapping for internal mail delivery. If you are using an Mail client like Outlook, Eudora, KMail ... you have to configure your email address with the external account say 'dlibenzi@xmailserver.org'. When you post an internal message to 'foo@home.bogus' the mail client puts your external email address ('dlibenzi@xmailserver.org') in the 'MAIL FROM: <...>' SMTP request. Now if the user 'foo' replies to this message, it replies to 'dlibenzi@xmailserver.org', and then is sent to the external mail server. With the entry above in 'EXTALIASES.TAB' file the 'Return-Path: <...>' field is filled with 'dlibenzi@home.bogus' that leads to an internal mail reply. You 'CANNOT' edit this file while XMail is running because it is an indexed file. [table index] [configuration] [top] MAILUSERS.TAB "domain"[TAB]"account"[TAB]"enc-passwd"[TAB]"account-id"[TAB]"account-dir"[TAB]=> "account-type"[NEWLINE] (remember, enter as one line.) Example: "home.bogus" "dlibenzi" "XYZ..." 1 "dlibenzi" "U" defines an account 'dlibenzi' in domain 'home.bogus' with the encrypted password 'XYZ...', user id '1' and mail directory 'dlibenzi' inside '$MAIL_ROOT/domains/home.bogus'. To allow multiple domain handling the POP3 client must use the entire email address for the POP3 user account; for example, if a user has email user@domain it must supply: user@domain as POP3 account login. The directory 'account-dir' 'must' case match with the field 'account-dir' of this file. Note that user id 'must' be unique for all users (duplicate user ids are not allowed). The user id 0 is reserved by XMail and cannot be used. The last field 'U' is the account type: "U" = User account "M" = Mailing list account The encrypted password is generated by 'XMCrypt' whose source is 'XMCrypt.cpp'. Even if external authentication is used (see "External Authentication") this file 'must' contain an entry for each user handled by XMail. You 'CANNOT' edit this file while XMail is running because it is an indexed file. [table index] [configuration] [top] MESSAGE.ID A file storing a sequential message number. Set it at 1 when you install the server and leave it be handled by the software. [table index] [configuration] [top] POP3LINKS.TAB "local-domain"[TAB]"local-account"[TAB]"external-domain"[TAB]=> "external-account"[TAB]"external-crypted-password"[TAB]"authtype"[NEWLINE] (remember, enter as one line) where: 'authtype' = Comma-separated list of options: CLR Use clear-text USER/PASS authentication APOP Use POP3 APOP authentication (that does not send clear-text passwords over the wire). Fall back to 'CLR' if 'APOP' is not supported FAPOP Use POP3 APOP authentication (that does not send clear-text passwords over the wire). STLS Establish an SSL link with the server by issuing a POP3 STLS command. Continue with the non-encrypted link if STLS is not supported FSTLS Establish an SSL link with the server by issuing a POP3 STLS command. POP3S Establish a full POP3S connection with the remote server. Note that the POP3S port (default 995) must be set inside the external domain declaration. Leave Leave messages on the server, and download only the new ones. In order for this functionality to work, the remote POP3 server must support the UIDL command. OutBind Sets the IP address of the network interface that should be used when connecting to the remote host. This configuration should be used carefully, because XMail will fail if the selected IP of the interface does not have a route to the remote host using such IP. Examples: "home.bogus" "dlibenzi" "xmailserver.org" "dlibenzi" "XYZ..."=> "APOP" This entry is used to synchronize the external account 'dlibenzi@xmailserver.org' with encrypted password 'XYZ...' with the local account 'dlibenzi@home.bogus' using 'APOP' authentication. It connects with the 'xmailserver.org' POP3 server and downloads all messages for 'dlibenzi@xmailserver.org' into the local account 'dlibenzi@home.bogus'. The remote server must support 'APOP' authentication to specify 'APOP' as authtype. Even if using APOP authentication is more secure because clear usernames and password do not travel on the network, when you're not sure about it, specify 'CLR' as authtype. For non local POP3 sync you've to specify a line like this one (@ as the first domain char): "@home.bogus.com" "dlibenzi" "xmailserver.org:110" "dlibenzi" "XYZ..."=> "CLR" This entry is used to synchronize the external account 'dlibenzi@xmailserver.org' with encrypted password 'XYZ...' with the account 'dlibenzi@home.bogus.com' using 'CLR' authentication. The message is pushed into the spool having as destination dlibenzi@home.bogus.com , so you've to have some kind of processing for that user or domain in your XMail configuration (for example custom domain processing). you can also have the option to setup a line like this one: "?home.bogus.com,felins.net,pets.org" "dlibenzi" "xmailserver.org"=> "dlibenzi" "XYZ..." "CLR" and messages are dropped inside the spool by following these rules: 1. XMail parses the message headers by searching for To:, Cc: and Bcc: addresses. 2. Each address's domain is compared with the list of valid domains (felins.net, pets.org). 3. For each valid address the username part is taken and joined with the '@' and the masquerade domain name (the name following '?'). 4. The message is spooled with the above built destination address. Obviously the masquerade domain ('home.bogus.com') MUST be handled by the server or MUST be a valid external mail domain. So if a message having as To: address graycat@felins.net is fetched by the previous line a message is pushed into the spool with address graycat@home.bogus.com. Particular attention must be paid to prevent creating mail loops. Another option is: "&.local,felins.net,pets.org" "dlibenzi" "xmailserver.org" "dlibenzi"=> "XYZ..." "CLR" where a fetched message whose To: address is graycat@felins.net is replaced with graycat@felins.net.local. You can avoid the matching domain list after the masquerading domain but, in that case, you may have bad destination addresses inside the spool. The list MUST be comma separated WITHOUT spaces. XMail starts PSYNC session with a delay that you can specify with the -Yi nsec command line parameter (default 120). XMail also checks for the presence (inside MAIL_ROOT) of a file named '.psync-trigger' and, when this file is found, a PSYNC session starts and that file is removed. [table index] [configuration] [top] SERVER.TAB "varname"[TAB]"varvalue"[NEWLINE] This file contains server configuration variables. See "SERVER.TAB variables" below for details. [table index] [configuration] [top] SMTPGW.TAB "domain"[TAB]"smtp-gateway"[NEWLINE] Examples: "foo.example.com" "@xmailserver.org" sends all mail for 'foo.example.com' through the 'xmailserver.org' SMTP server, while: "*.dummy.net" "@relay.xmailserver.org" sends all mail for '*.dummy.net' through 'relay.xmailserver.org'. The 'smtp-gateway' can be a complex routing also, for example: "*.dummy.net" "@relay.xmailserver.org,@mail.nowhere.org" sends all mail for '*.dummy.net' through '@relay.xmailserver.org,@mail.nowhere.org', in this way: relay.xmailserver.org --> mail.nowhere.org --> @DESTINATION. [table index] [configuration] [top] SMTPFWD.TAB "domain"[TAB]"smtp-mx-list"[NEWLINE] The "smtp-mx-list" is a semicolon separated list of SMTP relays, and can also contain options as a comma-separated list (see [SMTP GATEWAY CONFIGURATION] for more information). Examples: "foo.example.com" "mail.xmailserver.org:7001;192.168.1.1:6123,NeedTLS=1;mx.xmailserver.org" sends all mail for 'foo.example.com' using the provided list of mail exchangers, while: "*.dummy.net" "mail.xmailserver.org,NeedTLS=1;192.168.1.1;mx.xmailserver.org:6423" sends all mail for '*.dummy.net' through the provided list of mail exchangers. If the port (:nn) is not specified the default SMTP port (25) is assumed. you can also enable XMail to random-select the order of the gateway list by specifying: "*.dummy.net" "#mail.xmailserver.org;192.168.1.1;mx.xmailserver.org:6423" using the character '#' as the first char of the gateway list. [table index] [configuration] [top] SMTPRELAY.TAB "ipaddr"[TAB]"netmask"[NEWLINE] Example: "212.131.173.0" "255.255.255.0" allows all hosts of the class 'C' network '212.131.173.XXX' to use the server as relay. [table index] [configuration] [top] SMTPAUTH.TAB "username"[TAB]"password"[TAB]"permissions"[NEWLINE] is used to permit SMTP client authentication with protocols PLAIN, LOGIN, CRAM-MD5 and custom. With custom authentication a file containing all secrets (username + ':' + password) is passed as parameter to the custom authentication program which tests all secrets to find the one matching (if exist). For this reason it's better to keep the number of entries in this file as low as possible. Permissions are a string that can contain: M open mailing features R open relay features (bypass all other relay blocking traps) V VRFY command enabled (bypass SERVER.TAB variable) T ETRN command enabled (bypass SERVER.TAB variable) Z disable mail size checking (bypass SERVER.TAB variable) S ease SSL requirement for this user (bypass the "WantTLS" mail config variable) When PLAIN, LOGIN or CRAM-MD5 authentication mode are used, first a lookup in 'MAILUSERS.TAB' accounts is performed to avoid duplicating information with 'SMTPAUTH.TAB'. Therefore when using these authentication modes a user must use as username the full email address (the : separator is permitted instead of @) and as password his POP3 password. If the lookup succeeds, the 'SERVER.TAB' variable 'DefaultSmtpPerms' is used to assign user SMTP permissions (default MR). If the lookup fails then 'SMTPAUTH.TAB' lookup is done. [table index] [configuration] [top] SMTPEXTAUTH.TAB The 'SMTPEXTAUTH.TAB' file enables the XMail administrator to use external authentication methods to verify SMTP clients. If the 'SMTPEXTAUTH.TAB' does not exist, or it is empty, XMail standard authentication methods are used, and those will use either the 'MAILUSERS.TAB' or the 'SMTPAUTH.TAB' to verify account credentials. If the file 'SMTPEXTAUTH.TAB' is not empty, then the XMail standard authentication methods are not advertised in the AUTH response of the EHLO SMTP command. Instead, only the ones listed inside the 'SMTPEXTAUTH.TAB' are reported to the SMTP client. The 'SMTPEXTAUTH.TAB' file can contain multiple lines with the following format: "auth-name"[TAB]"program-path"[TAB]"arg-or-macro"...[NEWLINE] This file can contain multiple lines whose 'auth-name' are listed during the EHLO command response. Where 'arg-or-macro' can be (see [MACRO SUBSTITUTION]): AUTH authentication method (PLAIN, LOGIN, CRAM-MD5, ...) USER SMTP client supplied username (available in PLAIN, LOGIN and CRAM-MD5) PASS SMTP client supplied password (available in PLAIN and LOGIN) CHALL challenge used by the server (available in CRAM-MD5) DGEST client response to server challenge (@CHALL - available in CRAM-MD5) RFILE a file path where the external authentication binary might supply extra information/credentials about the account (available in all authentications) The RFILE file is composed by multiple lines with the following format: VAR=VALUE Currently supported variables inside the RFILE file are: Perms Supply SMTP permissions for the account (see [SMTPAUTH.TAB] for detailed information) Example: "PLAIN" "/usr/bin/my-auth" "-a" "@@AUTH" "-u" "@@USER" "-p" "@@PASS" "-r" "@@RFILE" The external authentication binary may or may not fill a response file. If the authentication has been successful, the binary should exit with a code equal to zero. Any other exit code different from zero, will be interpreted as failure. [table index] [configuration] [top] USERDEF.TAB "varname"[TAB]"varvalue"[NEWLINE] Example: "RealName" "??" "HomePage" "??" "Address" "??" "Telephone" "??" "MaxMBSize" "10000" contains user default values for new users that are not set during the new account creation. This file is looked up in two different places, first in '$MAIL_ROOT/domains/DOMAIN' then in '$MAIL_ROOT', where 'DOMAIN' is the name of the domain where we're going to create the new user. For each 'domain' handled by the server we'll create a directory 'domain' inside $MAIL_ROOT. Inside $MAIL_ROOT/'domain' reside 'domain'->'account' directories ($MAIL_ROOT/'domain'/'account'). This folder contains a sub folder named 'mailbox' (or 'Maildir/(tmp,new,cur)') that stores all 'account' messages. It also contains a file named 'USER.TAB' that stores "account" variables, for example: "RealName" "Davide Libenzi" "HomePage" "http://www.xmailserver.org/davide.html" "MaxMBSize" "30000" [table index] [configuration] [top] CTRLACCOUNTS.TAB "username"[TAB]"password"[NEWLINE] This file contains the accounts that are enabled to remote administer XMail. The password is encrypted with the 'XMCrypt' program supplied with the source distro. 'REMEMBER THAT THIS FILE HOLDS ADMIN ACCOUNTS, SO PLEASE CHOOSE COMPLEX USERNAMES AND PASSWORDS AND USE CTRL.IPMAP.TAB TO RESTRICT IP ACCESS! REMEMBER TO REMOVE THE EXAMPLE ACCOUNT FROM THIS FILE!' [table index] [configuration] [top] SPAMMERS.TAB "ipaddr"[TAB]"netmask"[NEWLINE] or: "ipaddr"[TAB]"netmask"[TAB]"params"[NEWLINE] or: "ipaddr/bits"[NEWLINE] or: "ipaddr/bits"[TAB]"params"[NEWLINE] Example: "212.131.173.0" "255.255.255.0" "212.131.173.0/24" registers all hosts of the class 'C' network '212.131.173.XXX' as spammers, and blocks them the use of XMail SMTP server. If a match is found on one of those records, XMail will reject the incoming SMTP connection at an early stage. It is possible to specify optional parameters to tell XMail which behaviour it should assume in case of a match. An example of such a setup is: "212.131.173.0/24" "code=0" In this case a code=0 tells XMail to flag the connection as possible spammer, but to await later SMTP session stages to reject the connection itself. In this case an authenticated SMTP session can override the SPAMMERS.TAB match. The optional "params" field lists parameters associated with the record, separated by a comma: "param1=value1,param2=value2,...,paramN=valueN" Currently supported parameters are: code Specify the rejection code for the record. If the value is greater than zero, the connection is rejected soon, and the remote SMTP client is disconnected. If the value is zero, the connection is flagged as spammer but awaits later stages for rejection, by allowing authenticated SMTP connections to bypass the SPAMMERS.TAB match. If the value is less than zero, XMail will insert an "absolute value" seconds delay between SMTP commands. Default value for code is greater than zero (immediate rejection). [table index] [configuration] [top] SPAM-ADDRESS.TAB "spam-address"[NEWLINE] Example: "*@rude.net" "*-admin@even.more.rude.net" blocks mails coming from the entire domain 'rude.net' and coming from all addresses that end with '-admin@'even.more.rude.net. [table index] [configuration] [top] POP3.IPMAP.TAB "ipaddr"[TAB]"netmask"[TAB]"permission"[TAB]"precedence"[NEWLINE] This file controls the global IP access permission to the POP3 server if located in the MAIL_ROOT path, and user IP access to its POP3 mailbox if located inside the user directory. Example: "0.0.0.0" "0.0.0.0" "DENY" "1" "212.131.173.0" "255.255.255.0" "ALLOW" "2" This configuration denies access to all IPs except the ones of the class 'C' network '212.131.173.XXX'. Higher precedences win over lower ones. [table index] [configuration] [top] SMTP.IPMAP.TAB "ipaddr"[TAB]"netmask"[TAB]"permission"[TAB]"precedence"[NEWLINE] This file controls IP access permission to SMTP server. Example: "0.0.0.0" "0.0.0.0" "DENY" "1" "212.131.173.0" "255.255.255.0" "ALLOW" "2" This configuration denies access to all IPs except the ones of the class 'C' network '212.131.173.XXX'. Higher precedences win over lower ones. [table index] [configuration] [top] CTRL.IPMAP.TAB "ipaddr"[TAB]"netmask"[TAB]"permission"[TAB]"precedence"[NEWLINE] This file control IP access permission to CTRL server. Example: "0.0.0.0" "0.0.0.0" "DENY" "1" "212.131.173.0" "255.255.255.0" "ALLOW" "2" This configuration deny access to all IPs except the ones of the class 'C' network '212.131.173.XXX'. Higher precedences win over lower ones. [table index] [configuration] [top] FINGER.IPMAP.TAB "ipaddr"[TAB]"netmask"[TAB]"permission"[TAB]"precedence"[NEWLINE] This file controls IP access permission to FINGER server. Example: "0.0.0.0" "0.0.0.0" "DENY" "1" "212.131.173.0" "255.255.255.0" "ALLOW" "2" This configuration denies access to all IPs except the ones of the class 'C' network '212.131.173.XXX'. Higher precedences win over lower ones. [table index] [configuration] [top] USER.TAB "variable"[TAB]"value"[NEWLINE] store user information such as: "RealName" "Davide Libenzi" "HomePage" "http://www.xmailserver.org/davide.html" "MaxMBSize" "30000" "ClosedML" "0" Please refer to "USER.TAB variables" below. [table index] [configuration] [top] MLUSERS.TAB If the user is a mailing list this file must exist inside the user account subdirectory and contain a list of users subscribed to this list. The file format is: "user"[TAB]"perms"[NEWLINE] where: user subscriber email address. perms subscriber permissions: R read. W write (check done using the 'MAIL FROM:<...>' SMTP return path). A write (check done using the email address used for SMTP authentication). Example: "davidel@xmailserver.org" "RW" "ghostuser@nightmare.net" "R" "meawmeaw@kitty.cat" "RA" If the 'USER.TAB' file defines the 'ClosedML' variable as '1' then a client can post to this mailing list only if it's listed in 'MLUSERS.TAB' with RW permissions. [table index] [configuration] [top] MAILPROC.TAB "command"[TAB]"arg-or-macro"[TAB]...[NEWLINE] stores commands (internals or externals) that have to be executed on a message file. The presence of this file is optional and if it does not exist the default processing is to store the message in user mailbox. The 'MAILPROC.TAB' file can be either per user or per domain, depending where the file is stored. If stored inside the user directory it applies only to the user whose directory hosts the 'MAILPROC.TAB', while if stored inside the domain directory it applies to all users of such domain. Each argument can be a macro also (see [MACRO SUBSTITUTION]): FROM is substituted for the sender of the message RCPT is substituted for the recipient of the message RRCPT is substituted for the real recipient ($(RCPT) could be an alias) of the message FILE is substituted for the message file path (the external command _must_ only read the file) MSGID is substituted for the (XMail unique) message id MSGREF is substituted for the reference SMTP message id TMPFILE creates a copy of the message file to a temporary one. It can be used with 'external' command but in this case it's external program responsibility to delete the temporary file. Do not use it with 'filter' commands since the filter will have no way to modify the real spool file USERAUTH name of the SMTP authenticated user, or "-" if no authentication has been supplied Supported commands: [EXTERNAL] "external"[TAB]"priority"[TAB]"wait-timeout"[TAB]"command-path"[TAB]=> "arg-or-macro"[TAB]...[NEWLINE] where: external command keyword priority process priority: 0 = normal -1 = below normal +1 = above normal wait-timeout wait timeout for process execution in seconds: 0 = nowait Be careful if using $(FILE) to give the external command enough timeout to complete, otherwise the file will be removed by XMail while the command is processing. This is because such file is a temporary one that is deleted when XMail exits from 'MAILPROC.TAB' file processing. In case the external command exit code will be '16', the command processing will stop and all the following commands listed inside the file will be skipped. [FILTER] "filter"[TAB]"priority"[TAB]"wait-timeout"[TAB]"command-path"[TAB]=> "arg-or-macro"[TAB]...[NEWLINE] where: filter command keyword priority process priority: 0 = normal -1 = below normal +1 = above normal wait-timeout wait timeout for process execution in seconds: 0 = nowait With filters, it is not suggested to use $(TMPFILE), since the filter will never have the ability to change the message content in that way. Also, to avoid problems very difficult to troubleshoot, it is suggested to give the filter 'ENOUGH' timeout to complete (90 seconds or more). See [MESSAGE FILTERS] for detailed information about return codes. In the filter command, the "Stop Filter Processing" return flag will make XMail to stop the execution of the current custom processing file. The 'filter' command will pass the message file to a custom external filter, that after inspecting it, has the option to accept, reject or modify it. Care should be taken to properly re-format the message after changing it, to avoid message corruption. The 'filter' command 'CANNOT' successfully change the private XMail's header part of the spool message. [MAILBOX] "mailbox"[NEWLINE] With this command the message is pushed into local user mailbox. [REDIRECT] "redirect"[TAB]"domain-or-emailaddress"[TAB]...[NEWLINE] Redirect message to internal or external domain or email address. If the message was for foo-user@custdomain.net and the file custdomain.net.tab contains a line: "redirect" "target-domain.org" the message is delivered to 'foo-user@target-domain.org'. While the line: "redirect" "user@target-domain.org" redirects the message to user@target-domain.org. [LREDIRECT] "lredirect"[TAB]"domain-or-emailaddress"[TAB]...[NEWLINE] Redirect the message to internal or external domain (or email address) impersonating local domain during messages delivery. If the message was for foo-user@custdomain.net and the file custdomain.net.tab contains a line: "redirect" "target-domain.org" the message is delivered to 'foo-user@target-domain.org'. While the line: "redirect" "user@target-domain.org" redirects the message to 'user@target-domain.org'. The difference between "redirect" and "lredirect" is the following. Suppose A@B sends a message to C@D, that has a redirect to E@F. With "redirect" E@F will see A@B has sender while with "lredirect" he will see C@D. [SMTPRELAY] "smtprelay"[TAB]"server[:port][,options];server[:port][,options];..."[NEWLINE] Send mail to the specified SMTP server list by trying the first, if fails the second and so on. Otherwise You can use this syntax: "smtprelay"[TAB]"#server[:port][,options];server[:port][,options];..."[NEWLINE] to have XMail random-select the order the specified relays. Each gateway definition can also contain options as a comma-separated list (see [SMTP GATEWAY CONFIGURATION] for more information). [table index] [configuration] [top] SMTP.IPPROP.TAB This file lists SMTP properties to be associated with the remote SMTP peer IP. The format of the file is: "ip-addr"[TAB]"var0=value0"...[TAB]"varN=valueN"[NEWLINE] Example: "192.168.0.7/32" "WhiteList=1" Address selection mask are formed by an IP address (network) plus the number of valid bits inside the network mask. No space are allowed between the variable name and the '=' sign and between the '=' sign and the value. These are the currently defined variables: WhiteList If set to 1, all peer IP based checks will be skipped. EaseTLS If set to 1, drops the TLS requirement for SMTP sessions coming from the matched network. SenderDomainCheck If set to 0, bypasses the "CheckMailerDomain" 'SERVER.TAB' variable. NoAuth If set to 1, release the authentication policy for this IP. EnableVRFY If set to 1, enable VRFY commands from this IP. EnableETRN If set to 1, enable ETRN commands from this IP. [table index] [configuration] [top] SMTP.HNPROP.TAB This file lists SMTP properties to be associated with the remote SMTP peer host name. The format of the file is: "host-spec"[TAB]"var0=value0"...[TAB]"varN=valueN"[NEWLINE] If the "host-spec" starts with a dot ('.'), the properties listed for that record will be applied to all sub-domains of the "host-spec" domain. Since applying the 'SMTP.HNPROP.TAB' rules requires a DNS PTR lookup of the peer IP, you should be aware that this might introduce latencies into the XMail processing. If you do not have any hostname-based rules, do not create the 'SMTP.HNPROP.TAB' file at all, since the simple existence of the file would trigger the DNS PTR lookup. Example: "xmailserver.org" "WhiteList=1" "EaseTLS=1" or: ".xmailserver.org" "WhiteList=1" "EaseTLS=1" See [SMTP.IPPROP.TAB] for information about the properties allowed to be listed in this file. [table index] [configuration] [top] FILTERS.IN.TAB See [MESSAGE FILTERS] [table index] [configuration] [top] FILTERS.OUT.TAB See [MESSAGE FILTERS] [table index] [configuration] [top] FILTERS.POST-RCPT.TAB See [SMTP MESSAGE FILTERS] [table index] [configuration] [top] FILTERS.PRE-DATA.TAB See [SMTP MESSAGE FILTERS] [table index] [configuration] [top] FILTERS.POST-DATA.TAB See [SMTP MESSAGE FILTERS] [table index] [configuration] [top] MACRO SUBSTITUTION XMail support two kinds of macro declaration inside its TAB file. The old macro declaration done by prefixing the macro name with the '@@' sequence is still supported for backward compatibility, and has to be used when the macro is the only content of the parameter. Macro can also be declared as '$(MACRO)' and this form can be used anywhere inside the parameter declaration, like: "/var/spool/mail/$(USER).dat" [top] EXTERNAL AUTHENTICATION You can use external modules (executables) to perform user authentication instead of using XMail 'mailusers.tab' lookups. Inside the userauth directory you'll find one directory for each service whose authentication can be handled externally (see "SMTPEXTAUTH.TAB" for SMTP). Suppose We must authenticate 'USERNAME' inside 'DOMAIN', XMail first tries to lookup (inside userauth/pop3) a file named: 'DOMAIN.tab' else: '.tab' If one of these files is found, XMail authenticates 'USERNAME' - 'DOMAIN' using that file. The authentication file is a TAB file (see at the proper section in this document) which has the given structure: "auth-action"[TAB]"command"[TAB]"arg-or-macro"[TAB]...[NEWLINE] Each argument can be a macro also (see [MACRO SUBSTITUTION]): USER the USERNAME to authenticate DOMAIN the DOMAIN to authenticate PASSWD the user password PATH user path The values for 'auth-action' can be one of: item userauth executed when user authentication is required useradd executed when a user need to be added useredit executed when a user change is required userdel executed when a user deletion is required domaindrop executed when all domain users need to be deleted The first line that stores the handling command for the requested action is executed as: command arg0 ... argN that must return zero if successful. Any other exit code is interpreted as authentication operation failure, that. in 'userauth' case, means such user is not authenticated. If the execution of the command fails for system reasons (command not found, access denied, etc ...) then the user is not authenticated. If none of this file's id are found, then usual authentication is performed ('mailusers.tab'). The use of external authentication does not avoid the presence of the user entry in 'mailusers.tab'. [top] SMTP CLIENT AUTHENTICATION When a message is to be sent through an SMTP server that requires authentication, XMail provides a way to handle this task by if the 'userauth/smtp' subdirectory is set up properly. Suppose a mail is to be sent through the SMTP server 'mail.foo.net', this makes XMail to search for a file named (inside userauth/smtp): 'mail.foo.net.tab' then: 'foo.net.tab' then: 'net.tab' If one of these files is found its content is used to authenticate the SMTP client session. The structure of this file, as the extension says, is the TAB one used for most of the configuration files inside XMail. Only the first valid line (uncommented #) is used to choose the authentication method and lines has this format: "auth-type"[TAB]"param1"...[TAB]"paramN"[NEWLINE] Valid lines are: "PLAIN" "username" "password" or "LOGIN" "username" "password" or "CRAM-MD5" "username" "password" [top] CUSTOM DOMAIN MAIL PROCESSING If a message that has as target domain of 'sub1.sub2.domain.net' arrives at the XMail server, 'AND' XMail does not have a real domain 'sub1.sub2.domain.net' inside its domain list, XMail decides if this domain gets a custom domain processing by trying to lookup: sub1.sub2.domain.net.tab .sub2.domain.net.tab .domain.net.tab .net.tab .tab inside the 'custdomains' directory. If one of these files is found the incoming mail gets custom domain processing by executing commands that are stored in such a file. The format is: "command"[TAB]"arg-or-macro"[TAB]...[NEWLINE] These tables store commands (internals or externals) that have to be executed on the message file. The presence of one of these files is optional and if none exist the default processing is applied to the message via SMTP. Each argument can be a macro also (see [MACRO SUBSTITUTION]): FROM the sender of the message RCPT the target of the message FILE the message file path (the external command 'must only read' the file) MSGID the (XMail unique) message id MSGREF the reference SMTP message id TMPFILE creates a copy of the message file to a temporary one. It can be used with 'external' command but in this case it's external program's responsibility to delete the temporary file USERAUTH name of the SMTP authenticated user, or "-" if no authentication has been supplied Supported commands: [EXTERNAL] "external"[TAB]"priority"[TAB]"wait-timeout"[TAB]"command-path"[TAB]=> "arg-or-macro"[TAB]...[NEWLINE] where: external command keyword priority process priority: 0 = normal -1 = below normal +1 = above normal wait-timeout wait timeout for process execution in seconds: 0 = nowait Be careful if using $(FILE) to give the external command enough timeout to complete, otherwise the file will be removed by XMail while the command is processing. This is because such file is a temporary one that is deleted when XMail exits from file processing. In case the external command exit code will be '16', the command processing will stop and all the following commands listed inside the file will be skipped. [FILTER] "filter"[TAB]"priority"[TAB]"wait-timeout"[TAB]"command-path"[TAB]=> "arg-or-macro"[TAB]...[NEWLINE] where: filter command keyword priority process priority: 0 = normal -1 = below normal +1 = above normal wait-timeout wait timeout for process execution in seconds: 0 = nowait With filters, it is not suggested to use $(TMPFILE), since the filter will never have the ability to change the message content in that way. Also, to avoid problems very difficult to troubleshoot, it is suggested to give the filter 'ENOUGH' timeout to complete (90 seconds or more). See [MESSAGE FILTERS] for detailed information about return codes. In the filter command, the "Stop Filter Processing" return flag will make XMail to stop the execution of the current custom processing file. The 'filter' command will pass the message file to a custom external filter, that after inspecting it, has the option to accept, reject or modify it. Care should be taken to properly re-format the message after changing it, to avoid message corruption. The 'filter' command 'CANNOT' successfully change the private XMail's header part of the spool message. [REDIRECT] "redirect"[TAB]"domain-or-emailaddress"[TAB]...[NEWLINE] Redirect message to internal or external domain or email address. If the message was for foo-user@custdomain.net and the file custdomain.net.tab contains a line: "redirect" "target-domain.org" the message is delivered to 'foo-user@target-domain.org'. While the line: "redirect" "user@target-domain.org" redirects the message to user@target-domain.org. [LREDIRECT] "lredirect"[TAB]"domain-or-emailaddress"[TAB]...[NEWLINE] Redirect the message to internal or external domain (or email address) impersonating local domain during messages delivery. If the message was for foo-user@custdomain.net and the file custdomain.net.tab contains a line: "redirect" "target-domain.org" the message is delivered to 'foo-user@target-domain.org'. While the line: "redirect" "user@target-domain.org" redirects the message to 'user@target-domain.org'. The difference between "redirect" and "lredirect" is the following. Suppose A@B sends a message to C@D, that has a redirect to E@F. With "redirect" E@F will see A@B has sender while with "lredirect" he will see C@D. [SMTPRELAY] "smtprelay"[TAB]"server[:port][,options];server[:port][,options];..."[NEWLINE] Send mail to the specified SMTP server list by trying the first, if fails the second and so on. Otherwise You can use this syntax: "smtprelay"[TAB]"#server[:port][,options];server[:port][,options];..."[NEWLINE] to have XMail random-select the order the specified relays. Each gateway definition can also contain options as a comma-separated list (see [SMTP GATEWAY CONFIGURATION] for more information). [SMTP] "smtp"[NEWLINE] Do SMTP delivery. [top] CMD ALIASES CmdAliases implement aliases that are handled only through commands and can be thought of as a user level implementation of custom domain processing commands. The command set is the same of the one that is described above ("Custom domain mail processing") and won't be explained again here. For every handled domain (listed inside 'domains.tab') a directory with the same domain name is created inside the 'cmdaliases' subdirectory. This directory is automatically created and removed when you add/remove domains through the CTRL protocol (or 'CtrlClnt'). When a mail for 'USER@DOMAIN' is received by the server, the domain 'DOMAIN' is to be handled locally, and the standard users/aliases lookup fails, a file named 'USER.tab' is searched inside '$MAIL_ROOT/cmdaliases/DOMAIN'. If such file is found, commands listed inside the file (whose format must follow the one described in the previous section) are executed by the server as a matter of mail message processing. An important thing to remember is that all domain and user names, when applied to the file system, must be lower case. The use of the command '[SMTP]' must be implemented with great care because it could create mail loops within the server. [top] SERVER.TAB VARIABLES The following variables are for use int the "SERVER.TAB" configuration file. [RootDomain] Indicate the primary domain for the server. [SmtpServerDomain] If set, forces the domain name XMail uses inside the ESMTP greeting used to support CRAM-MD5 ESMTP authentication. [POP3Domain] Set the default domain for POP3 client connections. [PostMaster] Set the postmaster address. [ErrorsAdmin] The email address that receives notification messages for every message that has had delivery errors. If it is empty (allowed), the notification message is sent to the sender only. [TempErrorsAdmin] The email address that receives notification for temporary delivery failures. In case it's empty the notification message is sent to the sender only. [DefaultSMTPGateways] A semicolon separated list of SMTP servers XMail 'must' use to send its mails. The definition can also contain options as a comma-separated list (see [SMTP GATEWAY CONFIGURATION] for more information). Example: "192.168.0.1,NeedTLS=2;192.168.0.2" This has the precedence over MX records. [HeloDomain] If this variable is specified and is not empty, its content is sent as HELO domain. Otherwise the reverse lookup of the local IP is sent as HELO domain. This helps to deal with remote SMTP servers that are set to check the reverse lookup of the incoming IP. [CheckMailerDomain] Enable validation of the sender domain ('MAIL FROM:<...@xxx>') by looking up DNS/MX entries. [RemoveSpoolErrors] Indicate if mail has to be removed or stored in 'froz' directory after a failure in delivery or filtering. [NotifyMsgLinesExtra] Number of lines of the bounced message that have to be listed inside the notify message (lines after the headers section). Default is zero. [NotifySendLogToSender] Enable/Disable sending the message log file inside the notify message to the sender. Default is off (zero). [NotifyTryPattern] List of delivery attempts that require the system to send a notification to the sender (and eventually to 'TempErrorsAdmin'). The list is a comma separated list of numbers (with no extra spaces) as in: "1,4,9" Default is empty which means no notification is sent upon a delivery attempt failure. [AllowNullSender] Enable null sender ('MAIL FROM:<>') messages to be accepted by XMail. [NoSenderBounce] When building bounce messages, use the null SMTP sender ('MAIL FROM:<>') instead of the 'PostMaster' address. This will affect only the SMTP sender, while the message RFC822 headers will still contain the correct From: header. [MaxMTAOps] Set the maximum number of MTA relay steps before to declare the message as looped (default 16). [ReceivedHdrType] Set the verbosity of the Received: message headers tag. '0' Standard (client IP shown , server IP not). Default. '1' Verbose (client IP shown , server IP shown) '2' Strict (no IP shown) '3' Same as 0 but the client IP is not shown if the client authenticate itself. '4' Same as 1 but the client IP is not shown if the client authenticate itself. [FetchHdrTags] Set the list of headers tags to be used to extract addresses from POP3 fetched messages ("POP3LINKS.TAB"). This is a comma delimited list (no extra space or TABs must be included inside the list) as in: "+X-Deliver-To,To,Cc" Tags preceded by a '+' character make XMail stop scanning when an address is found inside the header tag. Tags preceded by a '+' character must be listed before other tags. The string "+X-Deliver-To,To,Cc" is the default if nothing is specified. [SMTP-MaxErrors] Set the maximum number of errors allowed in a single SMTP session. When the maximum number of allowed errors is exceeded, the connection will be automatically dropped. If such variable is not set, or it is set to zero, the maximum number of errors will be unlimited. [SmtpMsgIPBanSpammers] Used to set the message that is sent to the SMTP client when the client IP is listed inside the file SPAMMER.TAB. [SmtpMsgIPBanSpamAddress] Used to set the message that is sent to the SMTP client when the client IP is listed inside the file SPAM-ADDRESS.TAB. [SmtpMsgIPBanMaps] Used to set the message that is sent to the SMTP client when the client IP is listed inside one of the "CustMapsList". [SmtpMsgIPBan] Used to set the message that is sent to the SMTP client when the client IP is listed inside the file SMTP.IPMAP.TAB. [CustomSMTPMessage] Set this to the message that you want to follow the standard SMTP error response sent by XMail, as in (one line, remember the =>): "Please open http://www.xmailserver.test/smtp_errors.html to get=> more information about this error" Please be aware the RFC821 fix the maximum reply line length to 512 bytes. [SMTP-IpMapDropCode] Set the drop code for IPs blocked by the SMTP.IPMAP.TAB file: '1' the connection is dropped soon "0" the connection is kept alive but only authenticated users can send mail '-S' the peer can send messages but a delay of S seconds is introduced between commands [AllowSmtpVRFY] Enable the use of VRFY SMTP command. This flag may be forced by SMTP authentication. [AllowSmtpETRN] Enable the use of ETRN SMTP command. This flag may be forced by SMTP authentication. [SmtpMinDiskSpace] Minimum disk space (in Kb) that is requested before accepting an SMTP connection. [SmtpMinVirtMemSpace] Minimum virtual memory (in Kb) that is requested before accepting an SMTP connection. [Pop3MinVirtMemSpace] Minimum virtual memory (in Kb) that is requested before accepting a POP3 connection. [Pop3SyncErrorAccount] This defines the email account (MUST be handled locally) that receives all fetched email that XMail has not been able to deliver. [EnableAuthSMTP-POP3] Enable SMTP after POP3 authentication (default on). [MaxMessageSize] Set the maximum message size in Kb that is possible to send through the server. [DefaultSmtpPerms] This list SMTP permissions assigned to users looked up inside "MAILUSERS.TAB" during SMTP authentication. It also defines the permissions for users authenticated with SMTP after POP3. [CustMapsList] This is a list a user can use to set custom maps checking. The list has the given (strict) format: maps-root:code,maps-root:code... Where maps-root is the root for the DNS query (i.e. dialups.mail-abuse.org.) and the code can be: '1' the connection is dropped soon "0" the connection is kept alive but only authenticated users can send mail '-S' the peer can send messages but a delay of S seconds is introduced between commands [SMTP-RDNSCheck] Indicate if XMail must do an RDNS lookup before accepting a incoming SMTP connection. If 0, the check is not performed; if 1 and the check fails, the user receives a 'server use forbidden' at MAIL_FROM time; if -S (S > 0) and the check fails, a delay of S seconds between SMTP commands is used to prevent massive spamming. SMTP authentication overrides the denial set by this option by giving authenticated users the ability to access the server from 'mapped' IPs. [SmartDNSHost] Setup a list of smart DNS hosts to which are directed DNS queries with recursion bit set to true. Such DNS hosts must support DNS recursion in queries. The format is: dns.home.bogus.net:tcp,192.168.1.1:udp,... [DisableEmitAuthUser] Enable/disable the emission the the 'X-AuthUser:' mail header for authenticated users. Valid values are "0" or '1', default is "0" (emission enabled). [SmtpGwConfig] Sets global SMTP gateway options. Those can be overridden by specific gateway options. See [SMTP GATEWAY CONFIGURATION] for information. [Pop3LogPasswd] Control if POP3 passwords are logged into the POP3 log file. Set to "0" to disable password logging, set to "1" to enable logging of failed logins, and the to "2" to always enable password logging. Default is "0". [SmtpNoTLSAuths] Lists a comma-separated sequence of SMTP authentications that are allowed while the connections is in non-TLS mode (clear text). Do not set this variable if you do not want to impose any restriction, or set it to the empty string if you do not want any authentication method to be allowed in clear-text mode. [EnableCTRL-TLS] Enable CTRL TLS negotiation (default "1"). [EnablePOP3-TLS] Enable POP3 TLS (STLS) negotiation (default "1"). [EnableSMTP-TLS] Enable SMTP TLS (STARTTLS) negotiation (default "1"). [SSLUseCertsFile] [SSLUseCertsDir] [SSLWantVerify] [SSLAllowSelfSigned] [SSLWantCert] [SSLMaxCertsDepth] See [SSL CONFIGURATION] for information. [SmtpConfig] Default SMTP server config loaded if specific server IP[,PORT] config is not found. [SmtpConfig-IP | SmtpConfig-IP,PORT] Specific IP or IP,PORT SMTP server config. Examples: "SmtpConfig-192.168.1.123" "..." "SmtpConfig-192.168.1.17,1025" "..." The variable value is a comma separated sequence of configuration tokens whose meaning is: MailAuth authentication required to send mail to the server. Please note that by setting this value everything requires authentication, even for sending to local domains, and this is probably not what you want. The "mail-auth" is also synonym of "MailAuth". WantTLS TLS connection needed to talk to this server. This is either done by issuing a STARTTLS command over a standard SMTP session, or by using an SMTPS port [top] MESSAGE FILTERS This feature offers a way to filter messages by providing the ability to execute external programs, such as scripts or real executables. These 'filters' may examine and/or modify messages and inform XMail of their actions with a return value. This feature offers the ability to inspect and modify messages, giving a way to reject messages based on content, alter messages (address rewriting) and so on. If this filters returns '4, 5 or 6' the message is rejected and is stopped in its travel. If the filter modifies the message it must return '7'. Additional flags are allowed to be returned to XMail as a result of filter processing by adding the flags value to the exits code above listed. The currently defined flags are : '16' Stop selected filter list processing. Filter flags are additive and if more than one flag need to be specified, their values must be added together. If a filter "raw" exit code is RC and the filter needs to return extra flags FILTER-SUM, the final return code FRC must be : FRC = RC + FILTER-SUM Example. Suppose a filter modified the message and hence needs to return 7 as return code. Suppose also that a filter wants to block the filter selection list processing by specifying a flags value of 16, the value to be returned will be : FRC = 7 + 16 = 23 Filter selection is driven by two files 'FILTERS.IN.TAB' and 'FILTERS.OUT.TAB' located inside the $MAIL_ROOT/ directory and that have the following format: "sender"[TAB]"recipient"[TAB]"remote-addr"[TAB]"local-addr"[TAB]"filename"[NEWLINE] For example: "*@bad-domain.com" "*" "0.0.0.0/0" "0.0.0.0/0" "av-filter.tab" "*" "clean@purified.net" "0.0.0.0/0" "0.0.0.0/0" "spam-block.tab" "*" "*" "192.168.1.0/24" "0.0.0.0/0" "archive.tab" where the file "av-filter.tab" must be present inside the $MAIL_ROOT/filters directory. The "sender" and the "recipient" are resolved to the real account when possible. Address selection mask are formed by an IP address (network) plus the number of valid bits inside the network mask. The file 'FILTERS.IN.TAB' lists filters that have to be applied to inbound messages (going to local mailboxes) while the file 'FILTERS.OUT.TAB' lists filters that have to be applied to outbound messages (delivered remotely). All four (sender+recipient+remote-addr+local-addr) selection fields must have a match in order "filename" to be evaluated. The syntax of the filter file is: "command"[TAB]"arg-or-macro"[TAB]...[NEWLINE] or: "!flags"[TAB]"command"[TAB]"arg-or-macro"[TAB]...[NEWLINE] Each file may contain multiple commands, that will be executed in strictly sequential order. The first command that will trigger a rejection code will make the filtering process to end. The 'flags' parameter is a comma-separated list of flags that drives the filter execution. The syntax of each flag is either FLAG or FLAG=VAL. Currently supported flags are: aex exclude filter execution in case of authenticated sender wlex exclude filter execution in case the client IP is white-listed inside the SMTP.IPPROP.TAB file. This flag works only for SMTP filters. timeo sets the timeout value for this filter execution Each argument can be a macro also (see [MACRO SUBSTITUTION]): FROM the sender of the message RFROM the sender of the message resolved to the real account, when possible (alias resolution) RCPT the target of the message RRCPT the target of the message resolved to the real account, when possible (alias resolution) REMOTEADDR remote IP address and port of the sender LOCALADDR local IP address and port where the message has been accepted FILE the message file path (the external command may modify the file if it returns '7' as command exit value.) MSGID with the (XMail unique) message id MSGREF the reference SMTP message id USERAUTH name of the SMTP authenticated user, or "-" if no authentication has been supplied Here 'command' is the name of an external program that processes the message and returns its processing result. If it returns '6' the message is rejected and a notification message is sent to the sender. By returning '5' the message is rejected without notification. While returning '4' the message is rejected without notification and without being frozen (a '5' response could lead to a frozen message if the "SERVER.TAB" configuration enables this). If all filters return values different from '6, 5 and 4' the message continues its trip. The filter command may also modify the file (AV scanning, content filter, message rewriting, etc) by returning '7'. The filter 'MUST' return '7' in case it modifies the message. If the filter changes the message file it 'MUST' keep the message structure and it 'MUST' terminate all line with . The filter has also the ability to return a one-line custom return message by creating a file named $(FILE).rej holding the message in the very first line. This file should be created 'ONLY' when the filter returns a rejection code ('6, 5 and 4')and 'NEVER' in case of passthrough code ('7') or modify code. The spool files has this structure: Info Data [ 1th line ] SmtpDomain [ 2nd line ] SmtpMessageID [ 3rd line ] MAIL FROM:<...> [ 4th line ] RCPT TO:<...> [ 5th line ] <> [ 6th line ] ... After the '<>' tag (5th line) the message follows. The message is composed of a headers section and, after the first empty line, the message body. The format of the "Info Data" line is: [ClientIP]:ClientPort;[ServerIP]:ServerPort;Time 'EXTREME' care must be used when modifying the message because the filter will be working on the real message, and a badly reformatted file will lead to message loss. The spool file header (any data before <>) 'MUST' be preserved as is by the filter in case of message rewrite happens. [top] SMTP MESSAGE FILTERS Besides having the ability to perform off-line message filtering, XMail gives the user the power to run filters during the SMTP session. Three files drive the SMTP on-line filtering, and these are 'FILTERS.POST-RCPT.TAB', 'FILTERS.PRE-DATA.TAB' and 'FILTERS.POST-DATA.TAB'. The file 'FILTERS.POST-RCPT.TAB', contains one or more commands to be executed after the remote SMTP client sends the RCPT_TO command(s), and before XMail sends the response to the command. The file 'FILTERS.PRE-DATA.TAB' contains one or more commands to be executed after the remote SMTP client sends the DATA command, and before XMail sends the response to the command. Using such filters, the user can tell XMail if or if not accept the following transaction and, in case of rejection, the user is also allowed to specify a custom message to be sent to the remote SMTP client. The file 'FILTERS.POST-DATA.TAB' contains one or more commands to be executed after XMail received the whole client DATA, and before XMail sends the final response to the DATA command (final messages ack). The files 'FILTERS.POST-RCPT.TAB', 'FILTERS.PRE-DATA.TAB' and 'FILTERS.POST-DATA.TAB' contains zero or more lines with the following format: "command"[TAB]"arg-or-macro"[TAB]...[NEWLINE] or: "!flags"[TAB]"command"[TAB]"arg-or-macro"[TAB]...[NEWLINE] Each file may contain multiple commands, that will be executed in strictly sequential order. The first command that will trigger a rejection code will make the filtering process to end. The 'flags' parameter is a comma-separated list of flags that drives the filter execution. The syntax of each flag is either FLAG or FLAG=VAL. Currently supported flags are: aex exclude filter execution in case of authenticated sender wlex exclude filter execution in case the client IP is white-listed inside the SMTP.IPPROP.TAB file. Each argument can be a macro also (see [MACRO SUBSTITUTION]): FILE message file path USERAUTH name of the SMTP authenticated user, or "-" if no authentication has been supplied REMOTEADDR remote IP address and port of the sender LOCALADDR local IP address and port where the message has been accepted FROM message sender address CRCPT last recipient submitted by the client. For post-rcpt filters, this will be used as to-validate recipient RRCPT last recipient submitted by the client, translated to the real account (in case of aliases) Filter commands have the ability to inspect and modify the content of the message (or info) file. The exit code of commands executed by XMail are used to tell XMail the action that has to be performed as a consequence of the filter. The exit code is composed by a raw exit code and additional flags. Currently defined flags are: '16' Stop selected filter list processing. Currently defined raw exit codes are: '3' Reject the message. Any other exit codes will make XMail to accept the message, and can be used also when changing the content of the $(FILE) file. 'EXTREME' care must be used when changing the $(FILE) file, since XMail expect the file format to be correct. Also, it is important to preserve the line termination of the file itself. When rejecting the message, the filter command has the ability to specify the SMTP status code that XMail will send to the remote SMTP client, by creating a file named $(FILE).rej containing the message in the very first line. Such file will be automatically removed by XMail. The data passed to filter commands inside $(FILE) varies depending if the command is listed inside 'FILTERS.POST-RCPT.TAB', 'FILTERS.PRE-DATA.TAB' or inside 'FILTERS.POST-DATA.TAB'. Commands listed inside 'FILTERS.POST-RCPT.TAB' and 'FILTERS.PRE-DATA.TAB' will receive the following data stored inside $(FILE): Info Data [ 1th line ] SmtpDomain [ 2nd line ] SmtpMessageID [ 3rd line ] MAIL FROM:<...> [ 4th line ] RCPT TO:<...> {...} [ 5th line ] ... The file can have one or more "RCPT TO" lines. The format of the "Info Data" line is: ClientDomain;[ClientIP]:ClientPort;ServerDomain;[ServerIP]:ServerPort;Time;Logo Note that in case of 'FILTERS.POST-RCPT.TAB', the $(FILE) data does not yet contain the current recipient to be validated. This needs to be fetched and passed to the external program using the $(CRCPT) macro (or $(RRCPT)). Commands listed inside 'FILTERS.POST-DATA.TAB' will receive the following data stored inside $(FILE): Info Data [ 1th line ] SmtpDomain [ 2nd line ] SmtpMessageID [ 3rd line ] MAIL FROM:<...> [ 4th line ] RCPT TO:<...> {...} [ 5th line ] ... <> ... After the '<>' tag the message follows. The message is composed of a headers section and, after the first empty line, the message body. The format of the RCPT line is: RCPT TO:
{ra=real-address} where "real-address" is the "address" after it has been translated (if aliases applies) to the real local address. Otherwise it holds the same value of "address". In case one or more SMTP filter operations are not needed, avoid to create zero sized files altogether, since this will result in faster processing. [top] USER.TAB VARIABLES The following variables are for use in the "USER.TAB" configuration file. [RealName] Full user name, i.e.: "RealName" "Davide Libenzi" [HomePage] User home page, i.e.: "HomePage" "http://www.xmailserver.org/davide.html" [MaxMBSize] Max user mailbox size in Kb, i.e.: "MaxMBSize" "30000" [ClosedML] Specify if the mailing list is closed only to subscribed users, i.e.: "ClosedML" "1" [ListSender] Specify the mailing list sender or administrator: "ListSender" "ml-admin@xmailserver.org" This variable should be set to avoid delivery error notifications to reach the original message senders. [SmtpPerms] User SMTP permissions (see SMTPAUTH.TAB for info). [ReceiveEnable] Set to '1' if the account can receive email, '0' if you want to disable the account from receiving messages. [PopEnable] Set to '1' if you want to enable the account to fetch POP3 messages, '0' otherwise. [UseReplyTo] Enable/Disable the emission of the Reply-To: header for mailing list's messages (default 1). [MaxMessageSize] Set the maximum message size (in Kb) that the user is able to send through the server. Overrides the SERVER.TAB variable. [DisableEmitAuthUser] Enable/disable the emission the the 'X-AuthUser:' mail header for authenticated users. Valid values are '0' or '1', default is '0' (emission enabled). This variable overrides the SERVER.TAB one when present. [Pop3ScanCur] In case of Maildir mailbox structure, scan the "cur" directory during POP3 message list build. Set to "0" to disable "cur" directory scanning, or to "1" to enable it. [top] MAIL ROUTING THROUGH ADDRESSES A full implementation of SMTP protocol allows the ability to perform mail routing bypassing DNS MX records by means of setting, in a ruled way, the 'RCPT TO: <>' request. A mail from 'xuser@hostz' directed to '@hosta,@hostb:foouser@hostc' is received by '@hosta' then sent to '@hostb' using 'MAIL FROM: <@hosta:xuser@hostz>' and 'RCPT TO: <@hostb:foouser@hostc>'. The message is then sent to '@'hostc using 'MAIL FROM: <@hostb,@hosta:xuser@hostz>' and 'RCPT TO: '. [top] XMAIL SPOOL DESIGN The new spool filesystem tree format has been designed to enable XMail to handle very large queues. Instead of having a single spool directory (like versions older than 0.61) a two layer deep splitting has been introduced so that its structure is: 0 0 mess rsnd info temp slog cust froz ... ... When XMail needs to create a new spool file a spool path is chosen in a random way and a new file with the format: mstime.tid.seq.hostname is created inside the 'temp' subdirectory. When the spool file is ready to be committed, it's moved into the 'mess' subdirectory that holds newer spool files. If XMail fails sending a new message (the ones in mess subdirectory) it creates a log file (with the same name of the message file) inside the 'slog' subdirectory and move the file from 'mess' to 'rsnd'. During the message sending the message itself is locked by creating a file inside the 'lock' subdirectory (with the same name of the message file). If the message has permanent delivery errors or is expired and if the option 'RemoveSpoolErrors' of the 'SERVER.TAB' file is off, the message file is moved into the 'froz' subdirectory. [top] SMTP GATEWAY CONFIGURATION An SMTP gateway definition inside XMail can be followed by a set of configuration options, that are in the form of a comma-separated VAR=VAL or FLAG definitions. Currently defined options are: NeedTLS If set to 1, instruct XMail to try to establish a TLS session with the remote host (by the means of a STARTTLS SMTP command). If set to 2, XMail will try to establish a TLS session, but it will fail if not able to do so (the remote server does not support STARTTLS, or reject our attempt to negotiate the TLS link). OutBind Sets the IP address of the network interface that should be used when connecting to the remote host. This configuration should be used carefully, because XMail will fail if the selected IP of the interface does not have a route to the remote host using such IP. [top] SSL CONFIGURATION XMail uses to identify itself during SSL negotiations, by the mean of the two files 'server.cert' and 'server.key'. These files 'MUST' be available inside the 'MAIL_ROOT' directory. Both are in PEM format, and one represent the server certificate file/chain ('server.cert') while the other represent the server private key file ('server.key'). XMail uses the OpenSSL libraries for its SSL operations. contains examples about how to create certificates to be use by XMail, while describes own to generate keys. In order to properly manage your XMail server when using SSL support, you need to have access to the OpenSSL binary. For Unix ports, this is available as a package, whose name varies depending on the distribution. For Windows, pre-built versions of theOpenSSL libraries and binary are supplied inside the "win32ssl" directory of the XMail source package. For example, to create a self-signed certificate, you first have to create a private key with: $ openssl genrsa 2048 > server.key After you have created the private key, you can create you own copy of the self-signed certificate with: $ openssl req -new -x509 -key server.key -out server.cert C:> openssl req -new -x509 -key server.key -out server.cert -config openssl.cnf Remeber that the Common Name (CN) that you supply to the OpenSSL binary, is the fully qualified host name that answers to the IP where your XMail server is listening. If you want to have a certificate signed by an authority, you need to generate a certificate request file: $ openssl req -new -key server.key -out cert.csr C:> openssl req -new -key server.key -out cert.csr -config openssl.cnf The 'openssl.cnf' file is supplied inside the Xmail's Windows binary package, and inside the 'win32ssl\conf' directory of the source package. The 'cert.csr' file needs then to be submitted to the certificate authority in order to obtain a root-signed certificate file (that will be your 'server.cert'). The behaviour of the XMail SSL module is controlled by a few 'SERVER.TAB' variables: [SSLWantVerify] Tells the SSL link negotiation code to verify the remote peer certificate. If this is enabled, you need to use either SSLUseCertsFile or SSLUseCertsDir to provide a set of valid root certificates. You can also add your own certificates in the set, in order to provide access to your servers by clients using certificates signed by you. [SSLWantCert] Tells the SSL link negotiation code to fail if the remote peer does not supply a certificate. [SSLAllowSelfSigned] Allows self-signed certificates supplied by remote peers. [SSLMaxCertsDepth] Set the maximum certificate chain depth for the verification process. [SSLUseCertsFile] When using SSLWantVerify, the SSL code will verify the peer certificate using standard SSL certificate chain verification rules. It is possible to supply to XMail an extra list of valid certificates, by filling up a 'CERTS.PEM' file and setting SSLUseCertsFile to 1. The 'CERTS.PEM' is a concatenation of certificates in PEM format. [SSLUseCertsDir] In the same way as SSLUseCertsFile does, setting SSLUseCertsDir to 1 enables the usage of extra valid certificates stored inside the 'CERTS' XMail sub-directory. The 'CERTS' contains hashed file names that are created by feeding the directory path to the 'c_rehash' OpenSSL Perl script (a Windows-friendly version of 'c_rehash', named 'c_rehash.pl' is contained inside the 'win32ssl\bin' subdirectory of the source package). Unix users will find proper CA certificates inside the standard install paths of OpenSSL, while Windows users will find them inside the 'win32ssl\certs' subdirectory of the source package. To use 'c_rehash' you need to have the OpenSSL binaries (executable and shared libraries) correctly installed in your system, and the executable reachable from your PATH. Then you simply run it by passing the path to the PEM certificates directory ('CERTS'). The 'c_rehash' script will call the OpenSSL binary and will generated hashed file names (that are either symlinks or copies) that point/replicate the mapped certificate. [top] SMTP COMMANDS These are commands understood by ESMTP server: MAIL FROM:<> RCPT TO:<> DATA HELO EHLO STARTTLS AUTH RSET VRFY ETRN NOOP HELP QUIT [top] POP3 COMMANDS These are commands understood by POP3 server: USER PASS CAPA STLS APOP STAT LIST UIDL QUIT RETR TOP DELE NOOP LAST RSET [top] COMMAND LINE Most of XMail configuration settings are command line tunables. These are command line switches organized by server. [XMAIL] -Ms pathname Mail root path (also settable with MAIL_ROOT environment). -Md Activate debug (verbose) mode. -Mr hours Set log rotate hours step. -Mx split-level Set the queue split level. The value you set here is rounded to the lower prime number higher or equal than the value you've set. -MR bytes Set the size of the socket's receive buffer in bytes (rounded up to 1024). -MS bytes Set the size of the socket's send buffer in bytes (rounded up to 1024). -MM Setup XMail to use 'Maildir' delivery (default on Unix). -Mm Setup XMail to use 'mailbox' delivery (default on Windows). -MD ndirs Set the number of subdirectories allocated for the DNS cache files storage ( default 101 ). -M4 Use only IPV4 records for host name lookups (default). -M6 Use only IPV6 records for host name lookups. -M5 Use IPV4 records if present, or IPV6 records otherwise, for host name lookups. -M7 Use IPV6 records if present, or IPV4 records otherwise, for host name lookups. [POP3] -P- Disable the service. -P6 Bind to IPV6 address (in case no -PI option is specified) -Pp port Set POP3 server port (if you change this you must know what you're doing). -Pt timeout Set POP3 session timeout (seconds) after which the server closes. the connection if it does not receive any commands. -Pl Enable POP3 logging. -Pw timeout Set the delay timeout in response to a bad POP3 login. Such time is doubled at the next bad login. -Ph Hang the connection in bad login response. -PI ip[:port] Bind server to the specified ip address and (optional) port (can be multiple). -PX nthreads Set the maximum number of threads for POP3 server. [POP3S] -B- Disable the service. -B6 Bind to IPV6 address (in case no -BI option is specified) -Bp port Set POP3S server port (if you change this you must know what you're doing). -BI ip[:port] Bind server to the specified ip address and (optional) port (can be multiple). [SMTP] -S- Disable the service. -S6 Bind to IPV6 address (in case no -SI option is specified) -Sp port Set SMTP server port (if you change this you must know what you're doing). -St timeout Set SMTP session timeout (seconds) after which the server closes the connection if no commands are received. -Sl Enable SMTP logging. -SI ip[:port] Bind server to the specified ip address and (optional) port (can be multiple). -SX nthreads Set the maximum number of threads for SMTP server. -Sr maxrcpts Set the maximum number of recipients for a single SMTP message (default 100). -Se nsecs Set the expire timeout for a POP3 authentication IP (default 900). [SMTPS] -X- Disable the service. -X6 Bind to IPV6 address (in case no -XI option is specified) -Xp port Set SMTPS server port (if you change this you must know what you're doing). -XI ip[:port] Bind server to the specified ip address and (optional) port (can be multiple). [SMAIL] -Qn nthreads. Default 16, maximum 256. Set the number of mailer threads. -Qt timeout Set the time to be wait for a next try after send failure. Default 480. -Qi ratio Set the increment ratio of the reschedule time in sending a messages. At every failure in delivery a message, reschedule time T is incremented by (T / ratio), therefore : T(i) = T(i-1) + T(i-1)/ratio. If you set this ratio to zero, T remain unchanged over delivery tentatives. Default 16. -Qr nretries Set the maximum number of times to try to send the message. Default 32. -Ql Enable SMAIL logging. -QT timeout Timeout value for filters commands in seconds. Default 90. -Qg Enable filter logging. [PSYNC] -Y- Disable the service. -Yi interval Set external POP3 accounts sync interval. Setting this to zero will disable the PSYNC task. Default 120. -Yt nthreads Set the number of POP3 sync threads. -YT nsec Sets the timeout for POP3 client connections. -Yl Enable PSYNC logging. [FINGER] -F- Disable the service. -F6 Bind to IPV6 address (in case no -FI option is specified) -Fp port Set FINGER server port (if you change this you must know what you're doing). -Fl Enable FINGER logging. -FI ip[:port] Bind server to the specified ip address and (optional) port (can be multiple). [CTRL] -C- Disable the service. -C6 Bind to IPV6 address (in case no -CI option is specified) -Cp port Set CTRL server port (if you change this you must know what you're doing). -Ct timeout Set CTRL session timeout (seconds) after which the server closes the connection if no commands are received. -Cl Enable CTRL logging. -CI ip[:port] Bind server to the specified ip address and (optional) port (can be multiple). -CX nthreads Set the maximum number of threads for CTRL server. [CTRLS] -W- Disable the service. -W6 Bind to IPV6 address (in case no -WI option is specified) -Wp port Set CTRLS server port. -WI ip[:port] Bind server to the specified ip address and (optional) port (can be multiple). [LMAIL] -Ln nthreads Set the number of local mailer threads. -Lt timeout Set the sleep timeout for LMAIL threads (in seconds, default 2). -Ll Enable local mail logging. [top] XMAIL ADMIN PROTOCOL It's possible to remote admin XMail due to the existence of a 'controller server' that runs with XMail and waits for TCP/IP connections on a port (6017 or tunable via a '-Cp nport') command line option. Admin protocol details: "Description" "Adding a user" "Deleting a user" "Changing a user's password" "Authenticate user" "Retrieve user statistics" "Adding an alias" "Deleting an alias" "Listing aliases" "Listing user vars" "Setting user vars" "Listing users" "Getting mailproc.tab file" "Setting mailproc.tab file" "Adding a mailing list user" "Deleting a mailing list user" "Listing mailing list users" "Adding a domain" "Deleting a domain" "Listing handled domains" "Adding a domain alias" "Deleting a domain alias" "Listing alias domains" "Getting custom domain file" "Setting custom domain file" "Listing custom domains" "Adding a POP3 external link" "Deleting a POP3 external link" "Listing POP3 external links" "Enabling a POP3 external link" "Listing files" "Getting configuration file" "Setting configuration file" "Listing frozen messages" "Rescheduling frozen message" "Deleting frozen message" "Getting frozen message log file" "Getting frozen message" "Starting a queue flush" "Do nothing command" "Quit the connection" "Do you want...?" Description The XMail admin server 'speaks' a given protocol that can be used by external GUI utilities written with the more disparate scripting languages, to remote administer the mail server. The protocol is based on sending formatted command and waiting for formatted server responses and error codes. All the lines, commands, and responses are delimited by a pair. The error code string (I'll call it RESSTRING) has the given format: "+DDDDD OK" if the command execution is successful while: "-DDDDD ErrorString" if the command failed. The " character is not included in responses. DDDDD is a numeric error code while ErrorString is a description of the error. If DDDDD equals 00100, a lines list, terminated by a line with a single point (.), follows the response. The input format for commands is similar to the one used in TAB files: "cmdstring"[TAB]"param1"[TAB]..."paramN" where 'cmdstring' is the command string identifying the action to be performed, and param1,... are the parameters of the command. Immediately after the connection with XMail controller server is established the client receives a RESSTRING that is: +00000 XMail ... if the server is ready, while: -DDDDD ... (where DDDDDD is an error code) if not. The TimeStamp string has the format: currtime.pid@ipaddress and is used in MD5 authentication procedure. As the first action immediately after the connection the client must send an authentication string with this format: "user"[TAB]"password" where user must be enabled to remote admin XMail. Clear text authentication should not be used due server security. Using MD5 authentication instead, the client must perform an MD5 checksum on the string composed by (<> included): password and then send to the server: "user"[TAB]"#md5chksum" where md5chksum is the MD5 checksum (note '#' as first char of sent digest). The result of the authentication send is a RESSTRING. If the user does not receive a positive authentication response, the connection is closed by the server. It is possible to establish an SSL session with the server by issuing the "#!TLS" string as login string. In response to that, the server will send back a RESSTRING. In case of success RESSTRING, the client can proceed with the SSL link negotiation with the server. [admin protocol] [top] Adding a user "useradd"[TAB]"domain"[TAB]"username"[TAB]"password"[TAB]"usertype" where: domain domain name (must be handled by the server). username username to add. password user password. usertype 'U' for normal user and 'M' for mailing list. The result is a RESSTRING. [admin protocol] [top] Deleting a user "userdel"[TAB]"domain"[TAB]"username" where: domain domain name (must be handled by the server). username username to delete. The result is a RESSTRING. [admin protocol] [top] Changing a user's password "userpasswd"[TAB]"domain"[TAB]"username"[TAB]"password" where: domain domain name (must be handled by the server). username username (must exist). password new password. The result is a RESSTRING. [admin protocol] [top] Authenticate user "userauth"[TAB]"domain"[TAB]"username"[TAB]"password" where: domain domain name. username username. password password. The result is a RESSTRING. [admin protocol] [top] Retrieve user statistics "userstat"[TAB]"domain"[TAB]"username" where: domain domain name. username username/alias. The result is a RESSTRING. If successful (00100), a formatted matching users list follows terminated by a line containing a single dot (.). This is the format of the listing: "variable"[TAB]"value" Where valid variables are: RealAddress real address (maybe different is the supplied username is an alias). MailboxSize total size of the mailbox in bytes. MailboxMessages total number of messages. LastLoginIP last user login IP address. LastLoginTimeDate time of the last login. [admin protocol] [top] Adding an alias "aliasadd"[TAB]"domain"[TAB]"alias"[TAB]"account" where: domain domain name (must be handled by the server). alias alias to add. account real email account (locally handled). This can be a fully qualified email address or a username inside the same domain. The result is a RESSTRING. [admin protocol] [top] Deleting an alias "aliasdel"[TAB]"domain"[TAB]"alias" where: domain domain name (must be handled by the server). alias alias to delete. The result is a RESSTRING. [admin protocol] [top] Listing aliases "aliaslist"[TAB]"domain"[TAB]"alias"[TAB]"account" or "aliaslist"[TAB]"domain"[TAB]"alias" or "aliaslist"[TAB]"domain" or "aliaslist" where: domain domain name, optional (can contain wild cards). alias alias name, optional (can contain wildcards). account account, optional (can contain wildcards). Example: "aliaslist"[TAB]"foo.bar"[TAB]"*"[TAB]"mickey" lists all aliases of user 'mickey' in domain 'foo.bar'. The result is a RESSTRING. In successful cases (00100) a formatted matching users list follows, terminated by a line containing a single dot (.). This is the format of the listing: "domain"[TAB]"alias"[TAB]"username" [admin protocol] [top] Adding an external alias "exaliasadd"[TAB]"local-address"[TAB]"remote-address" where: local-address local email address. remote-address remote email address. For example, the following command string: "exaliasadd"[TAB]"dlibenzi@home.bogus"[TAB]"dlibenzi@xmailserver.org" will link the external email address 'dlibenzi@xmailserver.org' with the local email address 'dlibenzi@home.bogus'. The result is a RESSTRING. [admin protocol] [top] Deleting an external alias "exaliasdel"[TAB]"remote-address" where: remote-address remote email address. The result is a RESSTRING. [admin protocol] [top] Listing external aliases "exaliaslist"[TAB]"local-address"[TAB]"remote-address" or "exaliaslist"[TAB]"local-address" or "exaliaslist" where: local-address local email address. This can contain wildcard characters. remote-address remote email address. This can contain wildcard characters. Example: "exaliaslist"[TAB]"*@home.bogus" lists all the external aliases linked to local accounts in domain 'home.bogus'. The result is a RESSTRING. In successful cases (00100) a formatted matching users list follows, terminated by a line containing a single dot (.). This is the format of the listing: "rmt-domain"[TAB]"rmt-name"[TAB]"loc-domain"[TAB]"loc-name" [admin protocol] [top] Listing user vars "uservars"[TAB]"domain"[TAB]"username" where: domain domain name. username username. The result is a RESSTRING. In successfully cases (00100) a formatted list of user vars follow, terminated by a line containing a single dot (.). This is the format of the listing: "varname"[TAB]"varvalue" [admin protocol] [top] Setting user vars "uservarsset"[TAB]"domain"[TAB]"username"[TAB]"varname"[TAB]"varvalue" ... where: domain domain name. username username. varname variable name. varvalue variable value. There can be multiple variable assignments with a single call. If 'varvalue' is the string '.|rm' the variable 'varname' is deleted. The result is a RESSTRING. [admin protocol] [top] Listing users "userlist"[TAB]"domain"[TAB]"username" or "userlist"[TAB]"domain" or "userlist" where: domain domain name, optional (can contain wild cards). username username, optional (can contain wild cards). Example: "userlist"[TAB]"spacejam.foo"[TAB]"*admin" lists all users of domain 'spacejam.foo' that end with the word 'admin'. The result are a RESSTRING. If successful (00100), a formatted matching users list follows terminated by a line containing a single dot (.). This is the format of the listing: "domain"[TAB]"username"[TAB]"password"[TAB]"usertype" [admin protocol] [top] Getting mailproc.tab file "usergetmproc"[TAB]"domain"[TAB]"username" or "usergetmproc"[TAB]"domain"[TAB]"username"[TAB]"flags" where: domain domain name. username username. flags flags specifying which mailproc to retrieve. Use 'U' for user mailproc, or 'D' for domain mailproc (or 'DU' for a merge of both). If not specified, 'DU' is assumed. Example: "usergetmproc"[TAB]"spacejam.foo"[TAB]"admin" gets mailproc.tab file for user 'admin' in domain 'spacejam.foo'. The result is a RESSTRING. In successful cases (00100) the mailproc.tab file is listed line by line, terminated by a line containing a single dot (.). [admin protocol] [top] Setting mailproc.tab file "usersetmproc"[TAB]"domain"[TAB]"username" or "usersetmproc"[TAB]"domain"[TAB]"username"[TAB]"which" where: domain domain name. username username. which which mailproc.tab should be set. Use 'U' for the user one, and 'D' for the domain one. If not specified, 'U' is assumed. Example: "usersetmproc"[TAB]"spacejam.foo"[TAB]"admin" sets mailproc.tab file for user 'admin' in domain 'spacejam.foo'. The result is a RESSTRING. If successful (00101), the client must list the mailproc.tab file line by line, ending with a line containing a single dot (.). If a line of the file begins with a dot, another dot must be added at the beginning of the line. If the file has zero length the mailproc.tab is deleted. The client then gets another RESSTRING indicating the final command result. [admin protocol] [top] Adding a mailing list user "mluseradd"[TAB]"domain"[TAB]"mlusername"[TAB]"mailaddress"[TAB]"perms" or "mluseradd"[TAB]"domain"[TAB]"mlusername"[TAB]"mailaddress" where: domain domain name (must be handled by the server). mlusername mailing list username. mailaddress mail address to add to the mailing list 'mlusername@domain'. perms user permissions (R or RW or RA). When 'perms' is not specified the default is RW. The result is a RESSTRING. [admin protocol] [top] Deleting a mailing list user "mluserdel"[TAB]"domain"[TAB]"mlusername"[TAB]"mailaddress" where: domain domain name (must be handled by the server). mlusername mailing list username. mailaddress mail address to delete from the mailing list 'mlusername@domain'. The result is a RESSTRING. [admin protocol] [top] Listing mailing list users "mluserlist"[TAB]"domain"[TAB]"mlusername" where: domain domain name (must be handled by the server). mlusername mailing list username. The result is a RESSTRING. If successful (00100), a formatted list of mailing list users follows terminated by a line containing a single dot (.). [admin protocol] [top] Adding a domain "domainadd"[TAB]"domain" where: domain domain name to add. The result is a RESSTRING. [admin protocol] [top] Deleting a domain "domaindel"[TAB]"domain" where: domain domain name to delete. The result is a RESSTRING. This is not always a safe operation. [admin protocol] [top] Listing handled domains "domainlist" or: "domainlist"[TAB]"wildmatch0"[TAB]...[TAB]"wildmatchN" The result is a RESSTRING. The wild match versions simply returns a filtered list of domains. If successful (00100), a formatted list of handled domains follows, terminated by a line containing a single dot (.). [admin protocol] [top] Adding a domain alias "aliasdomainadd"[TAB]"realdomain"[TAB]"aliasdomain" Example: "aliasdomainadd"[TAB]"xmailserver.org"[TAB]"xmailserver.com" defines 'xmailserver.com' as an alias of 'xmailserver.org', or: "aliasdomainadd"[TAB]"xmailserver.org"[TAB]"*.xmailserver.org" defines all subdomains of 'xmailserver.org' as aliases of 'xmailserver.org'. [admin protocol] [top] Deleting a domain alias "aliasdomaindel"[TAB]"aliasdomain" Example: "aliasdomaindel"[TAB]"*.xmailserver.org" removes the '*.xmailserver.org' domain alias. [admin protocol] [top] Listing alias domains "aliasdomainlist" or: "aliasdomainlist"[TAB]"wild-dom-match" or: "aliasdomainlist"[TAB]"wild-dom-match"[TAB]"wild-adom-match" The result is a RESSTRING. The wild match version simply returns a filtered list of alias domains. If successful (00100), a formatted list of alias domains follows, terminated by a line containing a single dot (.). The output format is: "real-domain"[TAB]"alias-domain" [admin protocol] [top] Getting custom domain file "custdomget"[TAB]"domain" where: domain domain name. Example: "custdomget"[TAB]"spacejam.foo" gets the custom domain file for domain 'spacejam.foo'. The result is a RESSTRING. If successful (00100), the custom domain file is listed line by line terminated by a line containing a single dot (.). [admin protocol] [top] Setting custom domain file "custdomset"[TAB]"domain" where: domain domain name. Example: "custdomset"[TAB]"spacejam.foo" sets custom domain file for domain 'spacejam.foo'. The result is a RESSTRING. If successful (00101), the client must list the custom domain file line by line, ending with a line containing a single dot (.). If a line of the file begins with a dot, another dot must be added at the begin of the line. If the file has zero length the custom domain file is deleted. The client then gets another RESSTRING indicating the final command result. [admin protocol] [top] Listing custom domains "custdomlist" The result is a RESSTRING. If successful (00100), a formatted list of custom domains follows, terminated by a line containing a single dot (.). [admin protocol] [top] Adding a POP3 external link "poplnkadd"[TAB]"loc-domain"[TAB]"loc-username"[TAB]"extrn-domain"=> [TAB]"extrn-username"[TAB]"extrn-password"[TAB]"authtype" where: loc-domain local domain name (must be handled by the server). loc-username local username which receives mails. extrn-domain external domain. extrn-username external username. extrn-password external user password. authtype authentication method (see [POP3LINKS.TAB]). The remote server must support 'APOP' authentication to specify APOP as authtype. Using APOP authentication is more secure because clear usernames and passwords do not travel on the network; if you're not sure about it, specify 'CLR' as authtype. The result is a RESSTRING. [admin protocol] [top] Deleting a POP3 external link "poplnkdel"[TAB]"loc-domain"[TAB]"loc-username"[TAB]"extrn-domain"=> [TAB]"extrn-username" where: loc-domain local domain name (must be handled by the server). loc-username local username which receives mails. extrn-domain external domain. extrn-username external username. The result is a RESSTRING. [admin protocol] [top] Listing POP3 external links "poplnklist"[TAB]"loc-domain"[TAB]"loc-username" or "poplnklist"[TAB]"loc-domain" or "poplnklist" The result is a RESSTRING. If successful (00100), a formatted list of handled domains follows, terminated by a line containing a single dot (.). The format of the listing is: "loc-domain"[TAB]"loc-username"[TAB]"extrn-domain"[TAB]"extrn-username"=> [TAB]"extrn-password"[TAB]"authtype"[TAB]"on-off" [admin protocol] [top] Enabling a POP3 external link "poplnkenable"[TAB]"enable"[TAB]"loc-domain"[TAB]"loc-username"=> [TAB]"extrn-domain"[TAB]"extrn-username" or "poplnkenable"[TAB]"enable"[TAB]"loc-domain"[TAB]"loc-username" where: enable 1 for enabling - 0 for disabling. loc-domain local domain name. loc-username local username which receives mails. extrn-domain external domain. extrn-username external username. In the second format all users, links are affected by the enable operation. The result is a RESSTRING. [admin protocol] [top] Listing files "filelist"[TAB]"relative-dir-path"[TAB]"match-string" where: relative-dir-path path relative to MAIL_ROOT path. match-string wild card match string for file list selection. The result is a RESSTRING. If successful (00100), the directory is listed line by line, terminated by a line containing a single dot (.). The listing format is: "filename"[TAB]"filesize" [admin protocol] [top] Getting configuration file "cfgfileget"[TAB]"relative-file-path" where: relative-file-path path relative to MAIL_ROOT path. Example: "cfgfileget"[TAB]"ctrlaccounts.tab" The result is a RESSTRING. If successful (00100), the file is listed line by line, terminated by a line containing a single dot (.). You CANNOT use this command with indexed files ! [admin protocol] [top] Setting configuration file "cfgfileset"[TAB]"relative-file-path" where: relative-file-path path relative to MAIL_ROOT path. Example: "cfgfileset"[TAB]"ctrlaccounts.tab" The result is a RESSTRING. IF successful (00101), the client must list the configuration file line by line, ending with a line containing a single dot (.). If a line of the file begins with a dot, another dot must be added at the beginning of the line. If the file has zero length the configuration file is deleted. The client then gets another RESSTRING indicating the final command result. Remember that configuration files have a strict syntax and that pushing a incorrect one can make XMail not work properly. You CANNOT use this command with indexed files! [admin protocol] [top] Listing frozen messages "frozlist" The result is a RESSTRING. If successful (00100), a formatted list of frozen messages follows, terminated by a line containing a single dot (.). The format of the listing is: "msgfile"[tab]"lev0"[TAB]"lev1"[TAB]"from"[TAB]"to"[TAB]"time"[TAB]"size" Where: msgfile message name or id. lev0 queue fs level 0 (first level directory index). lev1 queue fs level 1 (second level directory index). from message sender. to message destination. time message time ("YYYY-MM-DD HH:MM:SS"). size message size in bytes. [admin protocol] [top] Rescheduling frozen message "frozsubmit"[TAB]"lev0"[TAB]"lev1"[TAB]"msgfile" where: msgfile message name or id. lev0 queue fs level 0 (first level directory index). lev1 queue fs level 1 (second level directory index). You can get this information from the frozlist command. After a message has been successfully rescheduled it is deleted from the frozen fs path. The result is a RESSTRING. [admin protocol] [top] Deleting frozen message "frozdel"[TAB]"lev0"[TAB]"lev1"[TAB]"msgfile" where: msgfile message name or id. lev0 queue fs level 0 (first level directory index). lev1 queue fs level 1 (second level directory index). You can get this information from the frozlist command. The result is a RESSTRING. [admin protocol] [top] Getting frozen message log file "frozgetlog"[TAB]"lev0"[TAB]"lev1"[TAB]"msgfile" where: msgfile message name or id. lev0 queue fs level 0 (first level directory index). lev1 queue fs level 1 (second level directory index). You can get this information from the frozlist command. The result is a RESSTRING. If successful (00100), the frozen message log file follows, terminated by a line containing a single dot (.). [admin protocol] [top] Getting frozen message "frozgetmsg"[TAB]"lev0"[TAB]"lev1"[TAB]"msgfile" where: msgfile message name or id. lev0 queue fs level 0 (first level directory index). lev1 queue fs level 1 (second level directory index). You can get this information from the frozlist command. The result is a RESSTRING. If successful (00100), the frozen message file follows, terminated by a line containing a single dot (.). [admin protocol] [top] Starting a queue flush "etrn"[TAB]"email-match0"... where: email-match0 wild card email matching for destination address. Example: "etrn" "*@*.mydomain.com" "your-domain.org" starts queueing all messages with a matching destination address. [admin protocol] [top] Do nothing command "noop" The result is a RESSTRING. [admin protocol] [top] Quit the connection "quit" The result is a RESSTRING. [admin protocol] [top] Do you want...? Do you want to build GUI configuration tools using common scripting languages (Java, TCL/Tk, etc) and XMail controller protocol? Do you want to build Web configuration tools? Please let me know . [admin protocol] [top] XMAIL LOCAL MAILER XMail has the ability to deliver locally prepared mail files that if finds in the 'spool/local' directory. The format of these files is strict: mail from:<...>[CR][LF] rcpt to:<...>[CR][LF] ... [CR][LF] message text in RFC822 format with [CR][LF] line termination All lines must be [CR][LF] terminated, with one mail-from statement, one or more rcpt-to statements, an empty line and the message text. Mail files must not be created directly inside the '/spool/local' directory but instead inside '/spool/temp' directory. When the file is prepared it has to be moved into '/spool/local'. The file name format is: stime-seqnr.pid.hostname where: stime system time in sec from 01/01/1970. seqnr sequence number for the current file. pid process or thread id. hostname creator process host name. Example: 97456928-001.7892.home.bogus XMail has a number of LMAIL threads that periodically scan the '/spool/local' directory watching for locally generated mail files. You can tune this number of threads with the '-Ln nthreads' command line option. The suggested number ranges from three to seven. [top] CtrlClnt (XMAIL ADMINISTRATION) You can use CtrlClnt to send administration commands to XMail. These commands are defined in the previous section ("XMAIL ADMIN PROTOCOL"). The syntax of CtrlClnt is: CtrlClnt [-snuptfSLcKCXHD] ... where: -s server set server address. -n port set server port [6017]. -u user set username. -p pass set password. -t timeout set timeout [60]. -f filename set dump filename [stdout]. -S enable SSL link negotiation (talks to a CTRL port) -L use native SSL link (talks to a CTRLS port) -K filename set the SSL private key file (the environment variable "CTRL_KEY_FILE" also sets it) -C filename set the SSL certificate file (the environment variable "CTRL_CERT_FILE" also sets it) -X filename set the SSL certificate-list file (the environment variable "CTRL_CA_FILE" also sets it). See [SSL CONFIGURATION] for more information -H dir set the SSL certificate-store directory (the environment variable "CTRL_CA_PATH" also sets it). See [SSL CONFIGURATION] for more information -D enable debug output With the command and parameters that follow adhering to the command syntax, i.e.: CtrlClnt -s mail.foo.org -u davide.libenzi -p ciao=> useradd home.bogus foouser foopasswd U executes the command useradd with parameters 'home.bogus foouser foopasswd U'. CtrlClnt returns 0 if the command is successful and != 0 if not. If the command is a query, then the result is printed to stdout. [top] SERVER SHUTDOWN [Linux] Under Linux, XMail creates a file named XMail.pid in '/var/run' that contains the PID of the main XMail thread. By issuing a: kill -INT `cat /var/run/XMail.pid` a system administrator can initiate the shutdown process (this can take several seconds). You can use the supplied 'xmail' startup script to start / stop / restart XMail: xmail start / stop / restart [NT as console service] Under NT console service (XMail --debug ...) you can hit Ctrl-C to initiate the shutdown process. [NT as service] Using [Control Panel]->[Services] you can start and stop XMail as you wish. [All] XMail detects a shutdown condition by checking the presence of a file named '.shutdown' in its main directory (MAIL_ROOT). You can initiate XMail shutdown process by creating (or copying) a file with that name into MAIL_ROOT. [top] MkUsers This command line utility enables you to create the user accounts structure by giving it a formatted list of users parameters (or a formatted text file). The syntax of the list (or file) is: domain;username;password;real-name;homepage[NEWLINE] where a line whose first character is '#' is treated as a comment. This utility can also be used to create a random number users (useful for me to test server performance). These are MkUsers command line parameters: -a numusers number of users to create in auto-mode. -d domain domain name in auto-mode. -f inputFile input file name {stdin}. -u username radix user name in auto-mode. -r rootdir mail root path {./}. -s mboxsize mailbox maximum size {10000}. -i useridbase base user id {1}; -m create Maildir boxes. -h show this message. MkUsers creates, under the specified root directory, the given structure: rootdir mailusers.tab domains domainXXX userXXX user.tab mailbox ... ... for the mailbox structure, while: rootdir mailusers.tab domains domainXXX userXXX user.tab Maildir tmp new cur ... ... for the Maildir structure. If the file 'mailusers.tab' already exist in the mail root path, MkUsers exits without overwriting the existing copy. This protect you from accidentally overwriting your file when playing inside the real MAIL_ROOT directory. If you want to setup the root directory (-r ...) as MAIL_ROOT, you must delete by hand the existing file (you must know what you're doing). If you setup the root directory (-r ...) as MAIL_ROOT you MUST have XMail stopped before running MkUsers. Existing files and directories are not overwritten by MkUsers so you can keep your users db in the formatted text file (or generate it by a database dump for example) and run MkUsers to create the structure. Remember that you have to add new domains in the 'domains.tab' file by hand. MkUsers is intended as a bulk-mode utility, not to create single user; for this CtrlClnt (or other GUI/Web configuration utilities) is better suited. [top] sendmail When building XMail, an executable called 'sendmail' is created. This is a replacement of the sendmail program used mostly on Unix systems; it uses the local mail delivery of XMail to send email generated onto the server machine. These sendmail options are supported (other options are simply ignored): -f{mail from} Set the sender of the email. -F{ext mail from} Set the extended sender of the email. -t Extract recipients from the 'To:'/'Cc:'/'Bcc:' header tags. -i Read the input until the End Of Stream, instead of stopping at the "\n.\n" sequence. The syntax is: sendmail [-t] [-f...] [-F...] [--input-file fname] [--xinput-file fname]=> [--rcpt-file fname] [--] recipient ... The message content is read from the standard input and must be RFC compliant. The following parameters are XMail extensions meant to be used with mailing lists managers (using sendmail as a mail list exploder): --input-file fname take the message from the specified file instead from stdin (RFC format). --xinput-file fname take the message from the specified file instead from stdin (XMail format). --rcpt-file fname add recipients listed inside the specified file (list exploder). To be RFC compliant means that the message MUST have the format: [Headers] NewLine Body Suppose you have your message in the file 'msg.txt', you're 'xmailuser@smartdomain', and you want to send the message to 'user1@dom1' and 'user2@dom2'. The syntax is: sendmail -fxmailuser@smartdomain user1@dom1 user2@dom2 < msg.txt or sendmail -fxmailuser@smartdomain --input-file msg.txt user1@dom1 user2@dom2 [top] MISCELLANEOUS 1. To handle multiple POP3 domains, the server makes a reverse lookup of the IP address upon which it receives the connection. Suppose the reverse lookup results in 'xxxx.yyyy.zzzz'. XMail checks if 'xxxx.yyyy.zzzz' is handled, then it checks 'yyyy.zzzz', and then 'zzzz'. The first resolved (in the given order) is the POP3 domain. To avoid the above behavior, it's sufficient that the POP3 client supply the entire email address as POP3 login username: foo@foodomain.net ==> foo@foodomain.net and not: foo@foodomain.net ==> foo This enables XMail to handle multiple domains in cases where more nic-names are mapped over a single IP address. To run finger queries you must specify: foo@foodomain.net@foodomain.net or as general rule: username@pop3domain@hostname You can use the optional configuration variable 'POP3Domain' (see "SERVER.TAB VARIABLES" above) to set the default domain for POP3 clients connections. This means that users of 'POP3Domain' can use only the name part of their email address as POP3 login, while users of other hosted domains must use their entire email as POP3 login. 2. Important! * 'REMEMBER TO REMOVE THE EXAMPLE ACCOUNT FROM CTRLACCOUNTS.TAB FILE!' * Use ctrl.ipmap.tab to restrict CTRL server access. * Use a long password (mixed upper/lower case with digits) for ctrlaccounts.tab. 3. The main cause of bugs with XMail is due a bad line termination of configuration files, so check that these files being correctly line terminated for your OS. Linux uses the standard while M$ uses . 4. If you get a bind error in Linux,you must comment pop3, smtp and finger entries in your /etc/inetd.conf. 5. Remember to compile the file CTRL.IPMAP.TAB to restrict the access to the IPs you use to remote administer XMail server. 6. If you have an heavily loaded server remember to setup the best number of XMAIL threads by specifying the '-Qn nthreads' option (you must do some tentatives to find the best value for your needs). Also you can limit the number of SMTP, POP3 and CTRL service threads by specifying the options '-SX maxthreads', '-PX maxthreads' and '-CX maxthreads'. 7. If you have enabled logging, remember to setup the '-Mr hours' option depending on the traffic you get in your server. This avoids XMail having to work with very large log files and can improve server performance. 8. If you are unable to start XMail (even if you followed this document's instructions), check the MailRoot directory with the one listed above. More than one unzipper does not restore empty directories by default. Please report XMail errors and errors in this document. If you successfully build and run XMail please let me know at davidel@xmailserver.org, I don't want money ;) [top] THANKS My mother Adelisa, for giving me the light. My cat Grace, for her patience waiting for food while I'm coding. All of the free source community, for giving me code and knowledge. [top] POD ERRORS Hey! The above document had some coding errors, which are explained below: Around line 793: =back doesn't take any parameters, but you said =back end html Around line 1821: You can't have =items (as at line 1827) unless the first thing after the =over is an =item xmail-1.27/docs/cvpod.pl0000755000175000017500000000266411341640430014436 0ustar davidedavide#!/usr/bin/perl #----------------------------------------- # cvpod - simple script to involk pod2html # and pod2text # # a single argument gives the input file # name; the outputs are .html # and .txt. # # Beau E, Cox, BeauCox.com # # # # October 13, 2002 #----------------------------------------- use strict; use warnings; my $infn = shift @ARGV; $infn || die "no input file specified\n"; (-T $infn) || die "input file $infn not found or invalid\n"; my @in; open (IN, $infn) or die "unable to open $infn:\n$!\n"; while () { super_chomp (); $_ || next; last if /^=begin\s+cvpod/i; } while () { super_chomp (); $_ || next; last if /^=end\s+cvpod/i; push @in, $_; } unless (@in) { print "'=begin cvpod' directive found in $infn, no action taken\n"; exit 1; } close IN; while (1) { $_ = shift @in; $_ || last; my ($cssfn) = /^:begin\s+css\s+(.+)/i; if ($cssfn) { open (CSS, ">$cssfn") or die "unable to open $infn:\n$!\n"; while (1) { $_ = shift @in; $_ || last; last if (/^:/); print CSS "$_\n"; } close CSS; } $_ || last; my ($cmd) = /^:run\s+(.+)/i; $cmd || next; print "$cmd\n"; system $cmd; } my $cmd = ($^O =~ m/win32/i) ? "del" : "rm"; $cmd .= " pod2h*.x~~ *.tmp"; print "$cmd\n"; system $cmd; exit 0; sub super_chomp { $_ = shift if (@_); s/\x0D//g; s/\x0A//g; $_; } xmail-1.27/docs/Readme.pod0000644000175000017500000040640611341640430014666 0ustar davidedavide =head1 NAME XMail - Internet/Intranet mail server. [L] =head1 LICENSE This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation (L); either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA [L] =head1 OVERVIEW XMail is an Internet and Intranet mail server featuring an SMTP server, POP3 server, finger server, multiple domains, no need for users to have a real system account, SMTP relay checking, RBL/RSS/ORBS/DUL and custom (IP based and address based) spam protection, SMTP authentication (PLAIN LOGIN CRAM-MD5 POP3-before-SMTP and custom), a POP3 account synchronizer with external POP3 accounts, account aliases, domain aliases, custom mail processing, direct mail files delivery, custom mail filters, mailing lists, remote administration, custom mail exchangers, logging, and multi-platform code. XMail sources compile under GNU/Linux, FreeBSD, OpenBSD, NetBSD, OSX, Solaris and NT/2K. This server was born due to the need of having a free and stable Mail Server to be used inside my old company, which used a Windows Network. I don't like to reinvent the wheel but the need of some special features drive me to start a new project. Probably if I could use a Linux server on my net, I would be able to satisfy my needs without writing code, but this is not the case. It should be also portable to other OSs, like Linux and other Unixes. Another reason that drove me to write XMail is the presence of the same steps in setting up a typical mail server, i.e.: sendmail + qpopper + fetchmail if one needs SMTP, POP3 and external synchronization, or: sendmail + qpopper for only SMTP and POP3 (I've quoted sendmail, qpopper and fetchmail, but there are many other packages you can use to reach these needs). With XMail you get an all-in-one package with a central administration that can simplify the above common steps. The first code of XMail Server is started on Windows NT and Linux, and now, the FreeBSD and Solaris version ready. The compilers supported are gcc for Linux, FreeBSD, OpenBSD and Solaris and M$ Visual C++ for NT/2K. [L] =head1 VERSION =head2 current 1.27 =head2 release type Gnu Public License L =head2 release date Feb 25, 2010 =head2 project by Davide Libenzi L =head2 credits Michael Hartle Shawn Anderson Dick van der Kaaden Beau E, Cox =head2 warning ************************************************************ * <> * * If you're upgrading an existing version of XMail it's * * strongly suggested that you read all the ChangeLog * * notes that range from existing version to the new one. * ************************************************************ =for html

See the Change Log.

[L] =head1 DOCUMENTATION CONVENTIONS This document contains various examples of entries you must make to the XMail configuration tables. These examples are written in a mono-spaced font like this. The prototype statement is shown with explicit 'B<[TAB]>' and 'B<[NEWLINE]>' characters: "aliasdomain"[TAB]"realdomain"[NEWLINE] while examples omit these characters: "simpson.org" "simpson.com" "*.homer.net" "homer.net" 'B' When a prototype or example statement is too long to be easily shown on the screen or printed, the line is split into multiple lines by showing 'B<=>>' at the end of continued lines and indenting the continuation line(s): "domain"[TAB]"account"[TAB]"enc-passwd"[TAB]"account-id"[TAB]"account-dir"[TAB]=> "account-type"[NEWLINE] 'B CHARACTERS. ENTER THE ENTIRE ENTRY AS ONE LINE.>' [L] =head1 FEATURES =over 4 =item * ESMTP/ESMTPS server =item * POP3/POP3S server =item * Finger server =item * Multiple domains =item * Users don't need a real system account =item * SMTP relay checking =item * Custom SMTP maps check =item * SMTP protection over spammers (IP based and address based) =item * SMTP authentication (PLAIN LOGIN CRAM-MD5 POP3/SMTP and custom) =item * SMTP ETRN command support =item * POP3 account synchronizer with external POP3 accounts =item * Account aliasing =item * Domain aliasing =item * Mailing lists =item * Custom mail processing =item * Locally generated mail files delivery =item * Remote administration =item * Custom mail exchangers =item * Logging =item * Multi platform (any Windows and almost any Unix OSs) =item * Fine grained message filters =item * Custom (external) POP3/SMTP authentication =item * TLS support for SMTP and POP3, both server and client side =back [L] =head1 PORTING STATUS Right now the Linux and NT ports are stable, while the Solaris, FreeBSD, OpenBSD and OSX ones have not been tested as well as the previous OSs. [L] =head1 REQUIREMENTS =over 4 =item * Any version of Linux that has glibc. =item * Windows NT with ws2_32.dll correctly installed. =item * A working DNS and gateway to the Internet (if you plan to use it). =item * To build from source for Linux you need any version of gcc and glibc installed. =item * To build from source for Windows you need MS Visual C++ (makefile included). =item * -or- any other working compiler that provides support for the Win32 SDK. =back [L] =head1 OBTAINING THE SOURCE Always get the latest sources at the XMail home page L because otherwise you may be using an old version. Use the correct distribution for your system and don't mix Unix files with Windows ones because this is one of the most common cause of XMail bad behavior. When you unzip (or untar) the package you've to check that the MailRoot directory contained inside the package itself is complete (look at the directory tree listed below) because some unzippers don't restore empty directories. [L] =head1 BUILD XMail depends on OpenSSL to provide SSL support, so the development package of OpenSSL (in Debian called libssl-dev) must be installed on your system. For Windows, the XMail source already contains a pre-built version of the OpenSSL libraries, include files, and executable. The OpenSSL web site can be found here L. [Windows] You have to have the command line environment setup before (usually the vcvars32.bat script inside the Visual C++ directory). You also need to copy the openSSL DLLs (located in "win32ssl\dll") inside the same folder where the XMail.exe binary resides. C:> nmake /f Makefile.win If once you run the XMail binaries, Windows complains about missing DLLs, your system is probably missing the Microsoft CRT redistributable package, that you can download here L. [Linux] # make -f Makefile.lnx [FreeBSD] # setenv OSTYPE FreeBSD # gmake -f Makefile.bsd or (depending on the shell): # OSTYPE=FreeBSD gmake -f Makefile.bsd [OpenBSD] # setenv OSTYPE OpenBSD # gmake -f Makefile.bsd or (depending on the shell): # OSTYPE=OpenBSD gmake -f Makefile.bsd [NetBSD] # setenv OSTYPE NetBSD # gmake -f Makefile.bsd or (depending on the shell): # OSTYPE=NetBSD gmake -f Makefile.bsd [OSX] # OSTYPE=Darwin make -f Makefile.bsd or (depending on the shell): # setenv OSTYPE Darwin # make -f Makefile.bsd [Solaris] # make -f Makefile.sso Under Linux an init.d startup script is supplied (xmail) to allow you to run XMail as a standard rc? daemon. You must put it into /etc/init.d (it depends on which distro you're using) directory and then create K??xmail - S??xmail links into the proper directories. Under Windows NT/2000/XP the XMail's executable is a Win32 service by default and if you want to have it built like a standard executable you've to comment the statement: "#define SERVICE" in MainWin.cpp When it's built as a service (default) you can run: XMail --install to install XMail as a manual startup service or: XMail --install-auto to install XMail as an automatic startup service. If you run 'B<--install>' and you want XMail to run at NT boot, you must go in ControlPanel->Services and edit the startup options of XMail. Once you have the service version of XMail you can run it in a 'normal' way by executing: XMail --debug [options] [L] =head1 CONFIGURATION =head2 Linux/Solaris/FreeBSD/OpenBSD =over 4 =item 1. Build XMail. =item 2. Log as root. =item 3. Copy the supplied MailRoot directory where you want it to reside (normally /var). =item 4. Do a # chmod 700 /var/MailRoot to setup MailRoot directory access rights. =item 5. Strip XMail executables if you want to reduce their sizes (strip filename). =item 6. Copy XMail executables to /var/MailRoot/bin. =item 7. Optionally, you can setup a dedicated temporary files directory for XMail, by setting the environment variable XMAIL_TEMP, which defaults to /tmp/. XMail uses such directory when it has to create files that must be accessible to external programs like filters. =item 8. If you have 'B' installed, comment out the lines of 'B' that involve SMTP, POP3, and Finger. Restart 'B' (kill -HUP ...). =item 9. Since XMail uses syslog to log messages, enable syslogd if it's not running. =item 10. Setup the 'B' configuration file (after reading the rest of this document well). =item 11. Add your users and domains (after reading the rest of this document well). =item 12. Change or comment out (#) the example account in 'B' by using a non-trivial username and password. =item 13. Copy the xmail startup script to your init.d directory (it's position depends on your distro). If you've setup XMail to work in a subdirectory other than 'B' you must edit the xmail startup script to customize its boot parameters. =item 14. Use the 'B' shell script (from root user) to create SysV boot script - unless your distro has other tools to do this. =item 15. To start XMail without reboot you can run (from root): /etc/rc.d/init.d/xmail start otherwise reboot your machine. =item 16. Setup the file 'B' if you want to extend mail relaying to IPs outside of the internet's private IP blocks (or you want to deny even those - that comes enabled by default with XMail). =item 17 Look at [L] for information about how to create the required 'B' and 'B' files. =back For further configuration options, please see the [L] section. [L] [L] =head2 NT/Win2K/XP =over 4 =item 1. Build XMail. =item 2. Copy the supplied MailRoot directory where you want it to reside (normally 'B'). =item 3. Setup the MailRoot directory (and subdirectories and file) permissions to allow access only to System and Administrators. Doing this you can run XMail as a console startup only if you're Administrator (service startup as System). =item 4. Copy XMail executables to 'B'. Also copy the OpenSSL DLLs located in "win32ssl\dll" to 'B'. =item 5. With 'B', create 'B' key inside 'B' and then 'B' key inside 'B'. Note: If you are using a 32bit binary with a 64bit Windows, replace 'B' with 'B' here, and in the points below. =item 6. Create a new string value named 'B' inside 'B' with value 'B'. =item 7. Optionally create a new string value named 'B' inside 'B' to store your command line options (read well the rest of this document). =item 8. Open an NT console (command prompt). =item 9. Go inside 'B' and run: XMail --install for a manual startup, or: XMail --install-auto for an automatic startup. =item 10. If you have other services that provide the same functionality as XMail, that is SMTP, POP3, or Finger servers, you must stop these services. =item 11. Setup the 'B' configuration option after reading the rest of this document well. =item 12. Add your users and domains (after reading to the rest of this document well). =item 13. Setup file permissions of the 'B' directory to grant access only to 'B' and 'B'. =item 14. Change or comment out (#) the example account in ctrlaccounts.tab by using a non-trivial username and password. =item 15. To start XMail without reboot you can go to: ControlPanel -> Services -> XMail server and start the service, otherwise reboot your machine. =item 16. Setup the file 'B' if you want to extend mail relaying to IPs outside of the internet's private IP blocks (or you want to deny even those - that comes enabled by default with XMail). =item 17 Look at [L] for information about how to create the required 'B' and 'B' files. =back For further configuration options, please see the [L] section. [L] [L] =head2 Environment variables =over 4 =item [MAIL_ROOT] If you want to start XMail as a simple test you must setup an environment variable MAIL_ROOT that points to the XMail Server root directory. Linux/etc.: export MAIL_ROOT=/var/XMailRoot Windows: set MAIL_ROOT=C:\MailRoot =item [MAIL_CMD_LINE] Allows the user to specify extra command line parameters (they will be appended to the ones specified in the command line). =item [XMAIL_PID_DIR] Allows the user to specify the PID directory (Unix only ports). The specified directory must NOT have the final slash (/) appended to the path. =back [L] [L] =head2 MailRoot structure Mail root directory contain these files: aliases.tab aliasdomain.tab domains.tab dnsroots extaliases.tab mailusers.tab message.id pop3links.tab server.tab server.cert server.key smtpgw.tab smtpfwd.tab smtprelay.tab smtpauth.tab smtpextauth.tab userdef.tab ctrlaccounts.tab spammers.tab spam-address.tab pop3.ipmap.tab smtp.ipmap.tab ctrl.ipmap.tab finger.ipmap.tab filters.in.tab filters.out.tab filters.post-rcpt.tab filters.pre-data.tab filters.post-data.tab smtp.ipprop.tab smtp.hnprop.tab and these directories: bin cmdaliases tabindex dnscache mx ns custdomains filters logs pop3locks pop3linklocks pop3links spool local temp 0 0 mess rsnd info temp slog lock mprc froz ... ... userauth pop3 smtp domains msgsync and for each domain DOMAIN handled a directory (inside B): DOMAIN userdef.tab mailproc.tab [ optional ] inside of which reside, for each account ACCOUNT: ACCOUNT user.tab mlusers.tab [ mailing list case ] mailproc.tab [ optional ] pop3.ipmap.tab [ optional ] and mailbox for mailbox structure, while: Maildir tmp new cur for Maildir structure. The B directory is used to store UIDL lists for PSYNC accounts that require leaving messages on the server. Inside the B other directories will be created with the name of the remote server, directories that will store UIDL DB files. [L] [L] =head2 Configuration tables TAB ('B') files are text files (in the sense meant by the OS in use: for NT and for Linux) with this format: "value1"[TAB]"value2"[TAB]...[NEWLINE] The following sections explain each file's structure and use. =over 4 =item L<"ALIASES.TAB file"|"ALIASES.TAB"> =item L<"ALIASDOMAIN.TAB file"|"ALIASDOMAIN.TAB"> =item L<"DOMAINS.TAB file"|"DOMAINS.TAB"> =item L<"DNSROOTS file"|"DNSROOTS"> =item L<"EXTALIASES.TAB file"|"EXTALIASES.TAB"> =item L<"MAILUSERS.TAB file"|"MAILUSERS.TAB"> =item L<"MESSAGE.ID file"|"MESSAGE.ID"> =item L<"POP3LINKS.TAB file"|"POP3LINKS.TAB"> =item L<"SERVER.TAB file"|"SERVER.TAB"> =item L<"SMTPGW.TAB file"|"SMTPGW.TAB"> =item L<"SMTPFWD.TAB file"|"SMTPFWD.TAB"> =item L<"SMTPRELAY.TAB file"|"SMTPRELAY.TAB"> =item L<"SMTPAUTH.TAB file"|"SMTPAUTH.TAB"> =item L<"SMTPEXTAUTH.TAB file"|"SMTPEXTAUTH.TAB"> =item L<"USERDEF.TAB file"|"USERDEF.TAB"> =item L<"CTRLACCOUNTS.TAB file"|"CTRLACCOUNTS.TAB"> =item L<"SPAMMERS.TAB file"|"SPAMMERS.TAB"> =item L<"SPAM-ADDRESS.TAB file"|"SPAM-ADDRESS.TAB"> =item L<"POP3.IPMAP.TAB file"|"POP3.IPMAP.TAB"> =item L<"SMTP.IPMAP.TAB file"|"SMTP.IPMAP.TAB"> =item L<"CTRL.IPMAP.TAB file"|"CTRL.IPMAP.TAB"> =item L<"FINGER.IPMAP.TAB file"|"FINGER.IPMAP.TAB"> =item L<"USER.TAB file"|"USER.TAB"> =item L<"MLUSERS.TAB file"|"MLUSERS.TAB"> =item L<"MAILPROC.TAB file"|"MAILPROC.TAB"> =item L<"SMTP.IPPROP.TAB file"|"SMTP.IPPROP.TAB"> =item L<"SMTP.HNPROP.TAB file"|"SMTP.HNPROP.TAB"> =item L<"FILTERS.IN.TAB file"|"FILTERS.IN.TAB"> =item L<"FILTERS.OUT.TAB file"|"FILTERS.OUT.TAB"> =item L<"FILTERS.POST-RCPT.TAB file"|"FILTERS.POST-RCPT.TAB"> =item L<"FILTERS.PRE-DATA.TAB file"|"FILTERS.PRE-DATA.TAB"> =item L<"FILTERS.POST-DATA.TAB file"|"FILTERS.POST-DATA.TAB"> =back end html [L] [L] =head3 ALIASES.TAB "domain"[TAB]"alias"[TAB]"realaccount"[NEWLINE] Example: "home.bogus" "davidel" "dlibenzi" define 'davidel' as alias for 'dlibenzi' in 'home.bogus' domain. "home.bogus" "foo*bog" "homer@internal-domain.org" define an alias for all users whose name starts with 'B' and ends with 'B' that points to the locally handled account 'Binternal-domain.org>'. "home.bogus" "??trips" "travels" define an alias for all users whose names start with any two chars and end with 'B'. You can even have wildcards in the domain field, as: "*" "postmaster" "postmaster@domain.net" You 'B' edit this file while XMail is running because it is an indexed file. [L] [L] [L] =head3 ALIASDOMAIN.TAB "aliasdomain"[TAB]"realdomain"[NEWLINE] where 'B' can use wildcards: "simpson.org" "simpson.com" "*.homer.net" "homer.net" The first line defines 'B' as an alias of 'B' while the second remaps all subdomains of 'B' to 'B'. You 'B' edit this file while XMail is running because it is an indexed file. [L
] [L] [L] =head3 DOMAINS.TAB "domain"[NEWLINE] defines domains handled by the server. [L
] [L] [L] =head3 DNSROOTS host This is a file that lists a root name server in each line (this is not a TAB file). This can be created from a query via nslookup for type=ns and host = '.'. [L
] [L] [L] =head3 EXTALIASES.TAB "external-domain"[TAB]"external-account"[TAB]"local-domain"[TAB]"local-user"[NEWLINE] Example: "xmailserver.org" "dlibenzi" "home.bogus" "dlibenzi" This file is used in configurations in which the server does not run directly on Internet (like my case) but acts as internal mail exchanger and external mail gateway. This file defines 'Return-Path: <...>' mapping for internal mail delivery. If you are using an Mail client like Outlook, Eudora, KMail ... you have to configure your email address with the external account say 'dlibenziE<64>xmailserver.org'. When you post an internal message to 'fooE<64>home.bogus' the mail client puts your external email address ('dlibenziE<64>xmailserver.org') in the 'MAIL FROM: <...>' SMTP request. Now if the user 'foo' replies to this message, it replies to 'dlibenziE<64>xmailserver.org', and then is sent to the external mail server. With the entry above in 'B' file the 'Return-Path: <...>' field is filled with 'dlibenziE<64>home.bogus' that leads to an internal mail reply. You 'B' edit this file while XMail is running because it is an indexed file. [L
] [L] [L] =head3 MAILUSERS.TAB "domain"[TAB]"account"[TAB]"enc-passwd"[TAB]"account-id"[TAB]"account-dir"[TAB]=> "account-type"[NEWLINE] (remember, enter as one line.) Example: "home.bogus" "dlibenzi" "XYZ..." 1 "dlibenzi" "U" defines an account 'dlibenzi' in domain 'home.bogus' with the encrypted password 'XYZ...', user id '1' and mail directory 'dlibenzi' inside 'B<$MAIL_ROOT/domains/home.bogus>'. To allow multiple domain handling the POP3 client must use the entire email address for the POP3 user account; for example, if a user has email userE<64>domain it must supply: user@domain as POP3 account login. The directory 'account-dir' 'B' case match with the field 'account-dir' of this file. Note that user id 'B' be unique for all users (duplicate user ids are not allowed). The user id 0 is reserved by XMail and cannot be used. The last field 'U' is the account type: "U" = User account "M" = Mailing list account The encrypted password is generated by 'B' whose source is 'B'. Even if external authentication is used (see L) this file 'B' contain an entry for each user handled by XMail. You 'B' edit this file while XMail is running because it is an indexed file. [L
] [L] [L] =head3 MESSAGE.ID A file storing a sequential message number. Set it at 1 when you install the server and leave it be handled by the software. [L
] [L] [L] =head3 POP3LINKS.TAB "local-domain"[TAB]"local-account"[TAB]"external-domain"[TAB]=> "external-account"[TAB]"external-crypted-password"[TAB]"authtype"[NEWLINE] (remember, enter as one line) where: 'B' = Comma-separated list of options: =over 4 =item CLR Use clear-text USER/PASS authentication =item APOP Use POP3 APOP authentication (that does not send clear-text passwords over the wire). Fall back to 'B' if 'B' is not supported =item FAPOP Use POP3 APOP authentication (that does not send clear-text passwords over the wire). =item STLS Establish an SSL link with the server by issuing a POP3 STLS command. Continue with the non-encrypted link if STLS is not supported =item FSTLS Establish an SSL link with the server by issuing a POP3 STLS command. =item POP3S Establish a full POP3S connection with the remote server. Note that the POP3S port (default 995) must be set inside the external domain declaration. =item Leave Leave messages on the server, and download only the new ones. In order for this functionality to work, the remote POP3 server must support the UIDL command. =item OutBind Sets the IP address of the network interface that should be used when connecting to the remote host. This configuration should be used carefully, because XMail will fail if the selected IP of the interface does not have a route to the remote host using such IP. =back Examples: "home.bogus" "dlibenzi" "xmailserver.org" "dlibenzi" "XYZ..."=> "APOP" This entry is used to synchronize the external account 'dlibenziE<64>xmailserver.org' with encrypted password 'XYZ...' with the local account 'dlibenziE<64>home.bogus' using 'B' authentication. It connects with the 'xmailserver.org' POP3 server and downloads all messages for 'dlibenziE<64>xmailserver.org' into the local account 'dlibenziE<64>home.bogus'. The remote server must support 'B' authentication to specify 'B' as authtype. Even if using APOP authentication is more secure because clear usernames and password do not travel on the network, when you're not sure about it, specify 'B' as authtype. For non local POP3 sync you've to specify a line like this one (E<64> as the first domain char): "@home.bogus.com" "dlibenzi" "xmailserver.org:110" "dlibenzi" "XYZ..."=> "CLR" This entry is used to synchronize the external account 'dlibenziE<64>xmailserver.org' with encrypted password 'XYZ...' with the account 'dlibenziE<64>home.bogus.com' using 'B' authentication. The message is pushed into the spool having as destination dlibenziE<64>home.bogus.com , so you've to have some kind of processing for that user or domain in your XMail configuration (for example custom domain processing). you can also have the option to setup a line like this one: "?home.bogus.com,felins.net,pets.org" "dlibenzi" "xmailserver.org"=> "dlibenzi" "XYZ..." "CLR" and messages are dropped inside the spool by following these rules: =over 4 =item 1. XMail parses the message headers by searching for To:, Cc: and Bcc: addresses. =item 2. Each address's domain is compared with the list of valid domains (felins.net, pets.org). =item 3. For each valid address the username part is taken and joined with the 'E<64>' and the masquerade domain name (the name following '?'). =item 4. The message is spooled with the above built destination address. =back Obviously the masquerade domain ('home.bogus.com') MUST be handled by the server or MUST be a valid external mail domain. So if a message having as To: address graycatE<64>felins.net is fetched by the previous line a message is pushed into the spool with address graycatE<64>home.bogus.com. Particular attention must be paid to prevent creating mail loops. Another option is: "&.local,felins.net,pets.org" "dlibenzi" "xmailserver.org" "dlibenzi"=> "XYZ..." "CLR" where a fetched message whose To: address is graycatE<64>felins.net is replaced with graycatE<64>felins.net.local. You can avoid the matching domain list after the masquerading domain but, in that case, you may have bad destination addresses inside the spool. The list MUST be comma separated WITHOUT spaces. XMail starts PSYNC session with a delay that you can specify with the -Yi nsec command line parameter (default 120). XMail also checks for the presence (inside MAIL_ROOT) of a file named '.psync-trigger' and, when this file is found, a PSYNC session starts and that file is removed. [L
] [L] [L] =head3 SERVER.TAB "varname"[TAB]"varvalue"[NEWLINE] This file contains server configuration variables. See L below for details. [L
] [L] [L] =head3 SMTPGW.TAB "domain"[TAB]"smtp-gateway"[NEWLINE] Examples: "foo.example.com" "@xmailserver.org" sends all mail for 'foo.example.com' through the 'xmailserver.org' SMTP server, while: "*.dummy.net" "@relay.xmailserver.org" sends all mail for '*.dummy.net' through 'relay.xmailserver.org'. The 'B' can be a complex routing also, for example: "*.dummy.net" "@relay.xmailserver.org,@mail.nowhere.org" sends all mail for '*.dummy.net' through 'E<64>relay.xmailserver.org,E<64>mail.nowhere.org', in this way: relay.xmailserver.org --> mail.nowhere.org --> E<64>DESTINATION. [L
] [L] [L] =head3 SMTPFWD.TAB "domain"[TAB]"smtp-mx-list"[NEWLINE] The "smtp-mx-list" is a semicolon separated list of SMTP relays, and can also contain options as a comma-separated list (see [L] for more information). Examples: "foo.example.com" "mail.xmailserver.org:7001;192.168.1.1:6123,NeedTLS=1;mx.xmailserver.org" sends all mail for 'foo.example.com' using the provided list of mail exchangers, while: "*.dummy.net" "mail.xmailserver.org,NeedTLS=1;192.168.1.1;mx.xmailserver.org:6423" sends all mail for '*.dummy.net' through the provided list of mail exchangers. If the port (:nn) is not specified the default SMTP port (25) is assumed. you can also enable XMail to random-select the order of the gateway list by specifying: "*.dummy.net" "#mail.xmailserver.org;192.168.1.1;mx.xmailserver.org:6423" using the character 'B<#>' as the first char of the gateway list. [L
] [L] [L] =head3 SMTPRELAY.TAB "ipaddr"[TAB]"netmask"[NEWLINE] Example: "212.131.173.0" "255.255.255.0" allows all hosts of the class 'C' network '212.131.173.XXX' to use the server as relay. [L
] [L] [L] =head3 SMTPAUTH.TAB "username"[TAB]"password"[TAB]"permissions"[NEWLINE] is used to permit SMTP client authentication with protocols PLAIN, LOGIN, CRAM-MD5 and custom. With custom authentication a file containing all secrets (username + ':' + password) is passed as parameter to the custom authentication program which tests all secrets to find the one matching (if exist). For this reason it's better to keep the number of entries in this file as low as possible. Permissions are a string that can contain: =over 4 =item M open mailing features =item R open relay features (bypass all other relay blocking traps) =item V VRFY command enabled (bypass SERVER.TAB variable) =item T ETRN command enabled (bypass SERVER.TAB variable) =item Z disable mail size checking (bypass SERVER.TAB variable) =item S ease SSL requirement for this user (bypass the "WantTLS" mail config variable) =back When PLAIN, LOGIN or CRAM-MD5 authentication mode are used, first a lookup in 'B' accounts is performed to avoid duplicating information with 'B'. Therefore when using these authentication modes a user must use as username the full email address (the : separator is permitted instead of @) and as password his POP3 password. If the lookup succeeds, the 'B' variable 'B' is used to assign user SMTP permissions (default MR). If the lookup fails then 'B' lookup is done. [L
] [L] [L] =head3 SMTPEXTAUTH.TAB The 'B' file enables the XMail administrator to use external authentication methods to verify SMTP clients. If the 'B' does not exist, or it is empty, XMail standard authentication methods are used, and those will use either the 'B' or the 'B' to verify account credentials. If the file 'B' is not empty, then the XMail standard authentication methods are not advertised in the B response of the B SMTP command. Instead, only the ones listed inside the 'B' are reported to the SMTP client. The 'B' file can contain multiple lines with the following format: "auth-name"[TAB]"program-path"[TAB]"arg-or-macro"...[NEWLINE] This file can contain multiple lines whose 'B' are listed during the EHLO command response. Where 'arg-or-macro' can be (see [L]): =over 4 =item AUTH authentication method (PLAIN, LOGIN, CRAM-MD5, ...) =item USER SMTP client supplied username (available in PLAIN, LOGIN and CRAM-MD5) =item PASS SMTP client supplied password (available in PLAIN and LOGIN) =item CHALL challenge used by the server (available in CRAM-MD5) =item DGEST client response to server challenge (E<64>CHALL - available in CRAM-MD5) =item RFILE a file path where the external authentication binary might supply extra information/credentials about the account (available in all authentications) =back The B file is composed by multiple lines with the following format: VAR=VALUE Currently supported variables inside the B file are: =over 4 =item Perms Supply SMTP permissions for the account (see [L] for detailed information) =back Example: "PLAIN" "/usr/bin/my-auth" "-a" "@@AUTH" "-u" "@@USER" "-p" "@@PASS" "-r" "@@RFILE" The external authentication binary may or may not fill a response file. If the authentication has been successful, the binary should exit with a code equal to zero. Any other exit code different from zero, will be interpreted as failure. [L
] [L] [L] =head3 USERDEF.TAB "varname"[TAB]"varvalue"[NEWLINE] Example: "RealName" "??" "HomePage" "??" "Address" "??" "Telephone" "??" "MaxMBSize" "10000" contains user default values for new users that are not set during the new account creation. This file is looked up in two different places, first in 'B<$MAIL_ROOT/domains/DOMAIN>' then in 'B<$MAIL_ROOT>', where 'B' is the name of the domain where we're going to create the new user. For each 'domain' handled by the server we'll create a directory 'domain' inside $MAIL_ROOT. Inside $MAIL_ROOT/'domain' reside 'domain'->'account' directories ($MAIL_ROOT/'domain'/'account'). This folder contains a sub folder named 'B' (or 'B') that stores all 'account' messages. It also contains a file named 'B' that stores "account" variables, for example: "RealName" "Davide Libenzi" "HomePage" "http://www.xmailserver.org/davide.html" "MaxMBSize" "30000" [L
] [L] [L] =head3 CTRLACCOUNTS.TAB "username"[TAB]"password"[NEWLINE] This file contains the accounts that are enabled to remote administer XMail. The password is encrypted with the 'B' program supplied with the source distro. 'B' [L
] [L] [L] =head3 SPAMMERS.TAB "ipaddr"[TAB]"netmask"[NEWLINE] or: "ipaddr"[TAB]"netmask"[TAB]"params"[NEWLINE] or: "ipaddr/bits"[NEWLINE] or: "ipaddr/bits"[TAB]"params"[NEWLINE] Example: "212.131.173.0" "255.255.255.0" "212.131.173.0/24" registers all hosts of the class 'C' network '212.131.173.XXX' as spammers, and blocks them the use of XMail SMTP server. If a match is found on one of those records, XMail will reject the incoming SMTP connection at an early stage. It is possible to specify optional parameters to tell XMail which behaviour it should assume in case of a match. An example of such a setup is: "212.131.173.0/24" "code=0" In this case a code=0 tells XMail to flag the connection as possible spammer, but to await later SMTP session stages to reject the connection itself. In this case an authenticated SMTP session can override the SPAMMERS.TAB match. The optional "params" field lists parameters associated with the record, separated by a comma: "param1=value1,param2=value2,...,paramN=valueN" Currently supported parameters are: =over 4 =item code Specify the rejection code for the record. If the value is greater than zero, the connection is rejected soon, and the remote SMTP client is disconnected. If the value is zero, the connection is flagged as spammer but awaits later stages for rejection, by allowing authenticated SMTP connections to bypass the SPAMMERS.TAB match. If the value is less than zero, XMail will insert an "absolute value" seconds delay between SMTP commands. Default value for code is greater than zero (immediate rejection). =back [L
] [L] [L] =head3 SPAM-ADDRESS.TAB "spam-address"[NEWLINE] Example: "*@rude.net" "*-admin@even.more.rude.net" blocks mails coming from the entire domain 'B' and coming from all addresses that end with 'B<-adminE<64>'even.more.rude.net>. [L
] [L] [L] =head3 POP3.IPMAP.TAB "ipaddr"[TAB]"netmask"[TAB]"permission"[TAB]"precedence"[NEWLINE] This file controls the global IP access permission to the POP3 server if located in the MAIL_ROOT path, and user IP access to its POP3 mailbox if located inside the user directory. Example: "0.0.0.0" "0.0.0.0" "DENY" "1" "212.131.173.0" "255.255.255.0" "ALLOW" "2" This configuration denies access to all IPs except the ones of the class 'C' network '212.131.173.XXX'. Higher precedences win over lower ones. [L
] [L] [L] =head3 SMTP.IPMAP.TAB "ipaddr"[TAB]"netmask"[TAB]"permission"[TAB]"precedence"[NEWLINE] This file controls IP access permission to SMTP server. Example: "0.0.0.0" "0.0.0.0" "DENY" "1" "212.131.173.0" "255.255.255.0" "ALLOW" "2" This configuration denies access to all IPs except the ones of the class 'C' network '212.131.173.XXX'. Higher precedences win over lower ones. [L
] [L] [L] =head3 CTRL.IPMAP.TAB "ipaddr"[TAB]"netmask"[TAB]"permission"[TAB]"precedence"[NEWLINE] This file control IP access permission to CTRL server. Example: "0.0.0.0" "0.0.0.0" "DENY" "1" "212.131.173.0" "255.255.255.0" "ALLOW" "2" This configuration deny access to all IPs except the ones of the class 'C' network '212.131.173.XXX'. Higher precedences win over lower ones. [L
] [L] [L] =head3 FINGER.IPMAP.TAB "ipaddr"[TAB]"netmask"[TAB]"permission"[TAB]"precedence"[NEWLINE] This file controls IP access permission to FINGER server. Example: "0.0.0.0" "0.0.0.0" "DENY" "1" "212.131.173.0" "255.255.255.0" "ALLOW" "2" This configuration denies access to all IPs except the ones of the class 'C' network '212.131.173.XXX'. Higher precedences win over lower ones. [L
] [L] [L] =head3 USER.TAB "variable"[TAB]"value"[NEWLINE] store user information such as: "RealName" "Davide Libenzi" "HomePage" "http://www.xmailserver.org/davide.html" "MaxMBSize" "30000" "ClosedML" "0" Please refer to L<"USER.TAB variables"> below. [L
] [L] [L] =head3 MLUSERS.TAB If the user is a mailing list this file must exist inside the user account subdirectory and contain a list of users subscribed to this list. The file format is: "user"[TAB]"perms"[NEWLINE] where: =over 4 =item user subscriber email address. =item perms subscriber permissions: =over 8 =item R read. =item W write (check done using the 'MAIL FROM:<...>' SMTP return path). =item A write (check done using the email address used for SMTP authentication). =back =back Example: "davidel@xmailserver.org" "RW" "ghostuser@nightmare.net" "R" "meawmeaw@kitty.cat" "RA" If the 'B' file defines the 'B' variable as 'B<1>' then a client can post to this mailing list only if it's listed in 'B' with RW permissions. [L
] [L] [L] =head3 MAILPROC.TAB "command"[TAB]"arg-or-macro"[TAB]...[NEWLINE] stores commands (internals or externals) that have to be executed on a message file. The presence of this file is optional and if it does not exist the default processing is to store the message in user mailbox. The 'B' file can be either per user or per domain, depending where the file is stored. If stored inside the user directory it applies only to the user whose directory hosts the 'B', while if stored inside the domain directory it applies to all users of such domain. Each argument can be a macro also (see [L]): =over 4 =item FROM is substituted for the sender of the message =item RCPT is substituted for the recipient of the message =item RRCPT is substituted for the real recipient ($(RCPT) could be an alias) of the message =item FILE is substituted for the message file path (the external command _must_ only read the file) =item MSGID is substituted for the (XMail unique) message id =item MSGREF is substituted for the reference SMTP message id =item TMPFILE creates a copy of the message file to a temporary one. It can be used with 'external' command but in this case it's external program responsibility to delete the temporary file. Do not use it with 'filter' commands since the filter will have no way to modify the real spool file =item USERAUTH name of the SMTP authenticated user, or "-" if no authentication has been supplied =back Supported commands: [EXTERNAL] "external"[TAB]"priority"[TAB]"wait-timeout"[TAB]"command-path"[TAB]=> "arg-or-macro"[TAB]...[NEWLINE] where: =over 4 =item external command keyword =item priority process priority: 0 = normal -1 = below normal +1 = above normal =item wait-timeout wait timeout for process execution in seconds: 0 = nowait Be careful if using $(FILE) to give the external command enough timeout to complete, otherwise the file will be removed by XMail while the command is processing. This is because such file is a temporary one that is deleted when XMail exits from 'B' file processing. In case the external command exit code will be 'B<16>', the command processing will stop and all the following commands listed inside the file will be skipped. =back [FILTER] "filter"[TAB]"priority"[TAB]"wait-timeout"[TAB]"command-path"[TAB]=> "arg-or-macro"[TAB]...[NEWLINE] where: =over 4 =item filter command keyword =item priority process priority: 0 = normal -1 = below normal +1 = above normal =item wait-timeout wait timeout for process execution in seconds: 0 = nowait With filters, it is not suggested to use $(TMPFILE), since the filter will never have the ability to change the message content in that way. Also, to avoid problems very difficult to troubleshoot, it is suggested to give the filter 'B' timeout to complete (90 seconds or more). See [L] for detailed information about return codes. In the filter command, the "Stop Filter Processing" return flag will make XMail to stop the execution of the current custom processing file. =back The 'filter' command will pass the message file to a custom external filter, that after inspecting it, has the option to accept, reject or modify it. Care should be taken to properly re-format the message after changing it, to avoid message corruption. The 'filter' command 'B' successfully change the private XMail's header part of the spool message. [MAILBOX] "mailbox"[NEWLINE] With this command the message is pushed into local user mailbox. [REDIRECT] "redirect"[TAB]"domain-or-emailaddress"[TAB]...[NEWLINE] Redirect message to internal or external domain or email address. If the message was for foo-userE<64>custdomain.net and the file custdomain.net.tab contains a line: "redirect" "target-domain.org" the message is delivered to 'Btarget-domain.org>'. While the line: "redirect" "user@target-domain.org" redirects the message to userE<64>target-domain.org. [LREDIRECT] "lredirect"[TAB]"domain-or-emailaddress"[TAB]...[NEWLINE] Redirect the message to internal or external domain (or email address) impersonating local domain during messages delivery. If the message was for foo-userE<64>custdomain.net and the file custdomain.net.tab contains a line: "redirect" "target-domain.org" the message is delivered to 'Btarget-domain.org>'. While the line: "redirect" "user@target-domain.org" redirects the message to 'Btarget-domain.org>'. The difference between "redirect" and "lredirect" is the following. Suppose A@B sends a message to C@D, that has a redirect to E@F. With "redirect" E@F will see A@B has sender while with "lredirect" he will see C@D. [SMTPRELAY] "smtprelay"[TAB]"server[:port][,options];server[:port][,options];..."[NEWLINE] Send mail to the specified SMTP server list by trying the first, if fails the second and so on. Otherwise You can use this syntax: "smtprelay"[TAB]"#server[:port][,options];server[:port][,options];..."[NEWLINE] to have XMail random-select the order the specified relays. Each gateway definition can also contain options as a comma-separated list (see [L] for more information). [L
] [L] [L] =head3 SMTP.IPPROP.TAB This file lists SMTP properties to be associated with the remote SMTP peer IP. The format of the file is: "ip-addr"[TAB]"var0=value0"...[TAB]"varN=valueN"[NEWLINE] Example: "192.168.0.7/32" "WhiteList=1" Address selection mask are formed by an IP address (network) plus the number of valid bits inside the network mask. No space are allowed between the variable name and the '=' sign and between the '=' sign and the value. These are the currently defined variables: =over 4 =item WhiteList If set to 1, all peer IP based checks will be skipped. =item EaseTLS If set to 1, drops the TLS requirement for SMTP sessions coming from the matched network. =item SenderDomainCheck If set to 0, bypasses the "CheckMailerDomain" 'B' variable. =item NoAuth If set to 1, release the authentication policy for this IP. =item EnableVRFY If set to 1, enable VRFY commands from this IP. =item EnableETRN If set to 1, enable ETRN commands from this IP. =back [L
] [L] [L] =head3 SMTP.HNPROP.TAB This file lists SMTP properties to be associated with the remote SMTP peer host name. The format of the file is: "host-spec"[TAB]"var0=value0"...[TAB]"varN=valueN"[NEWLINE] If the "host-spec" starts with a dot ('.'), the properties listed for that record will be applied to all sub-domains of the "host-spec" domain. Since applying the 'B' rules requires a DNS PTR lookup of the peer IP, you should be aware that this might introduce latencies into the XMail processing. If you do not have any hostname-based rules, do not create the 'B' file at all, since the simple existence of the file would trigger the DNS PTR lookup. Example: "xmailserver.org" "WhiteList=1" "EaseTLS=1" or: ".xmailserver.org" "WhiteList=1" "EaseTLS=1" See [L] for information about the properties allowed to be listed in this file. [L
] [L] [L] =head3 FILTERS.IN.TAB See [L] [L
] [L] [L] =head3 FILTERS.OUT.TAB See [L] [L
] [L] [L] =head3 FILTERS.POST-RCPT.TAB See [L] [L
] [L] [L] =head3 FILTERS.PRE-DATA.TAB See [L] [L
] [L] [L] =head3 FILTERS.POST-DATA.TAB See [L] [L
] [L] [L] =head1 MACRO SUBSTITUTION XMail support two kinds of macro declaration inside its TAB file. The old macro declaration done by prefixing the macro name with the 'B<@@>' sequence is still supported for backward compatibility, and has to be used when the macro is the only content of the parameter. Macro can also be declared as 'B<$(MACRO)>' and this form can be used anywhere inside the parameter declaration, like: "/var/spool/mail/$(USER).dat" [L] =head1 EXTERNAL AUTHENTICATION You can use external modules (executables) to perform user authentication instead of using XMail 'B' lookups. Inside the userauth directory you'll find one directory for each service whose authentication can be handled externally (see L<"SMTPEXTAUTH.TAB"> for SMTP). Suppose We must authenticate 'B' inside 'B', XMail first tries to lookup (inside userauth/pop3) a file named: 'B' else: 'B<.tab>' If one of these files is found, XMail authenticates 'B' - 'B' using that file. The authentication file is a TAB file (see at the proper section in this document) which has the given structure: "auth-action"[TAB]"command"[TAB]"arg-or-macro"[TAB]...[NEWLINE] Each argument can be a macro also (see [L]): =over 4 =item USER the USERNAME to authenticate =item DOMAIN the DOMAIN to authenticate =item PASSWD the user password =item PATH user path =back The values for 'B' can be one of: =over 4 item userauth executed when user authentication is required =item useradd executed when a user need to be added =item useredit executed when a user change is required =item userdel executed when a user deletion is required =item domaindrop executed when all domain users need to be deleted =back The first line that stores the handling command for the requested action is executed as: command arg0 ... argN that must return zero if successful. Any other exit code is interpreted as authentication operation failure, that. in 'B' case, means such user is not authenticated. If the execution of the command fails for system reasons (command not found, access denied, etc ...) then the user is not authenticated. If none of this file's id are found, then usual authentication is performed ('B'). The use of external authentication does not avoid the presence of the user entry in 'B'. [L] =head1 SMTP CLIENT AUTHENTICATION When a message is to be sent through an SMTP server that requires authentication, XMail provides a way to handle this task by if the 'B' subdirectory is set up properly. Suppose a mail is to be sent through the SMTP server 'B', this makes XMail to search for a file named (inside userauth/smtp): 'B' then: 'B' then: 'B' If one of these files is found its content is used to authenticate the SMTP client session. The structure of this file, as the extension says, is the TAB one used for most of the configuration files inside XMail. Only the first valid line (uncommented #) is used to choose the authentication method and lines has this format: "auth-type"[TAB]"param1"...[TAB]"paramN"[NEWLINE] Valid lines are: "PLAIN" "username" "password" or "LOGIN" "username" "password" or "CRAM-MD5" "username" "password" [L] =head1 CUSTOM DOMAIN MAIL PROCESSING If a message that has as target domain of 'B' arrives at the XMail server, 'B' XMail does not have a real domain 'B' inside its domain list, XMail decides if this domain gets a custom domain processing by trying to lookup: sub1.sub2.domain.net.tab .sub2.domain.net.tab .domain.net.tab .net.tab .tab inside the 'B' directory. If one of these files is found the incoming mail gets custom domain processing by executing commands that are stored in such a file. The format is: "command"[TAB]"arg-or-macro"[TAB]...[NEWLINE] These tables store commands (internals or externals) that have to be executed on the message file. The presence of one of these files is optional and if none exist the default processing is applied to the message via SMTP. Each argument can be a macro also (see [L]): =over 4 =item FROM the sender of the message =item RCPT the target of the message =item FILE the message file path (the external command 'B' the file) =item MSGID the (XMail unique) message id =item MSGREF the reference SMTP message id =item TMPFILE creates a copy of the message file to a temporary one. It can be used with 'external' command but in this case it's external program's responsibility to delete the temporary file =item USERAUTH name of the SMTP authenticated user, or "-" if no authentication has been supplied =back Supported commands: =over 4 =item [EXTERNAL] "external"[TAB]"priority"[TAB]"wait-timeout"[TAB]"command-path"[TAB]=> "arg-or-macro"[TAB]...[NEWLINE] where: =over 8 =item external command keyword =item priority process priority: 0 = normal -1 = below normal +1 = above normal =item wait-timeout wait timeout for process execution in seconds: 0 = nowait Be careful if using $(FILE) to give the external command enough timeout to complete, otherwise the file will be removed by XMail while the command is processing. This is because such file is a temporary one that is deleted when XMail exits from file processing. In case the external command exit code will be 'B<16>', the command processing will stop and all the following commands listed inside the file will be skipped. =back =item [FILTER] "filter"[TAB]"priority"[TAB]"wait-timeout"[TAB]"command-path"[TAB]=> "arg-or-macro"[TAB]...[NEWLINE] where: =over 4 =item filter command keyword =item priority process priority: 0 = normal -1 = below normal +1 = above normal =item wait-timeout wait timeout for process execution in seconds: 0 = nowait With filters, it is not suggested to use $(TMPFILE), since the filter will never have the ability to change the message content in that way. Also, to avoid problems very difficult to troubleshoot, it is suggested to give the filter 'B' timeout to complete (90 seconds or more). See [L] for detailed information about return codes. In the filter command, the "Stop Filter Processing" return flag will make XMail to stop the execution of the current custom processing file. =back The 'filter' command will pass the message file to a custom external filter, that after inspecting it, has the option to accept, reject or modify it. Care should be taken to properly re-format the message after changing it, to avoid message corruption. The 'filter' command 'B' successfully change the private XMail's header part of the spool message. =item [REDIRECT] "redirect"[TAB]"domain-or-emailaddress"[TAB]...[NEWLINE] Redirect message to internal or external domain or email address. If the message was for foo-userE<64>custdomain.net and the file custdomain.net.tab contains a line: "redirect" "target-domain.org" the message is delivered to 'Btarget-domain.org>'. While the line: "redirect" "user@target-domain.org" redirects the message to userE<64>target-domain.org. =item [LREDIRECT] "lredirect"[TAB]"domain-or-emailaddress"[TAB]...[NEWLINE] Redirect the message to internal or external domain (or email address) impersonating local domain during messages delivery. If the message was for foo-userE<64>custdomain.net and the file custdomain.net.tab contains a line: "redirect" "target-domain.org" the message is delivered to 'Btarget-domain.org>'. While the line: "redirect" "user@target-domain.org" redirects the message to 'Btarget-domain.org>'. The difference between "redirect" and "lredirect" is the following. Suppose A@B sends a message to C@D, that has a redirect to E@F. With "redirect" E@F will see A@B has sender while with "lredirect" he will see C@D. =item [SMTPRELAY] "smtprelay"[TAB]"server[:port][,options];server[:port][,options];..."[NEWLINE] Send mail to the specified SMTP server list by trying the first, if fails the second and so on. Otherwise You can use this syntax: "smtprelay"[TAB]"#server[:port][,options];server[:port][,options];..."[NEWLINE] to have XMail random-select the order the specified relays. Each gateway definition can also contain options as a comma-separated list (see [L] for more information). =item [SMTP] "smtp"[NEWLINE] Do SMTP delivery. =back [L] =head1 CMD ALIASES CmdAliases implement aliases that are handled only through commands and can be thought of as a user level implementation of custom domain processing commands. The command set is the same of the one that is described above (L<"Custom domain mail processing">) and won't be explained again here. For every handled domain (listed inside 'B') a directory with the same domain name is created inside the 'B' subdirectory. This directory is automatically created and removed when you add/remove domains through the CTRL protocol (or 'B'). When a mail for 'BDOMAIN>' is received by the server, the domain 'B' is to be handled locally, and the standard users/aliases lookup fails, a file named 'B' is searched inside 'B<$MAIL_ROOT/cmdaliases/DOMAIN>'. If such file is found, commands listed inside the file (whose format must follow the one described in the previous section) are executed by the server as a matter of mail message processing. An important thing to remember is that all domain and user names, when applied to the file system, must be lower case. The use of the command 'B<[SMTP]>' must be implemented with great care because it could create mail loops within the server. [L] =head1 SERVER.TAB VARIABLES The following variables are for use int the L<"SERVER.TAB"> configuration file. =over 4 =item [RootDomain] Indicate the primary domain for the server. =item [SmtpServerDomain] If set, forces the domain name XMail uses inside the ESMTP greeting used to support CRAM-MD5 ESMTP authentication. =item [POP3Domain] Set the default domain for POP3 client connections. =item [PostMaster] Set the postmaster address. =item [ErrorsAdmin] The email address that receives notification messages for every message that has had delivery errors. If it is empty (allowed), the notification message is sent to the sender only. =item [TempErrorsAdmin] The email address that receives notification for temporary delivery failures. In case it's empty the notification message is sent to the sender only. =item [DefaultSMTPGateways] A semicolon separated list of SMTP servers XMail 'B' use to send its mails. The definition can also contain options as a comma-separated list (see [L] for more information). Example: "192.168.0.1,NeedTLS=2;192.168.0.2" This has the precedence over MX records. =item [HeloDomain] If this variable is specified and is not empty, its content is sent as HELO domain. Otherwise the reverse lookup of the local IP is sent as HELO domain. This helps to deal with remote SMTP servers that are set to check the reverse lookup of the incoming IP. =item [CheckMailerDomain] Enable validation of the sender domain ('MAIL FROM:<...E<64>xxx>') by looking up DNS/MX entries. =item [RemoveSpoolErrors] Indicate if mail has to be removed or stored in 'B' directory after a failure in delivery or filtering. =item [NotifyMsgLinesExtra] Number of lines of the bounced message that have to be listed inside the notify message (lines after the headers section). Default is zero. =item [NotifySendLogToSender] Enable/Disable sending the message log file inside the notify message to the sender. Default is off (zero). =item [NotifyTryPattern] List of delivery attempts that require the system to send a notification to the sender (and eventually to 'B'). The list is a comma separated list of numbers (with no extra spaces) as in: "1,4,9" Default is empty which means no notification is sent upon a delivery attempt failure. =item [AllowNullSender] Enable null sender ('MAIL FROM:<>') messages to be accepted by XMail. =item [NoSenderBounce] When building bounce messages, use the null SMTP sender ('MAIL FROM:<>') instead of the 'B' address. This will affect only the SMTP sender, while the message RFC822 headers will still contain the correct From: header. =item [MaxMTAOps] Set the maximum number of MTA relay steps before to declare the message as looped (default 16). =item [ReceivedHdrType] Set the verbosity of the Received: message headers tag. =over 8 =item '0' Standard (client IP shown , server IP not). Default. =item '1' Verbose (client IP shown , server IP shown) =item '2' Strict (no IP shown) =item '3' Same as 0 but the client IP is not shown if the client authenticate itself. =item '4' Same as 1 but the client IP is not shown if the client authenticate itself. =back =item [FetchHdrTags] Set the list of headers tags to be used to extract addresses from POP3 fetched messages (L<"POP3LINKS.TAB">). This is a comma delimited list (no extra space or TABs must be included inside the list) as in: "+X-Deliver-To,To,Cc" Tags preceded by a '+' character make XMail stop scanning when an address is found inside the header tag. Tags preceded by a '+' character must be listed before other tags. The string "+X-Deliver-To,To,Cc" is the default if nothing is specified. =item [SMTP-MaxErrors] Set the maximum number of errors allowed in a single SMTP session. When the maximum number of allowed errors is exceeded, the connection will be automatically dropped. If such variable is not set, or it is set to zero, the maximum number of errors will be unlimited. =item [SmtpMsgIPBanSpammers] Used to set the message that is sent to the SMTP client when the client IP is listed inside the file SPAMMER.TAB. =item [SmtpMsgIPBanSpamAddress] Used to set the message that is sent to the SMTP client when the client IP is listed inside the file SPAM-ADDRESS.TAB. =item [SmtpMsgIPBanMaps] Used to set the message that is sent to the SMTP client when the client IP is listed inside one of the "CustMapsList". =item [SmtpMsgIPBan] Used to set the message that is sent to the SMTP client when the client IP is listed inside the file SMTP.IPMAP.TAB. =item [CustomSMTPMessage] Set this to the message that you want to follow the standard SMTP error response sent by XMail, as in (one line, remember the =>): "Please open http://www.xmailserver.test/smtp_errors.html to get=> more information about this error" Please be aware the RFC821 fix the maximum reply line length to 512 bytes. =item [SMTP-IpMapDropCode] Set the drop code for IPs blocked by the SMTP.IPMAP.TAB file: =over 8 =item '1' the connection is dropped soon =item "0" the connection is kept alive but only authenticated users can send mail =item '-S' the peer can send messages but a delay of S seconds is introduced between commands =back =item [AllowSmtpVRFY] Enable the use of VRFY SMTP command. This flag may be forced by SMTP authentication. =item [AllowSmtpETRN] Enable the use of ETRN SMTP command. This flag may be forced by SMTP authentication. =item [SmtpMinDiskSpace] Minimum disk space (in Kb) that is requested before accepting an SMTP connection. =item [SmtpMinVirtMemSpace] Minimum virtual memory (in Kb) that is requested before accepting an SMTP connection. =item [Pop3MinVirtMemSpace] Minimum virtual memory (in Kb) that is requested before accepting a POP3 connection. =item [Pop3SyncErrorAccount] This defines the email account (MUST be handled locally) that receives all fetched email that XMail has not been able to deliver. =item [EnableAuthSMTP-POP3] Enable SMTP after POP3 authentication (default on). =item [MaxMessageSize] Set the maximum message size in Kb that is possible to send through the server. =item [DefaultSmtpPerms] This list SMTP permissions assigned to users looked up inside L<"MAILUSERS.TAB"> during SMTP authentication. It also defines the permissions for users authenticated with SMTP after POP3. =item [CustMapsList] This is a list a user can use to set custom maps checking. The list has the given (strict) format: maps-root:code,maps-root:code... Where maps-root is the root for the DNS query (i.e. dialups.mail-abuse.org.) and the code can be: =over 8 =item '1' the connection is dropped soon =item "0" the connection is kept alive but only authenticated users can send mail =item '-S' the peer can send messages but a delay of S seconds is introduced between commands =back =item [SMTP-RDNSCheck] Indicate if XMail must do an RDNS lookup before accepting a incoming SMTP connection. If 0, the check is not performed; if 1 and the check fails, the user receives a 'server use forbidden' at MAIL_FROM time; if -S (S > 0) and the check fails, a delay of S seconds between SMTP commands is used to prevent massive spamming. SMTP authentication overrides the denial set by this option by giving authenticated users the ability to access the server from 'mapped' IPs. =item [SmartDNSHost] Setup a list of smart DNS hosts to which are directed DNS queries with recursion bit set to true. Such DNS hosts must support DNS recursion in queries. The format is: dns.home.bogus.net:tcp,192.168.1.1:udp,... =item [DisableEmitAuthUser] Enable/disable the emission the the 'X-AuthUser:' mail header for authenticated users. Valid values are "0" or '1', default is "0" (emission enabled). =item [SmtpGwConfig] Sets global SMTP gateway options. Those can be overridden by specific gateway options. See [L] for information. =item [Pop3LogPasswd] Control if POP3 passwords are logged into the POP3 log file. Set to "0" to disable password logging, set to "1" to enable logging of failed logins, and the to "2" to always enable password logging. Default is "0". =item [SmtpNoTLSAuths] Lists a comma-separated sequence of SMTP authentications that are allowed while the connections is in non-TLS mode (clear text). Do not set this variable if you do not want to impose any restriction, or set it to the empty string if you do not want any authentication method to be allowed in clear-text mode. =item [EnableCTRL-TLS] Enable CTRL TLS negotiation (default "1"). =item [EnablePOP3-TLS] Enable POP3 TLS (STLS) negotiation (default "1"). =item [EnableSMTP-TLS] Enable SMTP TLS (STARTTLS) negotiation (default "1"). =item [SSLUseCertsFile] =item [SSLUseCertsDir] =item [SSLWantVerify] =item [SSLAllowSelfSigned] =item [SSLWantCert] =item [SSLMaxCertsDepth] See [L] for information. =item [SmtpConfig] Default SMTP server config loaded if specific server IP[,PORT] config is not found. =item [SmtpConfig-IP | SmtpConfig-IP,PORT] Specific IP or IP,PORT SMTP server config. Examples: "SmtpConfig-192.168.1.123" "..." "SmtpConfig-192.168.1.17,1025" "..." The variable value is a comma separated sequence of configuration tokens whose meaning is: =over 8 =item MailAuth authentication required to send mail to the server. Please note that by setting this value everything requires authentication, even for sending to local domains, and this is probably not what you want. The "mail-auth" is also synonym of "MailAuth". =item WantTLS TLS connection needed to talk to this server. This is either done by issuing a STARTTLS command over a standard SMTP session, or by using an SMTPS port =back =back [L] =head1 MESSAGE FILTERS This feature offers a way to filter messages by providing the ability to execute external programs, such as scripts or real executables. These 'filters' may examine and/or modify messages and inform XMail of their actions with a return value. This feature offers the ability to inspect and modify messages, giving a way to reject messages based on content, alter messages (address rewriting) and so on. If this filters returns 'B<4, 5 or 6>' the message is rejected and is stopped in its travel. If the filter modifies the message it must return 'B<7>'. Additional flags are allowed to be returned to XMail as a result of filter processing by adding the flags value to the exits code above listed. The currently defined flags are : =over =item '16' Stop selected filter list processing. =back Filter flags are additive and if more than one flag need to be specified, their values must be added together. If a filter "raw" exit code is B and the filter needs to return extra flags B, the final return code B must be : B = B + B Example. Suppose a filter modified the message and hence needs to return B<7> as return code. Suppose also that a filter wants to block the filter selection list processing by specifying a flags value of B<16>, the value to be returned will be : B = B<7> + B<16> = B<23> Filter selection is driven by two files 'B' and 'B' located inside the $MAIL_ROOT/ directory and that have the following format: "sender"[TAB]"recipient"[TAB]"remote-addr"[TAB]"local-addr"[TAB]"filename"[NEWLINE] For example: "*@bad-domain.com" "*" "0.0.0.0/0" "0.0.0.0/0" "av-filter.tab" "*" "clean@purified.net" "0.0.0.0/0" "0.0.0.0/0" "spam-block.tab" "*" "*" "192.168.1.0/24" "0.0.0.0/0" "archive.tab" where the file "av-filter.tab" must be present inside the $MAIL_ROOT/filters directory. The "sender" and the "recipient" are resolved to the real account when possible. Address selection mask are formed by an IP address (network) plus the number of valid bits inside the network mask. The file 'B' lists filters that have to be applied to inbound messages (going to local mailboxes) while the file 'B' lists filters that have to be applied to outbound messages (delivered remotely). All four (sender+recipient+remote-addr+local-addr) selection fields must have a match in order "filename" to be evaluated. The syntax of the filter file is: "command"[TAB]"arg-or-macro"[TAB]...[NEWLINE] or: "!flags"[TAB]"command"[TAB]"arg-or-macro"[TAB]...[NEWLINE] Each file may contain multiple commands, that will be executed in strictly sequential order. The first command that will trigger a rejection code will make the filtering process to end. The 'B' parameter is a comma-separated list of flags that drives the filter execution. The syntax of each flag is either FLAG or FLAG=VAL. Currently supported flags are: =over 4 =item aex exclude filter execution in case of authenticated sender =item wlex exclude filter execution in case the client IP is white-listed inside the SMTP.IPPROP.TAB file. This flag works only for SMTP filters. =item timeo sets the timeout value for this filter execution =back Each argument can be a macro also (see [L]): =over 4 =item FROM the sender of the message =item RFROM the sender of the message resolved to the real account, when possible (alias resolution) =item RCPT the target of the message =item RRCPT the target of the message resolved to the real account, when possible (alias resolution) =item REMOTEADDR remote IP address and port of the sender =item LOCALADDR local IP address and port where the message has been accepted =item FILE the message file path (the external command may modify the file if it returns 'B<7>' as command exit value.) =item MSGID with the (XMail unique) message id =item MSGREF the reference SMTP message id =item USERAUTH name of the SMTP authenticated user, or "-" if no authentication has been supplied =back Here 'B' is the name of an external program that processes the message and returns its processing result. If it returns 'B<6>' the message is rejected and a notification message is sent to the sender. By returning 'B<5>' the message is rejected without notification. While returning 'B<4>' the message is rejected without notification and without being frozen (a 'B<5>' response could lead to a frozen message if the L<"SERVER.TAB"> configuration enables this). If all filters return values different from 'B<6, 5 and 4>' the message continues its trip. The filter command may also modify the file (AV scanning, content filter, message rewriting, etc) by returning 'B<7>'. The filter 'B' return 'B<7>' in case it modifies the message. If the filter changes the message file it 'B' keep the message structure and it 'B' terminate all line with . The filter has also the ability to return a one-line custom return message by creating a file named $(FILE).rej holding the message in the very first line. This file should be created 'B' when the filter returns a rejection code ('B<6, 5 and 4>')and 'B' in case of passthrough code ('B<7>') or modify code. The spool files has this structure: Info Data [ 1th line ] SmtpDomain [ 2nd line ] SmtpMessageID [ 3rd line ] MAIL FROM:<...> [ 4th line ] RCPT TO:<...> [ 5th line ] <> [ 6th line ] ... After the 'BEMAIL-DATAEE>' tag (5th line) the message follows. The message is composed of a headers section and, after the first empty line, the message body. The format of the "Info Data" line is: [ClientIP]:ClientPort;[ServerIP]:ServerPort;Time 'B' care must be used when modifying the message because the filter will be working on the real message, and a badly reformatted file will lead to message loss. The spool file header (any data before <>) 'B' be preserved as is by the filter in case of message rewrite happens. [L] =head1 SMTP MESSAGE FILTERS Besides having the ability to perform off-line message filtering, XMail gives the user the power to run filters during the SMTP session. Three files drive the SMTP on-line filtering, and these are 'B', 'B' and 'B'. The file 'B', contains one or more commands to be executed after the remote SMTP client sends the RCPT_TO command(s), and before XMail sends the response to the command. The file 'B' contains one or more commands to be executed after the remote SMTP client sends the DATA command, and before XMail sends the response to the command. Using such filters, the user can tell XMail if or if not accept the following transaction and, in case of rejection, the user is also allowed to specify a custom message to be sent to the remote SMTP client. The file 'B' contains one or more commands to be executed after XMail received the whole client DATA, and before XMail sends the final response to the DATA command (final messages ack). The files 'B', 'B' and 'B' contains zero or more lines with the following format: "command"[TAB]"arg-or-macro"[TAB]...[NEWLINE] or: "!flags"[TAB]"command"[TAB]"arg-or-macro"[TAB]...[NEWLINE] Each file may contain multiple commands, that will be executed in strictly sequential order. The first command that will trigger a rejection code will make the filtering process to end. The 'B' parameter is a comma-separated list of flags that drives the filter execution. The syntax of each flag is either FLAG or FLAG=VAL. Currently supported flags are: =over 4 =item aex exclude filter execution in case of authenticated sender =item wlex exclude filter execution in case the client IP is white-listed inside the SMTP.IPPROP.TAB file. =back Each argument can be a macro also (see [L]): =over 4 =item FILE message file path =item USERAUTH name of the SMTP authenticated user, or "-" if no authentication has been supplied =item REMOTEADDR remote IP address and port of the sender =item LOCALADDR local IP address and port where the message has been accepted =item FROM message sender address =item CRCPT last recipient submitted by the client. For post-rcpt filters, this will be used as to-validate recipient =item RRCPT last recipient submitted by the client, translated to the real account (in case of aliases) =back Filter commands have the ability to inspect and modify the content of the message (or info) file. The exit code of commands executed by XMail are used to tell XMail the action that has to be performed as a consequence of the filter. The exit code is composed by a raw exit code and additional flags. Currently defined flags are: =over =item '16' Stop selected filter list processing. =back Currently defined raw exit codes are: =over =item '3' Reject the message. =back Any other exit codes will make XMail to accept the message, and can be used also when changing the content of the $(FILE) file. 'B' care must be used when changing the $(FILE) file, since XMail expect the file format to be correct. Also, it is important to preserve the line termination of the file itself. When rejecting the message, the filter command has the ability to specify the SMTP status code that XMail will send to the remote SMTP client, by creating a file named $(FILE).rej containing the message in the very first line. Such file will be automatically removed by XMail. The data passed to filter commands inside $(FILE) varies depending if the command is listed inside 'B', 'B' or inside 'B'. Commands listed inside 'B' and 'B' will receive the following data stored inside $(FILE): Info Data [ 1th line ] SmtpDomain [ 2nd line ] SmtpMessageID [ 3rd line ] MAIL FROM:<...> [ 4th line ] RCPT TO:<...> {...} [ 5th line ] ... The file can have one or more "RCPT TO" lines. The format of the "Info Data" line is: ClientDomain;[ClientIP]:ClientPort;ServerDomain;[ServerIP]:ServerPort;Time;Logo Note that in case of 'B', the $(FILE) data does not yet contain the current recipient to be validated. This needs to be fetched and passed to the external program using the $(CRCPT) macro (or $(RRCPT)). Commands listed inside 'B' will receive the following data stored inside $(FILE): Info Data [ 1th line ] SmtpDomain [ 2nd line ] SmtpMessageID [ 3rd line ] MAIL FROM:<...> [ 4th line ] RCPT TO:<...> {...} [ 5th line ] ... <> ... After the 'BEMAIL-DATAEE>' tag the message follows. The message is composed of a headers section and, after the first empty line, the message body. The format of the RCPT line is: RCPT TO:
{ra=real-address} where "real-address" is the "address" after it has been translated (if aliases applies) to the real local address. Otherwise it holds the same value of "address". In case one or more SMTP filter operations are not needed, avoid to create zero sized files altogether, since this will result in faster processing. [L] =head1 USER.TAB VARIABLES The following variables are for use in the L<"USER.TAB"> configuration file. =over 4 =item [RealName] Full user name, i.e.: "RealName" "Davide Libenzi" =item [HomePage] User home page, i.e.: "HomePage" "http://www.xmailserver.org/davide.html" =item [MaxMBSize] Max user mailbox size in Kb, i.e.: "MaxMBSize" "30000" =item [ClosedML] Specify if the mailing list is closed only to subscribed users, i.e.: "ClosedML" "1" =item [ListSender] Specify the mailing list sender or administrator: "ListSender" "ml-admin@xmailserver.org" This variable should be set to avoid delivery error notifications to reach the original message senders. =item [SmtpPerms] User SMTP permissions (see SMTPAUTH.TAB for info). =item [ReceiveEnable] Set to '1' if the account can receive email, '0' if you want to disable the account from receiving messages. =item [PopEnable] Set to '1' if you want to enable the account to fetch POP3 messages, '0' otherwise. =item [UseReplyTo] Enable/Disable the emission of the Reply-To: header for mailing list's messages (default 1). =item [MaxMessageSize] Set the maximum message size (in Kb) that the user is able to send through the server. Overrides the SERVER.TAB variable. =item [DisableEmitAuthUser] Enable/disable the emission the the 'X-AuthUser:' mail header for authenticated users. Valid values are '0' or '1', default is '0' (emission enabled). This variable overrides the SERVER.TAB one when present. =item [Pop3ScanCur] In case of Maildir mailbox structure, scan the "cur" directory during POP3 message list build. Set to "0" to disable "cur" directory scanning, or to "1" to enable it. =back [L] =head1 MAIL ROUTING THROUGH ADDRESSES A full implementation of SMTP protocol allows the ability to perform mail routing bypassing DNS MX records by means of setting, in a ruled way, the 'RCPT TO: <>' request. A mail from 'Bhostz>' directed to 'Bhosta,E<64>hostb:foouserE<64>hostc>' is received by 'Bhosta>' then sent to 'Bhostb>' using 'Bhosta:xuserE<64>hostz>>' and 'Bhostb:foouserE<64>hostc>>'. The message is then sent to 'B'hostc> using 'Bhostb,E<64>hosta:xuserE<64>hostz>>' and 'Bhostc>>'. [L] =head1 XMAIL SPOOL DESIGN The new spool filesystem tree format has been designed to enable XMail to handle very large queues. Instead of having a single spool directory (like versions older than 0.61) a two layer deep splitting has been introduced so that its structure is: 0 0 mess rsnd info temp slog cust froz ... ... When XMail needs to create a new spool file a spool path is chosen in a random way and a new file with the format: mstime.tid.seq.hostname is created inside the 'B' subdirectory. When the spool file is ready to be committed, it's moved into the 'B' subdirectory that holds newer spool files. If XMail fails sending a new message (the ones in mess subdirectory) it creates a log file (with the same name of the message file) inside the 'B' subdirectory and move the file from 'B' to 'B'. During the message sending the message itself is locked by creating a file inside the 'B' subdirectory (with the same name of the message file). If the message has permanent delivery errors or is expired and if the option 'B' of the 'B' file is off, the message file is moved into the 'B' subdirectory. [L] =head1 SMTP GATEWAY CONFIGURATION An SMTP gateway definition inside XMail can be followed by a set of configuration options, that are in the form of a comma-separated VAR=VAL or FLAG definitions. Currently defined options are: =over 4 =item NeedTLS If set to 1, instruct XMail to try to establish a TLS session with the remote host (by the means of a STARTTLS SMTP command). If set to 2, XMail will try to establish a TLS session, but it will fail if not able to do so (the remote server does not support STARTTLS, or reject our attempt to negotiate the TLS link). =item OutBind Sets the IP address of the network interface that should be used when connecting to the remote host. This configuration should be used carefully, because XMail will fail if the selected IP of the interface does not have a route to the remote host using such IP. =back [L] =head1 SSL CONFIGURATION XMail uses to identify itself during SSL negotiations, by the mean of the two files 'B' and 'B'. These files 'B' be available inside the 'B' directory. Both are in PEM format, and one represent the server certificate file/chain ('B') while the other represent the server private key file ('B'). XMail uses the OpenSSL libraries for its SSL operations. L contains examples about how to create certificates to be use by XMail, while L describes own to generate keys. In order to properly manage your XMail server when using SSL support, you need to have access to the OpenSSL binary. For Unix ports, this is available as a package, whose name varies depending on the distribution. For Windows, pre-built versions of theOpenSSL libraries and binary are supplied inside the "win32ssl" directory of the XMail source package. For example, to create a self-signed certificate, you first have to create a private key with: $ openssl genrsa 2048 > server.key After you have created the private key, you can create you own copy of the self-signed certificate with: $ openssl req -new -x509 -key server.key -out server.cert C:> openssl req -new -x509 -key server.key -out server.cert -config openssl.cnf Remeber that the Common Name (CN) that you supply to the OpenSSL binary, is the fully qualified host name that answers to the IP where your XMail server is listening. If you want to have a certificate signed by an authority, you need to generate a certificate request file: $ openssl req -new -key server.key -out cert.csr C:> openssl req -new -key server.key -out cert.csr -config openssl.cnf The 'B' file is supplied inside the Xmail's Windows binary package, and inside the 'B' directory of the source package. The 'B' file needs then to be submitted to the certificate authority in order to obtain a root-signed certificate file (that will be your 'B'). The behaviour of the XMail SSL module is controlled by a few 'B' variables: =over 4 =item [SSLWantVerify] Tells the SSL link negotiation code to verify the remote peer certificate. If this is enabled, you need to use either B or B to provide a set of valid root certificates. You can also add your own certificates in the set, in order to provide access to your servers by clients using certificates signed by you. =item [SSLWantCert] Tells the SSL link negotiation code to fail if the remote peer does not supply a certificate. =item [SSLAllowSelfSigned] Allows self-signed certificates supplied by remote peers. =item [SSLMaxCertsDepth] Set the maximum certificate chain depth for the verification process. =item [SSLUseCertsFile] When using B, the SSL code will verify the peer certificate using standard SSL certificate chain verification rules. It is possible to supply to XMail an extra list of valid certificates, by filling up a 'B' file and setting B to 1. The 'B' is a concatenation of certificates in PEM format. =item [SSLUseCertsDir] In the same way as B does, setting B to 1 enables the usage of extra valid certificates stored inside the 'B' XMail sub-directory. The 'B' contains hashed file names that are created by feeding the directory path to the 'B' OpenSSL Perl script (a Windows-friendly version of 'B', named 'B' is contained inside the 'B' subdirectory of the source package). Unix users will find proper CA certificates inside the standard install paths of OpenSSL, while Windows users will find them inside the 'B' subdirectory of the source package. To use 'B' you need to have the OpenSSL binaries (executable and shared libraries) correctly installed in your system, and the executable reachable from your B. Then you simply run it by passing the path to the PEM certificates directory ('B'). The 'B' script will call the OpenSSL binary and will generated hashed file names (that are either symlinks or copies) that point/replicate the mapped certificate. =back [L] =head1 SMTP COMMANDS These are commands understood by ESMTP server: =over 4 =item MAIL FROM:<> =item RCPT TO:<> =item DATA =item HELO =item EHLO =item STARTTLS =item AUTH =item RSET =item VRFY =item ETRN =item NOOP =item HELP =item QUIT =back [L] =head1 POP3 COMMANDS These are commands understood by POP3 server: =over 4 =item USER =item PASS =item CAPA =item STLS =item APOP =item STAT =item LIST =item UIDL =item QUIT =item RETR =item TOP =item DELE =item NOOP =item LAST =item RSET =back [L] =head1 COMMAND LINE Most of XMail configuration settings are command line tunables. These are command line switches organized by server. =over 4 =item [XMAIL] =over 8 =item -Ms pathname Mail root path (also settable with MAIL_ROOT environment). =item -Md Activate debug (verbose) mode. =item -Mr hours Set log rotate hours step. =item -Mx split-level Set the queue split level. The value you set here is rounded to the lower prime number higher or equal than the value you've set. =item -MR bytes Set the size of the socket's receive buffer in bytes (rounded up to 1024). =item -MS bytes Set the size of the socket's send buffer in bytes (rounded up to 1024). =item -MM Setup XMail to use 'Maildir' delivery (default on Unix). =item -Mm Setup XMail to use 'mailbox' delivery (default on Windows). =item -MD ndirs Set the number of subdirectories allocated for the DNS cache files storage ( default 101 ). =item -M4 Use only IPV4 records for host name lookups (default). =item -M6 Use only IPV6 records for host name lookups. =item -M5 Use IPV4 records if present, or IPV6 records otherwise, for host name lookups. =item -M7 Use IPV6 records if present, or IPV4 records otherwise, for host name lookups. =back =item [POP3] =over 8 =item -P- Disable the service. =item -P6 Bind to IPV6 address (in case no -PI option is specified) =item -Pp port Set POP3 server port (if you change this you must know what you're doing). =item -Pt timeout Set POP3 session timeout (seconds) after which the server closes. the connection if it does not receive any commands. =item -Pl Enable POP3 logging. =item -Pw timeout Set the delay timeout in response to a bad POP3 login. Such time is doubled at the next bad login. =item -Ph Hang the connection in bad login response. =item -PI ip[:port] Bind server to the specified ip address and (optional) port (can be multiple). =item -PX nthreads Set the maximum number of threads for POP3 server. =back =item [POP3S] =over 8 =item -B- Disable the service. =item -B6 Bind to IPV6 address (in case no -BI option is specified) =item -Bp port Set POP3S server port (if you change this you must know what you're doing). =item -BI ip[:port] Bind server to the specified ip address and (optional) port (can be multiple). =back =item [SMTP] =over 8 =item -S- Disable the service. =item -S6 Bind to IPV6 address (in case no -SI option is specified) =item -Sp port Set SMTP server port (if you change this you must know what you're doing). =item -St timeout Set SMTP session timeout (seconds) after which the server closes the connection if no commands are received. =item -Sl Enable SMTP logging. =item -SI ip[:port] Bind server to the specified ip address and (optional) port (can be multiple). =item -SX nthreads Set the maximum number of threads for SMTP server. =item -Sr maxrcpts Set the maximum number of recipients for a single SMTP message (default 100). =item -Se nsecs Set the expire timeout for a POP3 authentication IP (default 900). =back =item [SMTPS] =over 8 =item -X- Disable the service. =item -X6 Bind to IPV6 address (in case no -XI option is specified) =item -Xp port Set SMTPS server port (if you change this you must know what you're doing). =item -XI ip[:port] Bind server to the specified ip address and (optional) port (can be multiple). =back =item [SMAIL] =over 8 =item -Qn nthreads. Default 16, maximum 256. Set the number of mailer threads. =item -Qt timeout Set the time to be wait for a next try after send failure. Default 480. =item -Qi ratio Set the increment ratio of the reschedule time in sending a messages. At every failure in delivery a message, reschedule time T is incremented by (T / ratio), therefore : T(i) = T(i-1) + T(i-1)/ratio. If you set this ratio to zero, T remain unchanged over delivery tentatives. Default 16. =item -Qr nretries Set the maximum number of times to try to send the message. Default 32. =item -Ql Enable SMAIL logging. =item -QT timeout Timeout value for filters commands in seconds. Default 90. =item -Qg Enable filter logging. =back =item [PSYNC] =over 8 =item -Y- Disable the service. =item -Yi interval Set external POP3 accounts sync interval. Setting this to zero will disable the PSYNC task. Default 120. =item -Yt nthreads Set the number of POP3 sync threads. =item -YT nsec Sets the timeout for POP3 client connections. =item -Yl Enable PSYNC logging. =back =item [FINGER] =over 8 =item -F- Disable the service. =item -F6 Bind to IPV6 address (in case no -FI option is specified) =item -Fp port Set FINGER server port (if you change this you must know what you're doing). =item -Fl Enable FINGER logging. =item -FI ip[:port] Bind server to the specified ip address and (optional) port (can be multiple). =back =item [CTRL] =over 8 =item -C- Disable the service. =item -C6 Bind to IPV6 address (in case no -CI option is specified) =item -Cp port Set CTRL server port (if you change this you must know what you're doing). =item -Ct timeout Set CTRL session timeout (seconds) after which the server closes the connection if no commands are received. =item -Cl Enable CTRL logging. =item -CI ip[:port] Bind server to the specified ip address and (optional) port (can be multiple). =item -CX nthreads Set the maximum number of threads for CTRL server. =back =item [CTRLS] =over 8 =item -W- Disable the service. =item -W6 Bind to IPV6 address (in case no -WI option is specified) =item -Wp port Set CTRLS server port. =item -WI ip[:port] Bind server to the specified ip address and (optional) port (can be multiple). =back =item [LMAIL] =over 8 =item -Ln nthreads Set the number of local mailer threads. =item -Lt timeout Set the sleep timeout for LMAIL threads (in seconds, default 2). =item -Ll Enable local mail logging. =back =back [L] =head1 XMAIL ADMIN PROTOCOL It's possible to remote admin XMail due to the existence of a 'controller server' that runs with XMail and waits for TCP/IP connections on a port (6017 or tunable via a '-Cp nport') command line option. Admin protocol details: =over 4 =item L<"Description"> =item L<"Adding a user"> =item L<"Deleting a user"> =item L<"Changing a user's password"> =item L<"Authenticate user"> =item L<"Retrieve user statistics"> =item L<"Adding an alias"> =item L<"Deleting an alias"> =item L<"Listing aliases"> =item L<"Listing user vars"> =item L<"Setting user vars"> =item L<"Listing users"> =item L<"Getting mailproc.tab file"> =item L<"Setting mailproc.tab file"> =item L<"Adding a mailing list user"> =item L<"Deleting a mailing list user"> =item L<"Listing mailing list users"> =item L<"Adding a domain"> =item L<"Deleting a domain"> =item L<"Listing handled domains"> =item L<"Adding a domain alias"> =item L<"Deleting a domain alias"> =item L<"Listing alias domains"> =item L<"Getting custom domain file"> =item L<"Setting custom domain file"> =item L<"Listing custom domains"> =item L<"Adding a POP3 external link"> =item L<"Deleting a POP3 external link"> =item L<"Listing POP3 external links"> =item L<"Enabling a POP3 external link"> =item L<"Listing files"> =item L<"Getting configuration file"> =item L<"Setting configuration file"> =item L<"Listing frozen messages"> =item L<"Rescheduling frozen message"> =item L<"Deleting frozen message"> =item L<"Getting frozen message log file"> =item L<"Getting frozen message"> =item L<"Starting a queue flush"> =item L<"Do nothing command"> =item L<"Quit the connection"> =item L<"Do you want...?"> =back =head2 Description The XMail admin server 'speaks' a given protocol that can be used by external GUI utilities written with the more disparate scripting languages, to remote administer the mail server. The protocol is based on sending formatted command and waiting for formatted server responses and error codes. All the lines, commands, and responses are delimited by a pair. The error code string (I'll call it RESSTRING) has the given format: "+DDDDD OK" if the command execution is successful while: "-DDDDD ErrorString" if the command failed. The " character is not included in responses. DDDDD is a numeric error code while ErrorString is a description of the error. If DDDDD equals 00100, a lines list, terminated by a line with a single point (.), follows the response. The input format for commands is similar to the one used in TAB files: "cmdstring"[TAB]"param1"[TAB]..."paramN" where 'cmdstring' is the command string identifying the action to be performed, and param1,... are the parameters of the command. Immediately after the connection with XMail controller server is established the client receives a RESSTRING that is: +00000 XMail ... if the server is ready, while: -DDDDD ... (where DDDDDD is an error code) if not. The TimeStamp string has the format: currtime.pid@ipaddress and is used in MD5 authentication procedure. As the first action immediately after the connection the client must send an authentication string with this format: "user"[TAB]"password" where user must be enabled to remote admin XMail. Clear text authentication should not be used due server security. Using MD5 authentication instead, the client must perform an MD5 checksum on the string composed by (<> included): password and then send to the server: "user"[TAB]"#md5chksum" where md5chksum is the MD5 checksum (note 'B<#>' as first char of sent digest). The result of the authentication send is a RESSTRING. If the user does not receive a positive authentication response, the connection is closed by the server. It is possible to establish an SSL session with the server by issuing the "#!TLS" string as login string. In response to that, the server will send back a RESSTRING. In case of success RESSTRING, the client can proceed with the SSL link negotiation with the server. [L] [L] =head2 Adding a user "useradd"[TAB]"domain"[TAB]"username"[TAB]"password"[TAB]"usertype" where: =over 4 =item domain domain name (must be handled by the server). =item username username to add. =item password user password. =item usertype 'U' for normal user and 'M' for mailing list. =back The result is a RESSTRING. [L] [L] =head2 Deleting a user "userdel"[TAB]"domain"[TAB]"username" where: =over 4 =item domain domain name (must be handled by the server). =item username username to delete. =back The result is a RESSTRING. [L] [L] =head2 Changing a user's password "userpasswd"[TAB]"domain"[TAB]"username"[TAB]"password" where: =over 4 =item domain domain name (must be handled by the server). =item username username (must exist). =item password new password. =back The result is a RESSTRING. [L] [L] =head2 Authenticate user "userauth"[TAB]"domain"[TAB]"username"[TAB]"password" where: =over 4 =item domain domain name. =item username username. =item password password. =back The result is a RESSTRING. [L] [L] =head2 Retrieve user statistics "userstat"[TAB]"domain"[TAB]"username" where: =over 4 =item domain domain name. =item username username/alias. =back The result is a RESSTRING. If successful (00100), a formatted matching users list follows terminated by a line containing a single dot (.). This is the format of the listing: "variable"[TAB]"value" Where valid variables are: =over 4 =item RealAddress real address (maybe different is the supplied username is an alias). =item MailboxSize total size of the mailbox in bytes. =item MailboxMessages total number of messages. =item LastLoginIP last user login IP address. =item LastLoginTimeDate time of the last login. =back [L] [L] =head2 Adding an alias "aliasadd"[TAB]"domain"[TAB]"alias"[TAB]"account" where: =over 4 =item domain domain name (must be handled by the server). =item alias alias to add. =item account real email account (locally handled). This can be a fully qualified email address or a username inside the same domain. =back The result is a RESSTRING. [L] [L] =head2 Deleting an alias "aliasdel"[TAB]"domain"[TAB]"alias" where: =over 4 =item domain domain name (must be handled by the server). =item alias alias to delete. =back The result is a RESSTRING. [L] [L] =head2 Listing aliases "aliaslist"[TAB]"domain"[TAB]"alias"[TAB]"account" or "aliaslist"[TAB]"domain"[TAB]"alias" or "aliaslist"[TAB]"domain" or "aliaslist" where: =over 4 =item domain domain name, optional (can contain wild cards). =item alias alias name, optional (can contain wildcards). =item account account, optional (can contain wildcards). =back Example: "aliaslist"[TAB]"foo.bar"[TAB]"*"[TAB]"mickey" lists all aliases of user 'B' in domain 'B'. The result is a RESSTRING. In successful cases (00100) a formatted matching users list follows, terminated by a line containing a single dot (.). This is the format of the listing: "domain"[TAB]"alias"[TAB]"username" [L] [L] =head2 Adding an external alias "exaliasadd"[TAB]"local-address"[TAB]"remote-address" where: =over 4 =item local-address local email address. =item remote-address remote email address. =back For example, the following command string: "exaliasadd"[TAB]"dlibenzi@home.bogus"[TAB]"dlibenzi@xmailserver.org" will link the external email address 'Bxmailserver.org>' with the local email address 'Bhome.bogus>'. The result is a RESSTRING. [L] [L] =head2 Deleting an external alias "exaliasdel"[TAB]"remote-address" where: =over 4 =item remote-address remote email address. =back The result is a RESSTRING. [L] [L] =head2 Listing external aliases "exaliaslist"[TAB]"local-address"[TAB]"remote-address" or "exaliaslist"[TAB]"local-address" or "exaliaslist" where: =over 4 =item local-address local email address. This can contain wildcard characters. =item remote-address remote email address. This can contain wildcard characters. =back Example: "exaliaslist"[TAB]"*@home.bogus" lists all the external aliases linked to local accounts in domain 'B'. The result is a RESSTRING. In successful cases (00100) a formatted matching users list follows, terminated by a line containing a single dot (.). This is the format of the listing: "rmt-domain"[TAB]"rmt-name"[TAB]"loc-domain"[TAB]"loc-name" [L] [L] =head2 Listing user vars "uservars"[TAB]"domain"[TAB]"username" where: =over 4 =item domain domain name. =item username username. =back The result is a RESSTRING. In successfully cases (00100) a formatted list of user vars follow, terminated by a line containing a single dot (.). This is the format of the listing: "varname"[TAB]"varvalue" [L] [L] =head2 Setting user vars "uservarsset"[TAB]"domain"[TAB]"username"[TAB]"varname"[TAB]"varvalue" ... where: =over 4 =item domain domain name. =item username username. =item varname variable name. =item varvalue variable value. =back There can be multiple variable assignments with a single call. If 'B' is the string 'B<.|rm>' the variable 'B' is deleted. The result is a RESSTRING. [L] [L] =head2 Listing users "userlist"[TAB]"domain"[TAB]"username" or "userlist"[TAB]"domain" or "userlist" where: =over 4 =item domain domain name, optional (can contain wild cards). =item username username, optional (can contain wild cards). =back Example: "userlist"[TAB]"spacejam.foo"[TAB]"*admin" lists all users of domain 'B' that end with the word 'B'. The result are a RESSTRING. If successful (00100), a formatted matching users list follows terminated by a line containing a single dot (.). This is the format of the listing: "domain"[TAB]"username"[TAB]"password"[TAB]"usertype" [L] [L] =head2 Getting mailproc.tab file "usergetmproc"[TAB]"domain"[TAB]"username" or "usergetmproc"[TAB]"domain"[TAB]"username"[TAB]"flags" where: =over 4 =item domain domain name. =item username username. =item flags flags specifying which mailproc to retrieve. Use 'U' for user mailproc, or 'D' for domain mailproc (or 'DU' for a merge of both). If not specified, 'DU' is assumed. =back Example: "usergetmproc"[TAB]"spacejam.foo"[TAB]"admin" gets mailproc.tab file for user 'B' in domain 'B'. The result is a RESSTRING. In successful cases (00100) the mailproc.tab file is listed line by line, terminated by a line containing a single dot (.). [L] [L] =head2 Setting mailproc.tab file "usersetmproc"[TAB]"domain"[TAB]"username" or "usersetmproc"[TAB]"domain"[TAB]"username"[TAB]"which" where: =over 4 =item domain domain name. =item username username. =item which which mailproc.tab should be set. Use 'U' for the user one, and 'D' for the domain one. If not specified, 'U' is assumed. =back Example: "usersetmproc"[TAB]"spacejam.foo"[TAB]"admin" sets mailproc.tab file for user 'B' in domain 'B'. The result is a RESSTRING. If successful (00101), the client must list the mailproc.tab file line by line, ending with a line containing a single dot (.). If a line of the file begins with a dot, another dot must be added at the beginning of the line. If the file has zero length the mailproc.tab is deleted. The client then gets another RESSTRING indicating the final command result. [L] [L] =head2 Adding a mailing list user "mluseradd"[TAB]"domain"[TAB]"mlusername"[TAB]"mailaddress"[TAB]"perms" or "mluseradd"[TAB]"domain"[TAB]"mlusername"[TAB]"mailaddress" where: =over 4 =item domain domain name (must be handled by the server). =item mlusername mailing list username. =item mailaddress mail address to add to the mailing list 'mlusernameE<64>domain'. =item perms user permissions (R or RW or RA). When 'B' is not specified the default is RW. =back The result is a RESSTRING. [L] [L] =head2 Deleting a mailing list user "mluserdel"[TAB]"domain"[TAB]"mlusername"[TAB]"mailaddress" where: =over 4 =item domain domain name (must be handled by the server). =item mlusername mailing list username. =item mailaddress mail address to delete from the mailing list 'mlusernameE<64>domain'. =back The result is a RESSTRING. [L] [L] =head2 Listing mailing list users "mluserlist"[TAB]"domain"[TAB]"mlusername" where: =over 4 =item domain domain name (must be handled by the server). =item mlusername mailing list username. =back The result is a RESSTRING. If successful (00100), a formatted list of mailing list users follows terminated by a line containing a single dot (.). [L] [L] =head2 Adding a domain "domainadd"[TAB]"domain" where: =over 4 =item domain domain name to add. =back The result is a RESSTRING. [L] [L] =head2 Deleting a domain "domaindel"[TAB]"domain" where: =over 4 =item domain domain name to delete. =back The result is a RESSTRING. This is not always a safe operation. [L] [L] =head2 Listing handled domains "domainlist" or: "domainlist"[TAB]"wildmatch0"[TAB]...[TAB]"wildmatchN" The result is a RESSTRING. The wild match versions simply returns a filtered list of domains. If successful (00100), a formatted list of handled domains follows, terminated by a line containing a single dot (.). [L] [L] =head2 Adding a domain alias "aliasdomainadd"[TAB]"realdomain"[TAB]"aliasdomain" Example: "aliasdomainadd"[TAB]"xmailserver.org"[TAB]"xmailserver.com" defines 'B' as an alias of 'B', or: "aliasdomainadd"[TAB]"xmailserver.org"[TAB]"*.xmailserver.org" defines all subdomains of 'B' as aliases of 'B'. [L] [L] =head2 Deleting a domain alias "aliasdomaindel"[TAB]"aliasdomain" Example: "aliasdomaindel"[TAB]"*.xmailserver.org" removes the 'B<*.xmailserver.org>' domain alias. [L] [L] =head2 Listing alias domains "aliasdomainlist" or: "aliasdomainlist"[TAB]"wild-dom-match" or: "aliasdomainlist"[TAB]"wild-dom-match"[TAB]"wild-adom-match" The result is a RESSTRING. The wild match version simply returns a filtered list of alias domains. If successful (00100), a formatted list of alias domains follows, terminated by a line containing a single dot (.). The output format is: "real-domain"[TAB]"alias-domain" [L] [L] =head2 Getting custom domain file "custdomget"[TAB]"domain" where: =over 4 =item domain domain name. =back Example: "custdomget"[TAB]"spacejam.foo" gets the custom domain file for domain 'B'. The result is a RESSTRING. If successful (00100), the custom domain file is listed line by line terminated by a line containing a single dot (.). [L] [L] =head2 Setting custom domain file "custdomset"[TAB]"domain" where: =over 4 =item domain domain name. =back Example: "custdomset"[TAB]"spacejam.foo" sets custom domain file for domain 'B'. The result is a RESSTRING. If successful (00101), the client must list the custom domain file line by line, ending with a line containing a single dot (.). If a line of the file begins with a dot, another dot must be added at the begin of the line. If the file has zero length the custom domain file is deleted. The client then gets another RESSTRING indicating the final command result. [L] [L] =head2 Listing custom domains "custdomlist" The result is a RESSTRING. If successful (00100), a formatted list of custom domains follows, terminated by a line containing a single dot (.). [L] [L] =head2 Adding a POP3 external link "poplnkadd"[TAB]"loc-domain"[TAB]"loc-username"[TAB]"extrn-domain"=> [TAB]"extrn-username"[TAB]"extrn-password"[TAB]"authtype" where: =over 4 =item loc-domain local domain name (must be handled by the server). =item loc-username local username which receives mails. =item extrn-domain external domain. =item extrn-username external username. =item extrn-password external user password. =item authtype authentication method (see [L]). =back The remote server must support 'B' authentication to specify APOP as authtype. Using APOP authentication is more secure because clear usernames and passwords do not travel on the network; if you're not sure about it, specify 'B' as authtype. The result is a RESSTRING. [L] [L] =head2 Deleting a POP3 external link "poplnkdel"[TAB]"loc-domain"[TAB]"loc-username"[TAB]"extrn-domain"=> [TAB]"extrn-username" where: =over 4 =item loc-domain local domain name (must be handled by the server). =item loc-username local username which receives mails. =item extrn-domain external domain. =item extrn-username external username. =back The result is a RESSTRING. [L] [L] =head2 Listing POP3 external links "poplnklist"[TAB]"loc-domain"[TAB]"loc-username" or "poplnklist"[TAB]"loc-domain" or "poplnklist" The result is a RESSTRING. If successful (00100), a formatted list of handled domains follows, terminated by a line containing a single dot (.). The format of the listing is: "loc-domain"[TAB]"loc-username"[TAB]"extrn-domain"[TAB]"extrn-username"=> [TAB]"extrn-password"[TAB]"authtype"[TAB]"on-off" [L] [L] =head2 Enabling a POP3 external link "poplnkenable"[TAB]"enable"[TAB]"loc-domain"[TAB]"loc-username"=> [TAB]"extrn-domain"[TAB]"extrn-username" or "poplnkenable"[TAB]"enable"[TAB]"loc-domain"[TAB]"loc-username" where: =over 4 =item enable 1 for enabling - 0 for disabling. =item loc-domain local domain name. =item loc-username local username which receives mails. =item extrn-domain external domain. =item extrn-username external username. =back In the second format all users, links are affected by the enable operation. The result is a RESSTRING. [L] [L] =head2 Listing files "filelist"[TAB]"relative-dir-path"[TAB]"match-string" where: =over 4 =item relative-dir-path path relative to MAIL_ROOT path. =item match-string wild card match string for file list selection. =back The result is a RESSTRING. If successful (00100), the directory is listed line by line, terminated by a line containing a single dot (.). The listing format is: "filename"[TAB]"filesize" [L] [L] =head2 Getting configuration file "cfgfileget"[TAB]"relative-file-path" where: =over 4 =item relative-file-path path relative to MAIL_ROOT path. =back Example: "cfgfileget"[TAB]"ctrlaccounts.tab" The result is a RESSTRING. If successful (00100), the file is listed line by line, terminated by a line containing a single dot (.). You CANNOT use this command with indexed files ! [L] [L] =head2 Setting configuration file "cfgfileset"[TAB]"relative-file-path" where: =over 4 =item relative-file-path path relative to MAIL_ROOT path. =back Example: "cfgfileset"[TAB]"ctrlaccounts.tab" The result is a RESSTRING. IF successful (00101), the client must list the configuration file line by line, ending with a line containing a single dot (.). If a line of the file begins with a dot, another dot must be added at the beginning of the line. If the file has zero length the configuration file is deleted. The client then gets another RESSTRING indicating the final command result. Remember that configuration files have a strict syntax and that pushing a incorrect one can make XMail not work properly. You CANNOT use this command with indexed files! [L] [L] =head2 Listing frozen messages "frozlist" The result is a RESSTRING. If successful (00100), a formatted list of frozen messages follows, terminated by a line containing a single dot (.). The format of the listing is: "msgfile"[tab]"lev0"[TAB]"lev1"[TAB]"from"[TAB]"to"[TAB]"time"[TAB]"size" Where: =over 4 =item msgfile message name or id. =item lev0 queue fs level 0 (first level directory index). =item lev1 queue fs level 1 (second level directory index). =item from message sender. =item to message destination. =item time message time ("YYYY-MM-DD HH:MM:SS"). =item size message size in bytes. =back [L] [L] =head2 Rescheduling frozen message "frozsubmit"[TAB]"lev0"[TAB]"lev1"[TAB]"msgfile" where: =over 4 =item msgfile message name or id. =item lev0 queue fs level 0 (first level directory index). =item lev1 queue fs level 1 (second level directory index). =back You can get this information from the L command. After a message has been successfully rescheduled it is deleted from the frozen fs path. The result is a RESSTRING. [L] [L] =head2 Deleting frozen message "frozdel"[TAB]"lev0"[TAB]"lev1"[TAB]"msgfile" where: =over 4 =item msgfile message name or id. =item lev0 queue fs level 0 (first level directory index). =item lev1 queue fs level 1 (second level directory index). =back You can get this information from the L command. The result is a RESSTRING. [L] [L] =head2 Getting frozen message log file "frozgetlog"[TAB]"lev0"[TAB]"lev1"[TAB]"msgfile" where: =over 4 =item msgfile message name or id. =item lev0 queue fs level 0 (first level directory index). =item lev1 queue fs level 1 (second level directory index). =back You can get this information from the L command. The result is a RESSTRING. If successful (00100), the frozen message log file follows, terminated by a line containing a single dot (.). [L] [L] =head2 Getting frozen message "frozgetmsg"[TAB]"lev0"[TAB]"lev1"[TAB]"msgfile" where: =over 4 =item msgfile message name or id. =item lev0 queue fs level 0 (first level directory index). =item lev1 queue fs level 1 (second level directory index). =back You can get this information from the L command. The result is a RESSTRING. If successful (00100), the frozen message file follows, terminated by a line containing a single dot (.). [L] [L] =head2 Starting a queue flush "etrn"[TAB]"email-match0"... where: =over 4 =item email-match0 wild card email matching for destination address. =back Example: "etrn" "*@*.mydomain.com" "your-domain.org" starts queueing all messages with a matching destination address. [L] [L] =head2 Do nothing command "noop" The result is a RESSTRING. [L] [L] =head2 Quit the connection "quit" The result is a RESSTRING. [L] [L] =head2 Do you want...? Do you want to build GUI configuration tools using common scripting languages (Java, TCL/Tk, etc) and XMail controller protocol? Do you want to build Web configuration tools? Please let me know . [L] [L] =head1 XMAIL LOCAL MAILER XMail has the ability to deliver locally prepared mail files that if finds in the 'B' directory. The format of these files is strict: mail from:<...>[CR][LF] rcpt to:<...>[CR][LF] ... [CR][LF] message text in RFC822 format with [CR][LF] line termination All lines must be [CR][LF] terminated, with one mail-from statement, one or more rcpt-to statements, an empty line and the message text. Mail files must not be created directly inside the 'B' directory but instead inside 'B' directory. When the file is prepared it has to be moved into 'B'. The file name format is: stime-seqnr.pid.hostname where: =over =item stime system time in sec from 01/01/1970. =item seqnr sequence number for the current file. =item pid process or thread id. =item hostname creator process host name. =back Example: 97456928-001.7892.home.bogus XMail has a number of LMAIL threads that periodically scan the 'B' directory watching for locally generated mail files. You can tune this number of threads with the 'B<-Ln nthreads>' command line option. The suggested number ranges from three to seven. [L] =head1 CtrlClnt (XMAIL ADMINISTRATION) You can use CtrlClnt to send administration commands to XMail. These commands are defined in the previous section (L<"XMAIL ADMIN PROTOCOL">). The syntax of CtrlClnt is: CtrlClnt [-snuptfSLcKCXHD] ... where: =over 4 =item -s server set server address. =item -n port set server port [6017]. =item -u user set username. =item -p pass set password. =item -t timeout set timeout [60]. =item -f filename set dump filename [stdout]. =item -S enable SSL link negotiation (talks to a CTRL port) =item -L use native SSL link (talks to a CTRLS port) =item -K filename set the SSL private key file (the environment variable "CTRL_KEY_FILE" also sets it) =item -C filename set the SSL certificate file (the environment variable "CTRL_CERT_FILE" also sets it) =item -X filename set the SSL certificate-list file (the environment variable "CTRL_CA_FILE" also sets it). See [L] for more information =item -H dir set the SSL certificate-store directory (the environment variable "CTRL_CA_PATH" also sets it). See [L] for more information =item -D enable debug output =back With the command and parameters that follow adhering to the command syntax, i.e.: CtrlClnt -s mail.foo.org -u davide.libenzi -p ciao=> useradd home.bogus foouser foopasswd U executes the command useradd with parameters 'B'. CtrlClnt returns 0 if the command is successful and != 0 if not. If the command is a query, then the result is printed to stdout. [L] =head1 SERVER SHUTDOWN =over 4 =item [Linux] Under Linux, XMail creates a file named XMail.pid in 'B' that contains the PID of the main XMail thread. By issuing a: kill -INT `cat /var/run/XMail.pid` a system administrator can initiate the shutdown process (this can take several seconds). You can use the supplied 'B' startup script to start / stop / restart XMail: xmail start / stop / restart =item [NT as console service] Under NT console service (XMail --debug ...) you can hit Ctrl-C to initiate the shutdown process. =item [NT as service] Using [Control Panel]->[Services] you can start and stop XMail as you wish. =item [All] XMail detects a shutdown condition by checking the presence of a file named 'B<.shutdown>' in its main directory (MAIL_ROOT). You can initiate XMail shutdown process by creating (or copying) a file with that name into MAIL_ROOT. =back [L] =head1 MkUsers This command line utility enables you to create the user accounts structure by giving it a formatted list of users parameters (or a formatted text file). The syntax of the list (or file) is: domain;username;password;real-name;homepage[NEWLINE] where a line whose first character is 'B<#>' is treated as a comment. This utility can also be used to create a random number users (useful for me to test server performance). These are MkUsers command line parameters: =over 4 =item -a numusers number of users to create in auto-mode. =item -d domain domain name in auto-mode. =item -f inputFile input file name {stdin}. =item -u username radix user name in auto-mode. =item -r rootdir mail root path {./}. =item -s mboxsize mailbox maximum size {10000}. =item -i useridbase base user id {1}; =item -m create Maildir boxes. =item -h show this message. =back MkUsers creates, under the specified root directory, the given structure: rootdir mailusers.tab domains domainXXX userXXX user.tab mailbox ... ... for the mailbox structure, while: rootdir mailusers.tab domains domainXXX userXXX user.tab Maildir tmp new cur ... ... for the Maildir structure. If the file 'B' already exist in the mail root path, MkUsers exits without overwriting the existing copy. This protect you from accidentally overwriting your file when playing inside the real MAIL_ROOT directory. If you want to setup the root directory (-r ...) as MAIL_ROOT, you must delete by hand the existing file (you must know what you're doing). If you setup the root directory (-r ...) as MAIL_ROOT you MUST have XMail stopped before running MkUsers. Existing files and directories are not overwritten by MkUsers so you can keep your users db in the formatted text file (or generate it by a database dump for example) and run MkUsers to create the structure. Remember that you have to add new domains in the 'B' file by hand. MkUsers is intended as a bulk-mode utility, not to create single user; for this CtrlClnt (or other GUI/Web configuration utilities) is better suited. [L] =head1 sendmail When building XMail, an executable called 'B' is created. This is a replacement of the sendmail program used mostly on Unix systems; it uses the local mail delivery of XMail to send email generated onto the server machine. These sendmail options are supported (other options are simply ignored): =over 4 =item -f{mail from} Set the sender of the email. =item -F{ext mail from} Set the extended sender of the email. =item -t Extract recipients from the 'To:'/'Cc:'/'Bcc:' header tags. =item -i Read the input until the End Of Stream, instead of stopping at the "\n.\n" sequence. =back The syntax is: sendmail [-t] [-f...] [-F...] [--input-file fname] [--xinput-file fname]=> [--rcpt-file fname] [--] recipient ... The message content is read from the standard input and must be RFC compliant. The following parameters are XMail extensions meant to be used with mailing lists managers (using sendmail as a mail list exploder): =over 4 =item --input-file fname take the message from the specified file instead from stdin (RFC format). =item --xinput-file fname take the message from the specified file instead from stdin (XMail format). =item --rcpt-file fname add recipients listed inside the specified file (list exploder). =back To be RFC compliant means that the message MUST have the format: [Headers] NewLine Body Suppose you have your message in the file 'msg.txt', you're 'xmailuserE<64>smartdomain', and you want to send the message to 'user1E<64>dom1' and 'user2E<64>dom2'. The syntax is: sendmail -fxmailuser@smartdomain user1@dom1 user2@dom2 < msg.txt or sendmail -fxmailuser@smartdomain --input-file msg.txt user1@dom1 user2@dom2 [L] =head1 MISCELLANEOUS =over 4 =item 1. To handle multiple POP3 domains, the server makes a reverse lookup of the IP address upon which it receives the connection. Suppose the reverse lookup results in 'B'. XMail checks if 'B' is handled, then it checks 'B', and then 'B'. The first resolved (in the given order) is the POP3 domain. To avoid the above behavior, it's sufficient that the POP3 client supply the entire email address as POP3 login username: foo@foodomain.net ==> foo@foodomain.net and not: foo@foodomain.net ==> foo This enables XMail to handle multiple domains in cases where more nic-names are mapped over a single IP address. To run finger queries you must specify: foo@foodomain.net@foodomain.net or as general rule: username@pop3domain@hostname You can use the optional configuration variable 'B' (see L<"SERVER.TAB VARIABLES"> above) to set the default domain for POP3 clients connections. This means that users of 'B' can use only the name part of their email address as POP3 login, while users of other hosted domains must use their entire email as POP3 login. =item 2. Important! =over 8 =item * 'B' =item * Use ctrl.ipmap.tab to restrict CTRL server access. =item * Use a long password (mixed upper/lower case with digits) for ctrlaccounts.tab. =back =item 3. The main cause of bugs with XMail is due a bad line termination of configuration files, so check that these files being correctly line terminated for your OS. Linux uses the standard while M$ uses . =item 4. If you get a bind error in Linux,you must comment pop3, smtp and finger entries in your /etc/inetd.conf. =item 5. Remember to compile the file CTRL.IPMAP.TAB to restrict the access to the IPs you use to remote administer XMail server. =item 6. If you have an heavily loaded server remember to setup the best number of XMAIL threads by specifying the 'B<-Qn nthreads>' option (you must do some tentatives to find the best value for your needs). Also you can limit the number of SMTP, POP3 and CTRL service threads by specifying the options 'B<-SX maxthreads>', 'B<-PX maxthreads>' and 'B<-CX maxthreads>'. =item 7. If you have enabled logging, remember to setup the 'B<-Mr hours>' option depending on the traffic you get in your server. This avoids XMail having to work with very large log files and can improve server performance. =item 8. If you are unable to start XMail (even if you followed this document's instructions), check the MailRoot directory with the one listed above. More than one unzipper does not restore empty directories by default. =back Please report XMail errors and errors in this document. If you successfully build and run XMail please let me know at davidel@xmailserver.org, I don't want money ;) [L] =head1 THANKS My mother Adelisa, for giving me the light. My cat Grace, for her patience waiting for food while I'm coding. All of the free source community, for giving me code and knowledge. [L] xmail-1.27/docs/ChangeLog.pod0000644000175000017500000020454411341640430015317 0ustar davidedavide =head1 NAME XMail Change Log as of Version 1.27 [L] =head1 CHANGE LOG =head2 Feb 25, 2010 v 1.27 =over 4 =item * Support for using a chain of SSL certificates, instead of a single one. =item * Fixed SMTP explicit routing address parsing. =item * Fixed a bug that made XMail incorrectly handle extremely long header line lengths. =item * Faster shutdown time on Unix systems. =item * Tweaked DNS resolution to cope with lame name servers. =item * Support for greater than 2GB sizes in POP3 server and PSYNC. =item * Safer temporary file name generation. =item * Made the temporary directory on Unix, configurable via the "XMAIL_TEMP" environment variable. =item * Fixed a bug that was caused by the SSL code triggering the XMail binding locking code after XMail has already cleanup. =item * Fixed a bug in the SMTP external authentication. =item * Fixed Unix syslog logging facility to consider different logging levels. =item * Changed SMTP HELP response code to 214. =back =head2 Jun 27, 2009 v 1.26 =over 4 =item * Fixed a bug where STARTTLS was resetting the session too much, by canceling certain flags/options read inside the SERVER.TAB. =item * Fixed a bug that happened if a message filter mistakenly remove the message file from under XMail control. =item * Fixed a bug that make XMail to wrongly report virtual memory sizes on 32 bit systems with larger than 4GB VM space. =item * Changed the line termination used to store messages into the mailboxes of Unix versions of XMail. Now messages are stored with the OS native LF termination, instead of the RFC CRLF that was used before. This allows other Unix softwares working together with XMail to not be confused by the extra CR present in the line termination. =item * The "smtprelay" behaviour with respect to 5xx responses from one of the servers in the relay list, has been changed. Now a 5xx response will stop the processing, instead of iterating on the remaining servers of the list. =item * Avoid to crawl all the USER.TAB file during a "userlist" CTRL command. =item * Fixed a bug that allowed non-RFC characters inside domain names. =item * Fixed OSX Leopard build error. =item * Added "timeo" option to flags execution. =item * Added "NoAuth", "EnableVRFY" and "EnableETRN" settings inside IP properties. =back =head2 Jan 3, 2008 v 1.25 =over 4 =item * Added the ability to select SmtpConfig-IP options by local port too (SmtpConfig-IP,PORT). =item * Added a new -YT command line option to set the timeout used by a POP3 client connection. =item * Fixed a bug in the RFC822 ATEXT token definition. =item * If the recipient domain does not have an MX record, and does not have an A record, now XMail bounces immediately. =item * Fixed OpenSSL connection shutdown to avoid RST packet generation. =item * Changed SMTP AUTH LOGIN authentication to support the optional inline parameter. =item * Added IPV6 support. New command line options are available to select XMail's behaviour with respect to IPV4/IPV6 compatibility. =item * Fixed/strengthened RFC address parsing. =item * Drop the SMTP connection is case of timeout. =item * Fixed a bug caused by the new strict host/doman name check added in 1.24 (in the SMTPGW.TAB parsing). =item * Completely changed the DNS resolution code. =item * Do not try the A-record delivery in case of temporary DNS/network errors. =item * Added remote MTA message ID to SMAIL logging. =item * Added a new "POP3S" option to the POP3LINKS.TAB file, to allow connections to full POP3S remote servers. =item * Fixed a bug in the SMTP Outbind feature. =item * Changed POP3 log format to add information about the success or failure of the operation, and to report the number of messages and the total size of the mailbox (in case of successful login). =item * Added a new "Pop3LogPasswd" SERVER.TAB variable to control if POP3 passwords are logged into the POP3 log file. =item * Added a new "SmtpNoTLSAuths" SERVER.TAB variable. It allows to specify which SMTP authentications are allowed in non-TLS mode. =item * Fixed a small memory leak affecting users using the "OutBind" feature. =item * Removed the "SMTP-TLS" SERVER.TAB variable and replaced with "SmtpGwConfig" that supports the format described in "SMTP GATEWAY CONFIGURATION". The "SmtpGwConfig" allows the user to specify global options for remote SMTP connections. =item * Added $(RRCPT) macro to SMTP filters. =back =head2 Jan 1, 2007 v 1.24 =over 4 =item * ******************************************************************** * Removed the DynDNS feature. ******************************************************************** =item * Added the new "OutBind" options for PSYNC accounts. It allows to specify the IP of the interface to be used when talking to the remote server. =item * Added a new "OutBind" option to the "SmtpConfig" SERVER.TAB variables. It allows to specify the IP of the interface to be used when talking to the remote server. =item * Added a new SMTP.HNPROP.TAB file to drive remote peers SMTP properties through host name. =item * Added command line options to disable single services. =item * ******************************************************************** * The external SMTP authentication (both server and client) changed. * Changed is also the format of the SMTPEXTAUTH.TAB file. * The external SMTP client authentication has been removed. ******************************************************************** =item * Added the new "Leave" options for PSYNC accounts, that allows messages to be left on the remote server. This option only works if the remote POP3 server supports the UIDL command. =item * Fixed a bug in the mailbox size check between SMTP and SMAIL layers. This resulted in EFULL errors never returned at SMTP level. =item * Fixed a bug in alias resolution for aliased users inside aliased domains. =item * ******************************************************************** * SSL support has been added. See the "SSL CONFIGURATION" section of * the documentation to find out how to properly configure XMail. * You MUST do this in order to have SSL support working. ******************************************************************** =item * ******************************************************************** * The format of the "DefaultSMTPGateways" SERVER.TAB variable, of the * SMTPFWD.TAB relay list, and of the "smtprelay" list changed * (separator is now the ';' character and can have options attached, * separated by comma). * You need to adjust it according to the new format ******************************************************************** =item * Added new "EnableCTRL-TLS", "EnableSMTP-TLS" and "EnablePOP3-TLS" SERVER.TAB variables. =item * Added SMTP gateway options to the "DefaultSMTPGateways" variable, to the SMTPFWD.TAB file, and to the "smtprelay" command inside the mail processing files. Added a new "WantTLS" option to the "SmtpConfig" SERVER.TAB variables. =item * Added a new "EaseTLS" option to the SMTP.IPPROP.TAB file. =item * Added a new 'S' SMTP auth option to bypass a "WantTLS" configuration. =item * Added "SSLUseCertsFile", "SSLUseCertsDir", "SSLWantVerify", "SSLAllowSelfSigned", "SSLWantCert" and "SSLMaxCertsDepth" SERVER.TAB variables to configure XMail's SSL behaviour. =item * Added STARTTLS SMTP support. =item * Added STLS POP3 support (and the new CAPA command). =item * Added SMTPS support. =item * Added POP3S support. =item * Added CTRLS support. =item * Added FAPOP, STLS and FSTLS authentication options to the POP3LINKS.TAB file.. =item * Added a new "SMTP-TLS" SERVER.TAB variable to tell XMail if it has to try to negotiate TLS sessions with remote SMTP servers. =item * Added SSL support to the CTRL protocol and to the CtrlClnt client. =back =head2 Nov 19, 2006 v 1.23 =over 4 =item * Changed the filter log to include the full exec string (separated by semicolon). =item * Fix CTRL "poplnkadd" and "poplnkdel" to accept local domains strings starting with special characters. =item * Added (finally!) a command line makefile (Makefile.win) to build the whole XMail package without the usage of the MS VC++ IDE. =item * Reject a CTRL "domainadd" command if an alias domain already exists with the same name. =item * Changed the CTRL "usergetmproc" command to allow the caller to specify if it is the user or the domain one that is wanted. Or a merges of both, if "DU" is specified in the optional 3th parameter. =item * Changed the CTRL "usersetmproc" command to allow the caller to specify if it is the user ('U') or the domain ('D') one that is wanted to be set. =item * Added complex/multiple macro substitution capabilities to external programs argoument lists. =item * Added strictier SMTP address validation. =item * Check the mailbox size for every message coming into the mailbox (before it was only done during the SMTP phase). =item * Do not try to send to the 'A' record if the recipient domain does not exist at all (NXDOMAIN). Bounce immediately instead, avoiding lengthy retry policies. =item * Added the "wlex" flag to filter lines (works for the SMTP ones only), to exclude execution of the filter line in case the client IP is white-listed inside the ipprop file. =item * Added the post-RCPT SMTP filter, that is called before XMail acks the client recipient. A new "RCPT=EFILTER" long entry is emitted in case a recipient is rejected by a filter. =item * Added @@CRCPT (current recipient) and @@FROM (sender email address) macros to SMTP filter substitution. =item * Allow cmdaliases to work on aliased domains. Before a cmdalias defined on an alias-target domain was not working before the cmdalias check was done before the alias domain resolution. =item * Added the ability to bypass the SMTP.IPMAP.TAB inclusion using SMTP authentication. =item * Added a new SERVER.TAB variable "SMTP-IpMapDropCode" to control the drop code to be used for IPs listed inside the SMTP.IPMAP.TAB. Like other codes inside XMail, 1 means drop now, 0 means allow if auth, and -N means add N seconds delay. An immediate drop will emit a "SNDRIP=EIPBAN" log entry. =item * Added a new SERVER.TAB variable "SmtpMsgIPBan" to control the SMTP message returned in case of SMTP.IPMAP.TAB inclusion. =item * Added log message when the maximum number of SMTP/POP3/CTRL threads is hit. =item * Fixed documentation about the spool info line and the SMTP filters info line. =item * Fixed a build problem on OpenBSD related to the lack of c_r (reentrant C library) library. =item * Fixed greetings message to be RFC2821 compliant (server host must be first). =item * Fixed a NAME_MAX build error ond *BSD and Solaris. =item * Added a "Pop3ScanCur" USER.TAB variable to control the scan of the Maildir's "cur" directory during POP3 message list build. Now XMail only scans the "new" directory as default. =back =head2 Oct 12, 2005 v 1.22 =over 4 =item * The POP3 before SMTP authentication is now correctly interpreted as real SMTP authentication, by the mean of @@USERAUTH. =item * 'B': Fixed a possible cause of buffer overflow in the XMail's sendmail binary. =item * Changed the DNS MX resolution to allow better handling of partially broken DNS servers configuations. =back =head2 Jan 9, 2005 v 1.21 =over 4 =item * Added a fix for 64 bits porting compatibility. =item * Added the ability to exclude filters from execution in case of authenticated user. By pre-pending the filter command token with a token containing "!aex", the filters won't be run if the user authenticated himself. =item * Added @@USERAUTH macro even to standard in/out filters (before it was only defined for SMTP ones). =item * Added a new "NoSenderBounce" variable inside the SERVER.TAB file, to enable XMail generated bounce messages to have the empty SMTP sender ('MAIL FROM:<>'). =item * Added a new "SMTP-MaxErrors" variable inside the SERVER.TAB file to set the maximum errors allowed in a single SMTP session (default zero, unlimited). =item * Added a "LastLoginTimeDate" variable to the "userstat" CTRL command. =item * Added external aliases support in the CTRL protocol. =item * The MESSAGE.ID file is now automatically created, if missing. =item * Changed the logic used to treat domain and user MAILPROC.TAB files. Before, a user's MAILPROC.TAB was overriding the domain one, while now the rules are merged together, with domain's ones first, followed by user's ones. =item * The maximum mailbox size of zero is now interpreted as unlimited. =item * Fixed XMail's sendmail to detect non-RFC822 data and handle it correctly. =item * The IP:PORT addresses emission in spool files (and Received: lines) has been changed to the form [IP]:PORT. =item * Added filter logging, that is enabled with the new -Qg command line option. =item * Fixed an error message in the SMTP server, that was triggered by the remote client not using the proper syntax for the "MAIL FROM:" and "RCPT TO:" commands. =item * Fixed explicit routing through SMTPGW.TAB file. =item * Fixed a possible problem with file locking that might be triggered from CTRL commands cfgfileget/cfgfileset. =item * Added a check to avoid the CTRL server to give an error when a domain created with older versions of XMail does not have the domain directory inside cmdaliases. =item * The SMTP server FQDN variable should be set to the value of "SmtpServerDomain", when this is used inside the SERVER.TAB file. =back =head2 May 30, 2004 v 1.20 =over 4 =item * Fixed a possible memory leak and a possible source of crashes. =back =head2 May 29, 2004 v 1.19 =over 4 =item * Implemented the "filter" command for custom mail processing (MAILPROC.TAB, cmdaliases and custom domains). =item * If "RemoveSpoolErrors" is set inside the SERVER.TAB file, messages are never frozen. Before there was a special case (delivery failure and delivery notification failure) that could have lead to frozen messages. =item * Made "aliasdomainadd" to check for the existence of the alias domain (and reject the command if existing). =item * Introduced a new environment variable recognized by XMail (XMAIL_PID_DIR), to let the user to specify a custom PID file directory (this is for Unix ports only). =item * Implemented ability to stop custom mail processing upon certain exit codes from external commands execution. =item * The SPAMMERS.TAB check is now bypassable (see doc for details). =item * 'B': Changed the "aliasdomainlist" syntax and output format (see doc for details). =item * Made (on Unix setups) the PID file name to be dependent on the daemon file name. =item * Implemeted a domain-wise MAILPROC.TAB and extended its "redirect" and "lredirect" commands to support account specific (USER@DOMAIN) and domain targets (DOMAIN). =item * Implemented SMTP filters to allow users to reject the SMTP session before and after the remote client data has been received. =back =head2 Mar 27, 2004 v 1.18 =over 4 =item * Restructured the external program execution environment on Unix ports. Simplified, as a consequence of this, the system dependent portion of XMail (SysDep*). =item * Fixed a bug in the address range parsing (x.y.w.z/s). =item * Fixed the alias lookup to perform a better "best match" wildcard selection. =item * Fixed a bug in the DNS resolved that made XMail to not correctly handle domain CNAMEs. =back =head2 Sep 14, 2003 v 1.17 =over 4 =item * Added Bcc: removal from message headers in XMail's sendmail. =item * Added PSYNC logging (-Yl). =item * Added domain completion to XMail's sendmail when the specified sender address (-f or -F) does not contain one. The environment variable (or registry in Windows) DEFAULT_DOMAIN is looked up to try to complete the address. =item * Fixed a bug in the return code of SysAccept() in all Unix versions. =item * Fixed a bug that was triggered by external command and filter exiting soon. XMail was not able to correctly sync with the child process by losing it. This apply only to Unix versions of XMail. =item * A notification message is now sent to the sender if the message is handled with "smtp" or "smtprelay" commands and a permanent error happen when sending to the remote SMTP server. =back =head2 Jul 8, 2003 v 1.16 =over 4 =item * Added a new configuration file "smtp.ipprop.tab" to be able to specify peer IP based configuration option, like for example IP white listing against IP checks. =item * 'B': The filter return code has been changed and new return codes are expected to be returned by filters. Please che the documentation and update your filters before starting to use the new version. =item * Added the ability to specify a custom error message for filters. =item * Fixed a bug in the string quoting function that showed up when the string was empty (""). =item * Changed the order used by XMail to check the mailer domain. Now MX check is performed first, then A record check. This caused a slow down for domains having MX records but not A records. =item * Added two new Received: types to give the ability to hide client information if the SMTP client does authenticate with the server. =item * Added the rejection map name inside the SMTP log file in case of SNDRIP=EIPMAP error. =item * Modified XMail's sendmail to add the RFC822 Date: header if missing. =item * XMail now uses the name of the executable ( without .exe ) to both register the service name and fetch registry variables. =item * The POP3 server now picks up messages even from the Maildir's "cur" subdirectory. =back =head2 May 3, 2003 v 1.15 =over 4 =item * Implemented a new filters feature that enable the user to stop the selected filters list processing upon receival of certain exit codes. =item * Fixed the wrong log file name generation when the daylight time is active. =item * Fixed a bug inside the DNS MX resolver. =item * Fixed a bug ( Windows OS bug ) that made XMail unable to create domains starting with reserved device names ( COM#, LPT, PRN, CON, ... ). So, for example, a domain named "com4.domain.org" couldn't be created because of this naming conflict. =item * Fixed a bug that made XMail to not apply filters for local mailing list. =item * Fixed a bug that made XMail to crash under certain conditions. =back =head2 April 2, 2003 v 1.14 =over 4 =item * Added a "Server:" field to the notification message. It'll report the remote SMTP server host name and IP that issued the error. It will not be present if the error does not originate from a remote SMTP server. =item * Added a new command line parameter -MD to set the number of subdirectories allocated for the DNS cache files storage. =item * Messages with non RFC822 conforming headers are now handled by the PSYNC code. =item * 'B': The filter architecture has been completely changed. To correctly update to this version you have to create two empty files "filters.in.tab" and "filters.out.tab" inside the $MAIL_ROOT directory. Please refer to the documentation for more information about the new filter architecture. If you are not currently using filters, the simple creation of the two files listed above will be sufficent. =item * 'B': The internal spool file format is changed with the new line added ( the 1st one ) that contain various message information. Filters that rely on the internal spool file format must be changed to match the new structure. =item * Fixed a bug that made XMail to not correctly report zero sized files inside the mailbox. =item * Added file size to CTRL's "filelist" command. =item * Fixed a connect-error reporting bug on Windows platform. =back =head2 January 25, 2003 v 1.12 =over 4 =item * Better check for user/domain names. =item * Changed search pattern for filters. Now a domain name is scanned for all sub-domains. =item * Fixed a boundary check inside the Base64 decoder. =item * Added the client FQDN inside the SMTP log file in case the RDNS check is enabled. =item * Added a new SERVER.TAB variable "SmtpMsgIPBanSpammers" to set the message that is sent to the SMTP client when the client IP is listed inside the file SPAMMER.TAB. = item * Added a new SERVER.TAB variable "SmtpMsgIPBanMaps" to set the message that is sent to the SMTP client when the client IP is listed inside one of the "CustMapsList". =item * Added a new SERVER.TAB variable "SmtpMsgIPBanSpamAddress" to set the message that is sent to the SMTP client when the client IP is listed inside the file SPAM-ADDRESS.TAB. =item * Fixed a bug inside the custom account handling that made XMail to pass the old password instead of the new one. =item * Added OpenBSD support. =back =head2 November 9, 2002 v 1.11 =over 4 =item * Added a new command line parameter -QT to enable a configurable timeout for filter commands. =item * Fixed a bug that made XMail to ignore cmdalias accounts when a wildcard alias was matching the account itself. =item * Added the 'smtprelay' command to the MAILPROC.TAB processing. =item * Removed the 'wait' command from all custom processing. =item * Added a new macro @@RRCPT to filters commands to extract the real local recipient. =item * Changed the way the EXTALIASES.TAB mapping modify the return path. It now change the "Reply-To:" instead of the "From:" to avoid problems with signature verification software. =item * Implemented logging on SMTP transactions rejected because of mapped IP or failing RDNS check. =item * Added a new SERVER.TAB variable "SmtpServerDomain" to force the SMTP domain used by XMail in its banner string ( for CRAM-MD5 ESMTP authentication ). =item * Improved DNS resolution for not existing domains. =back [L] =head2 July 27, 2002 v 1.10 =over 4 =item * Added a variable 'CustomSMTPMessage' inside the server's configuration file SERVER.TAB to enable the postmaster to set a custom message that is appended to the standard XMail error response. =item * Added log entries in case of relay lists mapped IPs. =item * Fixed a build error on FreeBSD. =item * Added a new SERVER.TAB variable 'DisableEmitAuthUser' to block the emission the the header 'X-Auth-User:' for authenticated user. =item * Added a new USER.TAB variable 'DisableEmitAuthUser' to block the emission the the header 'X-Auth-User:' for authenticated users (this variable overrides the SERVER.TAB one). =item * Added command line driven mailbox delivery mode (-MM = Maildir , -Mm = mailbox). =item * Added sysv_inst.sh shell script to help creating SysV boot scripts for XMail. =back [L] =head2 June 15, 2002 v 1.9 =over 4 =item * Fixed a bug in HOSTNAME:PORT handing code inside the PSYNC server. =item * Fixed a bug introduced in 1.8 in the Windows version that made XMail to have bad behaviour when used with external programs. =item * Fixed a bug that resulted in XMail generating frozen messages even if the SERVER.TAB variable was set to not create them. =item * Fixed a bug that made it possible to send a 'MAIL FROM:<@localdomain:remoteaddress>' and to have the message relayed if the IP of the current machine was inside the smtprelay.tab of the machine handling the MX of @localdomain. =item * Implemented internal mail loop checking (internal redirects). =item * Added a new MLUSERS.TAB permissions flags 'A', that is similar to 'W' by instead of checking the 'MAIL FROM:<...>' address check the SMTP authentication address (this will prevent malicious users to forge the address to gain write permissions on the list). =back [L] =head2 May 19, 2002 v 1.8 =over 4 =item * Changed XMail's behaviour upon receival on long (RFC compared) data lines on SMTP and POP3 fetch inbound doors. Before the operation was aborted while now data is accepted without truncation, that might make XMail to behave non conforming the RFC. =item * Added @@RRCPT macro to the 'external' MAILPROC.TAB command to emit the real recipient of the message (@@RCPT could be an alias). =item * Added HOSTNAME:PORT capability to POP3LINKS.TAB entries. =item * Added Linux/PowerPC port. =item * Added 'filelist' CTRL protocol command. =item * Added SMTP HELP command. =item * Changed bounce message format to add the last SMTP error and to make it works with Ecartis mail bounce processing. =item * Changed the XMail's sendmail implementation to accept '-f FROM' and '-F FROM' non standard sendmail paramenter specification. =item * Fixed a bug inside the PSYNC server code that made XMail to fail to resolve POP3 server addresses. =item * Various code cleanups. =back [L] =head2 March 03, 2002 v 1.7 =over 4 =item * Fixed a bug inside the POP3 server that caused bad responses to UIDL and LIST commands in case of certain command patterns. =item * Added support for HOSTNAME:PORT (or IP:PORT) for the DefaultSMTPGateways SERVER.TAB variable. =item * Added domain aliases cleanup upon main domain removal. =item * Added 'MaxMessageSize' inside USER.TAB files to override the global (SERVER.TAB) one. =back [L] =head2 March 03, 2002 v 1.6 =over 4 =item * Added a new USER.TAB variable 'UseReplyTo' (default 1) to make it possible to disable the emission of the Reply-To: header for mailing lists. =item * Fixed a bug that caused XMail to uncorrectly deliver POP3 fetched messages when used togheter with domain masquerading. =item * Changed index file structure to use an hash table for faster lookups and index rebuilding. =item * New files inside the tabindex directory now have the extension .hdx and old .idx files can be removed. =item * Added X-Deliver-To: header to messages redirected with MAILPROC.TAB file. =item * Added configurable Received: tag option in SERVER.TAB by using the variable 'ReceivedHdrType'. =item * Added a configurable list of header tags to be used to extract addresses for POP3 fetched messages by using the SERVER.TAB variable 'FetchHdrTags'. =item * History (change log) entries have been moved from the main documentation file and a new file (ChangeLog.txt) has been created to store change-log entries. =item * Removed RBL-MAPSCheck (currently blackholes.mail-abuse.org.), RSS-MAPSCheck (currently relays.mail-abuse.org.) and DUL-MAPSCheck (currently dialups.mail-abuse.org.) specific variables and now everything must be handled with CustMapsList (please look at the documentation). =item * Added NotifyMsgLinesExtra SERVER.TAB variable to specify the number of lines of the bounced message to include inside the notify reply (default zero, that means only header). =item * The message log file is now listed inside the notification message sent to ErrorsAdmin (or PostMaster ). =item * Added NotifySendLogToSender SERVER.TAB variable to enable/disable the send of the message log file inside the notify message to the sender (default is off). =item * Added TempErrorsAdmin SERVER.TAB variable to specify an account that will receive temporary delivery failures notifications (default is empty). =item * Added a new SERVER.TAB variable NotifyTryPattern to specify at which delivery attempt failure the system has to send the notification message. =item * Fixed a bug that caused alias domains to have higher priority lookup compared to standard domains. =back [L] =head2 February 05, 2002 v 1.5 =over 4 =item * Fixed a bug in wildcard aliases domain lookup. =item * Fixed a bug in CTRL command 'aliasdel' that failed to remove aliases with wildcard domains. =item * Fixed a bug that caused XMail to timeout on very slow network connections. =back [L] =head2 January 18, 2002 v 1.4 =over 4 =item * Fixed a bug that made XMail fail to parse custom maps lists in SERVER.TAB. =item * Fixed a bug that prevented XMail to add wildcard-domain aliases. =item * Added a filter feature to the CTRL commands 'domainlist' and 'aliasdomainlist'. =item * Added an extra message header field 'X-AuthUser:' to log the username used by the account to send the message. =item * Added Reply-To: RFC822 header for mailing lists sends. =item * Fixed a Win32 subsystem API to let XMail to correctly handle network shared MAIL_ROOTs. =back [L] =head2 December 19, 2001 v 1.3 =over 4 =item * ORBS maps test removed due old ORBS dead, the SERVER.TAB variable 'CustMapsList' can be used to setup new ORBS (and other) maps. =item * Fixed a bug in XMail's sendmail that was introduced in version 1.2 and made it to incorrectly interpret command line parameters. =item * Fixed a bug that made XMail not correctly recognize user type characters when lowercase. =item * Fixed a bug that caused XMail to not start is the MAIL_ROOT environment variable had a final slash on Windows. =item * Added a new filter return code (97) to reject messages without notification and without frozen processing. =item * Added two new command line options -MR and -MS to set the I/O socket buffers sizes in bytes (do not use them if You don't know what You're doing). =item * Changed system library to have a better performace, expecially on the Windows platform. =item * Users that are using XMail mainly inside their local LAN are strongly encouraged to switch to this version. =item * Fixed a bug that enabled insertion of aliases that overlapped real accounts. =back [L] =head2 November 12, 2001 v 1.2 =over 4 =item * A problem with log file names generation has been fixed. =item * Added a new CTRL command 'userstat'. =item * Implemented Linux/SPARC port and relative makefile (Makefile.slx). =item * Extended the XMail version of sendmail to support a filename as input (both XMail format that raw email format) and to accept a filename as recipient list. =item * Added a new kind of aliases named 'cmdaliases' that implements a sort of custom domains commands on a per-user basis (look at the CmdAliases section). =item * ******************************************************************** * You must create the directory 'cmdaliases' inside $MAIL_ROOT * to have 1.2 work correctly ******************************************************************** =item * Fixed a bug that had XMail not check for the user variable SmtpPerms with CRAM-MD5 authetication. =item * Fixed a bug in the XMail's sendmail implementation that made it unable to detect the '.' end of message condition. =item * Fixed a bug in the XMail's sendmail implementation that made it to skip cascaded command line parameters (-Ooet). =item * Implemented a new XMail's sendmail switch -i to relax the . ond of message indicator. =back [L] =head2 October 09, 2001 v 1.1 =over 4 =item * Fixed a bug in the XMail version of sendmail that made messages to be double sent. =item * The macro @@TMPFILE has been removed from filters coz it's useless. =item * The command line parameter -Lt NSEC has been added to set the sleep timeout of LMAIL threads. =item * Added domain aliasing (see ALIASDOMAIN.TAB section). =item * ******************************************************************** * You must create the file ALIASDOMAIN.TAB inside $MAIL_ROOT * (even if empty) ******************************************************************** =item * Added CTRL commands 'aliasdomainadd', 'aliasdomaindel' and 'aliasdomainlist' to handle domain aliases through the CTRL protocol. =back [L] =head2 September 04, 2001 v 1.0 =over 4 =item * Added wildcard matching in the domain part of ALIASES.TAB (see ALIASES.TAB section). =item * Changed the PSYNC scheduling behaviour to allow sync interval equal to zero (disabled) and let the file .psync-trigger to schedule syncs. =item * Solaris on Intel support added. =item * A new filter return code (98) has been added to give the ability to reject message without notify the sender. =back [L] =head2 June 10, 2001 v 0.74 =over 4 =item * A stack shifting call method has been implemented to make virtually impossible for attackers to guess the stack frame pointer. =item * With this new feature, even if buffer overflows are present, the worst thing that could happen is a server crash and not the attacker that execute root code on the server machine. =item * Implemented the SIZE ESMTP extension and introduced a new SERVER.TAB variable 'MaxMessageSize' that set the maximum message size that the server will accept (in Kb). =item * If this variable is not set or if it's zero, any message will be accepted. =item * A new SMTP authentication permission ('Z') has been added to allow authenticated users to bypass the check. =item * The SMTP sender now check for the remote support of the SIZE ESMTP extension. =item * A new SERVER.TAB variable has been added 'CustMapsList' to enable the user to enter custom maps checking (look at the section 'SERVER.TAB variables'). =item * Fixed a bug in 'frozdel' CTRL command. =back [L] =head2 June 08, 2001 v 0.73 =over 4 =item * Fixed a possible buffer overflow bug inside the DNS resolver. =back [L] =head2 May 23, 2001 v 0.72 =over 4 =item * Fixed build errors in MkUsers.cpp and SendMail.cpp (FreeBSD version). =item * Added the ability to specify a list of matching domains when using PSYNC with masquerading domains (see POP3LINKS.TAB section). =item * The auxiliary program sendmail now reads the MAIL_ROOT environment from registry (Win32 version) and if it fails it reads from the environment. =item * Fixed a bug that made XMail to crash if the first line of ALIASES.TAB was empty. =item * RPM packaging added. =item * Added a new feature to the custom domain commands 'redirect' and 'lredirect' that will accept email addresses as redirection target. =item * Fixed a bug in MkUsers. =item * Added system resource checking before accepting SMTP connections (see 'SmtpMinDiskSpace' and 'SmtpMinVirtMemSpace' SERVER.TAB variables). =item * Added system resource checking before accepting POP3 connections (see 'Pop3MinVirtMemSpace' SERVER.TAB variable). =item * A new command line param -t has been implemented in sendmail. =item * A new USER.TAB variable 'SmtpPerms' has been added to enable account based SMTP permissions. =item * If 'SmtpPerms' is not found the SERVER.TAB variable 'DefaultSmtpPerms' is checked. =item * A new USER.TAB variable 'ReceiveEnable' has been added to enable/disable the account from receiving emails. =item * A new USER.TAB variable 'PopEnable' has been added to enable/disable the account from fetching emails. =back [L] =head2 April 29, 2001 v 0.71 =over 4 =item * Removed the SERVER.TAB variable 'HeloUseRootDomain' and introduced a new one 'HeloDomain' to specify the name to send as HELO domain (look at variable documentation). =item * If 'HeloDomain' is not specified or if empty then the reverse lookup of the local IP is sent as HELO domain. =item * Added a new SERVER.TAB variable 'DUL-MAPSCheck' to implement the 'dialups.mail-abuse.org' maps check. =item * Changed the meaning of the SERVER.TAB variables SMTP-RDNSCheck, RBL-MAPSCheck, RSS-MAPSCheck, ORBS-MAPSCheck and DUL-MAPSCheck to give XMail the ability to delay SMTP commands for clients that fail the check. =item * The old behaviour (dropped connection) is obtained by setting values greater than zero, while You can set the delay (in seconds) by specifying negative values. =item * For SMTP-RDNSCheck and DUL-MAPSCheck variables the connection is no more dropped at welcome time but a 'server use forbidden' message is given at MAIL_FROM time. =item * In this way XMail give authenticated users the ability to get in from 'mapped' IPs. =item * Fixed a bug that cause XMail to crash if there is an empty line in a MLUSERS.TAB file. =item * Added a new SERVER.TAB variable 'ErrorsAdmin' that will receive the notification message for every message that has had delivery errors. =item * The feature to force XMail to initiate a PSYNC transfer has been added. This is implemented by making XMail to check for a file named '.psync-trigger' inside MAIL_ROOT. When this file is found a PSYNC tranfer is started and the file is deleted. =item * Added a new SERVER.TAB variable 'MaxMTAOps' to set the maximum number of relay steps before to declare the message as looped. =item * Added SMTP after POP3 authentication and one new command line switch (-Se) to set the expire time of the POP3 IP. =item * A new SERVER.TAB variable has been added to enable/disable SMTP after POP3 authentication (EnableAuthSMTP-POP3). =item * Added the replacement for sendmail that will use the local mail delivery of XMail (look at the sendmail section). =item * The ESMTP command ETRN has been added has long as a new SMTP perm flag 'T' to give access to this feature and a new SERVER.TAB variable 'AllowSmtpETRN' to set the default feature access. =item * Added a new CTRL command 'etrn' to support the same SMTP feature through the CTRL protocol. =item * Fixed a bug in filters selection that made XMail to case-sensitive compare user and domain filters. =item * Changed the name of the default filter to '.tab' instead of 'defaultfilter.tab'. =item * Finally, FreeBSD port added !! =back [L] =head2 April 08, 2001 v 0.70 =over 4 =item * Added the message ID to the received tag and extended the SMTP log file with the username of the authenticated user (if any). =item * Fixed a bug in external authentication (POP3). =item * The USERDEF.TAB file is now checked inside $MAIL_ROOT/domains/DOMAIN before and then in $MAIL_ROOT. =item * This permit per domain user default configuration. =item * Added a new CTRL server command 'frozsubmit' to reschedule a frozen message. =item * Added a new CTRL server command 'frozdel' to delete a frozen message. =item * Added a new CTRL server command 'frozgetlog' to retrieve the frozen file log file. =item * Added a new CTRL server command 'frozgetmsg' to retrieve the frozen message file. =back [L] =head2 February 22, 2001 v 0.69 =over 4 =item * Fixed a bug that made XMail to grant Read permissions to mailing lists users. =item * Fixed a bug that made XMail to delete SMTP rights granted during authentication when sending multiple messages. =item * Fixed a bug in SMTP CRAM-MD5 authentication. =item * Fixed a bug that caused XMail to break the header when an headers tag is made by 'tag-name:[CR][LF]tag-string'. =item * Added the delete functionality to the CTRL command 'uservarsset' by giving the string value '.|rm' the delete capability. =back [L] =head2 February 05, 2001 v 0.68 =over 4 =item * Fixed a buffer overflow vulnerability in CTRL server and added command string validation to all servers. =item * Added 8BITMIME and PIPELINING support (it was already compliant). =item * Added a new SERVER.TAB option 'HeloUseRootDomain' to make XMail to use the 'RootDomain' like HELO domain. =item * Added FINGER service access control based on the peer IP address. A new file FINGER.IPMAP.TAB has been added to MAIL_ROOT with the same meaning of the ones used with SMTP, POP3 and CTRL services. =item * Fixed a bug that caused XMail to drop the first character of the headers if there was no space between the colon and the header value. =item * Added extended SMTP log information by adding an extra (last) field to the log file. =item * Added a new SERVER.TAB variable 'AllowSmtpVRFY' (default off) to enable the SMTP VRFY command. =item * Added a new SMTP auth flag 'V' to enable VRFY command (bypassing SERVER.TAB settings). =item * Improved the POP3 sync method to fetch and distribute mail that uses an external POP3 mailbox to collect more accounts togheter. Before the method failed if the user was not in the first 'To:' address, while now all addresses contained in 'To:', 'Cc:' and 'Bcc:' are checked. There is also a new SERVER.TAB variable 'Pop3SyncErrorAccount' whose use is catch all emails that has been fetched but has had delivery errors. =back [L] =head2 January 04, 2001 v 0.67 =over 4 =item * Fixed a bug in 'poplnkenable' CTRL server command. =item * Changed the report of 'poplnklist' CTRL server command to include the authentication mode and the enabled status. =item * Fixed a bug in 'poplnkdel' that left around the .disable file. =item * A new directory 'pop3links' has to be added to store POP3 links disable files for non-local links. =item * This will fix also a bug in multi-account and masquerading POP3 sync. =item * A new way to retrieve the POP3 domain has been coded by doing a reverse DNS lookup from the server IP. If the result of the lookup will be xxxx.yyyy.zzzz then XMail will test if xxxx.yyyy.zzzz is handled, then yyyy.zzzz and then zzzz. =item * The first of these domains that is handled by XMail will be the POP3 domain. =item * Added a new SERVER.TAB variable 'CheckMailerDomain' that, if on ('1'), force XMail to validate the sender domain ('MAIL FROM:<...@xxx>') by looking up DNS/MX entries. =item * Fixed the bug that made XMail to not accept users to add if a wildcard alias were defined. =back [L] =head2 December 08, 2000 v 0.66 =over 4 =item * The SMTP command RSET no more clean the authentication status of the client. =item * Improved MX records resolution and fixed a bug in MD5 algo. =item * A new USER.TAB variable (for Mailing Lists) 'ListSender' has been added to hide real senders from SMTP protocol. =item * If this variable does not exist the 'MAIL FROM:<>' command will contain the 'real' sender address. =item * This variable should be set to the email address of the mailing list admin that will receive all the notification and error messages, preventing this error to reach real senders. =item * Fixed an RFC conformance bug in SMTP protocol that made XMail to accept the MAIL_FROM command even if the HELO (or EHLO) command was not issued. =item * Fixed a bug in SysExec() in Linux and Solaris versions that made all external programs to have a bad behaviour or fail. This bug was introduced in 0.65 version. =item * Fixed a bug in the Windows version that results in a failure to resolve MX queries. =item * This bug was introduced in 0.65. =back [L] =head2 November 25, 2000 v 0.65 =over 4 =item * Complete Linux library rewrite, now using PThread library instead of forking. =item * Solaris/SPARC port added (HPUX/PARISC incoming). =item * Removed the -Ma flags for the maximum number of accounts coz it's no more needed due the new Linux system library (now the memory shares is given for free instead of having to rely on IPC). =item * Removed the -Mk parameter due the IPC stuff removal. =item * Extra domain aliases has been added (see ALIASES.TAB section). =item * A new feature has been added to XMail to enable XMail users to prepare mail files in a given format, put them in /spool/local directory and get them delivered by the server (see 'XMail local mailer' section). =item * Two new directories 'local' and 'temp' must be created inside the 'spool' directory. =item * The meaning of the command line param '-Mr ...' has changed from days to hours. =back [L] =head2 November 02, 2000 v 0.64 =over 4 =item * Added permissions to mailing list users (see MLUSERS.TAB section). This enable You to have read only users as long as read/write users. =item * This is implemented by adding a new extra field to MLUSERS.TAB to store permissions ('R' or 'RW'). =item * The lack of this extra field (old MLUSERS.TAB files) will be interpreted as 'RW'. =item * The command 'mluseradd' has been extended to hold the new permission parameter (see section 'XMail admin protocol'). =item * Added a new CTRL command 'frozlist' to list files that are in frozen status (see section 'XMail admin protocol'). =item * Fixed a bug in the new masquerading feature of XMail (POP3LINKS.TAB). =item * Fixed a bug that makes XMail crashes when a mail loop condition is detected. =item * Removed the strict RFC compliant check on messages. =back [L] =head2 October 27, 2000 v 0.63 =over 4 =item * Added a feature that makes usable the new POP3LINKS.TAB fetching option by masquerading incoming recipient. This can be done by replacing the domain part or by adding a constant string to the To: address (see POP3LINKS.TAB section). =back [L] =head2 September 12, 2000 v 0.62 =over 4 =item * Added a new custom domain processing command 'smtprelay' that can be used to route messages to other smtp servers (see section 'Custom domain mail processing'). =item * New search method for custdomains/ files : now the test to find out if the domain sub1.sub2.domain.net will get a custom domain processing is done by looking up sub1.sub2.domain.net.tab , .sub2.domain.net.tab , .domain.net.tab , .net.tab and then .tab. =item * There is a new POP3 sync method now that enables users that receives mail for multiple recipients into a single external POP3 account to get all mail to be distributed locally. =item * You've to be sure, to not create mail loops, that all recipients domains are locally handled in a way or another (see section POP3LINKS.TAB). =item * Added the random order option to SMTPFWD.TAB gateways to randomly select the order of the try list (see section SMTPFWD.TAB). =item * Added the random order option to 'smtprelay' custom domain processing (see section 'Custom domain mail processing'). =item * The use of realloc() function has been removed to make place for free()/malloc() due a glibc bug with such function. =back [L] =head2 September 12, 2000 v 0.61 =over 4 =item * Added a new CTRL command 'userauth' that helps to check users authentication. =item * This command can be used by external modules that need to check XMail username/password authentication (ex: external IMAP auth modules). =item * A new file SMTPFWD.TAB has been introduced to supply customizable mail exchangers for external domains (see section SMTPFWD.TAB). =item * Not local POP3 sync has been introduced to make it possible to download external POP3 accounts without having to setup local accounts (see section POP3LINKS.TAB). =item * This feature can be used, for example, to catch mails from a set of remote accounts and redirect these to another SMTP server. =item * Now it's possible to set per IP server port in command line params by specifying bindip[:port] PSYNC flags -Qx has been removed due the new queue system. =item * A new global command line parameter -Mx has been introduced to setup the queue split level even if my suggestion is to leave the default value (23 , that means that the queue is splitted in 23 * 23 = 529 subdirectories). =item * ******************************************************************** * A new spool format has been coded to enable XMail to handle very * large sending queues. * See section 'XMail spool design' for a description of how the spool * works. * Due to the new spool format the following directories can be * removed: * * custdomains/spool * spool/tmp * spool/errors * spool/logs * spool/locks * * You've to leave XMail flush its queue (spool) before upgrading * to this version. * A more complex solution, if You've a lot of file pending into the * spool, is : * * 1) Stop XMail * 2) Upgrade to 0.61 * 3) Start XMail and wait it has created all the queue tree structure * 4) Stop XMail * 5) Move all old spool/ files into 0/0/mess * 6) Rename all spool/logs/ files removing the .log extension * 7) Move all spool/logs/ file into 0/0/slog * 8) Now You can remove the above directories and restart XMail ******************************************************************** =item * ORBS relays checking has been added and is activated by the new SERVER.TAB option 'ORBS-MAPSCheck'. =item * A new SERVER.TAB variable 'AllowNullSender' (default true) has been introduced to change the XMail default behaviour that reject null sender messages. Now if You want null sender messages to be rejected You've to set this variable to zero. =item * Fixed a bug in Linux XMail debug startup. =item * Now SMTP authentication does a previous lookup in mailusers.tab using the complete email address as username (@ or : as separators). =item * Authenticated users will get the permission stored in the new 'DefaultSmtpPerms' SERVER.TAB variable. =back [L] =head2 August 31, 2000 v 0.60 =over 4 =item * The XMail executable filename has been modified to XMail. =item * A better (even if not perfect) Linux SysV startup script (xmail) has been coded. =item * Fixed a bug in locking procedures (.lock file oriented) and introduced a correct SIGPIPE handling. =item * Improved I/O performance due to a new way of sending files through TCP/IP connections, to a more efficent way to copy message files and to a reduced number of temporary files that are created by XMail. =back [L] =head2 July 30, 2000 v 0.59 =over 4 =item * DNS MX queries caching has been added to lower DNS network traffic and to speed up message delivery. =item * A new directory dnscache must be added to MAIL_ROOT as long as the two subdirectories dnscache/mx and dnscache/ns . =item * A possible buffer overflow error has been fixed. =item * Some code rewrites. =back [L] =head2 July 22, 2000 v 0.58 =over 4 =item * Maildir mailbox format has been introduced as an optional mail storage other than the proprietary mailbox structure (You need to change CFLAGS definition in Makefile.lnx to build the Maildir version of XMail or edit SvrConfig.h defining CONFIG_MAILDIR for both Linux and NT version). =item * If You want to switch to the new Maildir version You MUST convert Your accounts and You MUST create a tmp directory inside $MAIL_ROOT/spool. =item * The maximum number of recipients for a single SMTP message has been made tunable by a new command line parameter (-Sr ... , default 100). =item * Fixed a small memory leak in SMTP server in case of multiple recipients. =item * New POP3 username/domain separator (:) has been introduced other than (@) that is not a valid char for Netscape mail system. =item * A buffer overflow bug has been corrected (the bug outcrop when a line is longer than the supplied buffer and a newline char is exactly placed at the buffer[sizeof(buffer)-1]). =item * Mail loop check has been introduced. =item * Fixed a bug that makes XMail unable to correctly handle SMTP lines terminated by . =item * SMTP server 'Received:' tag has been changed to suite 'MAIL FROM:<>' and 'RCPT TO:<>' addresses. =back [L] =head2 July 13, 2000 v 0.57 =over 4 =item * Fixed a SERIOUS bug introduced with the new indexing features of XMail that makes names case sensitive. You must also empty the tabindex directory to enable XMail to rebuild indexes in a case insensitive way. Update SOON to this version. =item * The maximum number of accounts has been removed due the new locking method. =item * Now the -Ma ... parameter give XMail a way to allocate locking resources, but it's not as strict as it was with previous versions. =item * New CTRL commands has been added (cfgfileget, cfgfileset). =item * A new command line utility to create user accounts based on a formatted text file has been added (watch at MkUsers section). =back [L] =head2 July 07, 2000 v 0.56 =over 4 =item * ******************************************************************** * WARNING * The MAIL_ROOT directory organization has been changed ! * A new directory domains MUST be created inside MAIL_ROOT to get * a cleaner configuration for XMail installations that handle * several domains. * In order to use this new version You MUST move Your domains * directories inside the new domains directory ******************************************************************** =item * SMAIL scheduling times in sending messages has been changed (see -Qi command line option). =item * The file domains.tab has been put under index. =item * Completely rewrited lock procedures. =item * New CTRL commands has been added (usergetmproc, usersetmproc, custdomget, custdomset, custdomlist). =back [L] =head2 July 04, 2000 v 0.55 =over 4 =item * A syntax bug has been corrected, 'SMTP-RARPCheck' leave place to the correct 'SMTP-RDNSCheck'. =item * Now the files mailusers.tab , aliases.tab and extaliases.tab are indexed for a faster lookup in case of having several thousands of users and / or aliases. For this need a new directory named tabindex __MUST__ be added to MAIL_ROOT path. =item * As a consequence of this new feature You __CANNOT__ edit files under index while XMail is running. =item * POP3 mailbox locking method is changed to speedup startup time in case of thousand of users. =item * Remember to __ADD__ the directory pop3locks inside MAIL_ROOT path. =back [L] =head2 June 29, 2000 v 0.54 =over 4 =item * A user level grained control over incoming POP3 connections based on peer IP has been added (see at the section dedicated to POP3.IPMAP.TAB). =item * A new XMail command line parameter has been added to increase the maximum number of accounts that can be handled by the server (now defaults to 25000 while previous versions defaults to 7500). =item * Fixed a bug in XMail alias removal. =item * Some code rewrites. =back [L] =head2 June 21, 2000 v 0.53 =over 4 =item * The ability to setup a spammer protection based on sender address has been added (see section dedicated to SPAM-ADDRESS.TAB). =back [L] =head2 June 18, 2000 v 0.52 =over 4 =item * The ability to disable PSYNC server by setting sync timeout to zero (-Yi 0) has been added. =item * SMTP client authentication has been added (see SMTP Client Authentication section). =item * SMTP server authentication (PLAIN LOGIN CRAM-MD5) has been added (see SMTPAUTH.TAB description). =item * SMTP server custom authentication has been added (see SMTPEXTAUTH.TAB description). =back [L] =head2 June 12, 2000 v 0.51 =over 4 =item * Added 'aliaslist' command to controller server. =item * Wildcard matching has been added in 'userlist' and 'aliaslist' controller server commands. =item * Fixed a SERIOUS bug in SysExec() on Linux port - upgrade asap Your version. =back [L] =head2 June 07, 2000 v 0.50 =over 4 =item * MD5 authentication has been added to CTRL server to enforce server security (watch at XMail admin protocol section). =item * Users of CTRL protocol are ancouraged to use this new authentication mode. =item * POP3 TOP command has been implemented. =back [L] =head2 June 06, 2000 =over 4 =item * Fixed a SERIOUS bug in custom (external) POP3 authentication procedures, it always give auth :(( APOP POP3 authentication has been added to POP3 server as long as to PSYNC server (POP3 client). =item * PSYNC server configuration file (POP3LINKS.TAB) IS CHANGED to enable APOP authentication (watch at POP3LINKS.TAB section). =item * The command 'poplnkadd' of CTRL server has been extended to another parameter that store authentication method to be used. =back [L] =head2 June 01, 2000 =over 4 =item * Correct handling of mail routing through 'RCPT TO: <>' has been added (see Mail Routing Through Addresses section). =item * Added wildcard matching and complex mail routing in SMTPGW.TAB. =item * Fixed a bug in PSYNC server that makes XMail to test for '+OK ' response instead that for '+OK' (and '-ERR ' for '-ERR'). =item * Added configuration steps in Part 7 of this doc. =item * The ability to handle custom (external) POP3 authentication procedures has been added (see section External Authentication). =back [L] =head2 May 29, 2000 =over 4 =item * Bug fixes in controller server and in PSYNC server. =item * Added --install-auto to install XMail as an autostart service (NT). =item * Better reliability in custom domain processing has been coded (REMEMBER to add the spool directory inside custdomains ). =item * Improved delivery error logs for a better problem understanding and fix. =item * Some code rewrites. =back [L] =head2 May 27, 2000 =over 4 =item * CtrlClnt improved in error control and bug fixes. =item * Changes in controller protocol for commands that has output. =item * The command 'userpasswd' has been added in controller server to allow user password changes. =item * Bug fixes in controller server. =item * Added wildchar (* ?) compare in aliases that allow to give a default processing to group of users (ie users that does not have an account). =item * XMail init.d startup script has been added (xmail). =back [L] =head2 May 26, 2000 =over 4 =item * Added CtrlClnt to give a access to remote administration of XMail (see CtrlClnt section). =item * This permit You to add, delete, list users as long as many other administration procedures (see XMail controller protocol). =back [L] =head2 May 24, 2000 =over 4 =item * Closed mailing lists has been added ('ClosedML' variable in USER.TAB). =item * The concept of filtering as message content testing has been extended to a message processing (address rewriting, attachment purging, etc ...). =item * Now message filtering can have a 'per user' processing to give a more fine grained control. =back [L] =head2 May 21, 2000 =over 4 =item * Added the way to specify a default domain filter with the presence of the file defaultfilter.tab into the filters subdirectory. =item * Improved PSYNC error handling. =item * Improved shutdown condition sensing (read Server Shutdown section). =back [L] =head2 May 08, 2000 =over 4 =item * Fixed a bug in SysDepLinux.cpp in function SysMakeDir() - permission mask changed to 0700. =item * Improved external programs execution behaviour under NT (no console is displayed). =item * Added the option to setup domain message filters with external programs exection (remember to add the filters subdirectory if You're upgrading an existing XMail). =item * This can help to filter messages based on its content to avoid mail worms and viruses that travel in attachments with given dangerous extensions. =back [L] =head2 April 26, 2000 =over 4 =item * ******************************************************************** * WARNING * The spool file format is changed ! * In order to use this new version You MUST flush the spool before * starting the new version of XMail. ******************************************************************** =item * Modified SysRename() to MscMoveFile() to avoid errors in all cases where files are positioned on differents mount points (Unixes versions). =item * Added log files rotate function as long as a new command line parameter (-Mr ndays) to specify the rotate delay. =item * Added message-id to SMAIL and SMTP log file. =item * Added @@MSGID macro in custom mail processing (external commands). =item * Added @@MSGREF macro in custom mail processing (external commands). =item * Now messages coming from external POP3 links are pushed into the spool and not directly into the target user mailbox - this enable custom user mail processing also on this kind of messages. =item * Added 'lredirect' command to MAILPROC.TAB that makes XMail to impersonate the local domain when redirect messages. =item * Added 'lredirect' command to custom domain mail processing that makes XMail to impersonate the local domain when redirect messages. =back [L] =head2 April 04, 2000 =over 4 =item * A @@TMPFILE macro has been added to MAILPROC.TAB syntax as long as to custom domain processing syntax. It will create a temporary file which hold the copy of the message. =item * It's external program resposibility to delete such file when it has finished its processing. =item * Messages generated as response to a delivery failure has target address remapped with the meanings of the file EXTALIASES.TAB. =item * Fixed a bug that makes XMail write a bad 'Received: ...' message tag. =item * This error cause mail readers to display bad message's datetimes. =item * Added 'uservars' command to the controller protocol to list user defined variables. =item * Added 'uservarsset' command to the controller protocol to set user defined variables. =back [L] =head2 March 21, 2000 =over 4 =item * IP access control has been added to POP3, SMTP and CTRL servers (pop3.ipmap.tab , smtp.ipmap.tab , ctrl.ipmap.tab). I suggest You to setup at least ctrl.ipmap.tab. =item * Permanent SMTP error detect has been added to avoid to send N times a message that will be always rejected. =item * Some code rewrite. =back [L] =head2 March 18, 2000 =over 4 =item * Linux daemon startup code has been added. =item * Modified the means of 'smtprelay.tab' and 'spammers.tab' with the introduction of a netmask (MODIFY YOUR FILES EVEN IF FOR NOW THE OLD VERSION IS STILL SUPPORTED !). =item * Service threads limit has been added to POP3 and SMTP servers. =back [L] =head2 March 16, 2000 =over 4 =item * Fixed a bug in new Linux semaphore code. =back [L] =head2 March 13, 2000 =over 4 =item * Added 'POP3Domain' configuration variable that gives the possibility to set the default (primary) POP3 domain. =item * Users of such domain can log to the server using only the name part of their email address. =item * Enached daemon (or service) mode with no messages printed onto console. =item * A -Md flag has been added to activate the debug mode that will restore verbose behaviour. =item * Error messages, in daemon mode, will be now printed to syslog() (Linux) or to EventViewer (NT). =item * Improved semaphore handling in Linux that prevent from allocation a great number of semaphores. SysV semaphore array capability of Linux is used to reduce the number of allocated semaphores. =item * Code rewrite. =back [L] =head2 March 10, 2000 =over 4 =item * Fixed other possible points of buffer overflow attacks. =item * My Co. XMail server has reached 100000 messages exchanged without a single crash ! Custom domain mail processing has been added. =item * MAIL_CMD_LINE environment (or registry) has been added to give XMail a way to get a command line even when it's started as service. =item * Command line option -?I xxx.yyy.zzz.www has been added to bind to specified server interfaces. =back [L] =head2 March 08, 2000 =over 4 =item * Added UIDL POP3 server command to make XMail work with clients that needs that feature. =item * Fixed a bug that prevent to send mail introduced with the previous version. =back [L] =head2 March 06, 2000 =over 4 =item * Fixed a bug that can cause XMail to fall in a long CPU eating loop. =item * Added a delay to bad POP3 logins to prevent POP3 mailboxes attacks. =item * Added the option to shutdown the connection in a bad POP3 login case. =item * Fixed a bug that makes XMail (as NT service) shutdown at user logoff. =item * Fixed a bug that makes XMail unable to work with machine that are unable to RDNS its own socket addresses. =item * Fixed some possible points of buffer overflow attacks. =back [L] =head2 March 03, 2000 =over 4 =item * Added 'poplnkenable' controller command. =item * Added RSS maps check option (relays.mail-abuse.org). =back [L] =head2 March 01, 2000 =over 4 =item * Added VRFY SMTP command. =item * Coded a better Service exit under Windows NT. =item * Added MAILPROC.TAB that enable custom processing of user messages. =back [L] =head2 February 29, 2000 =over 4 =item * Fixed a compilation bug under certain distributions of Linux. =item * The ability to make a dynamic DNS registration has been added with the 'DynDnsSetup' configuration option in SERVER.TAB. =back [L] =head2 February 28, 2000 =over 4 =item * 'SmartDNSHost' option added to redirect all DNS queries to a list of DNS hosts. This option can be used to avoid MSProxyServer-WS2_32.DLL bug that not allow to send UDP packets out of the local net. =item * User mailbox size check has been added. =back [L] =head2 February 27, 2000 =over 4 =item * Added UDP DNS query support when searching MX records. =item * This fixes a bug that makes XMail unable to send its mails if it deals with name servers that works only in UDP. =back [L] =head2 February 25, 2000 =over 4 =item * Fixed a bug that prevent XMail POP3 server to handle multiple domains if there are more nic-names over a single IP address. =item * Improved controller protocol. =item * Added RBL maps check option (rbl.maps.vix.com). =item * Added 'spammers.tab' file that control SMTP client connections. =back [L] =head2 February 24, 2000 =over 4 =item * Added controller login check. =back [L] =head2 February 23, 2000 =over 4 =item * Fixed a bug caused by a case sensitive compare in domain and users names. =item * Improved controller protocol for remote admin. =back [L] =head2 February 22, 2000 =over 4 =item * Fixed a Linux compilation bug and implemented controller protocol for remote admin. =back [L] =head2 February 18, 2000 =over 4 =item * Log locking and some code rewrite. =back [L] =head2 February 16, 2000 =over 4 =item * Added DNSROOTS file to avoid to repeat queries for roots domains. =item * Fixed a bug that can lead to a infinite loop under DNS queries. =back [L] =head2 February 15, 2000 =over 4 =item * Some code rewrite. =item * Improved DNS search for MX records (bug fix). =back [L] =head2 February 07, 2000 =over 4 =item * Some code rewrite. =item * Now if there are no MX records for destination domain, it'll be tried an SMTP connection to that domain directly. =back [L] =head2 February 05, 2000 =over 4 =item * Some code rewrite and SMTP RDNS check added. =back [L] =head2 January 31, 2000 =over 4 =item * Bug Fixes, some code rewrite and added NT service startup. =back [L] =head2 January 26, 2000 =over 4 =item * Bug Fixes. =back [L] =head2 January 18, 2000 =over 4 =item * Bug Fixes. =back [L] =head2 January 13, 2000 =over 4 =item * Bug Fixes. =back [L] =head2 October 11, 1999 =over 4 =item * Initial Revision. =back [L] xmail-1.27/docs/xmail.css0000644000175000017500000000172411341640462014610 0ustar davidedavide xmail-1.27/docs/xmail.cvpod0000644000175000017500000000246711341640430015133 0ustar davidedavide =begin cvpod :begin css ./xmail.css :end css :run pod2html Readme.pod --css=./xmail.css --title="XMail mail server v 1.27" --outfile=Readme.html :run pod2text -l Readme.pod Readme.txt :run pod2html ChangeLog.pod --css=./xmail.css --title="XMail Change Log v 1.27" --outfile=ChangeLog.html :run pod2text -l ChangeLog.pod ChangeLog.txt =end cvpod xmail-1.27/docs/ChangeLog.txt0000644000175000017500000020661611341640463015364 0ustar davidedavideNAME XMail Change Log as of Version 1.27 [top] CHANGE LOG Feb 25, 2010 v 1.27 * Support for using a chain of SSL certificates, instead of a single one. * Fixed SMTP explicit routing address parsing. * Fixed a bug that made XMail incorrectly handle extremely long header line lengths. * Faster shutdown time on Unix systems. * Tweaked DNS resolution to cope with lame name servers. * Support for greater than 2GB sizes in POP3 server and PSYNC. * Safer temporary file name generation. * Made the temporary directory on Unix, configurable via the "XMAIL_TEMP" environment variable. * Fixed a bug that was caused by the SSL code triggering the XMail binding locking code after XMail has already cleanup. * Fixed a bug in the SMTP external authentication. * Fixed Unix syslog logging facility to consider different logging levels. * Changed SMTP HELP response code to 214. Jun 27, 2009 v 1.26 * Fixed a bug where STARTTLS was resetting the session too much, by canceling certain flags/options read inside the SERVER.TAB. * Fixed a bug that happened if a message filter mistakenly remove the message file from under XMail control. * Fixed a bug that make XMail to wrongly report virtual memory sizes on 32 bit systems with larger than 4GB VM space. * Changed the line termination used to store messages into the mailboxes of Unix versions of XMail. Now messages are stored with the OS native LF termination, instead of the RFC CRLF that was used before. This allows other Unix softwares working together with XMail to not be confused by the extra CR present in the line termination. * The "smtprelay" behaviour with respect to 5xx responses from one of the servers in the relay list, has been changed. Now a 5xx response will stop the processing, instead of iterating on the remaining servers of the list. * Avoid to crawl all the USER.TAB file during a "userlist" CTRL command. * Fixed a bug that allowed non-RFC characters inside domain names. * Fixed OSX Leopard build error. * Added "timeo" option to flags execution. * Added "NoAuth", "EnableVRFY" and "EnableETRN" settings inside IP properties. Jan 3, 2008 v 1.25 * Added the ability to select SmtpConfig-IP options by local port too (SmtpConfig-IP,PORT). * Added a new -YT command line option to set the timeout used by a POP3 client connection. * Fixed a bug in the RFC822 ATEXT token definition. * If the recipient domain does not have an MX record, and does not have an A record, now XMail bounces immediately. * Fixed OpenSSL connection shutdown to avoid RST packet generation. * Changed SMTP AUTH LOGIN authentication to support the optional inline parameter. * Added IPV6 support. New command line options are available to select XMail's behaviour with respect to IPV4/IPV6 compatibility. * Fixed/strengthened RFC address parsing. * Drop the SMTP connection is case of timeout. * Fixed a bug caused by the new strict host/doman name check added in 1.24 (in the SMTPGW.TAB parsing). * Completely changed the DNS resolution code. * Do not try the A-record delivery in case of temporary DNS/network errors. * Added remote MTA message ID to SMAIL logging. * Added a new "POP3S" option to the POP3LINKS.TAB file, to allow connections to full POP3S remote servers. * Fixed a bug in the SMTP Outbind feature. * Changed POP3 log format to add information about the success or failure of the operation, and to report the number of messages and the total size of the mailbox (in case of successful login). * Added a new "Pop3LogPasswd" SERVER.TAB variable to control if POP3 passwords are logged into the POP3 log file. * Added a new "SmtpNoTLSAuths" SERVER.TAB variable. It allows to specify which SMTP authentications are allowed in non-TLS mode. * Fixed a small memory leak affecting users using the "OutBind" feature. * Removed the "SMTP-TLS" SERVER.TAB variable and replaced with "SmtpGwConfig" that supports the format described in "SMTP GATEWAY CONFIGURATION". The "SmtpGwConfig" allows the user to specify global options for remote SMTP connections. * Added $(RRCPT) macro to SMTP filters. Jan 1, 2007 v 1.24 * ******************************************************************** * Removed the DynDNS feature. ******************************************************************** * Added the new "OutBind" options for PSYNC accounts. It allows to specify the IP of the interface to be used when talking to the remote server. * Added a new "OutBind" option to the "SmtpConfig" SERVER.TAB variables. It allows to specify the IP of the interface to be used when talking to the remote server. * Added a new SMTP.HNPROP.TAB file to drive remote peers SMTP properties through host name. * Added command line options to disable single services. * ******************************************************************** * The external SMTP authentication (both server and client) changed. * Changed is also the format of the SMTPEXTAUTH.TAB file. * The external SMTP client authentication has been removed. ******************************************************************** * Added the new "Leave" options for PSYNC accounts, that allows messages to be left on the remote server. This option only works if the remote POP3 server supports the UIDL command. * Fixed a bug in the mailbox size check between SMTP and SMAIL layers. This resulted in EFULL errors never returned at SMTP level. * Fixed a bug in alias resolution for aliased users inside aliased domains. * ******************************************************************** * SSL support has been added. See the "SSL CONFIGURATION" section of * the documentation to find out how to properly configure XMail. * You MUST do this in order to have SSL support working. ******************************************************************** * ******************************************************************** * The format of the "DefaultSMTPGateways" SERVER.TAB variable, of the * SMTPFWD.TAB relay list, and of the "smtprelay" list changed * (separator is now the ';' character and can have options attached, * separated by comma). * You need to adjust it according to the new format ******************************************************************** * Added new "EnableCTRL-TLS", "EnableSMTP-TLS" and "EnablePOP3-TLS" SERVER.TAB variables. * Added SMTP gateway options to the "DefaultSMTPGateways" variable, to the SMTPFWD.TAB file, and to the "smtprelay" command inside the mail processing files. Added a new "WantTLS" option to the "SmtpConfig" SERVER.TAB variables. * Added a new "EaseTLS" option to the SMTP.IPPROP.TAB file. * Added a new 'S' SMTP auth option to bypass a "WantTLS" configuration. * Added "SSLUseCertsFile", "SSLUseCertsDir", "SSLWantVerify", "SSLAllowSelfSigned", "SSLWantCert" and "SSLMaxCertsDepth" SERVER.TAB variables to configure XMail's SSL behaviour. * Added STARTTLS SMTP support. * Added STLS POP3 support (and the new CAPA command). * Added SMTPS support. * Added POP3S support. * Added CTRLS support. * Added FAPOP, STLS and FSTLS authentication options to the POP3LINKS.TAB file.. * Added a new "SMTP-TLS" SERVER.TAB variable to tell XMail if it has to try to negotiate TLS sessions with remote SMTP servers. * Added SSL support to the CTRL protocol and to the CtrlClnt client. Nov 19, 2006 v 1.23 * Changed the filter log to include the full exec string (separated by semicolon). * Fix CTRL "poplnkadd" and "poplnkdel" to accept local domains strings starting with special characters. * Added (finally!) a command line makefile (Makefile.win) to build the whole XMail package without the usage of the MS VC++ IDE. * Reject a CTRL "domainadd" command if an alias domain already exists with the same name. * Changed the CTRL "usergetmproc" command to allow the caller to specify if it is the user or the domain one that is wanted. Or a merges of both, if "DU" is specified in the optional 3th parameter. * Changed the CTRL "usersetmproc" command to allow the caller to specify if it is the user ('U') or the domain ('D') one that is wanted to be set. * Added complex/multiple macro substitution capabilities to external programs argoument lists. * Added strictier SMTP address validation. * Check the mailbox size for every message coming into the mailbox (before it was only done during the SMTP phase). * Do not try to send to the 'A' record if the recipient domain does not exist at all (NXDOMAIN). Bounce immediately instead, avoiding lengthy retry policies. * Added the "wlex" flag to filter lines (works for the SMTP ones only), to exclude execution of the filter line in case the client IP is white-listed inside the ipprop file. * Added the post-RCPT SMTP filter, that is called before XMail acks the client recipient. A new "RCPT=EFILTER" long entry is emitted in case a recipient is rejected by a filter. * Added @@CRCPT (current recipient) and @@FROM (sender email address) macros to SMTP filter substitution. * Allow cmdaliases to work on aliased domains. Before a cmdalias defined on an alias-target domain was not working before the cmdalias check was done before the alias domain resolution. * Added the ability to bypass the SMTP.IPMAP.TAB inclusion using SMTP authentication. * Added a new SERVER.TAB variable "SMTP-IpMapDropCode" to control the drop code to be used for IPs listed inside the SMTP.IPMAP.TAB. Like other codes inside XMail, 1 means drop now, 0 means allow if auth, and -N means add N seconds delay. An immediate drop will emit a "SNDRIP=EIPBAN" log entry. * Added a new SERVER.TAB variable "SmtpMsgIPBan" to control the SMTP message returned in case of SMTP.IPMAP.TAB inclusion. * Added log message when the maximum number of SMTP/POP3/CTRL threads is hit. * Fixed documentation about the spool info line and the SMTP filters info line. * Fixed a build problem on OpenBSD related to the lack of c_r (reentrant C library) library. * Fixed greetings message to be RFC2821 compliant (server host must be first). * Fixed a NAME_MAX build error ond *BSD and Solaris. * Added a "Pop3ScanCur" USER.TAB variable to control the scan of the Maildir's "cur" directory during POP3 message list build. Now XMail only scans the "new" directory as default. Oct 12, 2005 v 1.22 * The POP3 before SMTP authentication is now correctly interpreted as real SMTP authentication, by the mean of @@USERAUTH. * 'ATTENTION': Fixed a possible cause of buffer overflow in the XMail's sendmail binary. * Changed the DNS MX resolution to allow better handling of partially broken DNS servers configuations. Jan 9, 2005 v 1.21 * Added a fix for 64 bits porting compatibility. * Added the ability to exclude filters from execution in case of authenticated user. By pre-pending the filter command token with a token containing "!aex", the filters won't be run if the user authenticated himself. * Added @@USERAUTH macro even to standard in/out filters (before it was only defined for SMTP ones). * Added a new "NoSenderBounce" variable inside the SERVER.TAB file, to enable XMail generated bounce messages to have the empty SMTP sender ('MAIL FROM:<>'). * Added a new "SMTP-MaxErrors" variable inside the SERVER.TAB file to set the maximum errors allowed in a single SMTP session (default zero, unlimited). * Added a "LastLoginTimeDate" variable to the "userstat" CTRL command. * Added external aliases support in the CTRL protocol. * The MESSAGE.ID file is now automatically created, if missing. * Changed the logic used to treat domain and user MAILPROC.TAB files. Before, a user's MAILPROC.TAB was overriding the domain one, while now the rules are merged together, with domain's ones first, followed by user's ones. * The maximum mailbox size of zero is now interpreted as unlimited. * Fixed XMail's sendmail to detect non-RFC822 data and handle it correctly. * The IP:PORT addresses emission in spool files (and Received: lines) has been changed to the form [IP]:PORT. * Added filter logging, that is enabled with the new -Qg command line option. * Fixed an error message in the SMTP server, that was triggered by the remote client not using the proper syntax for the "MAIL FROM:" and "RCPT TO:" commands. * Fixed explicit routing through SMTPGW.TAB file. * Fixed a possible problem with file locking that might be triggered from CTRL commands cfgfileget/cfgfileset. * Added a check to avoid the CTRL server to give an error when a domain created with older versions of XMail does not have the domain directory inside cmdaliases. * The SMTP server FQDN variable should be set to the value of "SmtpServerDomain", when this is used inside the SERVER.TAB file. May 30, 2004 v 1.20 * Fixed a possible memory leak and a possible source of crashes. May 29, 2004 v 1.19 * Implemented the "filter" command for custom mail processing (MAILPROC.TAB, cmdaliases and custom domains). * If "RemoveSpoolErrors" is set inside the SERVER.TAB file, messages are never frozen. Before there was a special case (delivery failure and delivery notification failure) that could have lead to frozen messages. * Made "aliasdomainadd" to check for the existence of the alias domain (and reject the command if existing). * Introduced a new environment variable recognized by XMail (XMAIL_PID_DIR), to let the user to specify a custom PID file directory (this is for Unix ports only). * Implemented ability to stop custom mail processing upon certain exit codes from external commands execution. * The SPAMMERS.TAB check is now bypassable (see doc for details). * 'ATTENTION': Changed the "aliasdomainlist" syntax and output format (see doc for details). * Made (on Unix setups) the PID file name to be dependent on the daemon file name. * Implemeted a domain-wise MAILPROC.TAB and extended its "redirect" and "lredirect" commands to support account specific (USER@DOMAIN) and domain targets (DOMAIN). * Implemented SMTP filters to allow users to reject the SMTP session before and after the remote client data has been received. Mar 27, 2004 v 1.18 * Restructured the external program execution environment on Unix ports. Simplified, as a consequence of this, the system dependent portion of XMail (SysDep*). * Fixed a bug in the address range parsing (x.y.w.z/s). * Fixed the alias lookup to perform a better "best match" wildcard selection. * Fixed a bug in the DNS resolved that made XMail to not correctly handle domain CNAMEs. Sep 14, 2003 v 1.17 * Added Bcc: removal from message headers in XMail's sendmail. * Added PSYNC logging (-Yl). * Added domain completion to XMail's sendmail when the specified sender address (-f or -F) does not contain one. The environment variable (or registry in Windows) DEFAULT_DOMAIN is looked up to try to complete the address. * Fixed a bug in the return code of SysAccept() in all Unix versions. * Fixed a bug that was triggered by external command and filter exiting soon. XMail was not able to correctly sync with the child process by losing it. This apply only to Unix versions of XMail. * A notification message is now sent to the sender if the message is handled with "smtp" or "smtprelay" commands and a permanent error happen when sending to the remote SMTP server. Jul 8, 2003 v 1.16 * Added a new configuration file "smtp.ipprop.tab" to be able to specify peer IP based configuration option, like for example IP white listing against IP checks. * 'ATTENTION': The filter return code has been changed and new return codes are expected to be returned by filters. Please che the documentation and update your filters before starting to use the new version. * Added the ability to specify a custom error message for filters. * Fixed a bug in the string quoting function that showed up when the string was empty (""). * Changed the order used by XMail to check the mailer domain. Now MX check is performed first, then A record check. This caused a slow down for domains having MX records but not A records. * Added two new Received: types to give the ability to hide client information if the SMTP client does authenticate with the server. * Added the rejection map name inside the SMTP log file in case of SNDRIP=EIPMAP error. * Modified XMail's sendmail to add the RFC822 Date: header if missing. * XMail now uses the name of the executable ( without .exe ) to both register the service name and fetch registry variables. * The POP3 server now picks up messages even from the Maildir's "cur" subdirectory. May 3, 2003 v 1.15 * Implemented a new filters feature that enable the user to stop the selected filters list processing upon receival of certain exit codes. * Fixed the wrong log file name generation when the daylight time is active. * Fixed a bug inside the DNS MX resolver. * Fixed a bug ( Windows OS bug ) that made XMail unable to create domains starting with reserved device names ( COM#, LPT, PRN, CON, ... ). So, for example, a domain named "com4.domain.org" couldn't be created because of this naming conflict. * Fixed a bug that made XMail to not apply filters for local mailing list. * Fixed a bug that made XMail to crash under certain conditions. April 2, 2003 v 1.14 * Added a "Server:" field to the notification message. It'll report the remote SMTP server host name and IP that issued the error. It will not be present if the error does not originate from a remote SMTP server. * Added a new command line parameter -MD to set the number of subdirectories allocated for the DNS cache files storage. * Messages with non RFC822 conforming headers are now handled by the PSYNC code. * 'ATTENTION': The filter architecture has been completely changed. To correctly update to this version you have to create two empty files "filters.in.tab" and "filters.out.tab" inside the $MAIL_ROOT directory. Please refer to the documentation for more information about the new filter architecture. If you are not currently using filters, the simple creation of the two files listed above will be sufficent. * 'ATTENTION': The internal spool file format is changed with the new line added ( the 1st one ) that contain various message information. Filters that rely on the internal spool file format must be changed to match the new structure. * Fixed a bug that made XMail to not correctly report zero sized files inside the mailbox. * Added file size to CTRL's "filelist" command. * Fixed a connect-error reporting bug on Windows platform. January 25, 2003 v 1.12 * Better check for user/domain names. * Changed search pattern for filters. Now a domain name is scanned for all sub-domains. * Fixed a boundary check inside the Base64 decoder. * Added the client FQDN inside the SMTP log file in case the RDNS check is enabled. * Added a new SERVER.TAB variable "SmtpMsgIPBanSpammers" to set the message that is sent to the SMTP client when the client IP is listed inside the file SPAMMER.TAB. = item * Added a new SERVER.TAB variable "SmtpMsgIPBanMaps" to set the message that is sent to the SMTP client when the client IP is listed inside one of the "CustMapsList". * Added a new SERVER.TAB variable "SmtpMsgIPBanSpamAddress" to set the message that is sent to the SMTP client when the client IP is listed inside the file SPAM-ADDRESS.TAB. * Fixed a bug inside the custom account handling that made XMail to pass the old password instead of the new one. * Added OpenBSD support. November 9, 2002 v 1.11 * Added a new command line parameter -QT to enable a configurable timeout for filter commands. * Fixed a bug that made XMail to ignore cmdalias accounts when a wildcard alias was matching the account itself. * Added the 'smtprelay' command to the MAILPROC.TAB processing. * Removed the 'wait' command from all custom processing. * Added a new macro @@RRCPT to filters commands to extract the real local recipient. * Changed the way the EXTALIASES.TAB mapping modify the return path. It now change the "Reply-To:" instead of the "From:" to avoid problems with signature verification software. * Implemented logging on SMTP transactions rejected because of mapped IP or failing RDNS check. * Added a new SERVER.TAB variable "SmtpServerDomain" to force the SMTP domain used by XMail in its banner string ( for CRAM-MD5 ESMTP authentication ). * Improved DNS resolution for not existing domains. [top] July 27, 2002 v 1.10 * Added a variable 'CustomSMTPMessage' inside the server's configuration file SERVER.TAB to enable the postmaster to set a custom message that is appended to the standard XMail error response. * Added log entries in case of relay lists mapped IPs. * Fixed a build error on FreeBSD. * Added a new SERVER.TAB variable 'DisableEmitAuthUser' to block the emission the the header 'X-Auth-User:' for authenticated user. * Added a new USER.TAB variable 'DisableEmitAuthUser' to block the emission the the header 'X-Auth-User:' for authenticated users (this variable overrides the SERVER.TAB one). * Added command line driven mailbox delivery mode (-MM = Maildir , -Mm = mailbox). * Added sysv_inst.sh shell script to help creating SysV boot scripts for XMail. [top] June 15, 2002 v 1.9 * Fixed a bug in HOSTNAME:PORT handing code inside the PSYNC server. * Fixed a bug introduced in 1.8 in the Windows version that made XMail to have bad behaviour when used with external programs. * Fixed a bug that resulted in XMail generating frozen messages even if the SERVER.TAB variable was set to not create them. * Fixed a bug that made it possible to send a 'MAIL FROM:<@localdomain:remoteaddress>' and to have the message relayed if the IP of the current machine was inside the smtprelay.tab of the machine handling the MX of @localdomain. * Implemented internal mail loop checking (internal redirects). * Added a new MLUSERS.TAB permissions flags 'A', that is similar to 'W' by instead of checking the 'MAIL FROM:<...>' address check the SMTP authentication address (this will prevent malicious users to forge the address to gain write permissions on the list). [top] May 19, 2002 v 1.8 * Changed XMail's behaviour upon receival on long (RFC compared) data lines on SMTP and POP3 fetch inbound doors. Before the operation was aborted while now data is accepted without truncation, that might make XMail to behave non conforming the RFC. * Added @@RRCPT macro to the 'external' MAILPROC.TAB command to emit the real recipient of the message (@@RCPT could be an alias). * Added HOSTNAME:PORT capability to POP3LINKS.TAB entries. * Added Linux/PowerPC port. * Added 'filelist' CTRL protocol command. * Added SMTP HELP command. * Changed bounce message format to add the last SMTP error and to make it works with Ecartis mail bounce processing. * Changed the XMail's sendmail implementation to accept '-f FROM' and '-F FROM' non standard sendmail paramenter specification. * Fixed a bug inside the PSYNC server code that made XMail to fail to resolve POP3 server addresses. * Various code cleanups. [top] March 03, 2002 v 1.7 * Fixed a bug inside the POP3 server that caused bad responses to UIDL and LIST commands in case of certain command patterns. * Added support for HOSTNAME:PORT (or IP:PORT) for the DefaultSMTPGateways SERVER.TAB variable. * Added domain aliases cleanup upon main domain removal. * Added 'MaxMessageSize' inside USER.TAB files to override the global (SERVER.TAB) one. [top] March 03, 2002 v 1.6 * Added a new USER.TAB variable 'UseReplyTo' (default 1) to make it possible to disable the emission of the Reply-To: header for mailing lists. * Fixed a bug that caused XMail to uncorrectly deliver POP3 fetched messages when used togheter with domain masquerading. * Changed index file structure to use an hash table for faster lookups and index rebuilding. * New files inside the tabindex directory now have the extension .hdx and old .idx files can be removed. * Added X-Deliver-To: header to messages redirected with MAILPROC.TAB file. * Added configurable Received: tag option in SERVER.TAB by using the variable 'ReceivedHdrType'. * Added a configurable list of header tags to be used to extract addresses for POP3 fetched messages by using the SERVER.TAB variable 'FetchHdrTags'. * History (change log) entries have been moved from the main documentation file and a new file (ChangeLog.txt) has been created to store change-log entries. * Removed RBL-MAPSCheck (currently blackholes.mail-abuse.org.), RSS-MAPSCheck (currently relays.mail-abuse.org.) and DUL-MAPSCheck (currently dialups.mail-abuse.org.) specific variables and now everything must be handled with CustMapsList (please look at the documentation). * Added NotifyMsgLinesExtra SERVER.TAB variable to specify the number of lines of the bounced message to include inside the notify reply (default zero, that means only header). * The message log file is now listed inside the notification message sent to ErrorsAdmin (or PostMaster ). * Added NotifySendLogToSender SERVER.TAB variable to enable/disable the send of the message log file inside the notify message to the sender (default is off). * Added TempErrorsAdmin SERVER.TAB variable to specify an account that will receive temporary delivery failures notifications (default is empty). * Added a new SERVER.TAB variable NotifyTryPattern to specify at which delivery attempt failure the system has to send the notification message. * Fixed a bug that caused alias domains to have higher priority lookup compared to standard domains. [top] February 05, 2002 v 1.5 * Fixed a bug in wildcard aliases domain lookup. * Fixed a bug in CTRL command 'aliasdel' that failed to remove aliases with wildcard domains. * Fixed a bug that caused XMail to timeout on very slow network connections. [top] January 18, 2002 v 1.4 * Fixed a bug that made XMail fail to parse custom maps lists in SERVER.TAB. * Fixed a bug that prevented XMail to add wildcard-domain aliases. * Added a filter feature to the CTRL commands 'domainlist' and 'aliasdomainlist'. * Added an extra message header field 'X-AuthUser:' to log the username used by the account to send the message. * Added Reply-To: RFC822 header for mailing lists sends. * Fixed a Win32 subsystem API to let XMail to correctly handle network shared MAIL_ROOTs. [top] December 19, 2001 v 1.3 * ORBS maps test removed due old ORBS dead, the SERVER.TAB variable 'CustMapsList' can be used to setup new ORBS (and other) maps. * Fixed a bug in XMail's sendmail that was introduced in version 1.2 and made it to incorrectly interpret command line parameters. * Fixed a bug that made XMail not correctly recognize user type characters when lowercase. * Fixed a bug that caused XMail to not start is the MAIL_ROOT environment variable had a final slash on Windows. * Added a new filter return code (97) to reject messages without notification and without frozen processing. * Added two new command line options -MR and -MS to set the I/O socket buffers sizes in bytes (do not use them if You don't know what You're doing). * Changed system library to have a better performace, expecially on the Windows platform. * Users that are using XMail mainly inside their local LAN are strongly encouraged to switch to this version. * Fixed a bug that enabled insertion of aliases that overlapped real accounts. [top] November 12, 2001 v 1.2 * A problem with log file names generation has been fixed. * Added a new CTRL command 'userstat'. * Implemented Linux/SPARC port and relative makefile (Makefile.slx). * Extended the XMail version of sendmail to support a filename as input (both XMail format that raw email format) and to accept a filename as recipient list. * Added a new kind of aliases named 'cmdaliases' that implements a sort of custom domains commands on a per-user basis (look at the CmdAliases section). * ******************************************************************** * You must create the directory 'cmdaliases' inside $MAIL_ROOT * to have 1.2 work correctly ******************************************************************** * Fixed a bug that had XMail not check for the user variable SmtpPerms with CRAM-MD5 authetication. * Fixed a bug in the XMail's sendmail implementation that made it unable to detect the '.' end of message condition. * Fixed a bug in the XMail's sendmail implementation that made it to skip cascaded command line parameters (-Ooet). * Implemented a new XMail's sendmail switch -i to relax the . ond of message indicator. [top] October 09, 2001 v 1.1 * Fixed a bug in the XMail version of sendmail that made messages to be double sent. * The macro @@TMPFILE has been removed from filters coz it's useless. * The command line parameter -Lt NSEC has been added to set the sleep timeout of LMAIL threads. * Added domain aliasing (see ALIASDOMAIN.TAB section). * ******************************************************************** * You must create the file ALIASDOMAIN.TAB inside $MAIL_ROOT * (even if empty) ******************************************************************** * Added CTRL commands 'aliasdomainadd', 'aliasdomaindel' and 'aliasdomainlist' to handle domain aliases through the CTRL protocol. [top] September 04, 2001 v 1.0 * Added wildcard matching in the domain part of ALIASES.TAB (see ALIASES.TAB section). * Changed the PSYNC scheduling behaviour to allow sync interval equal to zero (disabled) and let the file .psync-trigger to schedule syncs. * Solaris on Intel support added. * A new filter return code (98) has been added to give the ability to reject message without notify the sender. [top] June 10, 2001 v 0.74 * A stack shifting call method has been implemented to make virtually impossible for attackers to guess the stack frame pointer. * With this new feature, even if buffer overflows are present, the worst thing that could happen is a server crash and not the attacker that execute root code on the server machine. * Implemented the SIZE ESMTP extension and introduced a new SERVER.TAB variable 'MaxMessageSize' that set the maximum message size that the server will accept (in Kb). * If this variable is not set or if it's zero, any message will be accepted. * A new SMTP authentication permission ('Z') has been added to allow authenticated users to bypass the check. * The SMTP sender now check for the remote support of the SIZE ESMTP extension. * A new SERVER.TAB variable has been added 'CustMapsList' to enable the user to enter custom maps checking (look at the section 'SERVER.TAB variables'). * Fixed a bug in 'frozdel' CTRL command. [top] June 08, 2001 v 0.73 * Fixed a possible buffer overflow bug inside the DNS resolver. [top] May 23, 2001 v 0.72 * Fixed build errors in MkUsers.cpp and SendMail.cpp (FreeBSD version). * Added the ability to specify a list of matching domains when using PSYNC with masquerading domains (see POP3LINKS.TAB section). * The auxiliary program sendmail now reads the MAIL_ROOT environment from registry (Win32 version) and if it fails it reads from the environment. * Fixed a bug that made XMail to crash if the first line of ALIASES.TAB was empty. * RPM packaging added. * Added a new feature to the custom domain commands 'redirect' and 'lredirect' that will accept email addresses as redirection target. * Fixed a bug in MkUsers. * Added system resource checking before accepting SMTP connections (see 'SmtpMinDiskSpace' and 'SmtpMinVirtMemSpace' SERVER.TAB variables). * Added system resource checking before accepting POP3 connections (see 'Pop3MinVirtMemSpace' SERVER.TAB variable). * A new command line param -t has been implemented in sendmail. * A new USER.TAB variable 'SmtpPerms' has been added to enable account based SMTP permissions. * If 'SmtpPerms' is not found the SERVER.TAB variable 'DefaultSmtpPerms' is checked. * A new USER.TAB variable 'ReceiveEnable' has been added to enable/disable the account from receiving emails. * A new USER.TAB variable 'PopEnable' has been added to enable/disable the account from fetching emails. [top] April 29, 2001 v 0.71 * Removed the SERVER.TAB variable 'HeloUseRootDomain' and introduced a new one 'HeloDomain' to specify the name to send as HELO domain (look at variable documentation). * If 'HeloDomain' is not specified or if empty then the reverse lookup of the local IP is sent as HELO domain. * Added a new SERVER.TAB variable 'DUL-MAPSCheck' to implement the 'dialups.mail-abuse.org' maps check. * Changed the meaning of the SERVER.TAB variables SMTP-RDNSCheck, RBL-MAPSCheck, RSS-MAPSCheck, ORBS-MAPSCheck and DUL-MAPSCheck to give XMail the ability to delay SMTP commands for clients that fail the check. * The old behaviour (dropped connection) is obtained by setting values greater than zero, while You can set the delay (in seconds) by specifying negative values. * For SMTP-RDNSCheck and DUL-MAPSCheck variables the connection is no more dropped at welcome time but a 'server use forbidden' message is given at MAIL_FROM time. * In this way XMail give authenticated users the ability to get in from 'mapped' IPs. * Fixed a bug that cause XMail to crash if there is an empty line in a MLUSERS.TAB file. * Added a new SERVER.TAB variable 'ErrorsAdmin' that will receive the notification message for every message that has had delivery errors. * The feature to force XMail to initiate a PSYNC transfer has been added. This is implemented by making XMail to check for a file named '.psync-trigger' inside MAIL_ROOT. When this file is found a PSYNC tranfer is started and the file is deleted. * Added a new SERVER.TAB variable 'MaxMTAOps' to set the maximum number of relay steps before to declare the message as looped. * Added SMTP after POP3 authentication and one new command line switch (-Se) to set the expire time of the POP3 IP. * A new SERVER.TAB variable has been added to enable/disable SMTP after POP3 authentication (EnableAuthSMTP-POP3). * Added the replacement for sendmail that will use the local mail delivery of XMail (look at the sendmail section). * The ESMTP command ETRN has been added has long as a new SMTP perm flag 'T' to give access to this feature and a new SERVER.TAB variable 'AllowSmtpETRN' to set the default feature access. * Added a new CTRL command 'etrn' to support the same SMTP feature through the CTRL protocol. * Fixed a bug in filters selection that made XMail to case-sensitive compare user and domain filters. * Changed the name of the default filter to '.tab' instead of 'defaultfilter.tab'. * Finally, FreeBSD port added !! [top] April 08, 2001 v 0.70 * Added the message ID to the received tag and extended the SMTP log file with the username of the authenticated user (if any). * Fixed a bug in external authentication (POP3). * The USERDEF.TAB file is now checked inside $MAIL_ROOT/domains/DOMAIN before and then in $MAIL_ROOT. * This permit per domain user default configuration. * Added a new CTRL server command 'frozsubmit' to reschedule a frozen message. * Added a new CTRL server command 'frozdel' to delete a frozen message. * Added a new CTRL server command 'frozgetlog' to retrieve the frozen file log file. * Added a new CTRL server command 'frozgetmsg' to retrieve the frozen message file. [top] February 22, 2001 v 0.69 * Fixed a bug that made XMail to grant Read permissions to mailing lists users. * Fixed a bug that made XMail to delete SMTP rights granted during authentication when sending multiple messages. * Fixed a bug in SMTP CRAM-MD5 authentication. * Fixed a bug that caused XMail to break the header when an headers tag is made by 'tag-name:[CR][LF]tag-string'. * Added the delete functionality to the CTRL command 'uservarsset' by giving the string value '.|rm' the delete capability. [top] February 05, 2001 v 0.68 * Fixed a buffer overflow vulnerability in CTRL server and added command string validation to all servers. * Added 8BITMIME and PIPELINING support (it was already compliant). * Added a new SERVER.TAB option 'HeloUseRootDomain' to make XMail to use the 'RootDomain' like HELO domain. * Added FINGER service access control based on the peer IP address. A new file FINGER.IPMAP.TAB has been added to MAIL_ROOT with the same meaning of the ones used with SMTP, POP3 and CTRL services. * Fixed a bug that caused XMail to drop the first character of the headers if there was no space between the colon and the header value. * Added extended SMTP log information by adding an extra (last) field to the log file. * Added a new SERVER.TAB variable 'AllowSmtpVRFY' (default off) to enable the SMTP VRFY command. * Added a new SMTP auth flag 'V' to enable VRFY command (bypassing SERVER.TAB settings). * Improved the POP3 sync method to fetch and distribute mail that uses an external POP3 mailbox to collect more accounts togheter. Before the method failed if the user was not in the first 'To:' address, while now all addresses contained in 'To:', 'Cc:' and 'Bcc:' are checked. There is also a new SERVER.TAB variable 'Pop3SyncErrorAccount' whose use is catch all emails that has been fetched but has had delivery errors. [top] January 04, 2001 v 0.67 * Fixed a bug in 'poplnkenable' CTRL server command. * Changed the report of 'poplnklist' CTRL server command to include the authentication mode and the enabled status. * Fixed a bug in 'poplnkdel' that left around the .disable file. * A new directory 'pop3links' has to be added to store POP3 links disable files for non-local links. * This will fix also a bug in multi-account and masquerading POP3 sync. * A new way to retrieve the POP3 domain has been coded by doing a reverse DNS lookup from the server IP. If the result of the lookup will be xxxx.yyyy.zzzz then XMail will test if xxxx.yyyy.zzzz is handled, then yyyy.zzzz and then zzzz. * The first of these domains that is handled by XMail will be the POP3 domain. * Added a new SERVER.TAB variable 'CheckMailerDomain' that, if on ('1'), force XMail to validate the sender domain ('MAIL FROM:<...@xxx>') by looking up DNS/MX entries. * Fixed the bug that made XMail to not accept users to add if a wildcard alias were defined. [top] December 08, 2000 v 0.66 * The SMTP command RSET no more clean the authentication status of the client. * Improved MX records resolution and fixed a bug in MD5 algo. * A new USER.TAB variable (for Mailing Lists) 'ListSender' has been added to hide real senders from SMTP protocol. * If this variable does not exist the 'MAIL FROM:<>' command will contain the 'real' sender address. * This variable should be set to the email address of the mailing list admin that will receive all the notification and error messages, preventing this error to reach real senders. * Fixed an RFC conformance bug in SMTP protocol that made XMail to accept the MAIL_FROM command even if the HELO (or EHLO) command was not issued. * Fixed a bug in SysExec() in Linux and Solaris versions that made all external programs to have a bad behaviour or fail. This bug was introduced in 0.65 version. * Fixed a bug in the Windows version that results in a failure to resolve MX queries. * This bug was introduced in 0.65. [top] November 25, 2000 v 0.65 * Complete Linux library rewrite, now using PThread library instead of forking. * Solaris/SPARC port added (HPUX/PARISC incoming). * Removed the -Ma flags for the maximum number of accounts coz it's no more needed due the new Linux system library (now the memory shares is given for free instead of having to rely on IPC). * Removed the -Mk parameter due the IPC stuff removal. * Extra domain aliases has been added (see ALIASES.TAB section). * A new feature has been added to XMail to enable XMail users to prepare mail files in a given format, put them in /spool/local directory and get them delivered by the server (see 'XMail local mailer' section). * Two new directories 'local' and 'temp' must be created inside the 'spool' directory. * The meaning of the command line param '-Mr ...' has changed from days to hours. [top] November 02, 2000 v 0.64 * Added permissions to mailing list users (see MLUSERS.TAB section). This enable You to have read only users as long as read/write users. * This is implemented by adding a new extra field to MLUSERS.TAB to store permissions ('R' or 'RW'). * The lack of this extra field (old MLUSERS.TAB files) will be interpreted as 'RW'. * The command 'mluseradd' has been extended to hold the new permission parameter (see section 'XMail admin protocol'). * Added a new CTRL command 'frozlist' to list files that are in frozen status (see section 'XMail admin protocol'). * Fixed a bug in the new masquerading feature of XMail (POP3LINKS.TAB). * Fixed a bug that makes XMail crashes when a mail loop condition is detected. * Removed the strict RFC compliant check on messages. [top] October 27, 2000 v 0.63 * Added a feature that makes usable the new POP3LINKS.TAB fetching option by masquerading incoming recipient. This can be done by replacing the domain part or by adding a constant string to the To: address (see POP3LINKS.TAB section). [top] September 12, 2000 v 0.62 * Added a new custom domain processing command 'smtprelay' that can be used to route messages to other smtp servers (see section 'Custom domain mail processing'). * New search method for custdomains/ files : now the test to find out if the domain sub1.sub2.domain.net will get a custom domain processing is done by looking up sub1.sub2.domain.net.tab , .sub2.domain.net.tab , .domain.net.tab , .net.tab and then .tab. * There is a new POP3 sync method now that enables users that receives mail for multiple recipients into a single external POP3 account to get all mail to be distributed locally. * You've to be sure, to not create mail loops, that all recipients domains are locally handled in a way or another (see section POP3LINKS.TAB). * Added the random order option to SMTPFWD.TAB gateways to randomly select the order of the try list (see section SMTPFWD.TAB). * Added the random order option to 'smtprelay' custom domain processing (see section 'Custom domain mail processing'). * The use of realloc() function has been removed to make place for free()/malloc() due a glibc bug with such function. [top] September 12, 2000 v 0.61 * Added a new CTRL command 'userauth' that helps to check users authentication. * This command can be used by external modules that need to check XMail username/password authentication (ex: external IMAP auth modules). * A new file SMTPFWD.TAB has been introduced to supply customizable mail exchangers for external domains (see section SMTPFWD.TAB). * Not local POP3 sync has been introduced to make it possible to download external POP3 accounts without having to setup local accounts (see section POP3LINKS.TAB). * This feature can be used, for example, to catch mails from a set of remote accounts and redirect these to another SMTP server. * Now it's possible to set per IP server port in command line params by specifying bindip[:port] PSYNC flags -Qx has been removed due the new queue system. * A new global command line parameter -Mx has been introduced to setup the queue split level even if my suggestion is to leave the default value (23 , that means that the queue is splitted in 23 * 23 = 529 subdirectories). * ******************************************************************** * A new spool format has been coded to enable XMail to handle very * large sending queues. * See section 'XMail spool design' for a description of how the spool * works. * Due to the new spool format the following directories can be * removed: * * custdomains/spool * spool/tmp * spool/errors * spool/logs * spool/locks * * You've to leave XMail flush its queue (spool) before upgrading * to this version. * A more complex solution, if You've a lot of file pending into the * spool, is : * * 1) Stop XMail * 2) Upgrade to 0.61 * 3) Start XMail and wait it has created all the queue tree structure * 4) Stop XMail * 5) Move all old spool/ files into 0/0/mess * 6) Rename all spool/logs/ files removing the .log extension * 7) Move all spool/logs/ file into 0/0/slog * 8) Now You can remove the above directories and restart XMail ******************************************************************** * ORBS relays checking has been added and is activated by the new SERVER.TAB option 'ORBS-MAPSCheck'. * A new SERVER.TAB variable 'AllowNullSender' (default true) has been introduced to change the XMail default behaviour that reject null sender messages. Now if You want null sender messages to be rejected You've to set this variable to zero. * Fixed a bug in Linux XMail debug startup. * Now SMTP authentication does a previous lookup in mailusers.tab using the complete email address as username (@ or : as separators). * Authenticated users will get the permission stored in the new 'DefaultSmtpPerms' SERVER.TAB variable. [top] August 31, 2000 v 0.60 * The XMail executable filename has been modified to XMail. * A better (even if not perfect) Linux SysV startup script (xmail) has been coded. * Fixed a bug in locking procedures (.lock file oriented) and introduced a correct SIGPIPE handling. * Improved I/O performance due to a new way of sending files through TCP/IP connections, to a more efficent way to copy message files and to a reduced number of temporary files that are created by XMail. [top] July 30, 2000 v 0.59 * DNS MX queries caching has been added to lower DNS network traffic and to speed up message delivery. * A new directory dnscache must be added to MAIL_ROOT as long as the two subdirectories dnscache/mx and dnscache/ns . * A possible buffer overflow error has been fixed. * Some code rewrites. [top] July 22, 2000 v 0.58 * Maildir mailbox format has been introduced as an optional mail storage other than the proprietary mailbox structure (You need to change CFLAGS definition in Makefile.lnx to build the Maildir version of XMail or edit SvrConfig.h defining CONFIG_MAILDIR for both Linux and NT version). * If You want to switch to the new Maildir version You MUST convert Your accounts and You MUST create a tmp directory inside $MAIL_ROOT/spool. * The maximum number of recipients for a single SMTP message has been made tunable by a new command line parameter (-Sr ... , default 100). * Fixed a small memory leak in SMTP server in case of multiple recipients. * New POP3 username/domain separator (:) has been introduced other than (@) that is not a valid char for Netscape mail system. * A buffer overflow bug has been corrected (the bug outcrop when a line is longer than the supplied buffer and a newline char is exactly placed at the buffer[sizeof(buffer)-1]). * Mail loop check has been introduced. * Fixed a bug that makes XMail unable to correctly handle SMTP lines terminated by . * SMTP server 'Received:' tag has been changed to suite 'MAIL FROM:<>' and 'RCPT TO:<>' addresses. [top] July 13, 2000 v 0.57 * Fixed a SERIOUS bug introduced with the new indexing features of XMail that makes names case sensitive. You must also empty the tabindex directory to enable XMail to rebuild indexes in a case insensitive way. Update SOON to this version. * The maximum number of accounts has been removed due the new locking method. * Now the -Ma ... parameter give XMail a way to allocate locking resources, but it's not as strict as it was with previous versions. * New CTRL commands has been added (cfgfileget, cfgfileset). * A new command line utility to create user accounts based on a formatted text file has been added (watch at MkUsers section). [top] July 07, 2000 v 0.56 * ******************************************************************** * WARNING * The MAIL_ROOT directory organization has been changed ! * A new directory domains MUST be created inside MAIL_ROOT to get * a cleaner configuration for XMail installations that handle * several domains. * In order to use this new version You MUST move Your domains * directories inside the new domains directory ******************************************************************** * SMAIL scheduling times in sending messages has been changed (see -Qi command line option). * The file domains.tab has been put under index. * Completely rewrited lock procedures. * New CTRL commands has been added (usergetmproc, usersetmproc, custdomget, custdomset, custdomlist). [top] July 04, 2000 v 0.55 * A syntax bug has been corrected, 'SMTP-RARPCheck' leave place to the correct 'SMTP-RDNSCheck'. * Now the files mailusers.tab , aliases.tab and extaliases.tab are indexed for a faster lookup in case of having several thousands of users and / or aliases. For this need a new directory named tabindex __MUST__ be added to MAIL_ROOT path. * As a consequence of this new feature You __CANNOT__ edit files under index while XMail is running. * POP3 mailbox locking method is changed to speedup startup time in case of thousand of users. * Remember to __ADD__ the directory pop3locks inside MAIL_ROOT path. [top] June 29, 2000 v 0.54 * A user level grained control over incoming POP3 connections based on peer IP has been added (see at the section dedicated to POP3.IPMAP.TAB). * A new XMail command line parameter has been added to increase the maximum number of accounts that can be handled by the server (now defaults to 25000 while previous versions defaults to 7500). * Fixed a bug in XMail alias removal. * Some code rewrites. [top] June 21, 2000 v 0.53 * The ability to setup a spammer protection based on sender address has been added (see section dedicated to SPAM-ADDRESS.TAB). [top] June 18, 2000 v 0.52 * The ability to disable PSYNC server by setting sync timeout to zero (-Yi 0) has been added. * SMTP client authentication has been added (see SMTP Client Authentication section). * SMTP server authentication (PLAIN LOGIN CRAM-MD5) has been added (see SMTPAUTH.TAB description). * SMTP server custom authentication has been added (see SMTPEXTAUTH.TAB description). [top] June 12, 2000 v 0.51 * Added 'aliaslist' command to controller server. * Wildcard matching has been added in 'userlist' and 'aliaslist' controller server commands. * Fixed a SERIOUS bug in SysExec() on Linux port - upgrade asap Your version. [top] June 07, 2000 v 0.50 * MD5 authentication has been added to CTRL server to enforce server security (watch at XMail admin protocol section). * Users of CTRL protocol are ancouraged to use this new authentication mode. * POP3 TOP command has been implemented. [top] June 06, 2000 * Fixed a SERIOUS bug in custom (external) POP3 authentication procedures, it always give auth :(( APOP POP3 authentication has been added to POP3 server as long as to PSYNC server (POP3 client). * PSYNC server configuration file (POP3LINKS.TAB) IS CHANGED to enable APOP authentication (watch at POP3LINKS.TAB section). * The command 'poplnkadd' of CTRL server has been extended to another parameter that store authentication method to be used. [top] June 01, 2000 * Correct handling of mail routing through 'RCPT TO: <>' has been added (see Mail Routing Through Addresses section). * Added wildcard matching and complex mail routing in SMTPGW.TAB. * Fixed a bug in PSYNC server that makes XMail to test for '+OK ' response instead that for '+OK' (and '-ERR ' for '-ERR'). * Added configuration steps in Part 7 of this doc. * The ability to handle custom (external) POP3 authentication procedures has been added (see section External Authentication). [top] May 29, 2000 * Bug fixes in controller server and in PSYNC server. * Added --install-auto to install XMail as an autostart service (NT). * Better reliability in custom domain processing has been coded (REMEMBER to add the spool directory inside custdomains ). * Improved delivery error logs for a better problem understanding and fix. * Some code rewrites. [top] May 27, 2000 * CtrlClnt improved in error control and bug fixes. * Changes in controller protocol for commands that has output. * The command 'userpasswd' has been added in controller server to allow user password changes. * Bug fixes in controller server. * Added wildchar (* ?) compare in aliases that allow to give a default processing to group of users (ie users that does not have an account). * XMail init.d startup script has been added (xmail). [top] May 26, 2000 * Added CtrlClnt to give a access to remote administration of XMail (see CtrlClnt section). * This permit You to add, delete, list users as long as many other administration procedures (see XMail controller protocol). [top] May 24, 2000 * Closed mailing lists has been added ('ClosedML' variable in USER.TAB). * The concept of filtering as message content testing has been extended to a message processing (address rewriting, attachment purging, etc ...). * Now message filtering can have a 'per user' processing to give a more fine grained control. [top] May 21, 2000 * Added the way to specify a default domain filter with the presence of the file defaultfilter.tab into the filters subdirectory. * Improved PSYNC error handling. * Improved shutdown condition sensing (read Server Shutdown section). [top] May 08, 2000 * Fixed a bug in SysDepLinux.cpp in function SysMakeDir() - permission mask changed to 0700. * Improved external programs execution behaviour under NT (no console is displayed). * Added the option to setup domain message filters with external programs exection (remember to add the filters subdirectory if You're upgrading an existing XMail). * This can help to filter messages based on its content to avoid mail worms and viruses that travel in attachments with given dangerous extensions. [top] April 26, 2000 * ******************************************************************** * WARNING * The spool file format is changed ! * In order to use this new version You MUST flush the spool before * starting the new version of XMail. ******************************************************************** * Modified SysRename() to MscMoveFile() to avoid errors in all cases where files are positioned on differents mount points (Unixes versions). * Added log files rotate function as long as a new command line parameter (-Mr ndays) to specify the rotate delay. * Added message-id to SMAIL and SMTP log file. * Added @@MSGID macro in custom mail processing (external commands). * Added @@MSGREF macro in custom mail processing (external commands). * Now messages coming from external POP3 links are pushed into the spool and not directly into the target user mailbox - this enable custom user mail processing also on this kind of messages. * Added 'lredirect' command to MAILPROC.TAB that makes XMail to impersonate the local domain when redirect messages. * Added 'lredirect' command to custom domain mail processing that makes XMail to impersonate the local domain when redirect messages. [top] April 04, 2000 * A @@TMPFILE macro has been added to MAILPROC.TAB syntax as long as to custom domain processing syntax. It will create a temporary file which hold the copy of the message. * It's external program resposibility to delete such file when it has finished its processing. * Messages generated as response to a delivery failure has target address remapped with the meanings of the file EXTALIASES.TAB. * Fixed a bug that makes XMail write a bad 'Received: ...' message tag. * This error cause mail readers to display bad message's datetimes. * Added 'uservars' command to the controller protocol to list user defined variables. * Added 'uservarsset' command to the controller protocol to set user defined variables. [top] March 21, 2000 * IP access control has been added to POP3, SMTP and CTRL servers (pop3.ipmap.tab , smtp.ipmap.tab , ctrl.ipmap.tab). I suggest You to setup at least ctrl.ipmap.tab. * Permanent SMTP error detect has been added to avoid to send N times a message that will be always rejected. * Some code rewrite. [top] March 18, 2000 * Linux daemon startup code has been added. * Modified the means of 'smtprelay.tab' and 'spammers.tab' with the introduction of a netmask (MODIFY YOUR FILES EVEN IF FOR NOW THE OLD VERSION IS STILL SUPPORTED !). * Service threads limit has been added to POP3 and SMTP servers. [top] March 16, 2000 * Fixed a bug in new Linux semaphore code. [top] March 13, 2000 * Added 'POP3Domain' configuration variable that gives the possibility to set the default (primary) POP3 domain. * Users of such domain can log to the server using only the name part of their email address. * Enached daemon (or service) mode with no messages printed onto console. * A -Md flag has been added to activate the debug mode that will restore verbose behaviour. * Error messages, in daemon mode, will be now printed to syslog() (Linux) or to EventViewer (NT). * Improved semaphore handling in Linux that prevent from allocation a great number of semaphores. SysV semaphore array capability of Linux is used to reduce the number of allocated semaphores. * Code rewrite. [top] March 10, 2000 * Fixed other possible points of buffer overflow attacks. * My Co. XMail server has reached 100000 messages exchanged without a single crash ! Custom domain mail processing has been added. * MAIL_CMD_LINE environment (or registry) has been added to give XMail a way to get a command line even when it's started as service. * Command line option -?I xxx.yyy.zzz.www has been added to bind to specified server interfaces. [top] March 08, 2000 * Added UIDL POP3 server command to make XMail work with clients that needs that feature. * Fixed a bug that prevent to send mail introduced with the previous version. [top] March 06, 2000 * Fixed a bug that can cause XMail to fall in a long CPU eating loop. * Added a delay to bad POP3 logins to prevent POP3 mailboxes attacks. * Added the option to shutdown the connection in a bad POP3 login case. * Fixed a bug that makes XMail (as NT service) shutdown at user logoff. * Fixed a bug that makes XMail unable to work with machine that are unable to RDNS its own socket addresses. * Fixed some possible points of buffer overflow attacks. [top] March 03, 2000 * Added 'poplnkenable' controller command. * Added RSS maps check option (relays.mail-abuse.org). [top] March 01, 2000 * Added VRFY SMTP command. * Coded a better Service exit under Windows NT. * Added MAILPROC.TAB that enable custom processing of user messages. [top] February 29, 2000 * Fixed a compilation bug under certain distributions of Linux. * The ability to make a dynamic DNS registration has been added with the 'DynDnsSetup' configuration option in SERVER.TAB. [top] February 28, 2000 * 'SmartDNSHost' option added to redirect all DNS queries to a list of DNS hosts. This option can be used to avoid MSProxyServer-WS2_32.DLL bug that not allow to send UDP packets out of the local net. * User mailbox size check has been added. [top] February 27, 2000 * Added UDP DNS query support when searching MX records. * This fixes a bug that makes XMail unable to send its mails if it deals with name servers that works only in UDP. [top] February 25, 2000 * Fixed a bug that prevent XMail POP3 server to handle multiple domains if there are more nic-names over a single IP address. * Improved controller protocol. * Added RBL maps check option (rbl.maps.vix.com). * Added 'spammers.tab' file that control SMTP client connections. [top] February 24, 2000 * Added controller login check. [top] February 23, 2000 * Fixed a bug caused by a case sensitive compare in domain and users names. * Improved controller protocol for remote admin. [top] February 22, 2000 * Fixed a Linux compilation bug and implemented controller protocol for remote admin. [top] February 18, 2000 * Log locking and some code rewrite. [top] February 16, 2000 * Added DNSROOTS file to avoid to repeat queries for roots domains. * Fixed a bug that can lead to a infinite loop under DNS queries. [top] February 15, 2000 * Some code rewrite. * Improved DNS search for MX records (bug fix). [top] February 07, 2000 * Some code rewrite. * Now if there are no MX records for destination domain, it'll be tried an SMTP connection to that domain directly. [top] February 05, 2000 * Some code rewrite and SMTP RDNS check added. [top] January 31, 2000 * Bug Fixes, some code rewrite and added NT service startup. [top] January 26, 2000 * Bug Fixes. [top] January 18, 2000 * Bug Fixes. [top] January 13, 2000 * Bug Fixes. [top] October 11, 1999 * Initial Revision. [top] xmail-1.27/SysTypesLinux.h0000644000175000017500000000172711341640430015026 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SYSTYPESLINUX_H #define _SYSTYPESLINUX_H #include "SysTypesUnix.h" #endif xmail-1.27/BuffSock.cpp0000644000175000017500000002421711341640430014237 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "StrUtils.h" #include "BuffSock.h" #define BSOCK_EOF INT_MIN #define BSOCK_STD_BUFFER_SIZE 1024 #define BSOCK_NAME(p) (*(p)->IOops.pName)((p)->IOops.pPrivate) #define BSOCK_FREE(p) (*(p)->IOops.pFree)((p)->IOops.pPrivate) #define BSOCK_READ(p, d, n, t) (*(p)->IOops.pRead)((p)->IOops.pPrivate, d, n, t) #define BSOCK_WRITE(p, d, n, t) (*(p)->IOops.pWrite)((p)->IOops.pPrivate, d, n, t) #define BSOCK_SENDFILE(p, f, b, e, t) (*(p)->IOops.pSendFile)((p)->IOops.pPrivate, f, b, e, t) struct BuffSocketData { SYS_SOCKET SockFD; int iBufferSize; char *pszBuffer; int iBytesInBuffer; int iReadIndex; BufSockIOOps IOops; }; static int BSckReadLL(BuffSocketData *pBSD, void *pData, int iSize, int iTimeout) { int iCount = 0, iCRead; while (iCount < iSize) { iCRead = BSOCK_READ(pBSD, (char *) pData + iCount, iSize - iCount, iTimeout); if (iCRead <= 0) return iCount; iCount += iCRead; } return iCount; } static int BSckWriteLL(BuffSocketData *pBSD, void const *pData, int iSize, int iTimeout) { int iCount = 0, iCWrite; while (iCount < iSize) { iCWrite = BSOCK_WRITE(pBSD, (char const *) pData + iCount, iSize - iCount, iTimeout); if (iCWrite <= 0) return iCount; iCount += iCWrite; } return iCount; } static char const *BSckSock_Name(void *pPrivate) { return BSOCK_BIO_NAME; } static int BSckSock_Free(void *pPrivate) { return 0; } static int BSckSock_Read(void *pPrivate, void *pData, int iSize, int iTimeout) { return SysRecvData((SYS_SOCKET) (long) pPrivate, (char *) pData, iSize, iTimeout); } static int BSckSock_Write(void *pPrivate, void const *pData, int iSize, int iTimeout) { return SysSendData((SYS_SOCKET) (long) pPrivate, (char const *) pData, iSize, iTimeout); } static int BSckSock_SendFile(void *pPrivate, char const *pszFilePath, SYS_OFF_T llBaseOffset, SYS_OFF_T llEndOffset, int iTimeout) { return SysSendFile((SYS_SOCKET) (long) pPrivate, pszFilePath, llBaseOffset, llEndOffset, iTimeout); } BSOCK_HANDLE BSckAttach(SYS_SOCKET SockFD, int iBufferSize) { BuffSocketData *pBSD = (BuffSocketData *) SysAlloc(sizeof(BuffSocketData)); if (pBSD == NULL) return INVALID_BSOCK_HANDLE; char *pszBuffer = (char *) SysAlloc(iBufferSize); if (pszBuffer == NULL) { SysFree(pBSD); return INVALID_BSOCK_HANDLE; } pBSD->SockFD = SockFD; pBSD->iBufferSize = iBufferSize; pBSD->pszBuffer = pszBuffer; pBSD->iBytesInBuffer = 0; pBSD->iReadIndex = 0; pBSD->IOops.pPrivate = (void *) (long) SockFD; pBSD->IOops.pName = BSckSock_Name; pBSD->IOops.pFree = BSckSock_Free; pBSD->IOops.pRead = BSckSock_Read; pBSD->IOops.pWrite = BSckSock_Write; pBSD->IOops.pSendFile = BSckSock_SendFile; return (BSOCK_HANDLE) pBSD; } SYS_SOCKET BSckDetach(BSOCK_HANDLE hBSock, int iCloseSocket) { BuffSocketData *pBSD = (BuffSocketData *) hBSock; SYS_SOCKET SockFD = SYS_INVALID_SOCKET; if (pBSD != NULL) { SockFD = pBSD->SockFD; BSOCK_FREE(pBSD); SysFree(pBSD->pszBuffer); SysFree(pBSD); if (iCloseSocket) { SysCloseSocket(SockFD); return SYS_INVALID_SOCKET; } } return SockFD; } static int BSckFetchData(BuffSocketData *pBSD, int iTimeout) { int iRdBytes; pBSD->iReadIndex = 0; if ((iRdBytes = BSOCK_READ(pBSD, pBSD->pszBuffer, pBSD->iBufferSize, iTimeout)) <= 0) { ErrSetErrorCode(ERR_SOCK_NOMORE_DATA); return iRdBytes; } pBSD->iBytesInBuffer = iRdBytes; return iRdBytes; } int BSckGetChar(BSOCK_HANDLE hBSock, int iTimeout) { BuffSocketData *pBSD = (BuffSocketData *) hBSock; if ((pBSD->iBytesInBuffer == 0) && (BSckFetchData(pBSD, iTimeout) <= 0)) return BSOCK_EOF; int iChar = (int) pBSD->pszBuffer[pBSD->iReadIndex]; pBSD->iReadIndex = INext(pBSD->iReadIndex, pBSD->iBufferSize); --pBSD->iBytesInBuffer; return iChar; } char *BSckChGetString(BSOCK_HANDLE hBSock, char *pszBuffer, int iMaxChars, int iTimeout, int *pLineLength, int *piGotNL) { int i, iChar; for (i = 0, iMaxChars--; i < iMaxChars; i++) { iChar = BSckGetChar(hBSock, iTimeout); if (iChar == BSOCK_EOF) return NULL; if (iChar == '\n') { for (; (i > 0) && (pszBuffer[i - 1] == '\r'); i--); pszBuffer[i] = '\0'; if (pLineLength != NULL) *pLineLength = i; if (piGotNL != NULL) *piGotNL = 1; return pszBuffer; } else pszBuffer[i] = (char) iChar; } pszBuffer[i] = '\0'; if (pLineLength != NULL) *pLineLength = i; if (piGotNL != NULL) { *piGotNL = 0; return pszBuffer; } ErrSetErrorCode(ERR_LINE_TOO_LONG); return NULL; } char *BSckGetString(BSOCK_HANDLE hBSock, char *pszBuffer, int iMaxChars, int iTimeout, int *pLineLength, int *piGotNL) { int i; BuffSocketData *pBSD = (BuffSocketData *) hBSock; for (i = 0, iMaxChars--; i < iMaxChars;) { /* Verify to have something to read */ if (pBSD->iBytesInBuffer == 0 && BSckFetchData(pBSD, iTimeout) <= 0) return NULL; int iBytesLookup = Min(pBSD->iBytesInBuffer, iMaxChars - i); if (iBytesLookup > 0) { char *pszNL = (char *) memchr(pBSD->pszBuffer + pBSD->iReadIndex, '\n', iBytesLookup); if (pszNL != NULL) { int iCopySize = (int) (pszNL - (pBSD->pszBuffer + pBSD->iReadIndex)); memcpy(pszBuffer + i, pBSD->pszBuffer + pBSD->iReadIndex, iCopySize); i += iCopySize; pBSD->iReadIndex += iCopySize + 1; pBSD->iBytesInBuffer -= iCopySize + 1; for (; i > 0 && pszBuffer[i - 1] == '\r'; i--); pszBuffer[i] = '\0'; if (pLineLength != NULL) *pLineLength = i; if (piGotNL != NULL) *piGotNL = 1; return pszBuffer; } else { memcpy(pszBuffer + i, pBSD->pszBuffer + pBSD->iReadIndex, iBytesLookup); i += iBytesLookup; pBSD->iReadIndex += iBytesLookup; pBSD->iBytesInBuffer -= iBytesLookup; } } } pszBuffer[i] = '\0'; if (pLineLength != NULL) *pLineLength = i; if (piGotNL != NULL) { *piGotNL = 0; return pszBuffer; } ErrSetErrorCode(ERR_LINE_TOO_LONG); return NULL; } int BSckSendString(BSOCK_HANDLE hBSock, char const *pszBuffer, int iTimeout) { BuffSocketData *pBSD = (BuffSocketData *) hBSock; char *pszSendBuffer = (char *) SysAlloc(strlen(pszBuffer) + 3); if (pszSendBuffer == NULL) return ErrGetErrorCode(); sprintf(pszSendBuffer, "%s\r\n", pszBuffer); int iSendLength = strlen(pszSendBuffer); if (BSckWriteLL(pBSD, pszSendBuffer, iSendLength, iTimeout) != iSendLength) { SysFree(pszSendBuffer); return ErrGetErrorCode(); } SysFree(pszSendBuffer); return iSendLength; } int BSckVSendString(BSOCK_HANDLE hBSock, int iTimeout, char const *pszFormat, ...) { char *pszBuffer = NULL; StrVSprint(pszBuffer, pszFormat, pszFormat); if (pszBuffer == NULL) return ErrGetErrorCode(); if (BSckSendString(hBSock, pszBuffer, iTimeout) < 0) { ErrorPush(); SysFree(pszBuffer); return ErrorPop(); } SysFree(pszBuffer); return 0; } int BSckSendData(BSOCK_HANDLE hBSock, char const *pszBuffer, int iSize, int iTimeout) { BuffSocketData *pBSD = (BuffSocketData *) hBSock; if (BSckWriteLL(pBSD, pszBuffer, iSize, iTimeout) != iSize) return ErrGetErrorCode(); return iSize; } int BSckReadData(BSOCK_HANDLE hBSock, char *pszBuffer, int iSize, int iTimeout, int iSizeFill) { BuffSocketData *pBSD = (BuffSocketData *) hBSock; int iRdBytes = 0, iBufRdBytes = Min(iSize, pBSD->iBytesInBuffer); if (iBufRdBytes > 0) { memcpy(pszBuffer, pBSD->pszBuffer + pBSD->iReadIndex, iBufRdBytes); pBSD->iReadIndex += iBufRdBytes; pBSD->iBytesInBuffer -= iBufRdBytes; iRdBytes = iBufRdBytes; } if (iRdBytes == 0 || (iSizeFill && iRdBytes < iSize)) { int iRdSize = BSckReadLL(pBSD, pszBuffer + iRdBytes, iSize - iRdBytes, iTimeout); if (iRdSize > 0) iRdBytes += iRdSize; } return iRdBytes; } int BSckSendFile(BSOCK_HANDLE hBSock, char const *pszFilePath, SYS_OFF_T llBaseOffset, SYS_OFF_T llEndOffset, int iTimeout) { BuffSocketData *pBSD = (BuffSocketData *) hBSock; return BSOCK_SENDFILE(pBSD, pszFilePath, llBaseOffset, llEndOffset, iTimeout); } SYS_SOCKET BSckGetAttachedSocket(BSOCK_HANDLE hBSock) { BuffSocketData *pBSD = (BuffSocketData *) hBSock; return pBSD->SockFD; } int BSckSetIOops(BSOCK_HANDLE hBSock, BufSockIOOps const *pIOops) { BuffSocketData *pBSD = (BuffSocketData *) hBSock; pBSD->IOops = *pIOops; return 0; } char const *BSckBioName(BSOCK_HANDLE hBSock) { BuffSocketData *pBSD = (BuffSocketData *) hBSock; return BSOCK_NAME(pBSD); } int BSckBufferInit(BSockLineBuffer *pBLB, int iSize) { if (iSize <= 0) iSize = BSOCK_STD_BUFFER_SIZE; if ((pBLB->pszBuffer = (char *) SysAlloc(iSize)) == NULL) return ErrGetErrorCode(); pBLB->iSize = iSize; return 0; } void BSckBufferFree(BSockLineBuffer *pBLB) { SysFree(pBLB->pszBuffer); } char *BSckBufferGet(BSOCK_HANDLE hBSock, BSockLineBuffer *pBLB, int iTimeout, int *piLnLength) { int iLnLength = 0, iCurrLength, iGotNL; do { if (BSckGetString(hBSock, pBLB->pszBuffer + iLnLength, pBLB->iSize - 1 - iLnLength, iTimeout, &iCurrLength, &iGotNL) == NULL) return NULL; if (!iGotNL) { int iNewSize = 2 * pBLB->iSize + 1; char *pszBuffer = (char *) SysRealloc(pBLB->pszBuffer, (unsigned int) iNewSize); if (pszBuffer == NULL) return NULL; pBLB->pszBuffer = pszBuffer; pBLB->iSize = iNewSize; } iLnLength += iCurrLength; } while (!iGotNL); if (piLnLength != NULL) *piLnLength = iLnLength; return pBLB->pszBuffer; } xmail-1.27/CTRLSvr.h0000644000175000017500000000263611341640430013442 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _CTRLSVR_H #define _CTRLSVR_H #define CTRL_SERVER_NAME "[" APP_NAME_VERSION_STR " CTRL Server]" #define STD_CTRL_PORT 6017 #define CTRLS_SERVER_NAME "[" APP_NAME_VERSION_STR " CTRLS Server]" #define STD_CTRLS_PORT 6018 #define CTRL_LISTEN_SIZE 8 #define CTRLF_LOG_ENABLED (1 << 0) struct CTRLConfig { unsigned long ulFlags; long lThreadCount; long lMaxThreads; int iSessionTimeout; int iTimeout; }; unsigned int CTRLClientThread(void *pThreadData); #endif xmail-1.27/MainLinux.cpp0000644000175000017500000001170211341640430014434 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "SList.h" #include "ShBlocks.h" #include "UsrUtils.h" #include "SvrUtils.h" #include "MessQueue.h" #include "SMAILUtils.h" #include "QueueUtils.h" #include "AppDefines.h" #include "MailSvr.h" #define RUNNING_PIDS_DIR "/var/run" #define DEVNULL "/dev/null" #define NOFILE 64 #define XMAIL_DEBUG_OPTION "-Md" #define XMAIL_PIDDIR_ENV "XMAIL_PID_DIR" static int MnEventLog(char const *pszFormat, ...) { va_list Args; char szBuffer[2048]; va_start(Args, pszFormat); openlog(APP_NAME_STR, LOG_PID, LOG_DAEMON); vsnprintf(szBuffer, sizeof(szBuffer) - 1, pszFormat, Args); syslog(LOG_ERR, "%s", szBuffer); va_end(Args); closelog(); return 0; } static char const *MnGetPIDDir(void) { char const *pszPIDDir = getenv(XMAIL_PIDDIR_ENV); return pszPIDDir != NULL ? pszPIDDir: RUNNING_PIDS_DIR; } static int MnSavePID(char const *pszPidFile) { char szPidFile[SYS_MAX_PATH]; snprintf(szPidFile, sizeof(szPidFile) - 1, "%s/%s.pid", MnGetPIDDir(), pszPidFile); FILE *pFile = fopen(szPidFile, "w"); if (pFile == NULL) { perror(szPidFile); return -errno; } fprintf(pFile, "%u", (unsigned int) getpid()); fclose(pFile); return 0; } static int MnRemovePID(char const *pszPidFile) { char szPidFile[SYS_MAX_PATH]; snprintf(szPidFile, sizeof(szPidFile) - 1, "%s/%s.pid", MnGetPIDDir(), pszPidFile); if (unlink(szPidFile) != 0) { perror(szPidFile); return -errno; } return 0; } static void MnSetupStdHandles(void) { int iFD = open(DEVNULL, O_RDWR, 0); if (iFD == -1) { MnEventLog("Cannot open file %s : %s", DEVNULL, strerror(errno)); exit(errno); } if (dup2(iFD, 0) == -1 || dup2(iFD, 1) == -1 || dup2(iFD, 2) == -1) { MnEventLog("File descriptor duplication error : %s", strerror(errno)); exit(errno); } if (iFD > 2) close(iFD); } static int MnDaemonBootStrap(void) { /* * This code is inspired from the code of the great Richard Stevens books. * May You RIP in programmers paradise great Richard. * I suggest You to buy all his collection, soon! */ /* For BSD */ #ifdef SIGTTOU signal(SIGTTOU, SIG_IGN); #endif #ifdef SIGTTIN signal(SIGTTIN, SIG_IGN); #endif #ifdef SIGTSTP signal(SIGTSTP, SIG_IGN); #endif /* 1st fork */ int iChildPID = fork(); if (iChildPID < 0) { MnEventLog("Cannot fork : %s", strerror(errno)); exit(errno); } else if (iChildPID > 0) exit(0); /* Disassociate from controlling terminal and process group. Ensure the process */ /* can't reacquire a new controlling terminal. */ if (setpgrp() == -1) { MnEventLog("Can't change process group : %s", strerror(errno)); exit(errno); } signal(SIGHUP, SIG_IGN); /* 2nd fork */ iChildPID = fork(); if (iChildPID < 0) { MnEventLog("Cannot fork : %s", strerror(errno)); exit(errno); } else if (iChildPID > 0) exit(0); /* Close open file descriptors */ for (int fd = 0; fd < NOFILE; fd++) close(fd); /* Set std handles */ MnSetupStdHandles(); /* Probably got set to EBADF from a close */ errno = 0; /* Move the current directory to root, to make sure we aren't on a mounted */ /* filesystem. */ chdir("/"); /* Clear any inherited file mode creation mask. */ umask(0); /* Ignore childs dead. */ /* System V */ signal(SIGCLD, SIG_IGN); return 0; } static int MnIsDebugStartup(int iArgCount, char *pszArgs[]) { for (int i = 0; i < iArgCount; i++) if (strcmp(pszArgs[i], XMAIL_DEBUG_OPTION) == 0) return 1; return 0; } static int MnDaemonStartup(int iArgCount, char *pszArgs[]) { /* Daemon bootstrap code if We're not in debug mode */ if (!MnIsDebugStartup(iArgCount, pszArgs)) MnDaemonBootStrap(); /* Extract PID file name */ char const *pszPidFile = strrchr(pszArgs[0], '/'); pszPidFile = (pszPidFile != NULL) ? (pszPidFile + 1): pszArgs[0]; /* Create PID file */ MnSavePID(pszPidFile); int iServerResult = SvrMain(iArgCount, pszArgs); /* Remove PID file */ MnRemovePID(pszPidFile); return iServerResult; } int main(int iArgCount, char *pszArgs[]) { return MnDaemonStartup(iArgCount, pszArgs); } xmail-1.27/SysIncludeSolaris.h0000644000175000017500000000337611341640430015624 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SYSINCLUDESOLARIS_H #define _SYSINCLUDESOLARIS_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif xmail-1.27/xmail.spec0000644000175000017500000006552011341640430014021 0ustar davidedavideSummary: Advanced, fast and reliable ESMTP/POP3 mail server Name: xmail Version: 1.23 Release: 1 Copyright: GPL Group: System Environment/Daemons Source: http://www.xmailserver.org/xmail-%{PACKAGE_VERSION}.tar.gz URL: http://www.xmailserver.org Packager: Davide Libenzi BuildRoot: /var/tmp/xmail-%{PACKAGE_VERSION} Requires: glibc %description XMail is an Internet and intranet mail server featuring an SMTP server, POP3 server, finger server, multiple domains, no need for users to have a real system account, SMTP relay checking, RBL/RSS/ORBS/DUL and custom ( IP and address based ) spam protection, SMTP authentication ( PLAIN LOGIN CRAM-MD5 POP3-before-SMTP and custom ), POP3 mail fecthing of external POP3 accounts, account aliases, domain aliases, custom mail processing, direct mail files delivery, custom mail filters, mailing lists, remote administration, custom mail exchangers, logging, and multi-platform code. XMail sources compile under GNU/Linux, FreeBSD, Solaris and NT/2000/XP. %prep %setup make -f Makefile.lnx clean %build make -f Makefile.lnx %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT/var/MailRoot/bin mkdir -p $RPM_BUILD_ROOT/var/MailRoot/docs mkdir -p $RPM_BUILD_ROOT/usr/sbin cp -R MailRoot $RPM_BUILD_ROOT/var/MailRoot.sample install -m 755 bin/XMail $RPM_BUILD_ROOT/var/MailRoot/bin/XMail install -m 755 bin/XMCrypt $RPM_BUILD_ROOT/var/MailRoot/bin/XMCrypt install -m 755 bin/CtrlClnt $RPM_BUILD_ROOT/var/MailRoot/bin/CtrlClnt install -m 755 bin/MkUsers $RPM_BUILD_ROOT/var/MailRoot/bin/MkUsers install -m 4755 bin/sendmail $RPM_BUILD_ROOT/usr/sbin/sendmail.xmail install -m 755 sendmail.sh $RPM_BUILD_ROOT/usr/sbin/sendmail.xmail.sh install -m 644 docs/Readme.txt $RPM_BUILD_ROOT/var/MailRoot/docs/Readme.txt install -m 644 docs/Readme.html $RPM_BUILD_ROOT/var/MailRoot/docs/Readme.html install -m 644 docs/ChangeLog.txt $RPM_BUILD_ROOT/var/MailRoot/docs/ChangeLog.txt install -m 644 docs/ChangeLog.html $RPM_BUILD_ROOT/var/MailRoot/docs/ChangeLog.html mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d mkdir -p $RPM_BUILD_ROOT/etc/rc.d/rc0.d mkdir -p $RPM_BUILD_ROOT/etc/rc.d/rc1.d mkdir -p $RPM_BUILD_ROOT/etc/rc.d/rc2.d mkdir -p $RPM_BUILD_ROOT/etc/rc.d/rc3.d mkdir -p $RPM_BUILD_ROOT/etc/rc.d/rc4.d mkdir -p $RPM_BUILD_ROOT/etc/rc.d/rc5.d mkdir -p $RPM_BUILD_ROOT/etc/rc.d/rc6.d install -m 755 xmail $RPM_BUILD_ROOT/etc/rc.d/init.d/xmail ln -s ../init.d/xmail $RPM_BUILD_ROOT/etc/rc.d/rc0.d/K10xmail ln -s ../init.d/xmail $RPM_BUILD_ROOT/etc/rc.d/rc1.d/K10xmail ln -s ../init.d/xmail $RPM_BUILD_ROOT/etc/rc.d/rc2.d/K10xmail ln -s ../init.d/xmail $RPM_BUILD_ROOT/etc/rc.d/rc6.d/K10xmail ln -s ../init.d/xmail $RPM_BUILD_ROOT/etc/rc.d/rc3.d/S90xmail ln -s ../init.d/xmail $RPM_BUILD_ROOT/etc/rc.d/rc4.d/S90xmail ln -s ../init.d/xmail $RPM_BUILD_ROOT/etc/rc.d/rc5.d/S90xmail %clean rm -rf $RPM_BUILD_ROOT %pre if [ -f /etc/rc.d/init.d/xmail ] then /etc/rc.d/init.d/xmail stop fi %post if [ ! -f /var/MailRoot/server.tab ] then cp -R /var/MailRoot.sample/* /var/MailRoot fi if [ ! -f /usr/sbin/sendmail.orig ] then mv /usr/sbin/sendmail /usr/sbin/sendmail.orig ln -s /usr/sbin/sendmail.xmail.sh /usr/sbin/sendmail fi /etc/rc.d/init.d/xmail start %preun if [ -f /etc/rc.d/init.d/xmail ] then /etc/rc.d/init.d/xmail stop fi %postun if [ -f /usr/sbin/sendmail.orig ] then mv /usr/sbin/sendmail.orig /usr/sbin/sendmail fi %files /var/MailRoot/bin/XMail /var/MailRoot/bin/XMCrypt /var/MailRoot/bin/CtrlClnt /var/MailRoot/bin/MkUsers /usr/sbin/sendmail.xmail /usr/sbin/sendmail.xmail.sh /var/MailRoot/docs/Readme.txt /var/MailRoot/docs/Readme.html /var/MailRoot/docs/ChangeLog.txt /var/MailRoot/docs/ChangeLog.html /var/MailRoot.sample /etc/rc.d/init.d/xmail /etc/rc.d/rc0.d/K10xmail /etc/rc.d/rc1.d/K10xmail /etc/rc.d/rc2.d/K10xmail /etc/rc.d/rc6.d/K10xmail /etc/rc.d/rc3.d/S90xmail /etc/rc.d/rc4.d/S90xmail /etc/rc.d/rc5.d/S90xmail %changelog * Wed Oct 12 2005 Davide Libenzi The POP3 before SMTP authentication is now correctly interpreted as real SMTP authentication, by the mean of @@USERAUTH. ATTENTION: Fixed a possible cause of buffer overflow in the XMail's sendmail binary. Changed the DNS MX resolution to allow better handling of partially broken DNS servers configuations. * Sun Jan 9 2005 Davide Libenzi Added a fix for 64 bits porting compatibility. Added the ability to exclude filters from execution in case of authenticated user. By pre-pending the filter command token with a token containing "!aex", the filters won't be run if the user authenticated himself. Added @@USERAUTH macro even to standard in/out filters (before it was only defined for SMTP ones). Added a new "NoSenderBounce" variable inside the SERVER.TAB file, to enable XMail generated bounce messages to have the empty SMTP sender ('MAIL FROM:<>'). Added a new "SMTP-MaxErrors" variable inside the SERVER.TAB file to set the maximum errors allowed in a single SMTP session (default zero, unlimited). Added a "LastLoginTimeDate" variable to the "userstat" CTRL command. Added external aliases support in the CTRL protocol. The MESSAGE.ID file is now automatically created, if missing. Changed the logic used to treat domain and user MAILPROC.TAB files. Before, a user's MAILPROC.TAB was overriding the domain one, while now the rules are merged together, with domain's ones first, followed by user's ones. The maximum mailbox size of zero is now interpreted as unlimited. Fixed XMail's sendmail to detect non-RFC822 data and handle it correctly. The IP:PORT addresses emission in spool files (and Received: lines) has been changed to the form [IP]:PORT. Added filter logging, that is enabled with the new -Qg command line option. Fixed an error message in the SMTP server, that was triggered by the remote client not using the proper syntax for the "MAIL FROM:" and "RCPT TO:" commands. Fixed explicit routing through SMTPGW.TAB file. Fixed a possible problem with file locking that might be triggered from CTRL commands cfgfileget/cfgfileset. Added a check to avoid the CTRL server to give an error when a domain created with older versions of XMail does not have the domain directory inside cmdaliases. The SMTP server FQDN variable should be set to the value of "SmtpServerDomain", when this is used inside the SERVER.TAB file. * Sun May 30 2004 Davide Libenzi Fixed a possible memory leak and a possible source of crashes. * Sat May 29 2004 Davide Libenzi Implemented the "filter" command for custom mail processing (MAILPROC.TAB, cmdaliases and custom domains). If "RemoveSpoolErrors" is set inside the SERVER.TAB file, messages are never frozen. Before there was a special case (delivery failure and delivery notification failure) that could have lead to frozen messages. Made "aliasdomainadd" to check for the existence of the alias domain (and reject the command if existing). Introduced a new environment variable recognized by XMail (XMAIL_PID_DIR), to let the user to specify a custom PID file directory (this is for Unix ports only). Implemented ability to stop custom mail processing upon certain exit codes from external commands execution. The SPAMMERS.TAB check is now bypassable (see doc for details). ATTENTION: Changed the "aliasdomainlist" syntax and output format (see doc for details). Made (on Unix setups) the PID file name to be dependent on the daemon file name. Implemeted a domain-wise MAILPROC.TAB and extended its "redirect" and "lredirect" commands to support account specific (USER@DOMAIN) and domain targets (DOMAIN). Implemented SMTP filters to allow users to reject the SMTP session before and after the remote client data has been received. * Sat Mar 27 2004 Davide Libenzi Restructured the external program execution environment on Unix ports. Simplified, as a consequence of this, the system dependent portion of XMail (SysDep*). Fixed a bug in the address range parsing (x.y.w.z/s). Fixed the alias lookup to perform a better "best match" wildcard selection. Fixed a bug in the DNS resolved that made XMail to not correctly handle domain CNAMEs. * Sun Sep 14 2003 Davide Libenzi Added Bcc: removal from message headers in XMail's sendmail. Added PSYNC logging (-Yl). Added domain completion to XMail's sendmail when the specified sender address (-f or -F) does not contain one. The environment variable (or registry in Windows) DEFAULT_DOMAIN is looked up to try to complete the address. Fixed a bug in the return code of SysAccept() in all Unix versions. Fixed a bug that was triggered by external command and filter exiting soon. XMail was not able to correctly sync with the child process by losing it. This apply only to Unix versions of XMail. A notification message is now sent to the sender if the message is handled with "smtp" or "smtprelay" commands and a permanent error happen when sending to the remote SMTP server. * Tue Jul 08 2003 Davide Libenzi Added a new configuration file "smtp.ipprop.tab" to be able to specify peer IP based configuration option, like for example IP white listing against IP checks. ATTENTION: The filter return code has been changed and new return codes are expected to be returned by filters. Please che the documentation and update your filters before starting to use the new version. Added the ability to specify a custom error message for filters. Fixed a bug in the string quoting function that showed up when the string was empty (""). Changed the order used by XMail to check the mailer domain. Now MX check is performed first, then A record check. This caused a slow down for domains having MX records but not A records. Added two new Received: types to give the ability to hide client information if the SMTP client does authenticate with the server. Added the rejection map name inside the SMTP log file in case of SNDRIP=EIPMAP error. Modified XMail's sendmail to add the RFC822 Date: header if missing. XMail now uses the name of the executable ( without .exe ) to both register the service name and fetch registry variables. The POP3 server now picks up messages even from the Maildir's "cur" subdirectory. * Sat May 03 2003 Davide Libenzi Implemented a new filters feature that enable the user to stop the selected filters list processing upon receival of certain exit codes. Fixed the wrong log file name generation when the daylight time is active. Fixed a bug inside the DNS MX resolver. Fixed a bug ( Windows OS bug ) that made XMail unable to create domains starting with reserved device names ( COM#, LPT, PRN, CON, ... ). So, for example, a domain named "com4.domain.org" couldn't be created because of this naming conflict. Fixed a bug that made XMail to not apply filters for local mailing list. Fixed a bug that made XMail to crash under certain conditions. * Wed Apr 02 2003 Davide Libenzi Added a "Server:" field to the notification message. It'll report the remote SMTP server host name and IP that issued the error. It will not be present if the error does not originate from a remote SMTP server. Added a new command line parameter -MD to set the number of subdirectories allocated for the DNS cache files storage. Messages with non RFC822 conforming headers are now handled by the PSYNC code. ATTENTION: The filter architecture has been completely changed. To correctly update to this version you have to create two empty files "filters.in.tab" and "filters.out.tab" inside the $MAIL_ROOT directory. Please refer to the documentation for more information about the new filter architecture. If you are not currently using filters, the simple creation of the two files listed above will be sufficent. ATTENTION: The internal spool file format is changed with the new line added ( the 1st one ) that contain various message information. Filters that rely on the internal spool file format must be changed to match the new structure. Fixed a bug that made XMail to not correctly report zero sized files inside the mailbox. Added file size to CTRL's "filelist" command. Fixed a connect-error reporting bug on Windows platform. * Sat Jan 25 2003 Davide Libenzi Better check for user/domain names. Changed search pattern for filters. Now a domain name is scanned for all sub-domains. Fixed a boundary check inside the Base64 decoder. Added the client FQDN inside the SMTP log file in case the RDNS check is enabled. Added a new SERVER.TAB variable "SmtpMsgIPBanSpammers" to set the message that is sent to the SMTP client when the client IP is listed inside the file SPAMMER.TAB. Added a new SERVER.TAB variable "SmtpMsgIPBanMaps" to set the message that is sent to the SMTP client when the client IP is listed inside one of the "CustMapsList". Added a new SERVER.TAB variable "SmtpMsgIPBanSpamAddress" to set the message that is sent to the SMTP client when the client IP is listed inside the file SPAM-ADDRESS.TAB. Fixed a bug inside the custom account handling that made XMail to pass the old password instead of the new one. Added OpenBSD support. * Sat Nov 9 2002 Davide Libenzi Added a new command line parameter -QT to enable a configurable timeout for filter commands. Fixed a bug that made XMail to ignore cmdalias accounts when a wildcard alias was matching the account itself. Added the 'smtprelay' command to the MAILPROC.TAB processing. Removed the 'wait' command from all custom processing. Added a new macro @@RRCPT to filters commands to extract the real local recipient. Changed the way the EXTALIASES.TAB mapping modify the return path. It now change the "Reply-To:" instead of the "From:" to avoid problems with signature verification software. Implemented logging on SMTP transactions rejected because of mapped IP or failing RDNS check. Added a new SERVER.TAB variable "SmtpServerDomain" to force the SMTP domain used by XMail in its banner string ( for CRAM-MD5 ESMTP authentication ). Improved DNS resolution for not existing domains. * Sat Jul 27 2002 Davide Libenzi Added a variable "CustomSMTPMessage" inside the server's configuration file SERVER.TAB to enable the postmaster to set a custom message that will be appended to the standard XMail error response. Added log entries in case of relay lists mapped IPs. Fixed a build error on FreeBSD. Added a new SERVER.TAB variable "DisableEmitAuthUser" to block the emission the the header "X-Auth-User:" for authenticated user. Added a new USER.TAB variable "DisableEmitAuthUser" to block the emission the the header "X-Auth-User:" for authenticated users ( this variable overrides the SERVER.TAB one ). Added command line driven mailbox delivery mode ( -MM = Maildir , -Mm = mailbox ). Added sysv_inst.sh shell script to help creating SysV boot scripts for XMail. * Sat Jun 15 2002 Davide Libenzi Fixed a bug in HOSTNAME:PORT handing code inside the PSYNC server. Fixed a bug introduced in 1.8 in the Windows version that made XMail to have bad behaviour when used with external programs. Fixed a bug that resulted in XMail generating frozen messages even if the SERVER.TAB variable was set to not create them. Fixed a bug that made it possible to send a "MAIL FROM:<@localdomain:remoteaddress>" and to have the message relayed if the IP of the current machine was inside the smtprelay.tab of the machine handling the MX of @localdomain. Implemented internal mail loop checking ( internal redirects ). Added a new MLUSERS.TAB permissions flags 'A', that is similar to 'W' by instead of checking the "MAIL FROM:<...>" address check the SMTP authentication address ( this will prevent malicious users to forge the address to gain write permissions on the list ). * Sun May 19 2002 Davide Libenzi Changed XMail's behaviour upon receival on long ( RFC compared ) data lines on SMTP and POP3 fetch inbound doors. Before the operation was aborted while now data is accepted without truncation, that might make XMail to behave non conforming the RFC. Added @@RRCPT macro to the "external" MAILPROC.TAB command to emit the real recipient of the message ( @@RCPT could be an alias ). Added HOSTNAME:PORT capability to POP3LINKS.TAB entries. Added Linux/PowerPC port. Added "filelist" CTRL protocol command. Added SMTP HELP command. Changed bounce message format to add the last SMTP error and to make it works with Ecartis mail bounce processing. Changed the XMail's sendmail implementation to accept "-f FROM" and "-F FROM" non standard sendmail paramenter specification. Fixed a bug inside the PSYNC server code that made XMail to fail to resolve POP3 server addresses. Various code cleanups. * Mon Apr 01 2002 Davide Libenzi Fixed a bug inside the POP3 server that caused bad responses to UIDL and LIST commands in case of certain command patterns. Added support for HOSTNAME:PORT ( or IP:PORT ) for the DefaultSMTPGateways SERVER.TAB variable. Added domain aliases cleanup upon main domain removal. Added "MaxMessageSize" inside USER.TAB files to override the global ( SERVER.TAB ) one. * Sun Mar 03 2002 Davide Libenzi Added a new USER.TAB variable "UseReplyTo" ( default 1 ) to make it possible to disable the emission of the Reply-To: header for mailing lists. Fixed a bug that caused XMail to uncorrectly deliver POP3 fetched messages when used togheter with domain masquerading. Changed index file structure to use an hash table for faster lookups and index rebuilding. New files inside the tabindex directory now have the extension .hdx and old .idx files can be removed. Added X-Deliver-To: header to messages redirected with MAILPROC.TAB file. Added configurable Received: tag option in SERVER.TAB by using the variable "ReceivedHdrType". Added a configurable list of header tags to be used to extract addresses for POP3 fetched messages by using the SERVER.TAB variable "FetchHdrTags". History ( change log ) entries have been moved from the main documentation file and a new file ( ChangeLog.txt ) has been created to store change-log entries. Removed RBL-MAPSCheck ( currently blackholes.mail-abuse.org. ), RSS-MAPSCheck ( currently relays.mail-abuse.org. ) and DUL-MAPSCheck ( currently dialups.mail-abuse.org. ) specific variables and now everything must be handled with CustMapsList ( please look at the documentation ). Added NotifyMsgLinesExtra SERVER.TAB variable to specify the number of lines of the bounced message to include inside the notify reply ( default zero, that means only header ). The message log file is now listed inside the notification message sent to ErrorsAdmin ( or PostMaster ). Added NotifySendLogToSender SERVER.TAB variable to enable/disable the send of the message log file inside the notify message to the sender ( default is off ). Added TempErrorsAdmin SERVER.TAB variable to specify an account that will receive temporary delivery failures notifications ( default is empty ). Added a new SERVER.TAB variable NotifyTryPattern to specify at which delivery attempt failure the system has to send the notification message. Fixed a bug that caused alias domains to have higher priority lookup compared to standard domains. * Tue Feb 05 2002 Davide Libenzi Fixed a bug in wildcard aliases domain lookup. Fixed a bug in CTRL command "aliasdel" that failed to remove aliases with wildcard domains. Fixed a bug that caused XMail to timeout on very slow network connections. * Fri Jan 18 2002 Davide Libenzi Fixed a bug that made XMail to fail to parse custom maps lists in SERVER.TAB. Fixed a bug that prevented XMail to add wildcard-domain aliases. Added a filter feature to the CTRL commands "domainlist" and "aliasdomainlist". Added an extra message header field "X-AuthUser:" to log the username used by the account to send the message. Added Reply-To: RFC822 header for mailing lists sends. Fixed a Win32 subsystem API to let XMail to correctly handle network shared MAIL_ROOTs. * Wed Dec 19 2001 Davide Libenzi ORBS maps test removed due old ORBS dead, the SERVER.TAB variable "CustMapsList" can be used to setup new ORBS ( and other ) maps. Fixed a bug in XMail's sendmail that was introduced in version 1.2 and made it to incorrectly interpret command line parameters. Fixed a bug that made XMail to not correctly recognize user type characters when lowercase. Fixed a bug that caused XMail to not start is the MAIL_ROOT environment variable had a final slash on Windows. Added a new filter return code ( 97 ) to reject messages without notification and without frozen processing. Added two new command line options -MR and -MS to set the I/O socket buffers sizes in bytes ( do not use them if You don't know what You're doing ). Changed system library to have a better performace, expecially on the Windows platform. Users that are using XMail mainly inside their local LAN are strongly encouraged to switch to this version. Fixed a bug that enabled insertion of aliases that overlapped real accounts. * Mon Nov 12 2001 Davide Libenzi A problem with log file names generation has been fixed. Added a new CTRL command "userstat". Implemented Linux/SPARC port and relative makefile ( Makefile.slx ). Extended the XMail version of sendmail to support a filename as input ( both XMail format that raw email format ) and to accept a filename as recipient list. Added a new kind of aliases named "cmdaliases" that implements a sort of custom domains commands on a per-user basis ( look at the CmdAliases section ). ************************************************************************************************ * You've to create the directory "cmdaliases" inside $MAIL_ROOT to have 1.2 working correctly ************************************************************************************************ Fixed a bug that had XMail to not check for the user variable SmtpPerms with CRAM-MD5 authetication. Fixed a bug in the XMail's sendmail implementation that made it unable to detect the "." end of message condition. Fixed a bug in the XMail's sendmail implementation that made it to skip cascaded command line parameters ( -Ooet ). Implemented a new XMail's sendmail switch -i to relax the . ond of message indicator. * Tue Oct 10 2001 Davide Libenzi Fixed a bug in the XMail version of sendmail that made messages to be double sent. The macro @@TMPFILE has been removed from filters coz it's useless. The command line parameter -Lt NSEC has been added to set the sleep timeout of LMAIL threads. Added domain aliasing ( see ALIASDOMAIN.TAB section ). ************************************************************************************************ * You've to create the file ALIASDOMAIN.TAB inside $MAIL_ROOT ( even if empty ) ************************************************************************************************ Added CTRL commands "aliasdomainadd", "aliasdomaindel" and "aliasdomainlist" to handle domain aliases through the CTRL protocol. * Tue Sep 4 2001 Davide Libenzi Added wildcard matching in the domain part of ALIASES.TAB ( see ALIASES.TAB section ). Changed the PSYNC scheduling behaviour to allow sync interval equal to zero ( disabled ) and let the file .psync-trigger to schedule syncs. Solaris on Intel support added. A new filter return code ( 98 ) has been added to give the ability to reject message without notify the sender. It's finally time, after about 70 releases, to go 1.0 !! * Mon Jul 2 2001 Davide Libenzi A stack shifting call method has been implemented to make virtually impossible for attackers to guess the stack frame pointer. With this new feature, even if buffer overflows are present, the worst thing that could happen is a server crash and not the attacker that execute root code on the server machine. Implemented the SIZE ESMTP extension and introduced a new SERVER.TAB variable "MaxMessageSize" that set the maximum message size that the server will accept ( in Kb ). If this variable is not set or if it's zero, any message will be accepted. A new SMTP authentication permission ( 'Z' ) has been added to allow authenticated users to bypass the check. The SMTP sender now check for the remote support of the SIZE ESMTP extension. A new SERVER.TAB variable has been added "CustMapsList" to enable the user to enter custom maps checking ( look at the section "SERVER.TAB variables" ). Fixed a bug in "frozdel" CTRL command. * Sun Jun 10 2001 Davide Libenzi * Fri Jun 8 2001 Davide Libenzi Fixed a possible buffer overflow bug inside the DNS resolver. * Tue May 29 2001 Davide Libenzi Fixed build errors in MkUsers.cpp and SendMail.cpp ( FreeBSD version ). Added the ability to specify a list of matching domains when using PSYNC with masquerading domains ( see POP3LINKS.TAB section ). The auxiliary program sendmail now read the MAIL_ROOT environment from registry ( Win32 version ) and if it fails it reads from the environment. Fixed a bug that made XMail to crash if the first line of ALIASES.TAB was empty. RPM packaging added. Added a new feature to the custom domain commands "redirect" and "lredirect" that will accept email addresses as redirection target. Fixed a bug in MkUsers. Added system resource checking before accepting SMTP connections (see "SmtpMinDiskSpace" and "SmtpMinVirtMemSpace" SERVER.TAB variables ). Added system resource checking before accepting POP3 connections ( see "Pop3MinVirtMemSpace" SERVER.TAB variable ). A new command line param -t has been implemented in sendmail. A new USER.TAB variable "SmtpPerms" has been added to enable account based SMTP permissions. If "SmtpPerms" is not found the SERVER.TAB variable "DefaultSmtpPerms" is checked. A new USER.TAB variable "ReceiveEnable" has been added to enable/disable the account from receiving emails. A new USER.TAB variable "PopEnable" has been added to enable/disable the account from fetching emails. xmail-1.27/Makefile.sso0000644000175000017500000000303711341640430014271 0ustar davidedavide# # XMail by Davide Libenzi ( Intranet and Internet mail server ) # Copyright (C) 1999,..,2004 Davide Libenzi # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Davide Libenzi # SYSTYPE = solaris CC = g++ LD = g++ STRIP = touch ifneq ("$(WITH_SSL_INCLUDE)", "") CFLAGS := $(CFLAGS) -I$(WITH_SSL_INCLUDE) endif ifneq ("$(WITH_SSL_LIB)", "") LDFLAGS := $(LDFLAGS) -L$(WITH_SSL_LIB) endif ifeq ("$(SSLLIBS)", "") SSLLIBS = -lssl -lcrypto endif MAINSRC = MainSolaris.cpp SYSSRCS = SysDepSolaris.cpp SysDepUnix.cpp SysOsEventfd_pipe.cpp CFLAGS := $(CFLAGS) -I. -D__UNIX__ -D__SOLARIS__ -D_THREAD_SAFE=1 -D_REENTRANT=1 -DHAS_SYSMACHINE \ -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -D_POSIX_PTHREAD_SEMANTICS # LDFLAGS := $(LDFLAGS) $(SSLLIBS) -ldl -lsocket -lpthread -lrt LDFLAGS := $(LDFLAGS) $(SSLLIBS) -ldl -lsocket -lnsl -lpthread -lrt include Makefile.common xmail-1.27/ExtAliases.cpp0000644000175000017500000003465411341640430014605 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "ResLocks.h" #include "StrUtils.h" #include "SList.h" #include "BuffSock.h" #include "MailConfig.h" #include "MessQueue.h" #include "MailSvr.h" #include "MiscUtils.h" #include "SvrUtils.h" #include "UsrUtils.h" #include "TabIndex.h" #include "ExtAliases.h" #define SVR_EXT_ALIAS_FILE "extaliases.tab" #define ALIAS_TABLE_LINE_MAX 1024 enum ExtAliasFields { ealRmtDomain = 0, ealRmtName, ealDomain, ealName, ealMax }; struct ExAlDBScanData { char szTmpDBFile[SYS_MAX_PATH]; FILE *pDBFile; }; static int iIdxExAlias_RmtDomain_RmtName[] = { ealRmtDomain, ealRmtName, INDEX_SEQUENCE_TERMINATOR }; static char *ExAlGetTableFilePath(char *pszLnkFilePath, int iMaxPath) { CfgGetRootPath(pszLnkFilePath, iMaxPath); StrNCat(pszLnkFilePath, SVR_EXT_ALIAS_FILE, iMaxPath); return pszLnkFilePath; } int ExAlCheckAliasIndexes(void) { char szAliasFilePath[SYS_MAX_PATH] = ""; ExAlGetTableFilePath(szAliasFilePath, sizeof(szAliasFilePath)); /* Align RmtDomain-RmtName index */ if (TbixCheckIndex(szAliasFilePath, iIdxExAlias_RmtDomain_RmtName, false) < 0) return ErrGetErrorCode(); return 0; } static int ExAlRebuildAliasIndexes(char const *pszAliasFilePath) { /* Rebuild RmtDomain-RmtName index */ if (TbixCreateIndex(pszAliasFilePath, iIdxExAlias_RmtDomain_RmtName, false) < 0) return ErrGetErrorCode(); return 0; } static ExtAlias *ExAlGetAliasFromStrings(char **ppszStrings) { int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount < ealMax) return NULL; ExtAlias *pExtAlias = (ExtAlias *) SysAlloc(sizeof(ExtAlias)); if (pExtAlias == NULL) return NULL; pExtAlias->pszRmtDomain = SysStrDup(ppszStrings[ealRmtDomain]); pExtAlias->pszRmtName = SysStrDup(ppszStrings[ealRmtName]); pExtAlias->pszDomain = SysStrDup(ppszStrings[ealDomain]); pExtAlias->pszName = SysStrDup(ppszStrings[ealName]); return pExtAlias; } ExtAlias *ExAlAllocAlias(void) { ExtAlias *pExtAlias = (ExtAlias *) SysAlloc(sizeof(ExtAlias)); if (pExtAlias == NULL) return NULL; pExtAlias->pszRmtDomain = NULL; pExtAlias->pszRmtName = NULL; pExtAlias->pszDomain = NULL; pExtAlias->pszName = NULL; return pExtAlias; } void ExAlFreeAlias(ExtAlias * pExtAlias) { SysFree(pExtAlias->pszDomain); SysFree(pExtAlias->pszName); SysFree(pExtAlias->pszRmtDomain); SysFree(pExtAlias->pszRmtName); SysFree(pExtAlias); } static int ExAlWriteAlias(FILE * pAliasFile, ExtAlias * pExtAlias) { /* Remote domain */ char *pszQuoted = StrQuote(pExtAlias->pszRmtDomain, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pAliasFile, "%s\t", pszQuoted); SysFree(pszQuoted); /* Remote user */ pszQuoted = StrQuote(pExtAlias->pszRmtName, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pAliasFile, "%s\t", pszQuoted); SysFree(pszQuoted); /* Domain */ pszQuoted = StrQuote(pExtAlias->pszDomain, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pAliasFile, "%s\t", pszQuoted); SysFree(pszQuoted); /* Local user */ pszQuoted = StrQuote(pExtAlias->pszName, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pAliasFile, "%s\n", pszQuoted); SysFree(pszQuoted); return 0; } int ExAlAddAlias(ExtAlias * pExtAlias) { char szAliasFilePath[SYS_MAX_PATH] = ""; ExAlGetTableFilePath(szAliasFilePath, sizeof(szAliasFilePath)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szAliasFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pAliasFile = fopen(szAliasFilePath, "r+t"); if (pAliasFile == NULL) { RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_EXTALIAS_FILE_NOT_FOUND); return ERR_EXTALIAS_FILE_NOT_FOUND; } char szAliasLine[ALIAS_TABLE_LINE_MAX] = ""; while (MscFGets(szAliasLine, sizeof(szAliasLine) - 1, pAliasFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szAliasLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= ealMax && stricmp(pExtAlias->pszRmtDomain, ppszStrings[ealRmtDomain]) == 0 && stricmp(pExtAlias->pszRmtName, ppszStrings[ealRmtName]) == 0) { StrFreeStrings(ppszStrings); fclose(pAliasFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_EXTALIAS_EXIST); return ERR_EXTALIAS_EXIST; } StrFreeStrings(ppszStrings); } fseek(pAliasFile, 0, SEEK_END); if (ExAlWriteAlias(pAliasFile, pExtAlias) < 0) { fclose(pAliasFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_WRITE_EXTALIAS_FILE); return ERR_WRITE_EXTALIAS_FILE; } fclose(pAliasFile); /* Rebuild indexes */ if (ExAlRebuildAliasIndexes(szAliasFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); return 0; } ExtAlias *ExAlGetAlias(char const *pszRmtDomain, char const *pszRmtName) { char szAliasFilePath[SYS_MAX_PATH] = ""; ExAlGetTableFilePath(szAliasFilePath, sizeof(szAliasFilePath)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szAliasFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return NULL; /* Lookup record using the specified index */ char **ppszTabTokens = TbixLookup(szAliasFilePath, iIdxExAlias_RmtDomain_RmtName, false, pszRmtDomain, pszRmtName, NULL); if (ppszTabTokens == NULL) { RLckUnlockSH(hResLock); ErrSetErrorCode(ERR_EXTALIAS_NOT_FOUND); return NULL; } ExtAlias *pExtAlias = ExAlGetAliasFromStrings(ppszTabTokens); StrFreeStrings(ppszTabTokens); RLckUnlockSH(hResLock); return pExtAlias; } int ExAlRemoveAlias(ExtAlias * pExtAlias) { char szAliasFilePath[SYS_MAX_PATH] = ""; char szTmpFile[SYS_MAX_PATH] = ""; ExAlGetTableFilePath(szAliasFilePath, sizeof(szAliasFilePath)); UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szAliasFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pAliasFile = fopen(szAliasFilePath, "rt"); if (pAliasFile == NULL) { RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_EXTALIAS_FILE_NOT_FOUND); return ERR_EXTALIAS_FILE_NOT_FOUND; } FILE *pTmpFile = fopen(szTmpFile, "wt"); if (pTmpFile == NULL) { fclose(pAliasFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } int iAliasFound = 0; char szAliasLine[ALIAS_TABLE_LINE_MAX] = ""; while (MscFGets(szAliasLine, sizeof(szAliasLine) - 1, pAliasFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szAliasLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= ealMax && stricmp(pExtAlias->pszRmtDomain, ppszStrings[ealRmtDomain]) == 0 && stricmp(pExtAlias->pszRmtName, ppszStrings[ealRmtName]) == 0) { ++iAliasFound; } else fprintf(pTmpFile, "%s\n", szAliasLine); StrFreeStrings(ppszStrings); } fclose(pAliasFile); fclose(pTmpFile); if (iAliasFound == 0) { SysRemove(szTmpFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_EXTALIAS_NOT_FOUND); return ERR_EXTALIAS_NOT_FOUND; } if (MscMoveFile(szTmpFile, szAliasFilePath) < 0) { RLckUnlockEX(hResLock); return ErrGetErrorCode(); } /* Rebuild indexes */ if (ExAlRebuildAliasIndexes(szAliasFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); return 0; } int ExAlRemoveUserAliases(const char *pszDomain, const char *pszName) { char szAliasFilePath[SYS_MAX_PATH] = ""; char szTmpFile[SYS_MAX_PATH] = ""; ExAlGetTableFilePath(szAliasFilePath, sizeof(szAliasFilePath)); UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szAliasFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) { ErrorPush(); CheckRemoveFile(szTmpFile); return ErrorPop(); } FILE *pAliasFile = fopen(szAliasFilePath, "rt"); if (pAliasFile == NULL) { RLckUnlockEX(hResLock); CheckRemoveFile(szTmpFile); ErrSetErrorCode(ERR_EXTALIAS_FILE_NOT_FOUND); return ERR_EXTALIAS_FILE_NOT_FOUND; } FILE *pTmpFile = fopen(szTmpFile, "wt"); if (pTmpFile == NULL) { fclose(pAliasFile); RLckUnlockEX(hResLock); CheckRemoveFile(szTmpFile); ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } int iAliasFound = 0; char szAliasLine[ALIAS_TABLE_LINE_MAX] = ""; while (MscFGets(szAliasLine, sizeof(szAliasLine) - 1, pAliasFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szAliasLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= ealMax && stricmp(pszDomain, ppszStrings[ealDomain]) == 0 && stricmp(pszName, ppszStrings[ealName]) == 0) { ++iAliasFound; } else fprintf(pTmpFile, "%s\n", szAliasLine); StrFreeStrings(ppszStrings); } fclose(pAliasFile); fclose(pTmpFile); if (iAliasFound == 0) { SysRemove(szTmpFile); RLckUnlockEX(hResLock); return 0; } if (MscMoveFile(szTmpFile, szAliasFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } /* Rebuild indexes */ if (ExAlRebuildAliasIndexes(szAliasFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); return 0; } int ExAlRemoveDomainAliases(const char *pszDomain) { char szAliasFilePath[SYS_MAX_PATH] = ""; char szTmpFile[SYS_MAX_PATH] = ""; ExAlGetTableFilePath(szAliasFilePath, sizeof(szAliasFilePath)); UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szAliasFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) { ErrorPush(); CheckRemoveFile(szTmpFile); return ErrorPop(); } FILE *pAliasFile = fopen(szAliasFilePath, "rt"); if (pAliasFile == NULL) { RLckUnlockEX(hResLock); CheckRemoveFile(szTmpFile); ErrSetErrorCode(ERR_EXTALIAS_FILE_NOT_FOUND); return ERR_EXTALIAS_FILE_NOT_FOUND; } FILE *pTmpFile = fopen(szTmpFile, "wt"); if (pTmpFile == NULL) { fclose(pAliasFile); RLckUnlockEX(hResLock); CheckRemoveFile(szTmpFile); ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } int iAliasFound = 0; char szAliasLine[ALIAS_TABLE_LINE_MAX] = ""; while (MscFGets(szAliasLine, sizeof(szAliasLine) - 1, pAliasFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szAliasLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= ealMax && stricmp(pszDomain, ppszStrings[ealDomain]) == 0) { ++iAliasFound; } else fprintf(pTmpFile, "%s\n", szAliasLine); StrFreeStrings(ppszStrings); } fclose(pAliasFile); fclose(pTmpFile); if (iAliasFound == 0) { SysRemove(szTmpFile); RLckUnlockEX(hResLock); return 0; } if (MscMoveFile(szTmpFile, szAliasFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } /* Rebuild indexes */ if (ExAlRebuildAliasIndexes(szAliasFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); return 0; } int ExAlGetDBFileSnapShot(const char *pszFileName) { char szAliasFilePath[SYS_MAX_PATH] = ""; ExAlGetTableFilePath(szAliasFilePath, sizeof(szAliasFilePath)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szAliasFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); if (MscCopyFile(pszFileName, szAliasFilePath) < 0) { RLckUnlockSH(hResLock); return ErrGetErrorCode(); } RLckUnlockSH(hResLock); return 0; } EXAL_HANDLE ExAlOpenDB(void) { ExAlDBScanData *pGLSD = (ExAlDBScanData *) SysAlloc(sizeof(ExAlDBScanData)); if (pGLSD == NULL) return INVALID_EXAL_HANDLE; UsrGetTmpFile(NULL, pGLSD->szTmpDBFile, sizeof(pGLSD->szTmpDBFile)); if (ExAlGetDBFileSnapShot(pGLSD->szTmpDBFile) < 0) { SysFree(pGLSD); return INVALID_EXAL_HANDLE; } if ((pGLSD->pDBFile = fopen(pGLSD->szTmpDBFile, "rt")) == NULL) { SysRemove(pGLSD->szTmpDBFile); SysFree(pGLSD); return INVALID_EXAL_HANDLE; } return (EXAL_HANDLE) pGLSD; } void ExAlCloseDB(EXAL_HANDLE hLinksDB) { ExAlDBScanData *pGLSD = (ExAlDBScanData *) hLinksDB; fclose(pGLSD->pDBFile); SysRemove(pGLSD->szTmpDBFile); SysFree(pGLSD); } ExtAlias *ExAlGetFirstAlias(EXAL_HANDLE hLinksDB) { ExAlDBScanData *pGLSD = (ExAlDBScanData *) hLinksDB; rewind(pGLSD->pDBFile); ExtAlias *pExtAlias = NULL; char szAliasLine[ALIAS_TABLE_LINE_MAX] = ""; while (pExtAlias == NULL && MscFGets(szAliasLine, sizeof(szAliasLine) - 1, pGLSD->pDBFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szAliasLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= ealMax) pExtAlias = ExAlGetAliasFromStrings(ppszStrings); StrFreeStrings(ppszStrings); } return pExtAlias; } ExtAlias *ExAlGetNextAlias(EXAL_HANDLE hLinksDB) { ExAlDBScanData *pGLSD = (ExAlDBScanData *) hLinksDB; ExtAlias *pExtAlias = NULL; char szAliasLine[ALIAS_TABLE_LINE_MAX] = ""; while (pExtAlias == NULL && MscFGets(szAliasLine, sizeof(szAliasLine) - 1, pGLSD->pDBFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szAliasLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= ealMax) pExtAlias = ExAlGetAliasFromStrings(ppszStrings); StrFreeStrings(ppszStrings); } return pExtAlias; } xmail-1.27/ResLocks.h0000644000175000017500000000241311341640430013721 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _RESLOCKS_H #define _RESLOCKS_H #define INVALID_RLCK_HANDLE ((RLCK_HANDLE) 0) typedef struct RLCK_HANDLE_struct { } *RLCK_HANDLE; int RLckInitLockers(void); int RLckCleanupLockers(void); RLCK_HANDLE RLckLockEX(char const *pszResourceName); int RLckUnlockEX(RLCK_HANDLE hLock); RLCK_HANDLE RLckLockSH(char const *pszResourceName); int RLckUnlockSH(RLCK_HANDLE hLock); #endif xmail-1.27/MiscUtils.cpp0000644000175000017500000011377011341640430014454 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "StrUtils.h" #include "SList.h" #include "Hash.h" #include "MD5.h" #include "Base64Enc.h" #include "BuffSock.h" #include "SSLBind.h" #include "MailConfig.h" #include "UsrUtils.h" #include "SvrUtils.h" #include "MessQueue.h" #include "SSLMisc.h" #include "MailSvr.h" #include "MiscUtils.h" #define IPPROP_LINE_MAX 1024 #define SERVICE_ACCEPT_TIMEOUT 4000 #define SERVICE_WAIT_SLEEP 2 #define MAX_CLIENTS_WAIT 300 #define MAX_RND_TIME 600 enum IPMapFileds { ipmFromIP = 0, ipmFromMask, ipmAllow, ipmPrecedence, ipmMax }; struct FileScan { SysListHead FList; SysListHead *pPos; }; int MscDatumAlloc(Datum *pDm, void const *pData, long lSize) { if ((pDm->pData = (char *) SysAllocNZ(lSize + 1)) == NULL) return ErrGetErrorCode(); memcpy(pDm->pData, pData, lSize); pDm->pData[lSize] = 0; pDm->lSize = lSize; return 0; } LstDatum *MscLstDatumAlloc(void const *pData, long lSize) { LstDatum *pLDm = (LstDatum *) SysAlloc(sizeof(LstDatum)); if (pLDm != NULL) { SYS_INIT_LIST_HEAD(&pLDm->LLnk); if (MscDatumAlloc(&pLDm->Data, pData, lSize) < 0) { SysFree(pLDm); return NULL; } } return pLDm; } int MscLstDatumAddT(SysListHead *pHead, void const *pData, long lSize) { LstDatum *pLDm = MscLstDatumAlloc(pData, lSize); if (pLDm == NULL) return ErrGetErrorCode(); SYS_LIST_ADDT(&pLDm->LLnk, pHead); return 0; } void MscFreeDatumList(SysListHead *pHead) { SysListHead *pLLink; while ((pLLink = SYS_LIST_FIRST(pHead)) != NULL) { LstDatum *pLDm = SYS_LIST_ENTRY(pLLink, LstDatum, LLnk); SYS_LIST_DEL(pLLink); SysFree(pLDm->Data.pData); SysFree(pLDm); } } int MscUniqueFile(char const *pszDir, char *pszFilePath, int iMaxPath) { /* * Get thread ID and host name. We do not use atomic inc on ulUniqSeq, since * collision is prevented by the thread and process IDs. */ static unsigned long ulUniqSeq; char szHostName[MAX_HOST_NAME] = ""; gethostname(szHostName, sizeof(szHostName) - 1); SysSNPrintf(pszFilePath, iMaxPath, "%s" SYS_SLASH_STR SYS_LLU_FMT ".%lx.%lx.%lx.%s", pszDir, SysMsTime(), SysGetCurrentThreadId(), SysGetCurrentProcessId(), ulUniqSeq++, szHostName); return 0; } void MscSafeGetTmpFile(char *pszPath, int iMaxPath) { time_t tmNow; unsigned long ulID; SYS_INT64 MsTime; md5_ctx_t MCtx; char szTempDir[SYS_MAX_PATH], szMD5[128]; static time_t tmRnd; static unsigned char RndBytes[64]; if ((tmNow = time(NULL)) > tmRnd + MAX_RND_TIME) { SSLGetRandBytes(RndBytes, sizeof(RndBytes)); tmRnd = tmNow; } md5_init(&MCtx); MsTime = SysMsTime(); md5_update(&MCtx, (unsigned char *) &MsTime, sizeof(MsTime)); ulID = SysGetCurrentProcessId(); md5_update(&MCtx, (unsigned char *) &ulID, sizeof(ulID)); ulID = SysGetCurrentThreadId(); md5_update(&MCtx, (unsigned char *) &ulID, sizeof(ulID)); ulID = rand(); md5_update(&MCtx, (unsigned char *) &ulID, sizeof(ulID)); md5_update(&MCtx, RndBytes, sizeof(RndBytes)); md5_final(&MCtx); md5_hex(MCtx.digest, szMD5); SysGetTempDir(szTempDir, sizeof(szTempDir)); SysSNPrintf(pszPath, iMaxPath, "%s%s.xtmp", szTempDir, szMD5); } int MscRecvTextFile(char const *pszFileName, BSOCK_HANDLE hBSock, int iTimeout, int (*pStopProc) (void *), void *pParam) { FILE *pFile = fopen(pszFileName, "wt"); char szBuffer[2048]; if (pFile == NULL) { ErrSetErrorCode(ERR_FILE_CREATE, pszFileName); return ERR_FILE_CREATE; } while (BSckGetString(hBSock, szBuffer, sizeof(szBuffer) - 1, iTimeout) != NULL) { if (strcmp(szBuffer, ".") == 0) break; if (szBuffer[0] == '.') fprintf(pFile, "%s\n", szBuffer + 1); else fprintf(pFile, "%s\n", szBuffer); if (pStopProc != NULL && (*pStopProc)(pParam)) { fclose(pFile); return ErrGetErrorCode(); } } fclose(pFile); return 0; } int MscSendTextFile(char const *pszFileName, BSOCK_HANDLE hBSock, int iTimeout, int (*pStopProc) (void *), void *pParam) { FILE *pFile = fopen(pszFileName, "rt"); char szBuffer[2048]; if (pFile == NULL) { ErrSetErrorCode(ERR_FILE_OPEN, pszFileName); return ERR_FILE_OPEN; } while (MscFGets(szBuffer, sizeof(szBuffer) - 1, pFile) != NULL) { if (szBuffer[0] == '.') for (int i = strlen(szBuffer); i >= 0; i--) szBuffer[i + 1] = szBuffer[i]; if (BSckSendString(hBSock, szBuffer, iTimeout) <= 0) { fclose(pFile); return ErrGetErrorCode(); } if (pStopProc != NULL && (*pStopProc)(pParam)) { fclose(pFile); return ErrGetErrorCode(); } } if (ferror(pFile)) { fclose(pFile); ErrSetErrorCode(ERR_FILE_READ, pszFileName); return ERR_FILE_READ; } fclose(pFile); return BSckSendString(hBSock, ".", iTimeout); } int MscSendFileCRLF(char const *pszFilePath, BSOCK_HANDLE hBSock, int iTimeout) { int iLength; FILE *pFile; char szBuffer[2048]; if ((pFile = fopen(pszFilePath, "rb")) == NULL) { ErrSetErrorCode(ERR_FILE_OPEN, pszFilePath); return ERR_FILE_OPEN; } while (fgets(szBuffer, sizeof(szBuffer) - 1, pFile) != NULL) { iLength = strlen(szBuffer); if (szBuffer[iLength - 1] == '\r') szBuffer[iLength++] = '\n'; else if (szBuffer[iLength - 1] == '\n' && (iLength < 2 || szBuffer[iLength - 2] != '\r')) { szBuffer[iLength - 1] = '\r'; szBuffer[iLength++] = '\n'; } if (BSckSendData(hBSock, szBuffer, iLength, iTimeout) < 0) { fclose(pFile); return ErrGetErrorCode(); } } if (ferror(pFile)) { fclose(pFile); ErrSetErrorCode(ERR_FILE_READ, pszFilePath); return ERR_FILE_READ; } fclose(pFile); return 0; } char *MscTranslatePath(char *pszPath) { for (int i = 0; pszPath[i] != '\0'; i++) { switch (pszPath[i]) { case '/': case '\\': pszPath[i] = SYS_SLASH_CHAR; break; } } return pszPath; } void *MscLoadFile(char const *pszFilePath, unsigned long *pulFileSize) { size_t FileSize, RdBytes; SYS_OFF_T llFileSize; FILE *pFile; void *pFileData; if ((pFile = fopen(pszFilePath, "rb")) == NULL) { ErrSetErrorCode(ERR_FILE_OPEN, pszFilePath); return NULL; } Sys_fseek(pFile, 0, SEEK_END); llFileSize = Sys_ftell(pFile); if (llFileSize >= (1LL << (CHAR_BIT * sizeof(size_t) - 1))) { fclose(pFile); ErrSetErrorCode(ERR_TOO_BIG, pszFilePath); return NULL; } FileSize = (size_t) llFileSize; /* * Alloc one extra byte to enable placing a '\0' to terminate an eventual * string representation and to avoid SysAlloc() to fail if ulFileSize == 0 */ if ((pFileData = SysAlloc(FileSize + 1)) == NULL) { fclose(pFile); return NULL; } rewind(pFile); RdBytes = fread(pFileData, FileSize, 1, pFile); fclose(pFile); if (RdBytes != FileSize) { SysFree(pFileData); ErrSetErrorCode(ERR_FILE_READ, pszFilePath); return NULL; } ((char *) pFileData)[FileSize] = 0; if (pulFileSize != NULL) *pulFileSize = FileSize; return pFileData; } int MscLockFile(char const *pszFileName, int iMaxWait, int iWaitStep) { while (iMaxWait > 0 && SysLockFile(pszFileName) < 0) { if (SysSleep(iWaitStep) < 0) return ErrGetErrorCode(); iMaxWait -= iWaitStep; } return iMaxWait > 0 ? 0: SysLockFile(pszFileName); } int MscGetTimeNbrString(char *pszTimeStr, int iStringSize, time_t tTime) { if (tTime == 0) time(&tTime); struct tm tmSession; SysLocalTime(&tTime, &tmSession); SysSNPrintf(pszTimeStr, iStringSize, "%04d-%02d-%02d %02d:%02d:%02d", tmSession.tm_year + 1900, tmSession.tm_mon + 1, tmSession.tm_mday, tmSession.tm_hour, tmSession.tm_min, tmSession.tm_sec); return 0; } int MscGetTime(struct tm &tmLocal, int &iDiffHours, int &iDiffMins, time_t tCurr) { time_t tLocal, tGM; struct tm tmTimeLOC, tmTimeGM; if (tCurr == 0) time(&tCurr); SysLocalTime(&tCurr, &tmLocal); tmTimeLOC = tmLocal; SysGMTime(&tCurr, &tmTimeGM); tmTimeLOC.tm_isdst = 0; tmTimeGM.tm_isdst = 0; tLocal = mktime(&tmTimeLOC); tGM = mktime(&tmTimeGM); int iSecsDiff = (int) difftime(tLocal, tGM); int iSignDiff = Sign(iSecsDiff); int iMinutes = Abs(iSecsDiff) / 60; iDiffMins = iMinutes % 60; iDiffHours = iSignDiff * (iMinutes / 60); return 0; } char *MscStrftime(struct tm const *ptmTime, char *pszDateStr, int iSize) { static char const * const pszWDays[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; static char const * const pszMonths[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; SysSNPrintf(pszDateStr, iSize, "%s, %d %s %d %02d:%02d:%02d", pszWDays[ptmTime->tm_wday], ptmTime->tm_mday, pszMonths[ptmTime->tm_mon], ptmTime->tm_year + 1900, ptmTime->tm_hour, ptmTime->tm_min, ptmTime->tm_sec); return pszDateStr; } int MscGetTimeStr(char *pszTimeStr, int iStringSize, time_t tCurr) { int iDiffHours = 0; int iDiffMins = 0; struct tm tmTime; char szDiffTime[128]; MscGetTime(tmTime, iDiffHours, iDiffMins, tCurr); if (iDiffHours > 0) sprintf(szDiffTime, " +%02d%02d", iDiffHours, iDiffMins); else sprintf(szDiffTime, " -%02d%02d", -iDiffHours, iDiffMins); MscStrftime(&tmTime, pszTimeStr, iStringSize - strlen(szDiffTime) - 1); strcat(pszTimeStr, szDiffTime); return 0; } int MscGetDirectorySize(char const *pszPath, bool bRecurse, SYS_OFF_T &llDirSize, unsigned long &ulNumFiles, int (*pFNValidate) (char const *)) { char szFileName[SYS_MAX_PATH]; SYS_HANDLE hFind = SysFirstFile(pszPath, szFileName, sizeof(szFileName)); if (hFind == SYS_INVALID_HANDLE) return ErrGetErrorCode(); llDirSize = 0; do { if (SysIsDirectory(hFind)) { if (bRecurse && SYS_IS_VALID_FILENAME(szFileName)) { SYS_OFF_T llSubDirSize = 0; unsigned long ulSubNumFiles = 0; char szSubPath[SYS_MAX_PATH]; StrSNCpy(szSubPath, pszPath); AppendSlash(szSubPath); StrSNCat(szSubPath, szFileName); if (MscGetDirectorySize(szSubPath, bRecurse, llSubDirSize, ulSubNumFiles, pFNValidate) < 0) { ErrorPush(); SysFindClose(hFind); return ErrorPop(); } ulNumFiles += ulSubNumFiles; llDirSize += llSubDirSize; } } else if (pFNValidate == NULL || (*pFNValidate)(szFileName)) { ++ulNumFiles; llDirSize += SysGetSize(hFind); } } while (SysNextFile(hFind, szFileName, sizeof(szFileName))); SysFindClose(hFind); return 0; } FSCAN_HANDLE MscFirstFile(char const *pszPath, int iListDirs, char *pszFileName, int iSize) { FileScan *pFS; LstDatum *pLDm; if ((pFS = (FileScan *) SysAlloc(sizeof(FileScan))) == NULL) return INVALID_FSCAN_HANDLE; SYS_INIT_LIST_HEAD(&pFS->FList); if (MscGetFileList(pszPath, iListDirs, &pFS->FList) < 0) { SysFree(pFS); return INVALID_FSCAN_HANDLE; } if ((pFS->pPos = SYS_LIST_FIRST(&pFS->FList)) == NULL) { MscFreeDatumList(&pFS->FList); SysFree(pFS); return INVALID_FSCAN_HANDLE; } pLDm = SYS_LIST_ENTRY(pFS->pPos, LstDatum, LLnk); pFS->pPos = SYS_LIST_NEXT(pFS->pPos, &pFS->FList); StrNCpy(pszFileName, pLDm->Data.pData, iSize); return (FSCAN_HANDLE) pFS; } int MscNextFile(FSCAN_HANDLE hFileScan, char *pszFileName, int iSize) { FileScan *pFS = (FileScan *) hFileScan; LstDatum *pLDm; if (pFS->pPos == NULL) return 0; pLDm = SYS_LIST_ENTRY(pFS->pPos, LstDatum, LLnk); pFS->pPos = SYS_LIST_NEXT(pFS->pPos, &pFS->FList); StrNCpy(pszFileName, pLDm->Data.pData, iSize); return 1; } void MscCloseFindFile(FSCAN_HANDLE hFileScan) { FileScan *pFS = (FileScan *) hFileScan; MscFreeDatumList(&pFS->FList); SysFree(pFS); } int MscGetFileList(char const *pszPath, int iListDirs, SysListHead *pHead) { char szFileName[SYS_MAX_PATH]; SYS_HANDLE hFind = SysFirstFile(pszPath, szFileName, sizeof(szFileName)); SYS_INIT_LIST_HEAD(pHead); if (hFind != SYS_INVALID_HANDLE) { do { if ((iListDirs || !SysIsDirectory(hFind)) && MscLstDatumAddT(pHead, szFileName, strlen(szFileName)) < 0) { MscFreeDatumList(pHead); return ErrGetErrorCode(); } } while (SysNextFile(hFind, szFileName, sizeof(szFileName))); SysFindClose(hFind); } return 0; } int MscCreateEmptyFile(char const *pszFileName) { FILE *pFile = fopen(pszFileName, "wb"); if (pFile == NULL) { ErrSetErrorCode(ERR_FILE_CREATE, pszFileName); return ERR_FILE_CREATE; } fclose(pFile); return 0; } int MscClearDirectory(char const *pszPath, int iRecurseSubs) { SYS_HANDLE hFind; SysListHead *pPos; SysListHead FList; char szFileName[SYS_MAX_PATH]; if ((hFind = SysFirstFile(pszPath, szFileName, sizeof(szFileName))) == SYS_INVALID_HANDLE) return 0; SYS_INIT_LIST_HEAD(&FList); do { if (SysIsDirectory(hFind)) { if (iRecurseSubs && SYS_IS_VALID_FILENAME(szFileName)) { char szSubPath[SYS_MAX_PATH]; StrSNCpy(szSubPath, pszPath); AppendSlash(szSubPath); StrSNCat(szSubPath, szFileName); if (MscClearDirectory(szSubPath, iRecurseSubs) < 0 || SysRemoveDir(szSubPath) < 0) { MscFreeDatumList(&FList); return ErrGetErrorCode(); } } } else { if (MscLstDatumAddT(&FList, szFileName, strlen(szFileName)) < 0) { MscFreeDatumList(&FList); return ErrGetErrorCode(); } } } while (SysNextFile(hFind, szFileName, sizeof(szFileName))); SysFindClose(hFind); for (pPos = SYS_LIST_FIRST(&FList); pPos != NULL; pPos = SYS_LIST_NEXT(pPos, &FList)) { LstDatum *pLDm = SYS_LIST_ENTRY(pPos, LstDatum, LLnk); StrSNCpy(szFileName, pszPath); AppendSlash(szFileName); StrSNCat(szFileName, pLDm->Data.pData); if (SysRemove(szFileName) < 0 && SysExistFile(szFileName)) { MscFreeDatumList(&FList); return ErrGetErrorCode(); } } MscFreeDatumList(&FList); return 0; } static int MscCopyFileLL(char const *pszCopyTo, char const *pszCopyFrom, char const *pszMode) { size_t RdBytes; FILE *pFileIn, *pFileOut; char szBuffer[2048]; if ((pFileIn = fopen(pszCopyFrom, "rb")) == NULL) { ErrSetErrorCode(ERR_FILE_OPEN, pszCopyFrom); return ERR_FILE_OPEN; } if ((pFileOut = fopen(pszCopyTo, pszMode)) == NULL) { fclose(pFileIn); ErrSetErrorCode(ERR_FILE_CREATE, pszCopyTo); return ERR_FILE_CREATE; } do { if ((RdBytes = fread(szBuffer, 1, sizeof(szBuffer), pFileIn)) > 0) { if (fwrite(szBuffer, 1, RdBytes, pFileOut) != RdBytes) { fclose(pFileOut); fclose(pFileIn); SysRemove(pszCopyTo); ErrSetErrorCode(ERR_FILE_WRITE, pszCopyTo); return ERR_FILE_WRITE; } } } while (RdBytes == sizeof(szBuffer)); fclose(pFileOut); fclose(pFileIn); return 0; } int MscCopyFile(char const *pszCopyTo, char const *pszCopyFrom) { return MscCopyFileLL(pszCopyTo, pszCopyFrom, "wb"); } int MscAppendFile(char const *pszCopyTo, char const *pszCopyFrom) { return MscCopyFileLL(pszCopyTo, pszCopyFrom, "a+b"); } int MscCopyFile(FILE *pFileOut, FILE *pFileIn, SYS_OFF_T llBaseOffset, SYS_OFF_T llCopySize) { size_t RdBytes, ToRead; SYS_OFF_T llFileSize; char szBuffer[2048]; if (llBaseOffset == (SYS_OFF_T) -1) llBaseOffset = Sys_ftell(pFileIn); Sys_fseek(pFileIn, 0, SEEK_END); llFileSize = Sys_ftell(pFileIn); if (llCopySize == (SYS_OFF_T) -1) llCopySize = llFileSize - llBaseOffset; else llCopySize = Min(llCopySize, llFileSize - llBaseOffset); Sys_fseek(pFileIn, llBaseOffset, SEEK_SET); while (llCopySize > 0) { ToRead = (size_t) Min(llCopySize, sizeof(szBuffer)); if ((RdBytes = fread(szBuffer, 1, ToRead, pFileIn)) > 0) { if (fwrite(szBuffer, 1, RdBytes, pFileOut) != RdBytes) { ErrSetErrorCode(ERR_FILE_WRITE); return ERR_FILE_WRITE; } llCopySize -= RdBytes; } if (RdBytes != ToRead) { ErrSetErrorCode(ERR_FILE_READ); return ERR_FILE_READ; } } return 0; } int MscDos2UnixFile(FILE *pFileOut, FILE *pFileIn) { int iLength; char szBuffer[2048]; while (fgets(szBuffer, sizeof(szBuffer), pFileIn) != NULL) { iLength = strlen(szBuffer); if (szBuffer[iLength - 1] == '\r') szBuffer[iLength - 1] = '\n'; if (fwrite(szBuffer, 1, iLength, pFileOut) != iLength) { ErrSetErrorCode(ERR_FILE_WRITE); return ERR_FILE_WRITE; } } if (ferror(pFileIn)) { ErrSetErrorCode(ERR_FILE_READ); return ERR_FILE_READ; } return 0; } int MscMoveFile(char const *pszOldName, char const *pszNewName) { if (MscCopyFile(pszNewName, pszOldName) < 0) return ErrGetErrorCode(); return SysRemove(pszOldName); } char *MscGetString(FILE *pFile, char *pszBuffer, int iMaxChars, int *piGotNL) { int iLength; if (fgets(pszBuffer, iMaxChars, pFile) == NULL) return NULL; iLength = strlen(pszBuffer); if (piGotNL != NULL) *piGotNL = (iLength > 0 && strchr("\r\n", pszBuffer[iLength - 1]) != NULL); for (; iLength > 0 && strchr("\r\n", pszBuffer[iLength - 1]) != NULL; iLength--); pszBuffer[iLength] = '\0'; return pszBuffer; } char *MscFGets(char *pszLine, int iLineSize, FILE *pFile) { return MscGetString(pFile, pszLine, iLineSize, NULL); } char *MscGetConfigLine(char *pszLine, int iLineSize, FILE *pFile, bool bSkipComments) { while (MscFGets(pszLine, iLineSize, pFile) != NULL) { if (strlen(pszLine) > 0 && (!bSkipComments || pszLine[0] != TAB_COMMENT_CHAR)) return pszLine; } ErrSetErrorCode(ERR_FILE_EOF); return NULL; } int MscGetPeerHost(SYS_SOCKET SockFD, char *pszFQDN, int iSize) { SYS_INET_ADDR PeerInfo; if (SysGetPeerInfo(SockFD, PeerInfo) < 0) return ErrGetErrorCode(); return SysGetHostByAddr(PeerInfo, pszFQDN, iSize); } int MscGetSockHost(SYS_SOCKET SockFD, char *pszFQDN, int iSize) { SYS_INET_ADDR SockInfo; if (SysGetSockInfo(SockFD, SockInfo) < 0) return ErrGetErrorCode(); return SysGetHostByAddr(SockInfo, pszFQDN, iSize); } int MscGetServerAddress(char const *pszServer, SYS_INET_ADDR &SvrAddr, int iPortNo) { char szServer[MAX_HOST_NAME]; if (MscSplitAddressPort(pszServer, szServer, iPortNo, iPortNo) < 0 || SysGetHostByName(szServer, iAddrFamily, SvrAddr) < 0 || SysSetAddrPort(SvrAddr, iPortNo) < 0) return ErrGetErrorCode(); return 0; } int MscSplitFQDN(char const *pszFQDN, char *pszHost, int iHSize, char *pszDomain, int iDSize) { char const *pszDot = strchr(pszFQDN, '.'); if (pszDot == NULL) { if (pszHost != NULL) StrNCpy(pszHost, pszFQDN, iHSize); if (pszDomain != NULL) SetEmptyString(pszDomain); } else { if (pszHost != NULL) { int iHostLength = (int) (pszDot - pszFQDN); if (iHostLength >= iHSize) iHostLength = iHSize - 1; Cpy2Sz(pszHost, pszFQDN, iHostLength); } if (pszDomain != NULL) { StrNCpy(pszDomain, pszDot + 1, iDSize); DelFinalChar(pszDomain, '.'); } } return 0; } char *MscLogFilePath(char const *pszLogFile, char *pszLogFilePath) { time_t tCurrent; time(&tCurrent); long lRotStep = (unsigned long) (3600L * iLogRotateHours); long lTimeZone = SysGetTimeZone(); long lDayLight = SysGetDayLight(); time_t tLogFileTime = (time_t) (NbrFloor((SYS_INT64) tCurrent - lTimeZone + lDayLight, lRotStep) + lTimeZone - lDayLight); struct tm tmLocTime; char szLogsDir[SYS_MAX_PATH]; SysLocalTime(&tLogFileTime, &tmLocTime); SvrGetLogsDir(szLogsDir, sizeof(szLogsDir)); AppendSlash(szLogsDir); sprintf(pszLogFilePath, "%s%s-%04d%02d%02d%02d%02d", szLogsDir, pszLogFile, tmLocTime.tm_year + 1900, tmLocTime.tm_mon + 1, tmLocTime.tm_mday, tmLocTime.tm_hour, tmLocTime.tm_min); return pszLogFilePath; } int MscFileLog(char const *pszLogFile, char const *pszFormat, ...) { FILE *pLogFile; va_list Args; char szLogFilePath[SYS_MAX_PATH]; MscLogFilePath(pszLogFile, szLogFilePath); if ((pLogFile = fopen(szLogFilePath, "a+t")) == NULL) { ErrSetErrorCode(ERR_FILE_OPEN); return ERR_FILE_OPEN; } va_start(Args, pszFormat); vfprintf(pLogFile, pszFormat, Args); va_end(Args); fclose(pLogFile); return 0; } int MscSplitPath(char const *pszFilePath, char *pszDir, int iDSize, char *pszFName, int iFSize, char *pszExt, int iESize) { char const *pszSlash = strrchr(pszFilePath, SYS_SLASH_CHAR); char const *pszFile = NULL, *pszDot; if (pszSlash != NULL) { pszFile = pszSlash + 1; if (pszDir != NULL) { int iDirLength = (int) (pszFile - pszFilePath); if (iDirLength >= iDSize) iDirLength = iDSize - 1; Cpy2Sz(pszDir, pszFilePath, iDirLength); } } else { pszFile = pszFilePath; if (pszDir != NULL) SetEmptyString(pszDir); } if ((pszDot = strrchr(pszFile, '.')) != NULL) { if (pszFName != NULL) { int iNameLength = (int) (pszDot - pszFile); if (iNameLength >= iFSize) iNameLength = iFSize - 1; Cpy2Sz(pszFName, pszFile, iNameLength); } if (pszExt != NULL) StrNCpy(pszExt, pszDot, iESize); } else { if (pszFName != NULL) StrNCpy(pszFName, pszFile, iFSize); if (pszExt != NULL) SetEmptyString(pszExt); } return 0; } int MscGetFileName(char const *pszFilePath, char *pszFileName) { char const *pszSlash = strrchr(pszFilePath, SYS_SLASH_CHAR); strcpy(pszFileName, (pszSlash != NULL) ? (pszSlash + 1): pszFilePath); return 0; } int MscCreateClientSocket(char const *pszServer, int iPortNo, int iSockType, SYS_SOCKET *pSockFD, SYS_INET_ADDR *pSvrAddr, SYS_INET_ADDR *pSockAddr, int iTimeout) { SYS_INET_ADDR SvrAddr; if (MscGetServerAddress(pszServer, SvrAddr, iPortNo) < 0) return ErrGetErrorCode(); SYS_SOCKET SockFD = SysCreateSocket(SysGetAddrFamily(SvrAddr), iSockType, 0); if (SockFD == SYS_INVALID_SOCKET) return ErrGetErrorCode(); if (SysConnect(SockFD, &SvrAddr, iTimeout) < 0) { ErrorPush(); SysCloseSocket(SockFD); return ErrorPop(); } SYS_INET_ADDR SockAddr; if (SysGetSockInfo(SockFD, SockAddr) < 0) { ErrorPush(); SysCloseSocket(SockFD); return ErrorPop(); } *pSockFD = SockFD; if (pSvrAddr != NULL) *pSvrAddr = SvrAddr; if (pSockAddr != NULL) *pSockAddr = SockAddr; return 0; } int MscCreateServerSockets(int iNumAddr, SYS_INET_ADDR const *pSvrAddr, int iFamily, int iPortNo, int iListenSize, SYS_SOCKET *pSockFDs, int &iNumSockFDs) { if (iNumAddr == 0) { SYS_SOCKET SvrSockFD = SysCreateSocket(iFamily, SOCK_STREAM, 0); if (SvrSockFD == SYS_INVALID_SOCKET) return ErrGetErrorCode(); SYS_INET_ADDR InSvrAddr; if (SysInetAnySetup(InSvrAddr, iFamily, iPortNo) < 0 || SysBindSocket(SvrSockFD, &InSvrAddr) < 0) { ErrorPush(); SysCloseSocket(SvrSockFD); return ErrorPop(); } SysListenSocket(SvrSockFD, iListenSize); *pSockFDs = SvrSockFD; iNumSockFDs = 1; } else { iNumSockFDs = 0; for (int i = 0; i < iNumAddr; i++) { SYS_SOCKET SvrSockFD = SysCreateSocket(SysGetAddrFamily(pSvrAddr[i]), SOCK_STREAM, 0); if (SvrSockFD == SYS_INVALID_SOCKET) { ErrorPush(); for (--iNumSockFDs; iNumSockFDs >= 0; iNumSockFDs--) SysCloseSocket(pSockFDs[iNumSockFDs]); return ErrorPop(); } SYS_INET_ADDR InSvrAddr = pSvrAddr[i]; if (SysGetAddrPort(InSvrAddr) == 0) SysSetAddrPort(InSvrAddr, iPortNo); if (SysBindSocket(SvrSockFD, &InSvrAddr) < 0) { ErrorPush(); SysCloseSocket(SvrSockFD); for (--iNumSockFDs; iNumSockFDs >= 0; iNumSockFDs--) SysCloseSocket(pSockFDs[iNumSockFDs]); return ErrorPop(); } SysListenSocket(SvrSockFD, iListenSize); pSockFDs[iNumSockFDs++] = SvrSockFD; } } return 0; } int MscGetMaxSockFD(SYS_SOCKET const *pSockFDs, int iNumSockFDs) { int i, iMaxFD = 0; for (i = 0; i < iNumSockFDs; i++) if (iMaxFD < (int) pSockFDs[i]) iMaxFD = (int) pSockFDs[i]; return iMaxFD; } int MscAcceptServerConnection(SYS_SOCKET const *pSockFDs, int iNumSockFDs, SYS_SOCKET *pConnSockFD, int &iNumConnSockFD, int iTimeout) { int i; SYS_fd_set fdReadSet; ZeroData(fdReadSet); SYS_FD_ZERO(&fdReadSet); for (i = 0; i < iNumSockFDs; i++) SYS_FD_SET(pSockFDs[i], &fdReadSet); int iSelectResult = SysSelect(MscGetMaxSockFD(pSockFDs, iNumSockFDs), &fdReadSet, NULL, NULL, iTimeout); if (iSelectResult < 0) return ErrGetErrorCode(); iNumConnSockFD = 0; for (i = 0; i < iNumSockFDs; i++) { if (SYS_FD_ISSET(pSockFDs[i], &fdReadSet)) { SYS_INET_ADDR ConnAddr; ZeroData(ConnAddr); SYS_SOCKET ConnSockFD = SysAccept(pSockFDs[i], &ConnAddr, iTimeout); if (ConnSockFD != SYS_INVALID_SOCKET) pConnSockFD[iNumConnSockFD++] = ConnSockFD; } } return 0; } int MscLoadAddressFilter(char const *const *ppszFilter, int iNumTokens, AddressFilter &AF) { int iASize; void const *pAData; char const *pszMask; SYS_INET_ADDR Mask; if ((pszMask = strchr(ppszFilter[0], '/')) != NULL) { int i; int iAddrLength = (int) (pszMask - ppszFilter[0]); int iMaskBits = atoi(pszMask + 1); char szFilter[128]; iAddrLength = Min(iAddrLength, (int) sizeof(szFilter) - 1); Cpy2Sz(szFilter, ppszFilter[0], iAddrLength); if (SysGetHostByName(szFilter, -1, AF.Addr) < 0) return ErrGetErrorCode(); ZeroData(AF.Mask); iMaskBits = Min(iMaskBits, CHAR_BIT * (int) sizeof(AF.Mask)); for (i = 0; (i + CHAR_BIT) <= iMaskBits; i += CHAR_BIT) AF.Mask[i / CHAR_BIT] = 0xff; if (i < iMaskBits) AF.Mask[i / CHAR_BIT] = (SYS_UINT8) (((1 << (iMaskBits - i)) - 1) << (CHAR_BIT - iMaskBits + i)); } else if (iNumTokens > 1) { /* * This is for the old IPV4 representation. They both must * be two IPV4 addresses (first network, second netmask). */ if (SysGetHostByName(ppszFilter[0], AF_INET, AF.Addr) < 0 || SysGetHostByName(ppszFilter[1], AF_INET, Mask) < 0 || (pAData = SysInetAddrData(Mask, &iASize)) == NULL) return ErrGetErrorCode(); ZeroData(AF.Mask); memcpy(AF.Mask, pAData, Min(iASize, (int) sizeof(AF.Mask))); } else { ErrSetErrorCode(ERR_INVALID_PARAMETER); return ERR_INVALID_PARAMETER; } return 0; } int MscAddressMatch(AddressFilter const &AF, SYS_INET_ADDR const &TestAddr) { return SysInetAddrMatch(AF.Addr, AF.Mask, sizeof(AF.Mask), TestAddr); } int MscCheckAllowedIP(char const *pszMapFile, const SYS_INET_ADDR &PeerInfo, bool bDefault) { FILE *pMapFile = fopen(pszMapFile, "rt"); if (pMapFile == NULL) { ErrSetErrorCode(ERR_FILE_OPEN, pszMapFile); return ERR_FILE_OPEN; } bool bAllow = bDefault; int iPrecedence = -1, iFieldsCount; AddressFilter AF; char szMapLine[512]; while (MscGetConfigLine(szMapLine, sizeof(szMapLine) - 1, pMapFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szMapLine); if (ppszStrings == NULL) continue; iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= ipmMax && MscLoadAddressFilter(ppszStrings, iFieldsCount, AF) == 0 && MscAddressMatch(AF, PeerInfo)) { int iCurrPrecedence = atoi(ppszStrings[ipmPrecedence]); if (iCurrPrecedence >= iPrecedence) { iPrecedence = iCurrPrecedence; bAllow = (stricmp(ppszStrings[ipmAllow], "ALLOW") == 0) ? true: false; } } StrFreeStrings(ppszStrings); } fclose(pMapFile); if (!bAllow) { ErrSetErrorCode(ERR_IP_NOT_ALLOWED); return ERR_IP_NOT_ALLOWED; } return 0; } char **MscGetIPProperties(char const *pszFileName, const SYS_INET_ADDR *pPeerInfo) { FILE *pFile = fopen(pszFileName, "rt"); if (pFile == NULL) { ErrSetErrorCode(ERR_FILE_OPEN); return NULL; } int iFieldsCount; AddressFilter AFPeer; char szLine[IPPROP_LINE_MAX]; while (MscGetConfigLine(szLine, sizeof(szLine) - 1, pFile) != NULL) { char **ppszTokens = StrGetTabLineStrings(szLine); if (ppszTokens == NULL) continue; iFieldsCount = StrStringsCount(ppszTokens); if (iFieldsCount >= 1 && MscLoadAddressFilter(&ppszTokens[0], 1, AFPeer) == 0 && MscAddressMatch(AFPeer, *pPeerInfo)) { fclose(pFile); return ppszTokens; } StrFreeStrings(ppszTokens); } fclose(pFile); ErrSetErrorCode(ERR_NOT_FOUND); return NULL; } int MscHostSubMatch(char const *pszHostName, char const *pszHostMatch) { int iMatchResult = 0, iHLen, iMLen; if ((iHLen = strlen(pszHostMatch)) > 0 && pszHostMatch[iHLen - 1] == '.') iHLen--; if (*pszHostMatch == '.') { pszHostMatch++; if ((iMLen = strlen(pszHostMatch)) <= iHLen) iMatchResult = strnicmp(pszHostName + iMLen - iHLen, pszHostMatch, iHLen) == 0; } else iMatchResult = strnicmp(pszHostName, pszHostMatch, iHLen) == 0; return iMatchResult; } char **MscGetHNProperties(char const *pszFileName, char const *pszHostName) { int iFieldsCount; FILE *pFile; char szLine[IPPROP_LINE_MAX]; if ((pFile = fopen(pszFileName, "rt")) == NULL) { ErrSetErrorCode(ERR_FILE_OPEN); return NULL; } while (MscGetConfigLine(szLine, sizeof(szLine) - 1, pFile) != NULL) { char **ppszTokens = StrGetTabLineStrings(szLine); if (ppszTokens == NULL) continue; iFieldsCount = StrStringsCount(ppszTokens); if (iFieldsCount >= 1 && MscHostSubMatch(pszHostName, ppszTokens[0])) { fclose(pFile); return ppszTokens; } StrFreeStrings(ppszTokens); } fclose(pFile); ErrSetErrorCode(ERR_NOT_FOUND); return NULL; } int MscMD5Authenticate(char const *pszPassword, char const *pszTimeStamp, char const *pszDigest) { char *pszHash; char szMD5[128]; if ((pszHash = StrSprint("%s%s", pszTimeStamp, pszPassword)) == NULL) return ErrGetErrorCode(); do_md5_string(pszHash, strlen(pszHash), szMD5); SysFree(pszHash); if (stricmp(pszDigest, szMD5) != 0) { ErrSetErrorCode(ERR_MD5_AUTH_FAILED); return ERR_MD5_AUTH_FAILED; } return 0; } char *MscExtractServerTimeStamp(char const *pszResponse, char *pszTimeStamp, int iMaxTimeStamp) { int iLengthTS; char const *pszStartTS, *pszEndTS; if ((pszStartTS = strchr(pszResponse, '<')) == NULL || (pszEndTS = strchr(pszStartTS + 1, '>')) == NULL) return NULL; iLengthTS = (int) (pszEndTS - pszStartTS) + 1; iLengthTS = Min(iLengthTS, iMaxTimeStamp - 1); Cpy2Sz(pszTimeStamp, pszStartTS, iLengthTS); return pszTimeStamp; } int MscRootedName(char const *pszHostName) { char const *pszDot = strrchr(pszHostName, '.'); return pszDot == NULL ? 0: (strlen(pszDot) == 0 ? 1: 0); } int MscCramMD5(char const *pszSecret, char const *pszChallenge, char *pszDigest) { int iLenght = (int) strlen(pszSecret); md5_ctx_t ctx; unsigned char isecret[64], osecret[64]; unsigned char md5secret[MD5_DIGEST_LEN]; if (iLenght > 64) { md5_init(&ctx); md5_update(&ctx, (unsigned char const *) pszSecret, iLenght); md5_final(&ctx); memcpy(md5secret, ctx.digest, MD5_DIGEST_LEN); pszSecret = (char const *) md5secret; iLenght = 16; } ZeroData(isecret); memcpy(isecret, pszSecret, iLenght); ZeroData(osecret); memcpy(osecret, pszSecret, iLenght); for (int i = 0; i < 64; i++) { isecret[i] ^= 0x36; osecret[i] ^= 0x5c; } md5_init(&ctx); md5_update(&ctx, isecret, 64); md5_update(&ctx, (unsigned char *) pszChallenge, (int) strlen(pszChallenge)); md5_final(&ctx); memcpy(md5secret, ctx.digest, MD5_DIGEST_LEN); md5_init(&ctx); md5_update(&ctx, osecret, 64); md5_update(&ctx, md5secret, MD5_DIGEST_LEN); md5_final(&ctx); md5_hex(ctx.digest, pszDigest); return 0; } /* * NOTE: This is used by TabIndex.cpp to compute the hash of its indexes. * If this function gets changed in any way, the TAB_INDEX_CURR_VERSION * value in TabIndex.cpp must be bumped to reflect a different file format. */ unsigned long MscHashString(char const *pszBuffer, int iLength, unsigned long ulHashInit) { unsigned long ulHashVal = ulHashInit; while (iLength > 0) { --iLength; ulHashVal += *(unsigned char const *) pszBuffer++; ulHashVal += (ulHashVal << 10); ulHashVal ^= (ulHashVal >> 6); } ulHashVal += (ulHashVal << 3); ulHashVal ^= (ulHashVal >> 11); ulHashVal += (ulHashVal << 15); return ulHashVal; } int MscSplitAddressPort(char const *pszConnSpec, char *pszAddress, int &iPortNo, int iDefPortNo) { char const *pszEnd = NULL, *pszPort; iPortNo = iDefPortNo; if (*pszConnSpec == '[') { pszConnSpec++; if ((pszEnd = strchr(pszConnSpec, ']')) == NULL) { ErrSetErrorCode(ERR_BAD_SERVER_ADDR); return ERR_BAD_SERVER_ADDR; } if ((pszPort = strrchr(pszEnd + 1, '|')) == NULL && (pszPort = strrchr(pszEnd + 1, ':')) == NULL) pszPort = strrchr(pszEnd + 1, ';'); if (pszPort != NULL) iPortNo = atoi(pszPort + 1); } else { if ((pszPort = strrchr(pszConnSpec, '|')) == NULL && (pszPort = strrchr(pszConnSpec, ':')) == NULL) pszPort = strrchr(pszConnSpec, ';'); if ((pszEnd = pszPort) != NULL) iPortNo = atoi(pszPort + 1); } if (pszEnd != NULL) { int iAddrLen = Min((int) (pszEnd - pszConnSpec), MAX_HOST_NAME - 1); Cpy2Sz(pszAddress, pszConnSpec, iAddrLen); } else strncpy(pszAddress, pszConnSpec, MAX_HOST_NAME - 1); return 0; } SYS_UINT16 MscReadUint16(void const *pData) { SYS_UINT16 uValue; /* * Reading possibly unaligned data ... */ memcpy(&uValue, pData, sizeof(uValue)); return uValue; } SYS_UINT32 MscReadUint32(void const *pData) { SYS_UINT32 uValue; /* * Reading possibly unaligned data ... */ memcpy(&uValue, pData, sizeof(uValue)); return uValue; } SYS_UINT64 MscReadUint64(void const *pData) { SYS_UINT64 uValue; /* * Reading possibly unaligned data ... */ memcpy(&uValue, pData, sizeof(uValue)); return uValue; } void *MscWriteUint16(void *pData, SYS_UINT16 uValue) { return memcpy(pData, &uValue, sizeof(uValue)); } void *MscWriteUint32(void *pData, SYS_UINT32 uValue) { return memcpy(pData, &uValue, sizeof(uValue)); } void *MscWriteUint64(void *pData, SYS_UINT64 uValue) { return memcpy(pData, &uValue, sizeof(uValue)); } int MscCmdStringCheck(char const *pszString) { for (; *pszString != '\0'; pszString++) if (*((unsigned char const *) pszString) > 127) { ErrSetErrorCode(ERR_BAD_CMDSTR_CHARS); return ERR_BAD_CMDSTR_CHARS; } return 0; } int MscGetSectionSize(FileSection const *pFS, SYS_OFF_T *pllSize) { if (pFS->llEndOffset == (SYS_OFF_T) -1) { SYS_FILE_INFO FI; if (SysGetFileInfo(pFS->szFilePath, FI) < 0) return ErrGetErrorCode(); *pllSize = FI.llSize - pFS->llStartOffset; } else *pllSize = pFS->llEndOffset - pFS->llStartOffset; return 0; } int MscIsIPDomain(char const *pszDomain, char *pszIP, int iIPSize) { int i, j; char const *pszBase = pszDomain; if (*pszDomain == '[') pszDomain++; for (j = 4; j >= 1; j--) { for (i = 0; i < 3; i++) if (!isdigit(pszDomain[i])) break; if (!i || atoi(pszDomain) > 255) return 0; pszDomain += i; if (j > 1 && *pszDomain++ != '.') return 0; } if ((*pszBase == '[' && *pszDomain != ']') || (*pszBase != '[' && *pszDomain != '\0')) return 0; if (pszIP != NULL) { if (*pszBase == '[') pszBase++; i = (int) (pszDomain - pszBase); i = Min(i, iIPSize - 1); Cpy2Sz(pszIP, pszBase, i); } return 1; } static char *MscMacroReplace(char const *pszIn, int *piSize, char *(*pLkupProc)(void *, char const *, int), void *pPriv) { char *pszLkup; if (strncmp(pszIn, "@@", 2) != 0) return StrMacSubst(pszIn, piSize, pLkupProc, pPriv); if ((pszLkup = (*pLkupProc)(pPriv, pszIn + 2, strlen(pszIn + 2))) == NULL) return NULL; if (piSize != NULL) *piSize = strlen(pszLkup); return pszLkup; } int MscReplaceTokens(char **ppszTokens, char *(*pLkupProc)(void *, char const *, int), void *pPriv) { int i; for (i = 0; ppszTokens[i] != NULL; i++) { char *pszRepl = MscMacroReplace(ppszTokens[i], NULL, pLkupProc, pPriv); if (pszRepl == NULL) return ErrGetErrorCode(); SysFree(ppszTokens[i]); ppszTokens[i] = pszRepl; } return 0; } int MscGetAddrString(SYS_INET_ADDR const &AddrInfo, char *pszAStr, int iSize) { char szIP[128] = ""; SysInetNToA(AddrInfo, szIP, sizeof(szIP)); SysSNPrintf(pszAStr, iSize, "[%s]:%d", szIP, SysGetAddrPort(AddrInfo)); return 0; } unsigned int MscServiceThread(void *pThreadData) { ThreadConfig const *pThCfg = (ThreadConfig const *) pThreadData; SysLogMessage(LOG_LEV_MESSAGE, "%s started\n", pThCfg->pszName); for (;;) { int iNumConnSockFD = 0; SYS_SOCKET ConnSockFD[MAX_ACCEPT_ADDRESSES]; if (MscAcceptServerConnection(pThCfg->SockFDs, pThCfg->iNumSockFDs, ConnSockFD, iNumConnSockFD, SERVICE_ACCEPT_TIMEOUT) < 0) { if (pThCfg->ulFlags & THCF_SHUTDOWN) break; continue; } for (int i = 0; i < iNumConnSockFD; i++) { SYS_THREAD hClientThread = SYS_INVALID_THREAD; ThreadCreateCtx *pThCtx = (ThreadCreateCtx *) SysAlloc(sizeof(ThreadCreateCtx)); if (pThCtx != NULL) { pThCtx->SockFD = ConnSockFD[i]; pThCtx->pThCfg = pThCfg; hClientThread = SysCreateThread(pThCfg->pfThreadProc, pThCtx); } if (hClientThread != SYS_INVALID_THREAD) SysCloseThread(hClientThread, 0); else { SysFree(pThCtx); SysCloseSocket(ConnSockFD[i]); } } } /* Wait for client completion */ for (int iTotalWait = 0; iTotalWait < MAX_CLIENTS_WAIT; iTotalWait += SERVICE_WAIT_SLEEP) { if ((*pThCfg->pfThreadCnt)(pThCfg) == 0) break; SysSleep(SERVICE_WAIT_SLEEP); } SysLogMessage(LOG_LEV_MESSAGE, "%s stopped\n", pThCfg->pszName); return 0; } int MscSslEnvCB(void *pPrivate, int iID, void const *pData) { SslBindEnv *pSslE = (SslBindEnv *) pPrivate; return 0; } int MscParseOptions(char const *pszOpts, int (*pfAssign)(void *, char const *, char const *), void *pPrivate) { char **ppszToks = StrTokenize(pszOpts, ",\r\n"); if (ppszToks == NULL) return ErrGetErrorCode(); for (int i = 0; ppszToks[i] != NULL; i++) { char *pszName = ppszToks[i]; char *pszValue = strchr(pszName, '='); if (pszValue != NULL) *pszValue++ = '\0'; if ((*pfAssign)(pPrivate, pszName, pszValue) < 0) { StrFreeStrings(ppszToks); return ErrGetErrorCode(); } } StrFreeStrings(ppszToks); return 0; } void MscSysFreeCB(void *pPrivate, void *pData) { SysFree(pData); } void MscRandomizeStringsOrder(char **ppszStrings) { int i, iCount = StrStringsCount(ppszStrings); for (i = 0; i < iCount - 1; i++) { int iChoice = rand() % (iCount - i); char *pszTmp = ppszStrings[i]; ppszStrings[i] = ppszStrings[i + iChoice]; ppszStrings[i + iChoice] = pszTmp; } } unsigned long MscStringHashCB(void *pPrivate, HashDatum const *pDatum) { char const *pszStr = (char const *) pDatum->pData; return MscHashString(pszStr, strlen(pszStr)); } int MscStringCompareCB(void *pPrivate, HashDatum const *pDatum1, HashDatum const *pDatum2) { return strcmp((char const *) pDatum1->pData, (char const *) pDatum2->pData); } xmail-1.27/MessQueue.cpp0000644000175000017500000006165511341640430014460 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "ResLocks.h" #include "StrUtils.h" #include "SList.h" #include "MD5.h" #include "Base64Enc.h" #include "BuffSock.h" #include "MailConfig.h" #include "UsrUtils.h" #include "SvrUtils.h" #include "AppDefines.h" #include "MiscUtils.h" #include "SMTPUtils.h" #include "MessQueue.h" #include "SMAILUtils.h" #define QUEF_SHUTDOWN (1 << 0) #define QUMF_DELETED (1 << 0) #define QUMF_FREEZE (1 << 1) #define QUE_MASK_TMPFLAGS(v) ((v) & ~(QUMF_DELETED | QUMF_FREEZE)) #define QUE_ARENA_SCAN_INTERVAL 15 #define QUE_ARENA_SCAN_WAIT 2 #define QUE_SCAN_THREAD_MAXWAIT 60 struct MessageQueue { SysListHead ReadyQueue; SysListHead RsndArenaQueue; int iReadyCount; int iRsndArenaCount; SYS_MUTEX hMutex; SYS_EVENT hReadyEvent; char *pszRootPath; int iMaxRetry; int iRetryTimeout; int iRetryIncrRatio; int iNumDirsLevel; unsigned long ulFlags; SYS_THREAD hRsndScanThread; }; struct QueueMessage { SysListHead LLink; int iLevel1; int iLevel2; char const *pszQueueDir; char *pszFileName; int iNumTries; time_t tLastTry; unsigned long ulFlags; }; static int QueGetFilePath(MessageQueue *pMQ, QueueMessage *pQM, char *pszFilePath, char const *pszQueueDir = NULL); static QueueMessage *QueAllocMessage(int iLevel1, int iLevel2, char const *pszQueueDir, char const *pszFileName, int iNumTries, time_t tLastTry) { QueueMessage *pQM = (QueueMessage *) SysAlloc(sizeof(QueueMessage)); if (pQM == NULL) return NULL; SYS_INIT_LIST_LINK(&pQM->LLink); pQM->iLevel1 = iLevel1; pQM->iLevel2 = iLevel2; pQM->pszQueueDir = pszQueueDir; pQM->pszFileName = SysStrDup(pszFileName); pQM->iNumTries = iNumTries; pQM->tLastTry = tLastTry; pQM->ulFlags = 0; return pQM; } static int QueFreeMessage(QueueMessage *pQM) { SysFree(pQM->pszFileName); SysFree(pQM); return 0; } static int QueFreeMessList(SysListHead *pHead) { SysListHead *pLLink; while ((pLLink = SYS_LIST_FIRST(pHead)) != NULL) { QueueMessage *pQM = SYS_LIST_ENTRY(pLLink, QueueMessage, LLink); SYS_LIST_DEL(pLLink); QueFreeMessage(pQM); } return 0; } static int QueCreateStruct(char const *pszRootPath) { /* Create message dir (new messages queue) */ char szDirPath[SYS_MAX_PATH]; StrSNCpy(szDirPath, pszRootPath); AppendSlash(szDirPath); StrSNCat(szDirPath, QUEUE_MESS_DIR); if (!SysExistDir(szDirPath) && SysMakeDir(szDirPath) < 0) return ErrGetErrorCode(); /* Create message resend dir (resend messages queue) */ StrSNCpy(szDirPath, pszRootPath); AppendSlash(szDirPath); StrSNCat(szDirPath, QUEUE_RSND_DIR); if (!SysExistDir(szDirPath) && SysMakeDir(szDirPath) < 0) return ErrGetErrorCode(); /* Create info dir */ StrSNCpy(szDirPath, pszRootPath); AppendSlash(szDirPath); StrSNCat(szDirPath, QUEUE_INFO_DIR); if (!SysExistDir(szDirPath) && SysMakeDir(szDirPath) < 0) return ErrGetErrorCode(); /* Create temp dir */ StrSNCpy(szDirPath, pszRootPath); AppendSlash(szDirPath); StrSNCat(szDirPath, QUEUE_TEMP_DIR); if (!SysExistDir(szDirPath) && SysMakeDir(szDirPath) < 0) return ErrGetErrorCode(); /* Create send log dir */ StrSNCpy(szDirPath, pszRootPath); AppendSlash(szDirPath); StrSNCat(szDirPath, QUEUE_SLOG_DIR); if (!SysExistDir(szDirPath) && SysMakeDir(szDirPath) < 0) return ErrGetErrorCode(); /* Create custom message processing dir */ StrSNCpy(szDirPath, pszRootPath); AppendSlash(szDirPath); StrSNCat(szDirPath, QUEUE_CUST_DIR); if (!SysExistDir(szDirPath) && SysMakeDir(szDirPath) < 0) return ErrGetErrorCode(); /* Create user custom message processing dir (mailproc.tab cache) */ StrSNCpy(szDirPath, pszRootPath); AppendSlash(szDirPath); StrSNCat(szDirPath, QUEUE_MPRC_DIR); if (!SysExistDir(szDirPath) && SysMakeDir(szDirPath) < 0) return ErrGetErrorCode(); /* Create frozen dir */ StrSNCpy(szDirPath, pszRootPath); AppendSlash(szDirPath); StrSNCat(szDirPath, QUEUE_FROZ_DIR); if (!SysExistDir(szDirPath) && SysMakeDir(szDirPath) < 0) return ErrGetErrorCode(); return 0; } static int QueLoadMessageStat(MessageQueue *pMQ, QueueMessage *pQM) { /* Build the slog file path */ char szSlogFilePath[SYS_MAX_PATH]; QueGetFilePath(pMQ, pQM, szSlogFilePath, QUEUE_SLOG_DIR); /* Try to load message statistics */ FILE *pLogFile = fopen(szSlogFilePath, "rt"); if (pLogFile != NULL) { int iNumTries = 0; unsigned long ulLastTime = 0, ulPeekTime; char szLogLine[1024]; while (MscFGets(szLogLine, sizeof(szLogLine) - 1, pLogFile) != NULL) if (sscanf(szLogLine, "[PeekTime] %lu", &ulPeekTime) == 1) ++iNumTries, ulLastTime = ulPeekTime; fclose(pLogFile); pQM->iNumTries = iNumTries; pQM->tLastTry = (time_t) ulLastTime; } return 0; } static int QueLoadMessages(MessageQueue *pMQ, int iLevel1, int iLevel2) { /* File scan the new messages dir */ char szDirPath[SYS_MAX_PATH]; SysSNPrintf(szDirPath, sizeof(szDirPath) - 1, "%s%d%s%d%s%s", pMQ->pszRootPath, iLevel1, SYS_SLASH_STR, iLevel2, SYS_SLASH_STR, QUEUE_MESS_DIR); char szMsgFileName[SYS_MAX_PATH]; FSCAN_HANDLE hFileScan = MscFirstFile(szDirPath, 0, szMsgFileName, sizeof(szMsgFileName)); if (hFileScan != INVALID_FSCAN_HANDLE) { do { if (!IsDotFilename(szMsgFileName)) { QueueMessage *pQM = QueAllocMessage(iLevel1, iLevel2, QUEUE_MESS_DIR, szMsgFileName, 0, 0); if (pQM != NULL) { /* Add the file to the message queue */ SYS_LIST_ADDT(&pQM->LLink, &pMQ->ReadyQueue); ++pMQ->iReadyCount; } } } while (MscNextFile(hFileScan, szMsgFileName, sizeof(szMsgFileName))); MscCloseFindFile(hFileScan); /* Set the mess event if the queue is not empty */ if (pMQ->iReadyCount > 0) SysSetEvent(pMQ->hReadyEvent); } /* File scan the resend messages dir */ SysSNPrintf(szDirPath, sizeof(szDirPath) - 1, "%s%d%s%d%s%s", pMQ->pszRootPath, iLevel1, SYS_SLASH_STR, iLevel2, SYS_SLASH_STR, QUEUE_RSND_DIR); if ((hFileScan = MscFirstFile(szDirPath, 0, szMsgFileName, sizeof(szMsgFileName))) != INVALID_FSCAN_HANDLE) { do { if (!IsDotFilename(szMsgFileName)) { QueueMessage *pQM = QueAllocMessage(iLevel1, iLevel2, QUEUE_RSND_DIR, szMsgFileName, 0, 0); if (pQM != NULL) { /* Load message statistics */ if (QueLoadMessageStat(pMQ, pQM) < 0) { SysLogMessage(LOG_LEV_ERROR, "Error loading queue file: '%s%d%s%d%s%s%s%s'\n", pMQ->pszRootPath, iLevel1, SYS_SLASH_STR, iLevel2, SYS_SLASH_STR, QUEUE_RSND_DIR, SYS_SLASH_STR, szMsgFileName); QueFreeMessage(pQM); } else { /* Add the file to the resend queue */ SYS_LIST_ADDT(&pQM->LLink, &pMQ->RsndArenaQueue); ++pMQ->iRsndArenaCount; } } } } while (MscNextFile(hFileScan, szMsgFileName, sizeof(szMsgFileName))); MscCloseFindFile(hFileScan); } return 0; } static int QueLoad(MessageQueue *pMQ) { char szCurrPath[SYS_MAX_PATH]; for (int i = 0; i < pMQ->iNumDirsLevel; i++) { SysSNPrintf(szCurrPath, sizeof(szCurrPath) - 1, "%s%d", pMQ->pszRootPath, i); if (!SysExistDir(szCurrPath) && (SysMakeDir(szCurrPath) < 0)) return ErrGetErrorCode(); for (int j = 0; j < pMQ->iNumDirsLevel; j++) { SysSNPrintf(szCurrPath, sizeof(szCurrPath) - 1, "%s%d%s%d", pMQ->pszRootPath, i, SYS_SLASH_STR, j); if (!SysExistDir(szCurrPath) && (SysMakeDir(szCurrPath) < 0)) return ErrGetErrorCode(); if (QueCreateStruct(szCurrPath) < 0 || QueLoadMessages(pMQ, i, j) < 0) return ErrGetErrorCode(); } } return 0; } static time_t QueNextRetryOp(int iNumTries, unsigned int uRetryTimeout, unsigned int uRetryIncrRatio) { unsigned int uNextOp = uRetryTimeout; if (uRetryIncrRatio != 0) for (int i = 1; i < iNumTries; i++) uNextOp += uNextOp / uRetryIncrRatio; return (time_t) uNextOp; } static bool QueMessageReadyToSend(MessageQueue *pMQ, QueueMessage *pQM) { return (time(NULL) > (pQM->tLastTry + QueNextRetryOp(pQM->iNumTries, (unsigned int) pMQ->iRetryTimeout, (unsigned int) pMQ->iRetryIncrRatio))); } static int QueScanRsndArena(MessageQueue *pMQ) { if (SysLockMutex(pMQ->hMutex, SYS_INFINITE_TIMEOUT) < 0) return ErrGetErrorCode(); SysListHead *pLLink; SYS_LIST_FOR_EACH(pLLink, &pMQ->RsndArenaQueue) { QueueMessage *pQM = SYS_LIST_ENTRY(pLLink, QueueMessage, LLink); if (QueMessageReadyToSend(pMQ, pQM)) { /* Set the list pointer to the next item */ pLLink = pLLink->pPrev; /* Remove item from resend arena */ SYS_LIST_DEL(&pQM->LLink); --pMQ->iRsndArenaCount; /* Add item from resend queue */ SYS_LIST_ADDT(&pQM->LLink, &pMQ->ReadyQueue); ++pMQ->iReadyCount; } } if (pMQ->iReadyCount > 0) SysSetEvent(pMQ->hReadyEvent); SysUnlockMutex(pMQ->hMutex); return 0; } static unsigned int QueRsndThread(void *pThreadData) { MessageQueue *pMQ = (MessageQueue *) pThreadData; int iElapsedTime = 0; while ((pMQ->ulFlags & QUEF_SHUTDOWN) == 0) { SysSleep(QUE_ARENA_SCAN_WAIT); iElapsedTime += QUE_ARENA_SCAN_WAIT; if (iElapsedTime > QUE_ARENA_SCAN_INTERVAL) { iElapsedTime = 0; /* Scan rsnd arena to prepare messages to resend */ QueScanRsndArena(pMQ); } } pMQ->ulFlags &= ~QUEF_SHUTDOWN; return 0; } QUEUE_HANDLE QueOpen(char const *pszRootPath, int iMaxRetry, int iRetryTimeout, int iRetryIncrRatio, int iNumDirsLevel) { MessageQueue *pMQ = (MessageQueue *) SysAlloc(sizeof(MessageQueue)); if (pMQ == NULL) return INVALID_QUEUE_HANDLE; SYS_INIT_LIST_HEAD(&pMQ->ReadyQueue); SYS_INIT_LIST_HEAD(&pMQ->RsndArenaQueue); pMQ->iReadyCount = 0; pMQ->iRsndArenaCount = 0; pMQ->iMaxRetry = iMaxRetry; pMQ->iRetryTimeout = iRetryTimeout; pMQ->iRetryIncrRatio = iRetryIncrRatio; pMQ->iNumDirsLevel = iNumDirsLevel; pMQ->ulFlags = 0; if ((pMQ->hMutex = SysCreateMutex()) == SYS_INVALID_MUTEX) { SysFree(pMQ); return INVALID_QUEUE_HANDLE; } if ((pMQ->hReadyEvent = SysCreateEvent(1)) == SYS_INVALID_EVENT) { SysCloseMutex(pMQ->hMutex); SysFree(pMQ); return INVALID_QUEUE_HANDLE; } /* Set the queue root path */ char szRootPath[SYS_MAX_PATH]; StrSNCpy(szRootPath, pszRootPath); AppendSlash(szRootPath); pMQ->pszRootPath = SysStrDup(szRootPath); /* Load queue status */ if (QueLoad(pMQ) < 0) { ErrorPush(); SysFree(pMQ->pszRootPath); SysCloseEvent(pMQ->hReadyEvent); SysCloseMutex(pMQ->hMutex); SysFree(pMQ); ErrSetErrorCode(ErrorPop()); return INVALID_QUEUE_HANDLE; } /* Start rsnd arena scan thread */ if ((pMQ->hRsndScanThread = SysCreateThread(QueRsndThread, pMQ)) == SYS_INVALID_THREAD) { ErrorPush(); QueFreeMessList(&pMQ->ReadyQueue); QueFreeMessList(&pMQ->RsndArenaQueue); SysFree(pMQ->pszRootPath); SysCloseEvent(pMQ->hReadyEvent); SysCloseMutex(pMQ->hMutex); SysFree(pMQ); ErrSetErrorCode(ErrorPop()); return INVALID_QUEUE_HANDLE; } return (QUEUE_HANDLE) pMQ; } int QueClose(QUEUE_HANDLE hQueue) { MessageQueue *pMQ = (MessageQueue *) hQueue; /* Set the shutdown flag and wait for rsnd scan thread to terminate */ pMQ->ulFlags |= QUEF_SHUTDOWN; SysWaitThread(pMQ->hRsndScanThread, QUE_SCAN_THREAD_MAXWAIT); SysCloseThread(pMQ->hRsndScanThread, 1); /* Clear queues */ QueFreeMessList(&pMQ->ReadyQueue); QueFreeMessList(&pMQ->RsndArenaQueue); SysCloseEvent(pMQ->hReadyEvent); SysCloseMutex(pMQ->hMutex); SysFree(pMQ->pszRootPath); SysFree(pMQ); return 0; } int QueGetDirsLevel(QUEUE_HANDLE hQueue) { MessageQueue *pMQ = (MessageQueue *) hQueue; return pMQ->iNumDirsLevel; } char const *QueGetRootPath(QUEUE_HANDLE hQueue) { MessageQueue *pMQ = (MessageQueue *) hQueue; return pMQ->pszRootPath; } char *QueLoadLastLogEntry(char const *pszLogFilePath) { FILE *pLogFile = fopen(pszLogFilePath, "rb"); if (pLogFile == NULL) { ErrSetErrorCode(ERR_FILE_OPEN, pszLogFilePath); return NULL; } SYS_OFF_T llCurrOffset = 0, llBaseOffset = (SYS_OFF_T) -1, llEndOffset; unsigned long ulPeekTime; char szLogLine[1024]; for (;;) { llCurrOffset = Sys_ftell(pLogFile); if (MscFGets(szLogLine, sizeof(szLogLine) - 1, pLogFile) == NULL) break; if (sscanf(szLogLine, "[PeekTime] %lu", &ulPeekTime) == 1) llBaseOffset = llCurrOffset; } if (llBaseOffset == (SYS_OFF_T) -1) { fclose(pLogFile); ErrSetErrorCode(ERR_EMPTY_LOG, pszLogFilePath); return NULL; } /* Get end offset (end of file) */ Sys_fseek(pLogFile, 0, SEEK_END); llEndOffset = Sys_ftell(pLogFile); /* Load last entry */ unsigned int uEntrySize = (unsigned int) (llEndOffset - llBaseOffset); char *pszEntry = (char *) SysAlloc(uEntrySize + 1); if (pszEntry == NULL) { fclose(pLogFile); return NULL; } Sys_fseek(pLogFile, llBaseOffset, SEEK_SET); if (!fread(pszEntry, uEntrySize, 1, pLogFile)) { SysFree(pszEntry); fclose(pLogFile); ErrSetErrorCode(ERR_FILE_READ, pszLogFilePath); return NULL; } pszEntry[uEntrySize] = '\0'; fclose(pLogFile); return pszEntry; } static int QueStatMessage(MessageQueue *pMQ, QueueMessage *pQM) { /* Build the slog file path */ char szSlogFilePath[SYS_MAX_PATH]; QueGetFilePath(pMQ, pQM, szSlogFilePath, QUEUE_SLOG_DIR); FILE *pLogFile = fopen(szSlogFilePath, "a+t"); if (pLogFile == NULL) { ErrSetErrorCode(ERR_FILE_OPEN, szSlogFilePath); return ERR_FILE_OPEN; } /* Dump peek time */ time_t tCurr = time(NULL); char szTime[128]; MscGetTimeStr(szTime, sizeof(szTime) - 1, tCurr); fprintf(pLogFile, "[PeekTime] %lu : %s\n", (unsigned long) tCurr, szTime); fclose(pLogFile); return 0; } QMSG_HANDLE QueCreateMessage(QUEUE_HANDLE hQueue) { MessageQueue *pMQ = (MessageQueue *) hQueue; /* Build message file path */ int iLevel1 = rand() % pMQ->iNumDirsLevel; int iLevel2 = rand() % pMQ->iNumDirsLevel; char szSubPath[SYS_MAX_PATH]; char szMsgFilePath[SYS_MAX_PATH]; SysSNPrintf(szSubPath, sizeof(szSubPath) - 1, "%s%d%s%d%s%s", pMQ->pszRootPath, iLevel1, SYS_SLASH_STR, iLevel2, SYS_SLASH_STR, QUEUE_TEMP_DIR); if (MscUniqueFile(szSubPath, szMsgFilePath, sizeof(szMsgFilePath)) < 0) return INVALID_QMSG_HANDLE; /* Extract file name */ char szMsgFileName[SYS_MAX_PATH]; MscGetFileName(szMsgFilePath, szMsgFileName); /* Create queue message data */ QueueMessage *pQM = QueAllocMessage(iLevel1, iLevel2, QUEUE_TEMP_DIR, szMsgFileName, 0, 0); if (pQM == NULL) return INVALID_QMSG_HANDLE; return (QMSG_HANDLE) pQM; } static int QueGetFilePath(MessageQueue *pMQ, QueueMessage *pQM, char *pszFilePath, char const *pszQueueDir) { if (pszQueueDir == NULL) pszQueueDir = pQM->pszQueueDir; SysSNPrintf(pszFilePath, SYS_MAX_PATH - 1, "%s%d%s%d%s%s%s%s", pMQ->pszRootPath, pQM->iLevel1, SYS_SLASH_STR, pQM->iLevel2, SYS_SLASH_STR, pszQueueDir, SYS_SLASH_STR, pQM->pszFileName); return 0; } int QueGetFilePath(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char *pszFilePath, char const *pszQueueDir) { MessageQueue *pMQ = (MessageQueue *) hQueue; QueueMessage *pQM = (QueueMessage *) hMessage; return QueGetFilePath(pMQ, pQM, pszFilePath, pszQueueDir); } static int QueDoMessageCleanup(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage) { MessageQueue *pMQ = (MessageQueue *) hQueue; QueueMessage *pQM = (QueueMessage *) hMessage; char szQueueFilePath[SYS_MAX_PATH]; if (pQM->ulFlags & QUMF_FREEZE) { /* Move message file */ char szTargetFile[SYS_MAX_PATH]; QueGetFilePath(pMQ, pQM, szQueueFilePath); QueGetFilePath(pMQ, pQM, szTargetFile, QUEUE_FROZ_DIR); if (SysMoveFile(szQueueFilePath, szTargetFile) < 0) return ErrGetErrorCode(); /* Change message location */ pQM->pszQueueDir = QUEUE_FROZ_DIR; } else { /* Clean message file */ QueGetFilePath(pMQ, pQM, szQueueFilePath); SysRemove(szQueueFilePath); /* Clean 'info' file */ QueGetFilePath(pMQ, pQM, szQueueFilePath, QUEUE_INFO_DIR); SysRemove(szQueueFilePath); /* Clean 'slog' file */ QueGetFilePath(pMQ, pQM, szQueueFilePath, QUEUE_SLOG_DIR); SysRemove(szQueueFilePath); } /* Clean 'temp' file */ QueGetFilePath(pMQ, pQM, szQueueFilePath, QUEUE_TEMP_DIR); SysRemove(szQueueFilePath); /* Clean 'cust' file */ QueGetFilePath(pMQ, pQM, szQueueFilePath, QUEUE_CUST_DIR); SysRemove(szQueueFilePath); /* Clean 'mprc' file */ QueGetFilePath(pMQ, pQM, szQueueFilePath, QUEUE_MPRC_DIR); SysRemove(szQueueFilePath); return 0; } int QueCloseMessage(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage) { MessageQueue *pMQ = (MessageQueue *) hQueue; QueueMessage *pQM = (QueueMessage *) hMessage; if (pQM->ulFlags & QUMF_DELETED) QueDoMessageCleanup(hQueue, hMessage); QueFreeMessage(pQM); return 0; } QMSG_HANDLE QueGetHandle(QUEUE_HANDLE hQueue, int iLevel1, int iLevel2, char const *pszQueueDir, char const *pszFileName) { MessageQueue *pMQ = (MessageQueue *) hQueue; QueueMessage *pQM = QueAllocMessage(iLevel1, iLevel2, pszQueueDir, pszFileName, 0, 0); if (pQM == NULL) return INVALID_QMSG_HANDLE; /* Load message statistics */ QueLoadMessageStat(pMQ, pQM); return (QMSG_HANDLE) pQM; } char const *QueGetFileName(QMSG_HANDLE hMessage) { QueueMessage *pQM = (QueueMessage *) hMessage; return pQM->pszFileName; } char const *QueGetQueueDir(QMSG_HANDLE hMessage) { QueueMessage *pQM = (QueueMessage *) hMessage; return pQM->pszQueueDir; } int QueGetLevel1(QMSG_HANDLE hMessage) { QueueMessage *pQM = (QueueMessage *) hMessage; return pQM->iLevel1; } int QueGetLevel2(QMSG_HANDLE hMessage) { QueueMessage *pQM = (QueueMessage *) hMessage; return pQM->iLevel2; } int QueGetTryCount(QMSG_HANDLE hMessage) { QueueMessage *pQM = (QueueMessage *) hMessage; return pQM->iNumTries; } time_t QueGetLastTryTime(QMSG_HANDLE hMessage) { QueueMessage *pQM = (QueueMessage *) hMessage; return pQM->tLastTry; } time_t QueGetMessageNextOp(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage) { MessageQueue *pMQ = (MessageQueue *) hQueue; QueueMessage *pQM = (QueueMessage *) hMessage; return pQM->tLastTry + QueNextRetryOp(pQM->iNumTries, (unsigned int) pMQ->iRetryTimeout, (unsigned int) pMQ->iRetryIncrRatio); } int QueInitMessageStats(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage) { MessageQueue *pMQ = (MessageQueue *) hQueue; QueueMessage *pQM = (QueueMessage *) hMessage; char szQueueFilePath[SYS_MAX_PATH]; QueGetFilePath(pMQ, pQM, szQueueFilePath, QUEUE_SLOG_DIR); SysRemove(szQueueFilePath); /* Init message statistics */ pQM->iNumTries = 0; pQM->tLastTry = 0; return 0; } int QueCleanupMessage(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, bool bFreeze) { MessageQueue *pMQ = (MessageQueue *) hQueue; QueueMessage *pQM = (QueueMessage *) hMessage; pQM->ulFlags |= QUMF_DELETED; if (bFreeze) pQM->ulFlags |= QUMF_FREEZE; return 0; } static int QueAddNew(MessageQueue *pMQ, QueueMessage *pQM) { /* Add the queue entry */ if (SysLockMutex(pMQ->hMutex, SYS_INFINITE_TIMEOUT) < 0) return ErrGetErrorCode(); SYS_LIST_ADDT(&pQM->LLink, &pMQ->ReadyQueue); ++pMQ->iReadyCount; SysSetEvent(pMQ->hReadyEvent); SysUnlockMutex(pMQ->hMutex); return 0; } int QueCommitMessage(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage) { MessageQueue *pMQ = (MessageQueue *) hQueue; QueueMessage *pQM = (QueueMessage *) hMessage; /* Move message file (if not in mess) */ if (strcmp(pQM->pszQueueDir, QUEUE_MESS_DIR) != 0) { char szSourceFile[SYS_MAX_PATH]; char szTargetFile[SYS_MAX_PATH]; QueGetFilePath(pMQ, pQM, szSourceFile); QueGetFilePath(pMQ, pQM, szTargetFile, QUEUE_MESS_DIR); if (SysMoveFile(szSourceFile, szTargetFile) < 0) return ErrGetErrorCode(); /* Change message location */ pQM->pszQueueDir = QUEUE_MESS_DIR; } /* Unmask temporary flags */ pQM->ulFlags = QUE_MASK_TMPFLAGS(pQM->ulFlags); /* Add to queue */ if (QueAddNew(pMQ, pQM) < 0) return ErrGetErrorCode(); return 0; } static bool QueMessageExpired(MessageQueue *pMQ, QueueMessage *pQM) { return pQM->iNumTries >= pMQ->iMaxRetry; } static int QueAddRsnd(MessageQueue *pMQ, QueueMessage *pQM) { /* Add the queue entry */ if (SysLockMutex(pMQ->hMutex, SYS_INFINITE_TIMEOUT) < 0) return ErrGetErrorCode(); SYS_LIST_ADDT(&pQM->LLink, &pMQ->RsndArenaQueue); ++pMQ->iRsndArenaCount; SysUnlockMutex(pMQ->hMutex); return 0; } int QueResendMessage(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage) { MessageQueue *pMQ = (MessageQueue *) hQueue; QueueMessage *pQM = (QueueMessage *) hMessage; /* Check for message expired */ if (QueMessageExpired(pMQ, pQM)) { ErrSetErrorCode(ERR_SPOOL_FILE_EXPIRED); return ERR_SPOOL_FILE_EXPIRED; } /* Move message file (if not in rsnd dir) */ if (strcmp(pQM->pszQueueDir, QUEUE_RSND_DIR) != 0) { char szSourceFile[SYS_MAX_PATH]; char szTargetFile[SYS_MAX_PATH]; QueGetFilePath(pMQ, pQM, szSourceFile); QueGetFilePath(pMQ, pQM, szTargetFile, QUEUE_RSND_DIR); if (SysMoveFile(szSourceFile, szTargetFile) < 0) return ErrGetErrorCode(); /* Change message location */ pQM->pszQueueDir = QUEUE_RSND_DIR; } /* Unmask temporary flags */ pQM->ulFlags = QUE_MASK_TMPFLAGS(pQM->ulFlags); /* Add to queue */ if (QueAddRsnd(pMQ, pQM) < 0) return ErrGetErrorCode(); return 0; } QMSG_HANDLE QueExtractMessage(QUEUE_HANDLE hQueue, int iTimeout) { MessageQueue *pMQ = (MessageQueue *) hQueue; /* Wait for message available */ if (SysWaitEvent(pMQ->hReadyEvent, iTimeout) < 0) return INVALID_QMSG_HANDLE; if (SysLockMutex(pMQ->hMutex, SYS_INFINITE_TIMEOUT) < 0) return INVALID_QMSG_HANDLE; /* Get the first message of the queue */ SysListHead *pLLink = SYS_LIST_FIRST(&pMQ->ReadyQueue); if (pLLink == NULL) { SysUnlockMutex(pMQ->hMutex); return INVALID_QMSG_HANDLE; } /* Remove the message from the list */ SYS_LIST_DEL(pLLink); /* Decrement message count by resetting the event if no more messages are in */ if (--pMQ->iReadyCount == 0) SysResetEvent(pMQ->hReadyEvent); SysUnlockMutex(pMQ->hMutex); /* Get queue message pointer */ QueueMessage *pQM = SYS_LIST_ENTRY(pLLink, QueueMessage, LLink); /* Update message statistics */ ++pQM->iNumTries; pQM->tLastTry = time(NULL); /* Update log file */ QueStatMessage(pMQ, pQM); return (QMSG_HANDLE) pQM; } int QueCheckMessage(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage) { MessageQueue *pMQ = (MessageQueue *) hQueue; QueueMessage *pQM = (QueueMessage *) hMessage; char szQueueFilePath[SYS_MAX_PATH]; if (pQM->ulFlags & QUMF_DELETED) { ErrSetErrorCode(ERR_MESSAGE_DELETED); return ERR_MESSAGE_DELETED; } QueGetFilePath(hQueue, hMessage, szQueueFilePath, QUEUE_MESS_DIR); if (!SysExistFile(szQueueFilePath)) { QueGetFilePath(hQueue, hMessage, szQueueFilePath, QUEUE_RSND_DIR); if (!SysExistFile(szQueueFilePath)) { ErrSetErrorCode(ERR_NO_MESSAGE_FILE); return ERR_NO_MESSAGE_FILE; } } return 0; } static bool QueMessageDestMatch(MessageQueue *pMQ, QueueMessage *pQM, char const *pszAddressMatch) { SpoolFileHeader SFH; char szQueueFilePath[SYS_MAX_PATH]; QueGetFilePath(pMQ, pQM, szQueueFilePath); if (USmlLoadSpoolFileHeader(szQueueFilePath, SFH) < 0) return false; bool bAddressMatch = false; if (strchr(pszAddressMatch, '@') == NULL) { /* RFC style ETRN (domain based) */ char szDestUser[MAX_ADDR_NAME]; char szDestDomain[MAX_ADDR_NAME]; if (StrStringsCount(SFH.ppszRcpt) < 1 || USmtpSplitEmailAddr(SFH.ppszRcpt[0], szDestUser, szDestDomain) < 0) { USmlCleanupSpoolFileHeader(SFH); return false; } bAddressMatch = (StrIWildMatch(szDestDomain, pszAddressMatch) != 0); } else { /* XMail style ETRN (email based) */ bAddressMatch = (StrIWildMatch(SFH.ppszRcpt[0], pszAddressMatch) != 0); } USmlCleanupSpoolFileHeader(SFH); return bAddressMatch; } int QueFlushRsndArena(QUEUE_HANDLE hQueue, char const *pszAddressMatch) { MessageQueue *pMQ = (MessageQueue *) hQueue; if (SysLockMutex(pMQ->hMutex, SYS_INFINITE_TIMEOUT) < 0) return ErrGetErrorCode(); SysListHead *pLLink; SYS_LIST_FOR_EACH(pLLink, &pMQ->RsndArenaQueue) { QueueMessage *pQM = SYS_LIST_ENTRY(pLLink, QueueMessage, LLink); if (pszAddressMatch == NULL || QueMessageDestMatch(pMQ, pQM, pszAddressMatch)) { /* Set the list pointer to the next item */ pLLink = pLLink->pPrev; /* Remove item from resend arena */ SYS_LIST_DEL(&pQM->LLink); --pMQ->iRsndArenaCount; /* Add item from resend queue */ SYS_LIST_ADDT(&pQM->LLink, &pMQ->ReadyQueue); ++pMQ->iReadyCount; } } /* If the count of rsnd queue is not zero, set the event */ if (pMQ->iReadyCount > 0) SysSetEvent(pMQ->hReadyEvent); SysUnlockMutex(pMQ->hMutex); return 0; } xmail-1.27/mkerrors.sh0000755000175000017500000000024711341640430014231 0ustar davidedavide#!/bin/sh CURR=0 for e in `grep '__ERR_' Errors.h | grep -v '\-' | egrep -o '__[^, ]+' `; do echo "$CURR --> $e" CURR=`expr $CURR + 1` done | sed 's/__//g' xmail-1.27/SMTPUtils.cpp0000644000175000017500000015216611341640430014346 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "ResLocks.h" #include "StrUtils.h" #include "SList.h" #include "BuffSock.h" #include "SSLBind.h" #include "SSLConfig.h" #include "MailConfig.h" #include "UsrUtils.h" #include "UsrAuth.h" #include "SvrUtils.h" #include "MiscUtils.h" #include "DNS.h" #include "DNSCache.h" #include "MessQueue.h" #include "SMAILUtils.h" #include "QueueUtils.h" #include "SMTPSvr.h" #include "SMTPUtils.h" #include "Base64Enc.h" #include "MD5.h" #include "MailSvr.h" #define STD_SMTP_TIMEOUT STD_SERVER_TIMEOUT #define SMTPGW_LINE_MAX 1024 #define SMTPGW_TABLE_FILE "smtpgw.tab" #define SMTPFWD_LINE_MAX 1024 #define SMTPFWD_TABLE_FILE "smtpfwd.tab" #define SMTPRELAY_LINE_MAX 512 #define SMTP_RELAY_FILE "smtprelay.tab" #define MAX_MX_RECORDS 32 #define SMTP_SPAMMERS_FILE "spammers.tab" #define SMTP_SPAM_ADDRESS_FILE "spam-address.tab" #define SPAMMERS_LINE_MAX 512 #define SPAM_ADDRESS_LINE_MAX 512 #define SMTPAUTH_LINE_MAX 512 #define SMTPCH_SUPPORT_SIZE (1 << 0) #define SMTPCH_SUPPORT_TLS (1 << 1) enum SmtpGwFileds { gwDomain = 0, gwGateway, gwMax }; enum SmtpFwdFileds { fwdDomain = 0, fwdGateway, fwdOptions, fwdMax }; enum SmtpRelayFileds { rlyFromIP = 0, rlyFromMask, rlyMax }; enum SpammerFileds { spmFromIP = 0, spmFromMask, spmMax }; struct SmtpMXRecords { int iNumMXRecords; int iMXCost[MAX_MX_RECORDS]; char *pszMXName[MAX_MX_RECORDS]; int iCurrMxCost; }; struct SmtpChannel { BSOCK_HANDLE hBSock; unsigned long ulFlags; unsigned long ulMaxMsgSize; SYS_INET_ADDR SvrAddr; char *pszServer; char *pszDomain; }; static int USmtpGetResponse(BSOCK_HANDLE hBSock, char *pszResponse, int iMaxResponse, int iTimeout = STD_SMTP_TIMEOUT); static int USmtpSendCommand(BSOCK_HANDLE hBSock, char const *pszCommand, char *pszResponse, int iMaxResponse, int iTimeout = STD_SMTP_TIMEOUT); static char *USmtpGetGwTableFilePath(char *pszGwFilePath, int iMaxPath) { CfgGetRootPath(pszGwFilePath, iMaxPath); StrNCat(pszGwFilePath, SMTPGW_TABLE_FILE, iMaxPath); return pszGwFilePath; } static char *USmtpGetFwdTableFilePath(char *pszFwdFilePath, int iMaxPath) { CfgGetRootPath(pszFwdFilePath, iMaxPath); StrNCat(pszFwdFilePath, SMTPFWD_TABLE_FILE, iMaxPath); return pszFwdFilePath; } static void USmtpCleanupGateway(SMTPGateway *pGw) { SysFree(pGw->pszHost); SysFree(pGw->pszIFace); } static void USmtpFreeGateway(SMTPGateway *pGw) { USmtpCleanupGateway(pGw); SysFree(pGw); } static SMTPGateway *USmtpCloneGateway(SMTPGateway const *pRefGw, char const *pszHost) { SMTPGateway *pGw; if ((pGw = (SMTPGateway *) SysAlloc(sizeof(SMTPGateway))) == NULL) return NULL; pGw->ulFlags = pRefGw->ulFlags; pGw->pszHost = SysStrDup(pszHost); pGw->pszIFace = (pRefGw->pszIFace) ? SysStrDup(pRefGw->pszIFace): NULL; return pGw; } static int USmtpOptionsAssign(void *pPrivate, char const *pszName, char const *pszValue) { SMTPGateway *pGw = (SMTPGateway *) pPrivate; if (strcmp(pszName, "NeedTLS") == 0) { if (pszValue != NULL) { int iNeedTLS = atoi(pszValue); pGw->ulFlags &= ~(SMTP_GWF_USE_TLS | SMTP_GWF_FORCE_TLS); if (iNeedTLS >= 1) pGw->ulFlags |= SMTP_GWF_USE_TLS; if (iNeedTLS == 2) pGw->ulFlags |= SMTP_GWF_FORCE_TLS; } } else if (strcmp(pszName, "OutBind") == 0) { if (pszValue != NULL) { SysFree(pGw->pszIFace); pGw->pszIFace = SysStrDup(pszValue); } } return 0; } static int USmtpSetGwOptions(SMTPGateway *pGw, char const *pszOptions) { return MscParseOptions(pszOptions, USmtpOptionsAssign, pGw); } SMTPGateway **USmtpMakeGateways(char const * const *ppszGwHosts, char const **ppszOptions) { int i, iNumGws = StrStringsCount(ppszGwHosts); SMTPGateway **ppGws; SMTPGateway GwOpts; ZeroData(GwOpts); if (ppszOptions != NULL) { for (i = 0; ppszOptions[i] != NULL; i++) { if (USmtpSetGwOptions(&GwOpts, ppszOptions[i]) < 0) { USmtpCleanupGateway(&GwOpts); return NULL; } } } if ((ppGws = (SMTPGateway **) SysAlloc((iNumGws + 1) * sizeof(SMTPGateway *))) == NULL) { USmtpCleanupGateway(&GwOpts); return NULL; } for (i = 0; i < iNumGws; i++) { if ((ppGws[i] = USmtpCloneGateway(&GwOpts, ppszGwHosts[i])) == NULL) { for (i--; i >= 0; i--) USmtpFreeGateway(ppGws[i]); USmtpCleanupGateway(&GwOpts); SysFree(ppGws); return NULL; } } ppGws[i] = NULL; USmtpCleanupGateway(&GwOpts); return ppGws; } void USmtpFreeGateways(SMTPGateway **ppGws) { if (ppGws != NULL) for (int i = 0; ppGws[i] != NULL; i++) USmtpFreeGateway(ppGws[i]); SysFree(ppGws); } SMTPGateway **USmtpGetCfgGateways(SVRCFG_HANDLE hSvrConfig, char const * const *ppszGwHosts, char const *pszOptions) { int i = 0; char *pszCfgOptions; SMTPGateway **ppGws; char const *pszGwOptions[8]; if ((pszCfgOptions = SvrGetConfigVar(hSvrConfig, "SmtpGwConfig")) != NULL) pszGwOptions[i++] = pszCfgOptions; if (pszOptions != NULL) pszGwOptions[i++] = pszOptions; pszGwOptions[i] = NULL; ppGws = USmtpMakeGateways(ppszGwHosts, pszGwOptions); SysFree(pszCfgOptions); return ppGws; } SMTPGateway **USmtpGetFwdGateways(SVRCFG_HANDLE hSvrConfig, char const *pszDomain) { char szFwdFilePath[SYS_MAX_PATH] = ""; USmtpGetFwdTableFilePath(szFwdFilePath, sizeof(szFwdFilePath)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szFwdFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return NULL; FILE *pFwdFile = fopen(szFwdFilePath, "rt"); if (pFwdFile == NULL) { RLckUnlockSH(hResLock); ErrSetErrorCode(ERR_SMTPFWD_FILE_NOT_FOUND); return NULL; } char szFwdLine[SMTPFWD_LINE_MAX] = ""; while (MscGetConfigLine(szFwdLine, sizeof(szFwdLine) - 1, pFwdFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szFwdLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= fwdOptions && StrIWildMatch(pszDomain, ppszStrings[fwdDomain])) { char **ppszFwdGws = NULL; SMTPGateway **ppGws = NULL; if (ppszStrings[fwdGateway][0] == '#') { if ((ppszFwdGws = StrTokenize(ppszStrings[fwdGateway] + 1, ";")) != NULL) MscRandomizeStringsOrder(ppszFwdGws); } else ppszFwdGws = StrTokenize(ppszStrings[fwdGateway], ";"); if (ppszFwdGws != NULL) { ppGws = USmtpGetCfgGateways(hSvrConfig, ppszFwdGws, iFieldsCount > fwdOptions ? ppszStrings[fwdOptions]: NULL); StrFreeStrings(ppszFwdGws); } StrFreeStrings(ppszStrings); fclose(pFwdFile); RLckUnlockSH(hResLock); return ppGws; } StrFreeStrings(ppszStrings); } fclose(pFwdFile); RLckUnlockSH(hResLock); ErrSetErrorCode(ERR_SMTPFWD_NOT_FOUND); return NULL; } static char *USmtpGetRelayFilePath(char *pszRelayFilePath, int iMaxPath) { CfgGetRootPath(pszRelayFilePath, iMaxPath); StrNCat(pszRelayFilePath, SMTP_RELAY_FILE, iMaxPath); return pszRelayFilePath; } int USmtpGetGateway(SVRCFG_HANDLE hSvrConfig, char const *pszDomain, char *pszGateway, int iSize) { char szGwFilePath[SYS_MAX_PATH] = ""; USmtpGetGwTableFilePath(szGwFilePath, sizeof(szGwFilePath)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szGwFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pGwFile = fopen(szGwFilePath, "rt"); if (pGwFile == NULL) { RLckUnlockSH(hResLock); ErrSetErrorCode(ERR_SMTPGW_FILE_NOT_FOUND); return ERR_SMTPGW_FILE_NOT_FOUND; } char szGwLine[SMTPGW_LINE_MAX] = ""; while (MscGetConfigLine(szGwLine, sizeof(szGwLine) - 1, pGwFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szGwLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= gwMax && StrIWildMatch(pszDomain, ppszStrings[gwDomain])) { StrNCpy(pszGateway, ppszStrings[gwGateway], iSize); StrFreeStrings(ppszStrings); fclose(pGwFile); RLckUnlockSH(hResLock); return 0; } StrFreeStrings(ppszStrings); } fclose(pGwFile); RLckUnlockSH(hResLock); ErrSetErrorCode(ERR_SMTPGW_NOT_FOUND); return ERR_SMTPGW_NOT_FOUND; } static int USmtpWriteGateway(FILE *pGwFile, char const *pszDomain, char const *pszGateway) { /* Domain */ char *pszQuoted = StrQuote(pszDomain, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pGwFile, "%s\t", pszQuoted); SysFree(pszQuoted); /* Gateway */ pszQuoted = StrQuote(pszGateway, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pGwFile, "%s\n", pszQuoted); SysFree(pszQuoted); return 0; } int USmtpAddGateway(char const *pszDomain, char const *pszGateway) { char szGwFilePath[SYS_MAX_PATH] = ""; USmtpGetGwTableFilePath(szGwFilePath, sizeof(szGwFilePath)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szGwFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pGwFile = fopen(szGwFilePath, "r+t"); if (pGwFile == NULL) { RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_SMTPGW_FILE_NOT_FOUND); return ERR_SMTPGW_FILE_NOT_FOUND; } char szGwLine[SMTPGW_LINE_MAX] = ""; while (MscGetConfigLine(szGwLine, sizeof(szGwLine) - 1, pGwFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szGwLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= gwMax && stricmp(pszDomain, ppszStrings[gwDomain]) == 0 && stricmp(pszGateway, ppszStrings[gwGateway]) == 0) { StrFreeStrings(ppszStrings); fclose(pGwFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_GATEWAY_ALREADY_EXIST); return ERR_GATEWAY_ALREADY_EXIST; } StrFreeStrings(ppszStrings); } fseek(pGwFile, 0, SEEK_END); if (USmtpWriteGateway(pGwFile, pszDomain, pszGateway) < 0) { fclose(pGwFile); RLckUnlockEX(hResLock); return ErrGetErrorCode(); } fclose(pGwFile); RLckUnlockEX(hResLock); return 0; } int USmtpRemoveGateway(char const *pszDomain) { char szGwFilePath[SYS_MAX_PATH] = ""; char szTmpFile[SYS_MAX_PATH] = ""; USmtpGetGwTableFilePath(szGwFilePath, sizeof(szGwFilePath)); UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szGwFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pGwFile = fopen(szGwFilePath, "rt"); if (pGwFile == NULL) { RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_SMTPGW_FILE_NOT_FOUND); return ERR_SMTPGW_FILE_NOT_FOUND; } FILE *pTmpFile = fopen(szTmpFile, "wt"); if (pTmpFile == NULL) { fclose(pGwFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } int iGatewayFound = 0; char szGwLine[SMTPGW_LINE_MAX] = ""; while (MscGetConfigLine(szGwLine, sizeof(szGwLine) - 1, pGwFile, false) != NULL) { if (szGwLine[0] == TAB_COMMENT_CHAR) { fprintf(pTmpFile, "%s\n", szGwLine); continue; } char **ppszStrings = StrGetTabLineStrings(szGwLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= gwMax && stricmp(pszDomain, ppszStrings[gwDomain]) == 0) { ++iGatewayFound; } else fprintf(pTmpFile, "%s\n", szGwLine); StrFreeStrings(ppszStrings); } fclose(pGwFile); fclose(pTmpFile); if (iGatewayFound == 0) { SysRemove(szTmpFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_GATEWAY_NOT_FOUND); return ERR_GATEWAY_NOT_FOUND; } if (MscMoveFile(szTmpFile, szGwFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); return 0; } int USmtpIsAllowedRelay(const SYS_INET_ADDR &PeerInfo, SVRCFG_HANDLE hSvrConfig) { char szRelayFilePath[SYS_MAX_PATH] = ""; USmtpGetRelayFilePath(szRelayFilePath, sizeof(szRelayFilePath)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szRelayFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pRelayFile = fopen(szRelayFilePath, "rt"); if (pRelayFile == NULL) { RLckUnlockSH(hResLock); ErrSetErrorCode(ERR_SMTPRELAY_FILE_NOT_FOUND); return ERR_SMTPRELAY_FILE_NOT_FOUND; } char szRelayLine[SMTPRELAY_LINE_MAX] = ""; while (MscGetConfigLine(szRelayLine, sizeof(szRelayLine) - 1, pRelayFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szRelayLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); AddressFilter AF; if (iFieldsCount > 0 && MscLoadAddressFilter(ppszStrings, iFieldsCount, AF) == 0 && MscAddressMatch(AF, PeerInfo)) { StrFreeStrings(ppszStrings); fclose(pRelayFile); RLckUnlockSH(hResLock); return 0; } StrFreeStrings(ppszStrings); } fclose(pRelayFile); RLckUnlockSH(hResLock); ErrSetErrorCode(ERR_RELAY_NOT_ALLOWED); return ERR_RELAY_NOT_ALLOWED; } char **USmtpGetPathStrings(char const *pszMailCmd) { char const *pszOpen, *pszClose; if ((pszOpen = strchr(pszMailCmd, '<')) == NULL || (pszClose = strchr(pszOpen + 1, '>')) == NULL) { ErrSetErrorCode(ERR_SMTP_PATH_PARSE_ERROR); return NULL; } int iPathLength = (int) (pszClose - pszOpen) - 1; if (iPathLength >= MAX_SMTP_ADDRESS) { ErrSetErrorCode(ERR_SMTP_PATH_PARSE_ERROR, pszMailCmd); return NULL; } /* * USmlValidAddress() will fail with an empty address, but * USmtpGetPathStrings() should succeed anyway (returning an empty * recipient path array), so we check for length before calling * USmlValidAddress(). */ if (iPathLength > 0 && USmlValidAddress(pszOpen + 1, pszClose) < 0) return NULL; char *pszPath = (char *) SysAlloc(iPathLength + 1); if (pszPath == NULL) return NULL; Cpy2Sz(pszPath, pszOpen + 1, iPathLength); char **ppszDomains = StrTokenize(pszPath, ",:"); SysFree(pszPath); return ppszDomains; } int USmtpSplitEmailAddr(char const *pszAddr, char *pszUser, char *pszDomain) { if (USmlValidAddress(pszAddr, pszAddr + strlen(pszAddr)) < 0) return ErrGetErrorCode(); char const *pszAT = strchr(pszAddr, '@'); if (pszAT == NULL) { ErrSetErrorCode(ERR_BAD_EMAIL_ADDR); return ERR_BAD_EMAIL_ADDR; } int iUserLength = (int) (pszAT - pszAddr); int iDomainLength = strlen(pszAT + 1); if (pszUser != NULL) { if (iUserLength == 0) { ErrSetErrorCode(ERR_BAD_EMAIL_ADDR); return ERR_BAD_EMAIL_ADDR; } iUserLength = Min(iUserLength, MAX_ADDR_NAME - 1); Cpy2Sz(pszUser, pszAddr, iUserLength); } if (pszDomain != NULL) { if (iDomainLength == 0) { ErrSetErrorCode(ERR_BAD_EMAIL_ADDR); return ERR_BAD_EMAIL_ADDR; } StrNCpy(pszDomain, pszAT + 1, MAX_ADDR_NAME); } return 0; } int USmtpCheckAddressPart(char const *pszName) { char const *pszTop = pszName + strlen(pszName); if (USmlDotAtom(pszName, pszTop) != pszTop) { ErrSetErrorCode(ERR_BAD_RFCNAME); return ERR_BAD_RFCNAME; } return 0; } int USmtpCheckDomainPart(char const *pszName) { return USmlValidHost(pszName, pszName + strlen(pszName)); } int USmtpCheckAddress(char const *pszAddress) { char szUser[MAX_ADDR_NAME] = ""; char szDomain[MAX_ADDR_NAME] = ""; if (USmtpSplitEmailAddr(pszAddress, szUser, szDomain) < 0 || USmtpCheckAddressPart(szUser) < 0 || USmtpCheckDomainPart(szDomain) < 0) return ErrGetErrorCode(); return 0; } int USmtpInitError(SMTPError *pSMTPE) { ZeroData(*pSMTPE); pSMTPE->iSTMPResponse = 0; pSMTPE->pszSTMPResponse = NULL; pSMTPE->pszServer = NULL; return 0; } int USmtpSetError(SMTPError *pSMTPE, int iSTMPResponse, char const *pszSTMPResponse, char const *pszServer) { pSMTPE->iSTMPResponse = iSTMPResponse; SysFree(pSMTPE->pszSTMPResponse); SysFree(pSMTPE->pszServer); pSMTPE->pszSTMPResponse = SysStrDup(pszSTMPResponse); pSMTPE->pszServer = SysStrDup(pszServer); return 0; } static int USmtpSetErrorServer(SMTPError *pSMTPE, char const *pszServer) { SysFree(pSMTPE->pszServer); pSMTPE->pszServer = SysStrDup(pszServer); return 0; } bool USmtpIsFatalError(SMTPError const *pSMTPE) { return (pSMTPE->iSTMPResponse == SMTP_FATAL_ERROR || (pSMTPE->iSTMPResponse >= 500 && pSMTPE->iSTMPResponse < 600)); } char const *USmtpGetErrorMessage(SMTPError const *pSMTPE) { return (pSMTPE->pszSTMPResponse != NULL) ? pSMTPE->pszSTMPResponse: ""; } int USmtpCleanupError(SMTPError *pSMTPE) { SysFree(pSMTPE->pszSTMPResponse); SysFree(pSMTPE->pszServer); USmtpInitError(pSMTPE); return 0; } char *USmtpGetSMTPError(SMTPError *pSMTPE, char *pszError, int iMaxError) { char const *pszSmtpErr = (pSMTPE != NULL) ? USmtpGetErrorMessage(pSMTPE): DEFAULT_SMTP_ERR; if (IsEmptyString(pszSmtpErr)) pszSmtpErr = DEFAULT_SMTP_ERR; StrNCpy(pszError, pszSmtpErr, iMaxError); return pszError; } char *USmtpGetSMTPRmtMsgID(char const *pszAckDATA, char *pszRmtMsgID, int iMaxMsg) { int iRmtMsgLen; char const *pszTmp; for (; isdigit(*pszAckDATA); pszAckDATA++); for (; isspace(*pszAckDATA); pszAckDATA++); if ((pszTmp = strchr(pszAckDATA, '<')) != NULL) { pszAckDATA = pszTmp + 1; if ((pszTmp = strchr(pszAckDATA, '>')) == NULL) iRmtMsgLen = strlen(pszAckDATA); else iRmtMsgLen = (int) (pszTmp - pszAckDATA); } else iRmtMsgLen = strlen(pszAckDATA); iRmtMsgLen = Min(iRmtMsgLen, iMaxMsg - 1); Cpy2Sz(pszRmtMsgID, pszAckDATA, iRmtMsgLen); return pszRmtMsgID; } char const *USmtpGetErrorServer(SMTPError const *pSMTPE) { return (pSMTPE->pszServer != NULL) ? pSMTPE->pszServer: ""; } static int USmtpResponseClass(int iResponseCode, int iResponseClass) { return ((iResponseCode >= iResponseClass && iResponseCode < (iResponseClass + 100)) ? 1: 0); } static int USmtpGetResultCode(char const *pszResult) { int i; char szResCode[64] = ""; for (i = 0; (i < sizeof(szResCode)) && isdigit(pszResult[i]); i++) szResCode[i] = pszResult[i]; if (i == 0 || i == sizeof(szResCode)) { ErrSetErrorCode(ERR_BAD_SMTP_RESPONSE); return ERR_BAD_SMTP_RESPONSE; } szResCode[i] = '\0'; return atoi(szResCode); } static int USmtpIsPartialResponse(char const *pszResponse) { return (strlen(pszResponse) >= 4 && pszResponse[3] == '-') ? 1: 0; } static int USmtpGetResponse(BSOCK_HANDLE hBSock, char *pszResponse, int iMaxResponse, int iTimeout) { int iResultCode = -1; int iResponseLenght = 0; char szPartial[1024] = ""; SetEmptyString(pszResponse); do { int iLineLength = 0; if (BSckGetString(hBSock, szPartial, sizeof(szPartial) - 1, iTimeout, &iLineLength) == NULL) return ErrGetErrorCode(); if ((iResponseLenght + 2) < iMaxResponse) { if (iResponseLenght > 0) strcat(pszResponse, "\r\n"), iResponseLenght += 2; int iCopyLenght = Min(iMaxResponse - 1 - iResponseLenght, iLineLength); if (iCopyLenght > 0) { strncpy(pszResponse + iResponseLenght, szPartial, iCopyLenght); iResponseLenght += iCopyLenght; pszResponse[iResponseLenght] = '\0'; } } if ((iResultCode = USmtpGetResultCode(szPartial)) < 0) return ErrGetErrorCode(); } while (USmtpIsPartialResponse(szPartial)); return iResultCode; } static int USmtpSendCommand(BSOCK_HANDLE hBSock, char const *pszCommand, char *pszResponse, int iMaxResponse, int iTimeout) { if (BSckSendString(hBSock, pszCommand, iTimeout) <= 0) return ErrGetErrorCode(); return USmtpGetResponse(hBSock, pszResponse, iMaxResponse, iTimeout); } static int USmtpGetServerAuthFile(char const *pszServer, char *pszAuthFilePath) { int iRootedName = MscRootedName(pszServer); char szAuthPath[SYS_MAX_PATH] = ""; UAthGetRootPath(AUTH_SERVICE_SMTP, szAuthPath, sizeof(szAuthPath)); char const *pszDot = pszServer; while (pszDot != NULL && strlen(pszDot) > 0) { if (iRootedName) sprintf(pszAuthFilePath, "%s%stab", szAuthPath, pszDot); else sprintf(pszAuthFilePath, "%s%s.tab", szAuthPath, pszDot); if (SysExistFile(pszAuthFilePath)) return 0; if ((pszDot = strchr(pszDot, '.')) != NULL) ++pszDot; } ErrSetErrorCode(ERR_NO_SMTP_AUTH_CONFIG); return ERR_NO_SMTP_AUTH_CONFIG; } static int USmtpDoPlainAuth(SmtpChannel *pSmtpCh, char const *pszServer, char const *const *ppszAuthTokens, SMTPError *pSMTPE) { if (StrStringsCount(ppszAuthTokens) < 3) { ErrSetErrorCode(ERR_BAD_SMTP_AUTH_CONFIG); return ERR_BAD_SMTP_AUTH_CONFIG; } /* Build plain text authentication token ( "\0" Username "\0" Password "\0" ) */ int iAuthLength = 1; char szAuthBuffer[2048] = ""; strcpy(szAuthBuffer + iAuthLength, ppszAuthTokens[1]); iAuthLength += strlen(ppszAuthTokens[1]) + 1; strcpy(szAuthBuffer + iAuthLength, ppszAuthTokens[2]); iAuthLength += strlen(ppszAuthTokens[2]); int iEnc64Length; char szEnc64Token[1024] = ""; iEnc64Length = sizeof(szEnc64Token) - 1; Base64Encode(szAuthBuffer, iAuthLength, szEnc64Token, &iEnc64Length); /* Send AUTH command */ int iSvrReponse; SysSNPrintf(szAuthBuffer, sizeof(szAuthBuffer) - 1, "AUTH PLAIN %s", szEnc64Token); if (!USmtpResponseClass(iSvrReponse = USmtpSendCommand(pSmtpCh->hBSock, szAuthBuffer, szAuthBuffer, sizeof(szAuthBuffer) - 1), 200)) { if (iSvrReponse > 0) { if (pSMTPE != NULL) USmtpSetError(pSMTPE, iSvrReponse, szAuthBuffer, pSmtpCh->pszServer); ErrSetErrorCode(ERR_BAD_SERVER_RESPONSE, szAuthBuffer); } return ErrGetErrorCode(); } return 0; } static int USmtpDoLoginAuth(SmtpChannel *pSmtpCh, char const *pszServer, char const *const *ppszAuthTokens, SMTPError *pSMTPE) { if (StrStringsCount(ppszAuthTokens) < 3) { ErrSetErrorCode(ERR_BAD_SMTP_AUTH_CONFIG); return ERR_BAD_SMTP_AUTH_CONFIG; } /* Send AUTH command */ int iSvrReponse; char szAuthBuffer[1024] = ""; sprintf(szAuthBuffer, "AUTH LOGIN"); if (!USmtpResponseClass(iSvrReponse = USmtpSendCommand(pSmtpCh->hBSock, szAuthBuffer, szAuthBuffer, sizeof(szAuthBuffer) - 1), 300)) { if (iSvrReponse > 0) { if (pSMTPE != NULL) USmtpSetError(pSMTPE, iSvrReponse, szAuthBuffer, pSmtpCh->pszServer); ErrSetErrorCode(ERR_BAD_SERVER_RESPONSE, szAuthBuffer); } return ErrGetErrorCode(); } /* Send username */ int iEnc64Length = sizeof(szAuthBuffer) - 1; Base64Encode(ppszAuthTokens[1], strlen(ppszAuthTokens[1]), szAuthBuffer, &iEnc64Length); if (!USmtpResponseClass(iSvrReponse = USmtpSendCommand(pSmtpCh->hBSock, szAuthBuffer, szAuthBuffer, sizeof(szAuthBuffer) - 1), 300)) { if (iSvrReponse > 0) { if (pSMTPE != NULL) USmtpSetError(pSMTPE, iSvrReponse, szAuthBuffer, pSmtpCh->pszServer); ErrSetErrorCode(ERR_BAD_SERVER_RESPONSE, szAuthBuffer); } return ErrGetErrorCode(); } /* Send password */ iEnc64Length = sizeof(szAuthBuffer) - 1; Base64Encode(ppszAuthTokens[2], strlen(ppszAuthTokens[2]), szAuthBuffer, &iEnc64Length); if (!USmtpResponseClass(iSvrReponse = USmtpSendCommand(pSmtpCh->hBSock, szAuthBuffer, szAuthBuffer, sizeof(szAuthBuffer) - 1), 200)) { if (iSvrReponse > 0) { if (pSMTPE != NULL) USmtpSetError(pSMTPE, iSvrReponse, szAuthBuffer, pSmtpCh->pszServer); ErrSetErrorCode(ERR_BAD_SERVER_RESPONSE, szAuthBuffer); } return ErrGetErrorCode(); } return 0; } static int USmtpDoCramMD5Auth(SmtpChannel *pSmtpCh, char const *pszServer, char const *const *ppszAuthTokens, SMTPError *pSMTPE) { if (StrStringsCount(ppszAuthTokens) < 3) { ErrSetErrorCode(ERR_BAD_SMTP_AUTH_CONFIG); return ERR_BAD_SMTP_AUTH_CONFIG; } /* Send AUTH command */ int iSvrReponse; char szAuthBuffer[1024] = ""; sprintf(szAuthBuffer, "AUTH CRAM-MD5"); if (!USmtpResponseClass(iSvrReponse = USmtpSendCommand(pSmtpCh->hBSock, szAuthBuffer, szAuthBuffer, sizeof(szAuthBuffer) - 1), 300) || (strlen(szAuthBuffer) < 4)) { if (iSvrReponse > 0) { if (pSMTPE != NULL) USmtpSetError(pSMTPE, iSvrReponse, szAuthBuffer, pSmtpCh->pszServer); ErrSetErrorCode(ERR_BAD_SERVER_RESPONSE, szAuthBuffer); } return ErrGetErrorCode(); } /* Retrieve server challenge */ int iDec64Length; char *pszAuth = szAuthBuffer + 4; char szChallenge[1024] = ""; iDec64Length = sizeof(szChallenge); if (Base64Decode(pszAuth, strlen(pszAuth), szChallenge, &iDec64Length) != 0) { if (pSMTPE != NULL) USmtpSetError(pSMTPE, iSvrReponse, szAuthBuffer, pSmtpCh->pszServer); ErrSetErrorCode(ERR_BAD_SERVER_RESPONSE, szAuthBuffer); return ERR_BAD_SERVER_RESPONSE; } /* Compute MD5 response ( secret , challenge , digest ) */ if (MscCramMD5(ppszAuthTokens[2], szChallenge, szChallenge) < 0) return ErrGetErrorCode(); /* Send response */ int iEnc64Length; char szResponse[1024] = ""; SysSNPrintf(szResponse, sizeof(szResponse) - 1, "%s %s", ppszAuthTokens[1], szChallenge); iEnc64Length = sizeof(szAuthBuffer) - 1; Base64Encode(szResponse, strlen(szResponse), szAuthBuffer, &iEnc64Length); if (!USmtpResponseClass(iSvrReponse = USmtpSendCommand(pSmtpCh->hBSock, szAuthBuffer, szAuthBuffer, sizeof(szAuthBuffer) - 1), 200)) { if (iSvrReponse > 0) { if (pSMTPE != NULL) USmtpSetError(pSMTPE, iSvrReponse, szAuthBuffer, pSmtpCh->pszServer); ErrSetErrorCode(ERR_BAD_SERVER_RESPONSE, szAuthBuffer); } return ErrGetErrorCode(); } return 0; } static int USmtpServerAuthenticate(SmtpChannel *pSmtpCh, char const *pszServer, SMTPError *pSMTPE) { /* Try to retrieve SMTP authentication config for "pszServer" */ char szAuthFilePath[SYS_MAX_PATH] = ""; if (USmtpGetServerAuthFile(pszServer, szAuthFilePath) < 0) return 0; FILE *pAuthFile = fopen(szAuthFilePath, "rt"); if (pAuthFile == NULL) { ErrSetErrorCode(ERR_FILE_OPEN, szAuthFilePath); return ERR_FILE_OPEN; } char szAuthLine[SMTPAUTH_LINE_MAX] = ""; while (MscGetConfigLine(szAuthLine, sizeof(szAuthLine) - 1, pAuthFile) != NULL) { char **ppszTokens = StrGetTabLineStrings(szAuthLine); if (ppszTokens == NULL) continue; int iFieldsCount = StrStringsCount(ppszTokens); if (iFieldsCount > 0) { int iAuthResult = 0; if (stricmp(ppszTokens[0], "plain") == 0) iAuthResult = USmtpDoPlainAuth(pSmtpCh, pszServer, ppszTokens, pSMTPE); else if (stricmp(ppszTokens[0], "login") == 0) iAuthResult = USmtpDoLoginAuth(pSmtpCh, pszServer, ppszTokens, pSMTPE); else if (stricmp(ppszTokens[0], "cram-md5") == 0) iAuthResult = USmtpDoCramMD5Auth(pSmtpCh, pszServer, ppszTokens, pSMTPE); else ErrSetErrorCode(iAuthResult = ERR_UNKNOWN_SMTP_AUTH, ppszTokens[0]); StrFreeStrings(ppszTokens); fclose(pAuthFile); return iAuthResult; } StrFreeStrings(ppszTokens); } fclose(pAuthFile); return 0; } static int USmtpParseEhloResponse(SmtpChannel *pSmtpCh, char const *pszResponse) { char const *pszLine = pszResponse; for (; pszLine != NULL; pszLine = strchr(pszLine, '\n')) { if (*pszLine == '\n') ++pszLine; /* Skip SMTP code and ' ' or '-' */ if (strlen(pszLine) < 4) continue; pszLine += 4; if (StrCmdMatch(pszLine, "SIZE")) { pSmtpCh->ulFlags |= SMTPCH_SUPPORT_SIZE; if (pszLine[4] == ' ' && isdigit(pszLine[5])) pSmtpCh->ulMaxMsgSize = (unsigned long) atol(pszLine + 5); } else if (StrCmdMatch(pszLine, "STARTTLS")) { pSmtpCh->ulFlags |= SMTPCH_SUPPORT_TLS; } } return 0; } static int USmtpSslEnvCB(void *pPrivate, int iID, void const *pData) { SslBindEnv *pSslE = (SslBindEnv *) pPrivate; return 0; } static int USmtpSwitchToSSL(SmtpChannel *pSmtpCh, SMTPGateway const *pGw, SMTPError *pSMTPE) { int iError, iReadyTLS = 0; SslServerBind SSLB; SslBindEnv SslE; if (pSmtpCh->ulFlags & SMTPCH_SUPPORT_TLS) { char szRTXBuffer[1024] = ""; int iSvrReponse = USmtpSendCommand(pSmtpCh->hBSock, "STARTTLS", szRTXBuffer, sizeof(szRTXBuffer) - 1); if (!USmtpResponseClass(iSvrReponse, 200)) { if (iSvrReponse < 0) return iSvrReponse; if (iSvrReponse > 0) { if (pGw->ulFlags & SMTP_GWF_FORCE_TLS) { if (pSMTPE != NULL) USmtpSetError(pSMTPE, iSvrReponse, szRTXBuffer, pSmtpCh->pszServer); ErrSetErrorCode(ERR_BAD_SERVER_RESPONSE, szRTXBuffer); return ERR_BAD_SERVER_RESPONSE; } } } else iReadyTLS++; } if (!iReadyTLS) { if (pGw->ulFlags & SMTP_GWF_FORCE_TLS) { if (pSMTPE != NULL) USmtpSetError(pSMTPE, SMTP_FATAL_ERROR, ErrGetErrorString(ERR_NO_REMOTE_SSL), pSmtpCh->pszServer); ErrSetErrorCode(ERR_NO_REMOTE_SSL); return ERR_NO_REMOTE_SSL; } return 0; } if (CSslBindSetup(&SSLB) < 0) return ErrGetErrorCode(); ZeroData(SslE); iError = BSslBindClient(pSmtpCh->hBSock, &SSLB, USmtpSslEnvCB, &SslE); CSslBindCleanup(&SSLB); /* * We may want to add verify code here ... */ SysFree(SslE.pszIssuer); SysFree(SslE.pszSubject); return iError; } static void USmtpCleanEHLO(SmtpChannel *pSmtpCh) { pSmtpCh->ulFlags &= ~(SMTPCH_SUPPORT_SIZE | SMTPCH_SUPPORT_TLS); pSmtpCh->ulMaxMsgSize = 0; } static void USmtpFreeChannel(SmtpChannel *pSmtpCh) { BSckDetach(pSmtpCh->hBSock, 1); SysFree(pSmtpCh->pszServer); SysFree(pSmtpCh->pszDomain); SysFree(pSmtpCh); } SMTPCH_HANDLE USmtpCreateChannel(SMTPGateway const *pGw, char const *pszDomain, SMTPError *pSMTPE) { /* Decode server address */ int iPortNo = STD_SMTP_PORT; char szAddress[MAX_ADDR_NAME] = ""; if (MscSplitAddressPort(pGw->pszHost, szAddress, iPortNo, STD_SMTP_PORT) < 0) return INVALID_SMTPCH_HANDLE; SYS_INET_ADDR SvrAddr; if (MscGetServerAddress(szAddress, SvrAddr, iPortNo) < 0) return INVALID_SMTPCH_HANDLE; SYS_SOCKET SockFD = SysCreateSocket(SysGetAddrFamily(SvrAddr), SOCK_STREAM, 0); if (SockFD == SYS_INVALID_SOCKET) return INVALID_SMTPCH_HANDLE; /* * Are we requested to bind to a specific interface to talk to this server? */ if (pGw->pszIFace != NULL) { SYS_INET_ADDR BndAddr; if (MscGetServerAddress(pGw->pszIFace, BndAddr, 0) < 0 || SysBindSocket(SockFD, &BndAddr) < 0) { SysCloseSocket(SockFD); return INVALID_SMTPCH_HANDLE; } } if (SysConnect(SockFD, &SvrAddr, STD_SMTP_TIMEOUT) < 0) { SysCloseSocket(SockFD); return INVALID_SMTPCH_HANDLE; } /* Check if We need to supply an HELO host */ char szHeloHost[MAX_HOST_NAME] = ""; if (pszDomain == NULL) { /* Get the DNS name of the local interface */ if (MscGetSockHost(SockFD, szHeloHost, sizeof(szHeloHost)) < 0) { SYS_INET_ADDR SockInfo; char szIP[128] = "???.???.???.???"; if (SysGetSockInfo(SockFD, SockInfo) < 0) { SysCloseSocket(SockFD); return INVALID_SMTPCH_HANDLE; } StrSNCpy(szHeloHost, SysInetNToA(SockInfo, szIP, sizeof(szIP))); } pszDomain = szHeloHost; } /* Attach socket to buffered reader */ BSOCK_HANDLE hBSock = BSckAttach(SockFD); if (hBSock == INVALID_BSOCK_HANDLE) { SysCloseSocket(SockFD); return INVALID_SMTPCH_HANDLE; } /* Read welcome message */ SmtpChannel *pSmtpCh = (SmtpChannel *) SysAlloc(sizeof(SmtpChannel)); if (pSmtpCh == NULL) { BSckDetach(hBSock, 1); return INVALID_SMTPCH_HANDLE; } pSmtpCh->hBSock = hBSock; pSmtpCh->ulFlags = 0; pSmtpCh->ulMaxMsgSize = 0; pSmtpCh->SvrAddr = SvrAddr; pSmtpCh->pszServer = SysStrDup(pGw->pszHost); pSmtpCh->pszDomain = SysStrDup(pszDomain); /* Read welcome message */ int iSvrReponse = -1; char szRTXBuffer[2048] = ""; if (!USmtpResponseClass(iSvrReponse = USmtpGetResponse(pSmtpCh->hBSock, szRTXBuffer, sizeof(szRTXBuffer) - 1), 200)) { if (iSvrReponse > 0) { if (pSMTPE != NULL) USmtpSetError(pSMTPE, iSvrReponse, szRTXBuffer, pSmtpCh->pszServer); ErrSetErrorCode(ERR_BAD_SERVER_RESPONSE, szRTXBuffer); } USmtpFreeChannel(pSmtpCh); return INVALID_SMTPCH_HANDLE; } SendHELO: /* Try the EHLO ESMTP command before */ SysSNPrintf(szRTXBuffer, sizeof(szRTXBuffer) - 1, "EHLO %s", pszDomain); if (USmtpResponseClass(iSvrReponse = USmtpSendCommand(pSmtpCh->hBSock, szRTXBuffer, szRTXBuffer, sizeof(szRTXBuffer) - 1), 200)) { /* Parse EHLO response */ if (USmtpParseEhloResponse(pSmtpCh, szRTXBuffer) < 0) { USmtpFreeChannel(pSmtpCh); return INVALID_SMTPCH_HANDLE; } } else { /* Send HELO and read result */ SysSNPrintf(szRTXBuffer, sizeof(szRTXBuffer) - 1, "HELO %s", pszDomain); if (!USmtpResponseClass(iSvrReponse = USmtpSendCommand(pSmtpCh->hBSock, szRTXBuffer, szRTXBuffer, sizeof(szRTXBuffer) - 1), 200)) { if (iSvrReponse > 0) { if (pSMTPE != NULL) USmtpSetError(pSMTPE, iSvrReponse, szRTXBuffer, pSmtpCh->pszServer); ErrSetErrorCode(ERR_BAD_SERVER_RESPONSE, szRTXBuffer); } USmtpFreeChannel(pSmtpCh); return INVALID_SMTPCH_HANDLE; } } /* * Do we need SSL? */ if ((pGw->ulFlags & SMTP_GWF_USE_TLS) && strcmp(BSckBioName(pSmtpCh->hBSock), BSSL_BIO_NAME) != 0) { if (USmtpSwitchToSSL(pSmtpCh, pGw, pSMTPE) < 0) { USmtpCloseChannel((SMTPCH_HANDLE) pSmtpCh, 0, pSMTPE); return INVALID_SMTPCH_HANDLE; } /* * If we switched to TLS, we need to resend the HELO/EHLO ... */ if (strcmp(BSckBioName(pSmtpCh->hBSock), BSSL_BIO_NAME) == 0) { USmtpCleanEHLO(pSmtpCh); goto SendHELO; } } /* Check if We need authentication */ if (USmtpServerAuthenticate(pSmtpCh, szAddress, pSMTPE) < 0) { USmtpCloseChannel((SMTPCH_HANDLE) pSmtpCh, 0, pSMTPE); return INVALID_SMTPCH_HANDLE; } return (SMTPCH_HANDLE) pSmtpCh; } int USmtpCloseChannel(SMTPCH_HANDLE hSmtpCh, int iHardClose, SMTPError *pSMTPE) { SmtpChannel *pSmtpCh = (SmtpChannel *) hSmtpCh; if (!iHardClose) { /* Send QUIT and read result */ int iSvrReponse = -1; char szRTXBuffer[2048] = ""; if (!USmtpResponseClass(iSvrReponse = USmtpSendCommand(pSmtpCh->hBSock, "QUIT", szRTXBuffer, sizeof(szRTXBuffer) - 1), 200)) { if (iSvrReponse > 0) { if (pSMTPE != NULL) USmtpSetError(pSMTPE, iSvrReponse, szRTXBuffer, pSmtpCh->pszServer); ErrSetErrorCode(ERR_BAD_SERVER_RESPONSE, szRTXBuffer); } USmtpFreeChannel(pSmtpCh); return ErrGetErrorCode(); } } USmtpFreeChannel(pSmtpCh); return 0; } int USmtpChannelReset(SMTPCH_HANDLE hSmtpCh, SMTPError *pSMTPE) { SmtpChannel *pSmtpCh = (SmtpChannel *) hSmtpCh; /* Send RSET and read result */ int iSvrReponse = -1; char szRTXBuffer[2048] = ""; if (!USmtpResponseClass(iSvrReponse = USmtpSendCommand(pSmtpCh->hBSock, "RSET", szRTXBuffer, sizeof(szRTXBuffer) - 1), 200)) { if (iSvrReponse > 0) { if (pSMTPE != NULL) USmtpSetError(pSMTPE, iSvrReponse, szRTXBuffer, pSmtpCh->pszServer); ErrSetErrorCode(ERR_BAD_SERVER_RESPONSE, szRTXBuffer); } return ErrGetErrorCode(); } return 0; } int USmtpSendMail(SMTPCH_HANDLE hSmtpCh, char const *pszFrom, char const *pszRcpt, FileSection const *pFS, SMTPError *pSMTPE) { SmtpChannel *pSmtpCh = (SmtpChannel *) hSmtpCh; /* Check message size ( if the remote server support the SIZE extension ) */ SYS_OFF_T llMessageSize = 0; if (pSmtpCh->ulMaxMsgSize != 0) { if (MscGetSectionSize(pFS, &llMessageSize) < 0) return ErrGetErrorCode(); if (llMessageSize >= (SYS_OFF_T) pSmtpCh->ulMaxMsgSize) { if (pSMTPE != NULL) USmtpSetError(pSMTPE, SMTP_FATAL_ERROR, ErrGetErrorString(ERR_SMTPSRV_MSG_SIZE), pSmtpCh->pszServer); ErrSetErrorCode(ERR_SMTPSRV_MSG_SIZE); return ERR_SMTPSRV_MSG_SIZE; } } /* Send MAIL FROM: and read result */ int iSvrReponse = -1; char szRTXBuffer[2048] = ""; if (pSmtpCh->ulFlags & SMTPCH_SUPPORT_SIZE) { if (llMessageSize == 0 && MscGetSectionSize(pFS, &llMessageSize) < 0) return ErrGetErrorCode(); SysSNPrintf(szRTXBuffer, sizeof(szRTXBuffer) - 1, "MAIL FROM:<%s> SIZE=" SYS_OFFT_FMT, pszFrom, llMessageSize); } else SysSNPrintf(szRTXBuffer, sizeof(szRTXBuffer) - 1, "MAIL FROM:<%s>", pszFrom); if (!USmtpResponseClass(iSvrReponse = USmtpSendCommand(pSmtpCh->hBSock, szRTXBuffer, szRTXBuffer, sizeof(szRTXBuffer) - 1), 200)) { if (iSvrReponse > 0) { if (pSMTPE != NULL) USmtpSetError(pSMTPE, iSvrReponse, szRTXBuffer, pSmtpCh->pszServer); ErrSetErrorCode(ERR_SMTP_BAD_MAIL_FROM, szRTXBuffer); } return ErrGetErrorCode(); } /* Send RCPT TO: and read result */ SysSNPrintf(szRTXBuffer, sizeof(szRTXBuffer) - 1, "RCPT TO:<%s>", pszRcpt); if (!USmtpResponseClass(iSvrReponse = USmtpSendCommand(pSmtpCh->hBSock, szRTXBuffer, szRTXBuffer, sizeof(szRTXBuffer) - 1), 200)) { if (iSvrReponse > 0) { if (pSMTPE != NULL) USmtpSetError(pSMTPE, iSvrReponse, szRTXBuffer, pSmtpCh->pszServer); ErrSetErrorCode(ERR_SMTP_BAD_RCPT_TO, szRTXBuffer); } return ErrGetErrorCode(); } /* Send DATA and read the "ready to receive" */ if (!USmtpResponseClass(iSvrReponse = USmtpSendCommand(pSmtpCh->hBSock, "DATA", szRTXBuffer, sizeof(szRTXBuffer) - 1), 300)) { if (iSvrReponse > 0) { if (pSMTPE != NULL) USmtpSetError(pSMTPE, iSvrReponse, szRTXBuffer, pSmtpCh->pszServer); ErrSetErrorCode(ERR_SMTP_BAD_DATA, szRTXBuffer); } return ErrGetErrorCode(); } /* Send file and END OF DATA */ if (BSckSendFile(pSmtpCh->hBSock, pFS->szFilePath, pFS->llStartOffset, pFS->llEndOffset, STD_SMTP_TIMEOUT) < 0 || BSckSendString(pSmtpCh->hBSock, ".", STD_SMTP_TIMEOUT) <= 0) return ErrGetErrorCode(); if (!USmtpResponseClass(iSvrReponse = USmtpGetResponse(pSmtpCh->hBSock, szRTXBuffer, sizeof(szRTXBuffer) - 1), 200)) { if (iSvrReponse > 0) { if (pSMTPE != NULL) USmtpSetError(pSMTPE, iSvrReponse, szRTXBuffer, pSmtpCh->pszServer); ErrSetErrorCode(ERR_BAD_SERVER_RESPONSE, szRTXBuffer); } return ErrGetErrorCode(); } /* * Set the final response to the DATA command. This should contain the * remote MTA message ID, that can be logged and used to track messages. */ if (pSMTPE != NULL) USmtpSetError(pSMTPE, iSvrReponse, szRTXBuffer, pSmtpCh->pszServer); return 0; } int USmtpSendMail(SMTPGateway const *pGw, char const *pszDomain, char const *pszFrom, char const *pszRcpt, FileSection const *pFS, SMTPError *pSMTPE) { /* Set server host name inside the SMTP error structure */ if (pSMTPE != NULL) USmtpSetErrorServer(pSMTPE, pGw->pszHost); /* Open STMP channel and try to send the message */ SMTPCH_HANDLE hSmtpCh = USmtpCreateChannel(pGw, pszDomain, pSMTPE); if (hSmtpCh == INVALID_SMTPCH_HANDLE) return ErrGetErrorCode(); int iSendResult = USmtpSendMail(hSmtpCh, pszFrom, pszRcpt, pFS, pSMTPE); USmtpCloseChannel(hSmtpCh, 0, pSMTPE); return iSendResult; } static SMTPGateway *USmtpGetDefaultGateway(SVRCFG_HANDLE hSvrConfig, char const *pszServer) { SMTPGateway *pGw; char *pszCfgOptions; if ((pGw = (SMTPGateway *) SysAlloc(sizeof(SMTPGateway))) == NULL) return NULL; pGw->pszHost = SysStrDup(pszServer); if ((pszCfgOptions = SvrGetConfigVar(hSvrConfig, "SmtpGwConfig")) != NULL && USmtpSetGwOptions(pGw, pszCfgOptions) < 0) { SysFree(pszCfgOptions); USmtpFreeGateway(pGw); return NULL; } SysFree(pszCfgOptions); return pGw; } int USmtpMailRmtDeliver(SVRCFG_HANDLE hSvrConfig, char const *pszServer, char const *pszDomain, char const *pszFrom, char const *pszRcpt, FileSection const *pFS, SMTPError *pSMTPE) { int iError; SMTPGateway *pGw; if ((pGw = USmtpGetDefaultGateway(hSvrConfig, pszServer)) == NULL) return ErrGetErrorCode(); iError = USmtpSendMail(pGw, pszDomain, pszFrom, pszRcpt, pFS, pSMTPE); USmtpFreeGateway(pGw); return iError; } char *USmtpBuildRcptPath(char const *const *ppszRcptTo, SVRCFG_HANDLE hSvrConfig) { int iRcptCount = StrStringsCount(ppszRcptTo); char szDestDomain[MAX_HOST_NAME] = ""; if (USmtpSplitEmailAddr(ppszRcptTo[0], NULL, szDestDomain) < 0) return NULL; /* * Try to get routing path, if not found simply return an address concat * of "ppszRcptTo" */ char szSpecMXHost[512] = ""; if (USmtpGetGateway(hSvrConfig, szDestDomain, szSpecMXHost, sizeof(szSpecMXHost)) < 0) return USmlAddrConcat(ppszRcptTo); char *pszSendRcpt = USmlAddrConcat(ppszRcptTo); if (pszSendRcpt == NULL) return NULL; char *pszRcptPath = (char *) SysAlloc(strlen(pszSendRcpt) + strlen(szSpecMXHost) + 2); if (pszRcptPath != NULL) { if (iRcptCount == 1) sprintf(pszRcptPath, "%s:%s", szSpecMXHost, pszSendRcpt); else sprintf(pszRcptPath, "%s,%s", szSpecMXHost, pszSendRcpt); } SysFree(pszSendRcpt); return pszRcptPath; } SMTPGateway **USmtpGetMailExchangers(SVRCFG_HANDLE hSvrConfig, char const *pszDomain) { /* Try to get default gateways */ char *pszDefaultGws = SvrGetConfigVar(hSvrConfig, "DefaultSMTPGateways"); if (pszDefaultGws == NULL) { ErrSetErrorCode(ERR_NO_PREDEFINED_MX); return NULL; } char **ppszMXGWs = StrTokenize(pszDefaultGws, ";"); SysFree(pszDefaultGws); if (ppszMXGWs == NULL) return NULL; int i, iNumGws = StrStringsCount(ppszMXGWs); SMTPGateway **ppGws; if ((ppGws = (SMTPGateway **) SysAlloc((iNumGws + 1) * sizeof(SMTPGateway *))) == NULL) { StrFreeStrings(ppszMXGWs); return NULL; } char *pszCfgOptions = SvrGetConfigVar(hSvrConfig, "SmtpGwConfig"); for (i = 0; i < iNumGws; i++) { char *pszHost = ppszMXGWs[i], *pszOptions; if ((pszOptions = strchr(pszHost, ',')) != NULL) *pszOptions++ = '\0'; if ((ppGws[i] = (SMTPGateway *) SysAlloc(sizeof(SMTPGateway))) == NULL) { for (i--; i >= 0; i--) USmtpFreeGateway(ppGws[i]); SysFree(ppGws); SysFree(pszCfgOptions); StrFreeStrings(ppszMXGWs); return NULL; } ppGws[i]->pszHost = SysStrDup(pszHost); if ((pszOptions != NULL && USmtpSetGwOptions(ppGws[i], pszOptions) < 0) || (pszCfgOptions != NULL && USmtpSetGwOptions(ppGws[i], pszCfgOptions) < 0)) { for (; i >= 0; i--) USmtpFreeGateway(ppGws[i]); SysFree(ppGws); SysFree(pszCfgOptions); StrFreeStrings(ppszMXGWs); return NULL; } } ppGws[i] = NULL; SysFree(pszCfgOptions); StrFreeStrings(ppszMXGWs); return ppGws; } static int USmtpGetDomainMX(SVRCFG_HANDLE hSvrConfig, char const *pszDomain, char *&pszMXDomains) { int iResult; char *pszSmartDNS = SvrGetConfigVar(hSvrConfig, "SmartDNSHost"); iResult = CDNS_GetDomainMX(pszDomain, pszMXDomains, pszSmartDNS); SysFree(pszSmartDNS); return iResult; } int USmtpCheckMailDomain(SVRCFG_HANDLE hSvrConfig, char const *pszDomain) { char *pszMXDomains = NULL; SYS_INET_ADDR Addr; if (USmtpGetDomainMX(hSvrConfig, pszDomain, pszMXDomains) < 0) { if (SysGetHostByName(pszDomain, -1, Addr) < 0) { ErrSetErrorCode(ERR_INVALID_MAIL_DOMAIN); return ERR_INVALID_MAIL_DOMAIN; } } else SysFree(pszMXDomains); return 0; } MXS_HANDLE USmtpGetMXFirst(SVRCFG_HANDLE hSvrConfig, char const *pszDomain, char *pszMXHost) { /* Make a DNS query for domain MXs */ char *pszMXHosts = NULL; if (USmtpGetDomainMX(hSvrConfig, pszDomain, pszMXHosts) < 0) return INVALID_MXS_HANDLE; /* MX records structure allocation */ SmtpMXRecords *pMXR = (SmtpMXRecords *) SysAlloc(sizeof(SmtpMXRecords)); if (pMXR == NULL) { SysFree(pszMXHosts); return INVALID_MXS_HANDLE; } pMXR->iNumMXRecords = 0; pMXR->iCurrMxCost = -1; /* MX hosts string format = c:h[,c:h] where "c = cost" and "h = hosts" */ int iMXCost = INT_MAX; int iCurrIndex = -1; char *pszToken = NULL; char *pszSavePtr = NULL; pszToken = SysStrTok(pszMXHosts, ":, \t\r\n", &pszSavePtr); while (pMXR->iNumMXRecords < MAX_MX_RECORDS && pszToken != NULL) { /* Get MX cost */ int iCost = atoi(pszToken); if ((pszToken = SysStrTok(NULL, ":, \t\r\n", &pszSavePtr)) == NULL) { for (--pMXR->iNumMXRecords; pMXR->iNumMXRecords >= 0; pMXR->iNumMXRecords--) SysFree(pMXR->pszMXName[pMXR->iNumMXRecords]); SysFree(pMXR); SysFree(pszMXHosts); ErrSetErrorCode(ERR_INVALID_MXRECS_STRING); return INVALID_MXS_HANDLE; } pMXR->iMXCost[pMXR->iNumMXRecords] = iCost; pMXR->pszMXName[pMXR->iNumMXRecords] = SysStrDup(pszToken); if ((iCost < iMXCost) && (iCost >= pMXR->iCurrMxCost)) { iMXCost = iCost; strcpy(pszMXHost, pMXR->pszMXName[pMXR->iNumMXRecords]); iCurrIndex = pMXR->iNumMXRecords; } ++pMXR->iNumMXRecords; pszToken = SysStrTok(NULL, ":, \t\r\n", &pszSavePtr); } SysFree(pszMXHosts); if (iMXCost == INT_MAX) { for (--pMXR->iNumMXRecords; pMXR->iNumMXRecords >= 0; pMXR->iNumMXRecords--) SysFree(pMXR->pszMXName[pMXR->iNumMXRecords]); SysFree(pMXR); ErrSetErrorCode(ERR_INVALID_MXRECS_STRING); return INVALID_MXS_HANDLE; } pMXR->iCurrMxCost = iMXCost; pMXR->iMXCost[iCurrIndex] = iMXCost - 1; return (MXS_HANDLE) pMXR; } int USmtpGetMXNext(MXS_HANDLE hMXSHandle, char *pszMXHost) { SmtpMXRecords *pMXR = (SmtpMXRecords *) hMXSHandle; int iMXCost = INT_MAX; int iCurrIndex = -1; for (int i = 0; i < pMXR->iNumMXRecords; i++) { if ((pMXR->iMXCost[i] < iMXCost) && (pMXR->iMXCost[i] >= pMXR->iCurrMxCost)) { iMXCost = pMXR->iMXCost[i]; strcpy(pszMXHost, pMXR->pszMXName[i]); iCurrIndex = i; } } if (iMXCost == INT_MAX) { ErrSetErrorCode(ERR_NO_MORE_MXRECORDS); return ERR_NO_MORE_MXRECORDS; } pMXR->iCurrMxCost = iMXCost; pMXR->iMXCost[iCurrIndex] = iMXCost - 1; return 0; } void USmtpMXSClose(MXS_HANDLE hMXSHandle) { SmtpMXRecords *pMXR = (SmtpMXRecords *) hMXSHandle; for (--pMXR->iNumMXRecords; pMXR->iNumMXRecords >= 0; pMXR->iNumMXRecords--) SysFree(pMXR->pszMXName[pMXR->iNumMXRecords]); SysFree(pMXR); } int USmtpDnsMapsContained(SYS_INET_ADDR const &PeerInfo, char const *pszMapsServer) { SYS_INET_ADDR I4Addr, Addr; char szMapsQuery[256]; /* * Use the IPV4 reverse lookup syntax, if the address is a remapped * IPV4 address. */ if (SysInetIPV6ToIPV4(PeerInfo, I4Addr) == 0) { if (SysInetRevNToA(I4Addr, szMapsQuery, sizeof(szMapsQuery)) == NULL) return 0; } else { if (SysInetRevNToA(PeerInfo, szMapsQuery, sizeof(szMapsQuery)) == NULL) return 0; } StrSNCat(szMapsQuery, pszMapsServer); return SysGetHostByName(szMapsQuery, -1, Addr) < 0 ? 0: 1; } static char *USmtpGetSpammersFilePath(char *pszSpamFilePath, int iMaxPath) { CfgGetRootPath(pszSpamFilePath, iMaxPath); StrNCat(pszSpamFilePath, SMTP_SPAMMERS_FILE, iMaxPath); return pszSpamFilePath; } int USmtpSpammerCheck(const SYS_INET_ADDR &PeerInfo, char *&pszInfo) { pszInfo = NULL; char szSpammersFilePath[SYS_MAX_PATH] = ""; USmtpGetSpammersFilePath(szSpammersFilePath, sizeof(szSpammersFilePath)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szSpammersFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pSpammersFile = fopen(szSpammersFilePath, "rt"); if (pSpammersFile == NULL) { RLckUnlockSH(hResLock); ErrSetErrorCode(ERR_FILE_OPEN); return ERR_FILE_OPEN; } char szSpammerLine[SPAMMERS_LINE_MAX] = ""; while (MscGetConfigLine(szSpammerLine, sizeof(szSpammerLine) - 1, pSpammersFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szSpammerLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount < 1) { StrFreeStrings(ppszStrings); continue; } int iAddrFields = 1; if (iFieldsCount > 1 && isdigit(ppszStrings[1][0])) iAddrFields = 2; AddressFilter AF; if (MscLoadAddressFilter(ppszStrings, iAddrFields, AF) == 0 && MscAddressMatch(AF, PeerInfo)) { if (iFieldsCount > iAddrFields) pszInfo = SysStrDup(ppszStrings[iAddrFields]); StrFreeStrings(ppszStrings); fclose(pSpammersFile); RLckUnlockSH(hResLock); char szIP[128] = "???.???.???.???"; ErrSetErrorCode(ERR_SPAMMER_IP, SysInetNToA(PeerInfo, szIP, sizeof(szIP))); return ERR_SPAMMER_IP; } StrFreeStrings(ppszStrings); } fclose(pSpammersFile); RLckUnlockSH(hResLock); return 0; } static char *USmtpGetSpamAddrFilePath(char *pszSpamFilePath, int iMaxPath) { CfgGetRootPath(pszSpamFilePath, iMaxPath); StrNCat(pszSpamFilePath, SMTP_SPAM_ADDRESS_FILE, iMaxPath); return pszSpamFilePath; } int USmtpSpamAddressCheck(char const *pszAddress) { char szSpammersFilePath[SYS_MAX_PATH] = ""; USmtpGetSpamAddrFilePath(szSpammersFilePath, sizeof(szSpammersFilePath)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szSpammersFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pSpammersFile = fopen(szSpammersFilePath, "rt"); if (pSpammersFile == NULL) { RLckUnlockSH(hResLock); return 0; } char szSpammerLine[SPAM_ADDRESS_LINE_MAX] = ""; while (MscGetConfigLine(szSpammerLine, sizeof(szSpammerLine) - 1, pSpammersFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szSpammerLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if ((iFieldsCount > 0) && StrIWildMatch(pszAddress, ppszStrings[0])) { StrFreeStrings(ppszStrings); fclose(pSpammersFile); RLckUnlockSH(hResLock); ErrSetErrorCode(ERR_SPAM_ADDRESS, pszAddress); return ERR_SPAM_ADDRESS; } StrFreeStrings(ppszStrings); } fclose(pSpammersFile); RLckUnlockSH(hResLock); return 0; } int USmtpAddMessageInfo(FILE *pMsgFile, char const *pszClientDomain, SYS_INET_ADDR const &PeerInfo, char const *pszServerDomain, SYS_INET_ADDR const &SockInfo, char const *pszSmtpServerLogo) { char szTime[256] = ""; MscGetTimeStr(szTime, sizeof(szTime) - 1); char szPeerAddr[128] = ""; char szSockAddr[128] = ""; MscGetAddrString(PeerInfo, szPeerAddr, sizeof(szPeerAddr) - 1); MscGetAddrString(SockInfo, szSockAddr, sizeof(szSockAddr) - 1); /* Write message info. If You change the order ( or add new fields ) You must */ /* arrange fields into the SmtpMsgInfo union defined in SMTPUtils.h */ fprintf(pMsgFile, "%s;%s;%s;%s;%s;%s\r\n", pszClientDomain, szPeerAddr, pszServerDomain, szSockAddr, szTime, pszSmtpServerLogo); return 0; } int USmtpWriteInfoLine(FILE *pSpoolFile, char const *pszClientAddr, char const *pszServerAddr, char const *pszTime) { fprintf(pSpoolFile, "%s;%s;%s\r\n", pszClientAddr, pszServerAddr, pszTime); return 0; } char *USmtpGetReceived(int iType, char const *pszAuth, char const *const *ppszMsgInfo, char const *pszMailFrom, char const *pszRcptTo, char const *pszMessageID) { int iError; char szFrom[MAX_SMTP_ADDRESS] = ""; char szRcpt[MAX_SMTP_ADDRESS] = ""; /* * We allow empty senders. The "szFrom" is already initialized to the empty * string, so falling through is correct in this case. */ if ((iError = USmlParseAddress(pszMailFrom, NULL, 0, szFrom, sizeof(szFrom) - 1)) < 0 && iError != ERR_EMPTY_ADDRESS) return NULL; if (USmlParseAddress(pszRcptTo, NULL, 0, szRcpt, sizeof(szRcpt) - 1) < 0) return NULL; /* Parse special types to hide client info */ bool bHideClient = false; if (iType == RECEIVED_TYPE_AUTHSTD) { bHideClient = (pszAuth != NULL) && !IsEmptyString(pszAuth); iType = RECEIVED_TYPE_STD; } else if (iType == RECEIVED_TYPE_AUTHVERBOSE) { bHideClient = (pszAuth != NULL) && !IsEmptyString(pszAuth); iType = RECEIVED_TYPE_VERBOSE; } /* Return "Received:" tag */ char *pszReceived = NULL; switch (iType) { case RECEIVED_TYPE_STRICT: pszReceived = StrSprint("Received: from %s\r\n" "\tby %s with %s\r\n" "\tid <%s> for <%s> from <%s>;\r\n" "\t%s\r\n", ppszMsgInfo[smsgiClientDomain], ppszMsgInfo[smsgiServerDomain], ppszMsgInfo[smsgiSeverName], pszMessageID, szRcpt, szFrom, ppszMsgInfo[smsgiTime]); break; case RECEIVED_TYPE_VERBOSE: if (!bHideClient) pszReceived = StrSprint("Received: from %s (%s)\r\n" "\tby %s (%s) with %s\r\n" "\tid <%s> for <%s> from <%s>;\r\n" "\t%s\r\n", ppszMsgInfo[smsgiClientDomain], ppszMsgInfo[smsgiClientAddr], ppszMsgInfo[smsgiServerDomain], ppszMsgInfo[smsgiServerAddr], ppszMsgInfo[smsgiSeverName], pszMessageID, szRcpt, szFrom, ppszMsgInfo[smsgiTime]); else pszReceived = StrSprint("Received: from %s\r\n" "\tby %s (%s) with %s\r\n" "\tid <%s> for <%s> from <%s>;\r\n" "\t%s\r\n", ppszMsgInfo[smsgiClientDomain], ppszMsgInfo[smsgiServerDomain], ppszMsgInfo[smsgiServerAddr], ppszMsgInfo[smsgiSeverName], pszMessageID, szRcpt, szFrom, ppszMsgInfo[smsgiTime]); break; case RECEIVED_TYPE_STD: default: if (!bHideClient) pszReceived = StrSprint("Received: from %s (%s)\r\n" "\tby %s with %s\r\n" "\tid <%s> for <%s> from <%s>;\r\n" "\t%s\r\n", ppszMsgInfo[smsgiClientDomain], ppszMsgInfo[smsgiClientAddr], ppszMsgInfo[smsgiServerDomain], ppszMsgInfo[smsgiSeverName], pszMessageID, szRcpt, szFrom, ppszMsgInfo[smsgiTime]); else pszReceived = StrSprint("Received: from %s\r\n" "\tby %s with %s\r\n" "\tid <%s> for <%s> from <%s>;\r\n" "\t%s\r\n", ppszMsgInfo[smsgiClientDomain], ppszMsgInfo[smsgiServerDomain], ppszMsgInfo[smsgiSeverName], pszMessageID, szRcpt, szFrom, ppszMsgInfo[smsgiTime]); break; } return pszReceived; } xmail-1.27/SvrUtils.cpp0000644000175000017500000003201711341640430014325 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "ResLocks.h" #include "StrUtils.h" #include "SList.h" #include "Hash.h" #include "BuffSock.h" #include "MailConfig.h" #include "UsrUtils.h" #include "SvrUtils.h" #include "MessQueue.h" #include "SMAILUtils.h" #include "QueueUtils.h" #include "SMAILSvr.h" #include "AppDefines.h" #include "MailSvr.h" #include "MiscUtils.h" #define SVR_PROFILE_FILE "server.tab" #define MESSAGEID_FILE "message.id" #define SMTP_SPOOL_DIR "spool" #define SVR_PROFILE_LINE_MAX 2048 #define SYS_RES_CHECK_INTERVAL 8 #define SVR_CFGHASH_INITSIZE 32 struct ServerInfoVar { HashNode HN; char *pszValue; }; struct ServerConfigData { RLCK_HANDLE hResLock; int iWriteLock; HASH_HANDLE hHash; }; static char *SvrGetProfileFilePath(char *pszFilePath, int iMaxPath) { CfgGetRootPath(pszFilePath, iMaxPath); StrNCat(pszFilePath, SVR_PROFILE_FILE, iMaxPath); return pszFilePath; } static void SvrFreeConfigVar(ServerInfoVar *pSIV) { SysFree(pSIV->HN.Key.pData); SysFree(pSIV->pszValue); SysFree(pSIV); } static void SvrHFreeConfigVar(void *pPrivate, HashNode *pHN) { ServerInfoVar *pSIV = SYS_LIST_ENTRY(pHN, ServerInfoVar, HN); SvrFreeConfigVar(pSIV); } static ServerInfoVar *SvrAllocVar(const char *pszName, const char *pszValue) { char *pszDName; ServerInfoVar *pSIV; if ((pSIV = (ServerInfoVar *) SysAlloc(sizeof(ServerInfoVar))) == NULL) return NULL; HashInitNode(&pSIV->HN); pszDName = SysStrDup(pszName); pSIV->HN.Key.pData = pszDName; pSIV->pszValue = SysStrDup(pszValue); return pSIV; } static ServerInfoVar *SvrGetUserVar(HASH_HANDLE hHash, const char *pszName) { HashNode *pHNode; HashEnum HEnum; HashDatum Key; Key.pData = (void *) pszName; if (HashGetFirst(hHash, &Key, &HEnum, &pHNode) < 0) return NULL; return SYS_LIST_ENTRY(pHNode, ServerInfoVar, HN); } static int SvrReadConfig(HASH_HANDLE hHash, const char *pszFilePath) { FILE *pFile; RLCK_HANDLE hResLock; char szResLock[SYS_MAX_PATH]; char szProfileLine[SVR_PROFILE_LINE_MAX]; if ((hResLock = RLckLockSH(CfgGetBasedPath(pszFilePath, szResLock, sizeof(szResLock)))) == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); if ((pFile = fopen(pszFilePath, "rt")) == NULL) { RLckUnlockSH(hResLock); ErrSetErrorCode(ERR_NO_USER_PRFILE, pszFilePath); return ERR_NO_USER_PRFILE; } while (MscGetConfigLine(szProfileLine, sizeof(szProfileLine) - 1, pFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szProfileLine); if (ppszStrings == NULL) continue; if (StrStringsCount(ppszStrings) >= 2) { ServerInfoVar *pSIV = SvrAllocVar(ppszStrings[0], ppszStrings[1]); if (pSIV != NULL && HashAdd(hHash, &pSIV->HN) < 0) { SvrFreeConfigVar(pSIV); StrFreeStrings(ppszStrings); fclose(pFile); RLckUnlockSH(hResLock); return ErrGetErrorCode(); } } StrFreeStrings(ppszStrings); } fclose(pFile); RLckUnlockSH(hResLock); return 0; } static ServerConfigData *SvrAllocConfig(RLCK_HANDLE hResLock, int iWriteLock, const char *pszProfilePath) { ServerConfigData *pSCD; HashOps HOps; if ((pSCD = (ServerConfigData *) SysAlloc(sizeof(ServerConfigData))) == NULL) return NULL; pSCD->hResLock = hResLock; pSCD->iWriteLock = iWriteLock; ZeroData(HOps); HOps.pGetHashVal = MscStringHashCB; HOps.pCompare = MscStringCompareCB; if ((pSCD->hHash = HashCreate(&HOps, SVR_CFGHASH_INITSIZE)) == INVALID_HASH_HANDLE) { SysFree(pSCD); return NULL; } if (SvrReadConfig(pSCD->hHash, pszProfilePath) < 0) { HashFree(pSCD->hHash, SvrHFreeConfigVar, NULL); SysFree(pSCD); return NULL; } return pSCD; } SVRCFG_HANDLE SvrGetConfigHandle(int iWriteLock) { RLCK_HANDLE hResLock; ServerConfigData *pSCD; char szProfilePath[SYS_MAX_PATH]; char szResLock[SYS_MAX_PATH]; SvrGetProfileFilePath(szProfilePath, sizeof(szProfilePath)); if (iWriteLock) { if ((hResLock = RLckLockEX(CfgGetBasedPath(szProfilePath, szResLock, sizeof(szResLock)))) == INVALID_RLCK_HANDLE) return INVALID_SVRCFG_HANDLE; } else { if ((hResLock = RLckLockSH(CfgGetBasedPath(szProfilePath, szResLock, sizeof(szResLock)))) == INVALID_RLCK_HANDLE) return INVALID_SVRCFG_HANDLE; } if ((pSCD = SvrAllocConfig(hResLock, iWriteLock, szProfilePath)) == NULL) { if (iWriteLock) RLckUnlockEX(hResLock); else RLckUnlockSH(hResLock); return INVALID_SVRCFG_HANDLE; } return (SVRCFG_HANDLE) pSCD; } void SvrReleaseConfigHandle(SVRCFG_HANDLE hSvrConfig) { ServerConfigData *pSCD = (ServerConfigData *) hSvrConfig; if (pSCD->iWriteLock) RLckUnlockEX(pSCD->hResLock); else RLckUnlockSH(pSCD->hResLock); HashFree(pSCD->hHash, SvrHFreeConfigVar, NULL); SysFree(pSCD); } char *SvrGetConfigVar(SVRCFG_HANDLE hSvrConfig, const char *pszName, const char *pszDefault) { ServerConfigData *pSCD = (ServerConfigData *) hSvrConfig; ServerInfoVar *pSIV; if ((pSIV = SvrGetUserVar(pSCD->hHash, pszName)) != NULL) return SysStrDup(pSIV->pszValue); return pszDefault != NULL ? SysStrDup(pszDefault): NULL; } bool SvrTestConfigFlag(const char *pszName, bool bDefault, SVRCFG_HANDLE hSvrConfig) { char szValue[64]; SvrConfigVar(pszName, szValue, sizeof(szValue) - 1, hSvrConfig, (bDefault) ? "1": "0"); return atoi(szValue) != 0 ? true: false; } int SvrGetConfigInt(const char *pszName, int iDefault, SVRCFG_HANDLE hSvrConfig) { char szValue[64]; return SvrConfigVar(pszName, szValue, sizeof(szValue) - 1, hSvrConfig, NULL) < 0 || IsEmptyString(szValue) ? iDefault: atoi(szValue); } static int SvrWriteConfig(HASH_HANDLE hHash, FILE *pFile) { HashNode *pHNode; ServerInfoVar *pSIV; char *pszQuoted; HashEnum HEnum; if (HashFirst(hHash, &HEnum, &pHNode) == 0) { do { pSIV = SYS_LIST_ENTRY(pHNode, ServerInfoVar, HN); if ((pszQuoted = StrQuote((char *) pSIV->HN.Key.pData, '"')) == NULL) return ErrGetErrorCode(); fprintf(pFile, "%s\t", pszQuoted); SysFree(pszQuoted); if ((pszQuoted = StrQuote(pSIV->pszValue, '"')) == NULL) return ErrGetErrorCode(); fprintf(pFile, "%s\n", pszQuoted); SysFree(pszQuoted); } while (HashNext(hHash, &HEnum, &pHNode) == 0); } return 0; } int SysFlushConfig(SVRCFG_HANDLE hSvrConfig) { ServerConfigData *pSCD = (ServerConfigData *) hSvrConfig; int iError; FILE *pFile; char szProfilePath[SYS_MAX_PATH]; if (!pSCD->iWriteLock) { ErrSetErrorCode(ERR_SVR_PRFILE_NOT_LOCKED); return ERR_SVR_PRFILE_NOT_LOCKED; } SvrGetProfileFilePath(szProfilePath, sizeof(szProfilePath)); if ((pFile = fopen(szProfilePath, "wt")) == NULL) { ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } iError = SvrWriteConfig(pSCD->hHash, pFile); fclose(pFile); return iError; } int SvrGetMessageID(SYS_UINT64 *pullMessageID) { char szMsgIDFile[SYS_MAX_PATH] = ""; CfgGetRootPath(szMsgIDFile, sizeof(szMsgIDFile)); StrNCat(szMsgIDFile, MESSAGEID_FILE, sizeof(szMsgIDFile)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szMsgIDFile, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pMsgIDFile = fopen(szMsgIDFile, "r+b"); if (pMsgIDFile == NULL) { if ((pMsgIDFile = fopen(szMsgIDFile, "wb")) == NULL) { RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_FILE_CREATE, szMsgIDFile); return ERR_FILE_CREATE; } *pullMessageID = 1; } else { char szMessageID[128] = ""; if ((MscGetString(pMsgIDFile, szMessageID, sizeof(szMessageID) - 1) == NULL) || !isdigit(szMessageID[0])) { fclose(pMsgIDFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_INVALID_FILE, szMsgIDFile); return ERR_INVALID_FILE; } if (sscanf(szMessageID, SYS_LLU_FMT, pullMessageID) != 1) { fclose(pMsgIDFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_INVALID_FILE, szMsgIDFile); return ERR_INVALID_FILE; } } ++*pullMessageID; fseek(pMsgIDFile, 0, SEEK_SET); fprintf(pMsgIDFile, SYS_LLU_FMT "\r\n", *pullMessageID); fclose(pMsgIDFile); RLckUnlockEX(hResLock); return 0; } char *SvrGetLogsDir(char *pszLogsPath, int iMaxPath) { CfgGetRootPath(pszLogsPath, iMaxPath); StrNCat(pszLogsPath, SVR_LOGS_DIR, iMaxPath); return pszLogsPath; } char *SvrGetSpoolDir(char *pszSpoolPath, int iMaxPath) { CfgGetRootPath(pszSpoolPath, iMaxPath); StrNCat(pszSpoolPath, SMTP_SPOOL_DIR, iMaxPath); return pszSpoolPath; } int SvrConfigVar(const char *pszVarName, char *pszVarValue, int iMaxVarValue, SVRCFG_HANDLE hSvrConfig, const char *pszDefault) { int iReleaseConfig = 0; if (hSvrConfig == INVALID_SVRCFG_HANDLE) { if ((hSvrConfig = SvrGetConfigHandle()) == INVALID_SVRCFG_HANDLE) return ErrGetErrorCode(); ++iReleaseConfig; } char *pszValue = SvrGetConfigVar(hSvrConfig, pszVarName, pszDefault); if (pszValue == NULL) { if (iReleaseConfig) SvrReleaseConfigHandle(hSvrConfig); ErrSetErrorCode(ERR_CFG_VAR_NOT_FOUND); return ERR_CFG_VAR_NOT_FOUND; } strncpy(pszVarValue, pszValue, iMaxVarValue - 1); pszVarValue[iMaxVarValue - 1] = '\0'; SysFree(pszValue); if (iReleaseConfig) SvrReleaseConfigHandle(hSvrConfig); return 0; } int SvrCheckDiskSpace(unsigned long ulMinSpace) { time_t tNow = time(NULL); static SYS_INT64 FreeSpace = 0; static time_t tLastCheck = 0; if (tNow > (tLastCheck + SYS_RES_CHECK_INTERVAL)) { SYS_INT64 TotalSpace; char szRootDir[SYS_MAX_PATH] = ""; tLastCheck = tNow; CfgGetRootPath(szRootDir, sizeof(szRootDir)); if (SysGetDiskSpace(szRootDir, &TotalSpace, &FreeSpace) < 0) return ErrGetErrorCode(); } if (FreeSpace < (SYS_INT64) ulMinSpace) { ErrSetErrorCode(ERR_LOW_DISK_SPACE); return ERR_LOW_DISK_SPACE; } return 0; } int SvrCheckVirtMemSpace(unsigned long ulMinSpace) { time_t tNow = time(NULL); static SYS_INT64 FreeSpace = 0; static time_t tLastCheck = 0; if (tNow > tLastCheck + SYS_RES_CHECK_INTERVAL) { SYS_INT64 RamTotal, RamFree, VirtTotal; tLastCheck = tNow; if (SysMemoryInfo(&RamTotal, &RamFree, &VirtTotal, &FreeSpace) < 0) return ErrGetErrorCode(); } if (FreeSpace < (SYS_INT64) ulMinSpace) { ErrSetErrorCode(ERR_LOW_VM_SPACE); return ERR_LOW_VM_SPACE; } return 0; } static char *SvrGetProtoIPPropFile(const char *pszProto, char *pszFileName, int iMaxName) { char szMailRoot[SYS_MAX_PATH] = ""; CfgGetRootPath(szMailRoot, sizeof(szMailRoot)); SysSNPrintf(pszFileName, iMaxName, "%s%s.ipprop.tab", szMailRoot, pszProto); return pszFileName; } static char *SvrGetProtoHNPropFile(const char *pszProto, char *pszFileName, int iMaxName) { char szMailRoot[SYS_MAX_PATH] = ""; CfgGetRootPath(szMailRoot, sizeof(szMailRoot)); SysSNPrintf(pszFileName, iMaxName, "%s%s.hnprop.tab", szMailRoot, pszProto); return pszFileName; } int SvrEnumProtoProps(const char *pszProto, const SYS_INET_ADDR *pPeerInfo, const char *pszHostName, int (*pfEnum)(void *, const char *, const char *), void *pPrivate) { int i; char **ppszProps; char szProtoFile[SYS_MAX_PATH] = ""; if (pPeerInfo != NULL) { SvrGetProtoIPPropFile(pszProto, szProtoFile, sizeof(szProtoFile) - 1); if ((ppszProps = MscGetIPProperties(szProtoFile, pPeerInfo)) != NULL) { for (i = 1; ppszProps[i] != NULL; i++) { char *pszName = ppszProps[i]; char *pszVal = strchr(pszName, '='); if (pszVal != NULL) *pszVal++ = '\0'; if ((*pfEnum)(pPrivate, pszName, pszVal) < 0) { StrFreeStrings(ppszProps); return ErrGetErrorCode(); } } StrFreeStrings(ppszProps); } } SvrGetProtoHNPropFile(pszProto, szProtoFile, sizeof(szProtoFile) - 1); if (SysExistFile(szProtoFile)) { char szHostName[SYS_MAX_PATH] = ""; if (pszHostName == NULL) { if (pPeerInfo == NULL) { ErrSetErrorCode(ERR_INVALID_PARAMETER); return ERR_INVALID_PARAMETER; } if (SysGetHostByAddr(*pPeerInfo, szHostName, sizeof(szHostName)) < 0) return ErrGetErrorCode(); pszHostName = szHostName; } if ((ppszProps = MscGetHNProperties(szProtoFile, pszHostName)) != NULL) { for (i = 1; ppszProps[i] != NULL; i++) { char *pszName = ppszProps[i]; char *pszVal = strchr(pszName, '='); if (pszVal != NULL) *pszVal++ = '\0'; if ((*pfEnum)(pPrivate, pszName, pszVal) < 0) { StrFreeStrings(ppszProps); return ErrGetErrorCode(); } } StrFreeStrings(ppszProps); } } return 0; } xmail-1.27/XMCrypt.cpp0000644000175000017500000000270511341640430014101 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include #include #include char *StrCrypt(char const *pszString, char *pszCrypt) { strcpy(pszCrypt, ""); for (int ii = 0; pszString[ii] != '\0'; ii++) { unsigned int uChar = (unsigned int) pszString[ii]; char szByte[32] = ""; sprintf(szByte, "%02x", (uChar ^ 101) & 0xff); strcat(pszCrypt, szByte); } return pszCrypt; } int main(int argc, char *argv[]) { if (argc < 2) { printf("usage : %s password\n", argv[0]); return 1; } char szCrypt[1024] = ""; StrCrypt(argv[1], szCrypt); printf("%s\n", szCrypt); return 0; } xmail-1.27/MD5.h0000644000175000017500000000265211341640430012566 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _MD5_H #define _MD5_H #define MD5_DIGEST_LEN 16 typedef SYS_UINT32 md5_u32; typedef struct s_md5_ctx { md5_u32 i[2]; md5_u32 buf[4]; unsigned char in[64]; unsigned char digest[MD5_DIGEST_LEN]; } md5_ctx_t; void md5_init(md5_ctx_t *mdctx); void md5_update(md5_ctx_t *mdctx, unsigned char const *data, unsigned int size); void md5_final(md5_ctx_t *mdctx); void md5_hex(unsigned char *src, char *dst); void do_md5_file(FILE *file, long start, long bytes, char *hash); void do_md5_string(char const *pass, int passlen, char *hash); #endif xmail-1.27/UsrAuth.h0000644000175000017500000000271711341640430013576 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _USRAUTH_H #define _USRAUTH_H #define AUTH_SERVICE_POP3 "pop3" #define AUTH_SERVICE_SMTP "smtp" char *UAthGetRootPath(char const *pszService, char *pszAuthPath, int iMaxPath); int UAthAuthenticateUser(char const *pszService, char const *pszDomain, char const *pszUsername, char const *pszPassword); int UAthAddUser(char const *pszService, UserInfo * pUI); int UAthModifyUser(char const *pszService, UserInfo * pUI); int UAthDelUser(char const *pszService, UserInfo * pUI); int UAthDropDomain(char const *pszService, char const *pszDomain); #endif xmail-1.27/MkMachDep.cpp0000644000175000017500000000476311341640430014332 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include static int MkMachIsLE(void) { union MachWordBytes { unsigned int w; unsigned char b[sizeof(unsigned int)]; } MWB; MWB.w = 1; return MWB.b[0] != 0; } static int MkMachIsLEBF(void) { union MachBitField { struct { unsigned int b:1; } BF; unsigned int w; } MWB; MWB.w = 1; return MWB.BF.b != 0; } static int MkMachGenType(int iBits, char const *pszBase) { fprintf(stdout, "typedef signed %s MachInt%d;\n" "typedef unsigned %s MachUInt%d;\n" "#define MACH_TYPE_%dBIT %s\n\n", pszBase, iBits, pszBase, iBits, iBits, pszBase); return 0; } int main(int argc, char *argv[]) { fprintf(stdout, "#ifndef _MACHDEFS_H\n" "#define _MACHDEFS_H\n\n\n"); if (!MkMachIsLE()) fprintf(stdout, "#define MACH_BIG_ENDIAN_WORDS\n\n"); else fprintf(stdout, "#undef MACH_BIG_ENDIAN_WORDS\n\n"); if (!MkMachIsLEBF()) fprintf(stdout, "#define MACH_BIG_ENDIAN_BITFIELD\n\n"); else fprintf(stdout, "#undef MACH_BIG_ENDIAN_BITFIELD\n\n"); MkMachGenType(8, "char"); if (sizeof(short) == 2) MkMachGenType(16, "short"); else if (sizeof(int) == 2) MkMachGenType(16, "int"); else if (sizeof(long) == 2) MkMachGenType(16, "long"); if (sizeof(char) == 4) MkMachGenType(32, "char"); else if (sizeof(short) == 4) MkMachGenType(32, "short"); else if (sizeof(int) == 4) MkMachGenType(32, "int"); else if (sizeof(long) == 4) MkMachGenType(32, "long"); #if defined(_MSC_VER) MkMachGenType(64, "__int64"); #elif defined(__GNUC__) || defined(__SUNPRO_CC) MkMachGenType(64, "long long"); #else #error Your compiler is not supported! #endif fprintf(stdout, "\n\n" "#endif\n\n"); return 0; } xmail-1.27/UsrAuth.cpp0000644000175000017500000001472111341640430014127 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "ResLocks.h" #include "StrUtils.h" #include "SList.h" #include "BuffSock.h" #include "MailConfig.h" #include "SvrUtils.h" #include "UsrUtils.h" #include "MessQueue.h" #include "SMAILUtils.h" #include "QueueUtils.h" #include "MailSvr.h" #include "MiscUtils.h" #include "UsrAuth.h" #define USER_AUTH_DIR "userauth" #define AUTH_LINE_MAX 1024 #define AUTH_AUTHENTICATE_CONFIG "userauth" #define AUTH_ADD_CONFIG "useradd" #define AUTH_MODIFY_CONFIG "useredit" #define AUTH_DEL_CONFIG "userdel" #define AUTH_DROPDOMAIN_CONFIG "domaindrop" #define USER_AUTH_TIMEOUT 60000 #define USER_AUTH_PRIORITY SYS_PRIORITY_NORMAL #define AUTH_SUCCESS_CODE 0 struct UAuthMacroSubstCtx { char const *pszDomain; char const *pszUsername; char const *pszPassword; UserInfo *pUI; }; char *UAthGetRootPath(char const *pszService, char *pszAuthPath, int iMaxPath) { CfgGetRootPath(pszAuthPath, iMaxPath); StrNCat(pszAuthPath, USER_AUTH_DIR, iMaxPath); AppendSlash(pszAuthPath); StrNCat(pszAuthPath, pszService, iMaxPath); AppendSlash(pszAuthPath); return pszAuthPath; } static int UAthGetConfigPath(char const *pszService, char const *pszDomain, char *pszConfigPath) { char szAuthPath[SYS_MAX_PATH] = ""; UAthGetRootPath(pszService, szAuthPath, sizeof(szAuthPath)); /* Check domain specific config */ sprintf(pszConfigPath, "%s%s.tab", szAuthPath, pszDomain); if (SysExistFile(pszConfigPath)) return 0; /* Check default config */ sprintf(pszConfigPath, "%s.tab", szAuthPath); if (SysExistFile(pszConfigPath)) return 0; ErrSetErrorCode(ERR_NO_EXTERNAL_AUTH_DEFINED); return ERR_NO_EXTERNAL_AUTH_DEFINED; } static char *UAthAuthMacroLkupProc(void *pPrivate, char const *pszName, int iSize) { UAuthMacroSubstCtx *pUATH = (UAuthMacroSubstCtx *) pPrivate; if (MemMatch(pszName, iSize, "DOMAIN", 6)) { return SysStrDup(pUATH->pszDomain != NULL ? pUATH->pszDomain: ""); } else if (MemMatch(pszName, iSize, "USER", 4)) { return SysStrDup(pUATH->pszUsername != NULL ? pUATH->pszUsername: ""); } else if (MemMatch(pszName, iSize, "PASSWD", 6)) { return SysStrDup(pUATH->pszPassword != NULL ? pUATH->pszPassword: ""); } else if (MemMatch(pszName, iSize, "PATH", 4)) { char szUserPath[SYS_MAX_PATH] = ""; if (pUATH->pUI != NULL) UsrGetUserPath(pUATH->pUI, szUserPath, sizeof(szUserPath), 0); return SysStrDup(szUserPath); } return SysStrDup(""); } static int UAthMacroSubstitutes(char **ppszCmdTokens, char const *pszDomain, char const *pszUsername, char const *pszPassword, UserInfo *pUI) { UAuthMacroSubstCtx UATH; ZeroData(UATH); UATH.pszDomain = pszDomain; UATH.pszUsername = pszUsername; UATH.pszPassword = pszPassword; UATH.pUI = pUI; return MscReplaceTokens(ppszCmdTokens, UAthAuthMacroLkupProc, &UATH); } static int UAthExecAuthOp(char const *pszService, char const *pszAuthOp, char const *pszDomain, char const *pszUsername, char const *pszPassword, UserInfo *pUI) { char szAuthConfigPath[SYS_MAX_PATH] = ""; if (UAthGetConfigPath(pszService, pszDomain, szAuthConfigPath) < 0) return ErrGetErrorCode(); FILE *pAuthFile = fopen(szAuthConfigPath, "rt"); if (pAuthFile == NULL) { ErrSetErrorCode(ERR_FILE_OPEN, szAuthConfigPath); return ERR_FILE_OPEN; } char szAuthLine[AUTH_LINE_MAX] = ""; while (MscGetConfigLine(szAuthLine, sizeof(szAuthLine) - 1, pAuthFile) != NULL) { char **ppszCmdTokens = StrGetTabLineStrings(szAuthLine); if (ppszCmdTokens == NULL) continue; int iFieldsCount = StrStringsCount(ppszCmdTokens); if (iFieldsCount > 1 && stricmp(ppszCmdTokens[0], pszAuthOp) == 0) { /* Do auth line macro substitution */ UAthMacroSubstitutes(ppszCmdTokens, pszDomain, pszUsername, pszPassword, pUI); int iExitCode = 0; if (SysExec(ppszCmdTokens[1], &ppszCmdTokens[1], USER_AUTH_TIMEOUT, USER_AUTH_PRIORITY, &iExitCode) == 0) { if (iExitCode != AUTH_SUCCESS_CODE) { StrFreeStrings(ppszCmdTokens); fclose(pAuthFile); ErrSetErrorCode(ERR_EXTERNAL_AUTH_FAILURE); return ERR_EXTERNAL_AUTH_FAILURE; } StrFreeStrings(ppszCmdTokens); fclose(pAuthFile); return 0; } else { StrFreeStrings(ppszCmdTokens); fclose(pAuthFile); SysLogMessage(LOG_LEV_MESSAGE, "Execution error in authentication file \"%s\"\n", szAuthConfigPath); ErrSetErrorCode(ERR_EXTERNAL_AUTH_FAILURE); return ERR_EXTERNAL_AUTH_FAILURE; } } StrFreeStrings(ppszCmdTokens); } fclose(pAuthFile); ErrSetErrorCode(ERR_NO_EXTERNAL_AUTH_DEFINED); return ERR_NO_EXTERNAL_AUTH_DEFINED; } int UAthAuthenticateUser(char const *pszService, char const *pszDomain, char const *pszUsername, char const *pszPassword) { return (UAthExecAuthOp(pszService, AUTH_AUTHENTICATE_CONFIG, pszDomain, pszUsername, pszPassword, NULL)); } int UAthAddUser(char const *pszService, UserInfo *pUI) { return (UAthExecAuthOp(pszService, AUTH_ADD_CONFIG, pUI->pszDomain, pUI->pszName, pUI->pszPassword, pUI)); } int UAthModifyUser(char const *pszService, UserInfo *pUI) { return (UAthExecAuthOp(pszService, AUTH_MODIFY_CONFIG, pUI->pszDomain, pUI->pszName, pUI->pszPassword, pUI)); } int UAthDelUser(char const *pszService, UserInfo *pUI) { return (UAthExecAuthOp(pszService, AUTH_DEL_CONFIG, pUI->pszDomain, pUI->pszName, pUI->pszPassword, pUI)); } int UAthDropDomain(char const *pszService, char const *pszDomain) { return UAthExecAuthOp(pszService, AUTH_DROPDOMAIN_CONFIG, pszDomain, NULL, NULL, NULL); } xmail-1.27/Makefile.bsd0000644000175000017500000000575411341640430014245 0ustar davidedavide# # XMail by Davide Libenzi (Intranet and Internet mail server) # Copyright (C) 1999,..,2010 Davide Libenzi # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Davide Libenzi # CC = g++ LD = g++ STRIP = strip ifeq ("$(XMAIL_FILE_OFF_BITS)", "") CFLAGS := $(CFLAGS) -D_FILE_OFFSET_BITS=64 else CFLAGS := $(CFLAGS) -D_FILE_OFFSET_BITS=$(XMAIL_FILE_OFF_BITS) endif ifneq ("$(WITH_SSL_INCLUDE)", "") CFLAGS := $(CFLAGS) -I$(WITH_SSL_INCLUDE) endif ifneq ("$(WITH_SSL_LIB)", "") LDFLAGS := $(LDFLAGS) -L$(WITH_SSL_LIB) endif ifeq ("$(SSLLIBS)", "") SSLLIBS = -lssl -lcrypto endif MAINSRC = MainBSD.cpp SYSSRCS = SysDepBSD.cpp SysDepUnix.cpp SysOsEventfd_pipe.cpp ifeq ($(OSTYPE),OpenBSD) SYSTYPE = openbsd CFLAGS := $(CFLAGS) -I. -D__UNIX__ -D__BSD__ -D__OPENBSD__ -D_REENTRANT=1 -D_THREAD_SAFE=1 -DHAS_SYSMACHINE LDFLAGS := $(LDFLAGS) $(SSLLIBS) -lkvm -pthread else ifeq ($(OSTYPE),NetBSD) SYSTYPE = netbsd CVFS = $(shell grep -c statvfs /usr/include/sys/statvfs.h) ifneq ("$(CVFS)", "0") CFLAGS := $(CFLAGS) -DBSD_USE_STATVFS endif CFLAGS := $(CFLAGS) -I. -D__UNIX__ -D__BSD__ -D__NETBSD__ -D_REENTRANT=1 -D_THREAD_SAFE=1 -DHAS_SYSMACHINE LDFLAGS := $(LDFLAGS) $(SSLLIBS) -lkvm -pthread else ifeq ($(OSTYPE),Darwin) SYSTYPE = darwin CFLAGS := $(CFLAGS) -I. -D__UNIX__ -D__BSD__ -D__DARWIN__ -D_REENTRANT=1 -D_THREAD_SAFE=1 -DHAS_SYSMACHINE LDFLAGS := $(LDFLAGS) $(SSLLIBS) -lkvm -lpthread else ifeq ($(OSTYPE),Darwin10.5) SYSTYPE = darwin-10.5 CFLAGS := $(CFLAGS) -I. -D__UNIX__ -D__BSD__ -D__DARWIN__ -D__DARWIN_10_5__ -D_REENTRANT=1 \ -D_THREAD_SAFE=1 -DHAS_SYSMACHINE LDFLAGS := $(LDFLAGS) $(SSLLIBS) -lpthread else ifeq ($(OSTYPE),GNU/kFreeBSD) SYSTYPE = freebsd CFLAGS := $(CFLAGS) -I. -D__UNIX__ -D__BSD__ -D__FREEBSD__ -D_REENTRANT=1 -D_THREAD_SAFE=1 -DHAS_SYSMACHINE LDFLAGS := $(LDFLAGS) $(SSLLIBS) -lkvm -pthread else SYSTYPE = freebsd ifeq ($(wildcard /usr/lib/libc_r.*), ) LIBC_R = else LIBC_R = -lc_r endif CFLAGS := $(CFLAGS) -I. -D__UNIX__ -D__BSD__ -D__FREEBSD__ -D_REENTRANT=1 -D_THREAD_SAFE=1 -DHAS_SYSMACHINE LDFLAGS := $(LDFLAGS) $(SSLLIBS) -lkvm -lcrypt -pthread $(LIBC_R) endif endif endif endif endif CFLAGS := $(CFLAGS) -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -D_POSIX_PTHREAD_SEMANTICS ifeq ($(NEED_LCR),1) LDFLAGS := $(LDFLAGS) -lc_r endif include Makefile.common xmail-1.27/SysDep.h0000644000175000017500000002166611341640430013416 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SYSDEP_H #define _SYSDEP_H #define SYS_SHUTDOWN_SOFT 0 #define LOG_LEV_DEBUG 0 #define LOG_LEV_MESSAGE 1 #define LOG_LEV_WARNING 2 #define LOG_LEV_ERROR 3 #define SYS_PRIORITY_LOWER (-1) #define SYS_PRIORITY_NORMAL 0 #define SYS_PRIORITY_HIGHER 1 #define SYS_THREAD_ATTACH 1 #define SYS_THREAD_DETACH 2 #define SYS_MMAP_READ (1 << 0) #define SYS_MMAP_WRITE (1 << 1) #define SYS_INET46 (-1) #define SYS_INET64 (-2) #define SYS_IS_VALID_FILENAME(f) ((strcmp(f, ".") != 0) && (strcmp(f, "..") != 0)) enum SysFileTypes { ftNormal = 1, ftDirectory, ftLink, ftOther, ftMax }; struct SYS_FILE_INFO { int iFileType; SYS_OFF_T llSize; time_t tMod; }; struct SYS_INET_ADDR { int iSize; unsigned char Addr[128 - sizeof(int)]; }; int SysInitLibrary(void); void SysCleanupLibrary(void); int SysAddThreadExitHook(void (*pfHook)(void *, SYS_THREAD, int), void *pPrivate); int SysShutdownLibrary(int iMode = SYS_SHUTDOWN_SOFT); int SysSetupSocketBuffers(int *piSndBufSize, int *piRcvBufSize); SYS_SOCKET SysCreateSocket(int iAddressFamily, int iType, int iProtocol); void SysCloseSocket(SYS_SOCKET SockFD); int SysShutdownSocket(SYS_SOCKET SockFD, int iHow); int SysBlockSocket(SYS_SOCKET SockFD, int iBlocking); int SysBindSocket(SYS_SOCKET SockFD, const SYS_INET_ADDR *SockName); void SysListenSocket(SYS_SOCKET SockFD, int iConnections); int SysRecvData(SYS_SOCKET SockFD, char *pszBuffer, int iBufferSize, int iTimeout); int SysRecv(SYS_SOCKET SockFD, char *pszBuffer, int iBufferSize, int iTimeout); int SysRecvDataFrom(SYS_SOCKET SockFD, SYS_INET_ADDR *pFrom, char *pszBuffer, int iBufferSize, int iTimeout); int SysSendData(SYS_SOCKET SockFD, char const *pszBuffer, int iBufferSize, int iTimeout); int SysSend(SYS_SOCKET SockFD, char const *pszBuffer, int iBufferSize, int iTimeout); int SysSendDataTo(SYS_SOCKET SockFD, const SYS_INET_ADDR *pTo, char const *pszBuffer, int iBufferSize, int iTimeout); int SysConnect(SYS_SOCKET SockFD, const SYS_INET_ADDR *pSockName, int iTimeout); SYS_SOCKET SysAccept(SYS_SOCKET SockFD, SYS_INET_ADDR *pSockName, int iTimeout); int SysSelect(int iMaxFD, SYS_fd_set *pReadFDs, SYS_fd_set *pWriteFDs, SYS_fd_set *pExcptFDs, int iTimeout); int SysSendFile(SYS_SOCKET SockFD, char const *pszFileName, SYS_OFF_T llBaseOffset, SYS_OFF_T llEndOffset, int iTimeout); int SysInetAnySetup(SYS_INET_ADDR &AddrInfo, int iFamily, int iPortNo); int SysGetAddrFamily(SYS_INET_ADDR const &AddrInfo); int SysGetAddrPort(SYS_INET_ADDR const &AddrInfo); int SysSetAddrPort(SYS_INET_ADDR &AddrInfo, int iPortNo); int SysGetHostByName(char const *pszName, int iFamily, SYS_INET_ADDR &AddrInfo); int SysGetHostByAddr(SYS_INET_ADDR const &AddrInfo, char *pszFQDN, int iSize); int SysGetPeerInfo(SYS_SOCKET SockFD, SYS_INET_ADDR &AddrInfo); int SysGetSockInfo(SYS_SOCKET SockFD, SYS_INET_ADDR &AddrInfo); char *SysInetNToA(SYS_INET_ADDR const &AddrInfo, char *pszIP, int iSize); char *SysInetRevNToA(SYS_INET_ADDR const &AddrInfo, char *pszRevIP, int iSize); void const *SysInetAddrData(SYS_INET_ADDR const &AddrInfo, int *piSize); int SysInetIPV6CompatIPV4(SYS_INET_ADDR const &Addr); int SysInetIPV6ToIPV4(SYS_INET_ADDR const &SAddr, SYS_INET_ADDR &DAddr); int SysInetAddrMatch(SYS_INET_ADDR const &Addr, SYS_UINT8 const *pMask, int iMaskSize, SYS_INET_ADDR const &TestAddr); int SysInetAddrMatch(SYS_INET_ADDR const &Addr, SYS_INET_ADDR const &TestAddr); SYS_SEMAPHORE SysCreateSemaphore(int iInitCount, int iMaxCount); int SysCloseSemaphore(SYS_SEMAPHORE hSemaphore); int SysWaitSemaphore(SYS_SEMAPHORE hSemaphore, int iTimeout); int SysReleaseSemaphore(SYS_SEMAPHORE hSemaphore, int iCount); int SysTryWaitSemaphore(SYS_SEMAPHORE hSemaphore); SYS_MUTEX SysCreateMutex(void); int SysCloseMutex(SYS_MUTEX hMutex); int SysLockMutex(SYS_MUTEX hMutex, int iTimeout); int SysUnlockMutex(SYS_MUTEX hMutex); int SysTryLockMutex(SYS_MUTEX hMutex); SYS_EVENT SysCreateEvent(int iManualReset); int SysCloseEvent(SYS_EVENT hEvent); int SysWaitEvent(SYS_EVENT hEvent, int iTimeout); int SysSetEvent(SYS_EVENT hEvent); int SysResetEvent(SYS_EVENT hEvent); int SysTryWaitEvent(SYS_EVENT hEvent); /* * Why? On Unix, the best implementation for events is based on the pthread * API, which cannot be waited together with file/socket descriptors (unless * you do use separate wait threads, which is a lot uglier than having two * event APIs). */ SYS_PEVENT SysCreatePEvent(int iManualReset); int SysClosePEvent(SYS_PEVENT hPEvent); int SysWaitPEvent(SYS_PEVENT hPEvent, int iTimeout); int SysSetPEvent(SYS_PEVENT hPEvent); int SysResetPEvent(SYS_PEVENT hPEvent); int SysTryWaitPEvent(SYS_PEVENT hPEvent); SYS_THREAD SysCreateThread(unsigned int (*pThreadProc) (void *), void *pThreadData); void SysCloseThread(SYS_THREAD ThreadID, int iForce); int SysSetThreadPriority(SYS_THREAD ThreadID, int iPriority); int SysWaitThread(SYS_THREAD ThreadID, int iTimeout); unsigned long SysGetCurrentThreadId(void); int SysExec(char const *pszCommand, char const *const *pszArgs, int iWaitTimeout = 0, int iPriority = SYS_PRIORITY_NORMAL, int *piExitStatus = NULL); void SysSetBreakHandler(void (*pBreakHandler) (void)); unsigned long SysGetCurrentProcessId(void); int SysCreateTlsKey(SYS_TLSKEY &TlsKey, void (*pFreeProc) (void *) = NULL); int SysDeleteTlsKey(SYS_TLSKEY &TlsKey); int SysSetTlsKeyData(SYS_TLSKEY &TlsKey, void *pData); void *SysGetTlsKeyData(SYS_TLSKEY &TlsKey); void SysThreadOnce(SYS_THREAD_ONCE *pThrOnce, void (*pOnceProc) (void)); void *SysAllocNZ(unsigned int uSize); void *SysAlloc(unsigned int uSize); void SysFree(void *pData); void *SysRealloc(void *pData, unsigned int uSize); int SysLockFile(char const *pszFileName, char const *pszLockExt = ".lock"); int SysUnlockFile(char const *pszFileName, char const *pszLockExt = ".lock"); SYS_HANDLE SysOpenModule(char const *pszFilePath); int SysCloseModule(SYS_HANDLE hModule); void *SysGetSymbol(SYS_HANDLE hModule, char const *pszSymbol); int SysEventLogV(int iLogLevel, char const *pszFormat, va_list Args); int SysEventLog(int iLogLevel, char const *pszFormat, ...); int SysLogMessage(int iLogLevel, char const *pszFormat, ...); int SysSleep(int iTimeout); int SysMsSleep(int iMsTimeout); SYS_INT64 SysMsTime(void); int SysExistFile(char const *pszFilePath); int SysExistDir(char const *pszDirPath); SYS_HANDLE SysFirstFile(char const *pszPath, char *pszFileName, int iSize); int SysIsDirectory(SYS_HANDLE hFind); SYS_OFF_T SysGetSize(SYS_HANDLE hFind); int SysNextFile(SYS_HANDLE hFind, char *pszFileName, int iSize); void SysFindClose(SYS_HANDLE hFind); int SysGetFileInfo(char const *pszFileName, SYS_FILE_INFO &FI); int SysSetFileModTime(char const *pszFileName, time_t tMod); char *SysStrDup(char const *pszString); char *SysGetEnv(char const *pszVarName); char *SysGetTempDir(char *pszPath, int iMaxPath); int SysRemove(char const *pszFileName); int SysMakeDir(char const *pszPath); int SysRemoveDir(char const *pszPath); int SysMoveFile(char const *pszOldName, char const *pszNewName); int SysVSNPrintf(char *pszBuffer, int iSize, char const *pszFormat, va_list Args); int SysFileSync(FILE *pFile); char *SysStrTok(char *pszData, char const *pszDelim, char **ppszSavePtr); char *SysCTime(time_t *pTimer, char *pszBuffer, int iBufferSize); struct tm *SysLocalTime(time_t *pTimer, struct tm *pTStruct); struct tm *SysGMTime(time_t *pTimer, struct tm *pTStruct); char *SysAscTime(struct tm *pTStruct, char *pszBuffer, int iBufferSize); long SysGetTimeZone(void); long SysGetDayLight(void); int SysGetDiskSpace(char const *pszPath, SYS_INT64 *pTotal, SYS_INT64 *pFree); int SysMemoryInfo(SYS_INT64 *pRamTotal, SYS_INT64 *pRamFree, SYS_INT64 *pVirtTotal, SYS_INT64 *pVirtFree); SYS_MMAP SysCreateMMap(char const *pszFileName, unsigned long ulFlags); void SysCloseMMap(SYS_MMAP hMap); SYS_OFF_T SysMMapSize(SYS_MMAP hMap); SYS_OFF_T SysMMapOffsetAlign(SYS_MMAP hMap, SYS_OFF_T llOffset); void *SysMapMMap(SYS_MMAP hMap, SYS_OFF_T llOffset, SYS_SIZE_T lSize); int SysUnmapMMap(SYS_MMAP hMap, void *pAddr, SYS_SIZE_T lSize); #endif xmail-1.27/POP3Utils.h0000644000175000017500000000615111341640430013741 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _POP3UTILS_H #define _POP3UTILS_H #define INVALID_POP3_HANDLE ((POP3_HANDLE) 0) #define POP3_USER_SPLITTERS "@:%" typedef struct POP3_HANDLE_struct { } *POP3_HANDLE; struct MailSyncReport { int iMsgSync; int iMsgErr; SYS_OFF_T llSizeSync; SYS_OFF_T llSizeErr; }; struct PopLastLoginInfo { SYS_INET_ADDR Address; time_t LTime; }; int UPopGetMailboxSize(UserInfo *pUI, SYS_OFF_T &llMBSize, unsigned long &ulNumMessages); int UPopCheckMailboxSize(UserInfo *pUI, SYS_OFF_T *pllAvailSpace = NULL); int UPopAuthenticateAPOP(char const *pszDomain, char const *pszUsrName, char const *pszTimeStamp, char const *pszDigest); POP3_HANDLE UPopBuildSession(char const *pszDomain, char const *pszUsrName, char const *pszUsrPass, SYS_INET_ADDR const *pPeerInfo); void UPopReleaseSession(POP3_HANDLE hPOPSession, int iUpdate = 1); char *UPopGetUserInfoVar(POP3_HANDLE hPOPSession, char const *pszName, char const *pszDefault = NULL); int UPopGetSessionMsgCurrent(POP3_HANDLE hPOPSession); int UPopGetSessionMsgTotal(POP3_HANDLE hPOPSession); SYS_OFF_T UPopGetSessionMBSize(POP3_HANDLE hPOPSession); int UPopGetSessionLastAccessed(POP3_HANDLE hPOPSession); int UPopGetMessageSize(POP3_HANDLE hPOPSession, int iMsgIndex, SYS_OFF_T &llMessageSize); int UPopGetMessageUIDL(POP3_HANDLE hPOPSession, int iMsgIndex, char *pszMessageUIDL, int iSize); int UPopDeleteMessage(POP3_HANDLE hPOPSession, int iMsgIndex); int UPopResetSession(POP3_HANDLE hPOPSession); int UPopSendErrorResponse(BSOCK_HANDLE hBSock, int iErrorCode, int iTimeout); int UPopSessionSendMsg(POP3_HANDLE hPOPSession, int iMsgIndex, BSOCK_HANDLE hBSock); int UPopSessionTopMsg(POP3_HANDLE hPOPSession, int iMsgIndex, int iNumLines, BSOCK_HANDLE hBSock); int UPopSaveUserIP(POP3_HANDLE hPOPSession); int UPopSyncRemoteLink(char const *pszSyncAddr, char const *pszRmtServer, char const *pszRmtName, char const *pszRmtPassword, MailSyncReport *pSRep, char const *pszSyncCfg, char const *pszFetchHdrTags = "+X-Deliver-To,To,Cc", char const *pszErrorAccount = NULL); int UPopUserIpCheck(UserInfo *pUI, SYS_INET_ADDR const *pPeerInfo, unsigned int uExpireTime); int UPopGetLastLoginInfo(UserInfo *pUI, PopLastLoginInfo *pInfo); #endif xmail-1.27/SysDepUnix.cpp0000644000175000017500000012246011341640430014607 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SysDepUnix.h" #include "AppDefines.h" #define SCHED_PRIORITY_INC 5 #define SYS_MAX_TH_EXIT_HOOKS 64 #define SYS_PWAIT_HASHSIZE 101 #define SYSERR_EXEC 255 #define SYS_INT_CALL() (!iShutDown && (errno == EINTR)) #define SYS_STDERR_WRITE(s) write(2, s, strlen(s)) struct PidWaitData { SysListHead Lnk; int iPipeFds[2]; pid_t PID; int iExitStatus; int iTermSignal; }; static int iNumThExitHooks; static volatile int iShutDown; static pthread_t SigThreadID; static int iSignalPipe[2]; static SYS_EVENTFD hShdwnEventfd; static pthread_mutex_t PWaitMutex = PTHREAD_MUTEX_INITIALIZER; static SysListHead PWaitLists[SYS_PWAIT_HASHSIZE]; static ThreadExitHook ThExitHooks[SYS_MAX_TH_EXIT_HOOKS]; static pthread_mutex_t LogMutex = PTHREAD_MUTEX_INITIALIZER; static void (*pSysBreakHandler) (void) = NULL; static int iSndBufSize = -1, iRcvBufSize = -1; static int SysSetSignal(int iSigNo, void (*pSigProc) (int)) { signal(iSigNo, pSigProc); return 0; } static void SysRunThreadExitHooks(SYS_THREAD ThreadID, int iMode) { int i; for (i = iNumThExitHooks - 1; i >= 0; i--) (*ThExitHooks[i].pfHook)(ThExitHooks[i].pPrivate, ThreadID, iMode); } static void SysGetTimeOfDay(struct timespec *pTS) { struct timeval tvNow; gettimeofday(&tvNow, NULL); pTS->tv_sec = tvNow.tv_sec; pTS->tv_nsec = tvNow.tv_usec * 1000L; } static void SysTimeAddOffset(struct timespec *pTS, long iMsOffset) { pTS->tv_sec += iMsOffset / 1000; pTS->tv_nsec += (iMsOffset % 1000) * 1000000L; if (pTS->tv_nsec >= 1000000000L) { pTS->tv_sec += pTS->tv_nsec / 1000000000L; pTS->tv_nsec %= 1000000000L; } } int SysBlockFD(int iFD, int iBlocking) { long lFlags; if ((lFlags = fcntl(iFD, F_GETFL, 0)) == -1) { ErrSetErrorCode(ERR_NETWORK); return ERR_NETWORK; } if (iBlocking == 0) lFlags |= O_NONBLOCK; else lFlags &= ~O_NONBLOCK; if (fcntl(iFD, F_SETFL, lFlags) == -1) { ErrSetErrorCode(ERR_NETWORK); return ERR_NETWORK; } return 0; } int SysFdWait(int iFD, unsigned int uEvents, int iTimeout) { int iError; struct pollfd PollFD[2]; ZeroData(PollFD); PollFD[0].fd = iFD; PollFD[0].events = uEvents; PollFD[1].fd = SysEventfdWaitFD(hShdwnEventfd); PollFD[1].events = POLLIN; if ((iError = poll(PollFD, 2, iTimeout)) == -1) { ErrSetErrorCode(ERR_WAIT); return ERR_WAIT; } if (iError == 0) { ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } if (PollFD[1].revents & POLLIN) { ErrSetErrorCode(ERR_SERVER_SHUTDOWN); return ERR_SERVER_SHUTDOWN; } return 0; } static int SysWaitInit(WaitCond *pWC) { if (pthread_mutex_init(&pWC->Mtx, NULL) != 0) { ErrSetErrorCode(ERR_MUTEXINIT); return ERR_MUTEXINIT; } if (pthread_cond_init(&pWC->Cond, NULL) != 0) { pthread_mutex_destroy(&pWC->Mtx); ErrSetErrorCode(ERR_CONDINIT); return ERR_CONDINIT; } return 0; } static void SysWaitCleanup(WaitCond *pWC) { pthread_cond_destroy(&pWC->Cond); pthread_mutex_destroy(&pWC->Mtx); } static void SysWaitLock(WaitCond *pWC) { pthread_mutex_lock(&pWC->Mtx); } static void SysWaitUnlock(WaitCond *pWC) { pthread_mutex_unlock(&pWC->Mtx); } /* * This is supposed to be called while holding the lock (that is, inside * a SysWaitLock() / SysWaitUnlock() block). */ static void SysWaitWakeup(WaitCond *pWC, int iCount) { if (iCount <= 0) pthread_cond_broadcast(&pWC->Cond); else pthread_cond_signal(&pWC->Cond); } static int SysWaitWait(WaitCond *pWC, int iTimeout, int (*pCondCB)(void *), void (*pPostCB)(void *), void *pPrivate) { pthread_mutex_lock(&pWC->Mtx); if (iTimeout == SYS_INFINITE_TIMEOUT) { while (!(*pCondCB)(pPrivate)) { pthread_cleanup_push((void (*)(void *)) pthread_mutex_unlock, &pWC->Mtx); pthread_cond_wait(&pWC->Cond, &pWC->Mtx); pthread_cleanup_pop(0); } } else { int iRetCode = 0; struct timespec tsExpire; SysGetTimeOfDay(&tsExpire); SysTimeAddOffset(&tsExpire, iTimeout); while (!(*pCondCB)(pPrivate) && iRetCode != ETIMEDOUT) { pthread_cleanup_push((void (*)(void *)) pthread_mutex_unlock, &pWC->Mtx); iRetCode = pthread_cond_timedwait(&pWC->Cond, &pWC->Mtx, &tsExpire); pthread_cleanup_pop(0); } if (iRetCode == ETIMEDOUT) { pthread_mutex_unlock(&pWC->Mtx); ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } } if (pPostCB != NULL) (*pPostCB)(pPrivate); pthread_mutex_unlock(&pWC->Mtx); return 0; } static void SysPostSignal(int iSignal) { unsigned char uSignal; if (iSignal > 0 && iSignal <= 255) { /* * write(2) is async-signal-safe, so we should have no worry * in using it inside the signal handler. * The pipe write fd is non blocking, so we our handler should * return pretty fast. */ uSignal = (unsigned char) iSignal; if (write(iSignalPipe[1], &uSignal, sizeof(uSignal)) != sizeof(uSignal)) SYS_STDERR_WRITE("Signal pipe full!\n"); } else SYS_STDERR_WRITE("Signal out of range!\n"); SysSetSignal(iSignal, SysPostSignal); } static void SysSetupProcessSignals(void) { sigset_t SigMask; sigemptyset(&SigMask); sigaddset(&SigMask, SIGALRM); sigaddset(&SigMask, SIGINT); sigaddset(&SigMask, SIGHUP); sigaddset(&SigMask, SIGSTOP); sigaddset(&SigMask, SIGCHLD); sigaddset(&SigMask, SIGQUIT); sigaddset(&SigMask, SIGTERM); pthread_sigmask(SIG_BLOCK, &SigMask, NULL); SysSetSignal(SIGPIPE, SIG_IGN); SysSetSignal(SIGTERM, SysPostSignal); SysSetSignal(SIGQUIT, SysPostSignal); SysSetSignal(SIGINT, SysPostSignal); SysSetSignal(SIGHUP, SysPostSignal); SysSetSignal(SIGCHLD, SysPostSignal); SysSetSignal(SIGALRM, SysPostSignal); } static PidWaitData *SysCreatePidWait(pid_t PID) { PidWaitData *pPWD; if ((pPWD = (PidWaitData *) SysAlloc(sizeof(PidWaitData))) == NULL) return NULL; if (pipe(pPWD->iPipeFds) == -1) { SysFree(pPWD); ErrSetErrorCode(ERR_PIPE); return NULL; } SysBlockFD(pPWD->iPipeFds[0], 0); pPWD->PID = PID; pPWD->iExitStatus = pPWD->iTermSignal = -1; pthread_mutex_lock(&PWaitMutex); SYS_LIST_ADDT(&pPWD->Lnk, &PWaitLists[PID % SYS_PWAIT_HASHSIZE]); pthread_mutex_unlock(&PWaitMutex); return pPWD; } static void SysFreePidWait(PidWaitData *pPWD) { if (pPWD != NULL) { pthread_mutex_lock(&PWaitMutex); SYS_LIST_DEL(&pPWD->Lnk); pthread_mutex_unlock(&PWaitMutex); SYS_CLOSE_PIPE(pPWD->iPipeFds); SysFree(pPWD); } } static void SysHandle_SIGCHLD(void) { int iStatus; pid_t ExitPID; SysListHead *pPos, *pHead; PidWaitData *pPWD; while ((ExitPID = waitpid(-1, &iStatus, WNOHANG)) > 0) { pHead = &PWaitLists[ExitPID % SYS_PWAIT_HASHSIZE]; pthread_mutex_lock(&PWaitMutex); for (pPos = SYS_LIST_FIRST(pHead); pPos != NULL;) { pPWD = SYS_LIST_ENTRY(pPos, PidWaitData, Lnk); pPos = SYS_LIST_NEXT(pPos, pHead); if (pPWD->PID == ExitPID) { if (WIFEXITED(iStatus)) pPWD->iExitStatus = WEXITSTATUS(iStatus); if (WIFSIGNALED(iStatus)) pPWD->iTermSignal = WTERMSIG(iStatus); SYS_LIST_DEL(&pPWD->Lnk); write(pPWD->iPipeFds[1], ".", 1); } } pthread_mutex_unlock(&PWaitMutex); } } static void *SysSignalThread(void *pData) { unsigned char uSignal; sigset_t SigMask; sigemptyset(&SigMask); sigaddset(&SigMask, SIGALRM); sigaddset(&SigMask, SIGINT); sigaddset(&SigMask, SIGQUIT); sigaddset(&SigMask, SIGTERM); sigaddset(&SigMask, SIGHUP); sigaddset(&SigMask, SIGCHLD); pthread_sigmask(SIG_UNBLOCK, &SigMask, NULL); for (;!iShutDown;) { if (SysFdWait(iSignalPipe[0], POLLIN, -1) < 0 || read(iSignalPipe[0], &uSignal, sizeof(uSignal)) != sizeof(uSignal)) continue; switch (uSignal) { case SIGTERM: iShutDown++; break; case SIGQUIT: case SIGINT: case SIGHUP: if (pSysBreakHandler != NULL) (*pSysBreakHandler)(); break; case SIGCHLD: SysHandle_SIGCHLD(); break; case SIGALRM: break; } } return NULL; } static int SysThreadSetup(ThrData *pTD) { SysRunThreadExitHooks(pTD != NULL ? (SYS_THREAD) pTD: SYS_INVALID_THREAD, SYS_THREAD_ATTACH); if (pTD != NULL) { } return 0; } static int SysFreeThreadData(ThrData *pTD) { SysWaitCleanup(&pTD->Wait); SysFree(pTD); return 0; } static void SysThreadExit(ThrData *pTD) { SysWaitLock(&pTD->Wait); pTD->iThreadEnded = 1; SysWaitWakeup(&pTD->Wait, 0); if (--pTD->iUseCount == 0) { SysWaitUnlock(&pTD->Wait); SysFreeThreadData(pTD); } else SysWaitUnlock(&pTD->Wait); } static void SysThreadCleanup(ThrData *pTD) { SysRunThreadExitHooks(pTD != NULL ? (SYS_THREAD) pTD: SYS_INVALID_THREAD, SYS_THREAD_DETACH); if (pTD != NULL) SysThreadExit(pTD); } int SysInitLibrary(void) { int i; iShutDown = 0; iNumThExitHooks = 0; for (i = 0; i < (int) CountOf(PWaitLists); i++) SYS_INIT_LIST_HEAD(&PWaitLists[i]); tzset(); if (SysDepInitLibrary() < 0) return ErrGetErrorCode(); if ((hShdwnEventfd = SysEventfdCreate()) == SYS_INVALID_EVENTFD) { SysDepCleanupLibrary(); return ErrGetErrorCode(); } if (pipe(iSignalPipe) == -1) { SysEventfdClose(hShdwnEventfd); SysDepCleanupLibrary(); ErrSetErrorCode(ERR_PIPE); return ERR_PIPE; } SysBlockFD(iSignalPipe[1], 0); SysSetupProcessSignals(); if (pthread_create(&SigThreadID, NULL, SysSignalThread, NULL) != 0) { SYS_CLOSE_PIPE(iSignalPipe); SysEventfdClose(hShdwnEventfd); SysDepCleanupLibrary(); ErrSetErrorCode(ERR_THREADCREATE); return ERR_THREADCREATE; } if (SysThreadSetup(NULL) < 0) { SYS_CLOSE_PIPE(iSignalPipe); SysEventfdClose(hShdwnEventfd); SysDepCleanupLibrary(); return ErrGetErrorCode(); } SRand(); return 0; } static void SysPostShutdown(void) { iShutDown++; SysEventfdSet(hShdwnEventfd); kill(getpid(), SIGTERM); } void SysCleanupLibrary(void) { SysPostShutdown(); SysThreadCleanup(NULL); pthread_join(SigThreadID, NULL); SYS_CLOSE_PIPE(iSignalPipe); SysEventfdClose(hShdwnEventfd); SysDepCleanupLibrary(); } int SysAddThreadExitHook(void (*pfHook)(void *, SYS_THREAD, int), void *pPrivate) { if (iNumThExitHooks >= SYS_MAX_TH_EXIT_HOOKS) return -1; ThExitHooks[iNumThExitHooks].pfHook = pfHook; ThExitHooks[iNumThExitHooks].pPrivate = pPrivate; iNumThExitHooks++; return 0; } int SysShutdownLibrary(int iMode) { SysPostShutdown(); return 0; } int SysSetupSocketBuffers(int *piSndBufSize, int *piRcvBufSize) { if (piSndBufSize != NULL) iSndBufSize = *piSndBufSize; if (piRcvBufSize != NULL) iRcvBufSize = *piRcvBufSize; return 0; } static int SysSetSocketsOptions(SYS_SOCKET SockFD) { int iSize, iActivate; struct linger Ling; if (iSndBufSize > 0) { iSize = iSndBufSize; setsockopt((int) SockFD, SOL_SOCKET, SO_SNDBUF, (char const *) &iSize, sizeof(iSize)); } if (iRcvBufSize > 0) { iSize = iRcvBufSize; setsockopt((int) SockFD, SOL_SOCKET, SO_RCVBUF, (char const *) &iSize, sizeof(iSize)); } iActivate = 1; if (setsockopt(SockFD, SOL_SOCKET, SO_REUSEADDR, (char const *) &iActivate, sizeof(iActivate)) != 0) { ErrSetErrorCode(ERR_SETSOCKOPT); return ERR_SETSOCKOPT; } /* Disable linger */ ZeroData(Ling); setsockopt(SockFD, SOL_SOCKET, SO_LINGER, (char const *) &Ling, sizeof(Ling)); /* Set KEEPALIVE if supported */ setsockopt(SockFD, SOL_SOCKET, SO_KEEPALIVE, (char const *) &iActivate, sizeof(iActivate)); return 0; } SYS_SOCKET SysCreateSocket(int iAddressFamily, int iType, int iProtocol) { int SockFD = socket(iAddressFamily, iType, iProtocol); if (SockFD == -1) { ErrSetErrorCode(ERR_SOCKET_CREATE); return SYS_INVALID_SOCKET; } if (SysSetSocketsOptions((SYS_SOCKET) SockFD) < 0) { SysCloseSocket((SYS_SOCKET) SockFD); return SYS_INVALID_SOCKET; } return (SYS_SOCKET) SockFD; } int SysBlockSocket(SYS_SOCKET SockFD, int iBlocking) { return SysBlockFD((int) SockFD, iBlocking); } void SysCloseSocket(SYS_SOCKET SockFD) { close(SockFD); } int SysShutdownSocket(SYS_SOCKET SockFD, int iHow) { if (shutdown(SockFD, iHow)) { ErrSetErrorCode(ERR_SOCKET_SHUTDOWN); return ERR_SOCKET_SHUTDOWN; } return 0; } int SysBindSocket(SYS_SOCKET SockFD, const SYS_INET_ADDR *SockName) { if (bind((int) SockFD, (const struct sockaddr *) SockName->Addr, SockName->iSize) == -1) { ErrSetErrorCode(ERR_SOCKET_BIND); return ERR_SOCKET_BIND; } return 0; } void SysListenSocket(SYS_SOCKET SockFD, int iConnections) { listen((int) SockFD, iConnections); } int SysRecvData(SYS_SOCKET SockFD, char *pszBuffer, int iBufferSize, int iTimeout) { int iRecvBytes; if (SysFdWait((int) SockFD, POLLIN, iTimeout) < 0) return ErrGetErrorCode(); while ((iRecvBytes = recv((int) SockFD, pszBuffer, iBufferSize, 0)) == -1 && SYS_INT_CALL()); if (iRecvBytes == -1) { ErrSetErrorCode(ERR_NETWORK); return ERR_NETWORK; } return iRecvBytes; } int SysRecv(SYS_SOCKET SockFD, char *pszBuffer, int iBufferSize, int iTimeout) { int iRtxBytes = 0, iRtxCurrent; while (iRtxBytes < iBufferSize) { iRtxCurrent = SysRecvData(SockFD, pszBuffer + iRtxBytes, iBufferSize - iRtxBytes, iTimeout); if (iRtxCurrent <= 0) return iRtxBytes; iRtxBytes += iRtxCurrent; } return iRtxBytes; } int SysRecvDataFrom(SYS_SOCKET SockFD, SYS_INET_ADDR *pFrom, char *pszBuffer, int iBufferSize, int iTimeout) { socklen_t SockALen = (socklen_t) sizeof(pFrom->Addr); int iRecvBytes; if (SysFdWait((int) SockFD, POLLIN, iTimeout) < 0) return ErrGetErrorCode(); while ((iRecvBytes = recvfrom((int) SockFD, pszBuffer, iBufferSize, 0, (struct sockaddr *) pFrom->Addr, &SockALen)) == -1 && SYS_INT_CALL()); if (iRecvBytes == -1) { ErrSetErrorCode(ERR_NETWORK); return ERR_NETWORK; } pFrom->iSize = (int) SockALen; return iRecvBytes; } int SysSendData(SYS_SOCKET SockFD, char const *pszBuffer, int iBufferSize, int iTimeout) { int iSendBytes; if (SysFdWait((int) SockFD, POLLOUT, iTimeout) < 0) return ErrGetErrorCode(); while ((iSendBytes = send((int) SockFD, pszBuffer, iBufferSize, 0)) == -1 && SYS_INT_CALL()); if (iSendBytes == -1) { ErrSetErrorCode(ERR_NETWORK); return ERR_NETWORK; } return iSendBytes; } int SysSend(SYS_SOCKET SockFD, char const *pszBuffer, int iBufferSize, int iTimeout) { int iRtxBytes = 0, iRtxCurrent; while (iRtxBytes < iBufferSize) { iRtxCurrent = SysSendData(SockFD, pszBuffer + iRtxBytes, iBufferSize - iRtxBytes, iTimeout); if (iRtxCurrent <= 0) return iRtxBytes; iRtxBytes += iRtxCurrent; } return iRtxBytes; } int SysSendDataTo(SYS_SOCKET SockFD, const SYS_INET_ADDR *pTo, char const *pszBuffer, int iBufferSize, int iTimeout) { int iSendBytes; if (SysFdWait((int) SockFD, POLLOUT, iTimeout) < 0) return ErrGetErrorCode(); while ((iSendBytes = sendto((int) SockFD, pszBuffer, iBufferSize, 0, (const struct sockaddr *) pTo->Addr, pTo->iSize)) == -1 && SYS_INT_CALL()); if (iSendBytes == -1) { ErrSetErrorCode(ERR_NETWORK); return ERR_NETWORK; } return iSendBytes; } int SysConnect(SYS_SOCKET SockFD, const SYS_INET_ADDR *pSockName, int iTimeout) { int iError; if (SysBlockSocket(SockFD, 0) < 0) return ErrGetErrorCode(); if (connect((int) SockFD, (const struct sockaddr *) pSockName->Addr, pSockName->iSize) == 0) { SysBlockSocket(SockFD, 1); return 0; } if (errno != EINPROGRESS && errno != EWOULDBLOCK) { SysBlockSocket(SockFD, 1); ErrSetErrorCode(ERR_NETWORK); return ERR_NETWORK; } iError = SysFdWait((int) SockFD, POLLOUT, iTimeout); SysBlockSocket(SockFD, 1); return iError; } SYS_SOCKET SysAccept(SYS_SOCKET SockFD, SYS_INET_ADDR *pSockName, int iTimeout) { if (SysFdWait((int) SockFD, POLLIN, iTimeout) < 0) return ErrGetErrorCode(); socklen_t SockALen = (socklen_t) sizeof(pSockName->Addr); int iAcptSock = accept((int) SockFD, (struct sockaddr *) pSockName->Addr, &SockALen); if (iAcptSock == -1) { ErrSetErrorCode(ERR_NETWORK); return SYS_INVALID_SOCKET; } if (SysSetSocketsOptions((SYS_SOCKET) iAcptSock) < 0) { SysCloseSocket((SYS_SOCKET) iAcptSock); return SYS_INVALID_SOCKET; } pSockName->iSize = (int) SockALen; return (SYS_SOCKET) iAcptSock; } int SysSelect(int iMaxFD, SYS_fd_set *pReadFDs, SYS_fd_set *pWriteFDs, SYS_fd_set *pExcptFDs, int iTimeout) { struct timeval TV; ZeroData(TV); if (iTimeout >= 0) { TV.tv_sec = iTimeout / 1000; TV.tv_usec = (iTimeout % 1000) * 1000; } int iSelectResult = select(iMaxFD + 1, pReadFDs, pWriteFDs, pExcptFDs, iTimeout >= 0 ? &TV: NULL); if (iSelectResult == -1) { ErrSetErrorCode(ERR_SELECT); return ERR_SELECT; } if (iSelectResult == 0) { ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } return iSelectResult; } int SysSendFileMMap(SYS_SOCKET SockFD, char const *pszFileName, SYS_OFF_T llBaseOffset, SYS_OFF_T llEndOffset, int iTimeout) { int iFD, iCurrSend, iSndBuffSize; SYS_OFF_T llAlnOff, llFileSize; SYS_INT64 tStart; void *pMapAddress; char *pszBuffer; if ((iFD = open(pszFileName, O_RDONLY)) == -1) { ErrSetErrorCode(ERR_FILE_OPEN, pszFileName); return ERR_FILE_OPEN; } llFileSize = (SYS_OFF_T) lseek(iFD, 0, SEEK_END); lseek(iFD, 0, SEEK_SET); llAlnOff = llBaseOffset & ~((SYS_OFF_T) sysconf(_SC_PAGESIZE) - 1); if (llEndOffset == -1) llEndOffset = llFileSize; if (llBaseOffset > llFileSize || llEndOffset > llFileSize || llBaseOffset > llEndOffset) { close(iFD); ErrSetErrorCode(ERR_INVALID_PARAMETER); return ERR_INVALID_PARAMETER; } if ((pMapAddress = mmap((char *) 0, llEndOffset - llAlnOff, PROT_READ, MAP_SHARED, iFD, llAlnOff)) == (void *) -1L) { close(iFD); ErrSetErrorCode(ERR_MMAP); return ERR_MMAP; } iSndBuffSize = (iTimeout != SYS_INFINITE_TIMEOUT) ? MIN_TCP_SEND_SIZE: MAX_TCP_SEND_SIZE; pszBuffer = (char *) pMapAddress + (long) (llBaseOffset - llAlnOff); while (llBaseOffset < llEndOffset) { iCurrSend = (int) Min(iSndBuffSize, llEndOffset - llBaseOffset); tStart = SysMsTime(); if ((iCurrSend = SysSendData(SockFD, pszBuffer, iCurrSend, iTimeout)) < 0) { ErrorPush(); munmap((char *) pMapAddress, llEndOffset - llAlnOff); close(iFD); return ErrorPop(); } if (iSndBuffSize < MAX_TCP_SEND_SIZE && ((SysMsTime() - tStart) * K_IO_TIME_RATIO) < (SYS_INT64) iTimeout) iSndBuffSize = Min(iSndBuffSize * 2, MAX_TCP_SEND_SIZE); pszBuffer += iCurrSend; llBaseOffset += iCurrSend; } munmap((char *) pMapAddress, (long) (llEndOffset - llAlnOff)); close(iFD); return 0; } #if !defined(SYS_HAS_SENDFILE) int SysSendFile(SYS_SOCKET SockFD, char const *pszFileName, SYS_OFF_T llBaseOffset, SYS_OFF_T llEndOffset, int iTimeout) { return SysSendFileMMap(SockFD, pszFileName, llBaseOffset, llEndOffset, iTimeout); } #endif /* !SYS_HAS_SENDFILE */ SYS_SEMAPHORE SysCreateSemaphore(int iInitCount, int iMaxCount) { SemData *pSD = (SemData *) SysAlloc(sizeof(SemData)); if (pSD == NULL) return SYS_INVALID_SEMAPHORE; if (SysWaitInit(&pSD->Wait) < 0) { SysFree(pSD); return SYS_INVALID_SEMAPHORE; } pSD->iSemCounter = iInitCount; pSD->iMaxCount = iMaxCount; return (SYS_SEMAPHORE) pSD; } int SysCloseSemaphore(SYS_SEMAPHORE hSemaphore) { SemData *pSD = (SemData *) hSemaphore; if (pSD != NULL) { SysWaitCleanup(&pSD->Wait); SysFree(pSD); } return 0; } static int SysSemCondCB(void *pPrivate) { SemData *pSD = (SemData *) pPrivate; return pSD->iSemCounter > 0; } static void SysSemPostCB(void *pPrivate) { SemData *pSD = (SemData *) pPrivate; pSD->iSemCounter -= 1; } int SysWaitSemaphore(SYS_SEMAPHORE hSemaphore, int iTimeout) { SemData *pSD = (SemData *) hSemaphore; return SysWaitWait(&pSD->Wait, iTimeout, SysSemCondCB, SysSemPostCB, pSD); } int SysReleaseSemaphore(SYS_SEMAPHORE hSemaphore, int iCount) { SemData *pSD = (SemData *) hSemaphore; SysWaitLock(&pSD->Wait); pSD->iSemCounter += iCount; if (pSD->iSemCounter > 0) { if (pSD->iSemCounter > 1) SysWaitWakeup(&pSD->Wait, 0); else SysWaitWakeup(&pSD->Wait, 1); } SysWaitUnlock(&pSD->Wait); return 0; } int SysTryWaitSemaphore(SYS_SEMAPHORE hSemaphore) { SemData *pSD = (SemData *) hSemaphore; SysWaitLock(&pSD->Wait); if (pSD->iSemCounter <= 0) { SysWaitUnlock(&pSD->Wait); ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } pSD->iSemCounter -= 1; SysWaitUnlock(&pSD->Wait); return 0; } SYS_MUTEX SysCreateMutex(void) { MutexData *pMD = (MutexData *) SysAlloc(sizeof(MutexData)); if (pMD == NULL) return SYS_INVALID_MUTEX; if (SysWaitInit(&pMD->Wait) < 0) { SysFree(pMD); return SYS_INVALID_MUTEX; } pMD->iLocked = 0; return (SYS_MUTEX) pMD; } int SysCloseMutex(SYS_MUTEX hMutex) { MutexData *pMD = (MutexData *) hMutex; if (pMD != NULL) { SysWaitCleanup(&pMD->Wait); SysFree(pMD); } return 0; } static int SysMtxCondCB(void *pPrivate) { MutexData *pMD = (MutexData *) pPrivate; return !pMD->iLocked; } static void SysMtxPostCB(void *pPrivate) { MutexData *pMD = (MutexData *) pPrivate; pMD->iLocked = 1; } int SysLockMutex(SYS_MUTEX hMutex, int iTimeout) { MutexData *pMD = (MutexData *) hMutex; return SysWaitWait(&pMD->Wait, iTimeout, SysMtxCondCB, SysMtxPostCB, pMD); } int SysUnlockMutex(SYS_MUTEX hMutex) { MutexData *pMD = (MutexData *) hMutex; SysWaitLock(&pMD->Wait); pMD->iLocked = 0; SysWaitWakeup(&pMD->Wait, 1); SysWaitUnlock(&pMD->Wait); return 0; } int SysTryLockMutex(SYS_MUTEX hMutex) { MutexData *pMD = (MutexData *) hMutex; SysWaitLock(&pMD->Wait); if (pMD->iLocked) { SysWaitUnlock(&pMD->Wait); ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } pMD->iLocked = 1; SysWaitUnlock(&pMD->Wait); return 0; } SYS_EVENT SysCreateEvent(int iManualReset) { EventData *pED = (EventData *) SysAlloc(sizeof(EventData)); if (pED == NULL) return SYS_INVALID_EVENT; if (SysWaitInit(&pED->Wait) < 0) { SysFree(pED); return SYS_INVALID_EVENT; } pED->iSignaled = 0; pED->iManualReset = iManualReset; return (SYS_EVENT) pED; } int SysCloseEvent(SYS_EVENT hEvent) { EventData *pED = (EventData *) hEvent; if (pED != NULL) { SysWaitCleanup(&pED->Wait); SysFree(pED); } return 0; } static int SysEvtCondCB(void *pPrivate) { EventData *pED = (EventData *) pPrivate; return pED->iSignaled; } static void SysEvtPostCB(void *pPrivate) { EventData *pED = (EventData *) pPrivate; if (!pED->iManualReset) pED->iSignaled = 0; } int SysWaitEvent(SYS_EVENT hEvent, int iTimeout) { EventData *pED = (EventData *) hEvent; return SysWaitWait(&pED->Wait, iTimeout, SysEvtCondCB, SysEvtPostCB, pED); } int SysSetEvent(SYS_EVENT hEvent) { EventData *pED = (EventData *) hEvent; SysWaitLock(&pED->Wait); pED->iSignaled = 1; if (pED->iManualReset) SysWaitWakeup(&pED->Wait, 0); else SysWaitWakeup(&pED->Wait, 1); SysWaitUnlock(&pED->Wait); return 0; } int SysResetEvent(SYS_EVENT hEvent) { EventData *pED = (EventData *) hEvent; SysWaitLock(&pED->Wait); pED->iSignaled = 0; SysWaitUnlock(&pED->Wait); return 0; } int SysTryWaitEvent(SYS_EVENT hEvent) { EventData *pED = (EventData *) hEvent; SysWaitLock(&pED->Wait); if (!pED->iSignaled) { SysWaitUnlock(&pED->Wait); ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } if (!pED->iManualReset) pED->iSignaled = 0; SysWaitUnlock(&pED->Wait); return 0; } /* * PEvents are events that can be waited together with socket descriptors. * On Unix, the best and more efficient event implementation is the one using * the pthread API, which, unfortunately, does not allow us to poll/select * the resulting events together with socket descriptors. */ SYS_PEVENT SysCreatePEvent(int iManualReset) { PEventData *pPED; if ((pPED = (PEventData *) SysAlloc(sizeof(PEventData))) == NULL) return SYS_INVALID_PEVENT; pPED->iManualReset = iManualReset; if ((pPED->hEventfd = SysEventfdCreate()) == SYS_INVALID_EVENTFD) { SysFree(pPED); return SYS_INVALID_PEVENT; } return (SYS_PEVENT) pPED; } int SysClosePEvent(SYS_PEVENT hPEvent) { PEventData *pPED = (PEventData *) hPEvent; if (pPED != NULL) { SysEventfdClose(pPED->hEventfd); SysFree(pPED); } return 0; } int SysWaitPEvent(SYS_PEVENT hPEvent, int iTimeout) { PEventData *pPED = (PEventData *) hPEvent; int iWaitFD, iCTimeout; SYS_INT64 tNow, tExp; iWaitFD = SysEventfdWaitFD(pPED->hEventfd); tExp = (iTimeout > 0) ? SysMsTime() + iTimeout: 0; for (;;) { if (iTimeout > 0) { tNow = SysMsTime(); tNow = Min(tNow, tExp); iCTimeout = (int) (tExp - tNow); } else iCTimeout = iTimeout; if (SysFdWait(iWaitFD, POLLIN, iCTimeout) < 0) return ErrGetErrorCode(); if (pPED->iManualReset || SysEventfdReset(pPED->hEventfd) > 0) break; } return 0; } int SysSetPEvent(SYS_PEVENT hPEvent) { PEventData *pPED = (PEventData *) hPEvent; return SysEventfdSet(pPED->hEventfd); } int SysResetPEvent(SYS_PEVENT hPEvent) { PEventData *pPED = (PEventData *) hPEvent; return SysEventfdReset(pPED->hEventfd); } int SysTryWaitPEvent(SYS_PEVENT hPEvent) { return SysWaitPEvent(hPEvent, 0); } static void *SysThreadStartup(void *pThreadData) { int iExitCode; ThrData *pTD = (ThrData *) pThreadData; SysThreadSetup(pTD); pthread_cleanup_push((void (*)(void *)) SysThreadCleanup, pTD); pTD->iExitCode = iExitCode = (*pTD->ThreadProc)(pTD->pThreadData); pthread_cleanup_pop(1); return (void *) (long) iExitCode; } SYS_THREAD SysCreateThread(unsigned int (*pThreadProc) (void *), void *pThreadData) { ThrData *pTD; pthread_attr_t ThrAttr; if ((pTD = (ThrData *) SysAlloc(sizeof(ThrData))) == NULL) return SYS_INVALID_THREAD; pTD->ThreadProc = pThreadProc; pTD->pThreadData = pThreadData; pTD->iExitCode = -1; pTD->iUseCount = 2; if (SysWaitInit(&pTD->Wait) < 0) { SysFree(pTD); return SYS_INVALID_THREAD; } pthread_attr_init(&ThrAttr); pthread_attr_setscope(&ThrAttr, PTHREAD_SCOPE_SYSTEM); if (pthread_create(&pTD->ThreadId, &ThrAttr, SysThreadStartup, pTD) != 0) { pthread_attr_destroy(&ThrAttr); ErrSetErrorCode(ERR_THREADCREATE); return SYS_INVALID_THREAD; } pthread_attr_destroy(&ThrAttr); return (SYS_THREAD) pTD; } void SysCloseThread(SYS_THREAD ThreadID, int iForce) { ThrData *pTD = (ThrData *) ThreadID; if (pTD != NULL) { pthread_detach(pTD->ThreadId); SysWaitLock(&pTD->Wait); if (iForce && !pTD->iThreadEnded) pthread_cancel(pTD->ThreadId); if (--pTD->iUseCount == 0) { SysWaitUnlock(&pTD->Wait); SysFreeThreadData(pTD); } else SysWaitUnlock(&pTD->Wait); } } static int SysThrCondCB(void *pPrivate) { ThrData *pTD = (ThrData *) pPrivate; return pTD->iThreadEnded; } int SysWaitThread(SYS_THREAD ThreadID, int iTimeout) { ThrData *pTD = (ThrData *) ThreadID; return SysWaitWait(&pTD->Wait, iTimeout, SysThrCondCB, NULL, pTD); } unsigned long SysGetCurrentThreadId(void) { return (unsigned long) pthread_self(); } static int SysWaitPid(PidWaitData *pPWD, int iTimeout) { unsigned char uDot; if (SysFdWait(pPWD->iPipeFds[0], POLLIN, iTimeout) < 0) return ErrGetErrorCode(); if (read(pPWD->iPipeFds[0], &uDot, 1) != 1) { ErrSetErrorCode(ERR_WAIT); return ERR_WAIT; } return 0; } int SysExec(char const *pszCommand, char const *const *pszArgs, int iWaitTimeout, int iPriority, int *piExitStatus) { int iError, iExitStatus; pid_t ProcessID; PidWaitData *pPWD; int iPipe[2]; if (pipe(iPipe) == -1) { ErrSetErrorCode(ERR_PIPE); return ERR_PIPE; } ProcessID = fork(); if (ProcessID == 0) { /* * Wait for the unlock from the parent. We need to wait that * the parent has created a PidWaitData strcture and added it * to the list under the SIGCHLD handler control. If we fail * to do that, we might miss the wakeup in case the child * process terminates quicly. */ read(iPipe[0], &ProcessID, sizeof(ProcessID)); SYS_CLOSE_PIPE(iPipe); /* Execute the command */ execv(pszCommand, (char **) pszArgs); /* We can only use async-signal safe functions, so we use write() directly */ SYS_STDERR_WRITE("execv error: cmd='"); SYS_STDERR_WRITE(pszCommand); SYS_STDERR_WRITE("'\n"); _exit(SYSERR_EXEC); } if (ProcessID == (pid_t) -1) { SYS_CLOSE_PIPE(iPipe); ErrSetErrorCode(ERR_FORK); return ERR_FORK; } switch (iPriority) { case SYS_PRIORITY_NORMAL: setpriority(PRIO_PROCESS, ProcessID, 0); break; case SYS_PRIORITY_LOWER: setpriority(PRIO_PROCESS, ProcessID, SCHED_PRIORITY_INC); break; case SYS_PRIORITY_HIGHER: setpriority(PRIO_PROCESS, ProcessID, -SCHED_PRIORITY_INC); break; } if (iWaitTimeout > 0 || iWaitTimeout == SYS_INFINITE_TIMEOUT) { pPWD = SysCreatePidWait(ProcessID); iError = (pPWD == NULL) ? ErrGetErrorCode(): 0; /* * Unlock the child process only once we dropped the PID wait into * our handling list. */ write(iPipe[1], &ProcessID, sizeof(ProcessID)); SYS_CLOSE_PIPE(iPipe); if (pPWD == NULL) { ErrSetErrorCode(iError); return iError; } if (SysWaitPid(pPWD, iWaitTimeout) < 0) { SysFreePidWait(pPWD); return ErrGetErrorCode(); } iExitStatus = pPWD->iExitStatus; SysFreePidWait(pPWD); if (iExitStatus == SYSERR_EXEC) { ErrSetErrorCode(ERR_PROCESS_EXECUTE, pszCommand); return ERR_PROCESS_EXECUTE; } } else { /* * Unlock the child process only once we dropped the PID wait into * our handling list. */ write(iPipe[1], &ProcessID, sizeof(ProcessID)); SYS_CLOSE_PIPE(iPipe); iExitStatus = -1; } if (piExitStatus != NULL) *piExitStatus = iExitStatus; return 0; } void SysSetBreakHandler(void (*pBreakHandler) (void)) { pSysBreakHandler = pBreakHandler; } unsigned long SysGetCurrentProcessId(void) { return getpid(); } int SysCreateTlsKey(SYS_TLSKEY &TlsKey, void (*pFreeProc) (void *)) { if (pthread_key_create(&TlsKey, pFreeProc) != 0) { ErrSetErrorCode(ERR_NOMORE_TLSKEYS); return ERR_NOMORE_TLSKEYS; } return 0; } int SysDeleteTlsKey(SYS_TLSKEY &TlsKey) { pthread_key_delete(TlsKey); return 0; } int SysSetTlsKeyData(SYS_TLSKEY &TlsKey, void *pData) { if (pthread_setspecific(TlsKey, pData) != 0) { ErrSetErrorCode(ERR_INVALID_TLSKEY); return ERR_INVALID_TLSKEY; } return 0; } void *SysGetTlsKeyData(SYS_TLSKEY &TlsKey) { return pthread_getspecific(TlsKey); } void SysThreadOnce(SYS_THREAD_ONCE *pThrOnce, void (*pOnceProc) (void)) { pthread_once(pThrOnce, pOnceProc); } void *SysAllocNZ(unsigned int uSize) { void *pData = malloc(uSize); if (pData == NULL) ErrSetErrorCode(ERR_MEMORY); return pData; } void *SysAlloc(unsigned int uSize) { void *pData = SysAllocNZ(uSize); if (pData != NULL) memset(pData, 0, uSize); return pData; } void SysFree(void *pData) { free(pData); } void *SysRealloc(void *pData, unsigned int uSize) { void *pNewData = realloc(pData, uSize); if (pNewData == NULL) ErrSetErrorCode(ERR_MEMORY); return pNewData; } int SysLockFile(char const *pszFileName, char const *pszLockExt) { int iFD; char szLockFile[SYS_MAX_PATH], szLock[128]; snprintf(szLockFile, sizeof(szLockFile) - 1, "%s%s", pszFileName, pszLockExt); if ((iFD = open(szLockFile, O_CREAT | O_EXCL | O_RDWR, S_IREAD | S_IWRITE)) == -1) { ErrSetErrorCode(ERR_LOCKED); return ERR_LOCKED; } sprintf(szLock, "%lu", (unsigned long) SysGetCurrentThreadId()); write(iFD, szLock, strlen(szLock) + 1); close(iFD); return 0; } int SysUnlockFile(char const *pszFileName, char const *pszLockExt) { char szLockFile[SYS_MAX_PATH]; snprintf(szLockFile, sizeof(szLockFile) - 1, "%s%s", pszFileName, pszLockExt); if (unlink(szLockFile) != 0) { ErrSetErrorCode(ERR_NOT_LOCKED); return ERR_NOT_LOCKED; } return 0; } SYS_HANDLE SysOpenModule(char const *pszFilePath) { void *pModule = dlopen(pszFilePath, RTLD_LAZY); if (pModule == NULL) { ErrSetErrorCode(ERR_LOADMODULE, pszFilePath); return SYS_INVALID_HANDLE; } return (SYS_HANDLE) pModule; } int SysCloseModule(SYS_HANDLE hModule) { if (hModule != SYS_INVALID_HANDLE) dlclose((void *) hModule); return 0; } void *SysGetSymbol(SYS_HANDLE hModule, char const *pszSymbol) { void *pSymbol = dlsym((void *) hModule, pszSymbol); if (pSymbol == NULL) { ErrSetErrorCode(ERR_LOADMODULESYMBOL, pszSymbol); return NULL; } return pSymbol; } int SysEventLogV(int iLogLevel, char const *pszFormat, va_list Args) { openlog(APP_NAME_STR, LOG_PID | LOG_CONS, LOG_DAEMON); char szBuffer[2048]; vsnprintf(szBuffer, sizeof(szBuffer) - 1, pszFormat, Args); syslog(LOG_DAEMON | (iLogLevel == LOG_LEV_ERROR ? LOG_ERR: iLogLevel == LOG_LEV_WARNING ? LOG_WARNING: LOG_INFO), "%s", szBuffer); closelog(); return 0; } int SysEventLog(int iLogLevel, char const *pszFormat, ...) { int iError; va_list Args; va_start(Args, pszFormat); iError = SysEventLogV(iLogLevel, pszFormat, Args); va_end(Args); return iError; } int SysLogMessage(int iLogLevel, char const *pszFormat, ...) { va_list Args; extern bool bServerDebug; pthread_mutex_lock(&LogMutex); va_start(Args, pszFormat); if (bServerDebug) /* Debug implementation */ vprintf(pszFormat, Args); else { switch (iLogLevel) { case LOG_LEV_WARNING: case LOG_LEV_ERROR: SysEventLogV(iLogLevel, pszFormat, Args); break; } } va_end(Args); pthread_mutex_unlock(&LogMutex); return 0; } int SysSleep(int iTimeout) { return SysMsSleep(iTimeout * 1000); } int SysMsSleep(int iMsTimeout) { struct pollfd PollFD[1]; ZeroData(PollFD); PollFD[0].fd = SysEventfdWaitFD(hShdwnEventfd); PollFD[0].events = POLLIN; if (poll(PollFD, 1, iMsTimeout) == -1) { ErrSetErrorCode(ERR_WAIT); return ERR_WAIT; } if (PollFD[0].revents & POLLIN) { ErrSetErrorCode(ERR_SERVER_SHUTDOWN); return ERR_SERVER_SHUTDOWN; } return 0; } SYS_INT64 SysMsTime(void) { struct timeval tv; if (gettimeofday(&tv, NULL) != 0) return 0; return 1000 * (SYS_INT64) tv.tv_sec + (SYS_INT64) tv.tv_usec / 1000; } int SysExistFile(char const *pszFilePath) { struct stat FStat; if (stat(pszFilePath, &FStat) != 0) return 0; return S_ISDIR(FStat.st_mode) ? 0: 1; } int SysExistDir(char const *pszDirPath) { struct stat FStat; if (stat(pszDirPath, &FStat) != 0) return 0; return S_ISDIR(FStat.st_mode) ? 1: 0; } SYS_HANDLE SysFirstFile(char const *pszPath, char *pszFileName, int iSize) { DIR *pDIR = opendir(pszPath); if (pDIR == NULL) { ErrSetErrorCode(ERR_OPENDIR); return SYS_INVALID_HANDLE; } FilledDirent FDE; struct dirent *pDirEntry = NULL; #if (_POSIX_C_SOURCE - 0 >= 199506L) || defined(_POSIX_PTHREAD_SEMANTICS) readdir_r(pDIR, &FDE.DE, &pDirEntry); #else pDirEntry = readdir_r(pDIR, &FDE.DE); #endif if (pDirEntry == NULL) { closedir(pDIR); return SYS_INVALID_HANDLE; } FileFindData *pFFD = (FileFindData *) SysAlloc(sizeof(FileFindData)); if (pFFD == NULL) { closedir(pDIR); return SYS_INVALID_HANDLE; } strcpy(pFFD->szPath, pszPath); AppendSlash(pFFD->szPath); pFFD->pDIR = pDIR; pFFD->FDE = FDE; StrNCpy(pszFileName, pFFD->FDE.DE.d_name, iSize); char szFilePath[SYS_MAX_PATH]; snprintf(szFilePath, sizeof(szFilePath) - 1, "%s%s", pFFD->szPath, pFFD->FDE.DE.d_name); if (stat(szFilePath, &pFFD->FStat) != 0) { SysFree(pFFD); closedir(pDIR); ErrSetErrorCode(ERR_STAT); return SYS_INVALID_HANDLE; } return (SYS_HANDLE) pFFD; } int SysIsDirectory(SYS_HANDLE hFind) { FileFindData *pFFD = (FileFindData *) hFind; return S_ISDIR(pFFD->FStat.st_mode) ? 1: 0; } SYS_OFF_T SysGetSize(SYS_HANDLE hFind) { FileFindData *pFFD = (FileFindData *) hFind; return pFFD->FStat.st_size; } int SysNextFile(SYS_HANDLE hFind, char *pszFileName, int iSize) { FileFindData *pFFD = (FileFindData *) hFind; struct dirent *pDirEntry = NULL; #if (_POSIX_C_SOURCE - 0 >= 199506L) || defined(_POSIX_PTHREAD_SEMANTICS) readdir_r(pFFD->pDIR, &pFFD->FDE.DE, &pDirEntry); #else pDirEntry = readdir_r(pFFD->pDIR, &pFFD->FDE.DE); #endif if (pDirEntry == NULL) return 0; StrNCpy(pszFileName, pFFD->FDE.DE.d_name, iSize); char szFilePath[SYS_MAX_PATH]; snprintf(szFilePath, sizeof(szFilePath) - 1, "%s%s", pFFD->szPath, pFFD->FDE.DE.d_name); if (stat(szFilePath, &pFFD->FStat) != 0) { ErrSetErrorCode(ERR_STAT); return 0; } return 1; } void SysFindClose(SYS_HANDLE hFind) { FileFindData *pFFD = (FileFindData *) hFind; if (pFFD != NULL) { closedir(pFFD->pDIR); SysFree(pFFD); } } int SysGetFileInfo(char const *pszFileName, SYS_FILE_INFO &FI) { struct stat stat_buffer; if (stat(pszFileName, &stat_buffer) != 0) { ErrSetErrorCode(ERR_STAT); return ERR_STAT; } ZeroData(FI); FI.iFileType = (S_ISREG(stat_buffer.st_mode)) ? ftNormal: ((S_ISDIR(stat_buffer.st_mode)) ?ftDirectory: ((S_ISLNK(stat_buffer.st_mode)) ? ftLink: ftOther)); FI.llSize = stat_buffer.st_size; FI.tMod = stat_buffer.st_mtime; return 0; } int SysSetFileModTime(char const *pszFileName, time_t tMod) { struct utimbuf TMB; TMB.actime = tMod; TMB.modtime = tMod; if (utime(pszFileName, &TMB) != 0) { ErrSetErrorCode(ERR_SET_FILE_TIME); return ERR_SET_FILE_TIME; } return 0; } char *SysStrDup(char const *pszString) { int iStrLength = strlen(pszString); char *pszBuffer = (char *) SysAllocNZ(iStrLength + 1); if (pszBuffer != NULL) memcpy(pszBuffer, pszString, iStrLength + 1); return pszBuffer; } char *SysGetEnv(char const *pszVarName) { char const *pszValue = getenv(pszVarName); return (pszValue != NULL) ? SysStrDup(pszValue): NULL; } char *SysGetTempDir(char *pszPath, int iMaxPath) { char const *pszEnv; if ((pszEnv = getenv("XMAIL_TEMP")) == NULL) pszEnv = "/tmp/"; StrNCpy(pszPath, pszEnv, iMaxPath - 1); AppendSlash(pszPath); return pszPath; } int SysRemove(char const *pszFileName) { if (unlink(pszFileName) != 0) { ErrSetErrorCode(ERR_FILE_DELETE); return ERR_FILE_DELETE; } return 0; } int SysMakeDir(char const *pszPath) { if (mkdir(pszPath, 0700) != 0) { ErrSetErrorCode(ERR_DIR_CREATE); return ERR_DIR_CREATE; } return 0; } int SysRemoveDir(char const *pszPath) { if (rmdir(pszPath) != 0) { ErrSetErrorCode(ERR_DIR_DELETE); return ERR_DIR_DELETE; } return 0; } int SysMoveFile(char const *pszOldName, char const *pszNewName) { if (rename(pszOldName, pszNewName) != 0) { ErrSetErrorCode(ERR_FILE_MOVE); return ERR_FILE_MOVE; } return 0; } int SysVSNPrintf(char *pszBuffer, int iSize, char const *pszFormat, va_list Args) { int iPrintResult = vsnprintf(pszBuffer, iSize, pszFormat, Args); return (iPrintResult < iSize) ? iPrintResult: -1; } int SysFileSync(FILE *pFile) { if (fflush(pFile) || fsync(fileno(pFile))) { ErrSetErrorCode(ERR_FILE_WRITE); return ERR_FILE_WRITE; } return 0; } char *SysStrTok(char *pszData, char const *pszDelim, char **ppszSavePtr) { return strtok_r(pszData, pszDelim, ppszSavePtr); } char *SysCTime(time_t *pTimer, char *pszBuffer, int iBufferSize) { #if (_POSIX_C_SOURCE - 0 >= 199506L) || defined(_POSIX_PTHREAD_SEMANTICS) return ctime_r(pTimer, pszBuffer); #else return ctime_r(pTimer, pszBuffer, iBufferSize); #endif } struct tm *SysLocalTime(time_t *pTimer, struct tm *pTStruct) { return localtime_r(pTimer, pTStruct); } struct tm *SysGMTime(time_t *pTimer, struct tm *pTStruct) { return gmtime_r(pTimer, pTStruct); } char *SysAscTime(struct tm *pTStruct, char *pszBuffer, int iBufferSize) { #if (_POSIX_C_SOURCE - 0 >= 199506L) || defined(_POSIX_PTHREAD_SEMANTICS) return asctime_r(pTStruct, pszBuffer); #else return asctime_r(pTStruct, pszBuffer, iBufferSize); #endif } long SysGetDayLight(void) { time_t tCurr = time(NULL); struct tm tmCurr; localtime_r(&tCurr, &tmCurr); return (tmCurr.tm_isdst <= 0) ? 0: 3600; } SYS_MMAP SysCreateMMap(char const *pszFileName, unsigned long ulFlags) { int iFD = open(pszFileName, (ulFlags & SYS_MMAP_WRITE) ? O_RDWR: O_RDONLY); if (iFD < 0) { ErrSetErrorCode(ERR_FILE_OPEN); return SYS_INVALID_MMAP; } struct stat StatBuf; if (fstat(iFD, &StatBuf) < 0) { close(iFD); ErrSetErrorCode(ERR_STAT); return SYS_INVALID_MMAP; } MMapData *pMMD = (MMapData *) SysAlloc(sizeof(MMapData)); if (pMMD == NULL) { close(iFD); return SYS_INVALID_MMAP; } pMMD->ulPageSize = (unsigned long) sysconf(_SC_PAGESIZE); pMMD->iFD = iFD; pMMD->iNumMaps = 0; pMMD->ulFlags = ulFlags; pMMD->llFileSize = (SYS_OFF_T) StatBuf.st_size; return (SYS_MMAP) pMMD; } void SysCloseMMap(SYS_MMAP hMap) { MMapData *pMMD = (MMapData *) hMap; if (pMMD != NULL) { if (pMMD->iNumMaps > 0) { } close(pMMD->iFD); SysFree(pMMD); } } SYS_OFF_T SysMMapSize(SYS_MMAP hMap) { MMapData *pMMD = (MMapData *) hMap; return pMMD->llFileSize; } SYS_OFF_T SysMMapOffsetAlign(SYS_MMAP hMap, SYS_OFF_T llOffset) { MMapData *pMMD = (MMapData *) hMap; return llOffset & ~((SYS_OFF_T) pMMD->ulPageSize - 1); } void *SysMapMMap(SYS_MMAP hMap, SYS_OFF_T llOffset, SYS_SIZE_T lSize) { MMapData *pMMD = (MMapData *) hMap; if (llOffset % pMMD->ulPageSize) { ErrSetErrorCode(ERR_INVALID_MMAP_OFFSET); return NULL; } int iMapFlags = 0; if (pMMD->ulFlags & SYS_MMAP_READ) iMapFlags |= PROT_READ; if (pMMD->ulFlags & SYS_MMAP_WRITE) iMapFlags |= PROT_WRITE; void *pMapAddress = (void *) mmap((char *) 0, (size_t) lSize, iMapFlags, MAP_SHARED, pMMD->iFD, llOffset); if (pMapAddress == (void *) -1L) { ErrSetErrorCode(ERR_MMAP); return NULL; } pMMD->iNumMaps++; return pMapAddress; } int SysUnmapMMap(SYS_MMAP hMap, void *pAddr, SYS_SIZE_T lSize) { MMapData *pMMD = (MMapData *) hMap; if (munmap((char *) pAddr, lSize) < 0) { ErrSetErrorCode(ERR_MUNMAP); return ERR_MUNMAP; } pMMD->iNumMaps--; return 0; } xmail-1.27/MessQueue.h0000644000175000017500000000600711341640430014113 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _MESSQUEUE_H #define _MESSQUEUE_H #define QUEUE_MESS_DIR "mess" #define QUEUE_RSND_DIR "rsnd" #define QUEUE_INFO_DIR "info" #define QUEUE_TEMP_DIR "temp" #define QUEUE_SLOG_DIR "slog" #define QUEUE_CUST_DIR "cust" #define QUEUE_MPRC_DIR "mprc" #define QUEUE_FROZ_DIR "froz" #define STD_QUEUEFS_DIRS_X_LEVEL 23 #define INVALID_QUEUE_HANDLE ((QUEUE_HANDLE) 0) #define INVALID_QMSG_HANDLE ((QMSG_HANDLE) 0) typedef struct QUEUE_HANDLE_struct { } *QUEUE_HANDLE; typedef struct QMSG_HANDLE_struct { } *QMSG_HANDLE; QUEUE_HANDLE QueOpen(char const *pszRootPath, int iMaxRetry, int iRetryTimeout, int iRetryIncrRatio, int iNumDirsLevel = STD_QUEUEFS_DIRS_X_LEVEL); int QueClose(QUEUE_HANDLE hQueue); int QueGetDirsLevel(QUEUE_HANDLE hQueue); char const *QueGetRootPath(QUEUE_HANDLE hQueue); char *QueLoadLastLogEntry(char const *pszLogFilePath); QMSG_HANDLE QueCreateMessage(QUEUE_HANDLE hQueue); int QueGetFilePath(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char *pszFilePath, char const *pszQueueDir = NULL); int QueCloseMessage(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage); QMSG_HANDLE QueGetHandle(QUEUE_HANDLE hQueue, int iLevel1, int iLevel2, char const *pszQueueDir, char const *pszFileName); char const *QueGetFileName(QMSG_HANDLE hMessage); char const *QueGetQueueDir(QMSG_HANDLE hMessage); int QueGetLevel1(QMSG_HANDLE hMessage); int QueGetLevel2(QMSG_HANDLE hMessage); int QueGetTryCount(QMSG_HANDLE hMessage); time_t QueGetLastTryTime(QMSG_HANDLE hMessage); time_t QueGetMessageNextOp(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage); int QueInitMessageStats(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage); int QueCleanupMessage(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, bool bFreeze = false); int QueCommitMessage(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage); int QueResendMessage(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage); QMSG_HANDLE QueExtractMessage(QUEUE_HANDLE hQueue, int iTimeout); int QueCheckMessage(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage); int QueFlushRsndArena(QUEUE_HANDLE hQueue, char const *pszAddressMatch); #endif xmail-1.27/SMTPSvr.h0000644000175000017500000000272011341640430013453 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SMTPSVR_H #define _SMTPSVR_H #define SMTP_SERVER_NAME "[" APP_NAME_VERSION_STR " ESMTP Server]" #define STD_SMTP_PORT 25 #define SMTPS_SERVER_NAME "[" APP_NAME_VERSION_STR " ESMTPS Server]" #define STD_SMTPS_PORT 465 #define SMTP_LISTEN_SIZE 64 #define SMTPF_LOG_ENABLED (1 << 0) struct SMTPConfig { unsigned long ulFlags; long lThreadCount; long lMaxThreads; int iSessionTimeout; int iTimeout; int iMaxRcpts; unsigned int uPopAuthExpireTime; }; unsigned int SMTPClientThread(void *pThreadData); #endif xmail-1.27/SMTPSvr.cpp0000644000175000017500000026723611341640430014025 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "SList.h" #include "ShBlocks.h" #include "BuffSock.h" #include "SSLBind.h" #include "ResLocks.h" #include "StrUtils.h" #include "UsrUtils.h" #include "SvrUtils.h" #include "MessQueue.h" #include "SMAILUtils.h" #include "QueueUtils.h" #include "MiscUtils.h" #include "SSLConfig.h" #include "Base64Enc.h" #include "MD5.h" #include "UsrMailList.h" #include "SMTPSvr.h" #include "SMTPUtils.h" #include "MailDomains.h" #include "AliasDomain.h" #include "POP3Utils.h" #include "Filter.h" #include "MailConfig.h" #include "AppDefines.h" #include "MailSvr.h" #define SMTP_MAX_LINE_SIZE 2048 #define STD_SMTP_TIMEOUT 30000 #define SMTP_IPMAP_FILE "smtp.ipmap.tab" #define SMTP_LOG_FILE "smtp" #define SMTP_POST_RCPT_FILTER "post-rcpt" #define SMTP_PRE_DATA_FILTER "pre-data" #define SMTP_POST_DATA_FILTER "post-data" #define SMTP_FILTER_REJECT_CODE 3 #define PLAIN_AUTH_PARAM_SIZE 1024 #define LOGIN_AUTH_USERNAME "Username:" #define LOGIN_AUTH_PASSWORD "Password:" #define SVR_SMTP_AUTH_FILE "smtpauth.tab" #define SVR_SMTPAUTH_LINE_MAX 512 #define SVR_SMTP_EXTAUTH_FILE "smtpextauth.tab" #define SVR_SMTP_EXTAUTH_LINE_MAX 1024 #define SVR_SMTP_EXTAUTH_TIMEOUT 60000 #define SVR_SMTP_EXTAUTH_SUCCESS 0 #define SMTPF_RELAY_ENABLED (1 << 0) #define SMTPF_MAIL_LOCKED (1 << 1) #define SMTPF_MAIL_UNLOCKED (1 << 2) #define SMTPF_AUTHENTICATED (1 << 3) #define SMTPF_VRFY_ENABLED (1 << 4) #define SMTPF_MAPPED_IP (1 << 5) #define SMTPF_NORDNS_IP (1 << 6) #define SMTPF_ETRN_ENABLED (1 << 7) #define SMTPF_NOEMIT_AUTH (1 << 8) #define SMTPF_WHITE_LISTED (1 << 9) #define SMTPF_BLOCKED_IP (1 << 10) #define SMTPF_IPMAPPED_IP (1 << 11) #define SMTPF_SNDRCHECK_BYPASS (1 << 12) #define SMTPF_WANT_TLS (1 << 13) #define SMTPF_EASE_TLS (1 << 14) #define SMTPF_STATIC_MASK (SMTPF_MAPPED_IP | SMTPF_NORDNS_IP | SMTPF_WHITE_LISTED | \ SMTPF_SNDRCHECK_BYPASS | SMTPF_BLOCKED_IP | SMTPF_IPMAPPED_IP) #define SMTPF_AUTH_MASK (SMTPF_RELAY_ENABLED | SMTPF_MAIL_UNLOCKED | SMTPF_AUTHENTICATED | \ SMTPF_VRFY_ENABLED | SMTPF_ETRN_ENABLED | SMTPF_EASE_TLS) #define SMTPF_RESET_MASK (SMTPF_AUTH_MASK | SMTPF_STATIC_MASK) #define SMTP_FILTER_FL_BREAK (1 << 4) #define SMTP_FILTER_FL_MASK SMTP_FILTER_FL_BREAK enum SMTPStates { stateInit = 0, stateHelo, stateAuthenticated, stateMail, stateRcpt, stateExit }; struct SMTPSession { int iSMTPState; ThreadConfig const *pThCfg; SMTPConfig *pSMTPCfg; SVRCFG_HANDLE hSvrConfig; SYS_INET_ADDR PeerInfo; SYS_INET_ADDR SockInfo; int iCmdDelay; unsigned long ulMaxMsgSize; char szSvrFQDN[MAX_ADDR_NAME]; char szSvrDomain[MAX_ADDR_NAME]; char szClientFQDN[MAX_ADDR_NAME]; char szClientDomain[MAX_ADDR_NAME]; char szDestDomain[MAX_ADDR_NAME]; char szLogonUser[128]; char szMsgFile[SYS_MAX_PATH]; FILE *pMsgFile; char *pszFrom; char *pszRcpt; char *pszSendRcpt; char *pszRealRcpt; int iRcptCount; int iErrorsCount; int iErrorsMax; SYS_UINT64 ullMessageID; char szMessageID[128]; char szTimeStamp[256]; unsigned long ulSetupFlags; unsigned long ulFlags; char *pszCustMsg; char szRejMapName[256]; char *pszNoTLSAuths; }; enum SmtpAuthFields { smtpaUsername = 0, smtpaPassword, smtpaPerms, smtpaMax }; struct ExtAuthMacroSubstCtx { char const *pszAuthType; char const *pszUsername; char const *pszPassword; char const *pszChallenge; char const *pszDigest; char const *pszRespFile; }; static int SMTPLogEnabled(SHB_HANDLE hShbSMTP, SMTPConfig *pSMTPCfg = NULL); static int SMTPThreadCountAdd(long lCount, SHB_HANDLE hShbSMTP, SMTPConfig *pSMTPCfg = NULL); static char const *SMTPGetFilterExtname(char const *pszFiltID) { static struct Filter_ID_Name { char const *pszFiltID; char const *pszName; } const FiltIdNames[] = { { SMTP_POST_RCPT_FILTER, "RCPT" }, { SMTP_PRE_DATA_FILTER, "PREDATA" }, { SMTP_POST_DATA_FILTER, "POSTDATA" }, }; int i; for (i = 0; i < CountOf(FiltIdNames); i++) if (strcmp(FiltIdNames[i].pszFiltID, pszFiltID) == 0) return FiltIdNames[i].pszName; return "UNKNOWN"; } static SMTPConfig *SMTPGetConfigCopy(SHB_HANDLE hShbSMTP) { SMTPConfig *pSMTPCfg = (SMTPConfig *) ShbLock(hShbSMTP); if (pSMTPCfg == NULL) return NULL; SMTPConfig *pSMTPCfgCopy = (SMTPConfig *) SysAlloc(sizeof(SMTPConfig)); if (pSMTPCfgCopy != NULL) memcpy(pSMTPCfgCopy, pSMTPCfg, sizeof(SMTPConfig)); ShbUnlock(hShbSMTP); return pSMTPCfgCopy; } static int SMTPLogEnabled(SHB_HANDLE hShbSMTP, SMTPConfig *pSMTPCfg) { int iDoUnlock = 0; if (pSMTPCfg == NULL) { if ((pSMTPCfg = (SMTPConfig *) ShbLock(hShbSMTP)) == NULL) return ErrGetErrorCode(); ++iDoUnlock; } unsigned long ulFlags = pSMTPCfg->ulFlags; if (iDoUnlock) ShbUnlock(hShbSMTP); return (ulFlags & SMTPF_LOG_ENABLED) ? 1 : 0; } static int SMTPCheckPeerIP(const SYS_INET_ADDR &PeerAddr) { char szIPMapFile[SYS_MAX_PATH] = ""; CfgGetRootPath(szIPMapFile, sizeof(szIPMapFile)); StrNCat(szIPMapFile, SMTP_IPMAP_FILE, sizeof(szIPMapFile)); if (SysExistFile(szIPMapFile) && MscCheckAllowedIP(szIPMapFile, PeerAddr, true) < 0) return ErrGetErrorCode(); return 0; } static int SMTPThreadCountAdd(long lCount, SHB_HANDLE hShbSMTP, SMTPConfig *pSMTPCfg) { int iDoUnlock = 0; if (pSMTPCfg == NULL) { if ((pSMTPCfg = (SMTPConfig *) ShbLock(hShbSMTP)) == NULL) return ErrGetErrorCode(); ++iDoUnlock; } if ((pSMTPCfg->lThreadCount + lCount) > pSMTPCfg->lMaxThreads) { if (iDoUnlock) ShbUnlock(hShbSMTP); ErrSetErrorCode(ERR_SERVER_BUSY); return ERR_SERVER_BUSY; } pSMTPCfg->lThreadCount += lCount; if (iDoUnlock) ShbUnlock(hShbSMTP); return 0; } static int SMTPCheckSysResources(SVRCFG_HANDLE hSvrConfig) { /* Check disk space */ int iMinValue = SvrGetConfigInt("SmtpMinDiskSpace", -1, hSvrConfig); if ((iMinValue > 0) && (SvrCheckDiskSpace(1024 * (unsigned long) iMinValue) < 0)) return ErrGetErrorCode(); /* Check virtual memory */ if (((iMinValue = SvrGetConfigInt("SmtpMinVirtMemSpace", -1, hSvrConfig)) > 0) && (SvrCheckVirtMemSpace(1024 * (unsigned long) iMinValue) < 0)) return ErrGetErrorCode(); return 0; } static int SMTPEnumIPPropsCB(void *pPrivate, char const *pszName, char const *pszVal) { SMTPSession *pSMTPS = (SMTPSession *) pPrivate; if (strcmp(pszName, "WhiteList") == 0) { if (pszVal == NULL || atoi(pszVal)) pSMTPS->ulFlags |= SMTPF_WHITE_LISTED; } else if (strcmp(pszName, "NoAuth") == 0) { if (pszVal == NULL || atoi(pszVal)) pSMTPS->ulFlags |= SMTPF_MAIL_UNLOCKED; } else if (strcmp(pszName, "SenderDomainCheck") == 0) { if (pszVal != NULL && !atoi(pszVal)) pSMTPS->ulFlags |= SMTPF_SNDRCHECK_BYPASS; } else if (strcmp(pszName, "EaseTLS") == 0) { if (pszVal == NULL || atoi(pszVal)) pSMTPS->ulSetupFlags &= ~SMTPF_WANT_TLS; } else if (strcmp(pszName, "EnableVRFY") == 0) { if (pszVal == NULL || atoi(pszVal)) pSMTPS->ulFlags |= SMTPF_VRFY_ENABLED; } else if (strcmp(pszName, "EnableETRN") == 0) { if (pszVal == NULL || atoi(pszVal)) pSMTPS->ulFlags |= SMTPF_ETRN_ENABLED; } return 0; } static int SMTPApplyIPProps(SMTPSession &SMTPS) { return SvrEnumProtoProps("smtp", &SMTPS.PeerInfo, IsEmptyString(SMTPS.szClientFQDN) ? NULL: SMTPS.szClientFQDN, SMTPEnumIPPropsCB, &SMTPS); } static int SMTPLogSession(SMTPSession &SMTPS, char const *pszSender, char const *pszRecipient, char const *pszStatus, unsigned long ulMsgSize) { char szTime[256] = ""; MscGetTimeNbrString(szTime, sizeof(szTime) - 1); RLCK_HANDLE hResLock = RLckLockEX(SVR_LOGS_DIR SYS_SLASH_STR SMTP_LOG_FILE); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); char szIP[128] = "???.???.???.???"; MscFileLog(SMTP_LOG_FILE, "\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%lu\"" "\t\"%s\"" "\n", SMTPS.szSvrFQDN, SMTPS.szSvrDomain, SysInetNToA(SMTPS.PeerInfo, szIP, sizeof(szIP)), szTime, SMTPS.szClientDomain, SMTPS.szDestDomain, pszSender, pszRecipient, SMTPS.szMessageID, pszStatus, SMTPS.szLogonUser, ulMsgSize, SMTPS.szClientFQDN); RLckUnlockEX(hResLock); return 0; } static int SMTPCheckMapsList(SYS_INET_ADDR const &PeerInfo, char const *pszMapList, char *pszMapName, int iMaxMapName, int &iMapCode) { for (;;) { char const *pszColon = strchr(pszMapList, ':'); if (pszColon == NULL) break; int iRetCode = atoi(pszColon + 1); int iMapLength = Min((int) (pszColon - pszMapList), MAX_HOST_NAME - 1); char szMapName[MAX_HOST_NAME] = ""; strncpy(szMapName, pszMapList, iMapLength); szMapName[iMapLength] = '\0'; if (USmtpDnsMapsContained(PeerInfo, szMapName)) { char szIP[128] = "???.???.???.???"; char szMapSpec[MAX_HOST_NAME + 128] = ""; if (pszMapName != NULL) StrNCpy(pszMapName, szMapName, iMaxMapName); iMapCode = iRetCode; SysInetNToA(PeerInfo, szIP, sizeof(szIP)); SysSNPrintf(szMapSpec, sizeof(szMapSpec) - 1, "%s:%s", szMapName, szIP); ErrSetErrorCode(ERR_MAPS_CONTAINED, szMapSpec); return ERR_MAPS_CONTAINED; } if ((pszMapList = strchr(pszColon, ',')) == NULL) break; ++pszMapList; } return 0; } static int SMTPDoIPBasedInit(SMTPSession &SMTPS, char *&pszSMTPError) { int iErrorCode; /* Check using the "smtp.ipmap.tab" file */ if ((iErrorCode = SMTPCheckPeerIP(SMTPS.PeerInfo)) < 0) { int iMapCode = SvrGetConfigInt("SMTP-IpMapDropCode", 1, SMTPS.hSvrConfig); if (iMapCode > 0) { if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, "", "", "SNDRIP=EIPBAN", 0); pszSMTPError = SvrGetConfigVar(SMTPS.hSvrConfig, "SmtpMsgIPBan"); ErrSetErrorCode(iErrorCode); return iErrorCode; } else if (iMapCode == 0) { SMTPS.ulFlags |= SMTPF_IPMAPPED_IP; } else SMTPS.iCmdDelay = Max(SMTPS.iCmdDelay, Abs(iMapCode)); } /* Check if SMTP client is in "spammers.tab" file */ char *pszChkInfo = NULL; if ((iErrorCode = USmtpSpammerCheck(SMTPS.PeerInfo, pszChkInfo)) < 0) { int iMapCode = 1; if (pszChkInfo != NULL) { char szMapCode[32] = ""; if (StrParamGet(pszChkInfo, "code", szMapCode, sizeof(szMapCode) - 1)) iMapCode = atoi(szMapCode); SysFree(pszChkInfo); } if (iMapCode > 0) { if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, "", "", "SNDRIP=EIPSPAM", 0); pszSMTPError = SvrGetConfigVar(SMTPS.hSvrConfig, "SmtpMsgIPBanSpammers"); ErrSetErrorCode(iErrorCode); return iErrorCode; } else if (iMapCode == 0) { SMTPS.ulFlags |= SMTPF_BLOCKED_IP; } else SMTPS.iCmdDelay = Max(SMTPS.iCmdDelay, Abs(iMapCode)); } /* Custom maps checking */ char *pszMapsList = SvrGetConfigVar(SMTPS.hSvrConfig, "CustMapsList"); if (pszMapsList != NULL) { int iMapCode = 0; char *pszCfgError = NULL; if (SMTPCheckMapsList(SMTPS.PeerInfo, pszMapsList, SMTPS.szRejMapName, sizeof(SMTPS.szRejMapName) - 1, iMapCode) < 0) { if (iMapCode == 1) { ErrorPush(); if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) { char *pszError = StrSprint("SNDRIP=EIPMAP (%s)", SMTPS.szRejMapName); SMTPLogSession(SMTPS, "", "", (pszError != NULL) ? pszError : "SNDRIP=EIPMAP", 0); SysFree(pszError); } if ((pszCfgError = SvrGetConfigVar(SMTPS.hSvrConfig, "SmtpMsgIPBanMaps")) != NULL) { pszSMTPError = StrSprint("%s (%s)", pszCfgError, SMTPS.szRejMapName); SysFree(pszCfgError); } else pszSMTPError = StrSprint ("550 Denied due inclusion of your IP inside (%s)", SMTPS.szRejMapName); SysFree(pszMapsList); return ErrorPop(); } if (iMapCode == 0) SMTPS.ulFlags |= SMTPF_MAPPED_IP; else SMTPS.iCmdDelay = Max(SMTPS.iCmdDelay, Abs(iMapCode)); } SysFree(pszMapsList); } /* RDNS client check */ int iCheckValue = SvrGetConfigInt("SMTP-RDNSCheck", 0, SMTPS.hSvrConfig); if (iCheckValue != 0 && SysGetHostByAddr(SMTPS.PeerInfo, SMTPS.szClientFQDN, sizeof(SMTPS.szClientFQDN)) < 0) { if (iCheckValue > 0) SMTPS.ulFlags |= SMTPF_NORDNS_IP; else SMTPS.iCmdDelay = Max(SMTPS.iCmdDelay, -iCheckValue); } return 0; } static int SMTPSvrCfgOptionsAssign(void *pPrivate, char const *pszName, char const *pszValue) { SMTPSession *pSMTPS = (SMTPSession *) pPrivate; if (strcmp(pszName, "mail-auth") == 0 || strcmp(pszName, "MailAuth") == 0) { if (pszValue == NULL || atoi(pszValue)) pSMTPS->ulSetupFlags |= SMTPF_MAIL_LOCKED; } else if (strcmp(pszName, "WantTLS") == 0) { if (pszValue == NULL || atoi(pszValue)) pSMTPS->ulSetupFlags |= SMTPF_WANT_TLS; } return 0; } static int SMTPLoadConfig(SMTPSession &SMTPS, char const *pszSvrConfig) { return MscParseOptions(pszSvrConfig, SMTPSvrCfgOptionsAssign, &SMTPS); } static int SMTPApplyPerms(SMTPSession &SMTPS, char const *pszPerms) { for (int i = 0; pszPerms[i] != '\0'; i++) { switch (pszPerms[i]) { case 'M': SMTPS.ulFlags |= SMTPF_MAIL_UNLOCKED; break; case 'R': SMTPS.ulFlags |= SMTPF_RELAY_ENABLED; break; case 'V': SMTPS.ulFlags |= SMTPF_VRFY_ENABLED; break; case 'T': SMTPS.ulFlags |= SMTPF_ETRN_ENABLED; break; case 'Z': SMTPS.ulMaxMsgSize = 0; break; case 'S': SMTPS.ulFlags |= SMTPF_EASE_TLS; break; } } /* Clear bad ip mask and command delay */ SMTPS.ulFlags &= ~(SMTPF_MAPPED_IP | SMTPF_NORDNS_IP | SMTPF_BLOCKED_IP | SMTPF_IPMAPPED_IP); SMTPS.iCmdDelay = 0; return 0; } static int SMTPInitSession(ThreadConfig const *pThCfg, BSOCK_HANDLE hBSock, SMTPSession &SMTPS, char *&pszSMTPError) { ZeroData(SMTPS); SMTPS.iSMTPState = stateInit; SMTPS.pThCfg = pThCfg; SMTPS.hSvrConfig = INVALID_SVRCFG_HANDLE; SMTPS.pSMTPCfg = NULL; SMTPS.pMsgFile = NULL; SMTPS.pszFrom = NULL; SMTPS.pszRcpt = NULL; SMTPS.pszSendRcpt = NULL; SMTPS.pszRealRcpt = NULL; SMTPS.iRcptCount = 0; SMTPS.iErrorsCount = 0; SMTPS.iErrorsMax = 0; SMTPS.iCmdDelay = 0; SMTPS.ulMaxMsgSize = 0; SetEmptyString(SMTPS.szMessageID); SetEmptyString(SMTPS.szDestDomain); SetEmptyString(SMTPS.szClientFQDN); SetEmptyString(SMTPS.szClientDomain); SetEmptyString(SMTPS.szLogonUser); SetEmptyString(SMTPS.szRejMapName); SMTPS.ulFlags = 0; SMTPS.ulSetupFlags = 0; SMTPS.pszCustMsg = NULL; SMTPS.pszNoTLSAuths = NULL; MscSafeGetTmpFile(SMTPS.szMsgFile, sizeof(SMTPS.szMsgFile)); if ((SMTPS.hSvrConfig = SvrGetConfigHandle()) == INVALID_SVRCFG_HANDLE) return ErrGetErrorCode(); if (SMTPCheckSysResources(SMTPS.hSvrConfig) < 0 || SysGetPeerInfo(BSckGetAttachedSocket(hBSock), SMTPS.PeerInfo) < 0 || SysGetSockInfo(BSckGetAttachedSocket(hBSock), SMTPS.SockInfo) < 0 || SMTPApplyIPProps(SMTPS) < 0) { ErrorPush(); SvrReleaseConfigHandle(SMTPS.hSvrConfig); return ErrorPop(); } /* If the remote IP is not white-listed, do all IP based checks */ if ((SMTPS.ulFlags & SMTPF_WHITE_LISTED) == 0 && SMTPDoIPBasedInit(SMTPS, pszSMTPError) < 0) { ErrorPush(); SvrReleaseConfigHandle(SMTPS.hSvrConfig); return ErrorPop(); } /* Get maximum errors count allowed in an SMTP session */ SMTPS.iErrorsMax = SvrGetConfigInt("SMTP-MaxErrors", 0, SMTPS.hSvrConfig); /* Setup SMTP domain */ char *pszSvrDomain = SvrGetConfigVar(SMTPS.hSvrConfig, "SmtpServerDomain"); char szIP[128] = "???.???.???.???"; if (pszSvrDomain != NULL) { StrSNCpy(SMTPS.szSvrDomain, pszSvrDomain); StrSNCpy(SMTPS.szSvrFQDN, pszSvrDomain); SysFree(pszSvrDomain); } else { if (SysGetHostByAddr(SMTPS.SockInfo, SMTPS.szSvrFQDN, sizeof(SMTPS.szSvrFQDN)) < 0) StrSNCpy(SMTPS.szSvrFQDN, SysInetNToA(SMTPS.SockInfo, szIP, sizeof(szIP))); else { /* Try to get a valid domain from the FQDN */ if (MDomGetClientDomain(SMTPS.szSvrFQDN, SMTPS.szSvrDomain, sizeof(SMTPS.szSvrDomain) - 1) < 0) StrSNCpy(SMTPS.szSvrDomain, SMTPS.szSvrFQDN); } /* Last attempt, try fetch the "RootDomain" variable ... */ if (IsEmptyString(SMTPS.szSvrDomain)) { if ((pszSvrDomain = SvrGetConfigVar(SMTPS.hSvrConfig, "RootDomain")) == NULL) { SvrReleaseConfigHandle(SMTPS.hSvrConfig); ErrSetErrorCode(ERR_NO_DOMAIN); return ERR_NO_DOMAIN; } StrSNCpy(SMTPS.szSvrDomain, pszSvrDomain); SysFree(pszSvrDomain); } } /* Create timestamp */ sprintf(SMTPS.szTimeStamp, "<%lu.%lu@%s>", (unsigned long) time(NULL), SysGetCurrentThreadId(), SMTPS.szSvrDomain); if ((SMTPS.pSMTPCfg = SMTPGetConfigCopy(hShbSMTP)) == NULL) { ErrorPush(); SvrReleaseConfigHandle(SMTPS.hSvrConfig); return ErrorPop(); } /* Get maximum accepted message size */ SMTPS.ulMaxMsgSize = 1024 * (unsigned long) SvrGetConfigInt("MaxMessageSize", 0, SMTPS.hSvrConfig); /* Check if the emission of "X-Auth-User:" is diabled */ if (SvrGetConfigInt("DisableEmitAuthUser", 0, SMTPS.hSvrConfig)) SMTPS.ulSetupFlags |= SMTPF_NOEMIT_AUTH; /* Try to load specific configuration */ char szConfigName[128] = ""; SysInetNToA(SMTPS.SockInfo, szIP, sizeof(szIP)); SysSNPrintf(szConfigName, sizeof(szConfigName), "SmtpConfig-%s,%d", szIP, SysGetAddrPort(SMTPS.SockInfo)); char *pszSvrConfig = SvrGetConfigVar(SMTPS.hSvrConfig, szConfigName); if (pszSvrConfig == NULL) { SysSNPrintf(szConfigName, sizeof(szConfigName), "SmtpConfig-%s", szIP); if ((pszSvrConfig = SvrGetConfigVar(SMTPS.hSvrConfig, szConfigName)) == NULL) pszSvrConfig = SvrGetConfigVar(SMTPS.hSvrConfig, "SmtpConfig"); } if (pszSvrConfig != NULL) { SMTPLoadConfig(SMTPS, pszSvrConfig); SysFree(pszSvrConfig); } SMTPS.ulFlags |= SMTPS.ulSetupFlags; /* Get custom message to append to the SMTP response */ SMTPS.pszCustMsg = SvrGetConfigVar(SMTPS.hSvrConfig, "CustomSMTPMessage"); /* Get custom message to append to the SMTP response */ SMTPS.pszNoTLSAuths = SvrGetConfigVar(SMTPS.hSvrConfig, "SmtpNoTLSAuths"); return 0; } static void SMTPClearSession(SMTPSession &SMTPS) { if (SMTPS.pMsgFile != NULL) fclose(SMTPS.pMsgFile), SMTPS.pMsgFile = NULL; SysRemove(SMTPS.szMsgFile); if (SMTPS.hSvrConfig != INVALID_SVRCFG_HANDLE) SvrReleaseConfigHandle(SMTPS.hSvrConfig), SMTPS.hSvrConfig = INVALID_SVRCFG_HANDLE; SysFreeNullify(SMTPS.pSMTPCfg); SysFreeNullify(SMTPS.pszFrom); SysFreeNullify(SMTPS.pszRcpt); SysFreeNullify(SMTPS.pszSendRcpt); SysFreeNullify(SMTPS.pszRealRcpt); SysFreeNullify(SMTPS.pszCustMsg); SysFreeNullify(SMTPS.pszNoTLSAuths); } static void SMTPResetSession(SMTPSession &SMTPS) { SMTPS.ulFlags = SMTPS.ulSetupFlags | (SMTPS.ulFlags & SMTPF_RESET_MASK); SMTPS.ullMessageID = 0; SMTPS.iRcptCount = 0; SetEmptyString(SMTPS.szMessageID); if (SMTPS.pMsgFile != NULL) fclose(SMTPS.pMsgFile), SMTPS.pMsgFile = NULL; SysRemove(SMTPS.szMsgFile); SetEmptyString(SMTPS.szDestDomain); SysFreeNullify(SMTPS.pszFrom); SysFreeNullify(SMTPS.pszRcpt); SysFreeNullify(SMTPS.pszSendRcpt); SysFreeNullify(SMTPS.pszRealRcpt); SMTPS.iSMTPState = (SMTPS.ulFlags & SMTPF_AUTHENTICATED) ? stateAuthenticated: Min(SMTPS.iSMTPState, stateHelo); } static void SMTPFullResetSession(SMTPSession &SMTPS) { SMTPS.ulFlags = 0; SMTPS.iSMTPState = stateInit; SMTPResetSession(SMTPS); } static int SMTPGetUserSmtpPerms(UserInfo *pUI, SVRCFG_HANDLE hSvrConfig, char *pszPerms, int iMaxPerms) { char *pszUserPerms = UsrGetUserInfoVar(pUI, "SmtpPerms"); if (pszUserPerms != NULL) { StrNCpy(pszPerms, pszUserPerms, iMaxPerms); SysFree(pszUserPerms); } else { /* Match found, get the default permissions */ char *pszDefultPerms = SvrGetConfigVar(hSvrConfig, "DefaultSmtpPerms", "MRVZ"); if (pszDefultPerms != NULL) { StrNCpy(pszPerms, pszDefultPerms, iMaxPerms); SysFree(pszDefultPerms); } else SetEmptyString(pszPerms); } return 0; } static int SMTPApplyUserConfig(SMTPSession &SMTPS, UserInfo *pUI) { /* Retrieve and apply permissions */ char *pszValue = NULL; char szPerms[128] = ""; if (SMTPGetUserSmtpPerms(pUI, SMTPS.hSvrConfig, szPerms, sizeof(szPerms) - 1) < 0) return ErrGetErrorCode(); SMTPApplyPerms(SMTPS, szPerms); /* Check "MaxMessageSize" override */ if ((pszValue = UsrGetUserInfoVar(pUI, "MaxMessageSize")) != NULL) { SMTPS.ulMaxMsgSize = 1024 * (unsigned long) atol(pszValue); SysFree(pszValue); } /* Check if the emission of "X-Auth-User:" is diabled */ if ((pszValue = UsrGetUserInfoVar(pUI, "DisableEmitAuthUser")) != NULL) { if (atoi(pszValue)) SMTPS.ulFlags |= SMTPF_NOEMIT_AUTH; else SMTPS.ulFlags &= ~SMTPF_NOEMIT_AUTH; SysFree(pszValue); } return 0; } static int SMTPSendError(BSOCK_HANDLE hBSock, SMTPSession &SMTPS, char const *pszFormat, ...) { char *pszBuffer = NULL; StrVSprint(pszBuffer, pszFormat, pszFormat); if (pszBuffer == NULL) return ErrGetErrorCode(); if (SMTPS.pszCustMsg == NULL) { if (BSckSendString(hBSock, pszBuffer, SMTPS.pSMTPCfg->iTimeout) < 0) { ErrorPush(); SysFree(pszBuffer); return ErrorPop(); } } else { if (BSckVSendString(hBSock, SMTPS.pSMTPCfg->iTimeout, "%s - %s", pszBuffer, SMTPS.pszCustMsg) < 0) { ErrorPush(); SysFree(pszBuffer); return ErrorPop(); } } SysFree(pszBuffer); /* * Increase the number of errors we encountered in this session. If the * maximum number of allowed errors is not zero, and the current number of * errors exceed the maximum number, we set the state to 'exit' so that the * SMTP connection will be dropped. */ SMTPS.iErrorsCount++; if (SMTPS.iErrorsMax > 0 && SMTPS.iErrorsCount >= SMTPS.iErrorsMax) { char szIP[128] = ""; if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, SMTPS.pszFrom != NULL ? SMTPS.pszFrom: "", "", "SMTP=EERRS", 0); SysLogMessage(LOG_LEV_MESSAGE, "SMTP forced exit (too many errors: %d) [%s]\n", SMTPS.iErrorsCount, SysInetNToA(SMTPS.PeerInfo, szIP, sizeof(szIP))); SMTPS.iSMTPState = stateExit; } return 0; } static int SMTPTryPopAuthIpCheck(SMTPSession &SMTPS, char const *pszUser, char const *pszDomain) { /* Load user info */ UserInfo *pUI = UsrGetUserByNameOrAlias(pszDomain, pszUser); if (pUI == NULL) return ErrGetErrorCode(); /* Perform IP file checking */ if (UPopUserIpCheck(pUI, &SMTPS.PeerInfo, SMTPS.pSMTPCfg->uPopAuthExpireTime) < 0) { ErrorPush(); UsrFreeUserInfo(pUI); return ErrorPop(); } /* Apply user configuration */ if (SMTPApplyUserConfig(SMTPS, pUI) < 0) { ErrorPush(); UsrFreeUserInfo(pUI); return ErrorPop(); } /* If the user did not authenticate, set the logon user token */ if (IsEmptyString(SMTPS.szLogonUser)) UsrGetAddress(pUI, SMTPS.szLogonUser); UsrFreeUserInfo(pUI); return 0; } static int SMTPCheckMailParams(char const *pszCommand, char **ppszRetDomains, SMTPSession &SMTPS, char *&pszSMTPError) { char const *pszParams = strrchr(pszCommand, '>'); if (pszParams == NULL) pszParams = pszCommand; /* Check the SIZE parameter */ if (SMTPS.ulMaxMsgSize != 0) { char const *pszSize = pszParams; while ((pszSize = StrIStr(pszSize, " SIZE=")) != NULL) { pszSize += CStringSize(" SIZE="); if (isdigit(*pszSize) && SMTPS.ulMaxMsgSize < (unsigned long) atol(pszSize)) { if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, (ppszRetDomains[0] != NULL) ? ppszRetDomains[0] : "", "", "SIZE=EBIG", (unsigned long) atol(pszSize)); pszSMTPError = SysStrDup("552 Message exceeds fixed maximum message size"); ErrSetErrorCode(ERR_MESSAGE_SIZE); return ERR_MESSAGE_SIZE; } } } return 0; } static int SMTPCheckReturnPath(char const *pszCommand, char **ppszRetDomains, SMTPSession &SMTPS, char *&pszSMTPError) { int iDomainCount; char szMailerUser[MAX_ADDR_NAME] = ""; char szMailerDomain[MAX_ADDR_NAME] = ""; if ((iDomainCount = StrStringsCount(ppszRetDomains)) == 0) { if (!SvrTestConfigFlag("AllowNullSender", true, SMTPS.hSvrConfig)) { if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, "", "", "SNDR=EEMPTY", 0); pszSMTPError = SysStrDup("501 Syntax error in return path"); ErrSetErrorCode(ERR_BAD_RETURN_PATH); return ERR_BAD_RETURN_PATH; } SysFree(SMTPS.pszFrom); SMTPS.pszFrom = SysStrDup(""); return 0; } if (USmtpSplitEmailAddr(ppszRetDomains[0], szMailerUser, szMailerDomain) < 0) { ErrorPush(); if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, ppszRetDomains[0], "", "SNDR=ESYNTAX", 0); pszSMTPError = SysStrDup("501 Syntax error in return path"); return ErrorPop(); } /* Check mailer domain for DNS/MX entries */ if (!(SMTPS.ulFlags & SMTPF_SNDRCHECK_BYPASS) && SvrTestConfigFlag("CheckMailerDomain", false, SMTPS.hSvrConfig) && USmtpCheckMailDomain(SMTPS.hSvrConfig, szMailerDomain) < 0) { ErrorPush(); if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, ppszRetDomains[0], "", "SNDR=ENODNS", 0); pszSMTPError = SysStrDup("505 Your domain has no DNS/MX entries"); return ErrorPop(); } /* Check if mail come from a spammer address ( spam-address.tab ) */ if (USmtpSpamAddressCheck(ppszRetDomains[0]) < 0) { ErrorPush(); if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, ppszRetDomains[0], "", "SNDR=ESPAM", 0); if ((pszSMTPError = SvrGetConfigVar(SMTPS.hSvrConfig, "SmtpMsgIPBanSpamAddress")) == NULL) pszSMTPError = SysStrDup("504 You are registered as spammer"); return ErrorPop(); } /* Check SMTP after POP3 authentication */ if (SvrTestConfigFlag("EnableAuthSMTP-POP3", true, SMTPS.hSvrConfig)) SMTPTryPopAuthIpCheck(SMTPS, szMailerUser, szMailerDomain); /* Check extended mail from parameters */ if (SMTPCheckMailParams(pszCommand, ppszRetDomains, SMTPS, pszSMTPError) < 0) return ErrGetErrorCode(); /* Setup From string */ SysFree(SMTPS.pszFrom); SMTPS.pszFrom = SysStrDup(ppszRetDomains[0]); return 0; } static int SMTPAddMessageInfo(SMTPSession &SMTPS) { return USmtpAddMessageInfo(SMTPS.pMsgFile, SMTPS.szClientDomain, SMTPS.PeerInfo, SMTPS.szSvrDomain, SMTPS.SockInfo, SMTP_SERVER_NAME); } static int SMTPHandleCmd_MAIL(char const *pszCommand, BSOCK_HANDLE hBSock, SMTPSession &SMTPS) { if (SMTPS.iSMTPState != stateHelo && SMTPS.iSMTPState != stateAuthenticated) { SMTPResetSession(SMTPS); SMTPSendError(hBSock, SMTPS, "503 Bad sequence of commands"); ErrSetErrorCode(ERR_SMTP_BAD_CMD_SEQUENCE); return ERR_SMTP_BAD_CMD_SEQUENCE; } /* Do we need to be in TLS mode for this session? */ if ((SMTPS.ulFlags & SMTPF_WANT_TLS) && !(SMTPS.ulFlags & SMTPF_EASE_TLS) && strcmp(BSckBioName(hBSock), BSSL_BIO_NAME) != 0) { SMTPSendError(hBSock, SMTPS, "503 Bad sequence of commands (TLS needed for this session)"); ErrSetErrorCode(ERR_TLS_MODE_REQUIRED); return ERR_TLS_MODE_REQUIRED; } /* Split the RETURN PATH */ char **ppszRetDomains = USmtpGetPathStrings(pszCommand); if (ppszRetDomains == NULL) { ErrorPush(); SMTPResetSession(SMTPS); SMTPSendError(hBSock, SMTPS, "501 Syntax error in parameters or arguments: (%d)", ErrorFetch()); return ErrorPop(); } /* Check RETURN PATH */ char *pszSMTPError = NULL; if (SMTPCheckReturnPath(pszCommand, ppszRetDomains, SMTPS, pszSMTPError) < 0) { ErrorPush(); StrFreeStrings(ppszRetDomains); SMTPResetSession(SMTPS); SMTPSendError(hBSock, SMTPS, "%s", pszSMTPError); SysFree(pszSMTPError); return ErrorPop(); } StrFreeStrings(ppszRetDomains); /* If the incoming IP is "mapped" stop here */ if (SMTPS.ulFlags & (SMTPF_MAPPED_IP | SMTPF_NORDNS_IP | SMTPF_BLOCKED_IP)) { if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) { if (SMTPS.ulFlags & SMTPF_MAPPED_IP) { char *pszError = StrSprint("SNDRIP=EIPMAP (%s)", SMTPS.szRejMapName); SMTPLogSession(SMTPS, SMTPS.pszFrom, "", (pszError != NULL) ? pszError : "SNDRIP=EIPMAP", 0); SysFree(pszError); } else if (SMTPS.ulFlags & SMTPF_NORDNS_IP) { SMTPLogSession(SMTPS, SMTPS.pszFrom, "", "SNDRIP=ERDNS", 0); } else SMTPLogSession(SMTPS, SMTPS.pszFrom, "", "SNDRIP=EIPSPAM", 0); } if (SMTPS.ulFlags & SMTPF_BLOCKED_IP) pszSMTPError = SvrGetConfigVar(SMTPS.hSvrConfig, "SmtpMsgIPBanSpammers"); SMTPResetSession(SMTPS); if (pszSMTPError == NULL) SMTPSendError(hBSock, SMTPS, "551 Server access forbidden by your IP"); else { SMTPSendError(hBSock, SMTPS, "%s", pszSMTPError); SysFree(pszSMTPError); } ErrSetErrorCode(ERR_SMTP_USE_FORBIDDEN); return ERR_SMTP_USE_FORBIDDEN; } /* If MAIL command is locked stop here */ if ((SMTPS.ulFlags & SMTPF_MAIL_LOCKED) && !(SMTPS.ulFlags & SMTPF_MAIL_UNLOCKED)) { SMTPResetSession(SMTPS); SMTPSendError(hBSock, SMTPS, "551 Server use forbidden"); ErrSetErrorCode(ERR_SMTP_USE_FORBIDDEN); return ERR_SMTP_USE_FORBIDDEN; } /* Prepare mail file */ if ((SMTPS.pMsgFile = fopen(SMTPS.szMsgFile, "w+b")) == NULL) { SMTPResetSession(SMTPS); SMTPSendError(hBSock, SMTPS, "451 Requested action aborted: (%d) local error in processing", ERR_FILE_CREATE); ErrSetErrorCode(ERR_FILE_CREATE, SMTPS.szMsgFile); return ERR_FILE_CREATE; } /* Write message infos ( 1st row of the smtp-mail file ) */ if (SMTPAddMessageInfo(SMTPS) < 0) { ErrorPush(); SMTPResetSession(SMTPS); SMTPSendError(hBSock, SMTPS, "451 Requested action aborted: (%d) local error in processing", ErrorFetch()); return ErrorPop(); } /* Write domain ( 2nd row of the smtp-mail file ) */ if (StrWriteCRLFString(SMTPS.pMsgFile, SMTPS.szSvrDomain) < 0) { ErrorPush(); SMTPResetSession(SMTPS); SMTPSendError(hBSock, SMTPS, "451 Requested action aborted: (%d) local error in processing", ErrorFetch()); return ErrorPop(); } /* Get SMTP message ID and write it to file ( 3th row of the smtp-mail file ) */ if (SvrGetMessageID(&SMTPS.ullMessageID) < 0) { ErrorPush(); SMTPResetSession(SMTPS); SMTPSendError(hBSock, SMTPS, "451 Requested action aborted: (%d) local error in processing", ErrorFetch()); return ErrorPop(); } sprintf(SMTPS.szMessageID, "S" SYS_LLX_FMT, SMTPS.ullMessageID); if (StrWriteCRLFString(SMTPS.pMsgFile, SMTPS.szMessageID) < 0) { ErrorPush(); SMTPResetSession(SMTPS); SMTPSendError(hBSock, SMTPS, "451 Requested action aborted: (%d) local error in processing", ErrorFetch()); return ErrorPop(); } /* Write MAIL FROM ( 4th row of the smtp-mail file ) */ if (StrWriteCRLFString(SMTPS.pMsgFile, pszCommand) < 0) { ErrorPush(); SMTPResetSession(SMTPS); SMTPSendError(hBSock, SMTPS, "451 Requested action aborted: (%d) local error in processing", ErrorFetch()); return ErrorPop(); } BSckSendString(hBSock, "250 OK", SMTPS.pSMTPCfg->iTimeout); SMTPS.iSMTPState = stateMail; return 0; } static int SMTPCheckRelayCapability(SMTPSession &SMTPS, char const *pszDestDomain) { /* OK if enabled ( authentication ) */ if (SMTPS.ulFlags & SMTPF_RELAY_ENABLED) return 0; /* OK if destination domain is a custom-handled domain */ if (USmlCustomizedDomain(pszDestDomain) == 0) return 0; /* IP based relay check */ return USmtpIsAllowedRelay(SMTPS.PeerInfo, SMTPS.hSvrConfig); } static int SMTPGetFilterFile(char const *pszFiltID, char *pszFileName, int iMaxName) { char szMailRoot[SYS_MAX_PATH] = ""; CfgGetRootPath(szMailRoot, sizeof(szMailRoot)); SysSNPrintf(pszFileName, iMaxName - 1, "%sfilters.%s.tab", szMailRoot, pszFiltID); return SysExistFile(pszFileName); } static char *SMTPMacroLkupProc(void *pPrivate, char const *pszName, int iSize) { SMTPSession *pSMTPS = (SMTPSession *) pPrivate; if (MemMatch(pszName, iSize, "FROM", 4)) { return SysStrDup(pSMTPS->pszFrom != NULL ? pSMTPS->pszFrom: "-"); } else if (MemMatch(pszName, iSize, "CRCPT", 5)) { return SysStrDup(pSMTPS->pszRcpt != NULL ? pSMTPS->pszRcpt: "-"); } else if (MemMatch(pszName, iSize, "RRCPT", 5)) { return SysStrDup(pSMTPS->pszRealRcpt != NULL ? pSMTPS->pszRealRcpt: pSMTPS->pszRcpt != NULL ? pSMTPS->pszRcpt: "-"); } else if (MemMatch(pszName, iSize, "FILE", 4)) { return SysStrDup(pSMTPS->szMsgFile); } else if (MemMatch(pszName, iSize, "LOCALADDR", 9)) { char szAddr[128] = ""; MscGetAddrString(pSMTPS->SockInfo, szAddr, sizeof(szAddr) - 1); return SysStrDup(szAddr); } else if (MemMatch(pszName, iSize, "REMOTEADDR", 10)) { char szAddr[128] = ""; MscGetAddrString(pSMTPS->PeerInfo, szAddr, sizeof(szAddr) - 1); return SysStrDup(szAddr); } else if (MemMatch(pszName, iSize, "MSGREF", 6)) { return SysStrDup(pSMTPS->szMessageID); } else if (MemMatch(pszName, iSize, "USERAUTH", 8)) { return SysStrDup(IsEmptyString(pSMTPS->szLogonUser) ? "-": pSMTPS->szLogonUser); } return SysStrDup(""); } static int SMTPFilterMacroSubstitutes(char **ppszCmdTokens, SMTPSession &SMTPS) { return MscReplaceTokens(ppszCmdTokens, SMTPMacroLkupProc, &SMTPS); } static char *SMTPGetFilterRejMessage(char const *pszMsgFilePath) { FILE *pFile; char szRejFilePath[SYS_MAX_PATH] = ""; char szRejMsg[512] = ""; SysSNPrintf(szRejFilePath, sizeof(szRejFilePath) - 1, "%s.rej", pszMsgFilePath); if ((pFile = fopen(szRejFilePath, "rb")) == NULL) return NULL; MscFGets(szRejMsg, sizeof(szRejMsg) - 1, pFile); fclose(pFile); SysRemove(szRejFilePath); return SysStrDup(szRejMsg); } static int SMTPLogFilter(SMTPSession &SMTPS, char const *const *ppszExec, int iExecResult, int iExitCode, char const *pszType, char const *pszInfo) { FilterLogInfo FLI; ZeroData(FLI); FLI.pszSender = SMTPS.pszFrom != NULL ? SMTPS.pszFrom: ""; /* * In case we have multiple recipients, it is misleading to log only the * latest (or current) one, so we log "*" instead. But for post-RCPT * filters, it makes sense to log the current recipient for each filter * execution. */ if (SMTPS.pszRcpt != NULL) FLI.pszRecipient = (SMTPS.iRcptCount == 1 || strcmp(pszType, SMTP_POST_RCPT_FILTER) == 0) ? SMTPS.pszRcpt: "*"; else FLI.pszRecipient = ""; FLI.LocalAddr = SMTPS.SockInfo; FLI.RemoteAddr = SMTPS.PeerInfo; FLI.ppszExec = ppszExec; FLI.iExecResult = iExecResult; FLI.iExitCode = iExitCode; FLI.pszType = pszType; FLI.pszInfo = pszInfo != NULL ? pszInfo: ""; return FilLogFilter(&FLI); } static int SMTPPreFilterExec(SMTPSession &SMTPS, FilterExecCtx *pFCtx, FilterTokens *pToks, char **ppszPEError) { pFCtx->pToks = pToks; pFCtx->pszAuthName = SMTPS.szLogonUser; pFCtx->ulFlags = (SMTPS.ulFlags & SMTPF_WHITE_LISTED) ? FILTER_XFL_WHITELISTED: 0; pFCtx->iTimeout = iFilterTimeout; return FilExecPreParse(pFCtx, ppszPEError); } static int SMTPRunFilters(SMTPSession &SMTPS, char const *pszFilterPath, char const *pszType, char *&pszError) { /* Share lock the filter file */ char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(pszFilterPath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); /* This should not happen but if it happens we let the message pass through */ FILE *pFiltFile = fopen(pszFilterPath, "rt"); if (pFiltFile == NULL) { RLckUnlockSH(hResLock); return 0; } /* Filter this message */ int iFieldsCount, iExitCode, iExitFlags, iExecResult; char szFiltLine[1024] = ""; while (MscGetConfigLine(szFiltLine, sizeof(szFiltLine) - 1, pFiltFile) != NULL) { char **ppszCmdTokens = StrGetTabLineStrings(szFiltLine); if (ppszCmdTokens == NULL) continue; if ((iFieldsCount = StrStringsCount(ppszCmdTokens)) < 1) { StrFreeStrings(ppszCmdTokens); continue; } /* Perform pre-exec filtering (like exec exclude if authenticated, ...) */ char *pszPEError = NULL; FilterExecCtx FCtx; FilterTokens Toks; ZeroData(FCtx); Toks.ppszCmdTokens = ppszCmdTokens; Toks.iTokenCount = iFieldsCount; if (SMTPPreFilterExec(SMTPS, &FCtx, &Toks, &pszPEError) < 0) { if (bFilterLogEnabled) SMTPLogFilter(SMTPS, Toks.ppszCmdTokens, -1, -1, pszType, pszPEError); SysFree(pszPEError); StrFreeStrings(ppszCmdTokens); continue; } /* Do filter line macro substitution */ SMTPFilterMacroSubstitutes(Toks.ppszCmdTokens, SMTPS); iExitCode = -1; iExitFlags = 0; iExecResult = SysExec(Toks.ppszCmdTokens[0], &Toks.ppszCmdTokens[0], FCtx.iTimeout, SYS_PRIORITY_NORMAL, &iExitCode); /* Log filter execution, if enabled */ if (bFilterLogEnabled) SMTPLogFilter(SMTPS, Toks.ppszCmdTokens, iExecResult, iExitCode, pszType, NULL); if (iExecResult == 0) { SysLogMessage(LOG_LEV_MESSAGE, "SMTP filter run: Filter = \"%s\" Retcode = %d\n", Toks.ppszCmdTokens[0], iExitCode); iExitFlags = iExitCode & SMTP_FILTER_FL_MASK; iExitCode &= ~SMTP_FILTER_FL_MASK; if (iExitCode == SMTP_FILTER_REJECT_CODE) { StrFreeStrings(ppszCmdTokens); fclose(pFiltFile); RLckUnlockSH(hResLock); char szLogLine[128]; SysSNPrintf(szLogLine, sizeof(szLogLine) - 1, "%s=EFILTER", SMTPGetFilterExtname(pszType)); if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, SMTPS.pszFrom, SMTPS.pszRcpt, szLogLine, 0); pszError = SMTPGetFilterRejMessage(SMTPS.szMsgFile); ErrSetErrorCode(ERR_FILTERED_MESSAGE); return ERR_FILTERED_MESSAGE; } } else { SysLogMessage(LOG_LEV_ERROR, "SMTP filter error (%d): Filter = \"%s\"\n", iExecResult, Toks.ppszCmdTokens[0]); } StrFreeStrings(ppszCmdTokens); if (iExitFlags & SMTP_FILTER_FL_BREAK) break; } fclose(pFiltFile); RLckUnlockSH(hResLock); return 0; } static int SMTPFilterMessage(SMTPSession &SMTPS, char const *pszFiltID, char *&pszError) { int iReOpen = 0; char szFilterFile[SYS_MAX_PATH] = ""; if (!SMTPGetFilterFile(pszFiltID, szFilterFile, sizeof(szFilterFile) - 1)) return 0; if (SMTPS.pMsgFile != NULL) { if (fclose(SMTPS.pMsgFile)) { SMTPS.pMsgFile = NULL; ErrSetErrorCode(ERR_FILE_WRITE, SMTPS.szMsgFile); return ERR_FILE_WRITE; } SMTPS.pMsgFile = NULL; iReOpen++; } int iError = SMTPRunFilters(SMTPS, szFilterFile, pszFiltID, pszError); if (iReOpen) { if ((SMTPS.pMsgFile = fopen(SMTPS.szMsgFile, "r+b")) == NULL) { ErrSetErrorCode(ERR_FILE_OPEN, SMTPS.szMsgFile); /* * We failed to re-open our own file. Cannot proceed w/out * a session reset! */ SMTPResetSession(SMTPS); return ERR_FILE_OPEN; } fseek(SMTPS.pMsgFile, 0, SEEK_END); } return iError; } static int SMTPCheckForwardPath(char **ppszFwdDomains, SMTPSession &SMTPS, char *&pszSMTPError) { int iDomainCount; char szDestUser[MAX_ADDR_NAME] = ""; char szDestDomain[MAX_ADDR_NAME] = ""; char szRealUser[MAX_ADDR_NAME] = ""; if ((iDomainCount = StrStringsCount(ppszFwdDomains)) == 0) { if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, SMTPS.pszFrom, "", "RCPT=ESYNTAX", 0); pszSMTPError = SysStrDup("501 Syntax error in forward path"); ErrSetErrorCode(ERR_BAD_FORWARD_PATH); return ERR_BAD_FORWARD_PATH; } if (USmtpSplitEmailAddr(ppszFwdDomains[iDomainCount - 1], szDestUser, szDestDomain) < 0) { ErrorPush(); if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, SMTPS.pszFrom, ppszFwdDomains[0], "RCPT=ESYNTAX", 0); pszSMTPError = SysStrDup("501 Syntax error in forward path"); return ErrorPop(); } if (iDomainCount == 1) { /* * Resolve alias domain alias domain. This needs to be used when * looking for cmdalias handling, in order to avoid replicating * then over aliased domains. */ char const *pszRealDomain = szDestDomain; char szADomain[MAX_HOST_NAME] = ""; if (ADomLookupDomain(szDestDomain, szADomain, true)) pszRealDomain = szADomain; if (USmlIsCmdAliasAccount(pszRealDomain, szDestUser) == 0) { /* The recipient is handled with cmdaliases */ } else if (MDomIsHandledDomain(szDestDomain) == 0) { /* Check user existance */ UserInfo *pUI = UsrGetUserByNameOrAlias(szDestDomain, szDestUser); if (pUI != NULL) { /* Check if the account is enabled for receiving */ if (!UsrGetUserInfoVarInt(pUI, "ReceiveEnable", 1)) { UsrFreeUserInfo(pUI); if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, SMTPS.pszFrom, ppszFwdDomains[0], "RCPT=EDSBL", 0); pszSMTPError = StrSprint("550 Account disabled <%s@%s>", szDestUser, szDestDomain); ErrSetErrorCode(ERR_USER_DISABLED); return ERR_USER_DISABLED; } if (UsrGetUserType(pUI) == usrTypeUser) { /* Target is a normal user */ /* Check user mailbox size */ if (UPopCheckMailboxSize(pUI) < 0) { ErrorPush(); UsrFreeUserInfo(pUI); if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, SMTPS.pszFrom, ppszFwdDomains[0], "RCPT=EFULL", 0); pszSMTPError = StrSprint("552 Requested mail action aborted: exceeded storage allocation - <%s@%s>", szDestUser, szDestDomain); return ErrorPop(); } } else { /* Target is a mailing list */ /* Check if client can post to this mailing list */ if (UsrMLCheckUserPost(pUI, SMTPS.pszFrom, IsEmptyString(SMTPS. szLogonUser) ? NULL : SMTPS.szLogonUser) < 0) { ErrorPush(); UsrFreeUserInfo(pUI); if (SMTPLogEnabled (SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, SMTPS.pszFrom, ppszFwdDomains[0], "RCPT=EACCESS", 0); pszSMTPError = StrSprint("557 Access denied <%s@%s> for user <%s>", szDestUser, szDestDomain, SMTPS.pszFrom); return ErrorPop(); } } /* Extract the real user address */ UsrGetAddress(pUI, szRealUser); UsrFreeUserInfo(pUI); } else { /* Recipient domain is local but no account is found inside the standard */ /* users/aliases database and the account is not handled with cmdaliases. */ /* It's pretty much time to report a recipient error */ if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, SMTPS.pszFrom, ppszFwdDomains[0], "RCPT=EAVAIL", 0); pszSMTPError = StrSprint("550 Mailbox unavailable <%s@%s>", szDestUser, szDestDomain); ErrSetErrorCode(ERR_USER_NOT_LOCAL); return ERR_USER_NOT_LOCAL; } } else { /* Check relay permission */ if (SMTPCheckRelayCapability(SMTPS, szDestDomain) < 0) { ErrorPush(); if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, SMTPS.pszFrom, ppszFwdDomains[0], "RCPT=ERELAY", 0); pszSMTPError = SysStrDup("550 Relay denied"); return ErrorPop(); } } } else { /* Check relay permission */ if (SMTPCheckRelayCapability(SMTPS, szDestDomain) < 0) { ErrorPush(); if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, SMTPS.pszFrom, ppszFwdDomains[0], "RCPT=ERELAY", 0); pszSMTPError = SysStrDup("550 Relay denied"); return ErrorPop(); } } /* Retrieve destination domain */ if (USmtpSplitEmailAddr(ppszFwdDomains[0], NULL, SMTPS.szDestDomain) < 0) { ErrorPush(); if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, SMTPS.pszFrom, ppszFwdDomains[0], "RCPT=ESYNTAX", 0); pszSMTPError = SysStrDup("501 Syntax error in forward path"); return ErrorPop(); } /* * Setup SendRcpt string (it'll be used to build "RCPT TO:<>" line into * the message file) */ SysFree(SMTPS.pszSendRcpt); if ((SMTPS.pszSendRcpt = USmtpBuildRcptPath(ppszFwdDomains, SMTPS.hSvrConfig)) == NULL) { ErrorPush(); if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, SMTPS.pszFrom, ppszFwdDomains[0], "RCPT=ESYNTAX", 0); pszSMTPError = SysStrDup("501 Syntax error in forward path"); return ErrorPop(); } /* * Setup Rcpt string. This needs to be done before filter execution, * since the CRCPT macro substitution needs that information. */ SysFree(SMTPS.pszRcpt); SMTPS.pszRcpt = SysStrDup(ppszFwdDomains[0]); /* Setup the Real Rcpt string */ if (!IsEmptyString(szRealUser)) SMTPS.pszRealRcpt = SysStrDup(szRealUser); /* * Call the post-rcpt filter. */ pszSMTPError = NULL; if (SMTPFilterMessage(SMTPS, SMTP_POST_RCPT_FILTER, pszSMTPError) < 0) { ErrorPush(); if (pszSMTPError == NULL) pszSMTPError = SysStrDup("550 Recipient rejected"); return ErrorPop(); } return 0; } static char **SMTPGetForwardPath(char const *pszCommand, SMTPSession &SMTPS) { int iCount; char **ppszFwdDomains = USmtpGetPathStrings(pszCommand); if (ppszFwdDomains != NULL && (iCount = StrStringsCount(ppszFwdDomains)) > 0) { char *pszRename = NULL; if (stricmp(ppszFwdDomains[iCount - 1], "postmaster") == 0) pszRename = SvrGetConfigVar(SMTPS.hSvrConfig, "PostMaster"); if (pszRename != NULL) { SysFree(ppszFwdDomains[iCount - 1]); ppszFwdDomains[iCount - 1] = pszRename; } } return ppszFwdDomains; } static int SMTPHandleCmd_RCPT(char const *pszCommand, BSOCK_HANDLE hBSock, SMTPSession &SMTPS) { if ((SMTPS.iSMTPState != stateMail) && (SMTPS.iSMTPState != stateRcpt)) { SMTPResetSession(SMTPS); SMTPSendError(hBSock, SMTPS, "503 Bad sequence of commands"); ErrSetErrorCode(ERR_SMTP_BAD_CMD_SEQUENCE); return ERR_SMTP_BAD_CMD_SEQUENCE; } /* Check recipients count */ if (SMTPS.iRcptCount >= SMTPS.pSMTPCfg->iMaxRcpts) { if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, SMTPS.pszFrom, "", "RCPT=ENBR", 0); SMTPSendError(hBSock, SMTPS, "552 Too many recipients"); ErrSetErrorCode(ERR_SMTP_TOO_MANY_RECIPIENTS); return ERR_SMTP_TOO_MANY_RECIPIENTS; } char **ppszFwdDomains = SMTPGetForwardPath(pszCommand, SMTPS); if (ppszFwdDomains == NULL) { ErrorPush(); if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, SMTPS.pszFrom, "", "RCPT=ESYNTAX", 0); SMTPResetSession(SMTPS); SMTPSendError(hBSock, SMTPS, "501 Syntax error in parameters or arguments: (%d)", ErrorFetch()); return ErrorPop(); } /* Check FORWARD PATH */ char *pszSMTPError = NULL; if (SMTPCheckForwardPath(ppszFwdDomains, SMTPS, pszSMTPError) < 0) { ErrorPush(); StrFreeStrings(ppszFwdDomains); SMTPSendError(hBSock, SMTPS, "%s", pszSMTPError); SysFree(pszSMTPError); return ErrorPop(); } StrFreeStrings(ppszFwdDomains); /* Log SMTP session */ if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, SMTPS.pszFrom, SMTPS.pszRcpt, "RCPT=OK", 0); /* Write RCPT TO ( 5th[,...] row(s) of the smtp-mail file ) */ fprintf(SMTPS.pMsgFile, "RCPT TO:<%s> {ra=%s}\r\n", SMTPS.pszSendRcpt, (SMTPS.pszRealRcpt != NULL) ? SMTPS.pszRealRcpt: SMTPS.pszSendRcpt); BSckSendString(hBSock, "250 OK", SMTPS.pSMTPCfg->iTimeout); ++SMTPS.iRcptCount; SMTPS.iSMTPState = stateRcpt; return 0; } static int SMTPAddReceived(int iType, char const *pszAuth, char const *const *ppszMsgInfo, char const *pszMailFrom, char const *pszRcptTo, char const *pszMessageID, FILE *pMailFile) { char *pszReceived = USmtpGetReceived(iType, pszAuth, ppszMsgInfo, pszMailFrom, pszRcptTo, pszMessageID); if (pszReceived == NULL) return ErrGetErrorCode(); /* Write "Received:" tag */ fputs(pszReceived, pMailFile); SysFree(pszReceived); return 0; } static char *SMTPTrimRcptLine(char *pszRcptLn) { char *pszTrim = strchr(pszRcptLn, '>'); if (pszTrim != NULL) pszTrim[1] = '\0'; return pszRcptLn; } static int SMTPSubmitPackedFile(SMTPSession &SMTPS, char const *pszPkgFile) { FILE *pPkgFile = fopen(pszPkgFile, "rb"); if (pPkgFile == NULL) { ErrSetErrorCode(ERR_FILE_OPEN); return ERR_FILE_OPEN; } char szSpoolLine[MAX_SPOOL_LINE] = ""; while (MscGetString(pPkgFile, szSpoolLine, sizeof(szSpoolLine) - 1) != NULL && strncmp(szSpoolLine, SPOOL_FILE_DATA_START, CStringSize(SPOOL_FILE_DATA_START)) != 0); if (strncmp(szSpoolLine, SPOOL_FILE_DATA_START, CStringSize(SPOOL_FILE_DATA_START)) != 0) { fclose(pPkgFile); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE); return ERR_INVALID_SPOOL_FILE; } /* Get the offset at which the message data begin and rewind the file */ SYS_OFF_T llMsgOffset = Sys_ftell(pPkgFile); rewind(pPkgFile); /* Read SMTP message info ( 1st row of the smtp-mail file ) */ char **ppszMsgInfo = NULL; if (MscGetString(pPkgFile, szSpoolLine, sizeof(szSpoolLine) - 1) == NULL || (ppszMsgInfo = StrTokenize(szSpoolLine, ";")) == NULL || StrStringsCount(ppszMsgInfo) < smsgiMax) { if (ppszMsgInfo != NULL) StrFreeStrings(ppszMsgInfo); fclose(pPkgFile); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE); return ERR_INVALID_SPOOL_FILE; } /* Read SMTP domain ( 2nd row of the smtp-mail file ) */ char szSMTPDomain[256] = ""; if (MscGetString(pPkgFile, szSMTPDomain, sizeof(szSMTPDomain) - 1) == NULL) { StrFreeStrings(ppszMsgInfo); fclose(pPkgFile); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE); return ERR_INVALID_SPOOL_FILE; } /* Read message ID ( 3th row of the smtp-mail file ) */ char szMessageID[128] = ""; if (MscGetString(pPkgFile, szMessageID, sizeof(szMessageID) - 1) == NULL) { StrFreeStrings(ppszMsgInfo); fclose(pPkgFile); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE); return ERR_INVALID_SPOOL_FILE; } /* Read "MAIL FROM:" ( 4th row of the smtp-mail file ) */ char szMailFrom[MAX_SPOOL_LINE] = ""; if (MscGetString(pPkgFile, szMailFrom, sizeof(szMailFrom) - 1) == NULL || StrINComp(szMailFrom, MAIL_FROM_STR) != 0) { StrFreeStrings(ppszMsgInfo); fclose(pPkgFile); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE); return ERR_INVALID_SPOOL_FILE; } /* Get the Received: header type to emit */ int iReceivedType = SvrGetConfigInt("ReceivedHdrType", RECEIVED_TYPE_STD, SMTPS.hSvrConfig); /* Read "RCPT TO:" ( 5th[,...] row(s) of the smtp-mail file ) */ while (MscGetString(pPkgFile, szSpoolLine, sizeof(szSpoolLine) - 1) != NULL && StrINComp(szSpoolLine, RCPT_TO_STR) == 0) { /* Cleanup the RCPT line from extra info */ SMTPTrimRcptLine(szSpoolLine); /* Get message handle */ QMSG_HANDLE hMessage = QueCreateMessage(hSpoolQueue); if (hMessage == INVALID_QMSG_HANDLE) { ErrorPush(); StrFreeStrings(ppszMsgInfo); fclose(pPkgFile); return ErrorPop(); } char szQueueFilePath[SYS_MAX_PATH] = ""; QueGetFilePath(hSpoolQueue, hMessage, szQueueFilePath); FILE *pSpoolFile = fopen(szQueueFilePath, "wb"); if (pSpoolFile == NULL) { QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); StrFreeStrings(ppszMsgInfo); fclose(pPkgFile); ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } /* Write info line */ USmtpWriteInfoLine(pSpoolFile, ppszMsgInfo[smsgiClientAddr], ppszMsgInfo[smsgiServerAddr], ppszMsgInfo[smsgiTime]); /* Write SMTP domain */ fprintf(pSpoolFile, "%s\r\n", szSMTPDomain); /* Write message ID */ fprintf(pSpoolFile, "%s\r\n", szMessageID); /* Write "MAIL FROM:" */ fprintf(pSpoolFile, "%s\r\n", szMailFrom); /* Write "RCPT TO:" */ fprintf(pSpoolFile, "%s\r\n", szSpoolLine); /* Write SPOOL_FILE_DATA_START */ fprintf(pSpoolFile, "%s\r\n", SPOOL_FILE_DATA_START); /* Write "X-AuthUser:" tag */ if (!IsEmptyString(SMTPS.szLogonUser) && !(SMTPS.ulFlags & SMTPF_NOEMIT_AUTH)) fprintf(pSpoolFile, "X-AuthUser: %s\r\n", SMTPS.szLogonUser); /* Write "Received:" tag */ SMTPAddReceived(iReceivedType, IsEmptyString(SMTPS.szLogonUser) ? NULL: SMTPS.szLogonUser, ppszMsgInfo, szMailFrom, szSpoolLine, szMessageID, pSpoolFile); /* Write mail data, saving and restoring the current file pointer */ SYS_OFF_T llCurrOffset = Sys_ftell(pPkgFile); if (MscCopyFile(pSpoolFile, pPkgFile, llMsgOffset, (SYS_OFF_T) -1) < 0) { ErrorPush(); fclose(pSpoolFile); QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); StrFreeStrings(ppszMsgInfo); fclose(pPkgFile); return ErrorPop(); } if (SysFileSync(pSpoolFile) < 0) { ErrorPush(); fclose(pSpoolFile); QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); StrFreeStrings(ppszMsgInfo); fclose(pPkgFile); return ErrorPop(); } if (fclose(pSpoolFile)) { QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); StrFreeStrings(ppszMsgInfo); fclose(pPkgFile); ErrSetErrorCode(ERR_FILE_WRITE, szQueueFilePath); return ERR_FILE_WRITE; } Sys_fseek(pPkgFile, llCurrOffset, SEEK_SET); /* Transfer file to the spool */ if (QueCommitMessage(hSpoolQueue, hMessage) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); StrFreeStrings(ppszMsgInfo); fclose(pPkgFile); return ErrorPop(); } } StrFreeStrings(ppszMsgInfo); fclose(pPkgFile); return 0; } static int SMTPHandleCmd_DATA(char const *pszCommand, BSOCK_HANDLE hBSock, SMTPSession &SMTPS) { char *pszError; if (SMTPS.iSMTPState != stateRcpt) { SMTPResetSession(SMTPS); SMTPSendError(hBSock, SMTPS, "503 Bad sequence of commands"); ErrSetErrorCode(ERR_SMTP_BAD_CMD_SEQUENCE); return ERR_SMTP_BAD_CMD_SEQUENCE; } /* Run the pre-DATA filter */ pszError = NULL; if (SMTPFilterMessage(SMTPS, SMTP_PRE_DATA_FILTER, pszError) < 0) { ErrorPush(); SMTPResetSession(SMTPS); if (pszError != NULL) { SMTPSendError(hBSock, SMTPS, "%s", pszError); SysFree(pszError); } else BSckSendString(hBSock, "554 Transaction failed", SMTPS.pSMTPCfg->iTimeout); return ErrorPop(); } /* Write data begin marker */ if (StrWriteCRLFString(SMTPS.pMsgFile, SPOOL_FILE_DATA_START) < 0) { ErrorPush(); SMTPResetSession(SMTPS); SMTPSendError(hBSock, SMTPS, "451 Requested action aborted: (%d) local error in processing", ErrorFetch()); return ErrorPop(); } BSckSendString(hBSock, "354 Start mail input; end with .", SMTPS.pSMTPCfg->iTimeout); /* Write data */ int iError = 0, iLineLength, iGotNL, iGotNLPrev = 1; unsigned long ulMessageSize = 0; unsigned long ulMaxMsgSize = SMTPS.ulMaxMsgSize; char const *pszSmtpError = NULL; char szBuffer[SMTP_MAX_LINE_SIZE + 4]; for (;;) { if (BSckGetString(hBSock, szBuffer, sizeof(szBuffer) - 3, SMTPS.pSMTPCfg->iTimeout, &iLineLength, &iGotNL) == NULL) { /* * At this point, either we got a timeout or the remote * peer dropped the connection. We can safely set the * exist status here because, in the first case the link * will be out of sync, and in the second case the link * is dead anyway. */ SMTPS.iSMTPState = stateExit; return ErrGetErrorCode(); } /* Check end of data condition */ if (iGotNL && iGotNLPrev && (strcmp(szBuffer, ".") == 0)) break; /* Correctly terminate the line */ if (iGotNL) memcpy(szBuffer + iLineLength, "\r\n", 3), iLineLength += 2; if (iError == 0) { /* Write data on disk */ if (!fwrite(szBuffer, iLineLength, 1, SMTPS.pMsgFile)) { ErrSetErrorCode(iError = ERR_FILE_WRITE, SMTPS.szMsgFile); } } ulMessageSize += (unsigned long) iLineLength; /* Check the message size */ if ((ulMaxMsgSize != 0) && (ulMaxMsgSize < ulMessageSize)) { pszSmtpError = "552 Message exceeds fixed maximum message size"; ErrSetErrorCode(iError = ERR_MESSAGE_SIZE); } if (SvrInShutdown()) { SMTPResetSession(SMTPS); ErrSetErrorCode(ERR_SERVER_SHUTDOWN); return ERR_SERVER_SHUTDOWN; } iGotNLPrev = iGotNL; } /* Check fclose() return value coz data might be buffered and fail to flush */ if (fclose(SMTPS.pMsgFile)) ErrSetErrorCode(iError = ERR_FILE_WRITE, SMTPS.szMsgFile); SMTPS.pMsgFile = NULL; if (iError == 0) { /* Run the post-DATA filter */ pszError = NULL; if (SMTPFilterMessage(SMTPS, SMTP_POST_DATA_FILTER, pszError) < 0) { ErrorPush(); SMTPResetSession(SMTPS); if (pszError != NULL) { SMTPSendError(hBSock, SMTPS, "%s", pszError); SysFree(pszError); } else BSckSendString(hBSock, "554 Transaction failed", SMTPS.pSMTPCfg->iTimeout); return ErrorPop(); } /* Transfer spool file */ if ((iError = SMTPSubmitPackedFile(SMTPS, SMTPS.szMsgFile)) < 0) { SMTPResetSession(SMTPS); SMTPSendError(hBSock, SMTPS, "451 Requested action aborted: (%d) local error in processing", ErrGetErrorCode()); } else { /* Log the message receive */ if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, SMTPS.pszFrom, SMTPS.pszRcpt, "RECV=OK", ulMessageSize); /* Send the ack only when everything is OK */ BSckVSendString(hBSock, SMTPS.pSMTPCfg->iTimeout, "250 OK <%s>", SMTPS.szMessageID); SMTPResetSession(SMTPS); } } else { SMTPResetSession(SMTPS); /* Notify the client the error condition */ if (pszSmtpError == NULL) SMTPSendError(hBSock, SMTPS, "451 Requested action aborted: (%d) local error in processing", ErrGetErrorCode()); else SMTPSendError(hBSock, SMTPS, "%s", pszSmtpError); } return iError; } static int SMTPHandleCmd_HELO(char const *pszCommand, BSOCK_HANDLE hBSock, SMTPSession &SMTPS) { if (SMTPS.iSMTPState != stateInit && SMTPS.iSMTPState != stateHelo) { SMTPResetSession(SMTPS); SMTPSendError(hBSock, SMTPS, "503 Bad sequence of commands"); ErrSetErrorCode(ERR_SMTP_BAD_CMD_SEQUENCE); return ERR_SMTP_BAD_CMD_SEQUENCE; } char **ppszTokens = StrTokenize(pszCommand, " "); if (ppszTokens == NULL || StrStringsCount(ppszTokens) != 2) { if (ppszTokens != NULL) StrFreeStrings(ppszTokens); SMTPSendError(hBSock, SMTPS, "501 Syntax error in parameters or arguments"); return -1; } StrSNCpy(SMTPS.szClientDomain, ppszTokens[1]); StrFreeStrings(ppszTokens); char *pszDomain = SvrGetConfigVar(SMTPS.hSvrConfig, "RootDomain"); if (pszDomain == NULL) { SMTPSendError(hBSock, SMTPS, "451 Requested action aborted: (%d) local error in processing", ERR_NO_ROOT_DOMAIN_VAR); ErrSetErrorCode(ERR_NO_ROOT_DOMAIN_VAR); return ERR_NO_ROOT_DOMAIN_VAR; } BSckVSendString(hBSock, SMTPS.pSMTPCfg->iTimeout, "250 %s", pszDomain); SysFree(pszDomain); SMTPS.iSMTPState = stateHelo; return 0; } static int SMTPAddAuth(char **ppszAuths, int iNumAuths, int *piAuthCnt, char const *pszAuth, char const *pszNoTLSAuths, int iLinkSSL) { if (*piAuthCnt < iNumAuths && (iLinkSSL || pszNoTLSAuths == NULL || StrLimIStr(pszNoTLSAuths, pszAuth, ",") != NULL)) { if ((ppszAuths[*piAuthCnt] = SysStrDup(pszAuth)) != NULL) (*piAuthCnt)++; } return *piAuthCnt; } static char *SMTPGetAuthFilePath(char *pszFilePath, int iMaxPath) { CfgGetRootPath(pszFilePath, iMaxPath); StrNCat(pszFilePath, SVR_SMTP_AUTH_FILE, iMaxPath); return pszFilePath; } static char *SMTPGetExtAuthFilePath(char *pszFilePath, int iMaxPath) { CfgGetRootPath(pszFilePath, iMaxPath); StrNCat(pszFilePath, SVR_SMTP_EXTAUTH_FILE, iMaxPath); return pszFilePath; } static int SMTPListAuths(DynString *pDS, SMTPSession &SMTPS, int iLinkSSL) { char szExtAuthFilePath[SYS_MAX_PATH] = ""; SMTPGetExtAuthFilePath(szExtAuthFilePath, sizeof(szExtAuthFilePath)); int iExtAuthCnt = 0, iNumAuths = 0; char *pszAuths[16]; FILE *pExtAuthFile = fopen(szExtAuthFilePath, "rt"); if (pExtAuthFile != NULL) { char szExtAuthLine[SVR_SMTP_EXTAUTH_LINE_MAX] = ""; while (MscGetConfigLine(szExtAuthLine, sizeof(szExtAuthLine) - 1, pExtAuthFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szExtAuthLine); if (ppszStrings == NULL) continue; if (StrStringsCount(ppszStrings) > 1) { SMTPAddAuth(pszAuths, CountOf(pszAuths), &iNumAuths, ppszStrings[0], SMTPS.pszNoTLSAuths, iLinkSSL); iExtAuthCnt++; } StrFreeStrings(ppszStrings); } fclose(pExtAuthFile); } /* * The logic is this: If the user has declared an external authentication * source, we need to let him declare which AUTH methods are supported by * his external source. For example, the CRAM-MD5 authentication method * requires the password to be known to the external authentication binary, * and many authentication APIs do not support the clear text password to * be exported. So in those case the user must not advertise CRAM-MD5. * If no externally handled authentications are declared, we advertise the * internally handled ones. */ if (iExtAuthCnt == 0) { SMTPAddAuth(pszAuths, CountOf(pszAuths), &iNumAuths, "LOGIN", SMTPS.pszNoTLSAuths, iLinkSSL); SMTPAddAuth(pszAuths, CountOf(pszAuths), &iNumAuths, "PLAIN", SMTPS.pszNoTLSAuths, iLinkSSL); SMTPAddAuth(pszAuths, CountOf(pszAuths), &iNumAuths, "CRAM-MD5", SMTPS.pszNoTLSAuths, iLinkSSL); } if (iNumAuths > 0) { int i; StrDynAdd(pDS, "250 AUTH"); for (i = 0; i < iNumAuths; i++) { StrDynAdd(pDS, " "); StrDynAdd(pDS, pszAuths[i]); SysFree(pszAuths[i]); } StrDynAdd(pDS, "\r\n"); } return 0; } static int SMTPSendMultilineResponse(BSOCK_HANDLE hBSock, int iTimeout, char const *pszResp) { int iError; char *pszDResp, *pszPtr, *pszPrev, *pszTmp; if ((pszDResp = SysStrDup(pszResp)) == NULL) return ErrGetErrorCode(); for (pszPrev = pszPtr = pszDResp; (pszTmp = strchr(pszPtr, '\n')) != NULL; pszPrev = pszPtr, pszPtr = pszTmp + 1) pszPtr[3] = '-'; pszPrev[3] = ' '; iError = BSckSendData(hBSock, pszDResp, strlen(pszDResp), iTimeout); SysFree(pszDResp); return iError; } static int SMTPHandleCmd_EHLO(char const *pszCommand, BSOCK_HANDLE hBSock, SMTPSession &SMTPS) { if (SMTPS.iSMTPState != stateInit && SMTPS.iSMTPState != stateHelo) { SMTPResetSession(SMTPS); SMTPSendError(hBSock, SMTPS, "503 Bad sequence of commands"); ErrSetErrorCode(ERR_SMTP_BAD_CMD_SEQUENCE); return ERR_SMTP_BAD_CMD_SEQUENCE; } char **ppszTokens = StrTokenize(pszCommand, " "); if (ppszTokens == NULL || StrStringsCount(ppszTokens) != 2) { if (ppszTokens != NULL) StrFreeStrings(ppszTokens); SMTPSendError(hBSock, SMTPS, "501 Syntax error in parameters or arguments"); return -1; } StrSNCpy(SMTPS.szClientDomain, ppszTokens[1]); StrFreeStrings(ppszTokens); /* Create response */ DynString DynS; if (StrDynInit(&DynS) < 0) { ErrorPush(); SMTPSendError(hBSock, SMTPS, "451 Requested action aborted: (%d) local error in processing", ErrorFetch()); return ErrorPop(); } /* Get root domain */ char *pszDomain = SvrGetConfigVar(SMTPS.hSvrConfig, "RootDomain"); if (pszDomain == NULL) { StrDynFree(&DynS); SMTPSendError(hBSock, SMTPS, "451 Requested action aborted: (%d) local error in processing", ERR_NO_ROOT_DOMAIN_VAR); ErrSetErrorCode(ERR_NO_ROOT_DOMAIN_VAR); return ERR_NO_ROOT_DOMAIN_VAR; } /* Build EHLO response file ( domain + auths ) */ StrDynPrint(&DynS, "250 %s\r\n", pszDomain); SysFree(pszDomain); /* Emit extended SMTP command and internal auths */ int iLinkSSL = strcmp(BSckBioName(hBSock), BSSL_BIO_NAME) == 0; StrDynAdd(&DynS, "250 VRFY\r\n" "250 ETRN\r\n" "250 8BITMIME\r\n" "250 PIPELINING\r\n"); /* Emit external authentication methods */ SMTPListAuths(&DynS, SMTPS, iLinkSSL); /* Emit maximum message size ( if set ) */ if (SMTPS.ulMaxMsgSize != 0) StrDynPrint(&DynS, "250 SIZE %lu\r\n", SMTPS.ulMaxMsgSize); else StrDynAdd(&DynS, "250 SIZE\r\n"); if (!iLinkSSL && SvrTestConfigFlag("EnableSMTP-TLS", true, SMTPS.hSvrConfig)) StrDynAdd(&DynS, "250 STARTTLS\r\n"); /* Send EHLO response file */ if (SMTPSendMultilineResponse(hBSock, SMTPS.pSMTPCfg->iTimeout, StrDynGet(&DynS)) < 0) { ErrorPush(); StrDynFree(&DynS); SMTPSendError(hBSock, SMTPS, "451 Requested action aborted: (%d) local error in processing", ErrorFetch()); return ErrorPop(); } StrDynFree(&DynS); SMTPS.iSMTPState = stateHelo; return 0; } static int SMTPSslEnvCB(void *pPrivate, int iID, void const *pData) { SMTPSession *pSMTPS = (SMTPSession *) pPrivate; /* * Empty for now ... */ return 0; } static int SMTPHandleCmd_STARTTLS(char const *pszCommand, BSOCK_HANDLE hBSock, SMTPSession &SMTPS) { if (strcmp(BSckBioName(hBSock), BSSL_BIO_NAME) == 0) { /* * Client is trying to run another STARTTLS after a successful one. * Not possible ... */ SMTPSendError(hBSock, SMTPS, "454 TLS not available due to temporary reason"); ErrSetErrorCode(ERR_SMTP_BAD_CMD_SEQUENCE); return ERR_SMTP_BAD_CMD_SEQUENCE; } if (!SvrTestConfigFlag("EnableSMTP-TLS", true, SMTPS.hSvrConfig)) { SMTPSendError(hBSock, SMTPS, "454 TLS not available"); ErrSetErrorCode(ERR_SSL_DISABLED); return ERR_SSL_DISABLED; } int iError; SslServerBind SSLB; if (CSslBindSetup(&SSLB) < 0) { ErrorPush(); SMTPSendError(hBSock, SMTPS, "454 TLS not available due to temporary reason"); return ErrorPop(); } BSckSendString(hBSock, "220 Ready to start TLS", SMTPS.pSMTPCfg->iTimeout); iError = BSslBindServer(hBSock, &SSLB, SMTPSslEnvCB, &SMTPS); CSslBindCleanup(&SSLB); if (iError < 0) { /* * At this point, we have no other option than terminating the connection. * We already sent to the client the ACK to start the SSL negotiation, * and quitting here would likely leave garbage data on the link. * Log and quit ... */ char szIP[128] = ""; ErrorPush(); if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, "", "", "SMTP=ESSL", 0); SysLogMessage(LOG_LEV_MESSAGE, "SMTP failed to STARTTLS (%d) [%s]\n", iError, SysInetNToA(SMTPS.PeerInfo, szIP, sizeof(szIP))); SMTPS.iSMTPState = stateExit; return ErrorPop(); } /* * STARTTLS requires the session to be fully reset (RFC3207). */ SMTPFullResetSession(SMTPS); return 0; } static char *SMTPExtAuthMacroLkupProc(void *pPrivate, char const *pszName, int iSize) { ExtAuthMacroSubstCtx *pASX = (ExtAuthMacroSubstCtx *) pPrivate; if (MemMatch(pszName, iSize, "USER", 4)) { return SysStrDup(pASX->pszUsername != NULL ? pASX->pszUsername: "-"); } else if (MemMatch(pszName, iSize, "PASS", 4)) { return SysStrDup(pASX->pszPassword != NULL ? pASX->pszPassword: "-"); } else if (MemMatch(pszName, iSize, "CHALL", 5)) { return SysStrDup(pASX->pszChallenge != NULL ? pASX->pszChallenge: "-"); } else if (MemMatch(pszName, iSize, "DGEST", 5)) { return SysStrDup(pASX->pszDigest != NULL ? pASX->pszDigest: "-"); } else if (MemMatch(pszName, iSize, "RFILE", 5)) { return SysStrDup(pASX->pszRespFile); } else if (MemMatch(pszName, iSize, "AUTH", 4)) { return SysStrDup(pASX->pszAuthType); } return SysStrDup(""); } static int SMTPExternalAuthSubstitute(char **ppszAuthTokens, char const *pszAuthType, char const *pszUsername, char const *pszPassword, char const *pszChallenge, char const *pszDigest, char const *pszRespFile) { ExtAuthMacroSubstCtx ASX; ZeroData(ASX); ASX.pszAuthType = pszAuthType; ASX.pszUsername = pszUsername; ASX.pszPassword = pszPassword; ASX.pszChallenge = pszChallenge; ASX.pszDigest = pszDigest; ASX.pszRespFile = pszRespFile; return MscReplaceTokens(ppszAuthTokens, SMTPExtAuthMacroLkupProc, &ASX); } static int SMTPAssignExtPerms(void *pPrivate, char const *pszName, char const *pszVal) { SMTPSession *pSMTPS = (SMTPSession *) pPrivate; if (strcmp(pszName, "Perms") == 0) { SMTPApplyPerms(*pSMTPS, pszVal); } return 0; } static int SMTPExternalAuthenticate(BSOCK_HANDLE hBSock, SMTPSession &SMTPS, char **ppszAuthTokens, char const *pszAuthType, char const *pszUsername, char const *pszPassword, char const *pszChallenge, char const *pszDigest) { char szRespFile[SYS_MAX_PATH] = ""; MscSafeGetTmpFile(szRespFile, sizeof(szRespFile)); /* Do macro substitution */ SMTPExternalAuthSubstitute(ppszAuthTokens, pszAuthType, pszUsername, pszPassword, pszChallenge, pszDigest, szRespFile); /* Call external program to compute the response */ int iExitCode = -1; if (SysExec(ppszAuthTokens[1], &ppszAuthTokens[1], SVR_SMTP_EXTAUTH_TIMEOUT, SYS_PRIORITY_NORMAL, &iExitCode) < 0) { ErrorPush(); SysRemove(szRespFile); SMTPSendError(hBSock, SMTPS, "451 Requested action aborted: (%d) local error in processing", ErrorFetch()); return ErrorPop(); } if (iExitCode != SVR_SMTP_EXTAUTH_SUCCESS) { SMTPSendError(hBSock, SMTPS, "503 Authentication failed"); ErrSetErrorCode(ERR_BAD_EXTRNPRG_EXITCODE); return ERR_BAD_EXTRNPRG_EXITCODE; } /* * Load externally supplied credentials ... */ unsigned long ulFileSize; void *pRData = MscLoadFile(szRespFile, &ulFileSize); if (pRData != NULL) { SysRemove(szRespFile); /* * The MscLoadFile() function zero-terminate the loaded content, * so we can safely call MscParseOptions() since the "pRData" will * be a C-string. */ MscParseOptions((char *) pRData, SMTPAssignExtPerms, &SMTPS); SysFree(pRData); } return 0; } static char **SMTPGetAuthExternal(SMTPSession &SMTPS, char const *pszAuthType) { char szExtAuthFilePath[SYS_MAX_PATH] = ""; SMTPGetExtAuthFilePath(szExtAuthFilePath, sizeof(szExtAuthFilePath)); FILE *pExtAuthFile = fopen(szExtAuthFilePath, "rt"); if (pExtAuthFile == NULL) return NULL; char szExtAuthLine[SVR_SMTP_EXTAUTH_LINE_MAX] = ""; while (MscGetConfigLine(szExtAuthLine, sizeof(szExtAuthLine) - 1, pExtAuthFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szExtAuthLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount > 1 && stricmp(ppszStrings[0], pszAuthType) == 0) { fclose(pExtAuthFile); return ppszStrings; } StrFreeStrings(ppszStrings); } fclose(pExtAuthFile); return NULL; } static int SMTPTryExtAuth(BSOCK_HANDLE hBSock, SMTPSession &SMTPS, char const *pszAuthType, char const *pszUsername, char const *pszPassword, char const *pszChallenge, char const *pszDigest) { char **ppszAuthTokens; if ((ppszAuthTokens = SMTPGetAuthExternal(SMTPS, pszAuthType)) == NULL) return 0; int iAuthResult = SMTPExternalAuthenticate(hBSock, SMTPS, ppszAuthTokens, pszAuthType, pszUsername, pszPassword, pszChallenge, pszDigest); StrFreeStrings(ppszAuthTokens); return iAuthResult < 0 ? iAuthResult: 1; } static int SMTPTryApplyLocalAuth(SMTPSession &SMTPS, char const *pszUsername, char const *pszPassword) { /* First try to lookup mailusers.tab */ char szAccountUser[MAX_ADDR_NAME] = ""; char szAccountDomain[MAX_HOST_NAME] = ""; if (StrSplitString(pszUsername, POP3_USER_SPLITTERS, szAccountUser, sizeof(szAccountUser), szAccountDomain, sizeof(szAccountDomain)) < 0) return ErrGetErrorCode(); UserInfo *pUI = UsrGetUserByName(szAccountDomain, szAccountUser); if (pUI != NULL) { if (strcmp(pUI->pszPassword, pszPassword) == 0) { /* Apply user configuration */ if (SMTPApplyUserConfig(SMTPS, pUI) < 0) { ErrorPush(); UsrFreeUserInfo(pUI); return ErrorPop(); } UsrFreeUserInfo(pUI); return 0; } UsrFreeUserInfo(pUI); } ErrSetErrorCode(ERR_SMTP_AUTH_FAILED); return ERR_SMTP_AUTH_FAILED; } static int SMTPTryApplyUsrPwdAuth(SMTPSession &SMTPS, char const *pszUsername, char const *pszPassword) { char szAuthFilePath[SYS_MAX_PATH] = ""; SMTPGetAuthFilePath(szAuthFilePath, sizeof(szAuthFilePath)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szAuthFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pAuthFile = fopen(szAuthFilePath, "rt"); if (pAuthFile == NULL) { RLckUnlockSH(hResLock); ErrSetErrorCode(ERR_FILE_OPEN, szAuthFilePath); return ERR_FILE_OPEN; } char szAuthLine[SVR_SMTPAUTH_LINE_MAX] = ""; while (MscGetConfigLine(szAuthLine, sizeof(szAuthLine) - 1, pAuthFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szAuthLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= smtpaMax && strcmp(ppszStrings[smtpaUsername], pszUsername) == 0 && strcmp(ppszStrings[smtpaPassword], pszPassword) == 0) { /* Apply user perms to SMTP config */ SMTPApplyPerms(SMTPS, ppszStrings[smtpaPerms]); StrFreeStrings(ppszStrings); fclose(pAuthFile); RLckUnlockSH(hResLock); return 0; } StrFreeStrings(ppszStrings); } fclose(pAuthFile); RLckUnlockSH(hResLock); ErrSetErrorCode(ERR_SMTP_AUTH_FAILED); return ERR_SMTP_AUTH_FAILED; } static int SMTPDoAuthPlain(BSOCK_HANDLE hBSock, SMTPSession &SMTPS, char const *pszAuthParam) { if (pszAuthParam == NULL || IsEmptyString(pszAuthParam)) { SMTPSendError(hBSock, SMTPS, "501 Syntax error in parameters or arguments"); ErrSetErrorCode(ERR_BAD_SMTP_CMD_SYNTAX); return ERR_BAD_SMTP_CMD_SYNTAX; } int iDec64Length; char szClientAuth[PLAIN_AUTH_PARAM_SIZE] = ""; ZeroData(szClientAuth); iDec64Length = sizeof(szClientAuth); if (Base64Decode(pszAuthParam, strlen(pszAuthParam), szClientAuth, &iDec64Length) != 0) { SMTPSendError(hBSock, SMTPS, "501 Syntax error in parameters or arguments"); ErrSetErrorCode(ERR_BAD_SMTP_CMD_SYNTAX); return ERR_BAD_SMTP_CMD_SYNTAX; } /* Extract plain auth params (unused + 0 + username + 0 + password) */ int iError; char *pszUsername = szClientAuth + strlen(szClientAuth) + 1; char *pszPassword = pszUsername + strlen(pszUsername) + 1; /* Validate client response */ if ((iError = SMTPTryExtAuth(hBSock, SMTPS, "PLAIN", pszUsername, pszPassword, NULL, NULL)) < 0) return ErrGetErrorCode(); else if (iError == 0) { if (SMTPTryApplyLocalAuth(SMTPS, pszUsername, pszPassword) < 0 && SMTPTryApplyUsrPwdAuth(SMTPS, pszUsername, pszPassword) < 0) { ErrorPush(); SMTPSendError(hBSock, SMTPS, "503 Authentication failed"); return ErrorPop(); } } /* Set the logon user */ StrSNCpy(SMTPS.szLogonUser, pszUsername); SMTPS.ulFlags |= SMTPF_AUTHENTICATED; SMTPS.iSMTPState = stateAuthenticated; BSckSendString(hBSock, "235 Authentication successful", SMTPS.pSMTPCfg->iTimeout); return 0; } static int SMTPDoAuthLogin(BSOCK_HANDLE hBSock, SMTPSession &SMTPS, char const *pszAuthParam) { /* Emit encoded64 username request */ int iEnc64Length; char szUsername[512] = ""; if (pszAuthParam == NULL || IsEmptyString(pszAuthParam)) { iEnc64Length = sizeof(szUsername) - 1; Base64Encode(LOGIN_AUTH_USERNAME, strlen(LOGIN_AUTH_USERNAME), szUsername, &iEnc64Length); if (BSckVSendString(hBSock, SMTPS.pSMTPCfg->iTimeout, "334 %s", szUsername) < 0 || BSckGetString(hBSock, szUsername, sizeof(szUsername) - 1, SMTPS.pSMTPCfg->iTimeout) == NULL) return ErrGetErrorCode(); pszAuthParam = szUsername; } /* Emit encoded64 password request */ char szPassword[512] = ""; iEnc64Length = sizeof(szPassword) - 1; Base64Encode(LOGIN_AUTH_PASSWORD, strlen(LOGIN_AUTH_PASSWORD), szPassword, &iEnc64Length); if (BSckVSendString(hBSock, SMTPS.pSMTPCfg->iTimeout, "334 %s", szPassword) < 0 || BSckGetString(hBSock, szPassword, sizeof(szPassword) - 1, SMTPS.pSMTPCfg->iTimeout) == NULL) return ErrGetErrorCode(); /* Decode (base64) username */ int iDec64Length; char szDecodeBuffer[512] = ""; iDec64Length = sizeof(szDecodeBuffer); if (Base64Decode(pszAuthParam, strlen(pszAuthParam), szDecodeBuffer, &iDec64Length) != 0) { SMTPSendError(hBSock, SMTPS, "501 Syntax error in parameters or arguments"); ErrSetErrorCode(ERR_BAD_SMTP_CMD_SYNTAX); return ERR_BAD_SMTP_CMD_SYNTAX; } StrSNCpy(szUsername, szDecodeBuffer); /* Decode (base64) password */ iDec64Length = sizeof(szDecodeBuffer); if (Base64Decode(szPassword, strlen(szPassword), szDecodeBuffer, &iDec64Length) != 0) { SMTPSendError(hBSock, SMTPS, "501 Syntax error in parameters or arguments"); ErrSetErrorCode(ERR_BAD_SMTP_CMD_SYNTAX); return ERR_BAD_SMTP_CMD_SYNTAX; } StrSNCpy(szPassword, szDecodeBuffer); /* Validate client response */ int iError; if ((iError = SMTPTryExtAuth(hBSock, SMTPS, "LOGIN", szUsername, szPassword, NULL, NULL)) < 0) return ErrGetErrorCode(); else if (iError == 0) { if (SMTPTryApplyLocalAuth(SMTPS, szUsername, szPassword) < 0 && SMTPTryApplyUsrPwdAuth(SMTPS, szUsername, szPassword) < 0) { ErrorPush(); SMTPSendError(hBSock, SMTPS, "503 Authentication failed"); return ErrorPop(); } } /* Set the logon user */ StrSNCpy(SMTPS.szLogonUser, szUsername); SMTPS.ulFlags |= SMTPF_AUTHENTICATED; SMTPS.iSMTPState = stateAuthenticated; BSckSendString(hBSock, "235 Authentication successful", SMTPS.pSMTPCfg->iTimeout); return 0; } static int SMTPTryApplyLocalCMD5Auth(SMTPSession &SMTPS, char const *pszChallenge, char const *pszUsername, char const *pszDigest) { /* First try to lookup mailusers.tab */ char szAccountUser[MAX_ADDR_NAME] = ""; char szAccountDomain[MAX_HOST_NAME] = ""; if (StrSplitString(pszUsername, POP3_USER_SPLITTERS, szAccountUser, sizeof(szAccountUser), szAccountDomain, sizeof(szAccountDomain)) < 0) return ErrGetErrorCode(); UserInfo *pUI = UsrGetUserByName(szAccountDomain, szAccountUser); if (pUI != NULL) { /* Compute MD5 response ( secret , challenge , digest ) */ char szCurrDigest[512] = ""; if (MscCramMD5(pUI->pszPassword, pszChallenge, szCurrDigest) < 0) { UsrFreeUserInfo(pUI); return ErrGetErrorCode(); } if (stricmp(szCurrDigest, pszDigest) == 0) { /* Apply user configuration */ if (SMTPApplyUserConfig(SMTPS, pUI) < 0) { ErrorPush(); UsrFreeUserInfo(pUI); return ErrorPop(); } UsrFreeUserInfo(pUI); return 0; } UsrFreeUserInfo(pUI); } ErrSetErrorCode(ERR_SMTP_AUTH_FAILED); return ERR_SMTP_AUTH_FAILED; } static int SMTPTryApplyCMD5Auth(SMTPSession &SMTPS, char const *pszChallenge, char const *pszUsername, char const *pszDigest) { char szAuthFilePath[SYS_MAX_PATH] = ""; SMTPGetAuthFilePath(szAuthFilePath, sizeof(szAuthFilePath)); FILE *pAuthFile = fopen(szAuthFilePath, "rt"); if (pAuthFile == NULL) { ErrSetErrorCode(ERR_FILE_OPEN, szAuthFilePath); return ERR_FILE_OPEN; } char szAuthLine[SVR_SMTPAUTH_LINE_MAX] = ""; while (MscGetConfigLine(szAuthLine, sizeof(szAuthLine) - 1, pAuthFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szAuthLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= smtpaMax && strcmp(ppszStrings[smtpaUsername], pszUsername) == 0) { char szCurrDigest[512] = ""; /* Compute MD5 response ( secret , challenge , digest ) */ if (MscCramMD5(ppszStrings[smtpaPassword], pszChallenge, szCurrDigest) < 0) { StrFreeStrings(ppszStrings); fclose(pAuthFile); return ErrGetErrorCode(); } if (stricmp(szCurrDigest, pszDigest) == 0) { /* Apply user perms to SMTP config */ SMTPApplyPerms(SMTPS, ppszStrings[smtpaPerms]); StrFreeStrings(ppszStrings); fclose(pAuthFile); return 0; } } StrFreeStrings(ppszStrings); } fclose(pAuthFile); ErrSetErrorCode(ERR_SMTP_AUTH_FAILED); return ERR_SMTP_AUTH_FAILED; } static int SMTPDoAuthCramMD5(BSOCK_HANDLE hBSock, SMTPSession &SMTPS, char const *pszAuthParam) { /* Emit encoded64 challenge and get client response */ int iEnc64Length; char szChallenge[512] = ""; iEnc64Length = sizeof(szChallenge) - 1; Base64Encode(SMTPS.szTimeStamp, strlen(SMTPS.szTimeStamp), szChallenge, &iEnc64Length); if (BSckVSendString(hBSock, SMTPS.pSMTPCfg->iTimeout, "334 %s", szChallenge) < 0 || BSckGetString(hBSock, szChallenge, sizeof(szChallenge) - 1, SMTPS.pSMTPCfg->iTimeout) == NULL) return ErrGetErrorCode(); /* Decode ( base64 ) client response */ int iDec64Length; char szClientResp[512] = ""; iDec64Length = sizeof(szClientResp); if (Base64Decode(szChallenge, strlen(szChallenge), szClientResp, &iDec64Length) != 0) { SMTPSendError(hBSock, SMTPS, "501 Syntax error in parameters or arguments"); ErrSetErrorCode(ERR_BAD_SMTP_CMD_SYNTAX); return ERR_BAD_SMTP_CMD_SYNTAX; } /* Extract the username and client digest */ char *pszUsername = szClientResp; char *pszDigest = strchr(szClientResp, ' '); if (pszDigest == NULL) { SMTPSendError(hBSock, SMTPS, "501 Syntax error in parameters or arguments"); ErrSetErrorCode(ERR_BAD_SMTP_CMD_SYNTAX); return ERR_BAD_SMTP_CMD_SYNTAX; } *pszDigest++ = '\0'; /* Validate client response */ int iError; if ((iError = SMTPTryExtAuth(hBSock, SMTPS, "CRAM-MD5", pszUsername, NULL, SMTPS.szTimeStamp, pszDigest)) < 0) return ErrGetErrorCode(); else if (iError == 0) { if (SMTPTryApplyLocalCMD5Auth(SMTPS, SMTPS.szTimeStamp, pszUsername, pszDigest) < 0 && SMTPTryApplyCMD5Auth(SMTPS, SMTPS.szTimeStamp, pszUsername, pszDigest) < 0) { ErrorPush(); SMTPSendError(hBSock, SMTPS, "503 Authentication failed"); return ErrorPop(); } } /* Set the logon user */ StrSNCpy(SMTPS.szLogonUser, pszUsername); SMTPS.ulFlags |= SMTPF_AUTHENTICATED; SMTPS.iSMTPState = stateAuthenticated; BSckSendString(hBSock, "235 Authentication successful", SMTPS.pSMTPCfg->iTimeout); return 0; } static int SMTPHandleCmd_AUTH(char const *pszCommand, BSOCK_HANDLE hBSock, SMTPSession &SMTPS) { if (SMTPS.iSMTPState != stateHelo) { SMTPResetSession(SMTPS); SMTPSendError(hBSock, SMTPS, "503 Bad sequence of commands"); ErrSetErrorCode(ERR_SMTP_BAD_CMD_SEQUENCE); return ERR_SMTP_BAD_CMD_SEQUENCE; } int iTokensCount; char **ppszTokens = StrTokenize(pszCommand, " "); if (ppszTokens == NULL || (iTokensCount = StrStringsCount(ppszTokens)) < 2) { if (ppszTokens != NULL) StrFreeStrings(ppszTokens); SMTPSendError(hBSock, SMTPS, "501 Syntax error in parameters or arguments"); return -1; } /* Decode AUTH command params */ char szAuthType[128] = ""; char szAuthParam[PLAIN_AUTH_PARAM_SIZE] = ""; StrSNCpy(szAuthType, ppszTokens[1]); if (iTokensCount > 2) StrSNCpy(szAuthParam, ppszTokens[2]); StrFreeStrings(ppszTokens); /* * Check if the client sent an AUTH type that is not allowed in non-TLS * mode. */ if (SMTPS.pszNoTLSAuths != NULL && strcmp(BSckBioName(hBSock), BSSL_BIO_NAME) != 0 && StrLimIStr(SMTPS.pszNoTLSAuths, szAuthType, ",") == NULL) { SMTPSendError(hBSock, SMTPS, "504 Unrecognized authentication type"); ErrSetErrorCode(ERR_UNKNOWN_SMTP_AUTH); return ERR_UNKNOWN_SMTP_AUTH; } /* Handle authentication methods */ if (stricmp(szAuthType, "PLAIN") == 0) { if (SMTPDoAuthPlain(hBSock, SMTPS, szAuthParam) < 0) { ErrorPush(); if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, "", "", "AUTH=EFAIL:TYPE=PLAIN", 0); return ErrorPop(); } } else if (stricmp(szAuthType, "LOGIN") == 0) { if (SMTPDoAuthLogin(hBSock, SMTPS, szAuthParam) < 0) { ErrorPush(); if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, "", "", "AUTH=EFAIL:TYPE=LOGIN", 0); return ErrorPop(); } } else if (stricmp(szAuthType, "CRAM-MD5") == 0) { if (SMTPDoAuthCramMD5(hBSock, SMTPS, szAuthParam) < 0) { ErrorPush(); if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, "", "", "AUTH=EFAIL:TYPE=CRAM-MD5", 0); return ErrorPop(); } } else { SMTPSendError(hBSock, SMTPS, "504 Unrecognized authentication type"); ErrSetErrorCode(ERR_UNKNOWN_SMTP_AUTH); return ERR_UNKNOWN_SMTP_AUTH; } return 0; } static int SMTPHandleCmd_RSET(char const *pszCommand, BSOCK_HANDLE hBSock, SMTPSession &SMTPS) { SMTPResetSession(SMTPS); BSckSendString(hBSock, "250 OK", SMTPS.pSMTPCfg->iTimeout); return 0; } static int SMTPHandleCmd_NOOP(char const *pszCommand, BSOCK_HANDLE hBSock, SMTPSession &SMTPS) { BSckSendString(hBSock, "250 OK", SMTPS.pSMTPCfg->iTimeout); return 0; } static int SMTPHandleCmd_HELP(char const *pszCommand, BSOCK_HANDLE hBSock, SMTPSession &SMTPS) { char const *pszSTLS = ""; if (strcmp(BSckBioName(hBSock), BSSL_BIO_NAME) != 0 && SvrTestConfigFlag("EnableSMTP-TLS", true, SMTPS.hSvrConfig)) pszSTLS = " STARTTLS"; BSckVSendString(hBSock, SMTPS.pSMTPCfg->iTimeout, "214-HELO EHLO MAIL RCPT DATA AUTH%s\r\n" "214-RSET VRFY ETRN NOOP HELP QUIT\r\n" "214 For more information please visit : %s", pszSTLS, APP_URL); return 0; } static int SMTPHandleCmd_QUIT(char const *pszCommand, BSOCK_HANDLE hBSock, SMTPSession &SMTPS) { SMTPS.iSMTPState = stateExit; BSckVSendString(hBSock, SMTPS.pSMTPCfg->iTimeout, "221 %s service closing transmission channel", SMTP_SERVER_NAME); return 0; } static int SMTPHandleCmd_VRFY(char const *pszCommand, BSOCK_HANDLE hBSock, SMTPSession &SMTPS) { /* Check if VRFY is enabled */ if ((SMTPS.ulFlags & SMTPF_VRFY_ENABLED) == 0 && !SvrTestConfigFlag("AllowSmtpVRFY", false, SMTPS.hSvrConfig)) { if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, "", "", "VRFY=EACCESS", 0); SMTPSendError(hBSock, SMTPS, "252 Argument not checked"); return -1; } char **ppszTokens = StrTokenize(pszCommand, " "); if ((ppszTokens == NULL) || (StrStringsCount(ppszTokens) != 2)) { if (ppszTokens != NULL) StrFreeStrings(ppszTokens); SMTPSendError(hBSock, SMTPS, "501 Syntax error in parameters or arguments"); return -1; } char szVrfyUser[MAX_ADDR_NAME] = ""; char szVrfyDomain[MAX_ADDR_NAME] = ""; if (USmtpSplitEmailAddr(ppszTokens[1], szVrfyUser, szVrfyDomain) < 0) { ErrorPush(); StrFreeStrings(ppszTokens); SMTPSendError(hBSock, SMTPS, "501 Syntax error in parameters or arguments"); return ErrorPop(); } StrFreeStrings(ppszTokens); UserInfo *pUI = UsrGetUserByNameOrAlias(szVrfyDomain, szVrfyUser); if (pUI != NULL) { char *pszRealName = UsrGetUserInfoVar(pUI, "RealName", "Unknown"); BSckVSendString(hBSock, SMTPS.pSMTPCfg->iTimeout, "250 %s <%s@%s>", pszRealName, pUI->pszName, pUI->pszDomain); SysFree(pszRealName); UsrFreeUserInfo(pUI); } else { if (USmlIsCmdAliasAccount(szVrfyDomain, szVrfyUser) < 0) { SMTPSendError(hBSock, SMTPS, "550 String does not match anything"); ErrSetErrorCode(ERR_USER_NOT_LOCAL); return ERR_USER_NOT_LOCAL; } BSckVSendString(hBSock, SMTPS.pSMTPCfg->iTimeout, "250 Local account <%s@%s>", szVrfyUser, szVrfyDomain); } return 0; } static int SMTPHandleCmd_ETRN(char const *pszCommand, BSOCK_HANDLE hBSock, SMTPSession &SMTPS) { /* Check if ETRN is enabled */ if ((SMTPS.ulFlags & SMTPF_ETRN_ENABLED) == 0 && !SvrTestConfigFlag("AllowSmtpETRN", false, SMTPS.hSvrConfig)) { if (SMTPLogEnabled(SMTPS.pThCfg->hThShb, SMTPS.pSMTPCfg)) SMTPLogSession(SMTPS, "", "", "ETRN=EACCESS", 0); SMTPSendError(hBSock, SMTPS, "501 Command not accepted"); return -1; } char **ppszTokens = StrTokenize(pszCommand, " "); if (ppszTokens == NULL || StrStringsCount(ppszTokens) != 2) { if (ppszTokens != NULL) StrFreeStrings(ppszTokens); SMTPSendError(hBSock, SMTPS, "501 Syntax error in parameters or arguments"); return -1; } /* Do a matched flush of the rsnd arena */ if (QueFlushRsndArena(hSpoolQueue, ppszTokens[1]) < 0) { ErrorPush(); StrFreeStrings(ppszTokens); SMTPSendError(hBSock, SMTPS, "451 Requested action aborted: (%d) local error in processing", ErrorFetch()); return ErrorPop(); } BSckVSendString(hBSock, SMTPS.pSMTPCfg->iTimeout, "250 Queueing for '%s' has been started", ppszTokens[1]); StrFreeStrings(ppszTokens); return 0; } static int SMTPHandleCommand(char const *pszCommand, BSOCK_HANDLE hBSock, SMTPSession &SMTPS) { /* Delay protection against massive spammers */ if (SMTPS.iCmdDelay > 0) SysSleep(SMTPS.iCmdDelay); /* Command parsing and processing */ int iError = -1; if (StrINComp(pszCommand, MAIL_FROM_STR) == 0) iError = SMTPHandleCmd_MAIL(pszCommand, hBSock, SMTPS); else if (StrINComp(pszCommand, RCPT_TO_STR) == 0) iError = SMTPHandleCmd_RCPT(pszCommand, hBSock, SMTPS); else if (StrCmdMatch(pszCommand, "DATA")) iError = SMTPHandleCmd_DATA(pszCommand, hBSock, SMTPS); else if (StrCmdMatch(pszCommand, "HELO")) iError = SMTPHandleCmd_HELO(pszCommand, hBSock, SMTPS); else if (StrCmdMatch(pszCommand, "EHLO")) iError = SMTPHandleCmd_EHLO(pszCommand, hBSock, SMTPS); else if (StrCmdMatch(pszCommand, "STARTTLS")) iError = SMTPHandleCmd_STARTTLS(pszCommand, hBSock, SMTPS); else if (StrCmdMatch(pszCommand, "AUTH")) iError = SMTPHandleCmd_AUTH(pszCommand, hBSock, SMTPS); else if (StrCmdMatch(pszCommand, "RSET")) iError = SMTPHandleCmd_RSET(pszCommand, hBSock, SMTPS); else if (StrCmdMatch(pszCommand, "VRFY")) iError = SMTPHandleCmd_VRFY(pszCommand, hBSock, SMTPS); else if (StrCmdMatch(pszCommand, "ETRN")) iError = SMTPHandleCmd_ETRN(pszCommand, hBSock, SMTPS); else if (StrCmdMatch(pszCommand, "NOOP")) iError = SMTPHandleCmd_NOOP(pszCommand, hBSock, SMTPS); else if (StrCmdMatch(pszCommand, "HELP")) iError = SMTPHandleCmd_HELP(pszCommand, hBSock, SMTPS); else if (StrCmdMatch(pszCommand, "QUIT")) iError = SMTPHandleCmd_QUIT(pszCommand, hBSock, SMTPS); else SMTPSendError(hBSock, SMTPS, "500 Syntax error, command unrecognized"); return iError; } static int SMTPHandleSession(ThreadConfig const *pThCfg, BSOCK_HANDLE hBSock) { /* Session structure declaration and init */ char *pszSMTPError = NULL; SMTPSession SMTPS; if (SMTPInitSession(pThCfg, hBSock, SMTPS, pszSMTPError) < 0) { ErrorPush(); if (pszSMTPError != NULL) { BSckSendString(hBSock, pszSMTPError, STD_SMTP_TIMEOUT); SysFree(pszSMTPError); } else BSckVSendString(hBSock, STD_SMTP_TIMEOUT, "421 %s service not available (%d), closing transmission channel", SMTP_SERVER_NAME, ErrorFetch()); return ErrorPop(); } char szIP[128] = "???.???.???.???"; SysLogMessage(LOG_LEV_MESSAGE, "SMTP client connection from [%s]\n", SysInetNToA(SMTPS.PeerInfo, szIP, sizeof(szIP))); /* Send welcome message */ char szTime[256] = ""; MscGetTimeStr(szTime, sizeof(szTime) - 1); if (BSckVSendString(hBSock, SMTPS.pSMTPCfg->iTimeout, "220 %s %s %s service ready; %s", SMTPS.szSvrDomain, SMTPS.szTimeStamp, SMTP_SERVER_NAME, szTime) < 0) { ErrorPush(); SMTPClearSession(SMTPS); return ErrorPop(); } /* Command loop */ char szCommand[1024] = ""; while (!SvrInShutdown() && SMTPS.iSMTPState != stateExit && BSckGetString(hBSock, szCommand, sizeof(szCommand) - 1, SMTPS.pSMTPCfg->iSessionTimeout) != NULL && MscCmdStringCheck(szCommand) == 0) { if (pThCfg->ulFlags & THCF_SHUTDOWN) break; /* Handle command */ SMTPHandleCommand(szCommand, hBSock, SMTPS); } SysLogMessage(LOG_LEV_MESSAGE, "SMTP client exit [%s]\n", SysInetNToA(SMTPS.PeerInfo, szIP, sizeof(szIP))); SMTPClearSession(SMTPS); return 0; } unsigned int SMTPClientThread(void *pThreadData) { ThreadCreateCtx *pThCtx = (ThreadCreateCtx *) pThreadData; /* Link socket to the bufferer */ BSOCK_HANDLE hBSock = BSckAttach(pThCtx->SockFD); if (hBSock == INVALID_BSOCK_HANDLE) { ErrorPush(); SysCloseSocket(pThCtx->SockFD); SysFree(pThCtx); return ErrorPop(); } /* * Do we need to switch to TLS? */ if (pThCtx->pThCfg->ulFlags & THCF_USE_SSL) { int iError; SslServerBind SSLB; SslBindEnv SslE; if (CSslBindSetup(&SSLB) < 0) { ErrorPush(); BSckDetach(hBSock, 1); SysFree(pThCtx); return ErrorPop(); } ZeroData(SslE); iError = BSslBindServer(hBSock, &SSLB, MscSslEnvCB, &SslE); CSslBindCleanup(&SSLB); if (iError < 0) { ErrorPush(); BSckDetach(hBSock, 1); SysFree(pThCtx); return ErrorPop(); } /* * We may want to add verify code here ... */ SysFree(SslE.pszIssuer); SysFree(SslE.pszSubject); } /* Increase threads count */ if (SMTPThreadCountAdd(+1, pThCtx->pThCfg->hThShb) < 0) { ErrorPush(); SysLogMessage(LOG_LEV_ERROR, "%s (SMTP thread count)\n", ErrGetErrorString(ErrorFetch())); BSckVSendString(hBSock, STD_SMTP_TIMEOUT, "421 %s - %s", SMTP_SERVER_NAME, ErrGetErrorString(ErrorFetch())); BSckDetach(hBSock, 1); SysFree(pThCtx); return ErrorPop(); } /* Handle client session */ SMTPHandleSession(pThCtx->pThCfg, hBSock); /* Decrease threads count */ SMTPThreadCountAdd(-1, pThCtx->pThCfg->hThShb); /* Unlink socket from the bufferer and close it */ BSckDetach(hBSock, 1); SysFree(pThCtx); return 0; } xmail-1.27/SysTypesUnix.h0000644000175000017500000000650311341640430014647 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SYSTYPESUNIX_H #define _SYSTYPESUNIX_H #ifdef MACH_BIG_ENDIAN_WORDS #define BIG_ENDIAN_CPU #endif #ifdef MACH_BIG_ENDIAN_BITFIELD #define BIG_ENDIAN_BITFIELD #endif #ifndef CHAR_BIT #define CHAR_BIT 8 #endif #define SYS_INFINITE_TIMEOUT (-1) #define SYS_DEFAULT_MAXCOUNT (INT_MAX - 1) #define SYS_EOL "\n" #define SYS_SLASH_CHAR '/' #define SYS_SLASH_STR "/" #define SYS_BASE_FS_STR "" #define SYS_MAX_PATH 256 #define SYS_LLU_FMT "%llu" #define SYS_LLX_FMT "%llX" #define SYS_OFFT_FMT "%lld" #define SYS_INVALID_HANDLE ((SYS_HANDLE) 0) #define SYS_INVALID_SOCKET ((SYS_SOCKET) (-1)) #define SYS_INVALID_SEMAPHORE ((SYS_SEMAPHORE) 0) #define SYS_INVALID_MUTEX ((SYS_MUTEX) 0) #define SYS_INVALID_EVENT ((SYS_EVENT) 0) #define SYS_INVALID_PEVENT ((SYS_PEVENT) 0) #define SYS_INVALID_THREAD ((SYS_THREAD) 0) #define SYS_INVALID_MMAP ((SYS_MMAP) 0) #define SYS_THREAD_ONCE_INIT PTHREAD_ONCE_INIT #define SysSNPrintf snprintf #define stricmp strcasecmp #define strnicmp strncasecmp #ifdef HAS_NO_OFFT_FSTREAM #define Sys_fseek(f, o, w) fseek(f, (long) (o), w) #define Sys_ftell(f) ftell(f) #else #define Sys_fseek(f, o, w) fseeko(f, (off_t) (o), w) #define Sys_ftell(f) ftello(f) #endif #define Sys_atoi64(s) atoll(s) #define SYS_fd_set fd_set #define SYS_FD_ZERO FD_ZERO #define SYS_FD_CLR FD_CLR #define SYS_FD_SET FD_SET #define SYS_FD_ISSET FD_ISSET #if !defined(INADDR_NONE) #define INADDR_NONE 0xffffffff #endif #define SYS_SHUT_RD SHUT_RD #define SYS_SHUT_WR SHUT_WR #define SYS_SHUT_RDWR SHUT_RDWR typedef signed char SYS_INT8; typedef unsigned char SYS_UINT8; typedef signed short int SYS_INT16; typedef unsigned short int SYS_UINT16; typedef signed int SYS_INT32; typedef unsigned int SYS_UINT32; typedef signed long long SYS_INT64; typedef unsigned long long SYS_UINT64; typedef unsigned long SYS_HANDLE; typedef pthread_key_t SYS_TLSKEY; typedef pthread_once_t SYS_THREAD_ONCE; typedef int SYS_SOCKET; typedef void *SYS_SEMAPHORE; typedef void *SYS_MUTEX; typedef void *SYS_EVENT; typedef void *SYS_PEVENT; typedef void *SYS_THREAD; typedef void *SYS_MMAP; typedef SYS_INT64 SYS_OFF_T; typedef long SYS_SIZE_T; #endif xmail-1.27/SMAILSvr.h0000644000175000017500000000220411341640430013532 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SMAILSVR_H #define _SMAILSVR_H #define SMAILF_STOP_SERVER (1 << 0) #define SMAILF_LOG_ENABLED (1 << 1) struct SMAILConfig { unsigned long ulFlags; long lThreadCount; }; unsigned int SMAILThreadProc(void *pThreadData); #endif xmail-1.27/UsrMailList.cpp0000644000175000017500000002303011341640430014735 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "ResLocks.h" #include "StrUtils.h" #include "SList.h" #include "BuffSock.h" #include "MailConfig.h" #include "UsrUtils.h" #include "SvrUtils.h" #include "MessQueue.h" #include "SMAILUtils.h" #include "QueueUtils.h" #include "MailSvr.h" #include "MiscUtils.h" #include "POP3GwLink.h" #include "UsrMailList.h" #define MLU_TABLE_LINE_MAX 512 enum MLUsrFileds { mlusrAddress = 0, mlusrPerms, mlusrMax }; struct MLUsersScanData { char szTmpDBFile[SYS_MAX_PATH]; FILE *pDBFile; }; static MLUserInfo *UsrMLGetUserFromStrings(char **ppszStrings); static int UsrMLWriteUser(FILE * pMLUFile, MLUserInfo const *pMLUI); static MLUserInfo *UsrMLGetUserFromStrings(char **ppszStrings) { int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount <= mlusrAddress) return NULL; MLUserInfo *pMLUI = (MLUserInfo *) SysAlloc(sizeof(MLUserInfo)); if (pMLUI == NULL) return NULL; pMLUI->pszAddress = SysStrDup(ppszStrings[mlusrAddress]); if (iFieldsCount > mlusrPerms) pMLUI->pszPerms = SysStrDup(ppszStrings[mlusrPerms]); else pMLUI->pszPerms = SysStrDup(DEFAULT_MLUSER_PERMS); return pMLUI; } MLUserInfo *UsrMLAllocDefault(char const *pszAddress, char const *pszPerms) { MLUserInfo *pMLUI = (MLUserInfo *) SysAlloc(sizeof(MLUserInfo)); if (pMLUI == NULL) return NULL; pMLUI->pszAddress = SysStrDup(pszAddress); if (pszPerms != NULL) pMLUI->pszPerms = SysStrDup(pszPerms); else pMLUI->pszPerms = SysStrDup(DEFAULT_MLUSER_PERMS); return pMLUI; } int UsrMLFreeUser(MLUserInfo * pMLUI) { if (pMLUI->pszPerms != NULL) SysFree(pMLUI->pszPerms); if (pMLUI->pszAddress != NULL) SysFree(pMLUI->pszAddress); SysFree(pMLUI); return 0; } int UsrMLCheckUserPost(UserInfo * pUI, char const *pszUser, char const *pszLogonUser) { char *pszClosed = UsrGetUserInfoVar(pUI, "ClosedML"); if (pszClosed != NULL) { int iClosedML = atoi(pszClosed); SysFree(pszClosed); if (iClosedML) { USRML_HANDLE hUsersDB = UsrMLOpenDB(pUI); if (hUsersDB == INVALID_USRML_HANDLE) return ErrGetErrorCode(); /* Mailing list scan */ MLUserInfo *pMLUI = UsrMLGetFirstUser(hUsersDB); for (; pMLUI != NULL; pMLUI = UsrMLGetNextUser(hUsersDB)) { if (((stricmp(pszUser, pMLUI->pszAddress) == 0) && (strchr(pMLUI->pszPerms, 'W') != NULL)) || ((pszLogonUser != NULL) && (stricmp(pszLogonUser, pMLUI->pszAddress) == 0) && (strchr(pMLUI->pszPerms, 'A') != NULL))) { UsrMLFreeUser(pMLUI); UsrMLCloseDB(hUsersDB); return 0; } UsrMLFreeUser(pMLUI); } UsrMLCloseDB(hUsersDB); ErrSetErrorCode(ERR_MLUSER_NOT_FOUND, pszUser); return ERR_MLUSER_NOT_FOUND; } } return 0; } static int UsrMLWriteUser(FILE * pMLUFile, MLUserInfo const *pMLUI) { /* User email address */ char *pszQuoted = StrQuote(pMLUI->pszAddress, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pMLUFile, "%s\t", pszQuoted); /* User permissions */ if ((pszQuoted = StrQuote(pMLUI->pszPerms, '"')) == NULL) return ErrGetErrorCode(); fprintf(pMLUFile, "%s\n", pszQuoted); SysFree(pszQuoted); return 0; } int UsrMLAddUser(UserInfo * pUI, MLUserInfo const *pMLUI) { if (UsrGetUserType(pUI) != usrTypeML) { ErrSetErrorCode(ERR_USER_NOT_MAILINGLIST); return ERR_USER_NOT_MAILINGLIST; } char szMLTablePath[SYS_MAX_PATH] = ""; UsrGetMLTableFilePath(pUI, szMLTablePath, sizeof(szMLTablePath)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szMLTablePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pMLUFile = fopen(szMLTablePath, "r+t"); if (pMLUFile == NULL) { RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_NO_USER_MLTABLE_FILE); return ERR_NO_USER_MLTABLE_FILE; } char szMLULine[MLU_TABLE_LINE_MAX] = ""; while (MscFGets(szMLULine, sizeof(szMLULine) - 1, pMLUFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szMLULine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if ((iFieldsCount >= mlusrAddress) && (stricmp(ppszStrings[mlusrAddress], pMLUI->pszAddress) == 0)) { StrFreeStrings(ppszStrings); fclose(pMLUFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_MLUSER_ALREADY_EXIST); return ERR_MLUSER_ALREADY_EXIST; } StrFreeStrings(ppszStrings); } fseek(pMLUFile, 0, SEEK_END); if (UsrMLWriteUser(pMLUFile, pMLUI) < 0) { fclose(pMLUFile); RLckUnlockEX(hResLock); return ErrGetErrorCode(); } fclose(pMLUFile); RLckUnlockEX(hResLock); return 0; } int UsrMLRemoveUser(UserInfo * pUI, const char *pszMLUser) { if (UsrGetUserType(pUI) != usrTypeML) { ErrSetErrorCode(ERR_USER_NOT_MAILINGLIST); return ERR_USER_NOT_MAILINGLIST; } char szMLTablePath[SYS_MAX_PATH] = ""; UsrGetMLTableFilePath(pUI, szMLTablePath, sizeof(szMLTablePath)); char szTmpFile[SYS_MAX_PATH] = ""; UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szMLTablePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pMLUFile = fopen(szMLTablePath, "rt"); if (pMLUFile == NULL) { RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_NO_USER_MLTABLE_FILE); return ERR_NO_USER_MLTABLE_FILE; } FILE *pTmpFile = fopen(szTmpFile, "wt"); if (pTmpFile == NULL) { fclose(pMLUFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } int iMLUserFound = 0; char szMLULine[MLU_TABLE_LINE_MAX] = ""; while (MscFGets(szMLULine, sizeof(szMLULine) - 1, pMLUFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szMLULine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if ((iFieldsCount >= mlusrAddress) && (stricmp(ppszStrings[mlusrAddress], pszMLUser) == 0)) { ++iMLUserFound; } else fprintf(pTmpFile, "%s\n", szMLULine); StrFreeStrings(ppszStrings); } fclose(pMLUFile); fclose(pTmpFile); if (iMLUserFound == 0) { SysRemove(szTmpFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_MLUSER_NOT_FOUND); return ERR_MLUSER_NOT_FOUND; } if (MscMoveFile(szTmpFile, szMLTablePath) < 0) { RLckUnlockEX(hResLock); return ErrGetErrorCode(); } RLckUnlockEX(hResLock); return 0; } int UsrMLGetUsersFileSnapShot(UserInfo * pUI, const char *pszFileName) { char szMLTablePath[SYS_MAX_PATH] = ""; UsrGetMLTableFilePath(pUI, szMLTablePath, sizeof(szMLTablePath)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szMLTablePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); if (MscCopyFile(pszFileName, szMLTablePath) < 0) { RLckUnlockSH(hResLock); return ErrGetErrorCode(); } RLckUnlockSH(hResLock); return 0; } USRML_HANDLE UsrMLOpenDB(UserInfo * pUI) { MLUsersScanData *pMLUSD = (MLUsersScanData *) SysAlloc(sizeof(MLUsersScanData)); if (pMLUSD == NULL) return INVALID_USRML_HANDLE; UsrGetTmpFile(NULL, pMLUSD->szTmpDBFile, sizeof(pMLUSD->szTmpDBFile)); if (UsrMLGetUsersFileSnapShot(pUI, pMLUSD->szTmpDBFile) < 0) { SysFree(pMLUSD); return INVALID_USRML_HANDLE; } if ((pMLUSD->pDBFile = fopen(pMLUSD->szTmpDBFile, "rt")) == NULL) { SysRemove(pMLUSD->szTmpDBFile); SysFree(pMLUSD); return INVALID_USRML_HANDLE; } return (USRML_HANDLE) pMLUSD; } void UsrMLCloseDB(USRML_HANDLE hUsersDB) { MLUsersScanData *pMLUSD = (MLUsersScanData *) hUsersDB; fclose(pMLUSD->pDBFile); SysRemove(pMLUSD->szTmpDBFile); SysFree(pMLUSD); } MLUserInfo *UsrMLGetFirstUser(USRML_HANDLE hUsersDB) { MLUsersScanData *pMLUSD = (MLUsersScanData *) hUsersDB; rewind(pMLUSD->pDBFile); char szMLULine[MLU_TABLE_LINE_MAX] = ""; while (MscFGets(szMLULine, sizeof(szMLULine) - 1, pMLUSD->pDBFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szMLULine); if (ppszStrings == NULL) continue; MLUserInfo *pMLUI = UsrMLGetUserFromStrings(ppszStrings); if (pMLUI != NULL) { StrFreeStrings(ppszStrings); return pMLUI; } StrFreeStrings(ppszStrings); } return NULL; } MLUserInfo *UsrMLGetNextUser(USRML_HANDLE hUsersDB) { MLUsersScanData *pMLUSD = (MLUsersScanData *) hUsersDB; char szMLULine[MLU_TABLE_LINE_MAX] = ""; while (MscFGets(szMLULine, sizeof(szMLULine) - 1, pMLUSD->pDBFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szMLULine); if (ppszStrings == NULL) continue; MLUserInfo *pMLUI = UsrMLGetUserFromStrings(ppszStrings); if (pMLUI != NULL) { StrFreeStrings(ppszStrings); return pMLUI; } StrFreeStrings(ppszStrings); } return NULL; } xmail-1.27/SMAILUtils.h0000644000175000017500000001367311341640430014074 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SMAILUTILS_H #define _SMAILUTILS_H #define MAX_SPOOL_LINE 1537 #define MAIL_FROM_STR "MAIL FROM:" #define RCPT_TO_STR "RCPT TO:" #define SPOOL_FILE_DATA_START "<>" #define INVALID_SPLF_HANDLE ((SPLF_HANDLE) 0) #define TAG_POSITION_INIT ((TAG_POSITION) -1) #define LMPCF_LOG_ENABLED (1 << 0) struct SpoolFileHeader { char szSpoolFile[SYS_MAX_PATH]; char szSMTPDomain[MAX_ADDR_NAME]; char szMessageID[128]; char **ppszInfo; char **ppszFrom; char **ppszRcpt; }; typedef struct SPLF_HANDLE_struct { } *SPLF_HANDLE; struct LocalMailProcConfig { unsigned long ulFlags; }; typedef void *TAG_POSITION; int USmlLoadSpoolFileHeader(char const *pszSpoolFile, SpoolFileHeader &SFH); void USmlCleanupSpoolFileHeader(SpoolFileHeader &SFH); char *USmlAddrConcat(char const *const *ppszStrings); char *USmlBuildSendMailFrom(char const *const *ppszFrom, char const *const *ppszRcpt); char *USmlBuildSendRcptTo(char const *const *ppszFrom, char const *const *ppszRcpt); SPLF_HANDLE USmlCreateHandle(char const *pszMessFilePath); void USmlCloseHandle(SPLF_HANDLE hFSpool); int USmlReloadHandle(SPLF_HANDLE hFSpool); char const *USmlGetRelayDomain(SPLF_HANDLE hFSpool); char const *USmlGetSpoolFilePath(SPLF_HANDLE hFSpool); char const *USmlGetSpoolFile(SPLF_HANDLE hFSpool); char const *USmlGetSMTPDomain(SPLF_HANDLE hFSpool); char const *USmlGetSmtpMessageID(SPLF_HANDLE hFSpool); char const *const *USmlGetInfo(SPLF_HANDLE hFSpool); char const *const *USmlGetMailFrom(SPLF_HANDLE hFSpool); char const *USmlMailFrom(SPLF_HANDLE hFSpool); char const *USmlSendMailFrom(SPLF_HANDLE hFSpool); char const *const *USmlGetRcptTo(SPLF_HANDLE hFSpool); char const *USmlRcptTo(SPLF_HANDLE hFSpool); char const *USmlSendRcptTo(SPLF_HANDLE hFSpool); SYS_OFF_T USmlMessageSize(SPLF_HANDLE hFSpool); int USmlSyncChanges(SPLF_HANDLE hFSpool); int USmlGetMsgFileSection(SPLF_HANDLE hFSpool, FileSection &FSect); int USmlWriteMailFile(SPLF_HANDLE hFSpool, FILE *pMsgFile, bool bMBoxFile = false); char *USmlGetTag(SPLF_HANDLE hFSpool, char const *pszTagName, TAG_POSITION &TagPosition); int USmlAddTag(SPLF_HANDLE hFSpool, char const *pszTagName, char const *pszTagData, int iUpdate = 0); int USmlSetTagAddress(SPLF_HANDLE hFSpool, char const *pszTagName, char const *pszAddress); int USmlMapAddress(char const *pszAddress, char *pszDomain, char *pszName); int USmlCreateMBFile(UserInfo *pUI, char const *pszFileName, SPLF_HANDLE hFSpool); int USmlVCreateSpoolFile(SPLF_HANDLE hFSpool, char const *pszFromUser, char const *pszRcptUser, char const *pszFileName, va_list Headers); int USmlCreateSpoolFile(SPLF_HANDLE hFSpool, char const *pszFromUser, char const *pszRcptUser, char const *pszFileName, ...); int USmlProcessLocalUserMessage(SVRCFG_HANDLE hSvrConfig, UserInfo *pUI, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, LocalMailProcConfig &LMPC); int USmlGetDomainCustomDir(char *pszCustomDir, int iMaxPath, int iFinalSlash); int USmlGetCmdAliasDir(char *pszAliasDir, int iMaxPath, int iFinalSlash); int USmlGetCmdAliasFile(char const *pszDomain, char const *pszUser, char *pszAliasFile); int USmlIsCmdAliasAccount(char const *pszDomain, char const *pszUser, char *pszAliasFile = NULL); int USmlGetCmdAliasSpoolFile(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char *pszAliasFilePath); int USmlGetCmdAliasCustomFile(SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char const *pszDomain, char const *pszUser, char *pszAliasFilePath); int USmlDomainCustomFileName(char const *pszDestDomain, char *pszCustFilePath); int USmlGetDomainCustomFile(char const *pszDestDomain, char *pszCustFilePath); int USmlCreateCmdAliasDomainDir(char const *pszDomain); int USmlDeleteCmdAliasDomainDir(char const *pszDomain); int USmlGetDomainCustomSpoolFile(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char *pszCustFilePath); int USmlGetUserCustomSpoolFile(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char *pszCustFilePath); int USmlGetDomainMsgCustomFile(SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char const *pszDestDomain, char *pszCustFilePath); int USmlGetCustomDomainFile(char const *pszDestDomain, char const *pszCustFilePath); int USmlSetCustomDomainFile(char const *pszDestDomain, char const *pszCustFilePath); int USmlCustomizedDomain(char const *pszDestDomain); int USmlLogMessage(SPLF_HANDLE hFSpool, char const *pszMedium, char const *pszRmtMsgID, char const *pszParam); char const *USmlDotAtom(char const *pszStr, char const *pszTop); int USmlValidAddress(char const *pszAddress, char const *pszTop); int USmlValidHost(char const *pszHost, char const *pszTop); int USmlParseAddress(char const *pszAddress, char *pszPreAddr, int iMaxPreAddress, char *pszEmailAddr, int iMaxAddress); int USmlDeliverFetchedMsg(char const *pszSyncAddr, char const *pszFetchHdrTags, char const *pszMailFile); int USmlMailLoopCheck(SPLF_HANDLE hFSpool, SVRCFG_HANDLE hSvrConfig); int USmlMessageAuth(SPLF_HANDLE hFSpool, char *pszAuthName, int iSize); #endif xmail-1.27/SysLists.h0000644000175000017500000000714211341640430013775 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SYSLISTS_H #define _SYSLISTS_H #define SYS_LIST_HEAD_INIT(name) { &(name), &(name) } #define SYS_LIST_HEAD(name) struct SysListHead name = SYS_LIST_HEAD_INIT(name) #define SYS_INIT_LIST_HEAD(ptr) \ do { \ (ptr)->pNext = (ptr); (ptr)->pPrev = (ptr); \ } while (0) #define SYS_INIT_LIST_LINK(ptr) \ do { \ (ptr)->pNext = NULL; (ptr)->pPrev = NULL; \ } while (0) #define SYS_LIST_ADD(new, prev, next) \ do { \ struct SysListHead *pPrev = prev; \ struct SysListHead *pNext = next; \ pNext->pPrev = new; \ (new)->pNext = pNext; \ (new)->pPrev = pPrev; \ pPrev->pNext = new; \ } while (0) #define SYS_LIST_ADDH(new, head) SYS_LIST_ADD(new, head, (head)->pNext) #define SYS_LIST_ADDT(new, head) SYS_LIST_ADD(new, (head)->pPrev, head) #define SYS_LIST_UNLINK(prev, next) \ do { \ (next)->pPrev = prev; \ (prev)->pNext = next; \ } while (0) #define SYS_LIST_DEL(entry) \ do { \ SYS_LIST_UNLINK((entry)->pPrev, (entry)->pNext); \ (entry)->pPrev = entry; \ (entry)->pNext = entry; \ } while (0) #define SYS_LIST_EMTPY(head) ((head)->pNext == head) #define SYS_LIST_SPLICE(list, head) \ do { \ struct SysListHead *first = (list)->pNext; \ if (first != list) { \ struct SysListHead *last = (list)->pPrev; \ struct SysListHead *at = (head)->pNext; \ (first)->pPrev = head; \ (head)->pNext = first; \ (last)->pNext = at; \ (at)->pPrev = last; \ SYS_INIT_LIST_HEAD(list); \ } \ } while (0) #define SYS_LIST_ENTRY(ptr, type, member) ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) #define SYS_LIST_FOR_EACH(pos, head) for (pos = (head)->pNext; pos != (head); pos = (pos)->pNext) #define SYS_LIST_FOR_EACH_SAFE(pos, n, head) \ for (pos = (head)->pNext, n = pos->pNext; pos != (head); \ pos = n, n = pos->pNext) #define SYS_LIST_FIRST(head) (((head)->pNext != (head)) ? (head)->pNext: NULL) #define SYS_LIST_LAST(head) (((head)->pPrev != (head)) ? (head)->pPrev: NULL) #define SYS_LIST_NEXT(pos, head) (((pos)->pNext != (head)) ? (pos)->pNext: NULL) #define SYS_LIST_PREV(pos, head) (((pos)->pPrev != (head)) ? (pos)->pPrev: NULL) #define SYS_LIST_LINKED(ptr) (((ptr)->pPrev != NULL) && ((ptr)->pNext != NULL)) #define SYS_COPY_HEAD(dsth, srch) \ do { \ (dsth)->pPrev = (srch)->pPrev; \ (dsth)->pNext = (srch)->pNext; \ if ((srch)->pNext != NULL) (srch)->pNext->pPrev = dsth; \ if ((srch)->pPrev != NULL) (srch)->pPrev->pNext = dsth; \ } while (0) struct SysListHead { struct SysListHead *pNext; struct SysListHead *pPrev; }; #endif xmail-1.27/ShBlocks.h0000644000175000017500000000223411341640430013705 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SHBLOCKS_H #define _SHBLOCKS_H #define SHB_INVALID_HANDLE ((SHB_HANDLE) 0) typedef void *SHB_HANDLE; SHB_HANDLE ShbCreateBlock(unsigned int uSize); int ShbCloseBlock(SHB_HANDLE hBlock); void *ShbLock(SHB_HANDLE hBlock); int ShbUnlock(SHB_HANDLE hBlock); #endif xmail-1.27/SvrDefines.h0000644000175000017500000000264611341640430014254 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SVRDEFINES_H #define _SVRDEFINES_H /* Include configuration options */ #include "SvrConfig.h" #define TAB_COMMENT_CHAR '#' #define MAX_SMTP_ADDRESS 1024 #define MAX_ADDR_NAME 256 #define MAX_HOST_NAME 256 #define MAX_MESSAGE_ID SYS_MAX_PATH #define MAX_ACCEPT_ADDRESSES 32 #define LOG_ROTATE_HOURS 24 #define STD_SERVER_TIMEOUT 90000 #define LOCAL_ADDRESS "127.0.0.1" #define LOCAL_ADDRESS_SQB "[" LOCAL_ADDRESS "]" #endif xmail-1.27/SSLConfig.cpp0000644000175000017500000000524611341640430014325 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "SList.h" #include "ShBlocks.h" #include "BuffSock.h" #include "SSLBind.h" #include "ResLocks.h" #include "StrUtils.h" #include "UsrUtils.h" #include "SvrUtils.h" #include "MiscUtils.h" #include "SSLConfig.h" #include "MailConfig.h" #include "AppDefines.h" int CSslBindSetup(SslServerBind *pSSLB) { SVRCFG_HANDLE hCfg; char szMailRoot[SYS_MAX_PATH] = "", szPath[SYS_MAX_PATH] = ""; if ((hCfg = SvrGetConfigHandle()) == INVALID_SVRCFG_HANDLE) return ErrGetErrorCode(); ZeroData(*pSSLB); CfgGetRootPath(szMailRoot, sizeof(szMailRoot)); SysSNPrintf(szPath, sizeof(szPath) - 1, "%sserver.cert", szMailRoot); pSSLB->pszCertFile = SysStrDup(szPath); SysSNPrintf(szPath, sizeof(szPath) - 1, "%sserver.key", szMailRoot); pSSLB->pszKeyFile = SysStrDup(szPath); if (SvrTestConfigFlag("SSLUseCertsFile", false, hCfg)) { SysSNPrintf(szPath, sizeof(szPath) - 1, "%scerts.pem", szMailRoot); if (SysExistFile(szPath)) pSSLB->pszCAFile = SysStrDup(szPath); } if (SvrTestConfigFlag("SSLUseCertsDir", false, hCfg)) { SysSNPrintf(szPath, sizeof(szPath) - 1, "%scerts", szMailRoot); if (SysExistDir(szPath)) pSSLB->pszCAPath = SysStrDup(szPath); } if (SvrTestConfigFlag("SSLWantVerify", false, hCfg)) pSSLB->ulFlags |= BSSLF_WANT_VERIFY; if (SvrTestConfigFlag("SSLAllowSelfSigned", false, hCfg)) pSSLB->ulFlags |= BSSLF_ALLOW_SEFLSIGNED; if (SvrTestConfigFlag("SSLWantCert", false, hCfg)) pSSLB->ulFlags |= BSSLF_WANT_VERIFY | BSSLF_WANT_CERT; pSSLB->iMaxDepth = SvrGetConfigInt("SSLMaxCertsDepth", 0, hCfg); SvrReleaseConfigHandle(hCfg); return 0; } void CSslBindCleanup(SslServerBind *pSSLB) { SysFree(pSSLB->pszKeyFile); SysFree(pSSLB->pszCertFile); SysFree(pSSLB->pszCAFile); SysFree(pSSLB->pszCAPath); } xmail-1.27/SysDepBSD.cpp0000644000175000017500000001326411341640430014275 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SysDepUnix.h" #include "AppDefines.h" int SysDepInitLibrary(void) { return 0; } void SysDepCleanupLibrary(void) { } #if defined(__OPENBSD__) || defined(__NETBSD__) static int SysGetPriorityMin(int iPolicy) { int iPriority = 0; switch (iPolicy) { case SCHED_FIFO: iPriority = 0; break; case SCHED_OTHER: iPriority = -20; break; case SCHED_RR: iPriority = 0; break; } return iPriority; } static int SysGetPriorityMax(int iPolicy) { int iPriority = 0; switch (iPolicy) { case SCHED_FIFO: iPriority = 31; break; case SCHED_OTHER: iPriority = +20; break; case SCHED_RR: iPriority = 31; break; } return iPriority; } #endif int SysSetThreadPriority(SYS_THREAD ThreadID, int iPriority) { ThrData *pTD = (ThrData *) ThreadID; int iPolicy, iMinPriority, iMaxPriority, iStdPriority; struct sched_param SchParam; if (pthread_getschedparam(pTD->ThreadId, &iPolicy, &SchParam) != 0) { ErrSetErrorCode(ERR_SET_THREAD_PRIORITY); return ERR_SET_THREAD_PRIORITY; } #if defined(__FREEBSD__) || defined (__DARWIN__) iMinPriority = sched_get_priority_min(iPolicy); iMaxPriority = sched_get_priority_max(iPolicy); #else iMinPriority = SysGetPriorityMin(iPolicy); iMaxPriority = SysGetPriorityMax(iPolicy); #endif iStdPriority = (iMinPriority + iMaxPriority) / 2; switch (iPriority) { case SYS_PRIORITY_NORMAL: SchParam.sched_priority = iStdPriority; break; case SYS_PRIORITY_LOWER: SchParam.sched_priority = iStdPriority - (iStdPriority - iMinPriority) / 3; break; case SYS_PRIORITY_HIGHER: SchParam.sched_priority = iStdPriority + (iStdPriority - iMinPriority) / 3; break; } if (pthread_setschedparam(pTD->ThreadId, iPolicy, &SchParam) != 0) { ErrSetErrorCode(ERR_SET_THREAD_PRIORITY); return ERR_SET_THREAD_PRIORITY; } return 0; } long SysGetTimeZone(void) { time_t tCurr = time(NULL); struct tm tmCurr; localtime_r(&tCurr, &tmCurr); return -tmCurr.tm_gmtoff + tmCurr.tm_isdst * 3600; } int SysGetDiskSpace(char const *pszPath, SYS_INT64 *pTotal, SYS_INT64 *pFree) { #ifdef BSD_USE_STATVFS #define XMAIL_STATFS statvfs #else #define XMAIL_STATFS statfs #endif struct XMAIL_STATFS SFStat; if (XMAIL_STATFS(pszPath, &SFStat) != 0) { ErrSetErrorCode(ERR_GET_DISK_SPACE_INFO); return ERR_GET_DISK_SPACE_INFO; } *pTotal = (SYS_INT64) SFStat.f_bsize * (SYS_INT64) SFStat.f_blocks; *pFree = (SYS_INT64) SFStat.f_bsize * (SYS_INT64) SFStat.f_bavail; return 0; } int SysMemoryInfo(SYS_INT64 *pRamTotal, SYS_INT64 *pRamFree, SYS_INT64 *pVirtTotal, SYS_INT64 *pVirtFree) { #if defined(__FREEBSD__) int i, iValue, iSwaps; size_t DataLen; SYS_INT64 PageSize; kvm_t *pKD; struct kvm_swap KSwap[8]; char szErrBuffer[_POSIX2_LINE_MAX] = ""; DataLen = sizeof(iValue); if (sysctlbyname("vm.stats.vm.v_page_size", &iValue, &DataLen, NULL, 0) != 0) { ErrSetErrorCode(ERR_GET_MEMORY_INFO); return ERR_GET_MEMORY_INFO; } PageSize = iValue; DataLen = sizeof(iValue); if (sysctlbyname("vm.stats.vm.v_page_count", &iValue, &DataLen, NULL, 0) != 0) { ErrSetErrorCode(ERR_GET_MEMORY_INFO); return ERR_GET_MEMORY_INFO; } *pVirtTotal = *pRamTotal = (SYS_INT64) iValue * PageSize; DataLen = sizeof(iValue); if (sysctlbyname("vm.stats.vm.v_free_count", &iValue, &DataLen, NULL, 0) != 0) { ErrSetErrorCode(ERR_GET_MEMORY_INFO); return ERR_GET_MEMORY_INFO; } *pVirtFree = *pRamFree = (SYS_INT64) iValue * PageSize; /* Get swap infos through the kvm interface */ if ((pKD = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, szErrBuffer)) == NULL) { ErrSetErrorCode(ERR_GET_MEMORY_INFO); return ERR_GET_MEMORY_INFO; } iSwaps = kvm_getswapinfo(pKD, KSwap, CountOf(KSwap), SWIF_DEV_PREFIX); for (i = 0; i < iSwaps; i++) { *pVirtFree += (SYS_INT64) (KSwap[i].ksw_total - KSwap[i].ksw_used) * PageSize; *pVirtTotal += (SYS_INT64) KSwap[i].ksw_total * PageSize; } kvm_close(pKD); return 0; #else int iResult = 0, iHwPhisMem, iHwPageSize; size_t DataLen; struct vmtotal VmMeter; static int iHwPhisMem_mib[] = { CTL_HW, HW_PHYSMEM }; static int iHwPageSize_mib[] = { CTL_HW, HW_PAGESIZE }; static int VmMeter_mib[] = { CTL_VM, VM_METER }; DataLen = sizeof(iHwPhisMem); if (iResult >= 0) iResult = sysctl(iHwPhisMem_mib, 2, &iHwPhisMem, &DataLen, NULL, 0); DataLen = sizeof(iHwPageSize); if (iResult >= 0) iResult = sysctl(iHwPageSize_mib, 2, &iHwPageSize, &DataLen, NULL, 0); DataLen = sizeof(vmtotal); if (iResult >= 0) iResult = sysctl(VmMeter_mib, 2, &VmMeter, &DataLen, NULL, 0); if (iResult < 0) { ErrSetErrorCode(ERR_GET_MEMORY_INFO); return ERR_GET_MEMORY_INFO; } *pRamTotal = iHwPhisMem; *pRamFree = (SYS_INT64) iHwPageSize *(SYS_INT64) VmMeter.t_free; *pVirtTotal = (SYS_INT64) iHwPageSize *(SYS_INT64) VmMeter.t_vm; *pVirtFree = *pVirtTotal - (SYS_INT64) iHwPageSize *(SYS_INT64) VmMeter.t_avm; return 0; #endif } xmail-1.27/POP3Svr.cpp0000644000175000017500000006652411341640430013760 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "SList.h" #include "BuffSock.h" #include "SSLBind.h" #include "ResLocks.h" #include "MiscUtils.h" #include "StrUtils.h" #include "MD5.h" #include "SSLConfig.h" #include "SvrUtils.h" #include "UsrUtils.h" #include "UsrAuth.h" #include "POP3Svr.h" #include "POP3Utils.h" #include "MessQueue.h" #include "MailDomains.h" #include "MailConfig.h" #include "AppDefines.h" #include "MailSvr.h" #define STD_POP3_TIMEOUT 30000 #define POP3_IPMAP_FILE "pop3.ipmap.tab" #define POP3_LOG_FILE "pop3" enum POP3States { stateInit, stateUser, stateLogged, stateExit }; struct POP3Session { int iPOP3State; ThreadConfig const *pThCfg; POP3Config *pPOP3Cfg; SVRCFG_HANDLE hSvrConfig; int iBadLoginWait; SYS_INET_ADDR PeerInfo; char szSvrFQDN[MAX_HOST_NAME]; char szSvrDomain[MAX_HOST_NAME]; char szUser[MAX_ADDR_NAME]; char szPassword[256]; POP3_HANDLE hPOPSession; char szTimeStamp[256]; int iLogPasswd; }; static int POP3ThreadCountAdd(long lCount, SHB_HANDLE hShbPOP3, POP3Config *pPOP3Cfg = NULL); static int POP3LogEnabled(SHB_HANDLE hShbPOP3, POP3Config *pPOP3Cfg = NULL); static POP3Config *POP3GetConfigCopy(SHB_HANDLE hShbPOP3) { POP3Config *pPOP3Cfg = (POP3Config *) ShbLock(hShbPOP3); if (pPOP3Cfg == NULL) return NULL; POP3Config *pPOP3CfgCopy = (POP3Config *) SysAlloc(sizeof(POP3Config)); if (pPOP3CfgCopy != NULL) memcpy(pPOP3CfgCopy, pPOP3Cfg, sizeof(POP3Config)); ShbUnlock(hShbPOP3); return pPOP3CfgCopy; } static int POP3ThreadCountAdd(long lCount, SHB_HANDLE hShbPOP3, POP3Config *pPOP3Cfg) { int iDoUnlock = 0; if (pPOP3Cfg == NULL) { if ((pPOP3Cfg = (POP3Config *) ShbLock(hShbPOP3)) == NULL) return ErrGetErrorCode(); ++iDoUnlock; } if ((pPOP3Cfg->lThreadCount + lCount) > pPOP3Cfg->lMaxThreads) { if (iDoUnlock) ShbUnlock(hShbPOP3); ErrSetErrorCode(ERR_SERVER_BUSY); return ERR_SERVER_BUSY; } pPOP3Cfg->lThreadCount += lCount; if (iDoUnlock) ShbUnlock(hShbPOP3); return 0; } static int POP3LogEnabled(SHB_HANDLE hShbPOP3, POP3Config *pPOP3Cfg) { int iDoUnlock = 0; if (pPOP3Cfg == NULL) { if ((pPOP3Cfg = (POP3Config *) ShbLock(hShbPOP3)) == NULL) return ErrGetErrorCode(); ++iDoUnlock; } unsigned long ulFlags = pPOP3Cfg->ulFlags; if (iDoUnlock) ShbUnlock(hShbPOP3); return (ulFlags & POP3F_LOG_ENABLED) ? 1: 0; } static int POP3CheckPeerIP(SYS_SOCKET SockFD) { char szIPMapFile[SYS_MAX_PATH] = ""; CfgGetRootPath(szIPMapFile, sizeof(szIPMapFile)); StrNCat(szIPMapFile, POP3_IPMAP_FILE, sizeof(szIPMapFile)); if (SysExistFile(szIPMapFile)) { SYS_INET_ADDR PeerInfo; if (SysGetPeerInfo(SockFD, PeerInfo) < 0 || MscCheckAllowedIP(szIPMapFile, PeerInfo, true) < 0) return ErrGetErrorCode(); } return 0; } static int POP3CheckSysResources(SVRCFG_HANDLE hSvrConfig) { /* Check virtual memory */ int iMinValue = SvrGetConfigInt("Pop3MinVirtMemSpace", -1, hSvrConfig); if (iMinValue > 0 && SvrCheckVirtMemSpace(1024 * (unsigned long) iMinValue) < 0) return ErrGetErrorCode(); return 0; } static int POP3InitSession(ThreadConfig const *pThCfg, BSOCK_HANDLE hBSock, POP3Session &POP3S) { ZeroData(POP3S); POP3S.iPOP3State = stateInit; POP3S.pThCfg = pThCfg; POP3S.hSvrConfig = INVALID_SVRCFG_HANDLE; POP3S.pPOP3Cfg = NULL; POP3S.hPOPSession = INVALID_POP3_HANDLE; if ((POP3S.hSvrConfig = SvrGetConfigHandle()) == INVALID_SVRCFG_HANDLE) return ErrGetErrorCode(); if (POP3CheckSysResources(POP3S.hSvrConfig) < 0 || SysGetPeerInfo(BSckGetAttachedSocket(hBSock), POP3S.PeerInfo) < 0) { SvrReleaseConfigHandle(POP3S.hSvrConfig); return ErrGetErrorCode(); } /* Get connection socket host name */ char szIP[128] = "???.???.???.???"; if (MscGetSockHost(BSckGetAttachedSocket(hBSock), POP3S.szSvrFQDN, sizeof(POP3S.szSvrFQDN)) < 0) StrSNCpy(POP3S.szSvrFQDN, SysInetNToA(POP3S.PeerInfo, szIP, sizeof(szIP))); else { /* Try to get a valid domain from the FQDN */ if (MDomGetClientDomain(POP3S.szSvrFQDN, POP3S.szSvrDomain, sizeof(POP3S.szSvrDomain) - 1) < 0) StrSNCpy(POP3S.szSvrDomain, POP3S.szSvrFQDN); } /* * If "POP3Domain" is defined, it's taken as default POP3 domain that means * that users of such domain can log using only the name part of their email * address. */ char *pszDefDomain = SvrGetConfigVar(POP3S.hSvrConfig, "POP3Domain"); if (pszDefDomain != NULL) { StrSNCpy(POP3S.szSvrDomain, pszDefDomain); SysFree(pszDefDomain); } /* As a last tentative We try to get "RootDomain" to set POP3 domain */ if (IsEmptyString(POP3S.szSvrDomain)) { char *pszRootDomain = SvrGetConfigVar(POP3S.hSvrConfig, "RootDomain"); if (pszRootDomain == NULL) { SvrReleaseConfigHandle(POP3S.hSvrConfig); ErrSetErrorCode(ERR_NO_DOMAIN); return ERR_NO_DOMAIN; } StrSNCpy(POP3S.szSvrDomain, pszRootDomain); SysFree(pszRootDomain); } if ((POP3S.pPOP3Cfg = POP3GetConfigCopy(POP3S.pThCfg->hThShb)) == NULL) { SvrReleaseConfigHandle(POP3S.hSvrConfig); return ErrGetErrorCode(); } POP3S.iBadLoginWait = POP3S.pPOP3Cfg->iBadLoginWait; POP3S.iLogPasswd = SvrGetConfigInt("Pop3LogPasswd", 0, POP3S.hSvrConfig); /* Create timestamp for APOP command */ sprintf(POP3S.szTimeStamp, "<%lu.%lu@%s>", (unsigned long) time(NULL), SysGetCurrentThreadId(), POP3S.szSvrDomain); return 0; } static int POP3LogSession(POP3Session &POP3S, char const *pszStatus, char const *pszFmt, ...) { char *pszExtra = NULL; char szTime[256] = ""; MscGetTimeNbrString(szTime, sizeof(szTime) - 1); if (pszFmt != NULL) StrVSprint(pszExtra, pszFmt, pszFmt); RLCK_HANDLE hResLock = RLckLockEX(SVR_LOGS_DIR SYS_SLASH_STR POP3_LOG_FILE); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); char const *pszPassword = (POP3S.iLogPasswd == 2 || (POP3S.iLogPasswd == 1 && POP3S.iPOP3State != stateLogged)) ? POP3S.szPassword: ""; char szIP[128] = "???.???.???.???"; MscFileLog(POP3_LOG_FILE, "\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "%s" "\n", POP3S.szSvrFQDN, POP3S.szSvrDomain, SysInetNToA(POP3S.PeerInfo, szIP, sizeof(szIP)), szTime, POP3S.szUser, pszPassword, pszStatus, pszExtra != NULL ? pszExtra: ""); RLckUnlockEX(hResLock); SysFree(pszExtra); return 0; } static void POP3ClearSession(POP3Session &POP3S) { if (POP3S.hPOPSession != INVALID_POP3_HANDLE) { UPopReleaseSession(POP3S.hPOPSession, (POP3S.iPOP3State == stateExit) ? 1: 0); POP3S.hPOPSession = INVALID_POP3_HANDLE; } if (POP3S.hSvrConfig != INVALID_SVRCFG_HANDLE) { SvrReleaseConfigHandle(POP3S.hSvrConfig); POP3S.hSvrConfig = INVALID_SVRCFG_HANDLE; } SysFreeNullify(POP3S.pPOP3Cfg); } static int POP3HandleCmd_USER(char const *pszCommand, BSOCK_HANDLE hBSock, POP3Session &POP3S) { if (POP3S.iPOP3State != stateInit) { BSckSendString(hBSock, "-ERR Command not valid here", POP3S.pPOP3Cfg->iTimeout); return -1; } char **ppszTokens = StrTokenize(pszCommand, " "); if (ppszTokens == NULL || StrStringsCount(ppszTokens) != 2) { StrFreeStrings(ppszTokens); POP3S.iPOP3State = stateInit; BSckSendString(hBSock, "-ERR Invalid syntax", POP3S.pPOP3Cfg->iTimeout); return -1; } char szAccountUser[MAX_ADDR_NAME] = ""; char szAccountDomain[MAX_HOST_NAME] = ""; if (StrSplitString(ppszTokens[1], POP3_USER_SPLITTERS, szAccountUser, sizeof(szAccountUser), szAccountDomain, sizeof(szAccountDomain)) < 0) { StrFreeStrings(ppszTokens); BSckSendString(hBSock, "-ERR Invalid username", POP3S.pPOP3Cfg->iTimeout); return -1; } StrFreeStrings(ppszTokens); StrSNCpy(POP3S.szUser, szAccountUser); if (strlen(szAccountDomain) > 0) StrSNCpy(POP3S.szSvrDomain, szAccountDomain); POP3S.iPOP3State = stateUser; BSckVSendString(hBSock, POP3S.pPOP3Cfg->iTimeout, "+OK Password required for %s@%s", POP3S.szUser, POP3S.szSvrDomain); return 0; } static int POP3HandleBadLogin(BSOCK_HANDLE hBSock, POP3Session &POP3S) { /* Log POP3 session */ if (POP3LogEnabled(POP3S.pThCfg->hThShb, POP3S.pPOP3Cfg)) POP3LogSession(POP3S, "ELOGIN", NULL); if (POP3S.pPOP3Cfg->ulFlags & POP3F_HANG_ON_BADLOGIN) { /* Exit if POP3F_HANG_ON_BADLOGIN is set */ POP3S.iPOP3State = stateExit; } else { /* Otherwise sleep and doubles the sleeptime */ SysSleep(POP3S.iBadLoginWait); POP3S.iBadLoginWait += POP3S.iBadLoginWait; POP3S.iPOP3State = stateInit; } BSckSendString(hBSock, "-ERR Invalid auth or access denied", POP3S.pPOP3Cfg->iTimeout); return 0; } static int POP3HandleCmd_PASS(char const *pszCommand, BSOCK_HANDLE hBSock, POP3Session &POP3S) { if (POP3S.iPOP3State != stateUser) { BSckSendString(hBSock, "-ERR Command not valid here", POP3S.pPOP3Cfg->iTimeout); return -1; } char **ppszTokens = StrTokenize(pszCommand, " "); if (ppszTokens == NULL || StrStringsCount(ppszTokens) != 2) { StrFreeStrings(ppszTokens); POP3S.iPOP3State = stateInit; BSckSendString(hBSock, "-ERR Invalid syntax", POP3S.pPOP3Cfg->iTimeout); return -1; } StrSNCpy(POP3S.szPassword, ppszTokens[1]); StrFreeStrings(ppszTokens); /* Check the presence of external authentication modules. If authentication * succeed "pszPassword" is set to NULL that instruct "UPopBuildSession" * to not make local authentication. */ char const *pszPassword = POP3S.szPassword; int iAuthResult = UAthAuthenticateUser(AUTH_SERVICE_POP3, POP3S.szSvrDomain, POP3S.szUser, POP3S.szPassword); if (iAuthResult < 0) { if (iAuthResult != ERR_NO_EXTERNAL_AUTH_DEFINED) { ErrorPush(); POP3HandleBadLogin(hBSock, POP3S); return ErrorPop(); } } else pszPassword = NULL; /* Create POP3 session */ if ((POP3S.hPOPSession = UPopBuildSession(POP3S.szSvrDomain, POP3S.szUser, pszPassword, &POP3S.PeerInfo)) == INVALID_POP3_HANDLE) { ErrorPush(); POP3HandleBadLogin(hBSock, POP3S); return ErrorPop(); } /* Save the user connection IP to use for SMTP authentication */ UPopSaveUserIP(POP3S.hPOPSession); POP3S.iPOP3State = stateLogged; int iMsgCount = UPopGetSessionMsgCurrent(POP3S.hPOPSession); SYS_OFF_T llMBSize = UPopGetSessionMBSize(POP3S.hPOPSession); /* Log POP3 session */ if (POP3LogEnabled(POP3S.pThCfg->hThShb, POP3S.pPOP3Cfg)) POP3LogSession(POP3S, "LOGIN", "\t\"%d\"" "\t\"" SYS_OFFT_FMT "\"", iMsgCount, llMBSize); BSckVSendString(hBSock, POP3S.pPOP3Cfg->iTimeout, "+OK Maildrop has %d messages (" SYS_OFFT_FMT " bytes)", iMsgCount, llMBSize); return 0; } static int POP3HandleCmd_APOP(char const *pszCommand, BSOCK_HANDLE hBSock, POP3Session &POP3S) { if (POP3S.iPOP3State != stateInit) { BSckSendString(hBSock, "-ERR Command not valid here", POP3S.pPOP3Cfg->iTimeout); return -1; } char **ppszTokens = StrTokenize(pszCommand, " "); if (ppszTokens == NULL || StrStringsCount(ppszTokens) != 3) { StrFreeStrings(ppszTokens); POP3S.iPOP3State = stateInit; BSckSendString(hBSock, "-ERR Invalid syntax", POP3S.pPOP3Cfg->iTimeout); return -1; } /* Process parameters */ char szAccountUser[MAX_ADDR_NAME] = ""; char szAccountDomain[MAX_HOST_NAME] = ""; if (StrSplitString(ppszTokens[1], POP3_USER_SPLITTERS, szAccountUser, sizeof(szAccountUser), szAccountDomain, sizeof(szAccountDomain)) < 0) { StrFreeStrings(ppszTokens); BSckSendString(hBSock, "-ERR Invalid username", POP3S.pPOP3Cfg->iTimeout); return -1; } StrSNCpy(POP3S.szUser, szAccountUser); StrSNCpy(POP3S.szPassword, ppszTokens[2]); if (strlen(szAccountDomain) > 0) StrSNCpy(POP3S.szSvrDomain, szAccountDomain); StrFreeStrings(ppszTokens); /* Check the presence of external authentication modules. If authentication */ /* succeed "pszPassword" is set to NULL that instruct "UPopBuildSession" */ /* to not make local authentication */ char const *pszPassword = POP3S.szPassword; int iAuthResult = UAthAuthenticateUser(AUTH_SERVICE_POP3, POP3S.szSvrDomain, POP3S.szUser, POP3S.szPassword); if (iAuthResult < 0) { if (iAuthResult != ERR_NO_EXTERNAL_AUTH_DEFINED) { ErrorPush(); POP3HandleBadLogin(hBSock, POP3S); return ErrorPop(); } } else pszPassword = NULL; /* Do APOP authentication ( only if the external one is not performed ) */ if (pszPassword != NULL && UPopAuthenticateAPOP(POP3S.szSvrDomain, POP3S.szUser, POP3S.szTimeStamp, pszPassword) < 0) { ErrorPush(); POP3HandleBadLogin(hBSock, POP3S); return ErrorPop(); } /* Create POP3 session ( the NULL as third parameter force to not perform */ /* user authentication that has been done before ) */ if ((POP3S.hPOPSession = UPopBuildSession(POP3S.szSvrDomain, POP3S.szUser, NULL, &POP3S.PeerInfo)) == INVALID_POP3_HANDLE) { ErrorPush(); POP3HandleBadLogin(hBSock, POP3S); return ErrorPop(); } /* Save the user connection IP to use for SMTP authentication */ UPopSaveUserIP(POP3S.hPOPSession); POP3S.iPOP3State = stateLogged; int iMsgCount = UPopGetSessionMsgCurrent(POP3S.hPOPSession); SYS_OFF_T llMBSize = UPopGetSessionMBSize(POP3S.hPOPSession); /* Log POP3 session */ if (POP3LogEnabled(POP3S.pThCfg->hThShb, POP3S.pPOP3Cfg)) POP3LogSession(POP3S, "LOGIN", "\t\"%d\"" "\t\"" SYS_OFFT_FMT "\"", iMsgCount, llMBSize); BSckVSendString(hBSock, POP3S.pPOP3Cfg->iTimeout, "+OK Maildrop has %d messages (" SYS_OFFT_FMT " bytes)", iMsgCount, llMBSize); return 0; } static int POP3HandleCmd_CAPA(char const *pszCommand, BSOCK_HANDLE hBSock, POP3Session &POP3S) { char const *pszSTLS = ""; if (SvrTestConfigFlag("EnablePOP3-TLS", true, POP3S.hSvrConfig) && strcmp(BSckBioName(hBSock), BSSL_BIO_NAME) != 0) pszSTLS = "STLS\r\n"; BSckVSendString(hBSock, POP3S.pPOP3Cfg->iTimeout, "+OK Capability list follows\r\n" "TOP\r\n" "USER\r\n" "UIDL\r\n" "PIPELINING\r\n" "%s" "IMPLEMENTATION " POP3_SERVER_NAME "\r\n" ".", pszSTLS); return 0; } static int POP3SslEnvCB(void *pPrivate, int iID, void const *pData) { POP3Session *pPOP3S = (POP3Session *) pPrivate; /* * Empty for now ... */ return 0; } static int POP3HandleCmd_STLS(char const *pszCommand, BSOCK_HANDLE hBSock, POP3Session &POP3S) { if (POP3S.iPOP3State != stateInit) { BSckSendString(hBSock, "-ERR Command not valid here", POP3S.pPOP3Cfg->iTimeout); return -1; } if (strcmp(BSckBioName(hBSock), BSSL_BIO_NAME) == 0) { /* * Client is trying to run another STLS after a successful one. * Not possible ... */ BSckSendString(hBSock, "-ERR Command not permitted when TLS active", POP3S.pPOP3Cfg->iTimeout); return -1; } if (!SvrTestConfigFlag("EnablePOP3-TLS", true, POP3S.hSvrConfig)) { BSckSendString(hBSock, "-ERR Command disabled", POP3S.pPOP3Cfg->iTimeout); ErrSetErrorCode(ERR_SSL_DISABLED); return ERR_SSL_DISABLED; } int iError; SslServerBind SSLB; if (CSslBindSetup(&SSLB) < 0) { BSckSendString(hBSock, "-ERR Server TLS setup error", POP3S.pPOP3Cfg->iTimeout); return -1; } BSckSendString(hBSock, "+OK Begin TLS negotiation", POP3S.pPOP3Cfg->iTimeout); iError = BSslBindServer(hBSock, &SSLB, POP3SslEnvCB, &POP3S); CSslBindCleanup(&SSLB); if (iError < 0) { char szIP[128] = ""; SysLogMessage(LOG_LEV_MESSAGE, "POP3 failed to STLS [%s]\n", SysInetNToA(POP3S.PeerInfo, szIP, sizeof(szIP))); /* * We have no other option than exit here ... */ POP3S.iPOP3State = stateExit; return iError; } return 0; } static int POP3HandleCmd_STAT(char const *pszCommand, BSOCK_HANDLE hBSock, POP3Session &POP3S) { if (POP3S.iPOP3State != stateLogged) { BSckSendString(hBSock, "-ERR Command not valid here", POP3S.pPOP3Cfg->iTimeout); return -1; } int iMsgCount = UPopGetSessionMsgCurrent(POP3S.hPOPSession); SYS_OFF_T llMBSize = UPopGetSessionMBSize(POP3S.hPOPSession); BSckVSendString(hBSock, POP3S.pPOP3Cfg->iTimeout, "+OK %d " SYS_OFFT_FMT, iMsgCount, llMBSize); return 0; } static int POP3HandleCmd_LIST(char const *pszCommand, BSOCK_HANDLE hBSock, POP3Session &POP3S) { if (POP3S.iPOP3State != stateLogged) { BSckSendString(hBSock, "-ERR Command not valid here", POP3S.pPOP3Cfg->iTimeout); return -1; } int iMsgIndex = -1; int iNumArgs = sscanf(pszCommand, "%*s %d", &iMsgIndex); if (iNumArgs < 1) { int iMsgCount = UPopGetSessionMsgCurrent(POP3S.hPOPSession); int iMsgTotal = UPopGetSessionMsgTotal(POP3S.hPOPSession); SYS_OFF_T llMBSize = UPopGetSessionMBSize(POP3S.hPOPSession); BSckVSendString(hBSock, POP3S.pPOP3Cfg->iTimeout, "+OK %d " SYS_OFFT_FMT, iMsgCount, llMBSize); for (int i = 0; i < iMsgTotal; i++) { SYS_OFF_T llMessageSize = 0; if (UPopGetMessageSize(POP3S.hPOPSession, i + 1, llMessageSize) == 0) BSckVSendString(hBSock, POP3S.pPOP3Cfg->iTimeout, "%d " SYS_OFFT_FMT, i + 1, llMessageSize); } BSckSendString(hBSock, ".", POP3S.pPOP3Cfg->iTimeout); } else { SYS_OFF_T llMessageSize = 0; if (UPopGetMessageSize(POP3S.hPOPSession, iMsgIndex, llMessageSize) < 0) BSckSendString(hBSock, "-ERR No such message", POP3S.pPOP3Cfg->iTimeout); else BSckVSendString(hBSock, POP3S.pPOP3Cfg->iTimeout, "+OK %d " SYS_OFFT_FMT, iMsgIndex, llMessageSize); } return 0; } static int POP3HandleCmd_UIDL(char const *pszCommand, BSOCK_HANDLE hBSock, POP3Session &POP3S) { if (POP3S.iPOP3State != stateLogged) { BSckSendString(hBSock, "-ERR Command not valid here", POP3S.pPOP3Cfg->iTimeout); return -1; } int iMsgIndex = -1; int iNumArgs = sscanf(pszCommand, "%*s %d", &iMsgIndex); char szMessageUIDL[256]; if (iNumArgs < 1) { int iMsgCount = UPopGetSessionMsgCurrent(POP3S.hPOPSession); int iMsgTotal = UPopGetSessionMsgTotal(POP3S.hPOPSession); BSckVSendString(hBSock, POP3S.pPOP3Cfg->iTimeout, "+OK %d", iMsgCount); for (int i = 0; i < iMsgTotal; i++) { if (UPopGetMessageUIDL(POP3S.hPOPSession, i + 1, szMessageUIDL, sizeof(szMessageUIDL)) == 0) BSckVSendString(hBSock, POP3S.pPOP3Cfg->iTimeout, "%d %s", i + 1, szMessageUIDL); } BSckSendString(hBSock, ".", POP3S.pPOP3Cfg->iTimeout); } else { if (UPopGetMessageUIDL(POP3S.hPOPSession, iMsgIndex, szMessageUIDL, sizeof(szMessageUIDL)) < 0) BSckSendString(hBSock, "-ERR No such message", POP3S.pPOP3Cfg->iTimeout); else BSckVSendString(hBSock, POP3S.pPOP3Cfg->iTimeout, "+OK %d %s", iMsgIndex, szMessageUIDL); } return 0; } static int POP3HandleCmd_QUIT(char const *pszCommand, BSOCK_HANDLE hBSock, POP3Session &POP3S) { POP3S.iPOP3State = stateExit; BSckVSendString(hBSock, POP3S.pPOP3Cfg->iTimeout, "+OK %s closing session", POP3_SERVER_NAME); return 0; } static int POP3HandleCmd_RETR(char const *pszCommand, BSOCK_HANDLE hBSock, POP3Session &POP3S) { if (POP3S.iPOP3State != stateLogged) { BSckSendString(hBSock, "-ERR Command not valid here", POP3S.pPOP3Cfg->iTimeout); return -1; } int iMsgIndex = -1; if (sscanf(pszCommand, "%*s %d", &iMsgIndex) < 1) { BSckSendString(hBSock, "-ERR Invalid syntax", POP3S.pPOP3Cfg->iTimeout); return -1; } return UPopSessionSendMsg(POP3S.hPOPSession, iMsgIndex, hBSock); } static int POP3HandleCmd_TOP(char const *pszCommand, BSOCK_HANDLE hBSock, POP3Session &POP3S) { if (POP3S.iPOP3State != stateLogged) { BSckSendString(hBSock, "-ERR Command not valid here", POP3S.pPOP3Cfg->iTimeout); return -1; } int iMsgIndex = -1, iNumLines = 0; if (sscanf(pszCommand, "%*s %d %d", &iMsgIndex, &iNumLines) < 2) { BSckSendString(hBSock, "-ERR Invalid syntax", POP3S.pPOP3Cfg->iTimeout); return -1; } return UPopSessionTopMsg(POP3S.hPOPSession, iMsgIndex, iNumLines, hBSock); } static int POP3HandleCmd_DELE(char const *pszCommand, BSOCK_HANDLE hBSock, POP3Session &POP3S) { if (POP3S.iPOP3State != stateLogged) { BSckSendString(hBSock, "-ERR Command not valid here", POP3S.pPOP3Cfg->iTimeout); return -1; } int iMsgIndex = -1; if (sscanf(pszCommand, "%*s %d", &iMsgIndex) < 1) { BSckSendString(hBSock, "-ERR Invalid syntax", POP3S.pPOP3Cfg->iTimeout); return -1; } if (UPopDeleteMessage(POP3S.hPOPSession, iMsgIndex) < 0) { UPopSendErrorResponse(hBSock, ErrGetErrorCode(), POP3S.pPOP3Cfg->iTimeout); return ErrGetErrorCode(); } BSckSendString(hBSock, "+OK Message deleted", POP3S.pPOP3Cfg->iTimeout); return 0; } static int POP3HandleCmd_NOOP(char const *pszCommand, BSOCK_HANDLE hBSock, POP3Session &POP3S) { if (POP3S.iPOP3State != stateLogged) { BSckSendString(hBSock, "-ERR Command not valid here", POP3S.pPOP3Cfg->iTimeout); return -1; } int iMsgCount = UPopGetSessionMsgCurrent(POP3S.hPOPSession); SYS_OFF_T llMBSize = UPopGetSessionMBSize(POP3S.hPOPSession); BSckVSendString(hBSock, POP3S.pPOP3Cfg->iTimeout, "+OK Maildrop has %d messages (" SYS_OFFT_FMT " bytes)", iMsgCount, llMBSize); return 0; } static int POP3HandleCmd_LAST(char const *pszCommand, BSOCK_HANDLE hBSock, POP3Session &POP3S) { if (POP3S.iPOP3State != stateLogged) { BSckSendString(hBSock, "-ERR Command not valid here", POP3S.pPOP3Cfg->iTimeout); return -1; } int iMsgLast = UPopGetSessionLastAccessed(POP3S.hPOPSession); BSckVSendString(hBSock, POP3S.pPOP3Cfg->iTimeout, "+OK %d", iMsgLast); return 0; } static int POP3HandleCmd_RSET(char const *pszCommand, BSOCK_HANDLE hBSock, POP3Session &POP3S) { if (POP3S.iPOP3State != stateLogged) { BSckSendString(hBSock, "-ERR Command not valid here", POP3S.pPOP3Cfg->iTimeout); return -1; } UPopResetSession(POP3S.hPOPSession); int iMsgCount = UPopGetSessionMsgCurrent(POP3S.hPOPSession); SYS_OFF_T llMBSize = UPopGetSessionMBSize(POP3S.hPOPSession); BSckVSendString(hBSock, POP3S.pPOP3Cfg->iTimeout, "+OK Maildrop has %d messages (" SYS_OFFT_FMT " bytes)", iMsgCount, llMBSize); return 0; } static int POP3HandleCommand(char const *pszCommand, BSOCK_HANDLE hBSock, POP3Session &POP3S) { int iCmdResult = -1; if (StrCmdMatch(pszCommand, "USER")) iCmdResult = POP3HandleCmd_USER(pszCommand, hBSock, POP3S); else if (StrCmdMatch(pszCommand, "PASS")) iCmdResult = POP3HandleCmd_PASS(pszCommand, hBSock, POP3S); else if (StrCmdMatch(pszCommand, "APOP")) iCmdResult = POP3HandleCmd_APOP(pszCommand, hBSock, POP3S); else if (StrCmdMatch(pszCommand, "CAPA")) iCmdResult = POP3HandleCmd_CAPA(pszCommand, hBSock, POP3S); else if (StrCmdMatch(pszCommand, "STLS")) iCmdResult = POP3HandleCmd_STLS(pszCommand, hBSock, POP3S); else if (StrCmdMatch(pszCommand, "STAT")) iCmdResult = POP3HandleCmd_STAT(pszCommand, hBSock, POP3S); else if (StrCmdMatch(pszCommand, "LIST")) iCmdResult = POP3HandleCmd_LIST(pszCommand, hBSock, POP3S); else if (StrCmdMatch(pszCommand, "UIDL")) iCmdResult = POP3HandleCmd_UIDL(pszCommand, hBSock, POP3S); else if (StrCmdMatch(pszCommand, "QUIT")) iCmdResult = POP3HandleCmd_QUIT(pszCommand, hBSock, POP3S); else if (StrCmdMatch(pszCommand, "RETR")) iCmdResult = POP3HandleCmd_RETR(pszCommand, hBSock, POP3S); else if (StrCmdMatch(pszCommand, "TOP")) iCmdResult = POP3HandleCmd_TOP(pszCommand, hBSock, POP3S); else if (StrCmdMatch(pszCommand, "DELE")) iCmdResult = POP3HandleCmd_DELE(pszCommand, hBSock, POP3S); else if (StrCmdMatch(pszCommand, "NOOP")) iCmdResult = POP3HandleCmd_NOOP(pszCommand, hBSock, POP3S); else if (StrCmdMatch(pszCommand, "LAST")) iCmdResult = POP3HandleCmd_LAST(pszCommand, hBSock, POP3S); else if (StrCmdMatch(pszCommand, "RSET")) iCmdResult = POP3HandleCmd_RSET(pszCommand, hBSock, POP3S); else BSckSendString(hBSock, "-ERR Invalid command", POP3S.pPOP3Cfg->iTimeout); return iCmdResult; } static int POP3HandleSession(ThreadConfig const *pThCfg, BSOCK_HANDLE hBSock) { /* Session structure declaration and init */ POP3Session POP3S; if (POP3InitSession(pThCfg, hBSock, POP3S) < 0) { ErrorPush(); UPopSendErrorResponse(hBSock, ErrGetErrorCode(), STD_POP3_TIMEOUT); return ErrorPop(); } char szIP[128] = "???.???.???.???"; SysLogMessage(LOG_LEV_MESSAGE, "POP3 client connection from [%s]\n", SysInetNToA(POP3S.PeerInfo, szIP, sizeof(szIP))); /* Send welcome message */ char szTime[256] = ""; MscGetTimeStr(szTime, sizeof(szTime) - 1); if (BSckVSendString(hBSock, POP3S.pPOP3Cfg->iTimeout, "+OK %s %s service ready; %s", POP3S.szTimeStamp, POP3_SERVER_NAME, szTime) < 0) { POP3ClearSession(POP3S); return ErrGetErrorCode(); } /* Command loop */ char szCommand[1024] = ""; while (!SvrInShutdown() && POP3S.iPOP3State != stateExit && BSckGetString(hBSock, szCommand, sizeof(szCommand) - 1, POP3S.pPOP3Cfg->iSessionTimeout) != NULL && MscCmdStringCheck(szCommand) == 0) { if (pThCfg->ulFlags & THCF_SHUTDOWN) break; /* Handle coomand */ POP3HandleCommand(szCommand, hBSock, POP3S); } SysLogMessage(LOG_LEV_MESSAGE, "POP3 client exit [%s]\n", SysInetNToA(POP3S.PeerInfo, szIP, sizeof(szIP))); POP3ClearSession(POP3S); return 0; } unsigned int POP3ClientThread(void *pThreadData) { ThreadCreateCtx *pThCtx = (ThreadCreateCtx *) pThreadData; /* Link socket to the bufferer */ BSOCK_HANDLE hBSock = BSckAttach(pThCtx->SockFD); if (hBSock == INVALID_BSOCK_HANDLE) { ErrorPush(); SysCloseSocket(pThCtx->SockFD); SysFree(pThCtx); return ErrorPop(); } /* * Do we need to switch to TLS? */ if (pThCtx->pThCfg->ulFlags & THCF_USE_SSL) { int iError; SslServerBind SSLB; SslBindEnv SslE; if (CSslBindSetup(&SSLB) < 0) { ErrorPush(); BSckDetach(hBSock, 1); SysFree(pThCtx); return ErrorPop(); } ZeroData(SslE); iError = BSslBindServer(hBSock, &SSLB, MscSslEnvCB, &SslE); CSslBindCleanup(&SSLB); if (iError < 0) { ErrorPush(); BSckDetach(hBSock, 1); SysFree(pThCtx); return ErrorPop(); } /* * We may want to add verify code here ... */ SysFree(SslE.pszIssuer); SysFree(SslE.pszSubject); } /* Check IP permission */ if (POP3CheckPeerIP(pThCtx->SockFD) < 0) { ErrorPush(); UPopSendErrorResponse(hBSock, ErrGetErrorCode(), STD_POP3_TIMEOUT); BSckDetach(hBSock, 1); SysFree(pThCtx); return ErrorPop(); } /* Increase threads count */ if (POP3ThreadCountAdd(+1, pThCtx->pThCfg->hThShb) < 0) { ErrorPush(); SysLogMessage(LOG_LEV_ERROR, "%s (POP3 thread count)\n", ErrGetErrorString(ErrorFetch())); UPopSendErrorResponse(hBSock, ErrGetErrorCode(), STD_POP3_TIMEOUT); BSckDetach(hBSock, 1); SysFree(pThCtx); return ErrorPop(); } /* Handle client session */ POP3HandleSession(pThCtx->pThCfg, hBSock); /* Decrease threads count */ POP3ThreadCountAdd(-1, pThCtx->pThCfg->hThShb); /* Unlink socket from the bufferer and close it */ BSckDetach(hBSock, 1); SysFree(pThCtx); return 0; } xmail-1.27/DNSCache.h0000644000175000017500000000216611341640430013551 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _DNSCACHE_H #define _DNSCACHE_H #define DNS_HASH_NUM_DIRS 101 int CDNS_Initialize(int iCacheDirCount = DNS_HASH_NUM_DIRS); int CDNS_GetDomainMX(char const *pszDomain, char *&pszMXDomains, char const *pszSmartDNS = NULL); #endif xmail-1.27/sysv_inst.sh0000755000175000017500000000104711341640430014425 0ustar davidedavide#!/bin/sh SYSVD=/etc/rc.d/init.d RCD=/etc/rc.d if [ ! -d "$SYSVD" ]; then echo "SysV init directory does not exist: $SYSVD" exit 1 fi if [ ! -d "$RCD" ]; then echo "SysV RC init directory does not exist: $RCD" exit 2 fi cp xmail $SYSVD ln -s ../init.d/xmail $RCD/rc0.d/K10xmail ln -s ../init.d/xmail $RCD/rc1.d/K10xmail ln -s ../init.d/xmail $RCD/rc2.d/K10xmail ln -s ../init.d/xmail $RCD/rc6.d/K10xmail ln -s ../init.d/xmail $RCD/rc3.d/S90xmail ln -s ../init.d/xmail $RCD/rc4.d/S90xmail ln -s ../init.d/xmail $RCD/rc5.d/S90xmail xmail-1.27/SysIncludeLinux.h0000644000175000017500000000340511341640430015300 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SYSINCLUDELINUX_H #define _SYSINCLUDELINUX_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAS_EVENTFD #include #endif #endif xmail-1.27/SMAILSvr.cpp0000644000175000017500000013752611341640430014105 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "SList.h" #include "ShBlocks.h" #include "StrUtils.h" #include "BuffSock.h" #include "MiscUtils.h" #include "ResLocks.h" #include "BuffSock.h" #include "SvrUtils.h" #include "UsrUtils.h" #include "MessQueue.h" #include "SMAILUtils.h" #include "QueueUtils.h" #include "MailDomains.h" #include "AliasDomain.h" #include "SMTPUtils.h" #include "ExtAliases.h" #include "UsrMailList.h" #include "Filter.h" #include "DNS.h" #include "MailConfig.h" #include "SMAILSvr.h" #include "AppDefines.h" #include "MailSvr.h" #define SMAIL_WAITMSG_TIMEOUT 2000 #define CUSTOM_PROC_LINE_MAX 1024 #define SMAIL_EXTERNAL_EXIT_BREAK 16 #define SMAIL_STOP_PROCESSING 3111965L struct MacroSubstCtx { SPLF_HANDLE hFSpool; FileSection FSect; }; static int SMAILThreadCountAdd(long lCount, SHB_HANDLE hShbSMAIL, SMAILConfig *pSMAILCfg = NULL); static int SMAILLogEnabled(SHB_HANDLE hShbSMAIL, SMAILConfig *pSMAILCfg = NULL); static SMAILConfig *SMAILGetConfigCopy(SHB_HANDLE hShbSMAIL) { SMAILConfig *pLMAILCfg = (SMAILConfig *) ShbLock(hShbSMAIL); if (pLMAILCfg == NULL) return NULL; SMAILConfig *pNewLMAILCfg = (SMAILConfig *) SysAlloc(sizeof(SMAILConfig)); if (pNewLMAILCfg != NULL) memcpy(pNewLMAILCfg, pLMAILCfg, sizeof(SMAILConfig)); ShbUnlock(hShbSMAIL); return pNewLMAILCfg; } static int SMAILThreadCountAdd(long lCount, SHB_HANDLE hShbSMAIL, SMAILConfig *pSMAILCfg) { int iDoUnlock = 0; if (pSMAILCfg == NULL) { if ((pSMAILCfg = (SMAILConfig *) ShbLock(hShbSMAIL)) == NULL) return ErrGetErrorCode(); ++iDoUnlock; } pSMAILCfg->lThreadCount += lCount; if (iDoUnlock) ShbUnlock(hShbSMAIL); return 0; } static int SMAILLogEnabled(SHB_HANDLE hShbSMAIL, SMAILConfig *pSMAILCfg) { int iDoUnlock = 0; if (pSMAILCfg == NULL) { if ((pSMAILCfg = (SMAILConfig *) ShbLock(hShbSMAIL)) == NULL) return ErrGetErrorCode(); ++iDoUnlock; } unsigned long ulFlags = pSMAILCfg->ulFlags; if (iDoUnlock) ShbUnlock(hShbSMAIL); return (ulFlags & SMAILF_LOG_ENABLED) ? 1: 0; } static int SMAILHandleResendNotify(SVRCFG_HANDLE hSvrConfig, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, SPLF_HANDLE hFSpool) { /* Check if it's time to notify about a failed delivery attempt */ int iRetryCount = QueGetTryCount(hMessage); char szNotifyPattern[128]; SvrConfigVar("NotifyTryPattern", szNotifyPattern, sizeof(szNotifyPattern) - 1, hSvrConfig, ""); for (char *pszTry = szNotifyPattern; pszTry != NULL; ++pszTry) { if (isdigit(*pszTry) && atoi(pszTry) == iRetryCount) break; if ((pszTry = strchr(pszTry, ',')) == NULL) return 0; } /* Build the notification text and send the message */ time_t tLastTry = QueGetLastTryTime(hMessage); time_t tNextTry = QueGetMessageNextOp(hQueue, hMessage); char szTimeLast[128]; char szTimeNext[128]; MscGetTimeStr(szTimeLast, sizeof(szTimeLast) - 1, tLastTry); MscGetTimeStr(szTimeNext, sizeof(szTimeNext) - 1, tNextTry); char *pszText = StrSprint("** This is a temporary error and you do not have to resend the message\r\n" "** The system tried to send the message at : %s\r\n" "** The current number of delivery attempts is : %d\r\n" "** The system will try to resend the message at : %s\r\n", szTimeLast, iRetryCount, szTimeNext); if (pszText == NULL) return ErrGetErrorCode(); int iNotifyResult = QueUtNotifyTempErrDelivery(hQueue, hMessage, hFSpool, NULL, pszText, NULL); SysFree(pszText); return iNotifyResult; } static int SMAILMailingListExplode(UserInfo *pUI, SPLF_HANDLE hFSpool) { char const *const *ppszFrom = USmlGetMailFrom(hFSpool); char const *const *ppszRcpt = USmlGetRcptTo(hFSpool); char szDestUser[MAX_ADDR_NAME]; char szDestDomain[MAX_ADDR_NAME]; if (USmtpSplitEmailAddr(ppszRcpt[0], szDestUser, szDestDomain) < 0) return ErrGetErrorCode(); /* Get Mailing List Sender address. If this account variable does not exist */ /* the sender will be the "real" message sender */ char *pszMLSender = UsrGetUserInfoVar(pUI, "ListSender"); /* Check if the use of the Reply-To: is requested */ int iUseReplyTo = UsrGetUserInfoVarInt(pUI, "UseReplyTo", 1); USRML_HANDLE hUsersDB = UsrMLOpenDB(pUI); if (hUsersDB == INVALID_USRML_HANDLE) { ErrorPush(); SysFree(pszMLSender); return ErrorPop(); } /* Mailing list scan */ MLUserInfo *pMLUI = UsrMLGetFirstUser(hUsersDB); for (; pMLUI != NULL; pMLUI = UsrMLGetNextUser(hUsersDB)) { if (strchr(pMLUI->pszPerms, 'R') != NULL) { /* Get message handle */ QMSG_HANDLE hMessage = QueCreateMessage(hSpoolQueue); if (hMessage == INVALID_QMSG_HANDLE) { ErrorPush(); SysFree(pszMLSender); UsrMLFreeUser(pMLUI); UsrMLCloseDB(hUsersDB); return ErrorPop(); } char szQueueFilePath[SYS_MAX_PATH]; QueGetFilePath(hSpoolQueue, hMessage, szQueueFilePath); /* Create spool file. If "pszMLSender" is NULL the original sender is kept */ if (USmlCreateSpoolFile(hFSpool, pszMLSender, pMLUI->pszAddress, szQueueFilePath, (iUseReplyTo != 0) ? "Reply-To" : "", ppszRcpt[0], NULL) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); SysFree(pszMLSender); UsrMLFreeUser(pMLUI); UsrMLCloseDB(hUsersDB); return ErrorPop(); } /* Transfer file to the spool */ if (QueCommitMessage(hSpoolQueue, hMessage) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); SysFree(pszMLSender); UsrMLFreeUser(pMLUI); UsrMLCloseDB(hUsersDB); return ErrorPop(); } } UsrMLFreeUser(pMLUI); } UsrMLCloseDB(hUsersDB); SysFree(pszMLSender); return 0; } static int SMAILRemoteMsgSMTPSend(SVRCFG_HANDLE hSvrConfig, SHB_HANDLE hShbSMAIL, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char const *pszDestDomain, SMTPError *pSMTPE) { /* Apply filters ... */ if (FilFilterMessage(hFSpool, hQueue, hMessage, FILTER_MODE_OUTBOUND) < 0) return ErrGetErrorCode(); int iError; char const *pszSMTPDomain = USmlGetSMTPDomain(hFSpool); char const *pszSmtpMessageID = USmlGetSmtpMessageID(hFSpool); char const *pszSpoolFile = USmlGetSpoolFile(hFSpool); char const *pszSpoolFilePath = USmlGetSpoolFilePath(hFSpool); char const *pszMailFrom = USmlMailFrom(hFSpool); char const *pszSendMailFrom = USmlSendMailFrom(hFSpool); char const *pszRcptTo = USmlRcptTo(hFSpool); char const *pszSendRcptTo = USmlSendRcptTo(hFSpool); char const *pszRelayDomain = USmlGetRelayDomain(hFSpool); FileSection FSect; /* This function retrieve the spool file message section and sync the content. */ /* This is necessary before sending the file */ if (USmlGetMsgFileSection(hFSpool, FSect) < 0) return ErrGetErrorCode(); /* Get HELO domain */ char szHeloDomain[MAX_HOST_NAME]; SvrConfigVar("HeloDomain", szHeloDomain, sizeof(szHeloDomain) - 1, hSvrConfig, ""); char const *pszHeloDomain = IsEmptyString(szHeloDomain) ? NULL: szHeloDomain; /* If it's a relayed message use the associated relay */ if (pszRelayDomain != NULL) { SysLogMessage(LOG_LEV_MESSAGE, "SMAIL SMTP-Send CMX = \"%s\" SMTP = \"%s\" From = \"%s\" To = \"%s\"\n", pszRelayDomain, pszSMTPDomain, pszMailFrom, pszRcptTo); USmtpCleanupError(pSMTPE); if (USmtpMailRmtDeliver(hSvrConfig, pszRelayDomain, pszHeloDomain, pszSendMailFrom, pszSendRcptTo, &FSect, pSMTPE) < 0) { ErrorPush(); char szSmtpError[512]; USmtpGetSMTPError(pSMTPE, szSmtpError, sizeof(szSmtpError)); ErrLogMessage(LOG_LEV_MESSAGE, "SMAIL SMTP-Send CMX = \"%s\" SMTP = \"%s\" " "From = \"%s\" To = \"%s\" Failed !\n" "%s = \"%s\"\n" "%s = \"%s\"\n", pszRelayDomain, pszSMTPDomain, pszMailFrom, pszRcptTo, SMTP_ERROR_VARNAME, szSmtpError, SMTP_SERVER_VARNAME, USmtpGetErrorServer(pSMTPE)); QueUtErrLogMessage(hQueue, hMessage, "SMAIL SMTP-Send CMX = \"%s\" SMTP = \"%s\" " "From = \"%s\" To = \"%s\" Failed !\n" "%s = \"%s\"\n" "%s = \"%s\"\n", pszRelayDomain, pszSMTPDomain, pszMailFrom, pszRcptTo, SMTP_ERROR_VARNAME, szSmtpError, SMTP_SERVER_VARNAME, USmtpGetErrorServer(pSMTPE)); return ErrorPop(); } if (SMAILLogEnabled(hShbSMAIL)) { char szRmtMsgID[256]; USmtpGetSMTPRmtMsgID(USmtpGetErrorMessage(pSMTPE), szRmtMsgID, sizeof(szRmtMsgID)); USmlLogMessage(hFSpool, "SMTP", szRmtMsgID, pszRelayDomain); } return 0; } /* Check the existance of direct SMTP forwarders */ SMTPGateway **ppszFwdGws = USmtpGetFwdGateways(hSvrConfig, pszDestDomain); if (ppszFwdGws != NULL) { /* * By initializing this to zero makes XMail to discharge all mail * for domains that have an empty forwarders list */ iError = 0; for (int i = 0; ppszFwdGws[i] != NULL; i++) { SysLogMessage(LOG_LEV_MESSAGE, "SMAIL SMTP-Send FWD = \"%s\" SMTP = \"%s\" From = \"%s\" To = \"%s\"\n", ppszFwdGws[i]->pszHost, pszSMTPDomain, pszMailFrom, pszRcptTo); USmtpCleanupError(pSMTPE); if ((iError = USmtpSendMail(ppszFwdGws[i], pszHeloDomain, pszSendMailFrom, pszSendRcptTo, &FSect, pSMTPE)) == 0) { /* Log Mailer operation */ if (SMAILLogEnabled(hShbSMAIL)) { char szRmtMsgID[256]; USmtpGetSMTPRmtMsgID(USmtpGetErrorMessage(pSMTPE), szRmtMsgID, sizeof(szRmtMsgID)); USmlLogMessage(hFSpool, "FWD", szRmtMsgID, ppszFwdGws[i]->pszHost); } break; } char szSmtpError[512]; USmtpGetSMTPError(pSMTPE, szSmtpError, sizeof(szSmtpError)); ErrLogMessage(LOG_LEV_MESSAGE, "SMAIL SMTP-Send FWD = \"%s\" SMTP = \"%s\" " "From = \"%s\" To = \"%s\" Failed !\n" "%s = \"%s\"\n" "%s = \"%s\"\n", ppszFwdGws[i]->pszHost, pszSMTPDomain, pszMailFrom, pszRcptTo, SMTP_ERROR_VARNAME, szSmtpError, SMTP_SERVER_VARNAME, USmtpGetErrorServer(pSMTPE)); QueUtErrLogMessage(hQueue, hMessage, "SMAIL SMTP-Send FWD = \"%s\" SMTP = \"%s\" " "From = \"%s\" To = \"%s\" Failed !\n" "%s = \"%s\"\n" "%s = \"%s\"\n", ppszFwdGws[i]->pszHost, pszSMTPDomain, pszMailFrom, pszRcptTo, SMTP_ERROR_VARNAME, szSmtpError, SMTP_SERVER_VARNAME, USmtpGetErrorServer(pSMTPE)); if (USmtpIsFatalError(pSMTPE)) break; } USmtpFreeGateways(ppszFwdGws); return iError; } /* Try to get custom mail exchangers or DNS mail exchangers and if both tests */ /* fails try direct */ SMTPGateway **ppMXGWs = USmtpGetMailExchangers(hSvrConfig, pszDestDomain); if (ppMXGWs == NULL) { /* If the destination domain is an IP-domain do direct deliver */ char szIP[64]; if (MscIsIPDomain(pszDestDomain, szIP, sizeof(szIP))) { SysLogMessage(LOG_LEV_MESSAGE, "Direct IP delivery for \"%s\".\n", szIP); SysLogMessage(LOG_LEV_MESSAGE, "SMAIL SMTP-Send IP = \"%s\" SMTP = \"%s\" From = \"%s\" To = \"%s\"\n", szIP, pszSMTPDomain, pszMailFrom, pszRcptTo); USmtpCleanupError(pSMTPE); if (USmtpMailRmtDeliver(hSvrConfig, szIP, pszHeloDomain, pszSendMailFrom, pszSendRcptTo, &FSect, pSMTPE) < 0) { ErrorPush(); char szSmtpError[512]; USmtpGetSMTPError(pSMTPE, szSmtpError, sizeof(szSmtpError)); ErrLogMessage(LOG_LEV_MESSAGE, "SMAIL SMTP-Send IP = \"%s\" SMTP = \"%s\" " "From = \"%s\" To = \"%s\" Failed !\n" "%s = \"%s\"\n" "%s = \"%s\"\n", szIP, pszSMTPDomain, pszMailFrom, pszRcptTo, SMTP_ERROR_VARNAME, szSmtpError, SMTP_SERVER_VARNAME, USmtpGetErrorServer(pSMTPE)); QueUtErrLogMessage(hQueue, hMessage, "SMAIL SMTP-Send IP = \"%s\" SMTP = \"%s\" " "From = \"%s\" To = \"%s\" Failed !\n" "%s = \"%s\"\n" "%s = \"%s\"\n", szIP, pszSMTPDomain, pszMailFrom, pszRcptTo, SMTP_ERROR_VARNAME, szSmtpError, SMTP_SERVER_VARNAME, USmtpGetErrorServer(pSMTPE)); return ErrorPop(); } /* Log Mailer operation */ if (SMAILLogEnabled(hShbSMAIL)) { char szRmtMsgID[256]; USmtpGetSMTPRmtMsgID(USmtpGetErrorMessage(pSMTPE), szRmtMsgID, sizeof(szRmtMsgID)); USmlLogMessage(hFSpool, "SMTP", szRmtMsgID, szIP); } return 0; } /* Do DNS MX lookup and send to mail exchangers */ char szDomainMXHost[MAX_HOST_NAME]; MXS_HANDLE hMXSHandle = USmtpGetMXFirst(hSvrConfig, pszDestDomain, szDomainMXHost); if (hMXSHandle != INVALID_MXS_HANDLE) { iError = 0; do { SysLogMessage(LOG_LEV_MESSAGE, "SMAIL SMTP-Send MX = \"%s\" SMTP = \"%s\" " "From = \"%s\" To = \"%s\"\n", szDomainMXHost, pszSMTPDomain, pszMailFrom, pszRcptTo); USmtpCleanupError(pSMTPE); if ((iError = USmtpMailRmtDeliver(hSvrConfig, szDomainMXHost, pszHeloDomain, pszSendMailFrom, pszSendRcptTo, &FSect, pSMTPE)) == 0) { /* Log Mailer operation */ if (SMAILLogEnabled(hShbSMAIL)) { char szRmtMsgID[256]; USmtpGetSMTPRmtMsgID(USmtpGetErrorMessage(pSMTPE), szRmtMsgID, sizeof(szRmtMsgID)); USmlLogMessage(hFSpool, "SMTP", szRmtMsgID, szDomainMXHost); } break; } char szSmtpError[512]; USmtpGetSMTPError(pSMTPE, szSmtpError, sizeof(szSmtpError)); ErrLogMessage(LOG_LEV_MESSAGE, "SMAIL SMTP-Send MX = \"%s\" SMTP = \"%s\" " "From = \"%s\" To = \"%s\" Failed !\n" "%s = \"%s\"\n" "%s = \"%s\"\n", szDomainMXHost, pszSMTPDomain, pszMailFrom, pszRcptTo, SMTP_ERROR_VARNAME, szSmtpError, SMTP_SERVER_VARNAME, USmtpGetErrorServer(pSMTPE)); QueUtErrLogMessage(hQueue, hMessage, "SMAIL SMTP-Send MX = \"%s\" SMTP = \"%s\" " "From = \"%s\" To = \"%s\" Failed !\n" "%s = \"%s\"\n" "%s = \"%s\"\n", szDomainMXHost, pszSMTPDomain, pszMailFrom, pszRcptTo, SMTP_ERROR_VARNAME, szSmtpError, SMTP_SERVER_VARNAME, USmtpGetErrorServer(pSMTPE)); if (USmtpIsFatalError(pSMTPE)) break; } while (USmtpGetMXNext(hMXSHandle, szDomainMXHost) == 0); USmtpMXSClose(hMXSHandle); if (iError < 0) return iError; } else { iError = ErrGetErrorCode(); /* * If the target domain does not exist at all (or it has a * misconfigured DNS), bounce soon without trying the A record. * It's pointless engaging in retry policies when the recipient * domain does not exist. */ if (DNS_FatalError(iError)) { ErrorPush(); /* No account inside the handled domain */ char szBounceMsg[512]; SysSNPrintf(szBounceMsg, sizeof(szBounceMsg) - 1, "Recipient domain \"%s\" does not exist " "(or it has a misconfigured DNS)", pszDestDomain); SysLogMessage(LOG_LEV_MESSAGE, "SMAIL SMTP-Send NXD/EDNS = \"%s\" SMTP = \"%s\" " "From = \"%s\" To = \"%s\" Failed!\n", pszDestDomain, pszSMTPDomain, pszMailFrom, pszRcptTo); QueUtErrLogMessage(hQueue, hMessage, "%s\n", szBounceMsg); QueUtNotifyPermErrDelivery(hQueue, hMessage, hFSpool, szBounceMsg, NULL, true); return ErrorPop(); } /* * Fall back to A record delivery only if the domain has * no MX records. */ if (iError != ERR_DNS_NOTFOUND) { ErrLogMessage(LOG_LEV_MESSAGE, "SMAIL SMTP-Send EDNS = \"%s\" SMTP = \"%s\" " "From = \"%s\" To = \"%s\" Failed !\n" "%s = \"%s\"\n" "%s = \"%s\"\n", pszDestDomain, pszSMTPDomain, pszMailFrom, pszRcptTo, SMTP_ERROR_VARNAME, ErrGetErrorString(iError), SMTP_SERVER_VARNAME, pszDestDomain); QueUtErrLogMessage(hQueue, hMessage, "SMAIL SMTP-Send EDNS = \"%s\" SMTP = \"%s\" " "From = \"%s\" To = \"%s\" Failed !\n" "%s = \"%s\"\n" "%s = \"%s\"\n", pszDestDomain, pszSMTPDomain, pszMailFrom, pszRcptTo, SMTP_ERROR_VARNAME, ErrGetErrorString(iError), SMTP_SERVER_VARNAME, pszDestDomain); return ErrorSet(iError); } /* MX records for destination domain not found, try direct ! */ SysLogMessage(LOG_LEV_MESSAGE, "MX records for domain \"%s\" not found, trying direct.\n", pszDestDomain); SysLogMessage(LOG_LEV_MESSAGE, "SMAIL SMTP-Send FF = \"%s\" SMTP = \"%s\" From = \"%s\" To = \"%s\"\n", pszDestDomain, pszSMTPDomain, pszMailFrom, pszRcptTo); USmtpCleanupError(pSMTPE); if ((iError = USmtpMailRmtDeliver(hSvrConfig, pszDestDomain, pszHeloDomain, pszSendMailFrom, pszSendRcptTo, &FSect, pSMTPE)) < 0) { ErrorPush(); /* * If the A record of the recipient host does not exist, set the * fatal SMTP error so that the caller can properly bounce the * message. */ if (iError == ERR_DNS_NOTFOUND || iError == ERR_BAD_SERVER_ADDR) USmtpSetError(pSMTPE, SMTP_FATAL_ERROR, ErrGetErrorString(iError), pszDestDomain); char szSmtpError[512]; USmtpGetSMTPError(pSMTPE, szSmtpError, sizeof(szSmtpError)); ErrLogMessage(LOG_LEV_MESSAGE, "SMAIL SMTP-Send FF = \"%s\" SMTP = \"%s\" " "From = \"%s\" To = \"%s\" Failed !\n" "%s = \"%s\"\n" "%s = \"%s\"\n", pszDestDomain, pszSMTPDomain, pszMailFrom, pszRcptTo, SMTP_ERROR_VARNAME, szSmtpError, SMTP_SERVER_VARNAME, USmtpGetErrorServer(pSMTPE)); QueUtErrLogMessage(hQueue, hMessage, "SMAIL SMTP-Send FF = \"%s\" SMTP = \"%s\" " "From = \"%s\" To = \"%s\" Failed !\n" "%s = \"%s\"\n" "%s = \"%s\"\n", pszDestDomain, pszSMTPDomain, pszMailFrom, pszRcptTo, SMTP_ERROR_VARNAME, szSmtpError, SMTP_SERVER_VARNAME, USmtpGetErrorServer(pSMTPE)); return ErrorPop(); } /* Log Mailer operation */ if (SMAILLogEnabled(hShbSMAIL)) { char szRmtMsgID[256]; USmtpGetSMTPRmtMsgID(USmtpGetErrorMessage(pSMTPE), szRmtMsgID, sizeof(szRmtMsgID)); USmlLogMessage(hFSpool, "SMTP", szRmtMsgID, pszDestDomain); } } } else { iError = 0; for (int i = 0; ppMXGWs[i] != NULL; i++) { SysLogMessage(LOG_LEV_MESSAGE, "SMAIL SMTP-Send MX = \"%s\" SMTP = \"%s\" From = \"%s\" To = \"%s\"\n", ppMXGWs[i]->pszHost, pszSMTPDomain, pszMailFrom, pszRcptTo); USmtpCleanupError(pSMTPE); if ((iError = USmtpSendMail(ppMXGWs[i], pszHeloDomain, pszSendMailFrom, pszSendRcptTo, &FSect, pSMTPE)) == 0) { /* Log Mailer operation */ if (SMAILLogEnabled(hShbSMAIL)) { char szRmtMsgID[256]; USmtpGetSMTPRmtMsgID(USmtpGetErrorMessage(pSMTPE), szRmtMsgID, sizeof(szRmtMsgID)); USmlLogMessage(hFSpool, "SMTP", szRmtMsgID, ppMXGWs[i]->pszHost); } break; } char szSmtpError[512]; USmtpGetSMTPError(pSMTPE, szSmtpError, sizeof(szSmtpError)); ErrLogMessage(LOG_LEV_MESSAGE, "SMAIL SMTP-Send MX = \"%s\" SMTP = \"%s\" " "From = \"%s\" To = \"%s\" Failed !\n" "%s = \"%s\"\n" "%s = \"%s\"\n", ppMXGWs[i]->pszHost, pszSMTPDomain, pszMailFrom, pszRcptTo, SMTP_ERROR_VARNAME, szSmtpError, SMTP_SERVER_VARNAME, USmtpGetErrorServer(pSMTPE)); QueUtErrLogMessage(hQueue, hMessage, "SMAIL SMTP-Send MX = \"%s\" SMTP = \"%s\" " "From = \"%s\" To = \"%s\" Failed !\n" "%s = \"%s\"\n" "%s = \"%s\"\n", ppMXGWs[i]->pszHost, pszSMTPDomain, pszMailFrom, pszRcptTo, SMTP_ERROR_VARNAME, szSmtpError, SMTP_SERVER_VARNAME, USmtpGetErrorServer(pSMTPE)); if (USmtpIsFatalError(pSMTPE)) break; } USmtpFreeGateways(ppMXGWs); if (iError < 0) return iError; } return 0; } static char *SMAILMacroLkupProc(void *pPrivate, char const *pszName, int iSize) { MacroSubstCtx *pMSC = (MacroSubstCtx *) pPrivate; if (MemMatch(pszName, iSize, "FROM", 4)) { char const *const *ppszFrom = USmlGetMailFrom(pMSC->hFSpool); int iFromDomains = StrStringsCount(ppszFrom); return SysStrDup((iFromDomains > 0) ? ppszFrom[iFromDomains - 1] : ""); } else if (MemMatch(pszName, iSize, "RCPT", 4)) { char const *const *ppszRcpt = USmlGetRcptTo(pMSC->hFSpool); int iRcptDomains = StrStringsCount(ppszRcpt); return SysStrDup((iRcptDomains > 0) ? ppszRcpt[iRcptDomains - 1] : ""); } else if (MemMatch(pszName, iSize, "FILE", 4)) { return SysStrDup(pMSC->FSect.szFilePath); } else if (MemMatch(pszName, iSize, "MSGID", 5)) { return SysStrDup(USmlGetSpoolFile(pMSC->hFSpool)); } else if (MemMatch(pszName, iSize, "MSGREF", 6)) { return SysStrDup(USmlGetSmtpMessageID(pMSC->hFSpool)); } else if (MemMatch(pszName, iSize, "LOCALADDR", 9)) { char const *const *ppszInfo = USmlGetInfo(pMSC->hFSpool); return SysStrDup(ppszInfo[smiServerAddr]); } else if (MemMatch(pszName, iSize, "REMOTEADDR", 10)) { char const *const *ppszInfo = USmlGetInfo(pMSC->hFSpool); return SysStrDup(ppszInfo[smiClientAddr]); } else if (MemMatch(pszName, iSize, "TMPFILE", 7)) { char szTmpFile[SYS_MAX_PATH]; MscSafeGetTmpFile(szTmpFile, sizeof(szTmpFile)); if (MscCopyFile(szTmpFile, pMSC->FSect.szFilePath) < 0) { CheckRemoveFile(szTmpFile); return NULL; } return SysStrDup(szTmpFile); } else if (MemMatch(pszName, iSize, "USERAUTH", 8)) { char szAuthName[MAX_ADDR_NAME] = "-"; USmlMessageAuth(pMSC->hFSpool, szAuthName, sizeof(szAuthName) - 1); return SysStrDup(szAuthName); } return SysStrDup(""); } static int SMAILCmdMacroSubstitutes(char **ppszCmdTokens, SPLF_HANDLE hFSpool) { MacroSubstCtx MSC; MSC.hFSpool = hFSpool; /* * This function retrieve the spool file message section and sync the content. * This is necessary before passing the file name to external programs. */ if (USmlGetMsgFileSection(hFSpool, MSC.FSect) < 0) return ErrGetErrorCode(); return MscReplaceTokens(ppszCmdTokens, SMAILMacroLkupProc, &MSC); } static int SMAILCmd_external(SVRCFG_HANDLE hSvrConfig, SHB_HANDLE hShbSMAIL, char const *pszDestDomain, char **ppszCmdTokens, int iNumTokens, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage) { /* Apply filters ... */ if (FilFilterMessage(hFSpool, hQueue, hMessage, FILTER_MODE_INBOUND) < 0) return ErrGetErrorCode(); if (iNumTokens < 5) { ErrSetErrorCode(ERR_BAD_DOMAIN_PROC_CMD_SYNTAX); return ERR_BAD_DOMAIN_PROC_CMD_SYNTAX; } int iPriority = atoi(ppszCmdTokens[1]); int iWaitTimeout = atoi(ppszCmdTokens[2]) * 1000; int iExitStatus = 0; if (SysExec(ppszCmdTokens[3], &ppszCmdTokens[3], iWaitTimeout, iPriority, &iExitStatus) < 0) { ErrorPush(); char const *pszMailFrom = USmlMailFrom(hFSpool); char const *pszRcptTo = USmlRcptTo(hFSpool); ErrLogMessage(LOG_LEV_MESSAGE, "SMAIL EXTRN-Send Prg = \"%s\" Domain = \"%s\" From = \"%s\" To = \"%s\" Failed !\n", ppszCmdTokens[3], pszDestDomain, pszMailFrom, pszRcptTo); QueUtErrLogMessage(hQueue, hMessage, "SMAIL EXTRN-Send Prg = \"%s\" Domain = \"%s\" From = \"%s\" To = \"%s\" Failed !\n", ppszCmdTokens[3], pszDestDomain, pszMailFrom, pszRcptTo); return ErrorPop(); } /* Log Mailer operation */ if (SMAILLogEnabled(hShbSMAIL)) USmlLogMessage(hFSpool, "EXTRN", NULL, ppszCmdTokens[3]); return (iExitStatus == SMAIL_EXTERNAL_EXIT_BREAK) ? SMAIL_STOP_PROCESSING: 0; } static int SMAILCmd_filter(SVRCFG_HANDLE hSvrConfig, SHB_HANDLE hShbSMAIL, char const *pszDestDomain, char **ppszCmdTokens, int iNumTokens, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage) { if (iNumTokens < 5) { ErrSetErrorCode(ERR_BAD_MAILPROC_CMD_SYNTAX); return ERR_BAD_MAILPROC_CMD_SYNTAX; } int iPriority = atoi(ppszCmdTokens[1]); int iWaitTimeout = atoi(ppszCmdTokens[2]) * 1000; int iExitStatus = 0; if (SysExec(ppszCmdTokens[3], &ppszCmdTokens[3], iWaitTimeout, iPriority, &iExitStatus) < 0) { ErrorPush(); char const *pszMailFrom = USmlMailFrom(hFSpool); char const *pszRcptTo = USmlRcptTo(hFSpool); ErrLogMessage(LOG_LEV_MESSAGE, "USMAIL FILTER Prg = \"%s\" From = \"%s\" To = \"%s\" Failed !\n", ppszCmdTokens[3], pszMailFrom, pszRcptTo); QueUtErrLogMessage(hQueue, hMessage, "USMAIL FILTER Prg = \"%s\" From = \"%s\" To = \"%s\" Failed !\n", ppszCmdTokens[3], pszMailFrom, pszRcptTo); return ErrorPop(); } /* Log Mailer operation */ if (SMAILLogEnabled(hShbSMAIL)) USmlLogMessage(hFSpool, "FILTER", NULL, ppszCmdTokens[3]); /* Separate code from flags */ int iExitFlags = iExitStatus & FILTER_FLAGS_MASK; iExitStatus &= ~FILTER_FLAGS_MASK; if (iExitStatus == FILTER_OUT_EXITCODE || iExitStatus == FILTER_OUT_NN_EXITCODE || iExitStatus == FILTER_OUT_NNF_EXITCODE) { /* Filter out message */ char *pszRejMsg = FilGetFilterRejMessage(USmlGetSpoolFilePath(hFSpool)); if (iExitStatus == FILTER_OUT_EXITCODE) QueUtNotifyPermErrDelivery(hQueue, hMessage, NULL, (pszRejMsg != NULL) ? pszRejMsg : ErrGetErrorString(ERR_FILTERED_MESSAGE), NULL, true); else if (iExitStatus == FILTER_OUT_NN_EXITCODE) QueCleanupMessage(hQueue, hMessage, !QueUtRemoveSpoolErrors()); else QueCleanupMessage(hQueue, hMessage, false); SysFree(pszRejMsg); ErrSetErrorCode(ERR_FILTERED_MESSAGE); return ERR_FILTERED_MESSAGE; } else if (iExitStatus == FILTER_MODIFY_EXITCODE) { /* Filter modified the message, we need to reload the spool handle */ if (USmlReloadHandle(hFSpool) < 0) { ErrorPush(); char const *pszMailFrom = USmlMailFrom(hFSpool); char const *pszRcptTo = USmlRcptTo(hFSpool); SysLogMessage(LOG_LEV_MESSAGE, "Filter error [ Modified message corrupted ]: Sender = \"%s\" Recipient = \"%s\" (%s)\n", pszMailFrom, pszRcptTo, ppszCmdTokens[3]); QueUtErrLogMessage(hQueue, hMessage, "Filter error [ Modified message corrupted ]: Sender = \"%s\" Recipient = \"%s\" (%s)\n", pszMailFrom, pszRcptTo, ppszCmdTokens[3]); QueCleanupMessage(hQueue, hMessage, true); return ErrorPop(); } } return (iExitFlags & FILTER_FLAGS_BREAK) ? SMAIL_STOP_PROCESSING: 0; } static int SMAILCmd_smtp(SVRCFG_HANDLE hSvrConfig, SHB_HANDLE hShbSMAIL, char const *pszDestDomain, char **ppszCmdTokens, int iNumTokens, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage) { if (iNumTokens != 1) { ErrSetErrorCode(ERR_BAD_DOMAIN_PROC_CMD_SYNTAX); return ERR_BAD_DOMAIN_PROC_CMD_SYNTAX; } SMTPError SMTPE; USmtpInitError(&SMTPE); if (SMAILRemoteMsgSMTPSend(hSvrConfig, hShbSMAIL, hFSpool, hQueue, hMessage, pszDestDomain, &SMTPE) < 0) { /* If we get an SMTP fatal error We must return <0 , otherwise >0 to give */ /* XMail to ability to resume the command */ int iReturnCode = USmtpIsFatalError(&SMTPE) ? ErrGetErrorCode(): -ErrGetErrorCode(); /* If a permanent SMTP error has been detected, then notify the message sender */ if (USmtpIsFatalError(&SMTPE)) QueUtNotifyPermErrDelivery(hQueue, hMessage, hFSpool, USmtpGetErrorMessage(&SMTPE), USmtpGetErrorServer(&SMTPE), false); USmtpCleanupError(&SMTPE); return iReturnCode; } USmtpCleanupError(&SMTPE); return 0; } static int SMAILCmd_smtprelay(SVRCFG_HANDLE hSvrConfig, SHB_HANDLE hShbSMAIL, char const *pszDestDomain, char **ppszCmdTokens, int iNumTokens, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage) { /* Apply filters ... */ if (FilFilterMessage(hFSpool, hQueue, hMessage, FILTER_MODE_OUTBOUND) < 0) return ErrGetErrorCode(); if (iNumTokens < 2) { ErrSetErrorCode(ERR_BAD_DOMAIN_PROC_CMD_SYNTAX); return ERR_BAD_DOMAIN_PROC_CMD_SYNTAX; } char **ppszRelays = NULL; if (ppszCmdTokens[1][0] == '#') { if ((ppszRelays = StrTokenize(ppszCmdTokens[1] + 1, ";")) != NULL) MscRandomizeStringsOrder(ppszRelays); } else ppszRelays = StrTokenize(ppszCmdTokens[1], ";"); if (ppszRelays == NULL) return ErrGetErrorCode(); SMTPGateway **ppGws = USmtpGetCfgGateways(hSvrConfig, ppszRelays, iNumTokens > 2 ? ppszCmdTokens[2]: NULL); StrFreeStrings(ppszRelays); if (ppGws == NULL) return ErrGetErrorCode(); /* This function retrieve the spool file message section and sync the content. */ /* This is necessary before sending the file */ FileSection FSect; if (USmlGetMsgFileSection(hFSpool, FSect) < 0) { ErrorPush(); USmtpFreeGateways(ppGws); return ErrorPop(); } /* Get spool file infos */ char const *pszSMTPDomain = USmlGetSMTPDomain(hFSpool); char const *pszMailFrom = USmlMailFrom(hFSpool); char const *pszRcptTo = USmlRcptTo(hFSpool); char const *pszSendMailFrom = USmlSendMailFrom(hFSpool); char const *pszSendRcptTo = USmlSendRcptTo(hFSpool); char const *pszSpoolFilePath = USmlGetSpoolFilePath(hFSpool); /* Get HELO domain */ char szHeloDomain[MAX_HOST_NAME]; SvrConfigVar("HeloDomain", szHeloDomain, sizeof(szHeloDomain) - 1, hSvrConfig, ""); char const *pszHeloDomain = IsEmptyString(szHeloDomain) ? NULL: szHeloDomain; SMTPError SMTPE; USmtpInitError(&SMTPE); /* By initializing this to zero makes XMail to discharge all mail for domains */ /* that have an empty relay list */ int iReturnCode = 0; for (int i = 0; ppGws[i] != NULL && iReturnCode >= 0; i++) { SysLogMessage(LOG_LEV_MESSAGE, "SMAIL SMTP-Send RLYS = \"%s\" SMTP = \"%s\" From = \"%s\" To = \"%s\"\n", ppGws[i]->pszHost, pszSMTPDomain, pszMailFrom, pszRcptTo); USmtpCleanupError(&SMTPE); if (USmtpSendMail(ppGws[i], pszHeloDomain, pszSendMailFrom, pszSendRcptTo, &FSect, &SMTPE) == 0) { /* Log Mailer operation */ if (SMAILLogEnabled(hShbSMAIL)) { char szRmtMsgID[256]; USmtpGetSMTPRmtMsgID(USmtpGetErrorMessage(&SMTPE), szRmtMsgID, sizeof(szRmtMsgID)); USmlLogMessage(hFSpool, "RLYS", szRmtMsgID, ppGws[i]->pszHost); } USmtpCleanupError(&SMTPE); USmtpFreeGateways(ppGws); return 0; } int iErrorCode = ErrGetErrorCode(); char szSmtpError[512]; USmtpGetSMTPError(&SMTPE, szSmtpError, sizeof(szSmtpError)); ErrLogMessage(LOG_LEV_MESSAGE, "SMAIL SMTP-Send RLYS = \"%s\" SMTP = \"%s\" From = \"%s\" To = \"%s\" Failed !\n" "%s = \"%s\"\n" "%s = \"%s\"\n", ppGws[i]->pszHost, pszSMTPDomain, pszMailFrom, pszRcptTo, SMTP_ERROR_VARNAME, szSmtpError, SMTP_SERVER_VARNAME, USmtpGetErrorServer(&SMTPE)); QueUtErrLogMessage(hQueue, hMessage, "SMAIL SMTP-Send RLYS = \"%s\" SMTP = \"%s\" From = \"%s\" To = \"%s\" Failed !\n" "%s = \"%s\"\n" "%s = \"%s\"\n", ppGws[i]->pszHost, pszSMTPDomain, pszMailFrom, pszRcptTo, SMTP_ERROR_VARNAME, szSmtpError, SMTP_SERVER_VARNAME, USmtpGetErrorServer(&SMTPE)); /* If a permanent SMTP error has been detected, then notify the message sender */ if (USmtpIsFatalError(&SMTPE)) QueUtNotifyPermErrDelivery(hQueue, hMessage, hFSpool, USmtpGetErrorMessage(&SMTPE), USmtpGetErrorServer(&SMTPE), false); iReturnCode = USmtpIsFatalError(&SMTPE) ? iErrorCode: -iErrorCode; } USmtpCleanupError(&SMTPE); USmtpFreeGateways(ppGws); return iReturnCode; } static int SMAILCmd_redirect(SVRCFG_HANDLE hSvrConfig, SHB_HANDLE hShbSMAIL, char const *pszDestDomain, char **ppszCmdTokens, int iNumTokens, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage) { if (iNumTokens < 2) { ErrSetErrorCode(ERR_BAD_DOMAIN_PROC_CMD_SYNTAX); return ERR_BAD_DOMAIN_PROC_CMD_SYNTAX; } char const *pszSMTPDomain = USmlGetSMTPDomain(hFSpool); char const *const *ppszFrom = USmlGetMailFrom(hFSpool); char const *const *ppszRcpt = USmlGetRcptTo(hFSpool); int iFromDomains = StrStringsCount(ppszFrom); int iRcptDomains = StrStringsCount(ppszRcpt); char szLocalUser[MAX_ADDR_NAME], szLocalDomain[MAX_ADDR_NAME]; if (iRcptDomains < 1 || USmtpSplitEmailAddr(ppszRcpt[iRcptDomains - 1], szLocalUser, szLocalDomain) < 0) return ErrGetErrorCode(); for (int i = 1; ppszCmdTokens[i] != NULL; i++) { /* Get message handle */ QMSG_HANDLE hRedirMessage = QueCreateMessage(hSpoolQueue); char szQueueFilePath[SYS_MAX_PATH], szAliasAddr[MAX_ADDR_NAME]; if (hRedirMessage == INVALID_QMSG_HANDLE) return ErrGetErrorCode(); QueGetFilePath(hSpoolQueue, hRedirMessage, szQueueFilePath); if (strchr(ppszCmdTokens[i], '@') == NULL) SysSNPrintf(szAliasAddr, sizeof(szAliasAddr) - 1, "%s@%s", szLocalUser, ppszCmdTokens[i]); else StrSNCpy(szAliasAddr, ppszCmdTokens[i]); if (USmlCreateSpoolFile(hFSpool, NULL, szAliasAddr, szQueueFilePath, NULL) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hRedirMessage); QueCloseMessage(hSpoolQueue, hRedirMessage); return ErrorPop(); } /* Transfer file to the spool */ if (QueCommitMessage(hSpoolQueue, hRedirMessage) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hRedirMessage); QueCloseMessage(hSpoolQueue, hRedirMessage); return ErrorPop(); } } return 0; } static int SMAILCmd_lredirect(SVRCFG_HANDLE hSvrConfig, SHB_HANDLE hShbSMAIL, char const *pszDestDomain, char **ppszCmdTokens, int iNumTokens, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage) { if (iNumTokens < 2) { ErrSetErrorCode(ERR_BAD_DOMAIN_PROC_CMD_SYNTAX); return ERR_BAD_DOMAIN_PROC_CMD_SYNTAX; } char const *const *ppszFrom = USmlGetMailFrom(hFSpool); char const *const *ppszRcpt = USmlGetRcptTo(hFSpool); int iFromDomains = StrStringsCount(ppszFrom); int iRcptDomains = StrStringsCount(ppszRcpt); char szLocalUser[MAX_ADDR_NAME], szLocalDomain[MAX_ADDR_NAME]; if (iRcptDomains < 1 || USmtpSplitEmailAddr(ppszRcpt[iRcptDomains - 1], szLocalUser, szLocalDomain) < 0) return ErrGetErrorCode(); for (int i = 1; ppszCmdTokens[i] != NULL; i++) { /* Get message handle */ QMSG_HANDLE hRedirMessage = QueCreateMessage(hSpoolQueue); char szQueueFilePath[SYS_MAX_PATH], szAliasAddr[MAX_ADDR_NAME]; if (hRedirMessage == INVALID_QMSG_HANDLE) return ErrGetErrorCode(); QueGetFilePath(hSpoolQueue, hRedirMessage, szQueueFilePath); if (strchr(ppszCmdTokens[i], '@') == NULL) SysSNPrintf(szAliasAddr, sizeof(szAliasAddr) - 1, "%s@%s", szLocalUser, ppszCmdTokens[i]); else StrSNCpy(szAliasAddr, ppszCmdTokens[i]); if (USmlCreateSpoolFile(hFSpool, ppszRcpt[iRcptDomains - 1], szAliasAddr, szQueueFilePath, NULL) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hRedirMessage); QueCloseMessage(hSpoolQueue, hRedirMessage); return ErrorPop(); } /* Transfer file to the spool */ if (QueCommitMessage(hSpoolQueue, hRedirMessage) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hRedirMessage); QueCloseMessage(hSpoolQueue, hRedirMessage); return ErrorPop(); } } return 0; } static int SMAILCustomProcessMessage(SVRCFG_HANDLE hSvrConfig, SHB_HANDLE hShbSMAIL, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char const *pszDestDomain, char const *pszDestUser, char const *pszCustFilePath) { FILE *pCPFile = fopen(pszCustFilePath, "rt"); if (pCPFile == NULL) { ErrSetErrorCode(ERR_FILE_OPEN, pszCustFilePath); return ERR_FILE_OPEN; } /* Create pushback command file */ char szTmpFile[SYS_MAX_PATH]; UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile)); FILE *pPushBFile = fopen(szTmpFile, "wt"); if (pPushBFile == NULL) { fclose(pCPFile); ErrSetErrorCode(ERR_FILE_CREATE, szTmpFile); return ERR_FILE_CREATE; } int iPushBackCmds = 0; char szCmdLine[CUSTOM_PROC_LINE_MAX]; while (MscGetConfigLine(szCmdLine, sizeof(szCmdLine) - 1, pCPFile) != NULL) { char **ppszCmdTokens = StrGetTabLineStrings(szCmdLine); if (ppszCmdTokens == NULL) continue; int iFieldsCount = StrStringsCount(ppszCmdTokens); if (iFieldsCount > 0) { /* Do command line macro substitution */ SMAILCmdMacroSubstitutes(ppszCmdTokens, hFSpool); int iCmdResult = 0; if (stricmp(ppszCmdTokens[0], "external") == 0) iCmdResult = SMAILCmd_external(hSvrConfig, hShbSMAIL, pszDestDomain, ppszCmdTokens, iFieldsCount, hFSpool, hQueue, hMessage); else if (stricmp(ppszCmdTokens[0], "filter") == 0) iCmdResult = SMAILCmd_filter(hSvrConfig, hShbSMAIL, pszDestDomain, ppszCmdTokens, iFieldsCount, hFSpool, hQueue, hMessage); else if (stricmp(ppszCmdTokens[0], "smtp") == 0) iCmdResult = SMAILCmd_smtp(hSvrConfig, hShbSMAIL, pszDestDomain, ppszCmdTokens, iFieldsCount, hFSpool, hQueue, hMessage); else if (stricmp(ppszCmdTokens[0], "smtprelay") == 0) iCmdResult = SMAILCmd_smtprelay(hSvrConfig, hShbSMAIL, pszDestDomain, ppszCmdTokens, iFieldsCount, hFSpool, hQueue, hMessage); else if (stricmp(ppszCmdTokens[0], "redirect") == 0) iCmdResult = SMAILCmd_redirect(hSvrConfig, hShbSMAIL, pszDestDomain, ppszCmdTokens, iFieldsCount, hFSpool, hQueue, hMessage); else if (stricmp(ppszCmdTokens[0], "lredirect") == 0) iCmdResult = SMAILCmd_lredirect(hSvrConfig, hShbSMAIL, pszDestDomain, ppszCmdTokens, iFieldsCount, hFSpool, hQueue, hMessage); else { SysLogMessage(LOG_LEV_ERROR, "Invalid command \"%s\" in file \"%s\"\n", ppszCmdTokens[0], pszCustFilePath); } /* Check for the stop-processing error code */ if (iCmdResult == SMAIL_STOP_PROCESSING) { StrFreeStrings(ppszCmdTokens); break; } /* Test if we must save a failed command */ /* <0 = Error ; ==0 = Success ; >0 = Transient error ( save the command ) */ if (iCmdResult > 0) { fprintf(pPushBFile, "%s\n", szCmdLine); ++iPushBackCmds; } /* An error code might result if filters blocked the message. If this is the */ /* case QueCheckMessage() will return error and we MUST stop processing */ if (iCmdResult < 0 && QueCheckMessage(hQueue, hMessage) < 0) { ErrorPush(); StrFreeStrings(ppszCmdTokens); fclose(pPushBFile); fclose(pCPFile); SysRemove(szTmpFile); return ErrorPop(); } } StrFreeStrings(ppszCmdTokens); } fclose(pPushBFile); fclose(pCPFile); SysRemove(pszCustFilePath); if (iPushBackCmds > 0) { /* If commands left out of processing, push them into the custom file */ if (MscMoveFile(szTmpFile, pszCustFilePath) < 0) return ErrGetErrorCode(); ErrSetErrorCode(ERR_INCOMPLETE_PROCESSING); return ERR_INCOMPLETE_PROCESSING; } SysRemove(szTmpFile); return 0; } static int SMAILHandleRemoteUserMessage(SVRCFG_HANDLE hSvrConfig, SHB_HANDLE hShbSMAIL, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char const *pszDestDomain, char const *pszDestUser) { /* Try domain custom processing */ char szCustFilePath[SYS_MAX_PATH]; if (USmlGetDomainMsgCustomFile(hFSpool, hQueue, hMessage, pszDestDomain, szCustFilePath) == 0) return SMAILCustomProcessMessage(hSvrConfig, hShbSMAIL, hFSpool, hQueue, hMessage, pszDestDomain, pszDestUser, szCustFilePath); /* Fall down to use standard SMTP delivery */ SMTPError SMTPE; USmtpInitError(&SMTPE); if (SMAILRemoteMsgSMTPSend(hSvrConfig, hShbSMAIL, hFSpool, hQueue, hMessage, pszDestDomain, &SMTPE) < 0) { ErrorPush(); /* * If a permanent SMTP error has been detected, then notify the message * sender and remove the spool file */ if (USmtpIsFatalError(&SMTPE)) QueUtNotifyPermErrDelivery(hQueue, hMessage, hFSpool, USmtpGetErrorMessage(&SMTPE), USmtpGetErrorServer(&SMTPE), true); USmtpCleanupError(&SMTPE); return ErrorPop(); } USmtpCleanupError(&SMTPE); return 0; } static int SMAILProcessFile(SVRCFG_HANDLE hSvrConfig, SHB_HANDLE hShbSMAIL, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage) { char const *const *ppszRcpt = USmlGetRcptTo(hFSpool); int iRcptDomains = StrStringsCount(ppszRcpt); char szDestUser[MAX_ADDR_NAME], szDestDomain[MAX_ADDR_NAME]; char szAliasFilePath[SYS_MAX_PATH]; if (iRcptDomains < 1) { ErrSetErrorCode(ERR_BAD_EMAIL_ADDR); return ERR_BAD_EMAIL_ADDR; } /* * We can have two cases here. The recipient is a simple one, or it has an * explicit routing (@dom1,@dom2:usr@dom). */ if (iRcptDomains == 1) { if (USmtpSplitEmailAddr(ppszRcpt[0], szDestUser, szDestDomain) < 0) return ErrGetErrorCode(); } else { char const *pszRtHost = ppszRcpt[0] + 1; /* * If we get here, the first entry in ppszRcpt is a route host, * in the form of '@HOST'. */ if (USmlValidHost(pszRtHost, pszRtHost + strlen(pszRtHost)) < 0) return ErrGetErrorCode(); StrNCpy(szDestDomain, pszRtHost, sizeof(szDestDomain)); } /* * Resolve alias domain alias domain. This needs to be used when * looking for cmdalias handling, in order to avoid replicating * then over aliased domains. */ char const *pszRealDomain = szDestDomain; char szADomain[MAX_HOST_NAME]; if (ADomLookupDomain(szDestDomain, szADomain, true)) pszRealDomain = szADomain; /* Is the target handled with cmdalias ? */ if (USmlGetCmdAliasCustomFile(hFSpool, hQueue, hMessage, pszRealDomain, szDestUser, szAliasFilePath) == 0) { /* Do cmd alias processing */ if (SMAILCustomProcessMessage(hSvrConfig, hShbSMAIL, hFSpool, hQueue, hMessage, pszRealDomain, szDestUser, szAliasFilePath) < 0) return ErrGetErrorCode(); } else if (MDomIsHandledDomain(szDestDomain) == 0) { UserInfo *pUI = UsrGetUserByNameOrAlias(szDestDomain, szDestUser); if (pUI != NULL) { SysLogMessage(LOG_LEV_MESSAGE, "SMAIL local SMTP = \"%s\" From = <%s> To = <%s>\n", USmlGetSMTPDomain(hFSpool), USmlMailFrom(hFSpool), ppszRcpt[0]); if (UsrGetUserType(pUI) == usrTypeUser) { /* Local user case */ LocalMailProcConfig LMPC; ZeroData(LMPC); LMPC.ulFlags = SMAILLogEnabled(hShbSMAIL) ? LMPCF_LOG_ENABLED: 0; if (USmlProcessLocalUserMessage(hSvrConfig, pUI, hFSpool, hQueue, hMessage, LMPC) < 0) { ErrorPush(); UsrFreeUserInfo(pUI); return ErrorPop(); } } else { /* Apply filters ... */ if (FilFilterMessage(hFSpool, hQueue, hMessage, FILTER_MODE_INBOUND) < 0) { ErrorPush(); UsrFreeUserInfo(pUI); return ErrorPop(); } /* Local mailing list case */ if (SMAILMailingListExplode(pUI, hFSpool) < 0) { ErrorPush(); UsrFreeUserInfo(pUI); return ErrorPop(); } } UsrFreeUserInfo(pUI); } else { ErrorPush(); /* No account inside the handled domain */ char szBounceMsg[512]; SysSNPrintf(szBounceMsg, sizeof(szBounceMsg) - 1, "Unknown user \"%s\" in domain \"%s\"", szDestUser, szDestDomain); QueUtErrLogMessage(hQueue, hMessage, "%s\n", szBounceMsg); QueUtNotifyPermErrDelivery(hQueue, hMessage, hFSpool, szBounceMsg, NULL, true); return ErrorPop(); } } else { /* Remote user case ( or custom domain user ) */ if (SMAILHandleRemoteUserMessage(hSvrConfig, hShbSMAIL, hFSpool, hQueue, hMessage, szDestDomain, szDestUser) < 0) return ErrGetErrorCode(); } return 0; } static int SMAILTryProcessMessage(SVRCFG_HANDLE hSvrConfig, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, SHB_HANDLE hShbSMAIL, SMAILConfig *pSMAILCfg) { /* Create the handle to manage the queue file */ char szMessFilePath[SYS_MAX_PATH]; QueGetFilePath(hQueue, hMessage, szMessFilePath); SPLF_HANDLE hFSpool = USmlCreateHandle(szMessFilePath); if (hFSpool == INVALID_SPLF_HANDLE) { ErrorPush(); ErrLogMessage(LOG_LEV_ERROR, "Unable to load spool file \"%s\"\n" "%s = \"%s\"\n", szMessFilePath, SMTP_ERROR_VARNAME, "554 Error loading spool file"); QueUtErrLogMessage(hQueue, hMessage, "Unable to load spool file \"%s\"\n" "%s = \"%s\"\n", szMessFilePath, SMTP_ERROR_VARNAME, "554 Error loading spool file"); QueUtCleanupNotifyRoot(hQueue, hMessage, INVALID_SPLF_HANDLE, ErrGetErrorString(ErrorFetch())); QueCloseMessage(hQueue, hMessage); return ErrorPop(); } /* Check for mail loops */ if (USmlMailLoopCheck(hFSpool, hSvrConfig) < 0) { ErrorPush(); /* Notify root and remove the message */ char const *pszSmtpMessageID = USmlGetSmtpMessageID(hFSpool); ErrLogMessage(LOG_LEV_ERROR, "Message <%s> blocked by mail loop check !\n" "%s = \"%s\"\n", pszSmtpMessageID, SMTP_ERROR_VARNAME, "554 Message blocked by mail loop check"); QueUtErrLogMessage(hQueue, hMessage, "Message <%s> blocked by mail loop check !\n" "%s = \"%s\"\n", pszSmtpMessageID, SMTP_ERROR_VARNAME, "554 Message blocked by mail loop check"); QueUtCleanupNotifyRoot(hQueue, hMessage, hFSpool, ErrGetErrorString(ErrorFetch())); USmlCloseHandle(hFSpool); QueCloseMessage(hQueue, hMessage); return ErrorPop(); } /* Process queue file */ if (SMAILProcessFile(hSvrConfig, hShbSMAIL, hFSpool, hQueue, hMessage) < 0) { ErrorPush(); /* Resend the message if it's not been cleaned up */ if (QueCheckMessage(hQueue, hMessage) == 0) { USmlSyncChanges(hFSpool); /* Handle resend notifications */ SMAILHandleResendNotify(hSvrConfig, hQueue, hMessage, hFSpool); /* Resend the message */ QueUtResendMessage(hQueue, hMessage, hFSpool); } else QueCloseMessage(hQueue, hMessage); USmlCloseHandle(hFSpool); return ErrorPop(); } USmlCloseHandle(hFSpool); /* Cleanup message */ QueCleanupMessage(hQueue, hMessage); QueCloseMessage(hQueue, hMessage); return 0; } static int SMAILTryProcessSpool(SHB_HANDLE hShbSMAIL) { SMAILConfig *pSMAILCfg = SMAILGetConfigCopy(hShbSMAIL); if (pSMAILCfg == NULL) { ErrorPush(); SysLogMessage(LOG_LEV_ERROR, "%s\n", ErrGetErrorString()); return ErrorPop(); } /* Get queue file to process */ QMSG_HANDLE hMessage = QueExtractMessage(hSpoolQueue, SMAIL_WAITMSG_TIMEOUT); if (hMessage != INVALID_QMSG_HANDLE) { /* Get configuration handle */ SVRCFG_HANDLE hSvrConfig = SvrGetConfigHandle(); if (hSvrConfig == INVALID_SVRCFG_HANDLE) { ErrorPush(); ErrLogMessage(LOG_LEV_ERROR, "Unable to load server configuration file\n" "%s = \"%s\"\n", SMTP_ERROR_VARNAME, "417 Unable to load server configuration file"); QueUtErrLogMessage(hSpoolQueue, hMessage, "Unable to load server configuration file\n" "%s = \"%s\"\n", SMTP_ERROR_VARNAME, "417 Unable to load server configuration file"); QueUtResendMessage(hSpoolQueue, hMessage, NULL); SysFree(pSMAILCfg); return ErrorPop(); } /* Process queue file */ SMAILTryProcessMessage(hSvrConfig, hSpoolQueue, hMessage, hShbSMAIL, pSMAILCfg); SvrReleaseConfigHandle(hSvrConfig); } SysFree(pSMAILCfg); return 0; } unsigned int SMAILThreadProc(void *pThreadData) { SMAILConfig *pSMAILCfg = (SMAILConfig *) ShbLock(hShbSMAIL); if (pSMAILCfg == NULL) { ErrorPush(); SysLogMessage(LOG_LEV_ERROR, "%s\n", ErrGetErrorString()); return ErrorPop(); } /* Get thread id */ long lThreadId = pSMAILCfg->lThreadCount; /* Increase thread count */ SMAILThreadCountAdd(+1, hShbSMAIL, pSMAILCfg); ShbUnlock(hShbSMAIL); SysLogMessage(LOG_LEV_MESSAGE, "SMAIL thread [%02ld] started\n", lThreadId); for (;;) { /* Check shutdown condition */ pSMAILCfg = (SMAILConfig *) ShbLock(hShbSMAIL); if (pSMAILCfg == NULL || pSMAILCfg->ulFlags & SMAILF_STOP_SERVER) { SysLogMessage(LOG_LEV_MESSAGE, "SMAIL thread [%02ld] exiting\n", lThreadId); if (pSMAILCfg != NULL) ShbUnlock(hShbSMAIL); break; } ShbUnlock(hShbSMAIL); /* Process spool files */ SMAILTryProcessSpool(hShbSMAIL); } /* Decrease thread count */ SMAILThreadCountAdd(-1, hShbSMAIL); SysLogMessage(LOG_LEV_MESSAGE, "SMAIL thread [%02ld] stopped\n", lThreadId); return 0; } xmail-1.27/SysTypesWin.h0000644000175000017500000000641411341640430014462 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SYSTYPESWIN_H #define _SYSTYPESWIN_H #ifdef MACH_BIG_ENDIAN_WORDS #define BIG_ENDIAN_CPU #endif #ifdef MACH_BIG_ENDIAN_BITFIELD #define BIG_ENDIAN_BITFIELD #endif #ifndef CHAR_BIT #define CHAR_BIT 8 #endif #define SYS_INFINITE_TIMEOUT INFINITE #define SYS_DEFAULT_MAXCOUNT (INT_MAX - 1) #define SYS_EOL "\r\n" #define SYS_CRLF_EOL 1 #define SYS_SLASH_CHAR '\\' #define SYS_SLASH_STR "\\" #define SYS_BASE_FS_STR "\\\\?\\" #define SYS_MAX_PATH _MAX_PATH #define SYS_LLU_FMT "%I64u" #define SYS_LLX_FMT "%I64X" #define SYS_OFFT_FMT "%I64d" #define SYS_INVALID_HANDLE ((SYS_HANDLE) 0) #define SYS_INVALID_SOCKET ((SYS_SOCKET) INVALID_SOCKET) #define SYS_INVALID_SEMAPHORE ((SYS_SEMAPHORE) 0) #define SYS_INVALID_MUTEX ((SYS_MUTEX) 0) #define SYS_INVALID_EVENT ((SYS_EVENT) 0) #define SYS_INVALID_PEVENT ((SYS_PEVENT) 0) #define SYS_INVALID_THREAD ((SYS_THREAD) 0) #define SYS_INVALID_MMAP ((SYS_MMAP) 0) #define SYS_THREAD_ONCE_INIT { 0, 0 } #define SysSNPrintf _snprintf #ifdef HAS_NO_OFFT_FSTREAM #define Sys_fseek(f, o, w) fseek(f, (long) (o), w) #define Sys_ftell(f) ftell(f) #else #define Sys_fseek(f, o, w) _fseeki64(f, (__int64) (o), w) #define Sys_ftell(f) _ftelli64(f) #endif #define Sys_atoi64(s) _atoi64(s) #define SYS_fd_set fd_set #define SYS_FD_ZERO FD_ZERO #define SYS_FD_CLR FD_CLR #define SYS_FD_SET FD_SET #define SYS_FD_ISSET FD_ISSET #define SYS_SHUT_RD SD_RECEIVE #define SYS_SHUT_WR SD_SEND #define SYS_SHUT_RDWR SD_BOTH typedef signed char SYS_INT8; typedef unsigned char SYS_UINT8; typedef signed short int SYS_INT16; typedef unsigned short int SYS_UINT16; typedef signed int SYS_INT32; typedef unsigned int SYS_UINT32; typedef signed __int64 SYS_INT64; typedef unsigned __int64 SYS_UINT64; typedef unsigned long SYS_HANDLE; typedef int SYS_TLSKEY; typedef SOCKET SYS_SOCKET; typedef int socklen_t; typedef HANDLE SYS_SEMAPHORE; typedef HANDLE SYS_MUTEX; typedef HANDLE SYS_EVENT; typedef HANDLE SYS_PEVENT; typedef unsigned long SYS_THREAD; typedef void *SYS_MMAP; typedef SYS_INT64 SYS_OFF_T; typedef long SYS_SIZE_T; struct SYS_THREAD_ONCE { LONG lOnce; LONG lDone; }; #endif xmail-1.27/ShBlocks.cpp0000644000175000017500000000372211341640430014243 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" struct SharedBlock { unsigned int uSize; SYS_MUTEX hMutex; void *pData; }; SHB_HANDLE ShbCreateBlock(unsigned int uSize) { SharedBlock *pSHB = (SharedBlock *) SysAlloc(sizeof(SharedBlock)); if (pSHB == NULL) return SHB_INVALID_HANDLE; pSHB->uSize = uSize; if ((pSHB->hMutex = SysCreateMutex()) == SYS_INVALID_MUTEX) { SysFree(pSHB); return SHB_INVALID_HANDLE; } if ((pSHB->pData = SysAlloc(uSize)) == NULL) { SysCloseMutex(pSHB->hMutex); SysFree(pSHB); return SHB_INVALID_HANDLE; } return (SHB_HANDLE) pSHB; } int ShbCloseBlock(SHB_HANDLE hBlock) { SharedBlock *pSHB = (SharedBlock *) hBlock; SysCloseMutex(pSHB->hMutex); SysFree(pSHB->pData); SysFree(pSHB); return 0; } void *ShbLock(SHB_HANDLE hBlock) { SharedBlock *pSHB = (SharedBlock *) hBlock; if (SysLockMutex(pSHB->hMutex, SYS_INFINITE_TIMEOUT) < 0) return NULL; return pSHB->pData; } int ShbUnlock(SHB_HANDLE hBlock) { SharedBlock *pSHB = (SharedBlock *) hBlock; SysUnlockMutex(pSHB->hMutex); return 0; } xmail-1.27/Base64Enc.cpp0000644000175000017500000000765511341640430014216 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "StrUtils.h" #include "BuffSock.h" #include "MiscUtils.h" #include "Base64Enc.h" #define OK 0 #define FAIL -1 #define BUFOVER -2 #define CHAR64(c) (((c) < 0 || (c) > 127) ? -1: index_64[(c)]) static char basis_64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????"; static char index_64[128] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1 }; int Base64Encode(const char *pIn, int iInSize, char *pszOut, int *piOutSize) { const unsigned char *in = (const unsigned char *) pIn; unsigned char *out = (unsigned char *) pszOut; unsigned char oval; char *blah; int olen, omax = *piOutSize; olen = (iInSize + 2) / 3 * 4; *piOutSize = olen; if (omax < olen) return BUFOVER; blah = (char *) out; while (iInSize >= 3) { /* user provided max buffer size; make sure we don't go over it */ *out++ = basis_64[in[0] >> 2]; *out++ = basis_64[((in[0] << 4) & 0x30) | (in[1] >> 4)]; *out++ = basis_64[((in[1] << 2) & 0x3c) | (in[2] >> 6)]; *out++ = basis_64[in[2] & 0x3f]; in += 3; iInSize -= 3; } if (iInSize > 0) { /* user provided max buffer size; make sure we don't go over it */ *out++ = basis_64[in[0] >> 2]; oval = (in[0] << 4) & 0x30; if (iInSize > 1) oval |= in[1] >> 4; *out++ = basis_64[oval]; *out++ = (iInSize < 2) ? '=' : basis_64[(in[1] << 2) & 0x3c]; *out++ = '='; } if (olen < omax) *out = '\0'; return OK; } int Base64Decode(const char *pszIn, int iInSize, char *pOut, int *piOutSize) { int i, c1, c2, c3, c4, omax = *piOutSize - 1, len = 0; if (iInSize >= 2 && pszIn[0] == '+' && pszIn[1] == ' ') pszIn += 2, iInSize -= 2; if (*pszIn == '\0') return FAIL; for (i = 0; i < iInSize / 4; i++) { c1 = pszIn[0]; if (CHAR64(c1) == -1) return FAIL; c2 = pszIn[1]; if (CHAR64(c2) == -1) return FAIL; c3 = pszIn[2]; if (c3 != '=' && CHAR64(c3) == -1) return FAIL; c4 = pszIn[3]; if (c4 != '=' && CHAR64(c4) == -1) return FAIL; pszIn += 4; if (len >= omax) return FAIL; *pOut++ = (CHAR64(c1) << 2) | (CHAR64(c2) >> 4); ++len; if (c3 != '=') { if (len >= omax) return FAIL; *pOut++ = ((CHAR64(c2) << 4) & 0xf0) | (CHAR64(c3) >> 2); ++len; if (c4 != '=') { if (len >= omax) return FAIL; *pOut++ = ((CHAR64(c3) << 6) & 0xc0) | CHAR64(c4); ++len; } } } *pOut = 0; *piOutSize = len; return OK; } xmail-1.27/Array.cpp0000644000175000017500000000544011341640430013610 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "StrUtils.h" #include "BuffSock.h" #include "MiscUtils.h" #include "Array.h" #define ARRAY_EXTRA_SPACE 16 struct Array { unsigned long ulAlloc; unsigned long ulCount; void **ppData; }; ARRAY_HANDLE ArrayCreate(unsigned long ulSize) { Array *pAr; if ((pAr = (Array *) SysAlloc(sizeof(Array))) == NULL) return INVALID_ARRAY_HANDLE; pAr->ulAlloc = ulSize + 1; if ((pAr->ppData = (void **) SysAlloc(pAr->ulAlloc * sizeof(void *))) == NULL) { SysFree(pAr); return INVALID_ARRAY_HANDLE; } return (ARRAY_HANDLE) pAr; } void ArrayFree(ARRAY_HANDLE hArray, void (*pFree)(void *, void *), void *pPrivate) { Array *pAr = (Array *) hArray; if (pAr != NULL) { if (pFree != NULL) for (unsigned long i = 0; i < pAr->ulCount; i++) if (pAr->ppData[i] != NULL) (*pFree)(pPrivate, pAr->ppData[i]); SysFree(pAr->ppData); SysFree(pAr); } } int ArraySet(ARRAY_HANDLE hArray, unsigned long ulIdx, void *pData) { Array *pAr = (Array *) hArray; if (ulIdx >= pAr->ulAlloc) { unsigned long i, ulAlloc = (3 * ulIdx) / 2 + ARRAY_EXTRA_SPACE; void **ppData = (void **) SysRealloc(pAr->ppData, ulAlloc * sizeof(void *)); if (ppData == NULL) return ErrGetErrorCode(); for (i = pAr->ulAlloc; i < ulAlloc; i++) ppData[i] = NULL; pAr->ulAlloc = ulAlloc; pAr->ppData = ppData; } pAr->ppData[ulIdx] = pData; if (ulIdx >= pAr->ulCount) pAr->ulCount = ulIdx + 1; return 0; } unsigned long ArrayCount(ARRAY_HANDLE hArray) { Array *pAr = (Array *) hArray; return pAr->ulCount; } void *ArrayGet(ARRAY_HANDLE hArray, unsigned long ulIdx) { Array *pAr = (Array *) hArray; if (ulIdx >= pAr->ulCount) { ErrSetErrorCode(ERR_NOT_FOUND); return NULL; } return pAr->ppData[ulIdx]; } int ArrayAppend(ARRAY_HANDLE hArray, void *pData) { return ArraySet(hArray, ArrayCount(hArray), pData); } xmail-1.27/MainSolaris.cpp0000644000175000017500000001304511341640430014753 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "SList.h" #include "ShBlocks.h" #include "UsrUtils.h" #include "SvrUtils.h" #include "MessQueue.h" #include "SMAILUtils.h" #include "QueueUtils.h" #include "AppDefines.h" #include "MailSvr.h" #define DEVNULL "/dev/null" #define RUNNING_PIDS_DIR "/var/run" #if !defined(NOFILE) #define NOFILE 64 #endif #define XMAIL_DEBUG_OPTION "-Md" #define XMAIL_PIDDIR_ENV "XMAIL_PID_DIR" static int MnEventLog(char const *pszFormat, ...) { va_list Args; char szBuffer[2048]; va_start(Args, pszFormat); openlog(APP_NAME_STR, LOG_PID, LOG_DAEMON); vsnprintf(szBuffer, sizeof(szBuffer) - 1, pszFormat, Args); syslog(LOG_ERR, "%s", szBuffer); va_end(Args); closelog(); return 0; } static char const *MnGetPIDDir(void) { char const *pszPIDDir = getenv(XMAIL_PIDDIR_ENV); return pszPIDDir != NULL ? pszPIDDir: RUNNING_PIDS_DIR; } static int MnSavePID(char const *pszPidFile) { char szPidFile[SYS_MAX_PATH]; snprintf(szPidFile, sizeof(szPidFile) - 1, "%s/%s.pid", MnGetPIDDir(), pszPidFile); FILE *pFile = fopen(szPidFile, "w"); if (pFile == NULL) { perror(szPidFile); return -errno; } fprintf(pFile, "%u", (unsigned int) getpid()); fclose(pFile); return 0; } static int MnRemovePID(char const *pszPidFile) { char szPidFile[SYS_MAX_PATH]; snprintf(szPidFile, sizeof(szPidFile) - 1, "%s/%s.pid", MnGetPIDDir(), pszPidFile); if (unlink(szPidFile) != 0) { perror(szPidFile); return -errno; } return 0; } static void MnSIGCLD(int iSignal) { #ifdef __BSD__ int iDeadPID; union wait ExitStatus; while ((iDeadPID = wait3(&ExitStatus, WNOHANG, (struct rusage *) NULL)) > 0); #endif } static void MnSetupStdHandles(void) { int iFD = open(DEVNULL, O_RDWR, 0); if (iFD == -1) { MnEventLog("Cannot open file %s : %s", DEVNULL, strerror(errno)); exit(errno); } if (dup2(iFD, 0) == -1 || dup2(iFD, 1) == -1 || dup2(iFD, 2) == -1) { MnEventLog("File descriptor duplication error : %s", strerror(errno)); exit(errno); } if (iFD > 2) close(iFD); } static int MnDaemonBootStrap(void) { /* * This code is inspired from the code of the great Richard Stevens books. * May You RIP in programmers paradise great Richard. * I suggest You to buy all his collection, soon! */ /* For BSD */ #ifdef SIGTTOU signal(SIGTTOU, SIG_IGN); #endif #ifdef SIGTTIN signal(SIGTTIN, SIG_IGN); #endif #ifdef SIGTSTP signal(SIGTSTP, SIG_IGN); #endif /* 1st fork */ int iChildPID = fork(); if (iChildPID < 0) { MnEventLog("Cannot fork : %s", strerror(errno)); exit(errno); } else if (iChildPID > 0) exit(0); /* Disassociate from controlling terminal and process group. Ensure the process */ /* can't reacquire a new controlling terminal. */ #ifdef __BSD__ /* BSD */ if (setpgrp(0, getpid()) == -1) { MnEventLog("Can't change process group : %s", strerror(errno)); exit(errno); } /* Lose controlling tty */ int iFdTty = open("/dev/tty", O_RDWR); if (iFdTty >= 0) { ioctl(iFdTty, TIOCNOTTY, (char *) NULL); close(iFdTty); } #else /* System V */ if (setpgrp() == -1) { MnEventLog("Can't change process group : %s", strerror(errno)); exit(errno); } signal(SIGHUP, SIG_IGN); /* 2nd fork */ iChildPID = fork(); if (iChildPID < 0) { MnEventLog("Cannot fork : %s", strerror(errno)); exit(errno); } else if (iChildPID > 0) exit(0); #endif /* Close open file descriptors */ for (int fd = 0; fd < NOFILE; fd++) close(fd); /* Set std handles */ MnSetupStdHandles(); /* Probably got set to EBADF from a close */ errno = 0; /* Move the current directory to root, to make sure we aren't on a mounted */ /* filesystem. */ chdir("/"); /* Clear any inherited file mode creation mask. */ umask(0); /* Ignore childs dead. */ #ifdef __BSD__ /* BSD */ signal(SIGCLD, MnSIGCLD); #else /* System V */ signal(SIGCLD, SIG_IGN); #endif return 0; } static int MnIsDebugStartup(int iArgCount, char *pszArgs[]) { for (int i = 0; i < iArgCount; i++) if (strcmp(pszArgs[i], XMAIL_DEBUG_OPTION) == 0) return 1; return 0; } static int MnDaemonStartup(int iArgCount, char *pszArgs[]) { /* Daemon bootstrap code if We're not in debug mode */ if (!MnIsDebugStartup(iArgCount, pszArgs)) MnDaemonBootStrap(); /* Extract PID file name */ char const *pszPidFile = strrchr(pszArgs[0], '/'); pszPidFile = (pszPidFile != NULL) ? (pszPidFile + 1): pszArgs[0]; /* Create PID file */ MnSavePID(pszPidFile); int iServerResult = SvrMain(iArgCount, pszArgs); /* Remove PID file */ MnRemovePID(pszPidFile); return iServerResult; } int main(int iArgCount, char *pszArgs[]) { return MnDaemonStartup(iArgCount, pszArgs); } xmail-1.27/Maildir.cpp0000644000175000017500000001110411341640430014105 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "StrUtils.h" #include "SList.h" #include "MD5.h" #include "Base64Enc.h" #include "BuffSock.h" #include "MailConfig.h" #include "UsrUtils.h" #include "SvrUtils.h" #include "MessQueue.h" #include "MailSvr.h" #include "MiscUtils.h" #include "Maildir.h" static int MdirMessageID(char *pszMessageID, int iMaxMessageID) { /* * Get thread ID and host name. We do not use atomic inc on ulUniqSeq, since * collision is prevented by the thread ID */ static unsigned long ulUniqSeq = 0; unsigned long ulThreadID = SysGetCurrentThreadId(); SYS_INT64 iMsTime = SysMsTime(); char szHostName[MAX_HOST_NAME] = ""; gethostname(szHostName, sizeof(szHostName) - 1); SysSNPrintf(pszMessageID, iMaxMessageID, SYS_LLU_FMT ".%lu.%lx.%s", iMsTime, ulThreadID, ulUniqSeq++, szHostName); return 0; } int MdirCreateStructure(const char *pszBasePath) { /* Create Maildir directory */ char szMaildirPath[SYS_MAX_PATH] = ""; StrSNCpy(szMaildirPath, pszBasePath); AppendSlash(szMaildirPath); StrSNCat(szMaildirPath, MAILDIR_DIRECTORY); if (SysMakeDir(szMaildirPath) < 0) return ErrGetErrorCode(); /* Create Maildir/tmp directory */ char szSubPath[SYS_MAX_PATH] = ""; sprintf(szSubPath, "%s" SYS_SLASH_STR "tmp", szMaildirPath); if (SysMakeDir(szSubPath) < 0) return ErrGetErrorCode(); /* Create Maildir/new directory */ sprintf(szSubPath, "%s" SYS_SLASH_STR "new", szMaildirPath); if (SysMakeDir(szSubPath) < 0) return ErrGetErrorCode(); /* Create Maildir/cur directory */ sprintf(szSubPath, "%s" SYS_SLASH_STR "cur", szMaildirPath); if (SysMakeDir(szSubPath) < 0) return ErrGetErrorCode(); return 0; } int MdirGetTmpMaildirEntry(const char *pszMaildirPath, char *pszFilePath, int iMaxPath) { char szMessageID[SYS_MAX_PATH]; if (MdirMessageID(szMessageID, sizeof(szMessageID)) < 0) return ErrGetErrorCode(); SysSNPrintf(pszFilePath, iMaxPath, "%s" SYS_SLASH_STR "tmp" SYS_SLASH_STR "%s", pszMaildirPath, szMessageID); return 0; } int MdirMoveTmpEntryInNew(const char *pszTmpEntryPath) { /* Lookup Maildir/tmp/ subpath */ const char *pszTmpDir = MAILDIR_DIRECTORY SYS_SLASH_STR "tmp" SYS_SLASH_STR; const char *pszLookup = strstr(pszTmpEntryPath, pszTmpDir); if (pszLookup == NULL) { ErrSetErrorCode(ERR_INVALID_MAILDIR_SUBPATH); return ERR_INVALID_MAILDIR_SUBPATH; } /* Build Maildir/new file path */ int iBaseLength = (int) (pszLookup - pszTmpEntryPath); const char *pszNewDir = MAILDIR_DIRECTORY SYS_SLASH_STR "new" SYS_SLASH_STR; const char *pszSlash = strrchr(pszTmpEntryPath, SYS_SLASH_CHAR); char szNewEntryPath[SYS_MAX_PATH] = ""; StrSNCpy(szNewEntryPath, pszTmpEntryPath); StrNCpy(szNewEntryPath + iBaseLength, pszNewDir, sizeof(szNewEntryPath) - iBaseLength); StrNCat(szNewEntryPath, pszSlash + 1, sizeof(szNewEntryPath)); /* Move to Maildir/new */ if (SysMoveFile(pszTmpEntryPath, szNewEntryPath) < 0) return ErrGetErrorCode(); return 0; } /* * This function must be called with file names located onto the same * mount/drive: of the destination Maildir. This is accomplished by * the function UsrGetTmpFile(). */ int MdirMoveMessage(const char *pszMaildirPath, const char *pszFileName, const char *pszMessageID) { char szMessageID[SYS_MAX_PATH]; char szNewEntryPath[SYS_MAX_PATH]; if (pszMessageID == NULL) { if (MdirMessageID(szMessageID, sizeof(szMessageID)) < 0) return ErrGetErrorCode(); pszMessageID = szMessageID; } SysSNPrintf(szNewEntryPath, sizeof(szNewEntryPath), "%s" SYS_SLASH_STR "new" SYS_SLASH_STR "%s", pszMaildirPath, pszMessageID); if (SysMoveFile(pszFileName, szNewEntryPath) < 0) return ErrGetErrorCode(); return 0; } xmail-1.27/UsrUtils.h0000644000175000017500000001023611341640430013770 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _USRUTILS_H #define _USRUTILS_H #define INVALID_USRF_HANDLE ((USRF_HANDLE) 0) #define INVALID_ALSF_HANDLE ((ALSF_HANDLE) 0) #define GMPROC_USER (1 << 0) #define GMPROC_DOMAIN (1 << 1) struct UserInfo { char *pszDomain; unsigned int uUserID; char *pszName; char *pszPassword; char *pszPath; char *pszType; HSLIST InfoList; }; struct AliasInfo { char *pszDomain; char *pszAlias; char *pszName; }; enum UserType { usrTypeError = -1, usrTypeUser = 0, usrTypeML, usrTypeMax }; typedef struct USRF_HANDLE_struct { } *USRF_HANDLE; typedef struct ALSF_HANDLE_struct { } *ALSF_HANDLE; int UsrCheckUsersIndexes(void); int UsrCheckAliasesIndexes(void); char *UsrGetMLTableFilePath(UserInfo *pUI, char *pszMLTablePath, int iMaxPath); UserType UsrGetUserType(UserInfo *pUI); UserInfo *UsrCreateDefaultUser(char const *pszDomain, char const *pszName, char const *pszPassword, UserType TypeUser); void UsrFreeUserInfo(UserInfo *pUI); char *UsrGetUserInfoVar(UserInfo *pUI, char const *pszName, char const *pszDefault = NULL); int UsrGetUserInfoVarInt(UserInfo *pUI, char const *pszName, int iDefault); int UsrDelUserInfoVar(UserInfo *pUI, char const *pszName); int UsrSetUserInfoVar(UserInfo *pUI, char const *pszName, char const *pszValue); char **UsrGetProfileVars(UserInfo *pUI); int UsrAliasLookupName(char const *pszDomain, char const *pszAlias, char *pszName = NULL, bool bWildMatch = true); AliasInfo *UsrAllocAlias(char const *pszDomain, char const *pszAlias, char const *pszName); void UsrFreeAlias(AliasInfo *pAI); int UsrAddAlias(AliasInfo *pAI); int UsrRemoveAlias(char const *pszDomain, char const *pszAlias); int UsrRemoveDomainAliases(char const *pszDomain); UserInfo *UsrLookupUser(char const *pszDomain, char const *pszName); UserInfo *UsrGetUserByName(char const *pszDomain, char const *pszName); UserInfo *UsrGetUserByNameOrAlias(char const *pszDomain, char const *pszName, char *pszRealAddr = NULL); int UsrRemoveUser(char const *pszDomain, char const *pszName, unsigned int uUserID); int UsrModifyUser(UserInfo *pUI); int UsrRemoveDomainUsers(char const *pszDomain); int UsrAddUser(UserInfo *pUI); int UsrFlushUserVars(UserInfo *pUI); int UsrGetDBFileSnapShot(char const *pszFileName); USRF_HANDLE UsrOpenDB(void); void UsrCloseDB(USRF_HANDLE hUsersDB); UserInfo *UsrGetFirstUser(USRF_HANDLE hUsersDB, int iLoadUCfg); UserInfo *UsrGetNextUser(USRF_HANDLE hUsersDB, int iLoadUCfg); int UsrPOP3Lock(UserInfo *pUI); void UsrPOP3Unlock(UserInfo *pUI); int UsrClearPop3LocksDir(void); int UsrGetTmpFile(char const *pszDomain, char *pszTmpFile, int iMaxPath); char *UsrGetUserPath(UserInfo *pUI, char *pszUserPath, int iMaxPath, int iFinalSlash); char *UsrGetMailboxPath(UserInfo *pUI, char *pszMBPath, int iMaxPath, int iFinalSlash); int UsrMoveToMailBox(UserInfo *pUI, char const *pszFileName, char const *pszMessageID); int UsrGetMailProcessFile(UserInfo *pUI, char const *pszMPPath, unsigned long ulFlags); int UsrSetMailProcessFile(UserInfo *pUI, char const *pszMPPath, int iWhich); char *UsrGetAddress(UserInfo *pUI, char *pszAddress); int UsrGetAliasDBFileSnapShot(char const *pszFileName); ALSF_HANDLE UsrAliasOpenDB(void); void UsrAliasCloseDB(ALSF_HANDLE hAliasDB); AliasInfo *UsrAliasGetFirst(ALSF_HANDLE hAliasDB); AliasInfo *UsrAliasGetNext(ALSF_HANDLE hAliasDB); #endif xmail-1.27/SysDepCommon.cpp0000644000175000017500000002154011341640430015111 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "AppDefines.h" #define SYS_ADDR_FAMILY(a) ((struct sockaddr *) (a)->Addr)->sa_family #define SYS_IN4(a) ((struct sockaddr_in *) (a)->Addr) #define SYS_IN6(a) ((struct sockaddr_in6 *) (a)->Addr) static int SysMapGetAddrInfoError(int iError); int SysInetAnySetup(SYS_INET_ADDR &AddrInfo, int iFamily, int iPortNo) { switch (iFamily) { case AF_INET: ZeroData(AddrInfo); SYS_IN4(&AddrInfo)->sin_family = iFamily; SYS_IN4(&AddrInfo)->sin_port = htons(iPortNo); SYS_IN4(&AddrInfo)->sin_addr.s_addr = INADDR_ANY; AddrInfo.iSize = sizeof(struct sockaddr_in); break; case AF_INET6: ZeroData(AddrInfo); SYS_IN6(&AddrInfo)->sin6_family = iFamily; SYS_IN6(&AddrInfo)->sin6_port = htons(iPortNo); SYS_IN6(&AddrInfo)->sin6_addr = in6addr_any; AddrInfo.iSize = sizeof(struct sockaddr_in6); break; default: ErrSetErrorCode(ERR_INVALID_INET_ADDR); return ERR_INVALID_INET_ADDR; } return 0; } int SysGetAddrFamily(SYS_INET_ADDR const &AddrInfo) { return SYS_ADDR_FAMILY(&AddrInfo); } int SysGetAddrPort(SYS_INET_ADDR const &AddrInfo) { switch (SysGetAddrFamily(AddrInfo)) { case AF_INET: return ntohs(SYS_IN4(&AddrInfo)->sin_port); case AF_INET6: return ntohs(SYS_IN6(&AddrInfo)->sin6_port); } ErrSetErrorCode(ERR_INVALID_INET_ADDR); return ERR_INVALID_INET_ADDR; } int SysSetAddrPort(SYS_INET_ADDR &AddrInfo, int iPortNo) { switch (SysGetAddrFamily(AddrInfo)) { case AF_INET: SYS_IN4(&AddrInfo)->sin_port = htons((short) iPortNo); break; case AF_INET6: SYS_IN6(&AddrInfo)->sin6_port = htons((short) iPortNo); break; default: ErrSetErrorCode(ERR_INVALID_INET_ADDR); return ERR_INVALID_INET_ADDR; } return 0; } static int SysMapGetAddrInfoError(int iError) { switch (iError) { case EAI_NONAME: return ERR_BAD_SERVER_ADDR; #if defined(EAI_NODATA) && (EAI_NODATA != EAI_NONAME) case EAI_NODATA: return ERR_DNS_NOTFOUND; #endif case EAI_MEMORY: return ERR_MEMORY; case EAI_BADFLAGS: case EAI_FAMILY: return ERR_INVALID_PARAMETER; } return ERR_NETWORK; } int SysGetHostByName(const char *pszName, int iFamily, SYS_INET_ADDR &AddrInfo) { int iError; struct addrinfo *pCRes, *pRes, *pRes4 = NULL, *pRes6 = NULL; struct addrinfo AHints; ZeroData(AHints); AHints.ai_family = AF_UNSPEC; if ((iError = getaddrinfo(pszName, NULL, &AHints, &pRes)) != 0) { iError = SysMapGetAddrInfoError(iError); ErrSetErrorCode(iError, pszName); return iError; } for (pCRes = pRes, iError = ERR_BAD_SERVER_ADDR; pCRes != NULL; pCRes = pCRes->ai_next) { if (pCRes->ai_addr->sa_family == AF_INET) pRes4 = pCRes; else if (pCRes->ai_addr->sa_family == AF_INET6) pRes6 = pCRes; } switch (iFamily) { case AF_INET: pCRes = pRes4; break; case AF_INET6: pCRes = pRes6; break; case SYS_INET46: if ((pCRes = pRes4) == NULL) pCRes = pRes6; break; case SYS_INET64: if ((pCRes = pRes6) == NULL) pCRes = pRes4; break; default: pCRes = NULL; } if (pCRes != NULL && sizeof(AddrInfo.Addr) >= pCRes->ai_addrlen) { ZeroData(AddrInfo); AddrInfo.iSize = pCRes->ai_addrlen; memcpy(AddrInfo.Addr, pCRes->ai_addr, pCRes->ai_addrlen); } freeaddrinfo(pRes); if (pCRes == NULL) { ErrSetErrorCode(ERR_BAD_SERVER_ADDR, pszName); return ERR_BAD_SERVER_ADDR; } return 0; } int SysGetHostByAddr(SYS_INET_ADDR const &AddrInfo, char *pszFQDN, int iSize) { int iError; if ((iError = getnameinfo((struct sockaddr const *) AddrInfo.Addr, AddrInfo.iSize, pszFQDN, iSize, NULL, 0, NI_NAMEREQD)) != 0) { char szIP[128]; ErrSetErrorCode(ERR_GET_SOCK_HOST, SysInetNToA(AddrInfo, szIP, sizeof(szIP))); return ERR_GET_SOCK_HOST; } return 0; } int SysGetPeerInfo(SYS_SOCKET SockFD, SYS_INET_ADDR &AddrInfo) { socklen_t InfoSize = sizeof(AddrInfo.Addr); ZeroData(AddrInfo); if (getpeername(SockFD, (struct sockaddr *) AddrInfo.Addr, &InfoSize) == -1) { ErrSetErrorCode(ERR_GET_PEER_INFO); return ERR_GET_PEER_INFO; } AddrInfo.iSize = (int) InfoSize; return 0; } int SysGetSockInfo(SYS_SOCKET SockFD, SYS_INET_ADDR &AddrInfo) { socklen_t InfoSize = sizeof(AddrInfo.Addr); ZeroData(AddrInfo); if (getsockname(SockFD, (struct sockaddr *) AddrInfo.Addr, &InfoSize) == -1) { ErrSetErrorCode(ERR_GET_SOCK_INFO); return ERR_GET_SOCK_INFO; } AddrInfo.iSize = (int) InfoSize; return 0; } char *SysInetNToA(SYS_INET_ADDR const &AddrInfo, char *pszIP, int iSize) { SetEmptyString(pszIP); if (getnameinfo((struct sockaddr const *) AddrInfo.Addr, AddrInfo.iSize, pszIP, iSize, NULL, 0, NI_NUMERICHOST) != 0) ErrSetErrorCode(ERR_INVALID_INET_ADDR); return pszIP; } char *SysInetRevNToA(SYS_INET_ADDR const &AddrInfo, char *pszRevIP, int iSize) { int i; char *pszCur; SYS_UINT8 const *pAddr; SetEmptyString(pszRevIP); switch (SysGetAddrFamily(AddrInfo)) { case AF_INET: pAddr = (SYS_UINT8 const *) &SYS_IN4(&AddrInfo)->sin_addr; SysSNPrintf(pszRevIP, iSize, "%u.%u.%u.%u.", pAddr[3], pAddr[2], pAddr[1], pAddr[0]); break; case AF_INET6: pAddr = (SYS_UINT8 const *) &SYS_IN6(&AddrInfo)->sin6_addr; for (i = 15, pszCur = pszRevIP; i >= 0 && iSize > 4; i--, pszCur += 4, iSize -= 4) SysSNPrintf(pszCur, iSize, "%x.%x.", pAddr[i] & 0xf, pAddr[i] >> 4); break; default: ErrSetErrorCode(ERR_INVALID_INET_ADDR); } return pszRevIP; } void const *SysInetAddrData(SYS_INET_ADDR const &AddrInfo, int *piSize) { switch (SysGetAddrFamily(AddrInfo)) { case AF_INET: *piSize = (int) sizeof(SYS_IN4(&AddrInfo)->sin_addr); return &SYS_IN4(&AddrInfo)->sin_addr; case AF_INET6: *piSize = (int) sizeof(SYS_IN6(&AddrInfo)->sin6_addr); return &SYS_IN6(&AddrInfo)->sin6_addr; } ErrSetErrorCode(ERR_INVALID_INET_ADDR); return NULL; } int SysInetIPV6CompatIPV4(SYS_INET_ADDR const &Addr) { int i, iASize; SYS_UINT8 const *pAData; if (SysGetAddrFamily(Addr) != AF_INET6 || (pAData = (SYS_UINT8 const *) SysInetAddrData(Addr, &iASize)) == NULL) return 0; /* * First 80 bit must be zero ... */ for (i = 0; i < 10; i++) if (pAData[i]) return 0; /* * Then two 0xff must follow, or two 0x00 */ return (pAData[i] == 0xff && pAData[i + 1] == 0xff) || (pAData[i] == 0 && pAData[i + 1] == 0); } int SysInetIPV6ToIPV4(SYS_INET_ADDR const &SAddr, SYS_INET_ADDR &DAddr) { if (!SysInetIPV6CompatIPV4(SAddr)) { ErrSetErrorCode(ERR_INVALID_INET_ADDR); return ERR_INVALID_INET_ADDR; } ZeroData(DAddr); SYS_IN4(&DAddr)->sin_family = AF_INET; SYS_IN4(&DAddr)->sin_port = SYS_IN6(&SAddr)->sin6_port; memcpy(&SYS_IN4(&DAddr)->sin_addr.s_addr, (const char *) &SYS_IN6(&SAddr)->sin6_addr + 12, 4); DAddr.iSize = sizeof(struct sockaddr_in); return 0; } int SysInetAddrMatch(SYS_INET_ADDR const &Addr, SYS_UINT8 const *pMask, int iMaskSize, SYS_INET_ADDR const &TestAddr) { int i, iASize, iTASize, iAFamily, iTAFamily; SYS_UINT8 const *pAData, *pTAData; if ((pAData = (SYS_UINT8 const *) SysInetAddrData(Addr, &iASize)) == NULL || (pTAData = (SYS_UINT8 const *) SysInetAddrData(TestAddr, &iTASize)) == NULL || iMaskSize < iASize || iMaskSize < iTASize) return 0; iAFamily = SysGetAddrFamily(Addr); iTAFamily = SysGetAddrFamily(TestAddr); if (iAFamily != iTAFamily) { /* * Need some marshaling here, since families are different. * We only support IPV4 and IPV6, so it does not look that bad. */ if (iAFamily == AF_INET) { if (iTAFamily == AF_INET6) { if (!SysInetIPV6CompatIPV4(TestAddr)) return 0; pTAData += iTASize - iASize; } else return 0; } else if (iAFamily == AF_INET6) { if (iTAFamily == AF_INET) { if (!SysInetIPV6CompatIPV4(Addr)) return 0; pAData += iASize - iTASize; pMask += iASize - iTASize; iASize = iTASize; } else return 0; } else return 0; } for (i = 0; i < iASize; i++) if ((pAData[i] & pMask[i]) != (pTAData[i] & pMask[i])) return 0; return 1; } int SysInetAddrMatch(SYS_INET_ADDR const &Addr, SYS_INET_ADDR const &TestAddr) { SYS_UINT8 Mask[sizeof(SYS_INET_ADDR)]; memset(Mask, 0xff, sizeof(Mask)); return SysInetAddrMatch(Addr, Mask, sizeof(Mask), TestAddr); } xmail-1.27/AliasDomain.cpp0000644000175000017500000003140511341640430014713 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "ResLocks.h" #include "StrUtils.h" #include "SList.h" #include "BuffSock.h" #include "MailConfig.h" #include "MessQueue.h" #include "MailSvr.h" #include "MiscUtils.h" #include "SvrUtils.h" #include "POP3GwLink.h" #include "ExtAliases.h" #include "UsrUtils.h" #include "UsrAuth.h" #include "TabIndex.h" #include "MailDomains.h" #include "AliasDomain.h" #define ADOMAIN_FILE "aliasdomain.tab" #define WILD_ADOMAIN_HASH 0 #define ADOMAIN_LINE_MAX 512 struct ADomainScanData { char szTmpDBFile[SYS_MAX_PATH]; FILE *pDBFile; char **ppszStrings; }; static int iIdxADomain_Alias[] = { adomADomain, INDEX_SEQUENCE_TERMINATOR }; static bool ADomIsWildAlias(char const *pszAlias) { return (strchr(pszAlias, '*') != NULL) || (strchr(pszAlias, '?') != NULL); } static int ADomCalcAliasHash(char const *const *ppszTabTokens, int const *piFieldsIdx, unsigned long *pulHashVal, bool bCaseSens) { /* This will group wild alias ( * ? ) */ int iFieldsCount = StrStringsCount(ppszTabTokens); if (iFieldsCount > adomADomain && ADomIsWildAlias(ppszTabTokens[adomADomain])) { *pulHashVal = WILD_ADOMAIN_HASH; return 0; } return TbixCalculateHash(ppszTabTokens, piFieldsIdx, pulHashVal, bCaseSens); } static char *ADomGetADomainFilePath(char *pszADomainFilePath, int iMaxPath) { CfgGetRootPath(pszADomainFilePath, iMaxPath); StrNCat(pszADomainFilePath, ADOMAIN_FILE, iMaxPath); return pszADomainFilePath; } int ADomCheckDomainsIndexes(void) { char szADomainFilePath[SYS_MAX_PATH] = ""; ADomGetADomainFilePath(szADomainFilePath, sizeof(szADomainFilePath)); /* Align RmtDomain-RmtName index */ if (TbixCheckIndex(szADomainFilePath, iIdxADomain_Alias, false, ADomCalcAliasHash) < 0) return ErrGetErrorCode(); return 0; } static int ADomRebuildADomainIndexes(char const *pszADomainFilePath) { /* Rebuild RmtDomain-RmtName index */ if (TbixCreateIndex(pszADomainFilePath, iIdxADomain_Alias, false, ADomCalcAliasHash) < 0) return ErrGetErrorCode(); return 0; } static int ADomLookupDomainLK(const char *pszADomainFilePath, const char *pszADomain, char *pszDomain, bool bWildMatch) { /* Lookup record using the specified index ( lookup precise aliases ) */ char **ppszTabTokens = TbixLookup(pszADomainFilePath, iIdxADomain_Alias, false, pszADomain, NULL); if (ppszTabTokens != NULL) { if (pszDomain != NULL) StrNCpy(pszDomain, ppszTabTokens[adomDomain], MAX_HOST_NAME); StrFreeStrings(ppszTabTokens); return 1; } /* We can stop here if wild alias matching is not required */ if (!bWildMatch) return 0; /* Lookup record using the specified index ( lookup wild aliases grouped */ /* under WILD_ADOMAIN_HASH hash key ) */ unsigned long ulLkHVal = WILD_ADOMAIN_HASH; INDEX_HANDLE hIndexLookup = TbixOpenHandle(pszADomainFilePath, iIdxADomain_Alias, &ulLkHVal, 1); if (hIndexLookup != INVALID_INDEX_HANDLE) { for (ppszTabTokens = TbixFirstRecord(hIndexLookup); ppszTabTokens != NULL; ppszTabTokens = TbixNextRecord(hIndexLookup)) { int iFieldsCount = StrStringsCount(ppszTabTokens); if (iFieldsCount >= adomMax && StrIWildMatch(pszADomain, ppszTabTokens[adomADomain])) { if (pszDomain != NULL) StrNCpy(pszDomain, ppszTabTokens[adomDomain], MAX_HOST_NAME); StrFreeStrings(ppszTabTokens); TbixCloseHandle(hIndexLookup); return 1; } StrFreeStrings(ppszTabTokens); } TbixCloseHandle(hIndexLookup); } return 0; } int ADomLookupDomain(const char *pszADomain, char *pszDomain, bool bWildMatch) { char szADomainFilePath[SYS_MAX_PATH] = ""; ADomGetADomainFilePath(szADomainFilePath, sizeof(szADomainFilePath)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szADomainFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return 0; int iLookupResult = ADomLookupDomainLK(szADomainFilePath, pszADomain, pszDomain, bWildMatch); RLckUnlockSH(hResLock); return iLookupResult; } int ADomAddADomain(char const *pszADomain, char const *pszDomain) { char szADomainFilePath[SYS_MAX_PATH] = ""; ADomGetADomainFilePath(szADomainFilePath, sizeof(szADomainFilePath)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szADomainFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pDomainsFile = fopen(szADomainFilePath, "r+t"); if (pDomainsFile == NULL) { RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_ADOMAIN_FILE_NOT_FOUND); return ERR_ADOMAIN_FILE_NOT_FOUND; } char szADomainLine[ADOMAIN_LINE_MAX] = ""; while (MscFGets(szADomainLine, sizeof(szADomainLine) - 1, pDomainsFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szADomainLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= adomMax && stricmp(pszADomain, ppszStrings[adomADomain]) == 0) { StrFreeStrings(ppszStrings); fclose(pDomainsFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_ADOMAIN_EXIST); return ERR_ADOMAIN_EXIST; } StrFreeStrings(ppszStrings); } fseek(pDomainsFile, 0, SEEK_END); fprintf(pDomainsFile, "\"%s\"\t\"%s\"\n", pszADomain, pszDomain); fclose(pDomainsFile); /* Rebuild indexes */ if (ADomRebuildADomainIndexes(szADomainFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); return 0; } int ADomRemoveADomain(char const *pszADomain) { char szADomainFilePath[SYS_MAX_PATH] = ""; char szTmpFile[SYS_MAX_PATH] = ""; ADomGetADomainFilePath(szADomainFilePath, sizeof(szADomainFilePath)); UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szADomainFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) { ErrorPush(); SysRemove(szTmpFile); return ErrorPop(); } FILE *pDomainsFile = fopen(szADomainFilePath, "rt"); if (pDomainsFile == NULL) { RLckUnlockEX(hResLock); SysRemove(szTmpFile); ErrSetErrorCode(ERR_ADOMAIN_FILE_NOT_FOUND); return ERR_ADOMAIN_FILE_NOT_FOUND; } FILE *pTmpFile = fopen(szTmpFile, "wt"); if (pTmpFile == NULL) { fclose(pDomainsFile); RLckUnlockEX(hResLock); SysRemove(szTmpFile); ErrSetErrorCode(ERR_FILE_CREATE, szTmpFile); return ERR_FILE_CREATE; } int iADomainFound = 0; char szADomainLine[ADOMAIN_LINE_MAX] = ""; while (MscFGets(szADomainLine, sizeof(szADomainLine) - 1, pDomainsFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szADomainLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= adomMax && stricmp(pszADomain, ppszStrings[adomADomain]) == 0) { ++iADomainFound; } else fprintf(pTmpFile, "%s\n", szADomainLine); StrFreeStrings(ppszStrings); } fclose(pDomainsFile); fclose(pTmpFile); if (iADomainFound == 0) { SysRemove(szTmpFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_ADOMAIN_NOT_FOUND); return ERR_ADOMAIN_NOT_FOUND; } if (MscMoveFile(szTmpFile, szADomainFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } /* Rebuild indexes */ if (ADomRebuildADomainIndexes(szADomainFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); return 0; } int ADomRemoveLinkedDomains(char const *pszDomain) { char szADomainFilePath[SYS_MAX_PATH] = ""; char szTmpFile[SYS_MAX_PATH] = ""; ADomGetADomainFilePath(szADomainFilePath, sizeof(szADomainFilePath)); UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szADomainFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) { ErrorPush(); SysRemove(szTmpFile); return ErrorPop(); } FILE *pDomainsFile = fopen(szADomainFilePath, "rt"); if (pDomainsFile == NULL) { RLckUnlockEX(hResLock); SysRemove(szTmpFile); ErrSetErrorCode(ERR_ADOMAIN_FILE_NOT_FOUND); return ERR_ADOMAIN_FILE_NOT_FOUND; } FILE *pTmpFile = fopen(szTmpFile, "wt"); if (pTmpFile == NULL) { fclose(pDomainsFile); RLckUnlockEX(hResLock); SysRemove(szTmpFile); ErrSetErrorCode(ERR_FILE_CREATE, szTmpFile); return ERR_FILE_CREATE; } int iDomainFound = 0; char szADomainLine[ADOMAIN_LINE_MAX] = ""; while (MscFGets(szADomainLine, sizeof(szADomainLine) - 1, pDomainsFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szADomainLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= adomMax && stricmp(pszDomain, ppszStrings[adomDomain]) == 0) { ++iDomainFound; } else fprintf(pTmpFile, "%s\n", szADomainLine); StrFreeStrings(ppszStrings); } fclose(pDomainsFile); fclose(pTmpFile); if (iDomainFound == 0) { SysRemove(szTmpFile); RLckUnlockEX(hResLock); return 0; } if (MscMoveFile(szTmpFile, szADomainFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } /* Rebuild indexes */ if (ADomRebuildADomainIndexes(szADomainFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); return 0; } int ADomGetADomainFileSnapShot(const char *pszFileName) { char szADomainFilePath[SYS_MAX_PATH] = ""; ADomGetADomainFilePath(szADomainFilePath, sizeof(szADomainFilePath)); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szADomainFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); if (MscCopyFile(pszFileName, szADomainFilePath) < 0) { ErrorPush(); RLckUnlockSH(hResLock); return ErrorPop(); } RLckUnlockSH(hResLock); return 0; } ADOMAIN_HANDLE ADomOpenDB(void) { ADomainScanData *pDSD = (ADomainScanData *) SysAlloc(sizeof(ADomainScanData)); if (pDSD == NULL) return INVALID_ADOMAIN_HANDLE; UsrGetTmpFile(NULL, pDSD->szTmpDBFile, sizeof(pDSD->szTmpDBFile)); if (ADomGetADomainFileSnapShot(pDSD->szTmpDBFile) < 0) { CheckRemoveFile(pDSD->szTmpDBFile); SysFree(pDSD); return INVALID_ADOMAIN_HANDLE; } if ((pDSD->pDBFile = fopen(pDSD->szTmpDBFile, "rt")) == NULL) { SysRemove(pDSD->szTmpDBFile); SysFree(pDSD); return INVALID_ADOMAIN_HANDLE; } pDSD->ppszStrings = NULL; return (ADOMAIN_HANDLE) pDSD; } void ADomCloseDB(ADOMAIN_HANDLE hDomainsDB) { ADomainScanData *pDSD = (ADomainScanData *) hDomainsDB; fclose(pDSD->pDBFile); SysRemove(pDSD->szTmpDBFile); if (pDSD->ppszStrings != NULL) StrFreeStrings(pDSD->ppszStrings); SysFree(pDSD); } char const *const *ADomGetFirstDomain(ADOMAIN_HANDLE hDomainsDB) { ADomainScanData *pDSD = (ADomainScanData *) hDomainsDB; rewind(pDSD->pDBFile); if (pDSD->ppszStrings != NULL) StrFreeStrings(pDSD->ppszStrings), pDSD->ppszStrings = NULL; char szADomainLine[ADOMAIN_LINE_MAX] = ""; while (MscFGets(szADomainLine, sizeof(szADomainLine) - 1, pDSD->pDBFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szADomainLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= adomMax) return pDSD->ppszStrings = ppszStrings; StrFreeStrings(ppszStrings); } return NULL; } char const *const *ADomGetNextDomain(ADOMAIN_HANDLE hDomainsDB) { ADomainScanData *pDSD = (ADomainScanData *) hDomainsDB; if (pDSD->ppszStrings != NULL) StrFreeStrings(pDSD->ppszStrings), pDSD->ppszStrings = NULL; char szADomainLine[ADOMAIN_LINE_MAX] = ""; while (MscFGets(szADomainLine, sizeof(szADomainLine) - 1, pDSD->pDBFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szADomainLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= adomMax) return pDSD->ppszStrings = ppszStrings; StrFreeStrings(ppszStrings); } return NULL; } xmail-1.27/Filter.cpp0000644000175000017500000004314211341640430013760 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "SList.h" #include "ShBlocks.h" #include "StrUtils.h" #include "BuffSock.h" #include "MiscUtils.h" #include "ResLocks.h" #include "BuffSock.h" #include "SvrUtils.h" #include "UsrUtils.h" #include "MessQueue.h" #include "SMAILUtils.h" #include "QueueUtils.h" #include "MailDomains.h" #include "SMTPUtils.h" #include "ExtAliases.h" #include "UsrMailList.h" #include "Filter.h" #include "MailConfig.h" #include "AppDefines.h" #include "MailSvr.h" #define FILTER_LOG_FILE "filters" #define FILTER_STORAGE_DIR "filters" #define FILTER_SELECT_MAX 128 #define FILTER_DB_LINE_MAX 512 #define FILTER_LINE_MAX 1024 #define FILTV_SET(p, d) ((p) == NULL ? (d): atoi(p)) struct FilterMsgInfo { char szSender[MAX_ADDR_NAME]; char szRecipient[MAX_ADDR_NAME]; SYS_INET_ADDR LocalAddr; SYS_INET_ADDR RemoteAddr; char szSpoolFile[SYS_MAX_PATH]; char szAuthName[MAX_ADDR_NAME]; }; struct FilterMacroSubstCtx { SPLF_HANDLE hFSpool; FilterMsgInfo const *pFMI; FileSection FSect; }; static char *FilGetLogExecStr(FilterLogInfo const *pFLI, int *piSize) { int i; DynString DynS; if (StrDynInit(&DynS, NULL) < 0) return NULL; for (i = 0; pFLI->ppszExec[i] != NULL; i++) { if (StrDynAdd(&DynS, pFLI->ppszExec[i], -1) < 0 || StrDynAdd(&DynS, ";", 1) < 0) { StrDynFree(&DynS); return NULL; } } return StrDynDrop(&DynS, piSize); } int FilLogFilter(FilterLogInfo const *pFLI) { char szTime[256] = ""; MscGetTimeNbrString(szTime, sizeof(szTime) - 1); char *pszExStr = FilGetLogExecStr(pFLI, NULL); if (pszExStr == NULL) return ErrGetErrorCode(); RLCK_HANDLE hResLock = RLckLockEX(SVR_LOGS_DIR SYS_SLASH_STR FILTER_LOG_FILE); if (hResLock == INVALID_RLCK_HANDLE) { SysFree(pszExStr); return ErrGetErrorCode(); } char szLocIP[128] = "???.???.???.???"; char szRmtIP[128] = "???.???.???.???"; MscFileLog(FILTER_LOG_FILE, "\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%d\"" "\t\"%d\"" "\t\"%s\"" "\n", pFLI->pszSender, pFLI->pszRecipient, SysInetNToA(pFLI->LocalAddr, szLocIP, sizeof(szLocIP)), SysInetNToA(pFLI->RemoteAddr, szRmtIP, sizeof(szRmtIP)), szTime, pFLI->pszType, pFLI->pszInfo, pFLI->iExecResult, pFLI->iExitCode, pszExStr); RLckUnlockEX(hResLock); SysFree(pszExStr); return 0; } static int FilLogExec(FilterMsgInfo const &FMI, char const * const *ppszExec, int iExecResult, int iExitCode, char const *pszType, char const *pszInfo) { FilterLogInfo FLI; ZeroData(FLI); FLI.pszSender = FMI.szSender; FLI.pszRecipient = FMI.szRecipient; FLI.LocalAddr = FMI.LocalAddr; FLI.RemoteAddr = FMI.RemoteAddr; FLI.ppszExec = ppszExec; FLI.iExecResult = iExecResult; FLI.iExitCode = iExitCode; FLI.pszType = pszType; FLI.pszInfo = pszInfo != NULL ? pszInfo: ""; return FilLogFilter(&FLI); } static int FilLoadMsgInfo(SPLF_HANDLE hFSpool, FilterMsgInfo & FMI) { UserInfo *pUI; char const *const *ppszInfo = USmlGetInfo(hFSpool); char const *const *ppszFrom = USmlGetMailFrom(hFSpool); char const *const *ppszRcpt = USmlGetRcptTo(hFSpool); char const *pszSpoolFile = USmlGetSpoolFilePath(hFSpool); int iFromDomains = StrStringsCount(ppszFrom); int iRcptDomains = StrStringsCount(ppszRcpt); char szUser[MAX_ADDR_NAME] = ""; char szDomain[MAX_ADDR_NAME] = ""; ZeroData(FMI); if (iFromDomains > 0 && USmtpSplitEmailAddr(ppszFrom[iFromDomains - 1], szUser, szDomain) == 0) { if ((pUI = UsrGetUserByNameOrAlias(szDomain, szUser)) != NULL) { UsrGetAddress(pUI, FMI.szSender); UsrFreeUserInfo(pUI); } else StrSNCpy(FMI.szSender, ppszFrom[iFromDomains - 1]); } else SetEmptyString(FMI.szSender); if (iRcptDomains > 0 && USmtpSplitEmailAddr(ppszRcpt[iRcptDomains - 1], szUser, szDomain) == 0) { if ((pUI = UsrGetUserByNameOrAlias(szDomain, szUser)) != NULL) { UsrGetAddress(pUI, FMI.szRecipient); UsrFreeUserInfo(pUI); } else StrSNCpy(FMI.szRecipient, ppszRcpt[iRcptDomains - 1]); } else SetEmptyString(FMI.szRecipient); if (MscGetServerAddress(ppszInfo[smiServerAddr], FMI.LocalAddr) < 0 || MscGetServerAddress(ppszInfo[smiClientAddr], FMI.RemoteAddr) < 0) return ErrGetErrorCode(); StrSNCpy(FMI.szSpoolFile, pszSpoolFile); if (USmlMessageAuth(hFSpool, FMI.szAuthName, sizeof(FMI.szAuthName) - 1) < 0) SetEmptyString(FMI.szAuthName); return 0; } static void FilFreeMsgInfo(FilterMsgInfo & FMI) { } char *FilGetFilterRejMessage(char const *pszSpoolFile) { FILE *pFile; char szRejFilePath[SYS_MAX_PATH] = ""; char szRejMsg[512] = ""; SysSNPrintf(szRejFilePath, sizeof(szRejFilePath) - 1, "%s.rej", pszSpoolFile); if ((pFile = fopen(szRejFilePath, "rb")) == NULL) return NULL; MscFGets(szRejMsg, sizeof(szRejMsg) - 1, pFile); fclose(pFile); SysRemove(szRejFilePath); return SysStrDup(szRejMsg); } static int FilGetFilePath(char const *pszMode, char *pszFilePath, int iMaxPath) { char szMailRootPath[SYS_MAX_PATH] = ""; CfgGetRootPath(szMailRootPath, sizeof(szMailRootPath)); SysSNPrintf(pszFilePath, iMaxPath - 1, "%sfilters.%s.tab", szMailRootPath, pszMode); return 0; } static int FilAddFilter(char **ppszFilters, int &iNumFilters, char const *pszFilterName) { for (int ii = 0; ii < iNumFilters; ii++) if (strcmp(ppszFilters[ii], pszFilterName) == 0) return 0; if ((ppszFilters[iNumFilters] = SysStrDup(pszFilterName)) == NULL) return ErrGetErrorCode(); iNumFilters++; return 0; } static int FilSelectFilters(char const *pszFilterFilePath, char const *pszMode, FilterMsgInfo const &FMI, char **ppszFilters, int iMaxFilters) { /* Share lock the filter table file */ char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(pszFilterFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); /* Open the filter database. Fail smootly if the file does not exist */ FILE *pFile = fopen(pszFilterFilePath, "rt"); if (pFile == NULL) { RLckUnlockSH(hResLock); return 0; } int iNumFilters = 0; char szLine[FILTER_DB_LINE_MAX] = ""; while ((iNumFilters < iMaxFilters) && (MscGetConfigLine(szLine, sizeof(szLine) - 1, pFile) != NULL)) { char **ppszTokens = StrGetTabLineStrings(szLine); if (ppszTokens == NULL) continue; int iFieldsCount = StrStringsCount(ppszTokens); if ((iFieldsCount >= filMax) && StrIWildMatch(FMI.szSender, ppszTokens[filSender]) && StrIWildMatch(FMI.szRecipient, ppszTokens[filRecipient])) { AddressFilter AFRemote; AddressFilter AFLocal; if ((MscLoadAddressFilter(&ppszTokens[filRemoteAddr], 1, AFRemote) == 0) && MscAddressMatch(AFRemote, FMI.RemoteAddr) && (MscLoadAddressFilter(&ppszTokens[filLocalAddr], 1, AFLocal) == 0) && MscAddressMatch(AFLocal, FMI.LocalAddr)) { FilAddFilter(ppszFilters, iNumFilters, ppszTokens[filFileName]); } } StrFreeStrings(ppszTokens); } fclose(pFile); RLckUnlockSH(hResLock); return iNumFilters; } static void FilFreeFilters(char **ppszFilters, int iNumFilters) { for (iNumFilters--; iNumFilters >= 0; iNumFilters--) SysFree(ppszFilters[iNumFilters]); } static int FilGetFilterPath(char const *pszFileName, char *pszFilePath, int iMaxPath) { char szMailRootPath[SYS_MAX_PATH] = ""; CfgGetRootPath(szMailRootPath, sizeof(szMailRootPath)); SysSNPrintf(pszFilePath, iMaxPath - 1, "%s%s%s%s", szMailRootPath, FILTER_STORAGE_DIR, SYS_SLASH_STR, pszFileName); return 0; } int FilExecPreParse(FilterExecCtx *pCtx, char **ppszPEError) { int i; char **ppszEToks; char const *pszEx = pCtx->pToks->ppszCmdTokens[0]; if (pCtx->pToks->iTokenCount < 1 || *pszEx != '!') return 0; pCtx->pToks->iTokenCount--; pCtx->pToks->ppszCmdTokens++; if ((ppszEToks = StrTokenize(pszEx + 1, ",")) == NULL) return ErrGetErrorCode(); for (i = 0; ppszEToks[i] != NULL; i++) { char *pszVar = ppszEToks[i], *pszVal; if ((pszVal = strchr(pszVar, '=')) != NULL) *pszVal++ = '\0'; if (strcmp(pszVar, "aex") == 0) { if (FILTV_SET(pszVal, 1) && !IsEmptyString(pCtx->pszAuthName)) { StrFreeStrings(ppszEToks); *ppszPEError = SysStrDup("EXCL"); return -1; } } else if (strcmp(pszVar, "wlex") == 0) { if (FILTV_SET(pszVal, 1) && (pCtx->ulFlags & FILTER_XFL_WHITELISTED)) { StrFreeStrings(ppszEToks); *ppszPEError = SysStrDup("WLISTED"); return -1; } } else if (strcmp(pszVar, "timeo") == 0) { if (pszVal != NULL) pCtx->iTimeout = atoi(pszVal) * 1000; } } StrFreeStrings(ppszEToks); return 0; } static int FilPreExec(FilterMsgInfo const &FMI, FilterExecCtx *pFCtx, FilterTokens *pToks, char **ppszPEError) { pFCtx->pToks = pToks; pFCtx->pszAuthName = FMI.szAuthName; pFCtx->ulFlags = 0; pFCtx->iTimeout = iFilterTimeout; return FilExecPreParse(pFCtx, ppszPEError); } static char *FilMacroLkupProc(void *pPrivate, char const *pszName, int iSize) { FilterMacroSubstCtx *pFMS = (FilterMacroSubstCtx *) pPrivate; if (MemMatch(pszName, iSize, "FROM", 4)) { char const *const *ppszFrom = USmlGetMailFrom(pFMS->hFSpool); int iFromDomains = StrStringsCount(ppszFrom); return SysStrDup((iFromDomains > 0) ? ppszFrom[iFromDomains - 1] : ""); } else if (MemMatch(pszName, iSize, "RCPT", 4)) { char const *const *ppszRcpt = USmlGetRcptTo(pFMS->hFSpool); int iRcptDomains = StrStringsCount(ppszRcpt); return SysStrDup((iRcptDomains > 0) ? ppszRcpt[iRcptDomains - 1] : ""); } else if (MemMatch(pszName, iSize, "RFROM", 5)) { return SysStrDup(pFMS->pFMI->szSender); } else if (MemMatch(pszName, iSize, "RRCPT", 5)) { return SysStrDup(pFMS->pFMI->szRecipient); } else if (MemMatch(pszName, iSize, "FILE", 4)) { return SysStrDup(pFMS->FSect.szFilePath); } else if (MemMatch(pszName, iSize, "MSGID", 5)) { return SysStrDup(USmlGetSpoolFile(pFMS->hFSpool)); } else if (MemMatch(pszName, iSize, "MSGREF", 6)) { return SysStrDup(USmlGetSmtpMessageID(pFMS->hFSpool)); } else if (MemMatch(pszName, iSize, "LOCALADDR", 9)) { char const *const *ppszInfo = USmlGetInfo(pFMS->hFSpool); return SysStrDup(ppszInfo[smiServerAddr]); } else if (MemMatch(pszName, iSize, "REMOTEADDR", 10)) { char const *const *ppszInfo = USmlGetInfo(pFMS->hFSpool); return SysStrDup(ppszInfo[smiClientAddr]); } else if (MemMatch(pszName, iSize, "USERAUTH", 8)) { return SysStrDup(IsEmptyString(pFMS->pFMI->szAuthName) ? "-": pFMS->pFMI->szAuthName); } return SysStrDup(""); } static int FilFilterMacroSubstitutes(char **ppszCmdTokens, SPLF_HANDLE hFSpool, FilterMsgInfo const &FMI) { FilterMacroSubstCtx FMS; FMS.hFSpool = hFSpool; FMS.pFMI = &FMI; /* * This function retrieve the spool file message section and sync the content. * This is necessary before passing the file name to external programs. */ if (USmlGetMsgFileSection(hFSpool, FMS.FSect) < 0) return ErrGetErrorCode(); return MscReplaceTokens(ppszCmdTokens, FilMacroLkupProc, &FMS); } static int FilApplyFilter(char const *pszFilterPath, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, FilterMsgInfo const &FMI, char const *pszType) { /* Share lock the filter file */ char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(pszFilterPath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); /* This should not happen but if it happens we let the message pass through */ FILE *pFiltFile = fopen(pszFilterPath, "rt"); if (pFiltFile == NULL) { RLckUnlockSH(hResLock); return 0; } /* Filter this message */ char szFiltLine[FILTER_LINE_MAX] = ""; while (MscGetConfigLine(szFiltLine, sizeof(szFiltLine) - 1, pFiltFile) != NULL) { char **ppszCmdTokens = StrGetTabLineStrings(szFiltLine); if (ppszCmdTokens == NULL) continue; int iFieldsCount = StrStringsCount(ppszCmdTokens); if (iFieldsCount < 1) { StrFreeStrings(ppszCmdTokens); continue; } /* Perform pre-exec filtering (like exec exclude if authenticated, ...) */ char *pszPEError = NULL; FilterExecCtx FCtx; FilterTokens Toks; ZeroData(FCtx); Toks.ppszCmdTokens = ppszCmdTokens; Toks.iTokenCount = iFieldsCount; if (FilPreExec(FMI, &FCtx, &Toks, &pszPEError) < 0) { if (bFilterLogEnabled) FilLogExec(FMI, Toks.ppszCmdTokens, -1, -1, pszType, pszPEError); SysFree(pszPEError); StrFreeStrings(ppszCmdTokens); continue; } /* Do filter line macro substitution */ FilFilterMacroSubstitutes(Toks.ppszCmdTokens, hFSpool, FMI); /* Time to fire the external executable ... */ int iExitCode = -1; int iExitFlags = 0; int iExecResult = SysExec(Toks.ppszCmdTokens[0], &Toks.ppszCmdTokens[0], FCtx.iTimeout, FILTER_PRIORITY, &iExitCode); /* Log the operation, if requested. */ if (bFilterLogEnabled) FilLogExec(FMI, Toks.ppszCmdTokens, iExecResult, iExitCode, pszType, NULL); if (iExecResult == 0) { SysLogMessage(LOG_LEV_MESSAGE, "Filter run: Sender = \"%s\" Recipient = \"%s\" Filter = \"%s\" Retcode = %d\n", FMI.szSender, FMI.szRecipient, Toks.ppszCmdTokens[0], iExitCode); /* Separate code from flags */ iExitFlags = iExitCode & FILTER_FLAGS_MASK; iExitCode &= ~FILTER_FLAGS_MASK; if (iExitCode == FILTER_OUT_EXITCODE || iExitCode == FILTER_OUT_NN_EXITCODE || iExitCode == FILTER_OUT_NNF_EXITCODE) { fclose(pFiltFile); RLckUnlockSH(hResLock); /* Filter out message */ char *pszRejMsg = FilGetFilterRejMessage(FMI.szSpoolFile); if (iExitCode == FILTER_OUT_EXITCODE) QueUtNotifyPermErrDelivery(hQueue, hMessage, NULL, (pszRejMsg != NULL) ? pszRejMsg: ErrGetErrorString(ERR_FILTERED_MESSAGE), NULL, true); else if (iExitCode == FILTER_OUT_NN_EXITCODE) QueCleanupMessage(hQueue, hMessage, !QueUtRemoveSpoolErrors()); else QueCleanupMessage(hQueue, hMessage, false); StrFreeStrings(ppszCmdTokens); SysFree(pszRejMsg); ErrSetErrorCode(ERR_FILTERED_MESSAGE); return ERR_FILTERED_MESSAGE; } else if (iExitCode == FILTER_MODIFY_EXITCODE) { /* Filter modified the message, we need to reload the spool handle */ if (USmlReloadHandle(hFSpool) < 0) { ErrorPush(); fclose(pFiltFile); RLckUnlockSH(hResLock); SysLogMessage(LOG_LEV_MESSAGE, "Filter error [ Modified message corrupted ]: Sender = \"%s\" Recipient = \"%s\" (%s)\n", FMI.szSender, FMI.szRecipient, Toks.ppszCmdTokens[0]); QueUtErrLogMessage(hQueue, hMessage, "Filter error [ Modified message corrupted ]: Sender = \"%s\" Recipient = \"%s\" (%s)\n", FMI.szSender, FMI.szRecipient, Toks.ppszCmdTokens[0]); QueCleanupMessage(hQueue, hMessage, true); StrFreeStrings(ppszCmdTokens); return ErrorPop(); } } } else { SysLogMessage(LOG_LEV_ERROR, "Filter error (%d): Sender = \"%s\" Recipient = \"%s\" Filter = \"%s\"\n", iExecResult, FMI.szSender, FMI.szRecipient, Toks.ppszCmdTokens[0]); QueUtErrLogMessage(hQueue, hMessage, "Filter error (%d): Sender = \"%s\" Recipient = \"%s\" Filter = \"%s\"\n", iExecResult, FMI.szSender, FMI.szRecipient, Toks.ppszCmdTokens[0]); } StrFreeStrings(ppszCmdTokens); /* Filter list processing break required ? */ if (iExitFlags & FILTER_FLAGS_BREAK) { fclose(pFiltFile); RLckUnlockSH(hResLock); return 1; } } fclose(pFiltFile); RLckUnlockSH(hResLock); return 0; } int FilFilterMessage(SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char const *pszMode) { /* Get filter file path and returns immediately if no file is defined */ char szFilterFilePath[SYS_MAX_PATH] = ""; FilGetFilePath(pszMode, szFilterFilePath, sizeof(szFilterFilePath)); if (!SysExistFile(szFilterFilePath)) return 0; /* Load the message info */ FilterMsgInfo FMI; if (FilLoadMsgInfo(hFSpool, FMI) < 0) return ErrGetErrorCode(); /* Select applicable filters */ int iNumFilters; char *pszFilters[FILTER_SELECT_MAX]; if ((iNumFilters = FilSelectFilters(szFilterFilePath, pszMode, FMI, pszFilters, CountOf(pszFilters))) < 0) { ErrorPush(); FilFreeMsgInfo(FMI); return ErrorPop(); } /* Sequentially apply each selected filter */ for (int ii = 0; ii < iNumFilters; ii++) { int iFilterResult; char szFilterPath[SYS_MAX_PATH] = ""; FilGetFilterPath(pszFilters[ii], szFilterPath, sizeof(szFilterPath)); if ((iFilterResult = FilApplyFilter(szFilterPath, hFSpool, hQueue, hMessage, FMI, pszMode)) < 0) { ErrorPush(); FilFreeFilters(pszFilters, iNumFilters); FilFreeMsgInfo(FMI); return ErrorPop(); } /* A return code greater than zero means exit filter processing loop soon */ if (iFilterResult > 0) break; } FilFreeFilters(pszFilters, iNumFilters); FilFreeMsgInfo(FMI); return 0; } xmail-1.27/UsrUtils.cpp0000644000175000017500000014373711341640430014340 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "ResLocks.h" #include "StrUtils.h" #include "SList.h" #include "BuffSock.h" #include "MailConfig.h" #include "UsrUtils.h" #include "SvrUtils.h" #include "MessQueue.h" #include "SMAILUtils.h" #include "QueueUtils.h" #include "MailSvr.h" #include "MiscUtils.h" #include "MailDomains.h" #include "POP3GwLink.h" #include "ExtAliases.h" #include "Maildir.h" #include "TabIndex.h" #include "SMTPUtils.h" #include "AliasDomain.h" #include "UsrAuth.h" #define SVR_TABLE_FILE "mailusers.tab" #define SVR_ALIAS_FILE "aliases.tab" #define WILD_ALIASES_HASH 0 #define USR_TABLE_LINE_MAX 2048 #define USR_ALIAS_LINE_MAX 512 #define USER_PROFILE_FILE "user.tab" #define DEFAULT_USER_PROFILE_FILE "userdef.tab" #define MAILBOX_DIRECTORY "mailbox" #define POP3_LOCKS_DIR "pop3locks" #define MLUSERS_TABLE_FILE "mlusers.tab" #define MAILPROCESS_FILE "mailproc.tab" #define USR_DOMAIN_TMPDIR ".tmp" #define USR_TMPDIR "tmp" enum UsrFileds { usrDomain = 0, usrName, usrPassword, usrID, usrPath, usrType, usrMax }; struct UserInfoVar { LISTLINK LL; char *pszName; char *pszValue; }; enum AliasFileds { alsDomain = 0, alsAlias, alsName, alsMax }; struct UsersDBScanData { char szTmpDBFile[SYS_MAX_PATH]; FILE *pDBFile; }; struct AliasDBScanData { char szTmpDBFile[SYS_MAX_PATH]; FILE *pDBFile; }; static int UsrLoadUserDefaultInfo(HSLIST &InfoList, char const *pszDomain = NULL); static int UsrAliasLookupNameLK(char const *pszAlsFilePath, char const *pszDomain, char const *pszAlias, char *pszName = NULL, bool bWildMatch = true); static int iIdxUser_Domain_Name[] = { usrDomain, usrName, INDEX_SEQUENCE_TERMINATOR }; static int iIdxAlias_Domain_Alias[] = { alsDomain, alsAlias, INDEX_SEQUENCE_TERMINATOR }; static bool UsrIsWildAlias(char const *pszAlias) { return (strchr(pszAlias, '*') != NULL) || (strchr(pszAlias, '?') != NULL); } static int UsrCalcAliasHash(char const *const *ppszTabTokens, int const *piFieldsIdx, unsigned long *pulHashVal, bool bCaseSens) { /* This will group wild alias ( * ? ) */ int iFieldsCount = StrStringsCount(ppszTabTokens); if (iFieldsCount > alsAlias && (UsrIsWildAlias(ppszTabTokens[alsAlias]) || UsrIsWildAlias(ppszTabTokens[alsDomain]))) { *pulHashVal = WILD_ALIASES_HASH; return 0; } return TbixCalculateHash(ppszTabTokens, piFieldsIdx, pulHashVal, bCaseSens); } static char *UsrGetTableFilePath(char *pszUsrFilePath, int iMaxPath) { CfgGetRootPath(pszUsrFilePath, iMaxPath); StrNCat(pszUsrFilePath, SVR_TABLE_FILE, iMaxPath); return pszUsrFilePath; } int UsrCheckUsersIndexes(void) { char szUsrFilePath[SYS_MAX_PATH]; UsrGetTableFilePath(szUsrFilePath, sizeof(szUsrFilePath)); /* Align Domain-Name index */ if (TbixCheckIndex(szUsrFilePath, iIdxUser_Domain_Name, false) < 0) return ErrGetErrorCode(); return 0; } static char *UsrGetAliasFilePath(char *pszAlsFilePath, int iMaxPath) { CfgGetRootPath(pszAlsFilePath, iMaxPath); StrNCat(pszAlsFilePath, SVR_ALIAS_FILE, iMaxPath); return pszAlsFilePath; } int UsrCheckAliasesIndexes(void) { char szAlsFilePath[SYS_MAX_PATH]; UsrGetAliasFilePath(szAlsFilePath, sizeof(szAlsFilePath)); /* Align Domain-Alias index */ if (TbixCheckIndex(szAlsFilePath, iIdxAlias_Domain_Alias, false, UsrCalcAliasHash) < 0) return ErrGetErrorCode(); return 0; } static int UsrRebuildUsersIndexes(char const *pszUsrFilePath) { /* Rebuild Domain-Name index */ if (TbixCreateIndex(pszUsrFilePath, iIdxUser_Domain_Name, false) < 0) return ErrGetErrorCode(); return 0; } static int UsrRebuildAliasesIndexes(char const *pszAlsFilePath) { /* Rebuild Domain-Alias index */ if (TbixCreateIndex(pszAlsFilePath, iIdxAlias_Domain_Alias, false, UsrCalcAliasHash) < 0) return ErrGetErrorCode(); return 0; } char *UsrGetMLTableFilePath(UserInfo *pUI, char *pszMLTablePath, int iMaxPath) { UsrGetUserPath(pUI, pszMLTablePath, iMaxPath, 1); StrNCat(pszMLTablePath, MLUSERS_TABLE_FILE, iMaxPath); return pszMLTablePath; } UserType UsrGetUserType(UserInfo *pUI) { if (pUI->pszType == NULL) return usrTypeError; switch (ToUpper(pUI->pszType[0])) { case 'U': return usrTypeUser; case 'M': return usrTypeML; } return usrTypeError; } UserInfo *UsrCreateDefaultUser(char const *pszDomain, char const *pszName, char const *pszPassword, UserType TypeUser) { UserInfo *pUI = (UserInfo *) SysAlloc(sizeof(UserInfo)); if (pUI == NULL) return NULL; pUI->pszDomain = SysStrDup(pszDomain); pUI->uUserID = 0; pUI->pszName = SysStrDup(pszName); pUI->pszPassword = SysStrDup(pszPassword); pUI->pszPath = SysStrDup(pszName); pUI->pszType = SysStrDup((TypeUser == usrTypeUser) ? "U": "M"); /* Load user profile */ ListInit(pUI->InfoList); UsrLoadUserDefaultInfo(pUI->InfoList, pszDomain); return pUI; } static UserInfoVar *UsrAllocVar(char const *pszName, char const *pszValue) { UserInfoVar *pUIV = (UserInfoVar *) SysAlloc(sizeof(UserInfoVar)); if (pUIV == NULL) return NULL; ListLinkInit(pUIV); pUIV->pszName = SysStrDup(pszName); pUIV->pszValue = SysStrDup(pszValue); return pUIV; } static void UsrFreeVar(UserInfoVar *pUIV) { SysFree(pUIV->pszName); SysFree(pUIV->pszValue); SysFree(pUIV); } static int UsrLoadUserInfo(HSLIST &InfoList, unsigned int uUserID, char const *pszFilePath) { char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(pszFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pProfileFile = fopen(pszFilePath, "rt"); if (pProfileFile == NULL) { RLckUnlockSH(hResLock); ErrSetErrorCode(ERR_NO_USER_PRFILE); return ERR_NO_USER_PRFILE; } char szProfileLine[USR_TABLE_LINE_MAX]; while (MscFGets(szProfileLine, sizeof(szProfileLine) - 1, pProfileFile) != NULL) { if (szProfileLine[0] == TAB_COMMENT_CHAR) continue; char **ppszStrings = StrGetTabLineStrings(szProfileLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount == 2) { UserInfoVar *pUIV = UsrAllocVar(ppszStrings[0], ppszStrings[1]); if (pUIV != NULL) ListAddTail(InfoList, (PLISTLINK) pUIV); } StrFreeStrings(ppszStrings); } fclose(pProfileFile); RLckUnlockSH(hResLock); return 0; } static UserInfo *UsrGetUserFromStrings(char **ppszStrings, int iLoadUCfg) { int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount < usrMax) return NULL; char szPassword[512]; if (StrDeCrypt(ppszStrings[usrPassword], szPassword) == NULL) return NULL; UserInfo *pUI = (UserInfo *) SysAlloc(sizeof(UserInfo)); if (pUI == NULL) return NULL; pUI->pszDomain = SysStrDup(ppszStrings[usrDomain]); pUI->uUserID = (unsigned int) atol(ppszStrings[usrID]); pUI->pszName = SysStrDup(ppszStrings[usrName]); pUI->pszPassword = SysStrDup(szPassword); pUI->pszPath = SysStrDup(ppszStrings[usrPath]); pUI->pszType = SysStrDup(ppszStrings[usrType]); /* Load user profile */ ListInit(pUI->InfoList); if (iLoadUCfg) { char szUsrFilePath[SYS_MAX_PATH]; UsrGetUserPath(pUI, szUsrFilePath, sizeof(szUsrFilePath), 1); StrNCat(szUsrFilePath, USER_PROFILE_FILE, sizeof(szUsrFilePath)); UsrLoadUserInfo(pUI->InfoList, pUI->uUserID, szUsrFilePath); } return pUI; } static void UsrFreeInfoList(HSLIST &InfoList) { UserInfoVar *pUIV; while ((pUIV = (UserInfoVar *) ListRemove(InfoList)) != INVALID_SLIST_PTR) UsrFreeVar(pUIV); } static UserInfoVar *UsrGetUserVar(HSLIST &InfoList, char const *pszName) { UserInfoVar *pUIV = (UserInfoVar *) ListFirst(InfoList); for (; pUIV != INVALID_SLIST_PTR; pUIV = (UserInfoVar *) ListNext(InfoList, (PLISTLINK) pUIV)) if (strcmp(pUIV->pszName, pszName) == 0) return pUIV; return NULL; } void UsrFreeUserInfo(UserInfo *pUI) { UsrFreeInfoList(pUI->InfoList); SysFree(pUI->pszDomain); SysFree(pUI->pszPassword); SysFree(pUI->pszName); SysFree(pUI->pszPath); SysFree(pUI->pszType); SysFree(pUI); } char *UsrGetUserInfoVar(UserInfo *pUI, char const *pszName, char const *pszDefault) { UserInfoVar *pUIV = UsrGetUserVar(pUI->InfoList, pszName); if (pUIV != NULL) return SysStrDup(pUIV->pszValue); return (pszDefault != NULL) ? SysStrDup(pszDefault): NULL; } int UsrGetUserInfoVarInt(UserInfo *pUI, char const *pszName, int iDefault) { UserInfoVar *pUIV = UsrGetUserVar(pUI->InfoList, pszName); return (pUIV != NULL) ? atoi(pUIV->pszValue): iDefault; } int UsrDelUserInfoVar(UserInfo *pUI, char const *pszName) { UserInfoVar *pUIV = UsrGetUserVar(pUI->InfoList, pszName); if (pUIV == NULL) { ErrSetErrorCode(ERR_USER_VAR_NOT_FOUND); return ERR_USER_VAR_NOT_FOUND; } ListRemovePtr(pUI->InfoList, (PLISTLINK) pUIV); UsrFreeVar(pUIV); return 0; } int UsrSetUserInfoVar(UserInfo *pUI, char const *pszName, char const *pszValue) { UserInfoVar *pUIV = UsrGetUserVar(pUI->InfoList, pszName); if (pUIV != NULL) { SysFree(pUIV->pszValue); pUIV->pszValue = SysStrDup(pszValue); } else { if ((pUIV = UsrAllocVar(pszName, pszValue)) == NULL) return ErrGetErrorCode(); ListAddTail(pUI->InfoList, (PLISTLINK) pUIV); } return 0; } char **UsrGetProfileVars(UserInfo *pUI) { int iVarsCount = ListGetCount(pUI->InfoList); char **ppszVars = (char **) SysAlloc((iVarsCount + 1) * sizeof(char *)); if (ppszVars == NULL) return NULL; int iCurrVar = 0; UserInfoVar *pUIV = (UserInfoVar *) ListFirst(pUI->InfoList); for (; pUIV != INVALID_SLIST_PTR; pUIV = (UserInfoVar *) ListNext(pUI->InfoList, (PLISTLINK) pUIV)) ppszVars[iCurrVar++] = SysStrDup(pUIV->pszName); ppszVars[iCurrVar] = NULL; return ppszVars; } static int UsrWriteInfoList(HSLIST &InfoList, FILE *pProfileFile) { UserInfoVar *pUIV = (UserInfoVar *) ListFirst(InfoList); for (; pUIV != INVALID_SLIST_PTR; pUIV = (UserInfoVar *) ListNext(InfoList, (PLISTLINK) pUIV)) { /* Write variabile name */ char *pszQuoted = StrQuote(pUIV->pszName, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pProfileFile, "%s\t", pszQuoted); SysFree(pszQuoted); /* Write variabile value */ pszQuoted = StrQuote(pUIV->pszValue, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pProfileFile, "%s\n", pszQuoted); SysFree(pszQuoted); } return 0; } static int UsrGetDefaultInfoFile(char const *pszDomain, char *pszInfoFile, int iMaxPath) { if (pszDomain != NULL) { /* Try to lookup domain specific configuration */ MDomGetDomainPath(pszDomain, pszInfoFile, iMaxPath, 1); StrNCat(pszInfoFile, DEFAULT_USER_PROFILE_FILE, iMaxPath); if (SysExistFile(pszInfoFile)) return 0; } /* Try to lookup global configuration */ CfgGetRootPath(pszInfoFile, iMaxPath); StrNCat(pszInfoFile, DEFAULT_USER_PROFILE_FILE, iMaxPath); if (!SysExistFile(pszInfoFile)) { ErrSetErrorCode(ERR_NO_USER_DEFAULT_PRFILE); return ERR_NO_USER_DEFAULT_PRFILE; } return 0; } static int UsrLoadUserDefaultInfo(HSLIST &InfoList, char const *pszDomain) { char szUserDefFilePath[SYS_MAX_PATH]; if (UsrGetDefaultInfoFile(pszDomain, szUserDefFilePath, sizeof(szUserDefFilePath)) < 0) return ErrGetErrorCode(); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szUserDefFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pProfileFile = fopen(szUserDefFilePath, "rt"); if (pProfileFile == NULL) { ErrSetErrorCode(ERR_NO_USER_DEFAULT_PRFILE); RLckUnlockSH(hResLock); return ERR_NO_USER_DEFAULT_PRFILE; } char szProfileLine[USR_TABLE_LINE_MAX]; while (MscFGets(szProfileLine, sizeof(szProfileLine) - 1, pProfileFile) != NULL) { if (szProfileLine[0] == TAB_COMMENT_CHAR) continue; char **ppszStrings = StrGetTabLineStrings(szProfileLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount == 2) { UserInfoVar *pUIV = UsrAllocVar(ppszStrings[0], ppszStrings[1]); if (pUIV != NULL) ListAddTail(InfoList, (PLISTLINK) pUIV); } StrFreeStrings(ppszStrings); } fclose(pProfileFile); RLckUnlockSH(hResLock); return 0; } static int UsrAliasLookupNameLK(char const *pszAlsFilePath, char const *pszDomain, char const *pszAlias, char *pszName, bool bWildMatch) { /* Lookup record using the specified index ( lookup precise aliases ) */ char **ppszTabTokens = TbixLookup(pszAlsFilePath, iIdxAlias_Domain_Alias, false, pszDomain, pszAlias, NULL); if (ppszTabTokens != NULL) { if (pszName != NULL) strcpy(pszName, ppszTabTokens[alsName]); StrFreeStrings(ppszTabTokens); return 1; } /* We can stop here if wild alias matching is not required */ if (!bWildMatch) return 0; /* Lookup record using the specified index ( lookup wild aliases grouped */ /* under WILD_ALIASES_HASH hash key ) */ unsigned long ulLkHVal = WILD_ALIASES_HASH; INDEX_HANDLE hIndexLookup = TbixOpenHandle(pszAlsFilePath, iIdxAlias_Domain_Alias, &ulLkHVal, 1); if (hIndexLookup != INVALID_INDEX_HANDLE) { int iMaxLength = -1; for (ppszTabTokens = TbixFirstRecord(hIndexLookup); ppszTabTokens != NULL; ppszTabTokens = TbixNextRecord(hIndexLookup)) { int iFieldsCount = StrStringsCount(ppszTabTokens); if (iFieldsCount >= alsMax && StrIWildMatch(pszDomain, ppszTabTokens[alsDomain]) && StrIWildMatch(pszAlias, ppszTabTokens[alsAlias])) { int iLength = strlen(ppszTabTokens[alsDomain]) + strlen(ppszTabTokens[alsAlias]); if (iLength > iMaxLength) { iMaxLength = iLength; if (pszName != NULL) strcpy(pszName, ppszTabTokens[alsName]); } } StrFreeStrings(ppszTabTokens); } TbixCloseHandle(hIndexLookup); if (iMaxLength > 0) return 1; } return 0; } int UsrAliasLookupName(char const *pszDomain, char const *pszAlias, char *pszName, bool bWildMatch) { char szAlsFilePath[SYS_MAX_PATH]; UsrGetAliasFilePath(szAlsFilePath, sizeof(szAlsFilePath)); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szAlsFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return 0; int iLookupResult = UsrAliasLookupNameLK(szAlsFilePath, pszDomain, pszAlias, pszName, bWildMatch); RLckUnlockSH(hResLock); return iLookupResult; } static int UsrWriteAlias(FILE *pAlsFile, AliasInfo *pAI) { /* Domain */ char *pszQuoted = StrQuote(pAI->pszDomain, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pAlsFile, "%s\t", pszQuoted); SysFree(pszQuoted); /* Alias */ pszQuoted = StrQuote(pAI->pszAlias, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pAlsFile, "%s\t", pszQuoted); SysFree(pszQuoted); /* Account name */ pszQuoted = StrQuote(pAI->pszName, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pAlsFile, "%s\n", pszQuoted); SysFree(pszQuoted); return 0; } AliasInfo *UsrAllocAlias(char const *pszDomain, char const *pszAlias, char const *pszName) { AliasInfo *pAI = (AliasInfo *) SysAlloc(sizeof(AliasInfo)); if (pAI == NULL) return NULL; pAI->pszDomain = (pszDomain != NULL) ? SysStrDup(pszDomain): NULL; pAI->pszAlias = (pszAlias != NULL) ? SysStrDup(pszAlias): NULL; pAI->pszName = (pszName != NULL) ? SysStrDup(pszName): NULL; return pAI; } void UsrFreeAlias(AliasInfo *pAI) { SysFree(pAI->pszDomain); SysFree(pAI->pszAlias); SysFree(pAI->pszName); SysFree(pAI); } int UsrAddAlias(AliasInfo *pAI) { char szAlsFilePath[SYS_MAX_PATH]; UsrGetAliasFilePath(szAlsFilePath, sizeof(szAlsFilePath)); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szAlsFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pAlsFile = fopen(szAlsFilePath, "r+t"); if (pAlsFile == NULL) { ErrSetErrorCode(ERR_ALIAS_FILE_NOT_FOUND); RLckUnlockEX(hResLock); return ERR_ALIAS_FILE_NOT_FOUND; } char szAlsLine[USR_ALIAS_LINE_MAX]; while (MscFGets(szAlsLine, sizeof(szAlsLine) - 1, pAlsFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szAlsLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if ((iFieldsCount >= alsMax) && (stricmp(pAI->pszDomain, ppszStrings[alsDomain]) == 0) && (stricmp(pAI->pszAlias, ppszStrings[alsAlias]) == 0)) { StrFreeStrings(ppszStrings); fclose(pAlsFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_ALIAS_EXIST); return ERR_ALIAS_EXIST; } StrFreeStrings(ppszStrings); } fseek(pAlsFile, 0, SEEK_END); if (UsrWriteAlias(pAlsFile, pAI) < 0) { fclose(pAlsFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_WRITE_ALIAS_FILE); return ERR_WRITE_ALIAS_FILE; } fclose(pAlsFile); /* Rebuild indexes */ if (UsrRebuildAliasesIndexes(szAlsFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); return 0; } int UsrRemoveAlias(char const *pszDomain, char const *pszAlias) { char szAlsFilePath[SYS_MAX_PATH]; UsrGetAliasFilePath(szAlsFilePath, sizeof(szAlsFilePath)); char szTmpFile[SYS_MAX_PATH]; UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile)); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szAlsFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) { ErrorPush(); CheckRemoveFile(szTmpFile); return ErrorPop(); } FILE *pAlsFile = fopen(szAlsFilePath, "rt"); if (pAlsFile == NULL) { RLckUnlockEX(hResLock); CheckRemoveFile(szTmpFile); ErrSetErrorCode(ERR_ALIAS_FILE_NOT_FOUND); return ERR_ALIAS_FILE_NOT_FOUND; } FILE *pTmpFile = fopen(szTmpFile, "wt"); if (pTmpFile == NULL) { fclose(pAlsFile); RLckUnlockEX(hResLock); CheckRemoveFile(szTmpFile); ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } int iAliasFound = 0; char szAlsLine[USR_ALIAS_LINE_MAX]; while (MscFGets(szAlsLine, sizeof(szAlsLine) - 1, pAlsFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szAlsLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if ((iFieldsCount >= alsMax) && (stricmp(pszDomain, ppszStrings[alsDomain]) == 0) && (stricmp(pszAlias, ppszStrings[alsAlias]) == 0)) { ++iAliasFound; } else fprintf(pTmpFile, "%s\n", szAlsLine); StrFreeStrings(ppszStrings); } fclose(pAlsFile); fclose(pTmpFile); if (iAliasFound == 0) { SysRemove(szTmpFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_ALIAS_NOT_FOUND); return ERR_ALIAS_NOT_FOUND; } if (MscMoveFile(szTmpFile, szAlsFilePath) < 0) { RLckUnlockEX(hResLock); return ErrGetErrorCode(); } /* Rebuild indexes */ if (UsrRebuildAliasesIndexes(szAlsFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); return 0; } int UsrRemoveDomainAliases(char const *pszDomain) { char szAlsFilePath[SYS_MAX_PATH]; UsrGetAliasFilePath(szAlsFilePath, sizeof(szAlsFilePath)); char szTmpFile[SYS_MAX_PATH]; UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile)); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szAlsFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) { ErrorPush(); CheckRemoveFile(szTmpFile); return ErrorPop(); } FILE *pAlsFile = fopen(szAlsFilePath, "rt"); if (pAlsFile == NULL) { RLckUnlockEX(hResLock); CheckRemoveFile(szTmpFile); ErrSetErrorCode(ERR_ALIAS_FILE_NOT_FOUND); return ERR_ALIAS_FILE_NOT_FOUND; } FILE *pTmpFile = fopen(szTmpFile, "wt"); if (pTmpFile == NULL) { fclose(pAlsFile); RLckUnlockEX(hResLock); CheckRemoveFile(szTmpFile); ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } int iAliasFound = 0; char szAlsLine[USR_ALIAS_LINE_MAX]; while (MscFGets(szAlsLine, sizeof(szAlsLine) - 1, pAlsFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szAlsLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if ((iFieldsCount >= alsMax) && (stricmp(pszDomain, ppszStrings[alsDomain]) == 0)) { ++iAliasFound; } else fprintf(pTmpFile, "%s\n", szAlsLine); StrFreeStrings(ppszStrings); } fclose(pAlsFile); fclose(pTmpFile); if (iAliasFound == 0) { SysRemove(szTmpFile); RLckUnlockEX(hResLock); return 0; } if (MscMoveFile(szTmpFile, szAlsFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } /* Rebuild indexes */ if (UsrRebuildAliasesIndexes(szAlsFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); return 0; } static int UsrRemoveUserAlias(char const *pszDomain, char const *pszName) { char szAlsFilePath[SYS_MAX_PATH]; UsrGetAliasFilePath(szAlsFilePath, sizeof(szAlsFilePath)); char szTmpFile[SYS_MAX_PATH]; UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile)); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szAlsFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pAlsFile = fopen(szAlsFilePath, "rt"); if (pAlsFile == NULL) { RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_ALIAS_FILE_NOT_FOUND); return ERR_ALIAS_FILE_NOT_FOUND; } FILE *pTmpFile = fopen(szTmpFile, "wt"); if (pTmpFile == NULL) { fclose(pAlsFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } char szUserAddress[MAX_ADDR_NAME]; sprintf(szUserAddress, "%s@%s", pszName, pszDomain); int iAliasFound = 0; char szAlsLine[USR_ALIAS_LINE_MAX]; while (MscFGets(szAlsLine, sizeof(szAlsLine) - 1, pAlsFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szAlsLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if ((iFieldsCount >= alsMax) && (((stricmp(pszName, ppszStrings[alsName]) == 0) && (stricmp(pszDomain, ppszStrings[alsDomain]) == 0)) || (stricmp(szUserAddress, ppszStrings[alsName]) == 0))) { ++iAliasFound; } else fprintf(pTmpFile, "%s\n", szAlsLine); StrFreeStrings(ppszStrings); } fclose(pAlsFile); fclose(pTmpFile); if (iAliasFound == 0) { SysRemove(szTmpFile); RLckUnlockEX(hResLock); return 0; } if (MscMoveFile(szTmpFile, szAlsFilePath) < 0) { RLckUnlockEX(hResLock); return ErrGetErrorCode(); } /* Rebuild indexes */ if (UsrRebuildAliasesIndexes(szAlsFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); return 0; } static UserInfo *UsrGetUserByNameLK(char const *pszUsrFilePath, char const *pszDomain, char const *pszName) { /* Lookup record using the specified index */ char **ppszTabTokens = TbixLookup(pszUsrFilePath, iIdxUser_Domain_Name, false, pszDomain, pszName, NULL); if (ppszTabTokens == NULL) { ErrSetErrorCode(ERR_USER_NOT_FOUND); return NULL; } UserInfo *pUI = UsrGetUserFromStrings(ppszTabTokens, 1); StrFreeStrings(ppszTabTokens); return pUI; } UserInfo *UsrLookupUser(char const *pszDomain, char const *pszName) { char szUsrFilePath[SYS_MAX_PATH]; UsrGetTableFilePath(szUsrFilePath, sizeof(szUsrFilePath)); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szUsrFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return NULL; UserInfo *pUI = UsrGetUserByNameLK(szUsrFilePath, pszDomain, pszName); RLckUnlockSH(hResLock); return pUI; } UserInfo *UsrGetUserByName(char const *pszDomain, char const *pszName) { /* Check for alias domain */ UserInfo *pUI = UsrLookupUser(pszDomain, pszName); char szADomain[MAX_HOST_NAME]; /* Check for alias domain if first lookup failed */ if (pUI == NULL && ADomLookupDomain(pszDomain, szADomain, true)) pUI = UsrLookupUser(szADomain, pszName); return pUI; } static UserInfo *UsrGetUserByNameOrAliasNDA(char const *pszDomain, char const *pszName, char *pszRealAddr) { char const *pszAliasedUser = NULL; char const *pszAliasedDomain = NULL; char szAliasedAccount[MAX_ADDR_NAME] = ""; char szAliasedName[MAX_ADDR_NAME] = ""; char szAliasedDomain[MAX_ADDR_NAME] = ""; if (UsrAliasLookupName(pszDomain, pszName, szAliasedAccount)) { if (USmtpSplitEmailAddr(szAliasedAccount, szAliasedName, szAliasedDomain) < 0) { pszAliasedUser = szAliasedAccount; pszAliasedDomain = pszDomain; } else { pszAliasedUser = szAliasedName; pszAliasedDomain = szAliasedDomain; } } char szUsrFilePath[SYS_MAX_PATH]; UsrGetTableFilePath(szUsrFilePath, sizeof(szUsrFilePath)); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szUsrFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return NULL; UserInfo *pUI = UsrGetUserByNameLK(szUsrFilePath, pszDomain, pszName); if (pUI == NULL && pszAliasedUser != NULL) pUI = UsrGetUserByNameLK(szUsrFilePath, pszAliasedDomain, pszAliasedUser); if (pUI != NULL && pszRealAddr != NULL) UsrGetAddress(pUI, pszRealAddr); RLckUnlockSH(hResLock); return pUI; } UserInfo *UsrGetUserByNameOrAlias(char const *pszDomain, char const *pszName, char *pszRealAddr) { UserInfo *pUI = UsrGetUserByNameOrAliasNDA(pszDomain, pszName, pszRealAddr); char szADomain[MAX_HOST_NAME]; /* Check for alias domain if first lookup failed */ if (pUI == NULL && ADomLookupDomain(pszDomain, szADomain, true)) pUI = UsrGetUserByNameOrAliasNDA(szADomain, pszName, pszRealAddr); return pUI; } static int UsrDropUserEnv(UserInfo *pUI) { /* User directory cleaning */ char szUsrUserPath[SYS_MAX_PATH]; UsrGetUserPath(pUI, szUsrUserPath, sizeof(szUsrUserPath), 0); if (MscClearDirectory(szUsrUserPath) < 0) return ErrGetErrorCode(); /* User directory removing */ if (SysRemoveDir(szUsrUserPath) < 0) return ErrGetErrorCode(); return 0; } static int UsrWriteUser(UserInfo *pUI, FILE *pUsrFile) { /* Domain */ char *pszQuoted = StrQuote(pUI->pszDomain, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pUsrFile, "%s\t", pszQuoted); SysFree(pszQuoted); /* Name */ pszQuoted = StrQuote(pUI->pszName, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pUsrFile, "%s\t", pszQuoted); SysFree(pszQuoted); /* Password */ char szPassword[512]; StrCrypt(pUI->pszPassword, szPassword); pszQuoted = StrQuote(szPassword, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pUsrFile, "%s\t", pszQuoted); SysFree(pszQuoted); /* UserID */ fprintf(pUsrFile, "%u\t", pUI->uUserID); /* Directory */ pszQuoted = StrQuote(pUI->pszPath, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pUsrFile, "%s\t", pszQuoted); SysFree(pszQuoted); /* User type */ pszQuoted = StrQuote(pUI->pszType, '"'); if (pszQuoted == NULL) return ErrGetErrorCode(); fprintf(pUsrFile, "%s\n", pszQuoted); SysFree(pszQuoted); return 0; } int UsrRemoveUser(char const *pszDomain, char const *pszName, unsigned int uUserID) { char szUsrFilePath[SYS_MAX_PATH]; UsrGetTableFilePath(szUsrFilePath, sizeof(szUsrFilePath)); char szTmpFile[SYS_MAX_PATH]; UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile)); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szUsrFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) { ErrorPush(); CheckRemoveFile(szTmpFile); return ErrorPop(); } FILE *pUsrFile = fopen(szUsrFilePath, "rt"); if (pUsrFile == NULL) { RLckUnlockEX(hResLock); CheckRemoveFile(szTmpFile); ErrSetErrorCode(ERR_USERS_FILE_NOT_FOUND); return ERR_USERS_FILE_NOT_FOUND; } FILE *pTmpFile = fopen(szTmpFile, "wt"); if (pTmpFile == NULL) { fclose(pUsrFile); RLckUnlockEX(hResLock); CheckRemoveFile(szTmpFile); ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } UserInfo *pUI = NULL; char szUsrLine[USR_TABLE_LINE_MAX]; while (MscFGets(szUsrLine, sizeof(szUsrLine) - 1, pUsrFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szUsrLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= usrMax && stricmp(pszDomain, ppszStrings[usrDomain]) == 0 && ((uUserID != 0 && uUserID == (unsigned int) atol(ppszStrings[usrID])) || (pszName != NULL && stricmp(pszName, ppszStrings[usrName]) == 0))) { if (pUI != NULL) UsrFreeUserInfo(pUI); pUI = UsrGetUserFromStrings(ppszStrings, 1); } else fprintf(pTmpFile, "%s\n", szUsrLine); StrFreeStrings(ppszStrings); } fclose(pUsrFile); fclose(pTmpFile); if (pUI == NULL) { SysRemove(szTmpFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_USER_NOT_FOUND); return ERR_USER_NOT_FOUND; } if (MscMoveFile(szTmpFile, szUsrFilePath) < 0) { ErrorPush(); UsrFreeUserInfo(pUI); RLckUnlockEX(hResLock); return ErrorPop(); } /* Rebuild indexes */ if (UsrRebuildUsersIndexes(szUsrFilePath) < 0) { ErrorPush(); UsrFreeUserInfo(pUI); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); GwLkRemoveUserLinks(pUI->pszDomain, pUI->pszName); ExAlRemoveUserAliases(pUI->pszDomain, pUI->pszName); UsrRemoveUserAlias(pUI->pszDomain, pUI->pszName); /* Try ( if defined ) to remove external auth user */ UAthDelUser(AUTH_SERVICE_POP3, pUI); UsrDropUserEnv(pUI); UsrFreeUserInfo(pUI); return 0; } int UsrModifyUser(UserInfo *pUI) { char szUsrFilePath[SYS_MAX_PATH]; UsrGetTableFilePath(szUsrFilePath, sizeof(szUsrFilePath)); char szTmpFile[SYS_MAX_PATH]; UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile)); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szUsrFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) { ErrorPush(); CheckRemoveFile(szTmpFile); return ErrorPop(); } FILE *pUsrFile = fopen(szUsrFilePath, "rt"); if (pUsrFile == NULL) { RLckUnlockEX(hResLock); CheckRemoveFile(szTmpFile); ErrSetErrorCode(ERR_USERS_FILE_NOT_FOUND); return ERR_USERS_FILE_NOT_FOUND; } FILE *pTmpFile = fopen(szTmpFile, "wt"); if (pTmpFile == NULL) { fclose(pUsrFile); RLckUnlockEX(hResLock); CheckRemoveFile(szTmpFile); ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } UserInfo *pFoundUI = NULL; char szUsrLine[USR_TABLE_LINE_MAX]; while (MscFGets(szUsrLine, sizeof(szUsrLine) - 1, pUsrFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szUsrLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if ((iFieldsCount >= usrMax) && (pFoundUI == NULL) && (pUI->uUserID == (unsigned int) atol(ppszStrings[usrID])) && (stricmp(pUI->pszDomain, ppszStrings[usrDomain]) == 0) && (stricmp(pUI->pszName, ppszStrings[usrName]) == 0)) { if ((UsrWriteUser(pUI, pTmpFile) < 0) || ((pFoundUI = UsrGetUserFromStrings(ppszStrings, 1)) == NULL)) { ErrorPush(); fclose(pUsrFile); fclose(pTmpFile); SysRemove(szTmpFile); RLckUnlockEX(hResLock); return ErrorPop(); } } else fprintf(pTmpFile, "%s\n", szUsrLine); StrFreeStrings(ppszStrings); } fclose(pUsrFile); fclose(pTmpFile); if (pFoundUI == NULL) { SysRemove(szTmpFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_USER_NOT_FOUND); return ERR_USER_NOT_FOUND; } /* Try ( if defined ) to modify external auth user */ UAthModifyUser(AUTH_SERVICE_POP3, pUI); UsrFreeUserInfo(pFoundUI); if (MscMoveFile(szTmpFile, szUsrFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } /* Rebuild indexes */ if (UsrRebuildUsersIndexes(szUsrFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); return 0; } int UsrRemoveDomainUsers(char const *pszDomain) { char szUsrFilePath[SYS_MAX_PATH]; UsrGetTableFilePath(szUsrFilePath, sizeof(szUsrFilePath)); char szTmpFile[SYS_MAX_PATH]; UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile)); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szUsrFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) { ErrorPush(); CheckRemoveFile(szTmpFile); return ErrorPop(); } FILE *pUsrFile = fopen(szUsrFilePath, "rt"); if (pUsrFile == NULL) { RLckUnlockEX(hResLock); CheckRemoveFile(szTmpFile); ErrSetErrorCode(ERR_USERS_FILE_NOT_FOUND); return ERR_USERS_FILE_NOT_FOUND; } FILE *pTmpFile = fopen(szTmpFile, "wt"); if (pTmpFile == NULL) { fclose(pUsrFile); RLckUnlockEX(hResLock); CheckRemoveFile(szTmpFile); ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } int iUsersFound = 0; char szUsrLine[USR_TABLE_LINE_MAX]; while (MscFGets(szUsrLine, sizeof(szUsrLine) - 1, pUsrFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szUsrLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if ((iFieldsCount >= usrMax) && (stricmp(pszDomain, ppszStrings[usrDomain]) == 0)) { ++iUsersFound; } else fprintf(pTmpFile, "%s\n", szUsrLine); StrFreeStrings(ppszStrings); } fclose(pUsrFile); fclose(pTmpFile); if (iUsersFound == 0) { SysRemove(szTmpFile); RLckUnlockEX(hResLock); return 0; } if (MscMoveFile(szTmpFile, szUsrFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } /* Rebuild indexes */ if (UsrRebuildUsersIndexes(szUsrFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); return 0; } static int UsrCreateMailbox(char const *pszUsrUserPath) { if (iMailboxType == XMAIL_MAILBOX) { /* Create mailbox directory */ char szUsrMailboxPath[SYS_MAX_PATH]; StrSNCpy(szUsrMailboxPath, pszUsrUserPath); AppendSlash(szUsrMailboxPath); StrSNCat(szUsrMailboxPath, MAILBOX_DIRECTORY); if (SysMakeDir(szUsrMailboxPath) < 0) return ErrGetErrorCode(); return 0; } return MdirCreateStructure(pszUsrUserPath); } static int UsrPrepareUserEnv(UserInfo *pUI) { char szUsrUserPath[SYS_MAX_PATH]; UsrGetUserPath(pUI, szUsrUserPath, sizeof(szUsrUserPath), 0); /* Create main directory */ if (SysMakeDir(szUsrUserPath) < 0) return ErrGetErrorCode(); if (UsrGetUserType(pUI) == usrTypeUser) { /* Create mailbox directory */ if (UsrCreateMailbox(szUsrUserPath) < 0) { ErrorPush(); MscClearDirectory(szUsrUserPath); SysRemoveDir(szUsrUserPath); return ErrorPop(); } } else { /* Create mailing list users file */ char szMLUsersFilePath[SYS_MAX_PATH]; StrSNCpy(szMLUsersFilePath, szUsrUserPath); AppendSlash(szMLUsersFilePath); StrSNCat(szMLUsersFilePath, MLUSERS_TABLE_FILE); if (MscCreateEmptyFile(szMLUsersFilePath) < 0) { ErrorPush(); MscClearDirectory(szUsrUserPath); SysRemoveDir(szUsrUserPath); return ErrorPop(); } } /* Create profile file */ char szUsrProfileFilePath[SYS_MAX_PATH]; StrSNCpy(szUsrProfileFilePath, szUsrUserPath); AppendSlash(szUsrProfileFilePath); StrSNCat(szUsrProfileFilePath, USER_PROFILE_FILE); FILE *pProfileFile = fopen(szUsrProfileFilePath, "wt"); if (pProfileFile == NULL) { MscClearDirectory(szUsrUserPath); SysRemoveDir(szUsrUserPath); ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } UsrWriteInfoList(pUI->InfoList, pProfileFile); fclose(pProfileFile); return 0; } int UsrAddUser(UserInfo *pUI) { /* Search for overlapping alias ( wildcard alias not checked here ) */ if (UsrAliasLookupName(pUI->pszDomain, pUI->pszName, NULL, false)) { ErrSetErrorCode(ERR_ALIAS_EXIST); return ERR_ALIAS_EXIST; } char szUsrFilePath[SYS_MAX_PATH]; UsrGetTableFilePath(szUsrFilePath, sizeof(szUsrFilePath)); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szUsrFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pUsrFile = fopen(szUsrFilePath, "r+t"); if (pUsrFile == NULL) { RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_USERS_FILE_NOT_FOUND); return ERR_USERS_FILE_NOT_FOUND; } unsigned int uMaxUserID = 0; char szUsrLine[USR_TABLE_LINE_MAX]; while (MscFGets(szUsrLine, sizeof(szUsrLine) - 1, pUsrFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szUsrLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= usrMax) { if ((stricmp(pUI->pszDomain, ppszStrings[usrDomain]) == 0) && (stricmp(pUI->pszName, ppszStrings[usrName]) == 0)) { StrFreeStrings(ppszStrings); fclose(pUsrFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_USER_EXIST); return ERR_USER_EXIST; } unsigned int uUserID = (unsigned int) atol(ppszStrings[usrID]); if (uUserID > uMaxUserID) uMaxUserID = uUserID; } StrFreeStrings(ppszStrings); } pUI->uUserID = uMaxUserID + 1; if (UsrPrepareUserEnv(pUI) < 0) { fclose(pUsrFile); RLckUnlockEX(hResLock); return ErrGetErrorCode(); } fseek(pUsrFile, 0, SEEK_END); if (UsrWriteUser(pUI, pUsrFile) < 0) { fclose(pUsrFile); RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_WRITE_USERS_FILE); return ERR_WRITE_USERS_FILE; } fclose(pUsrFile); /* Rebuild indexes */ if (UsrRebuildUsersIndexes(szUsrFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); /* Try ( if defined ) to add external auth user */ UAthAddUser(AUTH_SERVICE_POP3, pUI); return 0; } static char const *UsrGetMailboxDir(void) { return (iMailboxType == XMAIL_MAILBOX) ? MAILBOX_DIRECTORY: MAILDIR_DIRECTORY; } int UsrFlushUserVars(UserInfo *pUI) { char szUsrUserPath[SYS_MAX_PATH]; UsrGetUserPath(pUI, szUsrUserPath, sizeof(szUsrUserPath), 0); /* Build profile file path */ char szUsrProfileFilePath[SYS_MAX_PATH]; StrSNCpy(szUsrProfileFilePath, szUsrUserPath); AppendSlash(szUsrProfileFilePath); StrSNCat(szUsrProfileFilePath, USER_PROFILE_FILE); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szUsrProfileFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pProfileFile = fopen(szUsrProfileFilePath, "wt"); if (pProfileFile == NULL) { RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } UsrWriteInfoList(pUI->InfoList, pProfileFile); fclose(pProfileFile); RLckUnlockEX(hResLock); return 0; } int UsrGetDBFileSnapShot(char const *pszFileName) { char szUsrFilePath[SYS_MAX_PATH]; UsrGetTableFilePath(szUsrFilePath, sizeof(szUsrFilePath)); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szUsrFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); if (MscCopyFile(pszFileName, szUsrFilePath) < 0) { RLckUnlockSH(hResLock); return ErrGetErrorCode(); } RLckUnlockSH(hResLock); return 0; } USRF_HANDLE UsrOpenDB(void) { UsersDBScanData *pUDBSD = (UsersDBScanData *) SysAlloc(sizeof(UsersDBScanData)); if (pUDBSD == NULL) return INVALID_USRF_HANDLE; UsrGetTmpFile(NULL, pUDBSD->szTmpDBFile, sizeof(pUDBSD->szTmpDBFile)); if (UsrGetDBFileSnapShot(pUDBSD->szTmpDBFile) < 0) { SysFree(pUDBSD); return INVALID_USRF_HANDLE; } if ((pUDBSD->pDBFile = fopen(pUDBSD->szTmpDBFile, "rt")) == NULL) { SysRemove(pUDBSD->szTmpDBFile); SysFree(pUDBSD); return INVALID_USRF_HANDLE; } return (USRF_HANDLE) pUDBSD; } void UsrCloseDB(USRF_HANDLE hUsersDB) { UsersDBScanData *pUDBSD = (UsersDBScanData *) hUsersDB; fclose(pUDBSD->pDBFile); SysRemove(pUDBSD->szTmpDBFile); SysFree(pUDBSD); } UserInfo *UsrGetFirstUser(USRF_HANDLE hUsersDB, int iLoadUCfg) { UsersDBScanData *pUDBSD = (UsersDBScanData *) hUsersDB; rewind(pUDBSD->pDBFile); UserInfo *pUI = NULL; char szUsrLine[USR_TABLE_LINE_MAX]; while ((pUI == NULL) && (MscFGets(szUsrLine, sizeof(szUsrLine) - 1, pUDBSD->pDBFile) != NULL)) { char **ppszStrings = StrGetTabLineStrings(szUsrLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= usrMax) pUI = UsrGetUserFromStrings(ppszStrings, iLoadUCfg); StrFreeStrings(ppszStrings); } return pUI; } UserInfo *UsrGetNextUser(USRF_HANDLE hUsersDB, int iLoadUCfg) { UsersDBScanData *pUDBSD = (UsersDBScanData *) hUsersDB; UserInfo *pUI = NULL; char szUsrLine[USR_TABLE_LINE_MAX]; while ((pUI == NULL) && (MscFGets(szUsrLine, sizeof(szUsrLine) - 1, pUDBSD->pDBFile) != NULL)) { char **ppszStrings = StrGetTabLineStrings(szUsrLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= usrMax) pUI = UsrGetUserFromStrings(ppszStrings, iLoadUCfg); StrFreeStrings(ppszStrings); } return pUI; } static char *UsrGetPop3LocksPath(UserInfo *pUI, char *pszPop3LockPath, int iMaxPath) { CfgGetRootPath(pszPop3LockPath, iMaxPath); StrNCat(pszPop3LockPath, POP3_LOCKS_DIR, iMaxPath); AppendSlash(pszPop3LockPath); char szUserAddress[MAX_ADDR_NAME]; UsrGetAddress(pUI, szUserAddress); StrNCat(pszPop3LockPath, szUserAddress, iMaxPath); return pszPop3LockPath; } int UsrPOP3Lock(UserInfo *pUI) { char szLockPath[SYS_MAX_PATH]; UsrGetPop3LocksPath(pUI, szLockPath, sizeof(szLockPath)); if (SysLockFile(szLockPath) < 0) return ErrGetErrorCode(); return 0; } void UsrPOP3Unlock(UserInfo *pUI) { char szLockPath[SYS_MAX_PATH]; UsrGetPop3LocksPath(pUI, szLockPath, sizeof(szLockPath)); SysUnlockFile(szLockPath); } int UsrClearPop3LocksDir(void) { char szLocksDir[SYS_MAX_PATH]; CfgGetRootPath(szLocksDir, sizeof(szLocksDir)); StrNCat(szLocksDir, POP3_LOCKS_DIR, sizeof(szLocksDir)); return MscClearDirectory(szLocksDir); } /* * This function is intended to create a temporary file name so that * a system move (rename) of such file into a user mailbox (or private directory) * will succeed. Since the system temporary directory may be on another * mount (or drive:), this is required insted of MscSafeGetTmpFile(). * If the DOMAIN private directory exists, the temporary file will be * generated inside there, otherwise inside the XMail temporary directory. */ int UsrGetTmpFile(char const *pszDomain, char *pszTmpFile, int iMaxPath) { char szTmpDir[SYS_MAX_PATH]; if (pszDomain != NULL) { MDomGetDomainPath(pszDomain, szTmpDir, sizeof(szTmpDir) - 1, 1); StrNCat(szTmpDir, USR_DOMAIN_TMPDIR, sizeof(szTmpDir) - 1); if (SysExistDir(szTmpDir)) { if (MscUniqueFile(szTmpDir, pszTmpFile, iMaxPath) < 0) return ErrGetErrorCode(); return 0; } } CfgGetRootPath(szTmpDir, sizeof(szTmpDir)); StrNCat(szTmpDir, USR_TMPDIR, sizeof(szTmpDir)); if (!SysExistDir(szTmpDir) && SysMakeDir(szTmpDir) < 0) return ErrGetErrorCode(); return MscUniqueFile(szTmpDir, pszTmpFile, iMaxPath); } char *UsrGetUserPath(UserInfo *pUI, char *pszUserPath, int iMaxPath, int iFinalSlash) { MDomGetDomainPath(pUI->pszDomain, pszUserPath, iMaxPath, 1); StrNCat(pszUserPath, pUI->pszPath, iMaxPath); if (iFinalSlash) AppendSlash(pszUserPath); return pszUserPath; } char *UsrGetMailboxPath(UserInfo *pUI, char *pszMBPath, int iMaxPath, int iFinalSlash) { UsrGetUserPath(pUI, pszMBPath, iMaxPath, 1); StrNCat(pszMBPath, UsrGetMailboxDir(), iMaxPath); if (iFinalSlash) AppendSlash(pszMBPath); return pszMBPath; } int UsrMoveToMailBox(UserInfo *pUI, char const *pszFileName, char const *pszMessageID) { if (iMailboxType == XMAIL_MAILBOX) { /* Setup full mailbox file path */ char szMBPath[SYS_MAX_PATH]; char szMBFile[SYS_MAX_PATH]; UsrGetMailboxPath(pUI, szMBPath, sizeof(szMBPath), 0); SysSNPrintf(szMBFile, sizeof(szMBFile), "%s" SYS_SLASH_STR "%s", szMBPath, pszMessageID); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szMBPath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); if (SysMoveFile(pszFileName, szMBFile) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); } else { /* Get user Maildir path */ char szMBPath[SYS_MAX_PATH]; UsrGetMailboxPath(pUI, szMBPath, sizeof(szMBPath), 0); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szMBPath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); if (MdirMoveMessage(szMBPath, pszFileName, pszMessageID) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } RLckUnlockEX(hResLock); } return 0; } int UsrGetMailProcessFile(UserInfo *pUI, char const *pszMPPath, unsigned long ulFlags) { int iAppendFiles = 0; char szMPFilePath[SYS_MAX_PATH]; if (ulFlags & GMPROC_DOMAIN) { if (MDomGetDomainPath(pUI->pszDomain, szMPFilePath, sizeof(szMPFilePath) - 1, 1) == NULL) return ErrGetErrorCode(); StrNCat(szMPFilePath, MAILPROCESS_FILE, sizeof(szMPFilePath) - 1); if (SysExistFile(szMPFilePath)) { char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szMPFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); if (MscAppendFile(pszMPPath, szMPFilePath) < 0) { ErrorPush(); CheckRemoveFile(pszMPPath); RLckUnlockSH(hResLock); return ErrorPop(); } RLckUnlockSH(hResLock); iAppendFiles++; } } if (ulFlags & GMPROC_USER) { if (UsrGetUserPath(pUI, szMPFilePath, sizeof(szMPFilePath), 1) == NULL) return ErrGetErrorCode(); StrNCat(szMPFilePath, MAILPROCESS_FILE, sizeof(szMPFilePath)); if (SysExistFile(szMPFilePath)) { char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szMPFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); if (MscAppendFile(pszMPPath, szMPFilePath) < 0) { ErrorPush(); CheckRemoveFile(pszMPPath); RLckUnlockSH(hResLock); return ErrorPop(); } RLckUnlockSH(hResLock); iAppendFiles++; } } if (ulFlags && !iAppendFiles) { ErrSetErrorCode(ERR_NO_MAILPROC_FILE); return ERR_NO_MAILPROC_FILE; } return 0; } int UsrSetMailProcessFile(UserInfo *pUI, char const *pszMPPath, int iWhich) { char szMPFilePath[SYS_MAX_PATH]; if (iWhich == GMPROC_DOMAIN) { if (MDomGetDomainPath(pUI->pszDomain, szMPFilePath, sizeof(szMPFilePath) - 1, 1) == NULL) return ErrGetErrorCode(); } else if (iWhich == GMPROC_USER) { if (UsrGetUserPath(pUI, szMPFilePath, sizeof(szMPFilePath), 1) == NULL) return ErrGetErrorCode(); } else { ErrSetErrorCode(ERR_INVALID_PARAMETER); return ERR_INVALID_PARAMETER; } StrNCat(szMPFilePath, MAILPROCESS_FILE, sizeof(szMPFilePath)); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szMPFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); if (pszMPPath != NULL) { if (MscCopyFile(szMPFilePath, pszMPPath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } } else SysRemove(szMPFilePath); RLckUnlockEX(hResLock); return 0; } char *UsrGetAddress(UserInfo *pUI, char *pszAddress) { sprintf(pszAddress, "%s@%s", pUI->pszName, pUI->pszDomain); return pszAddress; } int UsrGetAliasDBFileSnapShot(char const *pszFileName) { char szAlsFilePath[SYS_MAX_PATH]; UsrGetAliasFilePath(szAlsFilePath, sizeof(szAlsFilePath)); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szAlsFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); if (MscCopyFile(pszFileName, szAlsFilePath) < 0) { RLckUnlockSH(hResLock); return ErrGetErrorCode(); } RLckUnlockSH(hResLock); return 0; } ALSF_HANDLE UsrAliasOpenDB(void) { AliasDBScanData *pADBSD = (AliasDBScanData *) SysAlloc(sizeof(AliasDBScanData)); if (pADBSD == NULL) return INVALID_ALSF_HANDLE; UsrGetTmpFile(NULL, pADBSD->szTmpDBFile, sizeof(pADBSD->szTmpDBFile)); if (UsrGetAliasDBFileSnapShot(pADBSD->szTmpDBFile) < 0) { SysFree(pADBSD); return INVALID_ALSF_HANDLE; } if ((pADBSD->pDBFile = fopen(pADBSD->szTmpDBFile, "rt")) == NULL) { SysRemove(pADBSD->szTmpDBFile); SysFree(pADBSD); return INVALID_ALSF_HANDLE; } return (ALSF_HANDLE) pADBSD; } void UsrAliasCloseDB(ALSF_HANDLE hAliasDB) { AliasDBScanData *pADBSD = (AliasDBScanData *) hAliasDB; fclose(pADBSD->pDBFile); SysRemove(pADBSD->szTmpDBFile); SysFree(pADBSD); } AliasInfo *UsrAliasGetFirst(ALSF_HANDLE hAliasDB) { AliasDBScanData *pADBSD = (AliasDBScanData *) hAliasDB; rewind(pADBSD->pDBFile); AliasInfo *pAI = NULL; char szUsrLine[USR_ALIAS_LINE_MAX]; while ((pAI == NULL) && (MscFGets(szUsrLine, sizeof(szUsrLine) - 1, pADBSD->pDBFile) != NULL)) { char **ppszStrings = StrGetTabLineStrings(szUsrLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= alsMax) pAI = UsrAllocAlias(ppszStrings[alsDomain], ppszStrings[alsAlias], ppszStrings[alsName]); StrFreeStrings(ppszStrings); } return pAI; } AliasInfo *UsrAliasGetNext(ALSF_HANDLE hAliasDB) { AliasDBScanData *pADBSD = (AliasDBScanData *) hAliasDB; AliasInfo *pAI = NULL; char szUsrLine[USR_ALIAS_LINE_MAX]; while (pAI == NULL && MscFGets(szUsrLine, sizeof(szUsrLine) - 1, pADBSD->pDBFile) != NULL) { char **ppszStrings = StrGetTabLineStrings(szUsrLine); if (ppszStrings == NULL) continue; int iFieldsCount = StrStringsCount(ppszStrings); if (iFieldsCount >= alsMax) pAI = UsrAllocAlias(ppszStrings[alsDomain], ppszStrings[alsAlias], ppszStrings[alsName]); StrFreeStrings(ppszStrings); } return pAI; } xmail-1.27/SSLMisc.h0000644000175000017500000000175111341640430013455 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SSLMISC_H #define _SSLMISC_H int SSLGetRandBytes(unsigned char *pBytes, int iCount); #endif xmail-1.27/Maildir.h0000644000175000017500000000243111341640430013555 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _MAILDIR_H #define _MAILDIR_H #define MAILDIR_DIRECTORY "Maildir" int MdirCreateStructure(const char *pszBasePath); int MdirGetTmpMaildirEntry(const char *pszMaildirPath, char *pszFilePath, int iMaxPath); int MdirMoveTmpEntryInNew(const char *pszTmpEntryPath); int MdirMoveMessage(const char *pszMaildirPath, const char *pszFileName, const char *pszMessageID = NULL); #endif xmail-1.27/SysIncludeWin.h0000644000175000017500000000254211341640430014737 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SYSINCLUDEWIN_H #define _SYSINCLUDEWIN_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif xmail-1.27/SSLMisc.cpp0000644000175000017500000000272011341640430014005 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "StrUtils.h" #include "SSLMisc.h" #include "openssl/bio.h" #include "openssl/rsa.h" #include "openssl/crypto.h" #include "openssl/x509.h" #include "openssl/pem.h" #include "openssl/ssl.h" #include "openssl/evp.h" #include "openssl/err.h" #include "openssl/rand.h" #ifndef OPENSSL_NO_ENGINE #include "openssl/engine.h" #endif int SSLGetRandBytes(unsigned char *pBytes, int iCount) { if (!RAND_pseudo_bytes(pBytes, iCount)) { ErrSetErrorCode(ERR_GET_RAND_BYTES); return ERR_GET_RAND_BYTES; } return 0; } xmail-1.27/LMAILSvr.h0000644000175000017500000000234511341640430013531 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _LMAILSVR_H #define _LMAILSVR_H #define LMAILF_STOP_SERVER (1 << 0) #define LMAILF_LOG_ENABLED (1 << 1) struct LMAILConfig { unsigned long ulFlags; long lNumThreads; int iSleepTimeout; long lThreadCount; }; char *LMAILGetSpoolDir(char *pszSpoolPath, int iMaxPath); unsigned int LMAILThreadProc(void *pThreadData); #endif xmail-1.27/TabIndex.cpp0000644000175000017500000004043411341640430014232 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "Array.h" #include "ShBlocks.h" #include "StrUtils.h" #include "SList.h" #include "BuffSock.h" #include "MiscUtils.h" #include "TabIndex.h" /* * The index version MUST be incremented at every file format change! */ #define TAB_INDEX_CURR_VERSION 3 #define TAB_SAMPLE_LINES 32 #define TAB_MIN_HASH_SIZE 17 #define TAB_INDEX_DIR "tabindex" #define TAB_INDEX_MAGIC (*(SYS_UINT32 *) "ABDL") #define KEY_BUFFER_SIZE 1024 #define TAB_RECORD_BUFFER_SIZE 2048 #define TOKEN_SEP_STR "\t" #define TAB_INIT_RESSET_SIZE 128 struct TabHashLink { SysListHead Lnk; TabIdxUINT uOffset; }; struct TabHashNode { SysListHead NodeList; TabIdxUINT uCount; }; struct TabHashFileHeader { SYS_UINT32 uMagic; SYS_UINT32 uVersion; SYS_UINT32 uHashSize; }; struct TabHashIndex { TabHashFileHeader HFH; FILE *pIdxFile; }; struct IndexLookupData { ARRAY_HANDLE hArray; long lRecCount; FILE *pTabFile; TabIdxUINT *pHTblC; long lArIdx; long lHTblI; }; static int TbixCalcHashSize(FILE *pTabFile, char *pszLnBuff, int iBufferSize) { int iLineCnt = 0, iHashSize; SYS_OFF_T llOrigOffset, llOffset, llCurrOffset, llLineSize, llFileSize; llOrigOffset = Sys_ftell(pTabFile); rewind(pTabFile); llCurrOffset = llLineSize = 0; while (iLineCnt < TAB_SAMPLE_LINES) { if (MscGetString(pTabFile, pszLnBuff, iBufferSize - 1) == NULL) break; llOffset = Sys_ftell(pTabFile); if (!IsEmptyString(pszLnBuff) && pszLnBuff[0] != TAB_COMMENT_CHAR) { llLineSize += llOffset - llCurrOffset; ++iLineCnt; } llCurrOffset = llOffset; } if (iLineCnt == 0) { Sys_fseek(pTabFile, llOrigOffset, SEEK_SET); return TAB_MIN_HASH_SIZE; } llLineSize /= iLineCnt; Sys_fseek(pTabFile, 0, SEEK_END); llFileSize = Sys_ftell(pTabFile); Sys_fseek(pTabFile, llOrigOffset, SEEK_SET); iHashSize = (int) (llFileSize / llLineSize) + TAB_MIN_HASH_SIZE; while (!IsPrimeNumber(iHashSize)) ++iHashSize; return iHashSize; } char *TbixGetIndexFile(char const *pszTabFilePath, int const *piFieldsIdx, char *pszIdxFile) { int i; char szFileDir[SYS_MAX_PATH], szFileName[SYS_MAX_PATH], szIndex[64]; MscSplitPath(pszTabFilePath, szFileDir, sizeof(szFileDir), szFileName, sizeof(szFileName), NULL, 0); sprintf(pszIdxFile, "%s%s%s%s-", szFileDir, TAB_INDEX_DIR, SYS_SLASH_STR, szFileName); for (i = 0; piFieldsIdx[i] != INDEX_SEQUENCE_TERMINATOR; i++) { sprintf(szIndex, "%02d", piFieldsIdx[i]); strcat(pszIdxFile, szIndex); } strcat(pszIdxFile, ".hdx"); return pszIdxFile; } static int TbixFreeHash(TabHashNode *pHash, int iHashSize) { int i; SysListHead *pHead, *pPos; TabHashLink *pHL; for (i = 0; i < iHashSize; i++) { pHead = &pHash[i].NodeList; while ((pPos = SYS_LIST_FIRST(pHead)) != NULL) { pHL = SYS_LIST_ENTRY(pPos, TabHashLink, Lnk); SYS_LIST_DEL(&pHL->Lnk); SysFree(pHL); } } SysFree(pHash); return 0; } int TbixCreateIndex(char const *pszTabFilePath, int const *piFieldsIdx, bool bCaseSens, int (*pHashFunc) (char const *const *, int const *, unsigned long *, bool)) { int i, iHashSize; FILE *pTabFile, *pIdxFile; TabHashNode *pHash; TabHashFileHeader HFH; char szIdxFile[SYS_MAX_PATH], szLnBuff[TAB_RECORD_BUFFER_SIZE]; /* Adjust hash function */ if (pHashFunc == NULL) pHashFunc = TbixCalculateHash; /* Build index file name */ if (TbixGetIndexFile(pszTabFilePath, piFieldsIdx, szIdxFile) < 0) return ErrGetErrorCode(); if ((pTabFile = fopen(pszTabFilePath, "rb")) == NULL) { ErrSetErrorCode(ERR_FILE_OPEN, pszTabFilePath); return ERR_FILE_OPEN; } /* Calculate file lookup hash size */ iHashSize = TbixCalcHashSize(pTabFile, szLnBuff, sizeof(szLnBuff)); /* Alloc and init hash records */ if ((pHash = (TabHashNode *) SysAlloc(iHashSize * sizeof(TabHashNode))) == NULL) { fclose(pTabFile); return ErrGetErrorCode(); } for (i = 0; i < iHashSize; i++) SYS_INIT_LIST_HEAD(&pHash[i].NodeList); /* Setup indexes records */ for (;;) { /* Get current offset */ unsigned long ulHashVal; TabIdxUINT uFileOffset; char **ppszToks; uFileOffset = (TabIdxUINT) Sys_ftell(pTabFile); if (MscGetString(pTabFile, szLnBuff, sizeof(szLnBuff) - 1) == NULL) break; if (szLnBuff[0] == TAB_COMMENT_CHAR || (ppszToks = StrGetTabLineStrings(szLnBuff)) == NULL) continue; /* Calculate hash value */ if ((*pHashFunc)(ppszToks, piFieldsIdx, &ulHashVal, bCaseSens) == 0) { int iHashIndex = (int) (ulHashVal % (unsigned int) iHashSize); TabHashLink *pHL; if ((pHL = (TabHashLink *) SysAlloc(sizeof(TabHashLink))) == NULL) { StrFreeStrings(ppszToks); TbixFreeHash(pHash, iHashSize); fclose(pTabFile); return ErrGetErrorCode(); } pHL->uOffset = uFileOffset; SYS_LIST_ADDT(&pHL->Lnk, &pHash[iHashIndex].NodeList); pHash[iHashIndex].uCount++; } StrFreeStrings(ppszToks); } fclose(pTabFile); /* Write index file */ if ((pIdxFile = fopen(szIdxFile, "wb")) == NULL) { TbixFreeHash(pHash, iHashSize); ErrSetErrorCode(ERR_FILE_CREATE, szIdxFile); return ERR_FILE_CREATE; } /* Write file header */ ZeroData(HFH); HFH.uMagic = TAB_INDEX_MAGIC; HFH.uVersion = TAB_INDEX_CURR_VERSION; HFH.uHashSize = iHashSize; if (!fwrite(&HFH, sizeof(HFH), 1, pIdxFile)) { fclose(pIdxFile); SysRemove(szIdxFile); TbixFreeHash(pHash, iHashSize); ErrSetErrorCode(ERR_FILE_WRITE); return ERR_FILE_WRITE; } /* Dump main table */ TabIdxUINT uCurrOffset = sizeof(HFH) + iHashSize * sizeof(TabIdxUINT); for (i = 0; i < iHashSize; i++) { TabIdxUINT uTableOffset = 0; if (pHash[i].uCount != 0) { uTableOffset = uCurrOffset; uCurrOffset += (pHash[i].uCount + 1) * sizeof(TabIdxUINT); } if (!fwrite(&uTableOffset, sizeof(uTableOffset), 1, pIdxFile)) { fclose(pIdxFile); SysRemove(szIdxFile); TbixFreeHash(pHash, iHashSize); ErrSetErrorCode(ERR_FILE_WRITE); return ERR_FILE_WRITE; } } /* Dump hash tables */ for (i = 0; i < iHashSize; i++) { TabIdxUINT uRecCount = pHash[i].uCount; if (uRecCount != 0) { SysListHead *pHead, *pPos; if (!fwrite(&uRecCount, sizeof(uRecCount), 1, pIdxFile)) { fclose(pIdxFile); SysRemove(szIdxFile); TbixFreeHash(pHash, iHashSize); ErrSetErrorCode(ERR_FILE_WRITE); return ERR_FILE_WRITE; } pHead = &pHash[i].NodeList; SYS_LIST_FOR_EACH(pPos, pHead) { TabHashLink *pHL = SYS_LIST_ENTRY(pPos, TabHashLink, Lnk); TabIdxUINT uRecordOffset = pHL->uOffset; if (!fwrite(&uRecordOffset, sizeof(uRecordOffset), 1, pIdxFile)) { fclose(pIdxFile); SysRemove(szIdxFile); TbixFreeHash(pHash, iHashSize); ErrSetErrorCode(ERR_FILE_WRITE); return ERR_FILE_WRITE; } } } } fclose(pIdxFile); TbixFreeHash(pHash, iHashSize); return 0; } static int TbixBuildKey(char *pszKey, va_list Args, bool bCaseSens) { int i; char const *pszToken; SetEmptyString(pszKey); for (i = 0; (pszToken = va_arg(Args, char *)) != NULL; i++) { if (i > 0) strcat(pszKey, TOKEN_SEP_STR); strcat(pszKey, pszToken); } if (!bCaseSens) StrLower(pszKey); return 0; } static int TbixBuildKey(char *pszKey, char const *const *ppszToks, int const *piFieldsIdx, bool bCaseSens) { int i, iFieldsCount = StrStringsCount(ppszToks); SetEmptyString(pszKey); for (i = 0; piFieldsIdx[i] != INDEX_SEQUENCE_TERMINATOR; i++) { if (piFieldsIdx[i] < 0 || piFieldsIdx[i] >= iFieldsCount) { ErrSetErrorCode(ERR_BAD_TAB_INDEX_FIELD); return ERR_BAD_TAB_INDEX_FIELD; } if (i > 0) strcat(pszKey, TOKEN_SEP_STR); strcat(pszKey, ppszToks[piFieldsIdx[i]]); } if (!bCaseSens) StrLower(pszKey); return 0; } int TbixCalculateHash(char const *const *ppszToks, int const *piFieldsIdx, unsigned long *pulHashVal, bool bCaseSens) { char szKey[KEY_BUFFER_SIZE]; if (TbixBuildKey(szKey, ppszToks, piFieldsIdx, bCaseSens) < 0) return ErrGetErrorCode(); *pulHashVal = MscHashString(szKey, strlen(szKey)); return 0; } static int TbixOpenIndex(char const *pszIdxFile, TabHashIndex &THI) { FILE *pIdxFile = fopen(pszIdxFile, "rb"); if (pIdxFile == NULL) { ErrSetErrorCode(ERR_FILE_OPEN, pszIdxFile); return ERR_FILE_OPEN; } /* Read header and check signature */ ZeroData(THI); if (!fread(&THI.HFH, sizeof(THI.HFH), 1, pIdxFile)) { fclose(pIdxFile); ErrSetErrorCode(ERR_FILE_READ, pszIdxFile); return ERR_FILE_READ; } if (THI.HFH.uMagic != TAB_INDEX_MAGIC || THI.HFH.uVersion != TAB_INDEX_CURR_VERSION) { fclose(pIdxFile); ErrSetErrorCode(ERR_BAD_INDEX_FILE, pszIdxFile); return ERR_BAD_INDEX_FILE; } THI.pIdxFile = pIdxFile; return 0; } static int TbixCloseIndex(TabHashIndex &THI) { fclose(THI.pIdxFile); ZeroData(THI); return 0; } static int TbixCheckIndex(char const *pszIdxFile) { TabHashIndex THI; if (TbixOpenIndex(pszIdxFile, THI) < 0) return ErrGetErrorCode(); TbixCloseIndex(THI); return 0; } static TabIdxUINT *TbixReadTable(TabHashIndex &THI, unsigned long ulHashVal) { unsigned long ulHashIndex; TabIdxUINT uTableOffset, uTableSize; SYS_OFF_T llTblOffset; TabIdxUINT *pOffTbl; ulHashIndex = ulHashVal % THI.HFH.uHashSize; llTblOffset = sizeof(TabHashFileHeader) + ulHashIndex * sizeof(TabIdxUINT); if (Sys_fseek(THI.pIdxFile, llTblOffset, SEEK_SET) != 0) { ErrSetErrorCode(ERR_BAD_INDEX_FILE); return NULL; } if (!fread(&uTableOffset, sizeof(uTableOffset), 1, THI.pIdxFile)) { ErrSetErrorCode(ERR_FILE_READ); return NULL; } if (uTableOffset == 0) { ErrSetErrorCode(ERR_RECORD_NOT_FOUND); return NULL; } if (Sys_fseek(THI.pIdxFile, uTableOffset, SEEK_SET) != 0) { ErrSetErrorCode(ERR_BAD_INDEX_FILE); return NULL; } if (!fread(&uTableSize, sizeof(uTableSize), 1, THI.pIdxFile)) { ErrSetErrorCode(ERR_FILE_READ); return NULL; } if ((pOffTbl = (TabIdxUINT *) SysAlloc((uTableSize + 1) * sizeof(TabIdxUINT))) == NULL) return NULL; pOffTbl[0] = uTableSize; if (!fread(&pOffTbl[1], uTableSize * sizeof(TabIdxUINT), 1, THI.pIdxFile)) { SysFree(pOffTbl); ErrSetErrorCode(ERR_FILE_READ); return NULL; } return pOffTbl; } static char **TbixLoadRecord(FILE *pTabFile, TabIdxUINT uOffset) { char szLnBuff[TAB_RECORD_BUFFER_SIZE]; if (Sys_fseek(pTabFile, uOffset, SEEK_SET) != 0) { ErrSetErrorCode(ERR_BAD_INDEX_FILE); return NULL; } if (MscGetString(pTabFile, szLnBuff, sizeof(szLnBuff) - 1) == NULL) { ErrSetErrorCode(ERR_FILE_READ); return NULL; } return StrGetTabLineStrings(szLnBuff); } char **TbixLookup(char const *pszTabFilePath, int const *piFieldsIdx, bool bCaseSens, ...) { int i, iHashNodes; unsigned long ulHashVal; TabIdxUINT *pHashTable; FILE *pTabFile; va_list Args; TabHashIndex THI; char szIdxFile[SYS_MAX_PATH], szRefKey[KEY_BUFFER_SIZE]; if (TbixGetIndexFile(pszTabFilePath, piFieldsIdx, szIdxFile) < 0) return NULL; /* Calculate key & hash */ va_start(Args, bCaseSens); if (TbixBuildKey(szRefKey, Args, bCaseSens) < 0) { va_end(Args); return NULL; } va_end(Args); /* Open index */ ulHashVal = MscHashString(szRefKey, strlen(szRefKey)); if (TbixOpenIndex(szIdxFile, THI) < 0) return NULL; /* Try to lookup records */ pHashTable = TbixReadTable(THI, ulHashVal); TbixCloseIndex(THI); if (pHashTable == NULL) return NULL; /* Search for the matched one */ if ((pTabFile = fopen(pszTabFilePath, "rb")) == NULL) { SysFree(pHashTable); ErrSetErrorCode(ERR_FILE_OPEN, pszTabFilePath); return NULL; } iHashNodes = (int) pHashTable[0]; for (i = 0; i < iHashNodes; i++) { char **ppszToks = TbixLoadRecord(pTabFile, pHashTable[i + 1]); char szKey[KEY_BUFFER_SIZE]; if (ppszToks != NULL) { if (TbixBuildKey(szKey, ppszToks, piFieldsIdx, bCaseSens) == 0) { if (bCaseSens) { if (strcmp(szKey, szRefKey) == 0) { fclose(pTabFile); SysFree(pHashTable); return ppszToks; } } else { if (stricmp(szKey, szRefKey) == 0) { fclose(pTabFile); SysFree(pHashTable); return ppszToks; } } } StrFreeStrings(ppszToks); } } fclose(pTabFile); SysFree(pHashTable); ErrSetErrorCode(ERR_RECORD_NOT_FOUND); return NULL; } int TbixCheckIndex(char const *pszTabFilePath, int const *piFieldsIdx, bool bCaseSens, int (*pHashFunc) (char const *const *, int const *, unsigned long *, bool)) { SYS_FILE_INFO FI_Tab, FI_Index; char szIdxFile[SYS_MAX_PATH]; if (SysGetFileInfo(pszTabFilePath, FI_Tab) < 0 || TbixGetIndexFile(pszTabFilePath, piFieldsIdx, szIdxFile) < 0) return ErrGetErrorCode(); if (SysGetFileInfo(szIdxFile, FI_Index) < 0 || FI_Tab.tMod > FI_Index.tMod || TbixCheckIndex(szIdxFile) < 0) { /* Rebuild the index */ if (TbixCreateIndex(pszTabFilePath, piFieldsIdx, bCaseSens, pHashFunc) < 0) return ErrGetErrorCode(); } return 0; } INDEX_HANDLE TbixOpenHandle(char const *pszTabFilePath, int const *piFieldsIdx, unsigned long const *pulHashVal, int iNumVals) { int i; long lRecCount; ARRAY_HANDLE hArray; FILE *pTabFile; IndexLookupData *pILD; TabHashIndex THI; char szIdxFile[SYS_MAX_PATH]; if (TbixGetIndexFile(pszTabFilePath, piFieldsIdx, szIdxFile) < 0 || (hArray = ArrayCreate(TAB_INIT_RESSET_SIZE)) == INVALID_ARRAY_HANDLE) return INVALID_INDEX_HANDLE; if (TbixOpenIndex(szIdxFile, THI) < 0) { ArrayFree(hArray, MscSysFreeCB, NULL); return INVALID_INDEX_HANDLE; } for (i = 0, lRecCount = 0; i < iNumVals; i++) { TabIdxUINT *pHashTable = TbixReadTable(THI, pulHashVal[i]); if (pHashTable != NULL) { if (ArrayAppend(hArray, pHashTable) < 0) { SysFree(pHashTable); ArrayFree(hArray, MscSysFreeCB, NULL); TbixCloseIndex(THI); return INVALID_INDEX_HANDLE; } lRecCount += (long) pHashTable[0]; } } TbixCloseIndex(THI); if (lRecCount == 0) { ArrayFree(hArray, MscSysFreeCB, NULL); ErrSetErrorCode(ERR_RECORD_NOT_FOUND); return INVALID_INDEX_HANDLE; } /* Open tab file */ if ((pTabFile = fopen(pszTabFilePath, "rb")) == NULL) { ArrayFree(hArray, MscSysFreeCB, NULL); ErrSetErrorCode(ERR_FILE_OPEN, pszTabFilePath); return INVALID_INDEX_HANDLE; } /* Setup lookup struct */ if ((pILD = (IndexLookupData *) SysAlloc(sizeof(IndexLookupData))) == NULL) { fclose(pTabFile); ArrayFree(hArray, MscSysFreeCB, NULL); return INVALID_INDEX_HANDLE; } pILD->hArray = hArray; pILD->lRecCount = lRecCount; pILD->pTabFile = pTabFile; return (INDEX_HANDLE) pILD; } int TbixCloseHandle(INDEX_HANDLE hIndexLookup) { IndexLookupData *pILD = (IndexLookupData *) hIndexLookup; fclose(pILD->pTabFile); ArrayFree(pILD->hArray, MscSysFreeCB, NULL); SysFree(pILD); return 0; } long TbixLookedUpRecords(INDEX_HANDLE hIndexLookup) { IndexLookupData *pILD = (IndexLookupData *) hIndexLookup; return pILD->lRecCount; } char **TbixFirstRecord(INDEX_HANDLE hIndexLookup) { IndexLookupData *pILD = (IndexLookupData *) hIndexLookup; pILD->lArIdx = 0; pILD->lHTblI = 0; if ((pILD->pHTblC = (TabIdxUINT *) ArrayGet(pILD->hArray, pILD->lArIdx)) == NULL) { ErrSetErrorCode(ERR_RECORD_NOT_FOUND); return NULL; } return TbixLoadRecord(pILD->pTabFile, pILD->pHTblC[++pILD->lHTblI]); } char **TbixNextRecord(INDEX_HANDLE hIndexLookup) { IndexLookupData *pILD = (IndexLookupData *) hIndexLookup; if (pILD->pHTblC == NULL) { ErrSetErrorCode(ERR_BAD_SEQUENCE); return NULL; } if (pILD->lHTblI == (long) pILD->pHTblC[0]) { pILD->lArIdx++; if ((pILD->pHTblC = (TabIdxUINT *) ArrayGet(pILD->hArray, pILD->lArIdx)) == NULL) { ErrSetErrorCode(ERR_RECORD_NOT_FOUND); return NULL; } pILD->lHTblI = 0; } return TbixLoadRecord(pILD->pTabFile, pILD->pHTblC[++pILD->lHTblI]); } xmail-1.27/SMAILUtils.cpp0000644000175000017500000022317211341640430014424 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "StrUtils.h" #include "SList.h" #include "ShBlocks.h" #include "ResLocks.h" #include "BuffSock.h" #include "UsrUtils.h" #include "SvrUtils.h" #include "MailConfig.h" #include "MessQueue.h" #include "SMAILUtils.h" #include "QueueUtils.h" #include "ExtAliases.h" #include "MiscUtils.h" #include "MailDomains.h" #include "Filter.h" #include "SMTPSvr.h" #include "SMTPUtils.h" #include "POP3Utils.h" #include "AppDefines.h" #include "MailSvr.h" #define SFF_HEADER_MODIFIED (1 << 0) #define STD_TAG_BUFFER_LENGTH 1024 #define CUSTOM_CMD_LINE_MAX 512 #define SMAIL_DOMAIN_PROC_DIR "custdomains" #define SMAIL_CMDALIAS_DIR "cmdaliases" #define SMAIL_DEFAULT_FILTER ".tab" #define SMAIL_LOG_FILE "smail" #define MAX_MTA_OPS 16 #define ADDRESS_TOKENIZER "," #define SMAIL_EXTERNAL_EXIT_BREAK 16 #define SMAIL_STOP_PROCESSING 3111965L struct SpoolFileData { char **ppszInfo; char **ppszFrom; char *pszMailFrom; char *pszSendMailFrom; char **ppszRcpt; char *pszRcptTo; char *pszSendRcptTo; char *pszRelayDomain; char szSMTPDomain[MAX_ADDR_NAME]; char szMessageID[128]; char szMessFilePath[SYS_MAX_PATH]; SYS_OFF_T llMessageOffset; SYS_OFF_T llMailDataOffset; SYS_OFF_T llMessageSize; char szSpoolFile[SYS_MAX_PATH]; HSLIST hTagList; unsigned long ulFlags; }; struct MessageTagData { LISTLINK LL; char *pszTagName; char *pszTagData; }; struct MacroSubstCtx { SPLF_HANDLE hFSpool; UserInfo *pUI; FileSection FSect; }; static int USmlAddTag(HSLIST &hTagList, char const *pszTagName, char const *pszTagData, int iUpdate = 0); int USmlLoadSpoolFileHeader(char const *pszSpoolFile, SpoolFileHeader &SFH) { ZeroData(SFH); FILE *pSpoolFile = fopen(pszSpoolFile, "rb"); if (pSpoolFile == NULL) { ErrSetErrorCode(ERR_SPOOL_FILE_NOT_FOUND, pszSpoolFile); return ERR_SPOOL_FILE_NOT_FOUND; } /* Build spool file name */ char szFName[SYS_MAX_PATH] = ""; char szExt[SYS_MAX_PATH] = ""; char szSpoolLine[MAX_SPOOL_LINE] = ""; MscSplitPath(pszSpoolFile, NULL, 0, szFName, sizeof(szFName), szExt, sizeof(szExt)); SysSNPrintf(SFH.szSpoolFile, sizeof(SFH.szSpoolFile) - 1, "%s%s", szFName, szExt); /* Read info ( 1st row of the spool file ) */ if (MscGetString(pSpoolFile, szSpoolLine, sizeof(szSpoolLine) - 1) == NULL || (SFH.ppszInfo = StrTokenize(szSpoolLine, ";")) == NULL || StrStringsCount(SFH.ppszInfo) < smiMax) { StrFreeStrings(SFH.ppszInfo); fclose(pSpoolFile); ZeroData(SFH); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE, pszSpoolFile); return ERR_SPOOL_FILE_NOT_FOUND; } /* Read SMTP domain ( 2nd row of the spool file ) */ if (MscGetString(pSpoolFile, SFH.szSMTPDomain, sizeof(SFH.szSMTPDomain) - 1) == NULL) { StrFreeStrings(SFH.ppszInfo); fclose(pSpoolFile); ZeroData(SFH); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE, pszSpoolFile); return ERR_SPOOL_FILE_NOT_FOUND; } /* Read message ID ( 3rd row of the spool file ) */ if (MscGetString(pSpoolFile, SFH.szMessageID, sizeof(SFH.szMessageID) - 1) == NULL) { StrFreeStrings(SFH.ppszInfo); fclose(pSpoolFile); ZeroData(SFH); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE, pszSpoolFile); return ERR_SPOOL_FILE_NOT_FOUND; } /* Read "MAIL FROM:" ( 4th row of the spool file ) */ if (MscGetString(pSpoolFile, szSpoolLine, sizeof(szSpoolLine) - 1) == NULL || StrINComp(szSpoolLine, MAIL_FROM_STR) != 0 || (SFH.ppszFrom = USmtpGetPathStrings(szSpoolLine)) == NULL) { StrFreeStrings(SFH.ppszInfo); fclose(pSpoolFile); ZeroData(SFH); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE, pszSpoolFile); return ERR_INVALID_SPOOL_FILE; } /* Read "RCPT TO:" ( 5th row of the spool file ) */ if (MscGetString(pSpoolFile, szSpoolLine, sizeof(szSpoolLine) - 1) == NULL || StrINComp(szSpoolLine, RCPT_TO_STR) != 0 || (SFH.ppszRcpt = USmtpGetPathStrings(szSpoolLine)) == NULL) { StrFreeStrings(SFH.ppszFrom); StrFreeStrings(SFH.ppszInfo); fclose(pSpoolFile); ZeroData(SFH); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE, pszSpoolFile); return ERR_INVALID_SPOOL_FILE; } fclose(pSpoolFile); return 0; } void USmlCleanupSpoolFileHeader(SpoolFileHeader &SFH) { StrFreeStrings(SFH.ppszInfo); StrFreeStrings(SFH.ppszRcpt); StrFreeStrings(SFH.ppszFrom); ZeroData(SFH); } static MessageTagData *USmlAllocTag(char const *pszTagName, char const *pszTagData) { MessageTagData *pMTD = (MessageTagData *) SysAlloc(sizeof(MessageTagData)); if (pMTD == NULL) return NULL; ListLinkInit(pMTD); pMTD->pszTagName = SysStrDup(pszTagName); pMTD->pszTagData = SysStrDup(pszTagData); return pMTD; } static void USmlFreeTag(MessageTagData *pMTD) { SysFree(pMTD->pszTagName); SysFree(pMTD->pszTagData); SysFree(pMTD); } static MessageTagData *USmlFindTag(HSLIST &hTagList, char const *pszTagName, TAG_POSITION &TagPosition) { MessageTagData *pMTD = (TagPosition == TAG_POSITION_INIT) ? (MessageTagData *) ListFirst(hTagList): (MessageTagData *) TagPosition; for (; pMTD != INVALID_SLIST_PTR; pMTD = (MessageTagData *) ListNext(hTagList, (PLISTLINK) pMTD)) { if (pszTagName == NULL || stricmp(pMTD->pszTagName, pszTagName) == 0) { TagPosition = (TAG_POSITION) ListNext(hTagList, (PLISTLINK) pMTD); return pMTD; } } TagPosition = (TAG_POSITION) INVALID_SLIST_PTR; return NULL; } static int USmlAddTag(HSLIST &hTagList, char const *pszTagName, char const *pszTagData, int iUpdate) { if (!iUpdate) { MessageTagData *pMTD = USmlAllocTag(pszTagName, pszTagData); if (pMTD == NULL) return ErrGetErrorCode(); ListAddTail(hTagList, (PLISTLINK) pMTD); } else { TAG_POSITION TagPosition = TAG_POSITION_INIT; MessageTagData *pMTD = USmlFindTag(hTagList, pszTagName, TagPosition); if (pMTD != NULL) { SysFree(pMTD->pszTagData); pMTD->pszTagData = SysStrDup(pszTagData); } else { if ((pMTD = USmlAllocTag(pszTagName, pszTagData)) == NULL) return ErrGetErrorCode(); ListAddTail(hTagList, (PLISTLINK) pMTD); } } return 0; } static void USmlFreeTagsList(HSLIST &hTagList) { MessageTagData *pMTD; while ((pMTD = (MessageTagData *) ListRemove(hTagList)) != INVALID_SLIST_PTR) USmlFreeTag(pMTD); } static int USmlLoadTags(FILE *pSpoolFile, HSLIST &hTagList) { int iPrevGotNL, iGotNL; unsigned long ulFilePos; DynString TagDS; char szTagName[256] = "", szSpoolLine[MAX_SPOOL_LINE]; ulFilePos = (unsigned long) ftell(pSpoolFile); StrDynInit(&TagDS); for (iPrevGotNL = 1; MscGetString(pSpoolFile, szSpoolLine, sizeof(szSpoolLine) - 1, &iGotNL) != NULL; iPrevGotNL = iGotNL) { if (IsEmptyString(szSpoolLine)) { if (StrDynSize(&TagDS) > 0) { if (USmlAddTag(hTagList, szTagName, StrDynGet(&TagDS)) < 0) { ErrorPush(); StrDynFree(&TagDS); fseek(pSpoolFile, ulFilePos, SEEK_SET); return ErrorPop(); } SetEmptyString(szTagName); StrDynTruncate(&TagDS); } break; } if (szSpoolLine[0] == ' ' || szSpoolLine[0] == '\t' || !iPrevGotNL) { if (IsEmptyString(szTagName)) { StrDynFree(&TagDS); fseek(pSpoolFile, ulFilePos, SEEK_SET); ErrSetErrorCode(ERR_INVALID_MESSAGE_FORMAT); return ERR_INVALID_MESSAGE_FORMAT; } if ((iPrevGotNL && StrDynAdd(&TagDS, "\r\n") < 0) || StrDynAdd(&TagDS, szSpoolLine) < 0) { ErrorPush(); StrDynFree(&TagDS); fseek(pSpoolFile, ulFilePos, SEEK_SET); return ErrorPop(); } } else { if (StrDynSize(&TagDS) > 0) { if (USmlAddTag(hTagList, szTagName, StrDynGet(&TagDS)) < 0) { ErrorPush(); StrDynFree(&TagDS); fseek(pSpoolFile, ulFilePos, SEEK_SET); return ErrorPop(); } SetEmptyString(szTagName); StrDynTruncate(&TagDS); } char *pszEndTag = strchr(szSpoolLine, ':'); if (pszEndTag == NULL) { StrDynFree(&TagDS); fseek(pSpoolFile, ulFilePos, SEEK_SET); ErrSetErrorCode(ERR_INVALID_MESSAGE_FORMAT); return ERR_INVALID_MESSAGE_FORMAT; } int iNameLength = Min((int) (pszEndTag - szSpoolLine), (int) sizeof(szTagName) - 1); char *pszTagValue = pszEndTag + 1; strncpy(szTagName, szSpoolLine, iNameLength); szTagName[iNameLength] = '\0'; StrSkipSpaces(pszTagValue); if (StrDynAdd(&TagDS, pszTagValue) < 0) { ErrorPush(); StrDynFree(&TagDS); fseek(pSpoolFile, ulFilePos, SEEK_SET); return ErrorPop(); } } ulFilePos = (unsigned long) ftell(pSpoolFile); } StrDynFree(&TagDS); return 0; } static int USmlDumpHeaders(FILE *pMsgFile, HSLIST &hTagList, char const *pszLF) { MessageTagData *pMTD = (MessageTagData *) ListFirst(hTagList); for (; pMTD != INVALID_SLIST_PTR; pMTD = (MessageTagData *) ListNext(hTagList, (PLISTLINK) pMTD)) { fprintf(pMsgFile, "%s: %s%s", pMTD->pszTagName, pMTD->pszTagData, pszLF); } return 0; } static void USmlFreeData(SpoolFileData *pSFD) { USmlFreeTagsList(pSFD->hTagList); StrFreeStrings(pSFD->ppszInfo); StrFreeStrings(pSFD->ppszFrom); SysFree(pSFD->pszMailFrom); SysFree(pSFD->pszSendMailFrom); StrFreeStrings(pSFD->ppszRcpt); SysFree(pSFD->pszRcptTo); SysFree(pSFD->pszSendRcptTo); SysFree(pSFD->pszRelayDomain); } char *USmlAddrConcat(char const *const *ppszStrings) { int i, iSumLength; int iStrCount = StrStringsCount(ppszStrings); for (i = iSumLength = 0; i < iStrCount; i++) iSumLength += strlen(ppszStrings[i]) + 1; char *pszConcat = (char *) SysAlloc(iSumLength + 1); if (pszConcat != NULL) { SetEmptyString(pszConcat); for (i = 0; i < iStrCount; i++) { if (i > 0) strcat(pszConcat, (i == iStrCount - 1) ? ":": ","); strcat(pszConcat, ppszStrings[i]); } } return pszConcat; } char *USmlBuildSendMailFrom(char const *const *ppszFrom, char const *const *ppszRcpt) { int iRcptCount = StrStringsCount(ppszRcpt); int iFromCount = StrStringsCount(ppszFrom); if (iRcptCount == 0) { ErrSetErrorCode(ERR_BAD_FORWARD_PATH); return NULL; } if (iRcptCount == 1) return USmlAddrConcat(ppszFrom); int i, iSumLength = strlen(ppszRcpt[0]) + 1; for (i = 0; i < iFromCount; i++) iSumLength += strlen(ppszFrom[i]) + 1; char *pszConcat = (char *) SysAlloc(iSumLength + 1); if (pszConcat == NULL) return NULL; strcpy(pszConcat, ppszRcpt[0]); for (i = 0; i < iFromCount; i++) { strcat(pszConcat, (i == (iFromCount - 1)) ? ":": ","); strcat(pszConcat, ppszFrom[i]); } return pszConcat; } char *USmlBuildSendRcptTo(char const *const *ppszFrom, char const *const *ppszRcpt) { int iRcptCount = StrStringsCount(ppszRcpt); int iFromCount = StrStringsCount(ppszFrom); if (iRcptCount == 0) { ErrSetErrorCode(ERR_BAD_FORWARD_PATH); return NULL; } if (iRcptCount == 1) return USmlAddrConcat(ppszRcpt); int i; int iSumLength = 0; for (i = 1; i < iRcptCount; i++) iSumLength += strlen(ppszRcpt[i]) + 1; char *pszConcat = (char *) SysAlloc(iSumLength + 1); if (pszConcat == NULL) return NULL; SetEmptyString(pszConcat); for (i = 1; i < iRcptCount; i++) { if (i > 1) strcat(pszConcat, (i == (iRcptCount - 1)) ? ":": ","); strcat(pszConcat, ppszRcpt[i]); } return pszConcat; } static int USmlLoadHandle(SpoolFileData *pSFD, char const *pszMessFilePath) { char szFName[SYS_MAX_PATH] = ""; char szExt[SYS_MAX_PATH] = ""; StrSNCpy(pSFD->szMessFilePath, pszMessFilePath); MscSplitPath(pszMessFilePath, NULL, 0, szFName, sizeof(szFName), szExt, sizeof(szExt)); SysSNPrintf(pSFD->szSpoolFile, sizeof(pSFD->szSpoolFile) - 1, "%s%s", szFName, szExt); FILE *pSpoolFile = fopen(pszMessFilePath, "rb"); if (pSpoolFile == NULL) { ErrSetErrorCode(ERR_SPOOL_FILE_NOT_FOUND); return ERR_SPOOL_FILE_NOT_FOUND; } char szSpoolLine[MAX_SPOOL_LINE] = ""; /* Read info ( 1st row of the spool file ) */ if (MscGetString(pSpoolFile, szSpoolLine, sizeof(szSpoolLine) - 1) == NULL || (pSFD->ppszInfo = StrTokenize(szSpoolLine, ";")) == NULL || StrStringsCount(pSFD->ppszInfo) < smiMax) { fclose(pSpoolFile); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE); return ERR_INVALID_SPOOL_FILE; } /* Read SMTP domain ( 2nd row of the spool file ) */ if (MscGetString(pSpoolFile, pSFD->szSMTPDomain, sizeof(pSFD->szSMTPDomain) - 1) == NULL) { fclose(pSpoolFile); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE); return ERR_INVALID_SPOOL_FILE; } /* Read message ID ( 3rd row of the spool file ) */ if (MscGetString(pSpoolFile, pSFD->szMessageID, sizeof(pSFD->szMessageID) - 1) == NULL) { fclose(pSpoolFile); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE); return ERR_INVALID_SPOOL_FILE; } /* Read "MAIL FROM:" ( 4th row of the spool file ) */ if ((MscGetString(pSpoolFile, szSpoolLine, sizeof(szSpoolLine) - 1) == NULL) || (StrINComp(szSpoolLine, MAIL_FROM_STR) != 0)) { fclose(pSpoolFile); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE); return ERR_INVALID_SPOOL_FILE; } if ((pSFD->ppszFrom = USmtpGetPathStrings(szSpoolLine)) == NULL) { fclose(pSpoolFile); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE); return ERR_INVALID_SPOOL_FILE; } /* Read "RCPT TO:" ( 5th row of the spool file ) */ if ((MscGetString(pSpoolFile, szSpoolLine, sizeof(szSpoolLine) - 1) == NULL) || (StrINComp(szSpoolLine, RCPT_TO_STR) != 0)) { fclose(pSpoolFile); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE); return ERR_INVALID_SPOOL_FILE; } if ((pSFD->ppszRcpt = USmtpGetPathStrings(szSpoolLine)) == NULL) { fclose(pSpoolFile); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE); return ERR_INVALID_SPOOL_FILE; } /* Check the presence of the init data mark ( 5th row of the spool file ) */ if (MscGetString(pSpoolFile, szSpoolLine, sizeof(szSpoolLine) - 1) == NULL || strncmp(szSpoolLine, SPOOL_FILE_DATA_START, strlen(SPOOL_FILE_DATA_START)) != 0) { fclose(pSpoolFile); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE); return ERR_INVALID_SPOOL_FILE; } /* Get real message position */ pSFD->llMessageOffset = (SYS_OFF_T) ftell(pSpoolFile); /* Build address strings */ if ((pSFD->pszMailFrom = USmlAddrConcat(pSFD->ppszFrom)) == NULL || (pSFD->pszSendMailFrom = USmlBuildSendMailFrom(pSFD->ppszFrom, pSFD->ppszRcpt)) == NULL || (pSFD->pszRcptTo = (char *) USmlAddrConcat(pSFD->ppszRcpt)) == NULL || (pSFD->pszSendRcptTo = USmlBuildSendRcptTo(pSFD->ppszFrom, pSFD->ppszRcpt)) == NULL) { fclose(pSpoolFile); ErrSetErrorCode(ERR_INVALID_SPOOL_FILE); return ERR_INVALID_SPOOL_FILE; } /* Check if it's a relay message */ if (StrStringsCount(pSFD->ppszRcpt) > 1) { char const *pszHost = pSFD->ppszRcpt[0]; if (*pszHost++ != '@') { fclose(pSpoolFile); ErrSetErrorCode(ERR_INVALID_RELAY_ADDRESS, pSFD->ppszRcpt[0]); return ERR_INVALID_SPOOL_FILE; } if (USmlValidHost(pszHost, StrEnd(pszHost)) < 0) { fclose(pSpoolFile); return ERR_INVALID_SPOOL_FILE; } pSFD->pszRelayDomain = SysStrDup(pszHost); } /* Load message tags */ if (USmlLoadTags(pSpoolFile, pSFD->hTagList) < 0) SysLogMessage(LOG_LEV_MESSAGE, "Invalid headers section : %s\n", pSFD->szSpoolFile); /* Get spool file position */ pSFD->llMailDataOffset = (SYS_OFF_T) ftell(pSpoolFile); fseek(pSpoolFile, 0, SEEK_END); pSFD->llMessageSize = (SYS_OFF_T) ftell(pSpoolFile) - pSFD->llMessageOffset; fclose(pSpoolFile); return 0; } static void USmlInitHandle(SpoolFileData *pSFD) { pSFD->ppszInfo = NULL; pSFD->ppszFrom = NULL; pSFD->pszMailFrom = NULL; pSFD->pszSendMailFrom = NULL; pSFD->ppszRcpt = NULL; pSFD->pszRcptTo = NULL; pSFD->pszSendRcptTo = NULL; pSFD->pszRelayDomain = NULL; SetEmptyString(pSFD->szSMTPDomain); pSFD->ulFlags = 0; ListInit(pSFD->hTagList); } static SpoolFileData *USmlAllocEmptyHandle(void) { /* Structure allocation and initialization */ SpoolFileData *pSFD = (SpoolFileData *) SysAlloc(sizeof(SpoolFileData)); if (pSFD != NULL) USmlInitHandle(pSFD); return pSFD; } SPLF_HANDLE USmlCreateHandle(char const *pszMessFilePath) { /* Structure allocation and initialization */ SpoolFileData *pSFD = USmlAllocEmptyHandle(); if (pSFD == NULL) return INVALID_SPLF_HANDLE; if (USmlLoadHandle(pSFD, pszMessFilePath) < 0) { USmlFreeData(pSFD); SysFree(pSFD); return INVALID_SPLF_HANDLE; } return (SPLF_HANDLE) pSFD; } void USmlCloseHandle(SPLF_HANDLE hFSpool) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; USmlFreeData(pSFD); SysFree(pSFD); } int USmlReloadHandle(SPLF_HANDLE hFSpool) { /* Structure allocation and initialization */ SpoolFileData *pSFD = (SpoolFileData *) hFSpool; SpoolFileData *pNewSFD = USmlAllocEmptyHandle(); if (pNewSFD == NULL) return ErrGetErrorCode(); /* Load the new spool file data */ if (USmlLoadHandle(pNewSFD, pSFD->szMessFilePath) < 0) { ErrorPush(); USmlFreeData(pNewSFD); SysFree(pNewSFD); return ErrorPop(); } /* Free the original structure data and load the new one */ USmlFreeData(pSFD); *pSFD = *pNewSFD; /* We don't have to call USmlFreeData() since its content has been tranfered */ /* to the original structure to replace the old information */ SysFree(pNewSFD); return 0; } char const *USmlGetRelayDomain(SPLF_HANDLE hFSpool) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; return pSFD->pszRelayDomain; } char const *USmlGetSpoolFilePath(SPLF_HANDLE hFSpool) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; return pSFD->szMessFilePath; } char const *USmlGetSpoolFile(SPLF_HANDLE hFSpool) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; return pSFD->szSpoolFile; } char const *USmlGetSMTPDomain(SPLF_HANDLE hFSpool) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; return pSFD->szSMTPDomain; } char const *USmlGetSmtpMessageID(SPLF_HANDLE hFSpool) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; return pSFD->szMessageID; } char const *const *USmlGetInfo(SPLF_HANDLE hFSpool) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; return pSFD->ppszInfo; } char const *const *USmlGetMailFrom(SPLF_HANDLE hFSpool) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; return pSFD->ppszFrom; } char const *USmlMailFrom(SPLF_HANDLE hFSpool) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; return pSFD->pszMailFrom; } char const *USmlSendMailFrom(SPLF_HANDLE hFSpool) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; return pSFD->pszSendMailFrom; } char const *const *USmlGetRcptTo(SPLF_HANDLE hFSpool) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; return pSFD->ppszRcpt; } char const *USmlRcptTo(SPLF_HANDLE hFSpool) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; return pSFD->pszRcptTo; } char const *USmlSendRcptTo(SPLF_HANDLE hFSpool) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; return pSFD->pszSendRcptTo; } SYS_OFF_T USmlMessageSize(SPLF_HANDLE hFSpool) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; return pSFD->llMessageSize; } static int USmlFlushMessageFile(SpoolFileData *pSFD) { char szTmpMsgFile[SYS_MAX_PATH] = ""; SysSNPrintf(szTmpMsgFile, sizeof(szTmpMsgFile) - 1, "%s.flush", pSFD->szMessFilePath); /* Create temporary file */ FILE *pMsgFile = fopen(szTmpMsgFile, "wb"); if (pMsgFile == NULL) { ErrSetErrorCode(ERR_FILE_CREATE, szTmpMsgFile); return ERR_FILE_CREATE; } /* Open message file */ FILE *pMessFile = fopen(pSFD->szMessFilePath, "rb"); if (pMessFile == NULL) { fclose(pMsgFile); CheckRemoveFile(szTmpMsgFile); ErrSetErrorCode(ERR_FILE_OPEN, pSFD->szMessFilePath); return ERR_FILE_OPEN; } /* Dump info section ( start = 0 - bytes = ulMessageOffset ) */ if (MscCopyFile(pMsgFile, pMessFile, 0, pSFD->llMessageOffset) < 0) { ErrorPush(); fclose(pMessFile); fclose(pMsgFile); CheckRemoveFile(szTmpMsgFile); return ErrorPop(); } /* Dump message headers */ if (USmlDumpHeaders(pMsgFile, pSFD->hTagList, "\r\n") < 0) { ErrorPush(); fclose(pMessFile); fclose(pMsgFile); CheckRemoveFile(szTmpMsgFile); return ErrorPop(); } fprintf(pMsgFile, "\r\n"); /* Get the new message body offset */ SYS_OFF_T llMailDataOffset = (SYS_OFF_T) ftell(pMsgFile); /* Dump message data ( start = ulMailDataOffset - bytes = -1 [EOF] ) */ if (MscCopyFile(pMsgFile, pMessFile, pSFD->llMailDataOffset, (SYS_OFF_T) -1) < 0) { ErrorPush(); fclose(pMessFile); fclose(pMsgFile); CheckRemoveFile(szTmpMsgFile); return ErrorPop(); } fclose(pMessFile); if (SysFileSync(pMsgFile) < 0) { ErrorPush(); fclose(pMsgFile); CheckRemoveFile(szTmpMsgFile); return ErrorPop(); } pSFD->llMessageSize = (SYS_OFF_T) ftell(pMsgFile) - pSFD->llMessageOffset; if (fclose(pMsgFile)) { CheckRemoveFile(szTmpMsgFile); ErrSetErrorCode(ERR_FILE_WRITE, szTmpMsgFile); return ERR_FILE_WRITE; } /* Move the file */ if (SysRemove(pSFD->szMessFilePath) < 0 || SysMoveFile(szTmpMsgFile, pSFD->szMessFilePath) < 0) { ErrorPush(); CheckRemoveFile(szTmpMsgFile); return ErrorPop(); } /* Set the new message body offset */ pSFD->llMailDataOffset = llMailDataOffset; return 0; } int USmlSyncChanges(SPLF_HANDLE hFSpool) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; if (pSFD->ulFlags & SFF_HEADER_MODIFIED) { if (USmlFlushMessageFile(pSFD) == 0) pSFD->ulFlags &= ~SFF_HEADER_MODIFIED; } return 0; } int USmlGetMsgFileSection(SPLF_HANDLE hFSpool, FileSection &FSect) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; /* Sync message file */ if (USmlSyncChanges(hFSpool) < 0) return ErrGetErrorCode(); /* Setup file section fields */ ZeroData(FSect); StrSNCpy(FSect.szFilePath, pSFD->szMessFilePath); FSect.llStartOffset = pSFD->llMessageOffset; FSect.llEndOffset = (SYS_OFF_T) -1; return 0; } int USmlWriteMailFile(SPLF_HANDLE hFSpool, FILE *pMsgFile, bool bMBoxFile) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; char const *pszLF = bMBoxFile ? SYS_EOL: "\r\n"; /* Dump message tags */ if (USmlDumpHeaders(pMsgFile, pSFD->hTagList, pszLF) < 0) return ErrGetErrorCode(); fputs(pszLF, pMsgFile); /* Dump message data */ FILE *pMessFile = fopen(pSFD->szMessFilePath, "rb"); if (pMessFile == NULL) { ErrSetErrorCode(ERR_FILE_OPEN, pSFD->szMessFilePath); return ERR_FILE_OPEN; } bool bWantCRLF = !bMBoxFile; #ifdef SYS_CRLF_EOL if (!bWantCRLF) bWantCRLF = true; #endif if (bWantCRLF) { if (MscCopyFile(pMsgFile, pMessFile, pSFD->llMailDataOffset, (SYS_OFF_T) -1) < 0) { fclose(pMessFile); return ErrGetErrorCode(); } } else { Sys_fseek(pMessFile, pSFD->llMailDataOffset, SEEK_SET); if (MscDos2UnixFile(pMsgFile, pMessFile) < 0) { fclose(pMessFile); return ErrGetErrorCode(); } } fclose(pMessFile); return 0; } char *USmlGetTag(SPLF_HANDLE hFSpool, char const *pszTagName, TAG_POSITION &TagPosition) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; MessageTagData *pMTD = USmlFindTag(pSFD->hTagList, pszTagName, TagPosition); return (pMTD != NULL) ? SysStrDup(pMTD->pszTagData): NULL; } int USmlAddTag(SPLF_HANDLE hFSpool, char const *pszTagName, char const *pszTagData, int iUpdate) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; if (USmlAddTag(pSFD->hTagList, pszTagName, pszTagData, iUpdate) < 0) return ErrGetErrorCode(); pSFD->ulFlags |= SFF_HEADER_MODIFIED; return 0; } int USmlSetTagAddress(SPLF_HANDLE hFSpool, char const *pszTagName, char const *pszAddress) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; TAG_POSITION TagPosition = TAG_POSITION_INIT; char *pszOldAddress = USmlGetTag(hFSpool, pszTagName, TagPosition); if (pszOldAddress == NULL) { char szTagData[512] = ""; SysSNPrintf(szTagData, sizeof(szTagData) - 1, "<%s>", pszAddress); if (USmlAddTag(pSFD->hTagList, pszTagName, szTagData, 1) < 0) return ErrGetErrorCode(); } else { char *pszOpen = strrchr(pszOldAddress, '<'); if (pszOpen != NULL) { /* Case : NAME
*/ char *pszClose = strrchr(pszOpen + 1, '>'); if (pszClose == NULL) { SysFree(pszOldAddress); ErrSetErrorCode(ERR_INVALID_MESSAGE_FORMAT); return ERR_INVALID_MESSAGE_FORMAT; } DynString DynS; StrDynInit(&DynS); StrDynAdd(&DynS, pszOldAddress, (int) (pszOpen - pszOldAddress) + 1); StrDynAdd(&DynS, pszAddress); StrDynAdd(&DynS, pszClose); SysFree(pszOldAddress); if (USmlAddTag(pSFD->hTagList, pszTagName, StrDynGet(&DynS), 1) < 0) { ErrorPush(); StrDynFree(&DynS); return ErrorPop(); } StrDynFree(&DynS); } else { /* Case : ADDRESS */ SysFree(pszOldAddress); if (USmlAddTag(pSFD->hTagList, pszTagName, pszAddress, 1) < 0) return ErrGetErrorCode(); } } return 0; } int USmlMapAddress(char const *pszAddress, char *pszDomain, char *pszName) { char szRmtDomain[MAX_ADDR_NAME] = ""; char szRmtName[MAX_ADDR_NAME] = ""; if (USmtpSplitEmailAddr(pszAddress, szRmtName, szRmtDomain) < 0) return ErrGetErrorCode(); ExtAlias *pExtAlias = ExAlGetAlias(szRmtDomain, szRmtName); if (pExtAlias == NULL) return ErrGetErrorCode(); strcpy(pszDomain, pExtAlias->pszDomain); strcpy(pszName, pExtAlias->pszName); ExAlFreeAlias(pExtAlias); return 0; } int USmlCreateMBFile(UserInfo *pUI, char const *pszFileName, SPLF_HANDLE hFSpool) { char const *const *ppszFrom = USmlGetMailFrom(hFSpool); FILE *pMBFile = fopen(pszFileName, "wb"); if (pMBFile == NULL) { ErrSetErrorCode(ERR_FILE_CREATE, pszFileName); return ERR_FILE_CREATE; } /* Check the existence of the return path string ( PSYNC messages have ) */ TAG_POSITION TagPosition = TAG_POSITION_INIT; char *pszReturnPath = USmlGetTag(hFSpool, "Return-Path", TagPosition); if (pszReturnPath == NULL) { /* Build return path string */ int iFromDomains = StrStringsCount(ppszFrom); char szDomain[MAX_ADDR_NAME] = ""; char szName[MAX_ADDR_NAME] = ""; char szReturnPath[1024] = "Return-Path: <>"; if (iFromDomains == 0 || USmlMapAddress(ppszFrom[iFromDomains - 1], szDomain, szName) < 0) { char *pszRetPath = USmlAddrConcat(ppszFrom); if (pszRetPath != NULL) { int iRetLength = strlen(pszRetPath); int iExtraLength = CStringSize("Return-Path: <>"); if (iRetLength > (int) (sizeof(szReturnPath) - iExtraLength - 2)) pszRetPath[sizeof(szReturnPath) - iExtraLength - 2] = '\0'; SysSNPrintf(szReturnPath, sizeof(szReturnPath) - 1, "Return-Path: <%s>", pszRetPath); SysFree(pszRetPath); } } else { SysSNPrintf(szReturnPath, sizeof(szReturnPath) - 1, "Return-Path: <%s@%s>", szName, szDomain); char szAddress[MAX_ADDR_NAME] = ""; SysSNPrintf(szAddress, sizeof(szAddress) - 1, "%s@%s", szName, szDomain); USmlSetTagAddress(hFSpool, "Reply-To", szAddress); } fprintf(pMBFile, "%s" SYS_EOL, szReturnPath); /* Add "Delivered-To:" tag */ char szUserAddress[MAX_ADDR_NAME] = ""; UsrGetAddress(pUI, szUserAddress); fprintf(pMBFile, "Delivered-To: %s" SYS_EOL, szUserAddress); } else SysFree(pszReturnPath); /* Write mail file */ if (USmlWriteMailFile(hFSpool, pMBFile, true) < 0) { ErrorPush(); fclose(pMBFile); SysRemove(pszFileName); return ErrorPop(); } fclose(pMBFile); return 0; } int USmlVCreateSpoolFile(SPLF_HANDLE hFSpool, char const *pszFromUser, char const *pszRcptUser, char const *pszFileName, va_list Headers) { char const *pszSMTPDomain = USmlGetSMTPDomain(hFSpool); char const *pszSmtpMessageID = USmlGetSmtpMessageID(hFSpool); char const *const *ppszInfo = USmlGetInfo(hFSpool); char const *const *ppszFrom = USmlGetMailFrom(hFSpool); char const *const *ppszRcpt = USmlGetRcptTo(hFSpool); FILE *pSpoolFile = fopen(pszFileName, "wb"); if (pSpoolFile == NULL) { ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } /* Write info line */ USmtpWriteInfoLine(pSpoolFile, ppszInfo[smiClientAddr], ppszInfo[smiServerAddr], ppszInfo[smiTime]); /* Write SMTP domain */ fprintf(pSpoolFile, "%s\r\n", pszSMTPDomain); /* Write message ID */ fprintf(pSpoolFile, "%s\r\n", pszSmtpMessageID); /* Write "MAIL FROM:" */ char const *pszMailFrom = USmlMailFrom(hFSpool); fprintf(pSpoolFile, "MAIL FROM: <%s>\r\n", (pszFromUser != NULL) ? pszFromUser: pszMailFrom); /* Write "RCPT TO:" */ char const *pszRcptTo = USmlRcptTo(hFSpool); fprintf(pSpoolFile, "RCPT TO: <%s>\r\n", (pszRcptUser != NULL) ? pszRcptUser: pszRcptTo); /* Write SPOOL_FILE_DATA_START */ fprintf(pSpoolFile, "%s\r\n", SPOOL_FILE_DATA_START); /* Write extra RFC822 headers */ char const *pszHeader = NULL; while ((pszHeader = va_arg(Headers, char *)) != NULL) { char const *pszValue = va_arg(Headers, char *); if (pszValue == NULL) break; if (!IsEmptyString(pszHeader)) fprintf(pSpoolFile, "%s: %s\r\n", pszHeader, pszValue); } /* Than write mail data */ if (USmlWriteMailFile(hFSpool, pSpoolFile) < 0) { ErrorPush(); fclose(pSpoolFile); SysRemove(pszFileName); return ErrorPop(); } fclose(pSpoolFile); return 0; } static int USmlCreateSpoolFile(FILE *pMailFile, char const *const *ppszInfo, char const *pszMailFrom, char const *pszRcptTo, char const *pszSpoolFile) { FILE *pSpoolFile = fopen(pszSpoolFile, "wb"); if (pSpoolFile == NULL) { ErrSetErrorCode(ERR_FILE_CREATE, pszSpoolFile); return ERR_FILE_CREATE; } /* Write info line */ if (ppszInfo != NULL) USmtpWriteInfoLine(pSpoolFile, ppszInfo[smsgiClientAddr], ppszInfo[smsgiServerAddr], ppszInfo[smsgiTime]); else { char szTime[256] = ""; MscGetTimeStr(szTime, sizeof(szTime) - 1); USmtpWriteInfoLine(pSpoolFile, LOCAL_ADDRESS_SQB ":0", LOCAL_ADDRESS_SQB ":0", szTime); } /* Write SMTP domain */ char szSmtpDomain[MAX_HOST_NAME] = ""; if (USmtpSplitEmailAddr(pszRcptTo, NULL, szSmtpDomain) < 0) { ErrorPush(); fclose(pSpoolFile); SysRemove(pszSpoolFile); return ErrorPop(); } fprintf(pSpoolFile, "%s\r\n", szSmtpDomain); /* Write message ID */ SYS_UINT64 ullMessageID = 0; if (SvrGetMessageID(&ullMessageID) < 0) { ErrorPush(); fclose(pSpoolFile); SysRemove(pszSpoolFile); return ErrorPop(); } fprintf(pSpoolFile, "P" SYS_LLX_FMT "\r\n", ullMessageID); /* Write "MAIL FROM:" */ fprintf(pSpoolFile, "MAIL FROM: <%s>\r\n", pszMailFrom); /* Write "RCPT TO:" */ fprintf(pSpoolFile, "RCPT TO: <%s>\r\n", pszRcptTo); /* Write SPOOL_FILE_DATA_START */ fprintf(pSpoolFile, "%s\r\n", SPOOL_FILE_DATA_START); /* Write message body */ if (MscCopyFile(pSpoolFile, pMailFile, 0, (SYS_OFF_T) -1) < 0) { ErrorPush(); fclose(pSpoolFile); SysRemove(pszSpoolFile); return ErrorPop(); } fclose(pSpoolFile); return 0; } int USmlCreateSpoolFile(SPLF_HANDLE hFSpool, char const *pszFromUser, char const *pszRcptUser, char const *pszFileName, ...) { va_list Headers; va_start(Headers, pszFileName); int iCreateResult = USmlVCreateSpoolFile(hFSpool, pszFromUser, pszRcptUser, pszFileName, Headers); va_end(Headers); return iCreateResult; } static int USmlGetMailProcessFile(UserInfo *pUI, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char *pszMPFilePath) { /* Get the custom spool file associated with this message */ if (USmlGetUserCustomSpoolFile(hQueue, hMessage, pszMPFilePath) < 0) return ErrGetErrorCode(); /* If the file already exist inside the spool, just return the latest */ if (SysExistFile(pszMPFilePath)) return 0; /* * Try to get a new copy from the user one. It'll fail if the account is not * handled with a custom mail processing */ return UsrGetMailProcessFile(pUI, pszMPFilePath, GMPROC_USER | GMPROC_DOMAIN); } static int USmlLocalDelivery(SVRCFG_HANDLE hSvrConfig, UserInfo *pUI, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, LocalMailProcConfig &LMPC) { /* Apply filters ... */ if (FilFilterMessage(hFSpool, hQueue, hMessage, FILTER_MODE_INBOUND) < 0) return ErrGetErrorCode(); /* * Check if the mailbox can store the current message, according * to the account's storage policies. Do not use the probe message size * here (as second parameter to UPopCheckMailboxSize()), since at SMTP * level we do not use it. And using it here will lead to EFULL messages * never returned at SMTP level. */ if (UPopCheckMailboxSize(pUI) < 0) { ErrorPush(); QueUtErrLogMessage(hQueue, hMessage, "Message rejected due to account mailbox quota\n"); QueUtNotifyPermErrDelivery(hQueue, hMessage, hFSpool, ErrGetErrorString(ErrorFetch()), NULL, true); return ErrorPop(); } /* Create mailbox file ... */ char szMBFile[SYS_MAX_PATH] = ""; if (UsrGetTmpFile(pUI->pszDomain, szMBFile, sizeof(szMBFile)) < 0) return ErrGetErrorCode(); if (USmlCreateMBFile(pUI, szMBFile, hFSpool) < 0) return ErrGetErrorCode(); /* and send it home */ char const *pszMessageID = USmlGetSpoolFile(hFSpool); if (UsrMoveToMailBox(pUI, szMBFile, pszMessageID) < 0) { ErrorPush(); SysRemove(szMBFile); return ErrorPop(); } /* Log operation */ if (LMPC.ulFlags & LMPCF_LOG_ENABLED) { char szLocalAddress[MAX_ADDR_NAME] = ""; USmlLogMessage(hFSpool, "LOCAL", NULL, UsrGetAddress(pUI, szLocalAddress)); } return 0; } static char *USmlMacroLkupProc(void *pPrivate, char const *pszName, int iSize) { MacroSubstCtx *pMSC = (MacroSubstCtx *) pPrivate; if (MemMatch(pszName, iSize, "FROM", 4)) { char const *const *ppszFrom = USmlGetMailFrom(pMSC->hFSpool); int iFromDomains = StrStringsCount(ppszFrom); return SysStrDup((iFromDomains > 0) ? ppszFrom[iFromDomains - 1]: ""); } else if (MemMatch(pszName, iSize, "RCPT", 4)) { char const *const *ppszRcpt = USmlGetRcptTo(pMSC->hFSpool); int iRcptDomains = StrStringsCount(ppszRcpt); return SysStrDup((iRcptDomains > 0) ? ppszRcpt[iRcptDomains - 1]: ""); } else if (MemMatch(pszName, iSize, "RRCPT", 5)) { char szUserAddress[MAX_ADDR_NAME] = ""; UsrGetAddress(pMSC->pUI, szUserAddress); return SysStrDup(szUserAddress); } else if (MemMatch(pszName, iSize, "FILE", 4)) { return SysStrDup(pMSC->FSect.szFilePath); } else if (MemMatch(pszName, iSize, "MSGID", 5)) { return SysStrDup(USmlGetSpoolFile(pMSC->hFSpool)); } else if (MemMatch(pszName, iSize, "MSGREF", 6)) { return SysStrDup(USmlGetSmtpMessageID(pMSC->hFSpool)); } else if (MemMatch(pszName, iSize, "LOCALADDR", 9)) { char const *const *ppszInfo = USmlGetInfo(pMSC->hFSpool); return SysStrDup(ppszInfo[smiServerAddr]); } else if (MemMatch(pszName, iSize, "REMOTEADDR", 10)) { char const *const *ppszInfo = USmlGetInfo(pMSC->hFSpool); return SysStrDup(ppszInfo[smiClientAddr]); } else if (MemMatch(pszName, iSize, "TMPFILE", 7)) { char szTmpFile[SYS_MAX_PATH] = ""; MscSafeGetTmpFile(szTmpFile, sizeof(szTmpFile)); if (MscCopyFile(szTmpFile, pMSC->FSect.szFilePath) < 0) { CheckRemoveFile(szTmpFile); return NULL; } return SysStrDup(szTmpFile); } else if (MemMatch(pszName, iSize, "USERAUTH", 8)) { char szAuthName[MAX_ADDR_NAME] = "-"; USmlMessageAuth(pMSC->hFSpool, szAuthName, sizeof(szAuthName) - 1); return SysStrDup(szAuthName); } return SysStrDup(""); } static int USmlCmdMacroSubstitutes(char **ppszCmdTokens, UserInfo *pUI, SPLF_HANDLE hFSpool) { MacroSubstCtx MSC; MSC.hFSpool = hFSpool; MSC.pUI = pUI; /* * This function retrieve the spool file message section and sync the content. * This is necessary before passing the file name to external programs. */ if (USmlGetMsgFileSection(hFSpool, MSC.FSect) < 0) return ErrGetErrorCode(); return MscReplaceTokens(ppszCmdTokens, USmlMacroLkupProc, &MSC); } static int USmlCmd_external(char **ppszCmdTokens, int iNumTokens, SVRCFG_HANDLE hSvrConfig, UserInfo *pUI, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, LocalMailProcConfig &LMPC) { /* Apply filters ... */ if (FilFilterMessage(hFSpool, hQueue, hMessage, FILTER_MODE_INBOUND) < 0) return ErrGetErrorCode(); if (iNumTokens < 5) { ErrSetErrorCode(ERR_BAD_MAILPROC_CMD_SYNTAX); return ERR_BAD_MAILPROC_CMD_SYNTAX; } int iPriority = atoi(ppszCmdTokens[1]); int iWaitTimeout = atoi(ppszCmdTokens[2]) * 1000; int iExitStatus = 0; if (SysExec(ppszCmdTokens[3], &ppszCmdTokens[3], iWaitTimeout, iPriority, &iExitStatus) < 0) { ErrorPush(); char const *pszMailFrom = USmlMailFrom(hFSpool); char const *pszRcptTo = USmlRcptTo(hFSpool); ErrLogMessage(LOG_LEV_MESSAGE, "USMAIL EXTRN-Send Prg = \"%s\" From = \"%s\" To = \"%s\" Failed !\n", ppszCmdTokens[3], pszMailFrom, pszRcptTo); QueUtErrLogMessage(hQueue, hMessage, "USMAIL EXTRN-Send Prg = \"%s\" From = \"%s\" To = \"%s\" Failed !\n", ppszCmdTokens[3], pszMailFrom, pszRcptTo); return ErrorPop(); } /* Log operation */ if (LMPC.ulFlags & LMPCF_LOG_ENABLED) USmlLogMessage(hFSpool, "EXTRN", NULL, ppszCmdTokens[3]); return (iExitStatus == SMAIL_EXTERNAL_EXIT_BREAK) ? SMAIL_STOP_PROCESSING: 0; } static int USmlCmd_filter(char **ppszCmdTokens, int iNumTokens, SVRCFG_HANDLE hSvrConfig, UserInfo *pUI, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, LocalMailProcConfig &LMPC) { if (iNumTokens < 5) { ErrSetErrorCode(ERR_BAD_MAILPROC_CMD_SYNTAX); return ERR_BAD_MAILPROC_CMD_SYNTAX; } int iPriority = atoi(ppszCmdTokens[1]); int iWaitTimeout = atoi(ppszCmdTokens[2]) * 1000; int iExitStatus = 0; if (SysExec(ppszCmdTokens[3], &ppszCmdTokens[3], iWaitTimeout, iPriority, &iExitStatus) < 0) { ErrorPush(); char const *pszMailFrom = USmlMailFrom(hFSpool); char const *pszRcptTo = USmlRcptTo(hFSpool); ErrLogMessage(LOG_LEV_MESSAGE, "USMAIL FILTER Prg = \"%s\" From = \"%s\" To = \"%s\" Failed !\n", ppszCmdTokens[3], pszMailFrom, pszRcptTo); QueUtErrLogMessage(hQueue, hMessage, "USMAIL FILTER Prg = \"%s\" From = \"%s\" To = \"%s\" Failed !\n", ppszCmdTokens[3], pszMailFrom, pszRcptTo); return ErrorPop(); } /* Log operation */ if (LMPC.ulFlags & LMPCF_LOG_ENABLED) USmlLogMessage(hFSpool, "FILTER", NULL, ppszCmdTokens[3]); /* Separate code from flags */ int iExitFlags = iExitStatus & FILTER_FLAGS_MASK; iExitStatus &= ~FILTER_FLAGS_MASK; if (iExitStatus == FILTER_OUT_EXITCODE || iExitStatus == FILTER_OUT_NN_EXITCODE || iExitStatus == FILTER_OUT_NNF_EXITCODE) { /* Filter out message */ char *pszRejMsg = FilGetFilterRejMessage(USmlGetSpoolFilePath(hFSpool)); if (iExitStatus == FILTER_OUT_EXITCODE) QueUtNotifyPermErrDelivery(hQueue, hMessage, NULL, (pszRejMsg != NULL) ? pszRejMsg : ErrGetErrorString(ERR_FILTERED_MESSAGE), NULL, true); else if (iExitStatus == FILTER_OUT_NN_EXITCODE) QueCleanupMessage(hQueue, hMessage, !QueUtRemoveSpoolErrors()); else QueCleanupMessage(hQueue, hMessage, false); SysFree(pszRejMsg); ErrSetErrorCode(ERR_FILTERED_MESSAGE); return ERR_FILTERED_MESSAGE; } else if (iExitStatus == FILTER_MODIFY_EXITCODE) { /* Filter modified the message, we need to reload the spool handle */ if (USmlReloadHandle(hFSpool) < 0) { ErrorPush(); char const *pszMailFrom = USmlMailFrom(hFSpool); char const *pszRcptTo = USmlRcptTo(hFSpool); SysLogMessage(LOG_LEV_MESSAGE, "Filter error [ Modified message corrupted ]: Sender = \"%s\" Recipient = \"%s\" (%s)\n", pszMailFrom, pszRcptTo, ppszCmdTokens[3]); QueUtErrLogMessage(hQueue, hMessage, "Filter error [ Modified message corrupted ]: Sender = \"%s\" Recipient = \"%s\" (%s)\n", pszMailFrom, pszRcptTo, ppszCmdTokens[3]); QueCleanupMessage(hQueue, hMessage, true); return ErrorPop(); } } return (iExitFlags & FILTER_FLAGS_BREAK) ? SMAIL_STOP_PROCESSING: 0; } static int USmlCmd_mailbox(char **ppszCmdTokens, int iNumTokens, SVRCFG_HANDLE hSvrConfig, UserInfo *pUI, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, LocalMailProcConfig &LMPC) { if (iNumTokens != 1) { ErrSetErrorCode(ERR_BAD_MAILPROC_CMD_SYNTAX); return ERR_BAD_MAILPROC_CMD_SYNTAX; } /* * Deliver the file locally. */ if (USmlLocalDelivery(hSvrConfig, pUI, hFSpool, hQueue, hMessage, LMPC) < 0) return ErrGetErrorCode(); return 0; } static int USmlCmd_redirect(char **ppszCmdTokens, int iNumTokens, SVRCFG_HANDLE hSvrConfig, UserInfo *pUI, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, LocalMailProcConfig &LMPC) { if (iNumTokens < 2) { ErrSetErrorCode(ERR_BAD_MAILPROC_CMD_SYNTAX); return ERR_BAD_MAILPROC_CMD_SYNTAX; } char szUserAddress[MAX_ADDR_NAME] = ""; UsrGetAddress(pUI, szUserAddress); /* Redirection loop */ char const *pszSMTPDomain = USmlGetSMTPDomain(hFSpool); for (int i = 1; ppszCmdTokens[i] != NULL; i++) { /* Get message handle */ QMSG_HANDLE hRedirMessage = QueCreateMessage(hSpoolQueue); if (hRedirMessage == INVALID_QMSG_HANDLE) return ErrGetErrorCode(); char szQueueFilePath[SYS_MAX_PATH] = ""; QueGetFilePath(hSpoolQueue, hRedirMessage, szQueueFilePath); char szAliasAddr[MAX_ADDR_NAME] = ""; if (strchr(ppszCmdTokens[i], '@') == NULL) SysSNPrintf(szAliasAddr, sizeof(szAliasAddr) - 1, "%s@%s", pUI->pszName, ppszCmdTokens[i]); else StrSNCpy(szAliasAddr, ppszCmdTokens[i]); if (USmlCreateSpoolFile(hFSpool, NULL, szAliasAddr, szQueueFilePath, "X-Deliver-To", szUserAddress, NULL) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hRedirMessage); QueCloseMessage(hSpoolQueue, hRedirMessage); return ErrorPop(); } /* Transfer file to the spool */ if (QueCommitMessage(hSpoolQueue, hRedirMessage) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hRedirMessage); QueCloseMessage(hSpoolQueue, hRedirMessage); return ErrorPop(); } /* Log the redir operation */ if (LMPC.ulFlags & LMPCF_LOG_ENABLED) USmlLogMessage(hFSpool, "REDIR", NULL, ppszCmdTokens[i]); } return 0; } static int USmlCmd_lredirect(char **ppszCmdTokens, int iNumTokens, SVRCFG_HANDLE hSvrConfig, UserInfo *pUI, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, LocalMailProcConfig &LMPC) { if (iNumTokens < 2) { ErrSetErrorCode(ERR_BAD_MAILPROC_CMD_SYNTAX); return ERR_BAD_MAILPROC_CMD_SYNTAX; } char szUserAddress[MAX_ADDR_NAME] = ""; UsrGetAddress(pUI, szUserAddress); /* Redirection loop */ for (int i = 1; ppszCmdTokens[i] != NULL; i++) { /* Get message handle */ QMSG_HANDLE hRedirMessage = QueCreateMessage(hSpoolQueue); if (hRedirMessage == INVALID_QMSG_HANDLE) return ErrGetErrorCode(); char szQueueFilePath[SYS_MAX_PATH] = ""; QueGetFilePath(hSpoolQueue, hRedirMessage, szQueueFilePath); char szAliasAddr[MAX_ADDR_NAME] = ""; if (strchr(ppszCmdTokens[i], '@') == NULL) SysSNPrintf(szAliasAddr, sizeof(szAliasAddr) - 1, "%s@%s", pUI->pszName, ppszCmdTokens[i]); else StrSNCpy(szAliasAddr, ppszCmdTokens[i]); if (USmlCreateSpoolFile(hFSpool, szUserAddress, szAliasAddr, szQueueFilePath, "X-Deliver-To", szUserAddress, NULL) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hRedirMessage); QueCloseMessage(hSpoolQueue, hRedirMessage); return ErrorPop(); } /* Transfer file to the spool */ if (QueCommitMessage(hSpoolQueue, hRedirMessage) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hRedirMessage); QueCloseMessage(hSpoolQueue, hRedirMessage); return ErrorPop(); } /* Log the redir operation */ if (LMPC.ulFlags & LMPCF_LOG_ENABLED) USmlLogMessage(hFSpool, "LREDIR", NULL, ppszCmdTokens[i]); } return 0; } static int USmlCmd_smtprelay(char **ppszCmdTokens, int iNumTokens, SVRCFG_HANDLE hSvrConfig, UserInfo *pUI, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, LocalMailProcConfig &LMPC) { /* Apply filters ... */ if (FilFilterMessage(hFSpool, hQueue, hMessage, FILTER_MODE_OUTBOUND) < 0) return ErrGetErrorCode(); if (iNumTokens < 2) { ErrSetErrorCode(ERR_BAD_MAILPROC_CMD_SYNTAX); return ERR_BAD_MAILPROC_CMD_SYNTAX; } char **ppszRelays = NULL; if (ppszCmdTokens[1][0] == '#') { if ((ppszRelays = StrTokenize(ppszCmdTokens[1] + 1, ";")) != NULL) MscRandomizeStringsOrder(ppszRelays); } else ppszRelays = StrTokenize(ppszCmdTokens[1], ";"); if (ppszRelays == NULL) return ErrGetErrorCode(); SMTPGateway **ppGws = USmtpGetCfgGateways(hSvrConfig, ppszRelays, iNumTokens > 2 ? ppszCmdTokens[2]: NULL); StrFreeStrings(ppszRelays); if (ppGws == NULL) return ErrGetErrorCode(); /* This function retrieve the spool file message section and sync the content. */ /* This is necessary before sending the file */ FileSection FSect; if (USmlGetMsgFileSection(hFSpool, FSect) < 0) { ErrorPush(); USmtpFreeGateways(ppGws); return ErrorPop(); } /* Get spool file infos */ char const *pszSMTPDomain = USmlGetSMTPDomain(hFSpool); char const *pszMailFrom = USmlMailFrom(hFSpool); char const *pszRcptTo = USmlRcptTo(hFSpool); char const *pszSendMailFrom = USmlSendMailFrom(hFSpool); char const *pszSendRcptTo = USmlSendRcptTo(hFSpool); char const *pszSpoolFilePath = USmlGetSpoolFilePath(hFSpool); /* Get HELO domain */ char szHeloDomain[MAX_HOST_NAME] = ""; SvrConfigVar("HeloDomain", szHeloDomain, sizeof(szHeloDomain) - 1, hSvrConfig, ""); char const *pszHeloDomain = IsEmptyString(szHeloDomain) ? NULL: szHeloDomain; SMTPError SMTPE; USmtpInitError(&SMTPE); /* * By initializing this to zero makes XMail to discharge all mail for domains * that have an empty relay list */ int iReturnCode = 0; for (int i = 0; ppGws[i] != NULL && iReturnCode >= 0; i++) { SysLogMessage(LOG_LEV_MESSAGE, "USMAIL SMTP-Send RLYS = \"%s\" SMTP = \"%s\" From = \"%s\" To = \"%s\"\n", ppGws[i]->pszHost, pszSMTPDomain, pszMailFrom, pszRcptTo); USmtpCleanupError(&SMTPE); if (USmtpSendMail(ppGws[i], pszHeloDomain, pszSendMailFrom, pszSendRcptTo, &FSect, &SMTPE) == 0) { /* Log Mailer operation */ if (LMPC.ulFlags & LMPCF_LOG_ENABLED) { char szRmtMsgID[256] = ""; USmtpGetSMTPRmtMsgID(USmtpGetErrorMessage(&SMTPE), szRmtMsgID, sizeof(szRmtMsgID)); USmlLogMessage(hFSpool, "RLYS", szRmtMsgID, ppGws[i]->pszHost); } USmtpCleanupError(&SMTPE); USmtpFreeGateways(ppGws); return 0; } int iErrorCode = ErrGetErrorCode(); char szSmtpError[512] = ""; USmtpGetSMTPError(&SMTPE, szSmtpError, sizeof(szSmtpError)); ErrLogMessage(LOG_LEV_MESSAGE, "USMAIL SMTP-Send RLYS = \"%s\" SMTP = \"%s\" From = \"%s\" To = \"%s\" Failed !\n" "%s = \"%s\"\n", ppGws[i]->pszHost, pszSMTPDomain, pszMailFrom, pszRcptTo, SMTP_ERROR_VARNAME, szSmtpError); QueUtErrLogMessage(hQueue, hMessage, "USMAIL SMTP-Send RLYS = \"%s\" SMTP = \"%s\" From = \"%s\" To = \"%s\" Failed !\n" "%s = \"%s\"\n", ppGws[i]->pszHost, pszSMTPDomain, pszMailFrom, pszRcptTo, SMTP_ERROR_VARNAME, szSmtpError); /* If a permanent SMTP error has been detected, then notify the message sender */ if (USmtpIsFatalError(&SMTPE)) QueUtNotifyPermErrDelivery(hQueue, hMessage, hFSpool, USmtpGetErrorMessage(&SMTPE), USmtpGetErrorServer(&SMTPE), false); iReturnCode = USmtpIsFatalError(&SMTPE) ? iErrorCode: -iErrorCode; } USmtpCleanupError(&SMTPE); USmtpFreeGateways(ppGws); return iReturnCode; } static int USmlProcessCustomMailingFile(SVRCFG_HANDLE hSvrConfig, UserInfo *pUI, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char const *pszMPFile, LocalMailProcConfig &LMPC) { /* Open the mail processing file */ FILE *pMPFile = fopen(pszMPFile, "rt"); if (pMPFile == NULL) { ErrSetErrorCode(ERR_FILE_OPEN, pszMPFile); return ERR_FILE_OPEN; } /* Create pushback command file */ char szTmpFile[SYS_MAX_PATH] = ""; UsrGetTmpFile(NULL, szTmpFile, sizeof(szTmpFile)); FILE *pPushBFile = fopen(szTmpFile, "wt"); if (pPushBFile == NULL) { fclose(pMPFile); ErrSetErrorCode(ERR_FILE_CREATE, szTmpFile); return ERR_FILE_CREATE; } int iPushBackCmds = 0; char szCmdLine[CUSTOM_CMD_LINE_MAX] = ""; while (MscGetConfigLine(szCmdLine, sizeof(szCmdLine) - 1, pMPFile) != NULL) { char **ppszCmdTokens = StrGetTabLineStrings(szCmdLine); if (ppszCmdTokens == NULL) continue; int iFieldsCount = StrStringsCount(ppszCmdTokens); if (iFieldsCount > 0) { /* Do command line macro substitution */ USmlCmdMacroSubstitutes(ppszCmdTokens, pUI, hFSpool); int iCmdResult = 0; if (stricmp(ppszCmdTokens[0], "external") == 0) iCmdResult = USmlCmd_external(ppszCmdTokens, iFieldsCount, hSvrConfig, pUI, hFSpool, hQueue, hMessage, LMPC); else if (stricmp(ppszCmdTokens[0], "filter") == 0) iCmdResult = USmlCmd_filter(ppszCmdTokens, iFieldsCount, hSvrConfig, pUI, hFSpool, hQueue, hMessage, LMPC); else if (stricmp(ppszCmdTokens[0], "mailbox") == 0) iCmdResult = USmlCmd_mailbox(ppszCmdTokens, iFieldsCount, hSvrConfig, pUI, hFSpool, hQueue, hMessage, LMPC); else if (stricmp(ppszCmdTokens[0], "redirect") == 0) iCmdResult = USmlCmd_redirect(ppszCmdTokens, iFieldsCount, hSvrConfig, pUI, hFSpool, hQueue, hMessage, LMPC); else if (stricmp(ppszCmdTokens[0], "lredirect") == 0) iCmdResult = USmlCmd_lredirect(ppszCmdTokens, iFieldsCount, hSvrConfig, pUI, hFSpool, hQueue, hMessage, LMPC); else if (stricmp(ppszCmdTokens[0], "smtprelay") == 0) iCmdResult = USmlCmd_smtprelay(ppszCmdTokens, iFieldsCount, hSvrConfig, pUI, hFSpool, hQueue, hMessage, LMPC); else { SysLogMessage(LOG_LEV_ERROR, "Invalid command \"%s\" in file \"%s\"\n", ppszCmdTokens[0], pszMPFile); } /* Check for the stop-processing error code */ if (iCmdResult == SMAIL_STOP_PROCESSING) { StrFreeStrings(ppszCmdTokens); break; } /* Test if we must save a failed command */ /* <0 = Error ; ==0 = Success ; >0 = Transient error ( save the command ) */ if (iCmdResult > 0) { fprintf(pPushBFile, "%s\n", szCmdLine); ++iPushBackCmds; } /* An error code might result if filters blocked the message. If this is the */ /* case QueCheckMessage() will return error and we MUST stop processing */ if (iCmdResult < 0 && QueCheckMessage(hQueue, hMessage) < 0) { ErrorPush(); StrFreeStrings(ppszCmdTokens); fclose(pPushBFile); fclose(pMPFile); SysRemove(szTmpFile); return ErrorPop(); } } StrFreeStrings(ppszCmdTokens); } fclose(pPushBFile); fclose(pMPFile); SysRemove(pszMPFile); if (iPushBackCmds > 0) { /* If commands left out of processing, push them into the custom file */ if (MscMoveFile(szTmpFile, pszMPFile) < 0) return ErrGetErrorCode(); ErrSetErrorCode(ERR_INCOMPLETE_PROCESSING); return ERR_INCOMPLETE_PROCESSING; } SysRemove(szTmpFile); return 0; } int USmlProcessLocalUserMessage(SVRCFG_HANDLE hSvrConfig, UserInfo *pUI, SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, LocalMailProcConfig &LMPC) { /* Exist user custom message processing ? */ char szMPFile[SYS_MAX_PATH] = ""; if (USmlGetMailProcessFile(pUI, hQueue, hMessage, szMPFile) < 0) { /* * Deliver the file locally. */ if (USmlLocalDelivery(hSvrConfig, pUI, hFSpool, hQueue, hMessage, LMPC) < 0) return ErrGetErrorCode(); } else { /* Process custom mailings */ if (USmlProcessCustomMailingFile(hSvrConfig, pUI, hFSpool, hQueue, hMessage, szMPFile, LMPC) < 0) return ErrGetErrorCode(); } return 0; } int USmlGetDomainCustomDir(char *pszCustomDir, int iMaxPath, int iFinalSlash) { CfgGetRootPath(pszCustomDir, iMaxPath); StrNCat(pszCustomDir, SMAIL_DOMAIN_PROC_DIR, iMaxPath); if (iFinalSlash) AppendSlash(pszCustomDir); return 0; } int USmlGetCmdAliasDir(char *pszAliasDir, int iMaxPath, int iFinalSlash) { CfgGetRootPath(pszAliasDir, iMaxPath); StrNCat(pszAliasDir, SMAIL_CMDALIAS_DIR, iMaxPath); if (iFinalSlash) AppendSlash(pszAliasDir); return 0; } int USmlGetCmdAliasFile(char const *pszDomain, char const *pszUser, char *pszAliasFile) { char szAliasDir[SYS_MAX_PATH] = ""; USmlGetCmdAliasDir(szAliasDir, sizeof(szAliasDir), 1); SysSNPrintf(pszAliasFile, SYS_MAX_PATH - 1, "%s%s%s%s.tab", szAliasDir, pszDomain, SYS_SLASH_STR, pszUser); StrLower(pszAliasFile + strlen(szAliasDir)); return 0; } int USmlIsCmdAliasAccount(char const *pszDomain, char const *pszUser, char *pszAliasFile) { char szAliasFile[SYS_MAX_PATH] = ""; if (pszAliasFile == NULL) pszAliasFile = szAliasFile; if (USmlGetCmdAliasFile(pszDomain, pszUser, pszAliasFile) < 0) return ErrGetErrorCode(); if (!SysExistFile(pszAliasFile)) { ErrSetErrorCode(ERR_NOT_A_CMD_ALIAS); return ERR_NOT_A_CMD_ALIAS; } return 0; } int USmlCreateCmdAliasDomainDir(char const *pszDomain) { char szAliasDir[SYS_MAX_PATH] = ""; char szDomainAliasDir[SYS_MAX_PATH] = ""; USmlGetCmdAliasDir(szAliasDir, sizeof(szAliasDir), 1); SysSNPrintf(szDomainAliasDir, sizeof(szDomainAliasDir) - 1, "%s%s", szAliasDir, pszDomain); StrLower(szDomainAliasDir + strlen(szAliasDir)); if (SysMakeDir(szDomainAliasDir) < 0) return ErrGetErrorCode(); return 0; } int USmlDeleteCmdAliasDomainDir(char const *pszDomain) { char szAliasDir[SYS_MAX_PATH] = ""; char szDomainAliasDir[SYS_MAX_PATH] = ""; USmlGetCmdAliasDir(szAliasDir, sizeof(szAliasDir), 1); SysSNPrintf(szDomainAliasDir, sizeof(szDomainAliasDir) - 1, "%s%s", szAliasDir, pszDomain); StrLower(szDomainAliasDir + strlen(szAliasDir)); if (SysExistDir(szDomainAliasDir)) { if (MscClearDirectory(szDomainAliasDir) < 0) return ErrGetErrorCode(); if (SysRemoveDir(szDomainAliasDir) < 0) return ErrGetErrorCode(); } return 0; } int USmlGetCmdAliasSpoolFile(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char *pszAliasFilePath) { return QueGetFilePath(hQueue, hMessage, pszAliasFilePath, QUEUE_CUST_DIR); } int USmlGetCmdAliasCustomFile(SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char const *pszDomain, char const *pszUser, char *pszAliasFilePath) { /* Check if exist a spooled copy */ char const *pszSpoolFilePath = USmlGetSpoolFilePath(hFSpool); USmlGetCmdAliasSpoolFile(hQueue, hMessage, pszAliasFilePath); if (SysExistFile(pszAliasFilePath)) return 0; /* Check if this is a cmd alias */ char szAliasFile[SYS_MAX_PATH] = ""; if (USmlIsCmdAliasAccount(pszDomain, pszUser, szAliasFile) < 0) return ErrGetErrorCode(); RLCK_HANDLE hResLock = RLckLockSH(szAliasFile); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); /* Make a copy into the spool */ if (MscCopyFile(pszAliasFilePath, szAliasFile) < 0) { ErrorPush(); RLckUnlockSH(hResLock); return ErrorPop(); } RLckUnlockSH(hResLock); return 0; } int USmlDomainCustomFileName(char const *pszDestDomain, char *pszCustFilePath) { /* Make domain name lower case */ char szDestDomain[MAX_HOST_NAME] = ""; StrSNCpy(szDestDomain, pszDestDomain); StrLower(szDestDomain); /* Build file name */ char szCustomDir[SYS_MAX_PATH] = ""; USmlGetDomainCustomDir(szCustomDir, sizeof(szCustomDir), 1); SysSNPrintf(pszCustFilePath, SYS_MAX_PATH - 1, "%s%s.tab", szCustomDir, szDestDomain); return 0; } int USmlGetDomainCustomFile(char const *pszDestDomain, char *pszCustFilePath) { /* Make domain name lower case */ char szDestDomain[MAX_HOST_NAME] = ""; StrSNCpy(szDestDomain, pszDestDomain); StrLower(szDestDomain); /* Lookup custom files */ char szCustomDir[SYS_MAX_PATH] = ""; USmlGetDomainCustomDir(szCustomDir, sizeof(szCustomDir), 1); for (char const *pszSubDom = szDestDomain; pszSubDom != NULL; pszSubDom = strchr(pszSubDom + 1, '.')) { SysSNPrintf(pszCustFilePath, SYS_MAX_PATH - 1, "%s%s.tab", szCustomDir, pszSubDom); if (SysExistFile(pszCustFilePath)) return 0; } SysSNPrintf(pszCustFilePath, SYS_MAX_PATH - 1, "%s.tab", szCustomDir); if (SysExistFile(pszCustFilePath)) return 0; ErrSetErrorCode(ERR_NOT_A_CUSTOM_DOMAIN); return ERR_NOT_A_CUSTOM_DOMAIN; } int USmlGetDomainCustomSpoolFile(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char *pszCustFilePath) { return QueGetFilePath(hQueue, hMessage, pszCustFilePath, QUEUE_CUST_DIR); } int USmlGetUserCustomSpoolFile(QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char *pszCustFilePath) { return QueGetFilePath(hQueue, hMessage, pszCustFilePath, QUEUE_MPRC_DIR); } int USmlGetDomainMsgCustomFile(SPLF_HANDLE hFSpool, QUEUE_HANDLE hQueue, QMSG_HANDLE hMessage, char const *pszDestDomain, char *pszCustFilePath) { /* Check if exist a spooled copy */ char const *pszSpoolFilePath = USmlGetSpoolFilePath(hFSpool); USmlGetDomainCustomSpoolFile(hQueue, hMessage, pszCustFilePath); if (SysExistFile(pszCustFilePath)) return 0; /* Check if this is a custom domain */ char szCustDomainFile[SYS_MAX_PATH] = ""; if (USmlGetDomainCustomFile(pszDestDomain, szCustDomainFile) < 0) return ErrGetErrorCode(); RLCK_HANDLE hResLock = RLckLockSH(szCustDomainFile); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); /* Make a copy into the spool */ if (MscCopyFile(pszCustFilePath, szCustDomainFile) < 0) { ErrorPush(); RLckUnlockSH(hResLock); return ErrorPop(); } RLckUnlockSH(hResLock); return 0; } int USmlGetCustomDomainFile(char const *pszDestDomain, char const *pszCustFilePath) { /* Check if this is a custom domain */ char szCustDomainFile[SYS_MAX_PATH] = ""; if (USmlGetDomainCustomFile(pszDestDomain, szCustDomainFile) < 0) return ErrGetErrorCode(); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szCustDomainFile, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); /* Make a copy onto user supplied file */ if (MscCopyFile(pszCustFilePath, szCustDomainFile) < 0) { ErrorPush(); RLckUnlockSH(hResLock); return ErrorPop(); } RLckUnlockSH(hResLock); return 0; } int USmlSetCustomDomainFile(char const *pszDestDomain, char const *pszCustFilePath) { /* Check if this is a custom domain */ char szCustDomainFile[SYS_MAX_PATH] = ""; USmlDomainCustomFileName(pszDestDomain, szCustDomainFile); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szCustDomainFile, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); if (pszCustFilePath != NULL) { /* Overwrite current file */ if (MscCopyFile(szCustDomainFile, pszCustFilePath) < 0) { ErrorPush(); RLckUnlockEX(hResLock); return ErrorPop(); } } else SysRemove(szCustDomainFile); RLckUnlockEX(hResLock); return 0; } int USmlCustomizedDomain(char const *pszDestDomain) { char szCustFilePath[SYS_MAX_PATH] = ""; return USmlGetDomainCustomFile(pszDestDomain, szCustFilePath); } static int USmlLogMessage(char const *pszSMTPDomain, char const *pszMessageID, char const *pszSmtpMessageID, char const *pszFrom, char const *pszRcpt, char const *pszMedium, char const *pszParam, char const *pszRmtMsgID) { char szTime[256] = ""; MscGetTimeNbrString(szTime, sizeof(szTime) - 1); RLCK_HANDLE hResLock = RLckLockEX(SVR_LOGS_DIR SYS_SLASH_STR SMAIL_LOG_FILE); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); MscFileLog(SMAIL_LOG_FILE, "\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\n", pszSMTPDomain, pszMessageID, pszSmtpMessageID, pszFrom, pszRcpt, pszMedium, pszParam, szTime, pszRmtMsgID); RLckUnlockEX(hResLock); return 0; } int USmlLogMessage(SPLF_HANDLE hFSpool, char const *pszMedium, char const *pszRmtMsgID, char const *pszParam) { char const *pszSMTPDomain = USmlGetSMTPDomain(hFSpool); char const *pszSmtpMessageID = USmlGetSmtpMessageID(hFSpool); char const *pszMessageID = USmlGetSpoolFile(hFSpool); char const *pszMailFrom = USmlMailFrom(hFSpool); char const *pszRcptTo = USmlRcptTo(hFSpool); return USmlLogMessage(pszSMTPDomain, pszMessageID, pszSmtpMessageID, pszMailFrom, pszRcptTo, pszMedium, pszParam, pszRmtMsgID != NULL ? pszRmtMsgID: ""); } static int USmlRFC822_ATEXT(int c) { return isalpha(c) || isdigit(c) || strchr("!#$%&'*+-/=?^_`{|}~", c) != NULL; } char const *USmlDotAtom(char const *pszStr, char const *pszTop) { for (;;) { char const *pszAtom = pszStr; for (; pszStr < pszTop && USmlRFC822_ATEXT(*pszStr); pszStr++); if (pszAtom == pszStr) return NULL; if (pszStr == pszTop || *pszStr != '.') break; pszStr++; } return pszStr; } static char const *USmlIPDomain(char const *pszAddress, char const *pszTop) { int iSize; char const *pszNext; SYS_INET_ADDR Addr; char szIP[256]; if (*pszAddress != '[' || (pszNext = (char const *) memchr(pszAddress, ']', (int) (pszTop - pszAddress))) == NULL || (iSize = (int) (pszNext - pszAddress) - 1) >= (int) sizeof(szIP)) { ErrSetErrorCode(ERR_BAD_TAG_ADDRESS, pszAddress); return NULL; } Cpy2Sz(szIP, pszAddress + 1, iSize); if (SysGetHostByName(szIP, -1, Addr) < 0) return NULL; return pszNext + 1; } char const *USmlParseHost(char const *pszHost, char const *pszTop) { char const *pszNext; if (*pszHost == '[') pszNext = USmlIPDomain(pszHost, pszTop); else if ((pszNext = USmlDotAtom(pszHost, pszTop)) == NULL) ErrSetErrorCode(ERR_BAD_TAG_ADDRESS, pszHost, (int) (pszTop - pszHost)); return pszNext; } int USmlValidHost(char const *pszHost, char const *pszTop) { char const *pszEOH; if ((pszEOH = USmlParseHost(pszHost, pszTop)) == NULL) return ErrGetErrorCode(); if (pszEOH != pszTop) { ErrSetErrorCode(ERR_INVALID_HOSTNAME, pszHost, (int) (pszTop - pszHost)); return ERR_INVALID_HOSTNAME; } return 0; } int USmlValidAddress(char const *pszAddress, char const *pszTop) { char const *pszAddr = pszAddress; if (*pszAddr == '@') { for (;;) { if (*pszAddr++ != '@' || (pszAddr = USmlParseHost(pszAddr, pszTop)) == NULL) return ErrGetErrorCode(); if (*pszAddr != ',') break; pszAddr++; } if (*pszAddr++ != ':') { ErrSetErrorCode(ERR_BAD_TAG_ADDRESS, pszAddress, (int) (pszTop - pszAddress)); return ERR_BAD_TAG_ADDRESS; } } if ((pszAddr = USmlDotAtom(pszAddr, pszTop)) == NULL || *pszAddr++ != '@') { ErrSetErrorCode(ERR_BAD_TAG_ADDRESS, pszAddress, (int) (pszTop - pszAddress)); return ERR_BAD_TAG_ADDRESS; } return USmlValidHost(pszAddr, pszTop); } int USmlParseAddress(char const *pszAddress, char *pszPreAddr, int iMaxPreAddress, char *pszEmailAddr, int iMaxAddress) { StrSkipSpaces(pszAddress); if (*pszAddress == '\0') { ErrSetErrorCode(ERR_EMPTY_ADDRESS); return ERR_EMPTY_ADDRESS; } char const *pszOpen = strrchr(pszAddress, '<'); if (pszOpen != NULL) { char const *pszClose = strrchr(pszOpen + 1, '>'); if (pszClose == NULL) { ErrSetErrorCode(ERR_BAD_TAG_ADDRESS); return ERR_BAD_TAG_ADDRESS; } if (pszClose == pszOpen + 1) { ErrSetErrorCode(ERR_EMPTY_ADDRESS); return ERR_EMPTY_ADDRESS; } if (pszPreAddr != NULL) { int iPreCount = Min((int) (pszOpen - pszAddress), iMaxPreAddress - 1); strncpy(pszPreAddr, pszAddress, iPreCount); pszPreAddr[iPreCount] = '\0'; StrTrim(pszPreAddr, " \t"); } if (USmlValidAddress(pszOpen + 1, pszClose) < 0) return ErrGetErrorCode(); if (pszEmailAddr != NULL) { int iEmailCount = (int) Min((pszClose - pszOpen) - 1, iMaxAddress - 1); if (iEmailCount < 0) { ErrSetErrorCode(ERR_BAD_TAG_ADDRESS); return ERR_BAD_TAG_ADDRESS; } strncpy(pszEmailAddr, pszOpen + 1, iEmailCount); pszEmailAddr[iEmailCount] = '\0'; StrTrim(pszEmailAddr, " \t"); } } else { int iAddrLen = strlen(pszAddress); if (iAddrLen == 0) { ErrSetErrorCode(ERR_EMPTY_ADDRESS); return ERR_EMPTY_ADDRESS; } if (USmlValidAddress(pszAddress, pszAddress + iAddrLen) < 0) return ErrGetErrorCode(); if (pszPreAddr != NULL) SetEmptyString(pszPreAddr); if (pszEmailAddr != NULL) { strncpy(pszEmailAddr, pszAddress, iMaxAddress - 1); pszEmailAddr[iMaxAddress - 1] = '\0'; StrTrim(pszEmailAddr, " \t"); } } return 0; } static int USmlExtractFromAddress(HSLIST &hTagList, char *pszFromAddr, int iMaxAddress) { /* Try to discover the "Return-Path" ( or eventually "From" ) tag to setup */ /* the "MAIL FROM: <>" part of the spool message */ TAG_POSITION TagPosition = TAG_POSITION_INIT; MessageTagData *pMTD = USmlFindTag(hTagList, "Return-Path", TagPosition); if (pMTD != NULL && USmlParseAddress(pMTD->pszTagData, NULL, 0, pszFromAddr, iMaxAddress) == 0) return 0; TagPosition = TAG_POSITION_INIT; if ((pMTD = USmlFindTag(hTagList, "From", TagPosition)) != NULL && USmlParseAddress(pMTD->pszTagData, NULL, 0, pszFromAddr, iMaxAddress) == 0) return 0; ErrSetErrorCode(ERR_MAILFROM_UNKNOWN); return ERR_MAILFROM_UNKNOWN; } static char const *USmlAddressFromAtPtr(char const *pszAt, char const *pszBase, char *pszAddress, int iMaxAddress) { char const *pszStart = pszAt; for (; (pszStart >= pszBase) && (strchr("<> \t,\":;'\r\n", *pszStart) == NULL); pszStart--); ++pszStart; char const *pszEnd = pszAt + 1; for (; (*pszEnd != '\0') && (strchr("<> \t,\":;'\r\n", *pszEnd) == NULL); pszEnd++); int iAddrLength = Min((int) (pszEnd - pszStart), iMaxAddress - 1); Cpy2Sz(pszAddress, pszStart, iAddrLength); return pszEnd; } static char const *USmlAddSingleAddress(char const *pszCurr, char const *pszBase, DynString *pAddrDS, char const *const *ppszMatchDomains, int *piAdded) { *piAdded = 0; char const *pszAt = strchr(pszCurr, '@'); if (pszAt == NULL) return NULL; char szAddress[MAX_SMTP_ADDRESS] = ""; char szDomain[MAX_ADDR_NAME] = ""; if ((pszCurr = USmlAddressFromAtPtr(pszAt, pszBase, szAddress, sizeof(szAddress) - 1)) != NULL && USmtpSplitEmailAddr(szAddress, NULL, szDomain) == 0 && (ppszMatchDomains == NULL || StrStringsIMatch(ppszMatchDomains, szDomain)) && StrIStr(StrDynGet(pAddrDS), szAddress) == NULL) { if (StrDynSize(pAddrDS) > 0) StrDynAdd(pAddrDS, ADDRESS_TOKENIZER); StrDynAdd(pAddrDS, szAddress); ++(*piAdded); } return pszCurr; } static int USmlAddAddresses(char const *pszAddrList, DynString *pAddrDS, char const *const *ppszMatchDomains) { int iAddrAdded = 0; int iAdded; char const *pszCurr = pszAddrList; for (; (pszCurr != NULL) && (*pszCurr != '\0');) { pszCurr = USmlAddSingleAddress(pszCurr, pszAddrList, pAddrDS, ppszMatchDomains, &iAdded); if (iAdded) ++iAddrAdded; } return iAddrAdded; } static char **USmlGetAddressList(HSLIST &hTagList, char const *const *ppszMatchDomains, char const *const *ppszAddrTags) { DynString AddrDS; StrDynInit(&AddrDS); for (int i = 0; ppszAddrTags[i] != NULL; i++) { char const *pszHdrTag = (strchr("+", ppszAddrTags[i][0]) != NULL) ? ppszAddrTags[i] + 1: ppszAddrTags[i]; TAG_POSITION TagPosition = TAG_POSITION_INIT; MessageTagData *pMTD = USmlFindTag(hTagList, pszHdrTag, TagPosition); for (; pMTD != NULL; pMTD = USmlFindTag(hTagList, pszHdrTag, TagPosition)) { int iAddrAdded = USmlAddAddresses(pMTD->pszTagData, &AddrDS, ppszMatchDomains); /* Exclusive tag detected, stop the scan */ if (iAddrAdded > 0 && ppszAddrTags[i][0] == '+') goto BuildAddrList; } } /* Yes, i know, goto's might be bad. Not in this case though ... */ BuildAddrList: char **ppszAddresses = StrTokenize(StrDynGet(&AddrDS), ADDRESS_TOKENIZER); StrDynFree(&AddrDS); return ppszAddresses; } static int USmlExtractToAddress(HSLIST &hTagList, char *pszToAddr, int iMaxAddress) { /* Try to extract the "To:" tag from the mail headers */ TAG_POSITION TagPosition = TAG_POSITION_INIT; MessageTagData *pMTD = USmlFindTag(hTagList, "To", TagPosition); if (pMTD == NULL || USmlParseAddress(pMTD->pszTagData, NULL, 0, pszToAddr, iMaxAddress) < 0) { ErrSetErrorCode(ERR_RCPTTO_UNKNOWN); return ERR_RCPTTO_UNKNOWN; } return 0; } static char **USmlBuildTargetRcptList(char const *pszRcptTo, HSLIST &hTagList, char const *pszFetchHdrTags) { char **ppszRcptList = NULL; char **ppszAddrTags = NULL; if (pszFetchHdrTags != NULL && (ppszAddrTags = StrTokenize(pszFetchHdrTags, ",")) == NULL) return NULL; if (pszRcptTo == NULL) { if (ppszAddrTags == NULL) { ErrSetErrorCode(ERR_NO_HDR_FETCH_TAGS); return NULL; } /* If the recipient is NULL try to extract addresses from the message using */ /* the supplied tag string */ if ((ppszRcptList = USmlGetAddressList(hTagList, NULL, ppszAddrTags)) == NULL) { StrFreeStrings(ppszAddrTags); return NULL; } } else if (*pszRcptTo == '?') { if (ppszAddrTags == NULL) { ErrSetErrorCode(ERR_NO_HDR_FETCH_TAGS); return NULL; } /* Extract matching domains */ char **ppszDomains = StrTokenize(pszRcptTo, ","); if (ppszDomains == NULL) { StrFreeStrings(ppszAddrTags); return NULL; } /* We need to masquerade incoming domain. In this case "pszRcptTo" is made by */ /* "?" + masquerade-domain */ if ((ppszRcptList = USmlGetAddressList(hTagList, &ppszDomains[1], ppszAddrTags)) == NULL) { StrFreeStrings(ppszDomains); StrFreeStrings(ppszAddrTags); return NULL; } int iAddrCount = StrStringsCount(ppszRcptList); for (int i = 0; i < iAddrCount; i++) { char szToUser[MAX_ADDR_NAME] = ""; char szRecipient[MAX_ADDR_NAME] = ""; if (USmtpSplitEmailAddr(ppszRcptList[i], szToUser, NULL) == 0) { SysSNPrintf(szRecipient, sizeof(szRecipient) - 1, "%s@%s", szToUser, ppszDomains[0] + 1); SysFree(ppszRcptList[i]); ppszRcptList[i] = SysStrDup(szRecipient); } } StrFreeStrings(ppszDomains); } else if (*pszRcptTo == '&') { if (ppszAddrTags == NULL) { ErrSetErrorCode(ERR_NO_HDR_FETCH_TAGS); return NULL; } /* Extract matching domains */ char **ppszDomains = StrTokenize(pszRcptTo, ","); if (ppszDomains == NULL) { StrFreeStrings(ppszAddrTags); return NULL; } /* * We need to masquerade incoming domain. In this case "pszRcptTo" is made by * "&" + add-domain + match-domains. */ if ((ppszRcptList = USmlGetAddressList(hTagList, &ppszDomains[1], ppszAddrTags)) == NULL) { StrFreeStrings(ppszDomains); StrFreeStrings(ppszAddrTags); return NULL; } int iAddrCount = StrStringsCount(ppszRcptList); for (int i = 0; i < iAddrCount; i++) { char szRecipient[MAX_ADDR_NAME] = ""; SysSNPrintf(szRecipient, sizeof(szRecipient) - 1, "%s%s", ppszRcptList[i], ppszDomains[0] + 1); SysFree(ppszRcptList[i]); ppszRcptList[i] = SysStrDup(szRecipient); } StrFreeStrings(ppszDomains); } else ppszRcptList = StrBuildList(pszRcptTo, NULL); StrFreeStrings(ppszAddrTags); return ppszRcptList; } int USmlDeliverFetchedMsg(char const *pszSyncAddr, char const *pszFetchHdrTags, char const *pszMailFile) { FILE *pMailFile = fopen(pszMailFile, "rb"); if (pMailFile == NULL) { ErrSetErrorCode(ERR_FILE_OPEN); return ERR_FILE_OPEN; } /* Load message tags */ HSLIST hTagList; ListInit(hTagList); USmlLoadTags(pMailFile, hTagList); /* Extract "MAIL FROM: <>" address */ char szFromAddr[MAX_SMTP_ADDRESS] = ""; USmlExtractFromAddress(hTagList, szFromAddr, sizeof(szFromAddr) - 1); /* Extract recipient list */ char **ppszRcptList = USmlBuildTargetRcptList(pszSyncAddr, hTagList, pszFetchHdrTags); if (ppszRcptList == NULL) { ErrorPush(); USmlFreeTagsList(hTagList); fclose(pMailFile); return ErrorPop(); } USmlFreeTagsList(hTagList); /* Loop through extracted recipients and deliver */ int iDeliverCount = 0; int iAddrCount = StrStringsCount(ppszRcptList); for (int i = 0; i < iAddrCount; i++) { /* Check address validity and skip invalid ( or not handled ) ones */ char szDestDomain[MAX_HOST_NAME] = ""; if (USmtpSplitEmailAddr(ppszRcptList[i], NULL, szDestDomain) < 0 || (MDomIsHandledDomain(szDestDomain) < 0 && USmlCustomizedDomain(szDestDomain) < 0)) continue; /* Get message handle */ QMSG_HANDLE hMessage = QueCreateMessage(hSpoolQueue); if (hMessage == INVALID_QMSG_HANDLE) { ErrorPush(); StrFreeStrings(ppszRcptList); fclose(pMailFile); return ErrorPop(); } char szQueueFilePath[SYS_MAX_PATH] = ""; QueGetFilePath(hSpoolQueue, hMessage, szQueueFilePath); if (USmlCreateSpoolFile(pMailFile, NULL, szFromAddr, ppszRcptList[i], szQueueFilePath) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); StrFreeStrings(ppszRcptList); fclose(pMailFile); return ErrorPop(); } /* Transfer file to the spool */ if (QueCommitMessage(hSpoolQueue, hMessage) < 0) { ErrorPush(); QueCleanupMessage(hSpoolQueue, hMessage); QueCloseMessage(hSpoolQueue, hMessage); StrFreeStrings(ppszRcptList); fclose(pMailFile); return ErrorPop(); } ++iDeliverCount; } StrFreeStrings(ppszRcptList); fclose(pMailFile); /* Check if the message has been delivered at least one time */ if (iDeliverCount == 0) { ErrSetErrorCode(ERR_FETCHMSG_UNDELIVERED); return ERR_FETCHMSG_UNDELIVERED; } return 0; } int USmlMailLoopCheck(SPLF_HANDLE hFSpool, SVRCFG_HANDLE hSvrConfig) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; /* Count MTA ops */ int iLoopsCount = 0; int iMaxMTAOps = SvrGetConfigInt("MaxMTAOps", MAX_MTA_OPS, hSvrConfig); MessageTagData *pMTD = (MessageTagData *) ListFirst(pSFD->hTagList); for (; pMTD != INVALID_SLIST_PTR; pMTD = (MessageTagData *) ListNext(pSFD->hTagList, (PLISTLINK) pMTD)) if (stricmp(pMTD->pszTagName, "Received") == 0 || stricmp(pMTD->pszTagName, "X-Deliver-To") == 0) ++iLoopsCount; /* Check MTA count */ if (iLoopsCount > iMaxMTAOps) { ErrSetErrorCode(ERR_MAIL_LOOP_DETECTED); return ERR_MAIL_LOOP_DETECTED; } return 0; } int USmlMessageAuth(SPLF_HANDLE hFSpool, char *pszAuthName, int iSize) { SpoolFileData *pSFD = (SpoolFileData *) hFSpool; /* Looks for the "X-AuthUser" tag, that has to happen *before* the first */ /* "Received" tag (to prevent forging) */ MessageTagData *pMTD = (MessageTagData *) ListFirst(pSFD->hTagList); for (; pMTD != INVALID_SLIST_PTR; pMTD = (MessageTagData *) ListNext(pSFD->hTagList, (PLISTLINK) pMTD)) { if (stricmp(pMTD->pszTagName, "Received") == 0) break; if (stricmp(pMTD->pszTagName, "X-AuthUser") == 0) { if (pszAuthName != NULL) { StrNCpy(pszAuthName, pMTD->pszTagData, iSize); StrTrim(pszAuthName, " \t\r\n"); } return 0; } } ErrSetErrorCode(ERR_NO_MESSAGE_AUTH); return ERR_NO_MESSAGE_AUTH; } xmail-1.27/FINGSvr.h0000644000175000017500000000240011341640430013406 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _FINGSVR_H #define _FINGSVR_H #define FING_SERVER_NAME "[" APP_NAME_VERSION_STR " FINGER Server]" #define STD_FINGER_PORT 79 #define FING_LISTEN_SIZE 64 #define FINGF_LOG_ENABLED (1 << 0) struct FINGConfig { unsigned long ulFlags; long lThreadCount; int iTimeout; }; unsigned int FINGClientThread(void *pThreadData); #endif xmail-1.27/SysMacros.h0000644000175000017500000001364711341640430014132 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SYSMACROS_H #define _SYSMACROS_H #define SRand() srand((unsigned int) (SysMsTime() * SysGetCurrentThreadId())) #define MaxSignedType(t) (((t) -1) & ~(((t) 1) << (CHAR_BIT * sizeof(t) - 1))) #define NbrCeil(n, a) ((((n) + (a) - 1) / (a)) * (a)) #define NbrFloor(n, a) (((n) / (a)) * (a)) #define Sign(v) (((v) < 0) ? -1: +1) #define Min(a, b) (((a) < (b)) ? (a): (b)) #define Max(a, b) (((a) > (b)) ? (a): (b)) #define Abs(v) (((v) > 0) ? (v): -(v)) #define INext(i, n) ((((i) + 1) < (n)) ? ((i) + 1): 0) #define IPrev(i, n) (((i) > 0) ? ((i) - 1): ((n) - 1)) #define LIndex2D(i, j, n) ((i) * (n) + (j)) #define ZeroData(d) memset(&(d), 0, sizeof(d)) #define CountOf(t) (sizeof(t) / sizeof((t)[0])) #define SetEmptyString(s) (s)[0] = '\0' #define IsEmptyString(s) (*(s) == '\0') #define CStringSize(s) (sizeof(s) - 1) #define StrCmdMatch(s, c) StrNCmdMatch(s, c, CStringSize(c)) #define StrSkipSpaces(p) for (; (*(p) == ' ') || (*(p) == '\t'); (p)++) #define CharISame(a, b) (tolower(a) == tolower(b)) #define StrINComp(s, t) strnicmp(s, t, strlen(t)) #define StrNComp(s, t) strncmp(s, t, strlen(t)) #define StrSINComp(s, t) strnicmp(s, t, CStringSize(t)) #define StrSNComp(s, t) strncmp(s, t, CStringSize(t)) #define StrNCpy(t, s, n) do { strncpy(t, s, n); (t)[(n) - 1] = '\0'; } while (0) #define StrSNCpy(t, s) StrNCpy(t, s, sizeof(t)) #define StrSNCat(t, s) StrNCat(t, s, sizeof(t)) #define Cpy2Sz(d, s, n) do { memcpy(d, s, (n) * sizeof(*(s))); (d)[n] = 0; } while (0) #define StrEnd(s) ((char *) (s) + strlen(s)) #define CheckRemoveFile(fp) ((SysExistFile(fp)) ? SysRemove(fp) : 0) #define SysFreeNullify(p) do { SysFree(p), (p) = NULL; } while(0) #define FCloseNullify(f) do { if ((f) != NULL) fclose(f); (f) = NULL; } while (0) #define ErrorSet(e) (ErrSetErrorCode(e), e) #define ErrorPush() int __iPushedError = ErrGetErrorCode() #define ErrorPop() ErrorSet(__iPushedError) #define ErrorFetch() __iPushedError #define DatumStrSet(d, s) do { (d)->pData = (char *) (s); (d)->lSize = strlen(s); } while (0) #define IsDotFilename(f) ((f)[0] == '.') #define IsEmailAddress(a) (strchr((a), '@') != NULL) #define MemMatch(s, n, m, l) ((n) == (l) && memcmp(s, m, n) == 0) #define EquivDatum(a, b) ((a)->lSize == (b)->lSize && memcmp((a)->pData, (b)->pData, (a)->lSize) == 0) #define ArrayInit(a, v) do { \ unsigned int __i; \ for (__i = 0; __i < CountOf(a); __i++) \ (a)[__i] = (v); \ } while (0) #define StrVSprint(r, l, f) do { \ int iPSize, iCurrSize = 256; \ va_list Args; \ for (;;) { \ if ((r = (char *) SysAlloc(iCurrSize)) == NULL) \ break; \ va_start(Args, l); \ if ((iPSize = SysVSNPrintf(r, iCurrSize - 1, f, Args)) >= 0 && \ iPSize < iCurrSize) { \ va_end(Args); \ break; \ } \ va_end(Args); \ if (iPSize > 0) \ iCurrSize = (4 * iPSize) / 3 + 2; \ else \ iCurrSize *= 2; \ SysFree(r); \ } \ } while (0) inline char *StrNCat(char *pszDest, char const *pszSrc, int iMaxSize) { int iDestLength = strlen(pszDest); if (iDestLength < iMaxSize) StrNCpy(pszDest + iDestLength, pszSrc, iMaxSize - iDestLength); return pszDest; } inline int StrNCmdMatch(char const *pszCmdLine, char const *pszCmd, int iCmdLength) { return strnicmp(pszCmdLine, pszCmd, iCmdLength) == 0 && (pszCmdLine[iCmdLength] == '\0' || strchr(" \r\n\t", pszCmdLine[iCmdLength]) != NULL); } inline char *AppendChar(char *pszString, int iChar) { int iStrLength = strlen(pszString); if (iStrLength == 0 || pszString[iStrLength - 1] != iChar) { pszString[iStrLength] = iChar; pszString[iStrLength + 1] = '\0'; } return pszString; } inline char *AppendSlash(char *pszPath) { return AppendChar(pszPath, SYS_SLASH_CHAR); } inline char *DelFinalChar(char *pszString, int iChar) { int iStrLength = strlen(pszString); if (iStrLength > 0 && pszString[iStrLength - 1] == iChar) pszString[iStrLength - 1] = '\0'; return pszString; } inline char *DelFinalSlash(char *pszPath) { return DelFinalChar(pszPath, SYS_SLASH_CHAR); } inline int ToUpper(int iChar) { return (iChar >= 'a' && iChar <= 'z') ? 'A' + (iChar - 'a'): iChar; } inline int ToLower(int iChar) { return (iChar >= 'A' && iChar <= 'Z') ? 'a' + (iChar - 'A'): iChar; } inline int IsPrimeNumber(long lNumber) { if (lNumber > 3) { if (lNumber & 1) { long i, lHalfNumber; for (i = 3, lHalfNumber = lNumber / 2; i < lHalfNumber; i += 2) if ((lNumber % i) == 0) return 0; } else return 0; } return 1; } inline char *ClearEOL(char *pszBuffer) { int iSize = strlen(pszBuffer); for (; iSize > 0 && (pszBuffer[iSize - 1] == '\r' || pszBuffer[iSize - 1] == '\n'); iSize--); pszBuffer[iSize] = '\0'; return pszBuffer; } #endif xmail-1.27/POP3GwLink.h0000644000175000017500000000455211341640430014037 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _POP3GWLINK_H #define _POP3GWLINK_H #define INVALID_GWLKF_HANDLE ((GWLKF_HANDLE) 0) struct POP3Link { char *pszDomain; char *pszName; char *pszRmtDomain; char *pszRmtName; char *pszRmtPassword; char *pszAuthType; }; typedef struct GWLKF_HANDLE_struct { } *GWLKF_HANDLE; POP3Link *GwLkAllocLink(char const *pszDomain, char const *pszName, char const *pszRmtDomain, char const *pszRmtName, char const *pszRmtPassword, char const *pszAuthType); void GwLkFreePOP3Link(POP3Link *pPopLnk); int GwLkAddLink(POP3Link *pPopLnk); int GwLkRemoveLink(POP3Link *pPopLnk); int GwLkRemoveUserLinks(const char *pszDomain, const char *pszName); int GwLkRemoveDomainLinks(const char *pszDomain); int GwLkGetDBFileSnapShot(const char *pszFileName); GWLKF_HANDLE GwLkOpenDB(void); void GwLkCloseDB(GWLKF_HANDLE hLinksDB); POP3Link *GwLkGetFirstUser(GWLKF_HANDLE hLinksDB); POP3Link *GwLkGetNextUser(GWLKF_HANDLE hLinksDB); int GwLkGetMsgSyncDbFile(char const *pszRmtDomain, char const *pszRmtName, char *pszMsgSyncFile, int iMaxPath); int GwLkLinkLock(POP3Link const *pPopLnk); void GwLkLinkUnlock(POP3Link const *pPopLnk); int GwLkClearLinkLocksDir(void); int GwLkLocalDomain(POP3Link const *pPopLnk); int GwLkMasqueradeDomain(POP3Link const *pPopLnk); int GwLkCheckEnabled(POP3Link const *pPopLnk); int GwLkEnable(POP3Link const *pPopLnk, bool bEnable); int GwLkEnable(char const *pszDomain, char const *pszName, char const *pszRmtDomain, char const *pszRmtName, bool bEnable); #endif xmail-1.27/AliasDomain.h0000644000175000017500000000322611341640430014360 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _ALIASDOMAIN_H #define _ALIASDOMAIN_H #define INVALID_ADOMAIN_HANDLE ((ADOMAIN_HANDLE) 0) enum ADomainFileds { adomADomain = 0, adomDomain, adomMax }; typedef struct ADOMAIN_HANDLE_struct { } *ADOMAIN_HANDLE; int ADomCheckDomainsIndexes(void); int ADomLookupDomain(const char *pszADomain, char *pszDomain, bool bWildMatch); int ADomAddADomain(char const *pszADomain, char const *pszDomain); int ADomRemoveADomain(char const *pszADomain); int ADomRemoveLinkedDomains(char const *pszDomain); int ADomGetADomainFileSnapShot(const char *pszFileName); ADOMAIN_HANDLE ADomOpenDB(void); void ADomCloseDB(ADOMAIN_HANDLE hDomainsDB); char const *const *ADomGetFirstDomain(ADOMAIN_HANDLE hDomainsDB); char const *const *ADomGetNextDomain(ADOMAIN_HANDLE hDomainsDB); #endif xmail-1.27/SSLConfig.h0000644000175000017500000000201211341640430013756 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SSLCONFIG_H #define _SSLCONFIG_H int CSslBindSetup(SslServerBind *pSSLB); void CSslBindCleanup(SslServerBind *pSSLB); #endif xmail-1.27/POP3Utils.cpp0000644000175000017500000012154411341640430014300 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "ResLocks.h" #include "StrUtils.h" #include "SList.h" #include "BuffSock.h" #include "Hash.h" #include "SSLBind.h" #include "SSLConfig.h" #include "MD5.h" #include "MailConfig.h" #include "UsrUtils.h" #include "SvrUtils.h" #include "MessQueue.h" #include "SMAILUtils.h" #include "QueueUtils.h" #include "MiscUtils.h" #include "Maildir.h" #include "POP3Svr.h" #include "POP3GwLink.h" #include "POP3Utils.h" #include "SMTPUtils.h" #include "MailSvr.h" #define UPOP_IPMAP_FILE "pop3.ipmap.tab" #define POP3_IP_LOGFILE ".ipconn" #define POPF_MSG_DELETED (1 << 0) #define POPF_MSG_SENT (1 << 1) #define POPF_MSG_TOP (1 << 2) #define POPCHF_USE_APOP (1 << 0) #define POPCHF_FORCE_APOP (1 << 1) #define POPCHF_USE_STLS (1 << 2) #define POPCHF_FORCE_STLS (1 << 3) #define POPCHF_USE_POP3S (1 << 4) #define POPCHF_LEAVE_MSGS (1 << 5) #define STD_POP3_TIMEOUT STD_SERVER_TIMEOUT struct POP3ChannelCfg { unsigned long ulFlags; char *pszIFace; }; struct POP3SyncMsg { SysListHead LLnk; HashNode HN; int iMsgSeq; char *pszMsgID; SYS_OFF_T llSize; }; struct POP3SyncChannel { char *pszRmtServer; char *pszRmtName; POP3ChannelCfg ChCfg; BSOCK_HANDLE hBSock; int iMsgCount; SYS_OFF_T llMailboxSize; int iMsgSync; SYS_OFF_T llSizeSync; POP3SyncMsg **ppSMsg; SysListHead SyncMList; SysListHead SeenMList; }; struct POP3MsgData { SysListHead LLnk; char szMsgName[SYS_MAX_PATH]; SYS_OFF_T llMsgSize; unsigned long ulFlags; }; struct POP3SessionData { SYS_INET_ADDR PeerInfo; UserInfo *pUI; SysListHead MessageList; POP3MsgData **ppMsgArray; int iMsgListed; int iMsgCount; SYS_OFF_T llMBSize; int iLastAccessed; int iTimeout; }; static int UPopBuildMessageList(UserInfo *pUI, SysListHead *pMsgList, int *piMsgCount = NULL, SYS_OFF_T *pllMBSize = NULL); static int UPopCheckResponse(char const *pszResponse, char *pszMessage = NULL); static int UPopCloseChannel(BSOCK_HANDLE hBSock, int iHardClose = 0); static int UPopMailFileNameFilter(char const *pszFileName) { return *pszFileName != '.' ? 1: 0; } int UPopGetMailboxSize(UserInfo *pUI, SYS_OFF_T &llMBSize, unsigned long &ulNumMessages) { char szMBPath[SYS_MAX_PATH]; UsrGetMailboxPath(pUI, szMBPath, sizeof(szMBPath), 0); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szMBPath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); llMBSize = 0; ulNumMessages = 0; if (MscGetDirectorySize(szMBPath, true, llMBSize, ulNumMessages, UPopMailFileNameFilter) < 0) { ErrorPush(); RLckUnlockSH(hResLock); return ErrorPop(); } RLckUnlockSH(hResLock); return 0; } int UPopCheckMailboxSize(UserInfo *pUI, SYS_OFF_T *pllAvailSpace) { SYS_OFF_T llMBSize = 0, llProbeSize = (pllAvailSpace != NULL) ? *pllAvailSpace: 0; unsigned long ulNumMessages = 0; char *pszMaxMBSize; if (UPopGetMailboxSize(pUI, llMBSize, ulNumMessages) < 0) return ErrGetErrorCode(); if ((pszMaxMBSize = UsrGetUserInfoVar(pUI, "MaxMBSize")) != NULL) { SYS_OFF_T llMaxMBSize = Sys_atoi64(pszMaxMBSize) * 1024; SysFree(pszMaxMBSize); if (llMaxMBSize != 0 && (llMBSize + llProbeSize >= llMaxMBSize)) { ErrSetErrorCode(ERR_MAILBOX_SIZE); return ERR_MAILBOX_SIZE; } if (pllAvailSpace != NULL) *pllAvailSpace = (llMaxMBSize != 0 ? llMaxMBSize - llMBSize: MaxSignedType(SYS_OFF_T)); } else if (pllAvailSpace != NULL) *pllAvailSpace = MaxSignedType(SYS_OFF_T); return 0; } static int UPopFillMessageList(char const *pszBasePath, char const *pszSubPath, SysListHead *pMsgList, int &iMsgCount, SYS_OFF_T &llMBSize) { SYS_HANDLE hFind; char szScanPath[SYS_MAX_PATH], szFileName[SYS_MAX_PATH]; if (pszSubPath == NULL) StrSNCpy(szScanPath, pszBasePath); else SysSNPrintf(szScanPath, sizeof(szScanPath) - 1, "%s" SYS_SLASH_STR "%s", pszBasePath, pszSubPath); if ((hFind = SysFirstFile(szScanPath, szFileName, sizeof(szFileName))) != SYS_INVALID_HANDLE) { do { POP3MsgData *pPOPMD; if (SysIsDirectory(hFind) || !UPopMailFileNameFilter(szFileName)) continue; if ((pPOPMD = (POP3MsgData *) SysAlloc(sizeof(POP3MsgData))) == NULL) { ErrorPush(); SysFindClose(hFind); return ErrorPop(); } if (pszSubPath == NULL) StrSNCpy(pPOPMD->szMsgName, szFileName); else SysSNPrintf(pPOPMD->szMsgName, sizeof(pPOPMD->szMsgName) - 1, "%s" SYS_SLASH_STR "%s", pszSubPath, szFileName); pPOPMD->llMsgSize = SysGetSize(hFind); pPOPMD->ulFlags = 0; /* Insert entry in message list */ SYS_LIST_ADDT(&pPOPMD->LLnk, pMsgList); /* Update mailbox information */ llMBSize += pPOPMD->llMsgSize; ++iMsgCount; } while (SysNextFile(hFind, szFileName, sizeof(szFileName))); SysFindClose(hFind); } return 0; } static void UPopFreeMsgData(POP3MsgData *pPOPMD) { SysFree(pPOPMD); } static void UPopFreeMessageList(SysListHead *pMsgList) { SysListHead *pPos; POP3MsgData *pPOPMD; while ((pPos = SYS_LIST_FIRST(pMsgList)) != NULL) { pPOPMD = SYS_LIST_ENTRY(pPos, POP3MsgData, LLnk); SYS_LIST_DEL(pPos); UPopFreeMsgData(pPOPMD); } } static int UPopBuildMessageList(UserInfo *pUI, SysListHead *pMsgList, int *piMsgCount, SYS_OFF_T *pllMBSize) { char szMBPath[SYS_MAX_PATH]; UsrGetMailboxPath(pUI, szMBPath, sizeof(szMBPath), 0); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szMBPath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); SYS_INIT_LIST_HEAD(pMsgList); int iMsgCount = 0; SYS_OFF_T llMBSize = 0; if (iMailboxType == XMAIL_MAILBOX) { if (UPopFillMessageList(szMBPath, NULL, pMsgList, iMsgCount, llMBSize) < 0) { ErrorPush(); UPopFreeMessageList(pMsgList); RLckUnlockEX(hResLock); return ErrorPop(); } } else { int iScanCur = UsrGetUserInfoVarInt(pUI, "Pop3ScanCur", 0); if (UPopFillMessageList(szMBPath, "new", pMsgList, iMsgCount, llMBSize) < 0 || (iScanCur > 0 && UPopFillMessageList(szMBPath, "cur", pMsgList, iMsgCount, llMBSize) < 0)) { ErrorPush(); UPopFreeMessageList(pMsgList); RLckUnlockEX(hResLock); return ErrorPop(); } } RLckUnlockEX(hResLock); if (piMsgCount != NULL) *piMsgCount = iMsgCount; if (pllMBSize != NULL) *pllMBSize = llMBSize; return 0; } static SYS_OFF_T UPopMessagesSize(SysListHead *pMsgList) { SYS_OFF_T llMBSize = 0; SysListHead *pPos; POP3MsgData *pPOPMD; SYS_LIST_FOR_EACH(pPos, pMsgList) { pPOPMD = SYS_LIST_ENTRY(pPos, POP3MsgData, LLnk); llMBSize += pPOPMD->llMsgSize; } return llMBSize; } static POP3MsgData *UPopMessageFromIndex(POP3SessionData *pPOPSD, int iMsgIndex) { return (iMsgIndex >= 0 && iMsgIndex < pPOPSD->iMsgListed) ? pPOPSD->ppMsgArray[iMsgIndex]: NULL; } int UPopAuthenticateAPOP(char const *pszDomain, char const *pszUsrName, char const *pszTimeStamp, char const *pszDigest) { UserInfo *pUI = UsrGetUserByName(pszDomain, pszUsrName); if (pUI == NULL) return ErrGetErrorCode(); int iAuthResult = MscMD5Authenticate(pUI->pszPassword, pszTimeStamp, pszDigest); UsrFreeUserInfo(pUI); return iAuthResult; } static int UPopCheckPeerIP(UserInfo *pUI, SYS_INET_ADDR const &PeerInfo) { char szIPMapFile[SYS_MAX_PATH]; UsrGetUserPath(pUI, szIPMapFile, sizeof(szIPMapFile), 1); StrNCat(szIPMapFile, UPOP_IPMAP_FILE, sizeof(szIPMapFile)); if (SysExistFile(szIPMapFile) && MscCheckAllowedIP(szIPMapFile, PeerInfo, true) < 0) return ErrGetErrorCode(); return 0; } POP3_HANDLE UPopBuildSession(char const *pszDomain, char const *pszUsrName, char const *pszUsrPass, SYS_INET_ADDR const *pPeerInfo) { UserInfo *pUI; POP3SessionData *pPOPSD; if ((pUI = UsrGetUserByName(pszDomain, pszUsrName)) == NULL) return INVALID_POP3_HANDLE; /* Check if the account is enabled for POP3 sessions */ if (!UsrGetUserInfoVarInt(pUI, "PopEnable", 1)) { UsrFreeUserInfo(pUI); ErrSetErrorCode(ERR_USER_DISABLED); return INVALID_POP3_HANDLE; } /* Check if peer is allowed to connect from its IP */ if (pPeerInfo != NULL && UPopCheckPeerIP(pUI, *pPeerInfo) < 0) { UsrFreeUserInfo(pUI); return INVALID_POP3_HANDLE; } if (pszUsrPass != NULL && strcmp(pszUsrPass, pUI->pszPassword) != 0) { UsrFreeUserInfo(pUI); ErrSetErrorCode(ERR_INVALID_PASSWORD); return INVALID_POP3_HANDLE; } if (UsrPOP3Lock(pUI) < 0) { UsrFreeUserInfo(pUI); return INVALID_POP3_HANDLE; } if ((pPOPSD = (POP3SessionData *) SysAlloc(sizeof(POP3SessionData))) == NULL) { UsrPOP3Unlock(pUI); UsrFreeUserInfo(pUI); return INVALID_POP3_HANDLE; } pPOPSD->PeerInfo = *pPeerInfo; pPOPSD->pUI = pUI; pPOPSD->iLastAccessed = 0; pPOPSD->iTimeout = STD_POP3_TIMEOUT; if (UPopBuildMessageList(pUI, &pPOPSD->MessageList, &pPOPSD->iMsgCount, &pPOPSD->llMBSize) < 0) { SysFree(pPOPSD); UsrPOP3Unlock(pUI); UsrFreeUserInfo(pUI); return INVALID_POP3_HANDLE; } pPOPSD->iMsgListed = pPOPSD->iMsgCount; /* Build lookup array */ if ((pPOPSD->ppMsgArray = (POP3MsgData **) SysAlloc((pPOPSD->iMsgCount + 1) * sizeof(POP3MsgData *))) == NULL) { UPopFreeMessageList(&pPOPSD->MessageList); SysFree(pPOPSD); UsrPOP3Unlock(pUI); UsrFreeUserInfo(pUI); return INVALID_POP3_HANDLE; } int i = 0; SysListHead *pPos; POP3MsgData *pPOPMD; SYS_LIST_FOR_EACH(pPos, &pPOPSD->MessageList) { pPOPMD = SYS_LIST_ENTRY(pPos, POP3MsgData, LLnk); pPOPSD->ppMsgArray[i++] = pPOPMD; } return (POP3_HANDLE) pPOPSD; } static int UPopUpdateMailbox(POP3SessionData *pPOPSD) { SysListHead *pPos; POP3MsgData *pPOPMD; char szMBPath[SYS_MAX_PATH]; UsrGetMailboxPath(pPOPSD->pUI, szMBPath, sizeof(szMBPath), 0); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szMBPath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); SYS_LIST_FOR_EACH(pPos, &pPOPSD->MessageList) { pPOPMD = SYS_LIST_ENTRY(pPos, POP3MsgData, LLnk); if (pPOPMD->ulFlags & POPF_MSG_DELETED) { char szMsgPath[SYS_MAX_PATH]; SysSNPrintf(szMsgPath, sizeof(szMsgPath) - 1, "%s" SYS_SLASH_STR "%s", szMBPath, pPOPMD->szMsgName); SysRemove(szMsgPath); } } RLckUnlockEX(hResLock); return 0; } void UPopReleaseSession(POP3_HANDLE hPOPSession, int iUpdate) { POP3SessionData *pPOPSD = (POP3SessionData *) hPOPSession; if (iUpdate) UPopUpdateMailbox(pPOPSD); UsrPOP3Unlock(pPOPSD->pUI); UsrFreeUserInfo(pPOPSD->pUI); UPopFreeMessageList(&pPOPSD->MessageList); SysFree(pPOPSD->ppMsgArray); SysFree(pPOPSD); } char *UPopGetUserInfoVar(POP3_HANDLE hPOPSession, char const *pszName, char const *pszDefault) { POP3SessionData *pPOPSD = (POP3SessionData *) hPOPSession; return UsrGetUserInfoVar(pPOPSD->pUI, pszName, pszDefault); } int UPopGetSessionMsgCurrent(POP3_HANDLE hPOPSession) { POP3SessionData *pPOPSD = (POP3SessionData *) hPOPSession; return pPOPSD->iMsgCount; } int UPopGetSessionMsgTotal(POP3_HANDLE hPOPSession) { POP3SessionData *pPOPSD = (POP3SessionData *) hPOPSession; return pPOPSD->iMsgListed; } SYS_OFF_T UPopGetSessionMBSize(POP3_HANDLE hPOPSession) { POP3SessionData *pPOPSD = (POP3SessionData *) hPOPSession; return pPOPSD->llMBSize; } int UPopGetSessionLastAccessed(POP3_HANDLE hPOPSession) { POP3SessionData *pPOPSD = (POP3SessionData *) hPOPSession; return pPOPSD->iLastAccessed; } int UPopGetMessageSize(POP3_HANDLE hPOPSession, int iMsgIndex, SYS_OFF_T &llMessageSize) { POP3SessionData *pPOPSD = (POP3SessionData *) hPOPSession; POP3MsgData *pPOPMD; llMessageSize = 0; if ((pPOPMD = UPopMessageFromIndex(pPOPSD, iMsgIndex - 1)) == NULL) { ErrSetErrorCode(ERR_MSG_NOT_IN_RANGE); return ERR_MSG_NOT_IN_RANGE; } if (pPOPMD->ulFlags & POPF_MSG_DELETED) { ErrSetErrorCode(ERR_MSG_DELETED); return ERR_MSG_DELETED; } llMessageSize = pPOPMD->llMsgSize; return 0; } int UPopGetMessageUIDL(POP3_HANDLE hPOPSession, int iMsgIndex, char *pszMessageUIDL, int iSize) { POP3SessionData *pPOPSD = (POP3SessionData *) hPOPSession; POP3MsgData *pPOPMD; char const *pszFileName; if ((pPOPMD = UPopMessageFromIndex(pPOPSD, iMsgIndex - 1)) == NULL) { ErrSetErrorCode(ERR_MSG_NOT_IN_RANGE); return ERR_MSG_NOT_IN_RANGE; } if (pPOPMD->ulFlags & POPF_MSG_DELETED) { ErrSetErrorCode(ERR_MSG_DELETED); return ERR_MSG_DELETED; } /* Extract message UIDL from mailbox file path */ if ((pszFileName = strrchr(pPOPMD->szMsgName, SYS_SLASH_CHAR)) != NULL) pszFileName++; else pszFileName = pPOPMD->szMsgName; StrNCpy(pszMessageUIDL, pszFileName, iSize); return 0; } int UPopDeleteMessage(POP3_HANDLE hPOPSession, int iMsgIndex) { POP3SessionData *pPOPSD = (POP3SessionData *) hPOPSession; POP3MsgData *pPOPMD; if ((pPOPMD = UPopMessageFromIndex(pPOPSD, iMsgIndex - 1)) == NULL) { ErrSetErrorCode(ERR_MSG_NOT_IN_RANGE); return ERR_MSG_NOT_IN_RANGE; } if (pPOPMD->ulFlags & POPF_MSG_DELETED) { ErrSetErrorCode(ERR_MSG_DELETED); return ERR_MSG_DELETED; } pPOPSD->llMBSize -= pPOPMD->llMsgSize; --pPOPSD->iMsgCount; pPOPMD->ulFlags |= POPF_MSG_DELETED; pPOPSD->iLastAccessed = iMsgIndex; return 0; } int UPopResetSession(POP3_HANDLE hPOPSession) { POP3SessionData *pPOPSD = (POP3SessionData *) hPOPSession; SysListHead *pPos; POP3MsgData *pPOPMD; SYS_LIST_FOR_EACH(pPos, &pPOPSD->MessageList) { pPOPMD = SYS_LIST_ENTRY(pPos, POP3MsgData, LLnk); if (pPOPMD->ulFlags & POPF_MSG_DELETED) { pPOPSD->llMBSize += pPOPMD->llMsgSize; ++pPOPSD->iMsgCount; pPOPMD->ulFlags &= ~(POPF_MSG_DELETED | POPF_MSG_SENT | POPF_MSG_TOP); } } pPOPSD->iLastAccessed = 0; return 0; } int UPopSendErrorResponse(BSOCK_HANDLE hBSock, int iErrorCode, int iTimeout) { char const *pszError = ErrGetErrorString(iErrorCode); char *pszPOP3Error = (char *) SysAlloc(strlen(pszError) + 8); if (pszPOP3Error == NULL) return ErrGetErrorCode(); sprintf(pszPOP3Error, "-ERR %s", pszError); if (BSckSendString(hBSock, pszPOP3Error, iTimeout) < 0) { SysFree(pszPOP3Error); return ErrGetErrorCode(); } SysFree(pszPOP3Error); return 0; } static int UPopSendMessageFile(BSOCK_HANDLE hBSock, char const *pszFilePath, int iTimeout) { /* * Send the message file to the remote POP3 client. If we are * running on an OS with CRLF line termination, we can send the * message as it is (since RFC wants it with CRLF). * In the other case, we need to send by transforming LF to CRLF. */ #ifdef SYS_CRLF_EOL return BSckSendFile(hBSock, pszFilePath, 0, -1, iTimeout); #else return MscSendFileCRLF(pszFilePath, hBSock, iTimeout); #endif } int UPopSessionSendMsg(POP3_HANDLE hPOPSession, int iMsgIndex, BSOCK_HANDLE hBSock) { POP3SessionData *pPOPSD = (POP3SessionData *) hPOPSession; POP3MsgData *pPOPMD; char szMsgFilePath[SYS_MAX_PATH], szResponse[256]; if ((pPOPMD = UPopMessageFromIndex(pPOPSD, iMsgIndex - 1)) == NULL) { UPopSendErrorResponse(hBSock, ERR_MSG_NOT_IN_RANGE, pPOPSD->iTimeout); ErrSetErrorCode(ERR_MSG_NOT_IN_RANGE); return ERR_MSG_NOT_IN_RANGE; } if (pPOPMD->ulFlags & POPF_MSG_DELETED) { UPopSendErrorResponse(hBSock, ERR_MSG_DELETED, pPOPSD->iTimeout); ErrSetErrorCode(ERR_MSG_DELETED); return ERR_MSG_DELETED; } UsrGetMailboxPath(pPOPSD->pUI, szMsgFilePath, sizeof(szMsgFilePath), 1); StrNCat(szMsgFilePath, pPOPMD->szMsgName, sizeof(szMsgFilePath)); SysSNPrintf(szResponse, sizeof(szResponse) - 1, "+OK " SYS_OFFT_FMT " bytes", pPOPMD->llMsgSize); if (BSckSendString(hBSock, szResponse, pPOPSD->iTimeout) < 0) return ErrGetErrorCode(); if (pPOPMD->llMsgSize > 0 && UPopSendMessageFile(hBSock, szMsgFilePath, pPOPSD->iTimeout) < 0) return ErrGetErrorCode(); if (BSckSendString(hBSock, ".", pPOPSD->iTimeout) < 0) return ErrGetErrorCode(); pPOPSD->iLastAccessed = iMsgIndex; pPOPMD->ulFlags |= POPF_MSG_SENT; return 0; } int UPopSessionTopMsg(POP3_HANDLE hPOPSession, int iMsgIndex, int iNumLines, BSOCK_HANDLE hBSock) { POP3SessionData *pPOPSD = (POP3SessionData *) hPOPSession; POP3MsgData *pPOPMD; FILE *pMsgFile; char szMsgFilePath[SYS_MAX_PATH], szResponse[256]; if ((pPOPMD = UPopMessageFromIndex(pPOPSD, iMsgIndex - 1)) == NULL) { UPopSendErrorResponse(hBSock, ERR_MSG_NOT_IN_RANGE, pPOPSD->iTimeout); ErrSetErrorCode(ERR_MSG_NOT_IN_RANGE); return ERR_MSG_NOT_IN_RANGE; } if (pPOPMD->ulFlags & POPF_MSG_DELETED) { UPopSendErrorResponse(hBSock, ERR_MSG_DELETED, pPOPSD->iTimeout); ErrSetErrorCode(ERR_MSG_DELETED); return ERR_MSG_DELETED; } UsrGetMailboxPath(pPOPSD->pUI, szMsgFilePath, sizeof(szMsgFilePath), 1); StrNCat(szMsgFilePath, pPOPMD->szMsgName, sizeof(szMsgFilePath)); if ((pMsgFile = fopen(szMsgFilePath, "rb")) == NULL) { UPopSendErrorResponse(hBSock, ERR_FILE_OPEN, pPOPSD->iTimeout); ErrSetErrorCode(ERR_FILE_OPEN); return ERR_FILE_OPEN; } SysSNPrintf(szResponse, sizeof(szResponse) - 1, "+OK message is " SYS_OFFT_FMT " bytes", pPOPMD->llMsgSize); if (BSckSendString(hBSock, szResponse, pPOPSD->iTimeout) < 0) { fclose(pMsgFile); return ErrGetErrorCode(); } bool bSendingMsg = false; char szMsgLine[2048]; while (MscGetString(pMsgFile, szMsgLine, sizeof(szMsgLine) - 1) != NULL) { if (bSendingMsg && --iNumLines < 0) break; if (BSckSendString(hBSock, szMsgLine, pPOPSD->iTimeout) < 0) { fclose(pMsgFile); return ErrGetErrorCode(); } if (!bSendingMsg && strlen(szMsgLine) == 0) bSendingMsg = true; if (SvrInShutdown()) { fclose(pMsgFile); ErrSetErrorCode(ERR_SERVER_SHUTDOWN); return ERR_SERVER_SHUTDOWN; } } fclose(pMsgFile); if (BSckSendString(hBSock, ".", pPOPSD->iTimeout) < 0) return ErrGetErrorCode(); pPOPSD->iLastAccessed = iMsgIndex; pPOPMD->ulFlags |= POPF_MSG_TOP; return 0; } static int UPopGetIpLogFilePath(UserInfo *pUI, char *pszFilePath, int iMaxPath) { UsrGetUserPath(pUI, pszFilePath, iMaxPath, 1); StrNCat(pszFilePath, POP3_IP_LOGFILE, iMaxPath); return 0; } int UPopSaveUserIP(POP3_HANDLE hPOPSession) { POP3SessionData *pPOPSD = (POP3SessionData *) hPOPSession; char szIpFilePath[SYS_MAX_PATH]; UPopGetIpLogFilePath(pPOPSD->pUI, szIpFilePath, sizeof(szIpFilePath)); char szIP[128] = "???.???.???.???"; SysInetNToA(pPOPSD->PeerInfo, szIP, sizeof(szIP)); FILE *pIpFile = fopen(szIpFilePath, "wt"); if (pIpFile == NULL) { ErrSetErrorCode(ERR_FILE_CREATE, szIpFilePath); return ERR_FILE_CREATE; } fprintf(pIpFile, "%s\n", szIP); fclose(pIpFile); return 0; } static int UPopCheckResponse(char const *pszResponse, char *pszMessage) { if (strnicmp(pszResponse, "+OK", 3) == 0) { if (pszMessage != NULL) strcpy(pszMessage, pszResponse + ((pszResponse[3] == ' ') ? 4: 3)); return 0; } else if (strnicmp(pszResponse, "-ERR", 4) == 0) { if (pszMessage != NULL) strcpy(pszMessage, pszResponse + ((pszResponse[4] == ' ') ? 5: 4)); ErrSetErrorCode(ERR_BAD_SERVER_RESPONSE, pszResponse); return ERR_BAD_SERVER_RESPONSE; } ErrSetErrorCode(ERR_INVALID_POP3_RESPONSE, pszResponse); return ERR_INVALID_POP3_RESPONSE; } static int UPopGetResponse(BSOCK_HANDLE hBSock, char *pszResponse, int iMaxChars, int iTimeout) { if (BSckGetString(hBSock, pszResponse, iMaxChars, iTimeout) == NULL) return ErrGetErrorCode(); return UPopCheckResponse(pszResponse); } static char *UPopExtractServerTimeStamp(char const *pszResponse, char *pszTimeStamp, int iMaxTimeStamp) { int iSize; char const *pszStartTS, *pszEndTS; if ((pszStartTS = strrchr(pszResponse, '<')) == NULL || (pszEndTS = strchr(pszStartTS + 1, '>')) == NULL) return NULL; iSize = (int) (pszEndTS - pszStartTS) + 1; iSize = Min(iSize, iMaxTimeStamp - 1); strncpy(pszTimeStamp, pszStartTS, iSize); pszTimeStamp[iSize] = '\0'; return pszTimeStamp; } static int UPopSendCommand(BSOCK_HANDLE hBSock, char const *pszCommand, char *pszResponse, int iMaxChars, int iTimeout) { if (BSckSendString(hBSock, pszCommand, iTimeout) <= 0) return ErrGetErrorCode(); if (UPopGetResponse(hBSock, pszResponse, iMaxChars, iTimeout) < 0) return ErrGetErrorCode(); return 0; } static int UPopDoClearTextAuth(BSOCK_HANDLE hBSock, char const *pszUsername, char const *pszPassword, char *pszRespBuffer, int iMaxRespChars) { SysSNPrintf(pszRespBuffer, iMaxRespChars - 1, "USER %s", pszUsername); if (UPopSendCommand(hBSock, pszRespBuffer, pszRespBuffer, iMaxRespChars, iPOP3ClientTimeout) < 0) return ErrGetErrorCode(); SysSNPrintf(pszRespBuffer, iMaxRespChars - 1, "PASS %s", pszPassword); if (UPopSendCommand(hBSock, pszRespBuffer, pszRespBuffer, iMaxRespChars, iPOP3ClientTimeout) < 0) return ErrGetErrorCode(); return 0; } static int UPopDoAPOPAuth(BSOCK_HANDLE hBSock, char const *pszUsername, char const *pszPassword, char const *pszTimeStamp, char *pszRespBuffer, int iMaxRespChars) { char *pszHash; char szMD5[128]; if ((pszHash = StrSprint("%s%s", pszTimeStamp, pszPassword)) == NULL) return ErrGetErrorCode(); do_md5_string(pszHash, strlen(pszHash), szMD5); SysFree(pszHash); SysSNPrintf(pszRespBuffer, iMaxRespChars - 1, "APOP %s %s", pszUsername, szMD5); if (UPopSendCommand(hBSock, pszRespBuffer, pszRespBuffer, iMaxRespChars, iPOP3ClientTimeout) < 0) return ErrGetErrorCode(); return 0; } static int UPopSwitchToTLS(BSOCK_HANDLE hBSock, char const *pszServer, POP3ChannelCfg const *pChCfg) { int iError; SslServerBind SSLB; SslBindEnv SslE; if (CSslBindSetup(&SSLB) < 0) return ErrGetErrorCode(); ZeroData(SslE); iError = BSslBindClient(hBSock, &SSLB, MscSslEnvCB, &SslE); CSslBindCleanup(&SSLB); /* * We may want to add verify code here ... */ SysFree(SslE.pszIssuer); SysFree(SslE.pszSubject); return iError; } static int UPopInitiateTLS(BSOCK_HANDLE hBSock, char const *pszServer, char *pszRespBuffer, int iMaxRespChars, POP3ChannelCfg const *pChCfg) { SysSNPrintf(pszRespBuffer, iMaxRespChars - 1, "STLS"); if (UPopSendCommand(hBSock, pszRespBuffer, pszRespBuffer, iMaxRespChars, iPOP3ClientTimeout) < 0) return (pChCfg->ulFlags & POPCHF_FORCE_STLS) ? ErrGetErrorCode(): 0; return UPopSwitchToTLS(hBSock, pszServer, pChCfg); } static BSOCK_HANDLE UPopCreateChannel(char const *pszServer, char const *pszUsername, char const *pszPassword, POP3ChannelCfg const *pChCfg) { SYS_SOCKET SockFD; BSOCK_HANDLE hBSock; SYS_INET_ADDR SvrAddr; if (MscGetServerAddress(pszServer, SvrAddr, STD_POP3_PORT) < 0) return INVALID_BSOCK_HANDLE; if ((SockFD = SysCreateSocket(SysGetAddrFamily(SvrAddr), SOCK_STREAM, 0)) == SYS_INVALID_SOCKET) return INVALID_BSOCK_HANDLE; /* * Are we requested to bind to a specific interface to talk to this server? */ if (pChCfg->pszIFace != NULL) { SYS_INET_ADDR BndAddr; if (MscGetServerAddress(pChCfg->pszIFace, BndAddr, 0) < 0 || SysBindSocket(SockFD, &BndAddr) < 0) { SysCloseSocket(SockFD); return INVALID_BSOCK_HANDLE; } } if (SysConnect(SockFD, &SvrAddr, iPOP3ClientTimeout) < 0) { SysCloseSocket(SockFD); return INVALID_BSOCK_HANDLE; } if ((hBSock = BSckAttach(SockFD)) == INVALID_BSOCK_HANDLE) { SysCloseSocket(SockFD); return INVALID_BSOCK_HANDLE; } /* * Is this a full POP3S connection? */ if ((pChCfg->ulFlags & POPCHF_USE_POP3S) && UPopSwitchToTLS(hBSock, pszServer, pChCfg) < 0) { SysCloseSocket(SockFD); return INVALID_BSOCK_HANDLE; } /* Read welcome message */ char szRTXBuffer[2048]; if (UPopGetResponse(hBSock, szRTXBuffer, sizeof(szRTXBuffer) - 1, iPOP3ClientTimeout) < 0) { UPopCloseChannel(hBSock); return INVALID_BSOCK_HANDLE; } /* * Non TLS mode active and STLS required? */ if (strcmp(BSckBioName(hBSock), BSSL_BIO_NAME) != 0 && (pChCfg->ulFlags & POPCHF_USE_STLS) && UPopInitiateTLS(hBSock, pszServer, szRTXBuffer, sizeof(szRTXBuffer) - 1, pChCfg) < 0) { UPopCloseChannel(hBSock); return INVALID_BSOCK_HANDLE; } /* Extract TimeStamp from server respose (if any) */ char szTimeStamp[256] = ""; if ((pChCfg->ulFlags & POPCHF_USE_APOP) == 0 || MscExtractServerTimeStamp(szRTXBuffer, szTimeStamp, sizeof(szTimeStamp) - 1) == NULL) { /* Try clear text authentication */ if (UPopDoClearTextAuth(hBSock, pszUsername, pszPassword, szRTXBuffer, sizeof(szRTXBuffer) - 1) < 0) { UPopCloseChannel(hBSock); return INVALID_BSOCK_HANDLE; } } else { /* Try APOP authentication first */ int iResult = UPopDoAPOPAuth(hBSock, pszUsername, pszPassword, szTimeStamp, szRTXBuffer, sizeof(szRTXBuffer) - 1); if (iResult < 0) { if (iResult != ERR_BAD_SERVER_RESPONSE || (pChCfg->ulFlags & POPCHF_FORCE_APOP)) { UPopCloseChannel(hBSock); return INVALID_BSOCK_HANDLE; } /* Try clear text authentication */ if (UPopDoClearTextAuth(hBSock, pszUsername, pszPassword, szRTXBuffer, sizeof(szRTXBuffer) - 1) < 0) { UPopCloseChannel(hBSock); return INVALID_BSOCK_HANDLE; } } } return hBSock; } static int UPopCloseChannel(BSOCK_HANDLE hBSock, int iHardClose) { if (!iHardClose) { char szRTXBuffer[2048]; if (UPopSendCommand(hBSock, "QUIT", szRTXBuffer, sizeof(szRTXBuffer) - 1, iPOP3ClientTimeout) < 0) { BSckDetach(hBSock, 1); return ErrGetErrorCode(); } } BSckDetach(hBSock, 1); return 0; } static int UPopGetMailboxStatus(BSOCK_HANDLE hBSock, int &iMsgCount, SYS_OFF_T &llMailboxSize) { char szRTXBuffer[2048]; if (UPopSendCommand(hBSock, "STAT", szRTXBuffer, sizeof(szRTXBuffer) - 1, iPOP3ClientTimeout) < 0) return ErrGetErrorCode(); if (sscanf(szRTXBuffer, "+OK %d " SYS_OFFT_FMT, &iMsgCount, &llMailboxSize) != 2) { ErrSetErrorCode(ERR_INVALID_POP3_RESPONSE, szRTXBuffer); return ERR_INVALID_POP3_RESPONSE; } return 0; } static int UPopRetrieveMessage(BSOCK_HANDLE hBSock, int iMsgIndex, char const *pszFileName, SYS_OFF_T *pllMsgSize) { FILE *pMsgFile; if ((pMsgFile = fopen(pszFileName, "wb")) == NULL) { ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } char szRTXBuffer[2048]; sprintf(szRTXBuffer, "RETR %d", iMsgIndex); if (UPopSendCommand(hBSock, szRTXBuffer, szRTXBuffer, sizeof(szRTXBuffer) - 1, iPOP3ClientTimeout) < 0) { fclose(pMsgFile); return ErrGetErrorCode(); } int iLineLength = 0, iGotNL, iGotNLPrev = 1; SYS_OFF_T llMsgSize = 0; for (;;) { if (BSckGetString(hBSock, szRTXBuffer, sizeof(szRTXBuffer) - 3, iPOP3ClientTimeout, &iLineLength, &iGotNL) == NULL) { fclose(pMsgFile); ErrSetErrorCode(ERR_POP3_RETR_BROKEN); return ERR_POP3_RETR_BROKEN; } if (iGotNL && iGotNLPrev && strcmp(szRTXBuffer, ".") == 0) break; if (iGotNL) memcpy(szRTXBuffer + iLineLength, "\r\n", 3), iLineLength += 2; if (!fwrite(szRTXBuffer, iLineLength, 1, pMsgFile)) { fclose(pMsgFile); ErrSetErrorCode(ERR_FILE_WRITE, pszFileName); return ERR_FILE_WRITE; } llMsgSize += iLineLength; iGotNLPrev = iGotNL; } fclose(pMsgFile); if (pllMsgSize != NULL) *pllMsgSize = llMsgSize; return 0; } static int UPopDeleteMessage(BSOCK_HANDLE hBSock, int iMsgIndex) { char szRTXBuffer[2048]; sprintf(szRTXBuffer, "DELE %d", iMsgIndex); if (UPopSendCommand(hBSock, szRTXBuffer, szRTXBuffer, sizeof(szRTXBuffer) - 1, iPOP3ClientTimeout) < 0) return ErrGetErrorCode(); return 0; } static int UPopChanConfigAssign(void *pPrivate, char const *pszName, char const *pszValue) { POP3ChannelCfg *pChCfg = (POP3ChannelCfg *) pPrivate; if (strcmp(pszName, "APOP") == 0) pChCfg->ulFlags |= POPCHF_USE_APOP; else if (strcmp(pszName, "FAPOP") == 0) pChCfg->ulFlags |= POPCHF_USE_APOP | POPCHF_FORCE_APOP; else if (strcmp(pszName, "STLS") == 0) pChCfg->ulFlags |= POPCHF_USE_STLS; else if (strcmp(pszName, "FSTLS") == 0) pChCfg->ulFlags |= POPCHF_USE_STLS | POPCHF_FORCE_STLS; else if (strcmp(pszName, "POP3S") == 0) pChCfg->ulFlags |= POPCHF_USE_POP3S; else if (strcmp(pszName, "Leave") == 0) { if (pszValue == NULL || atoi(pszValue) > 0) pChCfg->ulFlags |= POPCHF_LEAVE_MSGS; } else if (strcmp(pszName, "OutBind") == 0) { if (pszValue != NULL) { SysFree(pChCfg->pszIFace); pChCfg->pszIFace = SysStrDup(pszValue); } } return 0; } static int UPopSetChanConfig(char const *pszAuthType, POP3ChannelCfg *pChCfg) { return MscParseOptions(pszAuthType, UPopChanConfigAssign, pChCfg); } static void UPopFreeChanConfig(POP3ChannelCfg *pChCfg) { SysFree(pChCfg->pszIFace); } static POP3SyncMsg *UPopSChanMsgAlloc(int iMsgSeq, char const *pszMsgID) { POP3SyncMsg *pSMsg; if ((pSMsg = (POP3SyncMsg *) SysAlloc(sizeof(POP3SyncMsg))) == NULL) return NULL; SYS_INIT_LIST_HEAD(&pSMsg->LLnk); HashInitNode(&pSMsg->HN); pSMsg->iMsgSeq = iMsgSeq; pSMsg->pszMsgID = (pszMsgID != NULL) ? SysStrDup(pszMsgID): NULL; return pSMsg; } static void UPopSChanMsgFree(POP3SyncMsg *pSMsg) { SysFree(pSMsg->pszMsgID); SysFree(pSMsg); } /* * This function should be called only if the remote server supported UIDL * (AKA the "pszMsgID" member of the message MUST de different from NULL). */ static int UPopSChanFilterSeen(POP3SyncChannel *pPSChan) { HASH_HANDLE hHash; SysListHead *pPos; POP3SyncMsg *pSMsg; HashNode *pHNode; HashOps HOps; ZeroData(HOps); HOps.pGetHashVal = MscStringHashCB; HOps.pCompare = MscStringCompareCB; if ((hHash = HashCreate(&HOps, pPSChan->iMsgCount + 1)) == INVALID_HASH_HANDLE) return ErrGetErrorCode(); for (pPos = SYS_LIST_FIRST(&pPSChan->SyncMList); pPos != NULL; pPos = SYS_LIST_NEXT(pPos, &pPSChan->SyncMList)) { pSMsg = SYS_LIST_ENTRY(pPos, POP3SyncMsg, LLnk); pSMsg->HN.Key.pData = pSMsg->pszMsgID; if (HashAdd(hHash, &pSMsg->HN) < 0) { HashFree(hHash, NULL, NULL); return ErrGetErrorCode(); } } /* * Get the path of the UIDL seen-DB file ... */ char szMsgSyncFile[SYS_MAX_PATH]; if (GwLkGetMsgSyncDbFile(pPSChan->pszRmtServer, pPSChan->pszRmtName, szMsgSyncFile, sizeof(szMsgSyncFile) - 1) < 0) { HashFree(hHash, NULL, NULL); return ErrGetErrorCode(); } char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szMsgSyncFile, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) { HashFree(hHash, NULL, NULL); return ErrGetErrorCode(); } FILE *pUFile; if ((pUFile = fopen(szMsgSyncFile, "rt")) != NULL) { HashDatum Key; HashEnum HEnum; char szUIDL[512]; while (MscFGets(szUIDL, sizeof(szUIDL) - 1, pUFile) != NULL) { Key.pData = szUIDL; if (HashGetFirst(hHash, &Key, &HEnum, &pHNode) == 0) { pSMsg = SYS_LIST_ENTRY(pHNode, POP3SyncMsg, HN); SYS_LIST_DEL(&pSMsg->LLnk); SYS_LIST_ADDT(&pSMsg->LLnk, &pPSChan->SeenMList); pPSChan->iMsgSync--; pPSChan->llSizeSync -= pSMsg->llSize; } } fclose(pUFile); } RLckUnlockSH(hResLock); HashFree(hHash, NULL, NULL); return 0; } static int UPopSChanWriteSeenDB(POP3SyncChannel *pPSChan) { /* * Get the path of the UIDL seen-DB file ... */ char szMsgSyncFile[SYS_MAX_PATH]; if (GwLkGetMsgSyncDbFile(pPSChan->pszRmtServer, pPSChan->pszRmtName, szMsgSyncFile, sizeof(szMsgSyncFile) - 1) < 0) return ErrGetErrorCode(); char szResLock[SYS_MAX_PATH]; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szMsgSyncFile, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pUFile; if ((pUFile = fopen(szMsgSyncFile, "wt")) == NULL) { RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_FILE_CREATE, szMsgSyncFile); return ERR_FILE_CREATE; } SysListHead *pPos; POP3SyncMsg *pSMsg; for (pPos = SYS_LIST_FIRST(&pPSChan->SeenMList); pPos != NULL; pPos = SYS_LIST_NEXT(pPos, &pPSChan->SeenMList)) { pSMsg = SYS_LIST_ENTRY(pPos, POP3SyncMsg, LLnk); fprintf(pUFile, "%s\n", pSMsg->pszMsgID); } fclose(pUFile); RLckUnlockEX(hResLock); return 0; } static int UPopSChanFillStatus(POP3SyncChannel *pPSChan) { int iLineLength, iMsgID, iHasUIDLs = 0; char *pszMsgID, *pszMsgUIDL, *pszMsgSize; POP3SyncMsg *pSMsg; char szRTXBuffer[2048] = "UIDL"; if (UPopGetMailboxStatus(pPSChan->hBSock, pPSChan->iMsgCount, pPSChan->llMailboxSize) < 0) return ErrGetErrorCode(); if ((pPSChan->ppSMsg = (POP3SyncMsg **) SysAlloc((pPSChan->iMsgCount + 1) * sizeof(POP3SyncMsg *))) == NULL) return ErrGetErrorCode(); /* * Try to send UIDL, so that we can implement the leave-message-on-server * feature, if requested ... */ if (UPopSendCommand(pPSChan->hBSock, szRTXBuffer, szRTXBuffer, sizeof(szRTXBuffer) - 1, iPOP3ClientTimeout) == 0) { for (;;) { if (BSckGetString(pPSChan->hBSock, szRTXBuffer, sizeof(szRTXBuffer) - 1, iPOP3ClientTimeout, &iLineLength) == NULL) return ErrGetErrorCode(); /* Check end of data condition */ if (strcmp(szRTXBuffer, ".") == 0) break; pszMsgID = szRTXBuffer; if (!isdigit(*pszMsgID) || (pszMsgUIDL = strchr(pszMsgID, ' ')) == NULL) { ErrSetErrorCode(ERR_INVALID_POP3_RESPONSE, szRTXBuffer); return ERR_INVALID_POP3_RESPONSE; } *pszMsgUIDL++ = '\0'; if ((pSMsg = UPopSChanMsgAlloc(iMsgID = atoi(pszMsgID), pszMsgUIDL)) == NULL) return ErrGetErrorCode(); if (iMsgID >= 1 && iMsgID <= pPSChan->iMsgCount) pPSChan->ppSMsg[iMsgID - 1] = pSMsg; SYS_LIST_ADDT(&pSMsg->LLnk, &pPSChan->SyncMList); pPSChan->iMsgSync++; } iHasUIDLs++; } else { /* * If UIDL is failing, we fill up the list by sequentials only. */ for (int i = 0; i < pPSChan->iMsgCount; i++) { if ((pSMsg = UPopSChanMsgAlloc(i + 1, NULL)) == NULL) return ErrGetErrorCode(); pPSChan->ppSMsg[i] = pSMsg; SYS_LIST_ADDT(&pSMsg->LLnk, &pPSChan->SyncMList); pPSChan->iMsgSync++; } } /* * Retrieve message list information ... */ strcpy(szRTXBuffer, "LIST"); if (UPopSendCommand(pPSChan->hBSock, szRTXBuffer, szRTXBuffer, sizeof(szRTXBuffer) - 1, iPOP3ClientTimeout) < 0) return ErrGetErrorCode(); for (;;) { if (BSckGetString(pPSChan->hBSock, szRTXBuffer, sizeof(szRTXBuffer) - 1, iPOP3ClientTimeout, &iLineLength) == NULL) return ErrGetErrorCode(); /* Check end of data condition */ if (strcmp(szRTXBuffer, ".") == 0) break; pszMsgID = szRTXBuffer; if (!isdigit(*pszMsgID) || (pszMsgSize = strchr(pszMsgID, ' ')) == NULL) { ErrSetErrorCode(ERR_INVALID_POP3_RESPONSE, szRTXBuffer); return ERR_INVALID_POP3_RESPONSE; } *pszMsgSize++ = '\0'; if ((iMsgID = atoi(pszMsgID)) >= 1 && iMsgID <= pPSChan->iMsgCount && (pSMsg = pPSChan->ppSMsg[iMsgID - 1]) != NULL) { pSMsg->llSize = Sys_atoi64(pszMsgSize); pPSChan->llSizeSync += pSMsg->llSize; } } /* * If we need to fetch only the unseen ones, we need to rely to the * UIDL database and create the download list accordingly. We do this * only if the remote server supports UIDL of course. */ if (pPSChan->ChCfg.ulFlags & POPCHF_LEAVE_MSGS) { if (!iHasUIDLs) { ErrSetErrorCode(ERR_NOREMOTE_POP3_UIDL, pPSChan->pszRmtServer); return ERR_NOREMOTE_POP3_UIDL; } if (UPopSChanFilterSeen(pPSChan) < 0) return ErrGetErrorCode(); } return 0; } static void UPopSChanFree(POP3SyncChannel *pPSChan) { SysListHead *pPos; POP3SyncMsg *pSMsg; if (pPSChan->ChCfg.ulFlags & POPCHF_LEAVE_MSGS) UPopSChanWriteSeenDB(pPSChan); while ((pPos = SYS_LIST_FIRST(&pPSChan->SyncMList)) != NULL) { pSMsg = SYS_LIST_ENTRY(pPos, POP3SyncMsg, LLnk); SYS_LIST_DEL(&pSMsg->LLnk); UPopSChanMsgFree(pSMsg); } while ((pPos = SYS_LIST_FIRST(&pPSChan->SeenMList)) != NULL) { pSMsg = SYS_LIST_ENTRY(pPos, POP3SyncMsg, LLnk); SYS_LIST_DEL(&pSMsg->LLnk); UPopSChanMsgFree(pSMsg); } SysFree(pPSChan->ppSMsg); UPopCloseChannel(pPSChan->hBSock); UPopFreeChanConfig(&pPSChan->ChCfg); SysFree(pPSChan->pszRmtServer); SysFree(pPSChan->pszRmtName); SysFree(pPSChan); } static POP3SyncChannel *UPopSChanCreate(char const *pszRmtServer, char const *pszRmtName, char const *pszRmtPassword, char const *pszSyncCfg) { POP3SyncChannel *pPSChan; if ((pPSChan = (POP3SyncChannel *) SysAlloc(sizeof(POP3SyncChannel))) == NULL) return NULL; SYS_INIT_LIST_HEAD(&pPSChan->SyncMList); SYS_INIT_LIST_HEAD(&pPSChan->SeenMList); if (UPopSetChanConfig(pszSyncCfg, &pPSChan->ChCfg) < 0) { SysFree(pPSChan); return NULL; } /* Connection to POP3 server */ if ((pPSChan->hBSock = UPopCreateChannel(pszRmtServer, pszRmtName, pszRmtPassword, &pPSChan->ChCfg)) == INVALID_BSOCK_HANDLE) { UPopFreeChanConfig(&pPSChan->ChCfg); SysFree(pPSChan); return NULL; } pPSChan->pszRmtServer = SysStrDup(pszRmtServer); pPSChan->pszRmtName = SysStrDup(pszRmtName); if (UPopSChanFillStatus(pPSChan) < 0) { UPopSChanFree(pPSChan); return NULL; } return pPSChan; } int UPopSyncRemoteLink(char const *pszSyncAddr, char const *pszRmtServer, char const *pszRmtName, char const *pszRmtPassword, MailSyncReport *pSRep, char const *pszSyncCfg, char const *pszFetchHdrTags, char const *pszErrorAccount) { POP3SyncChannel *pPSChan; if ((pPSChan = UPopSChanCreate(pszRmtServer, pszRmtName, pszRmtPassword, pszSyncCfg)) == NULL) return ErrGetErrorCode(); /* Initialize the report structure with current mailbox informations */ pSRep->iMsgSync = 0; pSRep->iMsgErr = pPSChan->iMsgSync; pSRep->llSizeSync = 0; pSRep->llSizeErr = pPSChan->llSizeSync; SysListHead *pPos; POP3SyncMsg *pSMsg; char szMsgFileName[SYS_MAX_PATH]; MscSafeGetTmpFile(szMsgFileName, sizeof(szMsgFileName)); for (pPos = SYS_LIST_FIRST(&pPSChan->SyncMList); pPos != NULL;) { pSMsg = SYS_LIST_ENTRY(pPos, POP3SyncMsg, LLnk); pPos = SYS_LIST_NEXT(pPos, &pPSChan->SyncMList); /* Get the message */ if (UPopRetrieveMessage(pPSChan->hBSock, pSMsg->iMsgSeq, szMsgFileName, NULL) < 0) { ErrorPush(); CheckRemoveFile(szMsgFileName); UPopSChanFree(pPSChan); return ErrorPop(); } /* Spool deliver fetched message */ if (USmlDeliverFetchedMsg(pszSyncAddr, pszFetchHdrTags, szMsgFileName) < 0) { /* If there's an error ( catch errors ) account try to deliver to this one */ if (pszErrorAccount != NULL && USmlDeliverFetchedMsg(pszErrorAccount, NULL, szMsgFileName) == 0) { /* Delete remote message only if successfully delivered */ if ((pPSChan->ChCfg.ulFlags & POPCHF_LEAVE_MSGS) == 0) UPopDeleteMessage(pPSChan->hBSock, pSMsg->iMsgSeq); /* Add in Seen */ SYS_LIST_DEL(&pSMsg->LLnk); SYS_LIST_ADDT(&pSMsg->LLnk, &pPSChan->SeenMList); } } else { /* Delete remote message only if successfully delivered */ if ((pPSChan->ChCfg.ulFlags & POPCHF_LEAVE_MSGS) == 0) UPopDeleteMessage(pPSChan->hBSock, pSMsg->iMsgSeq); /* Add in Seen */ SYS_LIST_DEL(&pSMsg->LLnk); SYS_LIST_ADDT(&pSMsg->LLnk, &pPSChan->SeenMList); pSRep->iMsgSync++; pSRep->llSizeSync += pSMsg->llSize; } SysRemove(szMsgFileName); if (SvrInShutdown()) { UPopSChanFree(pPSChan); ErrSetErrorCode(ERR_SERVER_SHUTDOWN); return ERR_SERVER_SHUTDOWN; } } /* Disconnect from POP3 server */ UPopSChanFree(pPSChan); pSRep->iMsgErr -= Min(pSRep->iMsgErr, pSRep->iMsgSync); pSRep->llSizeErr -= Min(pSRep->llSizeErr, pSRep->llSizeSync); return 0; } int UPopUserIpCheck(UserInfo *pUI, SYS_INET_ADDR const *pPeerInfo, unsigned int uExpireTime) { char szIpFilePath[SYS_MAX_PATH]; UPopGetIpLogFilePath(pUI, szIpFilePath, sizeof(szIpFilePath)); /* Load IP log file info and do expire check */ SYS_FILE_INFO FI; if (SysGetFileInfo(szIpFilePath, FI) < 0 || (time_t) (FI.tMod + uExpireTime) < time(NULL)) { ErrSetErrorCode(ERR_NO_POP3_IP); return ERR_NO_POP3_IP; } /* Load IP from file */ FILE *pIpFile = fopen(szIpFilePath, "rt"); if (pIpFile == NULL) { ErrSetErrorCode(ERR_NO_POP3_IP); return ERR_NO_POP3_IP; } char szIP[128] = ""; MscFGets(szIP, sizeof(szIP) - 1, pIpFile); fclose(pIpFile); /* Do IP matching */ SYS_INET_ADDR CurrAddr; if (SysGetHostByName(szIP, SysGetAddrFamily(*pPeerInfo), CurrAddr) < 0 || !SysInetAddrMatch(*pPeerInfo, CurrAddr)) { ErrSetErrorCode(ERR_NO_POP3_IP); return ERR_NO_POP3_IP; } return 0; } int UPopGetLastLoginInfo(UserInfo *pUI, PopLastLoginInfo *pInfo) { SYS_FILE_INFO FI; char szIpFilePath[SYS_MAX_PATH]; UPopGetIpLogFilePath(pUI, szIpFilePath, sizeof(szIpFilePath)); if (SysGetFileInfo(szIpFilePath, FI) < 0) return ErrGetErrorCode(); pInfo->LTime = FI.tMod; /* Load IP from file */ FILE *pIpFile = fopen(szIpFilePath, "rt"); if (pIpFile == NULL) { ErrSetErrorCode(ERR_NO_POP3_IP); return ERR_NO_POP3_IP; } char szIP[128] = ""; MscFGets(szIP, sizeof(szIP) - 1, pIpFile); fclose(pIpFile); return SysGetHostByName(szIP, -1, pInfo->Address); } xmail-1.27/MkUsers.cpp0000644000175000017500000002337611341640430014133 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #if defined(WIN32) #include #include #include #include #include #define SYS_SLASH_CHAR '\\' #define SYS_SLASH_STR "\\" #define SYS_MAX_PATH 256 int SysPathExist(char const *pszPathName) { return (_access(pszPathName, 0) == 0) ? 1 : 0; } int SysMakeDir(char const *pszPathName) { return (_mkdir(pszPathName) == 0) ? 1 : 0; } int SysErrNo(void) { return errno; } char const *SysErrStr(void) { return strerror(errno); } #else // #if defined(WIN32) #if defined(__LINUX__) || defined(__SOLARIS__) || defined(__BSD__) #include #include #include #include #include #include #include #include #include #include #define SYS_SLASH_CHAR '/' #define SYS_SLASH_STR "/" #define SYS_MAX_PATH 256 int SysPathExist(char const *pszPathName) { return (access(pszPathName, 0) == 0) ? 1 : 0; } int SysMakeDir(char const *pszPathName) { return (mkdir(pszPathName, 0700) == 0) ? 1 : 0; } int SysErrNo(void) { return errno; } char const *SysErrStr(void) { return strerror(errno); } #else // #if defined(__LINUX__) || defined(__SOLARIS__) #error system type not defined ! #endif // #if defined(__LINUX__) || defined(__SOLARIS__) #endif // #if defined(WIN32) #define MAX_MB_SIZE 10000 #define StrNCpy(t, s, n) do { strncpy(t, s, n); (t)[(n) - 1] = '\0'; } while (0) #define StrSNCpy(t, s) StrNCpy(t, s, sizeof(t)) char *StrCrypt(char const *pszInput, char *pszCrypt) { strcpy(pszCrypt, ""); for (int ii = 0; pszInput[ii] != '\0'; ii++) { unsigned int uChar = (unsigned int) pszInput[ii]; char szByte[32] = ""; sprintf(szByte, "%02x", (uChar ^ 101) & 0xff); strcat(pszCrypt, szByte); } return pszCrypt; } int CreateUser(char const *pszRootDir, char const *pszDomain, char const *pszUsername, char const *pszPassword, unsigned int uUserId, char const *pszRealName, char const *pszHomePage, unsigned int uMBSize, bool bMaildir, FILE * pUsrFile) { FILE *pTabFile; char szPathName[SYS_MAX_PATH] = ""; char szCryptPwd[256] = ""; /* Check-create domain directory */ sprintf(szPathName, "%sdomains" SYS_SLASH_STR "%s", pszRootDir, pszDomain); if (!SysPathExist(szPathName) && !SysMakeDir(szPathName)) { perror(szPathName); return SysErrNo(); } /* Check-create domain/user directory */ sprintf(szPathName, "%sdomains" SYS_SLASH_STR "%s" SYS_SLASH_STR "%s", pszRootDir, pszDomain, pszUsername); if (!SysPathExist(szPathName) && !SysMakeDir(szPathName)) { perror(szPathName); return SysErrNo(); } if (bMaildir) { /* Check-create domain/user/Maildir/(tmp,new,cur) directories */ sprintf(szPathName, "%sdomains" SYS_SLASH_STR "%s" SYS_SLASH_STR "%s" SYS_SLASH_STR "Maildir", pszRootDir, pszDomain, pszUsername); if (!SysPathExist(szPathName) && !SysMakeDir(szPathName)) { perror(szPathName); return SysErrNo(); } sprintf(szPathName, "%sdomains" SYS_SLASH_STR "%s" SYS_SLASH_STR "%s" SYS_SLASH_STR "Maildir" SYS_SLASH_STR "tmp", pszRootDir, pszDomain, pszUsername); if (!SysPathExist(szPathName) && !SysMakeDir(szPathName)) { perror(szPathName); return SysErrNo(); } sprintf(szPathName, "%sdomains" SYS_SLASH_STR "%s" SYS_SLASH_STR "%s" SYS_SLASH_STR "Maildir" SYS_SLASH_STR "new", pszRootDir, pszDomain, pszUsername); if (!SysPathExist(szPathName) && !SysMakeDir(szPathName)) { perror(szPathName); return SysErrNo(); } sprintf(szPathName, "%sdomains" SYS_SLASH_STR "%s" SYS_SLASH_STR "%s" SYS_SLASH_STR "Maildir" SYS_SLASH_STR "cur", pszRootDir, pszDomain, pszUsername); if (!SysPathExist(szPathName) && !SysMakeDir(szPathName)) { perror(szPathName); return SysErrNo(); } } else { /* Check-create domain/user/mailbox directory */ sprintf(szPathName, "%sdomains" SYS_SLASH_STR "%s" SYS_SLASH_STR "%s" SYS_SLASH_STR "mailbox", pszRootDir, pszDomain, pszUsername); if (!SysPathExist(szPathName) && !SysMakeDir(szPathName)) { perror(szPathName); return SysErrNo(); } } /* Check-create domain/user/mailbox/user.tab file */ sprintf(szPathName, "%sdomains" SYS_SLASH_STR "%s" SYS_SLASH_STR "%s" SYS_SLASH_STR "user.tab", pszRootDir, pszDomain, pszUsername); if (!SysPathExist(szPathName)) { if ((pTabFile = fopen(szPathName, "wt")) == NULL) { perror(szPathName); return SysErrNo(); } fprintf(pTabFile, "\"RealName\"\t\"%s\"\n" "\"HomePage\"\t\"%s\"\n" "\"MaxMBSize\"\t\"%u\"\n", pszRealName, pszHomePage, uMBSize); fclose(pTabFile); } /* Add user to users file */ fprintf(pUsrFile, "\"%s\"\t" "\"%s\"\t" "\"%s\"\t" "\"%u\"\t" "\"%s\"\t" "\"U\"\n", pszDomain, pszUsername, StrCrypt(pszPassword, szCryptPwd), uUserId, pszUsername); return 0; } void ShowUsage(char const *pszProgName) { fprintf(stderr, "use : %s [-adfursih]\n" " -a numusers = number of users to create in auto-mode\n" " -d domain = domain name in auto-mode\n" " -f inputFile = input file name {stdin}\n" " -u username = radix user name in auto-mode\n" " -r rootdir = mail root path {.%s}\n" " -s mboxsize = mailbox maximum size {%d}\n" " -i useridbase = base user id {1}\n" " -m = create Maildir boxes\n" " -h = show this message\n", pszProgName, SYS_SLASH_STR, MAX_MB_SIZE); } int main(int argc, char *argv[]) { int ii; int iNumUsers = 0; bool bMaildir = false; unsigned int uMBSize = MAX_MB_SIZE; unsigned int uUserId = 1; FILE *pUsrFile; FILE *pInFile = stdin; char szRootDir[SYS_MAX_PATH] = "." SYS_SLASH_STR; char szInputFile[SYS_MAX_PATH] = ""; char szPathName[SYS_MAX_PATH] = ""; char szAutoDomain[256] = "mkuser.net"; char szAutoUsr[128] = "mkuser"; char szUsrLine[1024] = ""; for (ii = 1; ii < argc; ii++) { if (argv[ii][0] != '-') continue; switch (argv[ii][1]) { case ('a'): if (++ii < argc) iNumUsers = atoi(argv[ii]); break; case ('d'): if (++ii < argc) StrSNCpy(szAutoDomain, argv[ii]); break; case ('f'): if (++ii < argc) StrSNCpy(szInputFile, argv[ii]); break; case ('u'): if (++ii < argc) StrSNCpy(szAutoUsr, argv[ii]); break; case ('r'): if (++ii < argc) StrSNCpy(szRootDir, argv[ii]); break; case ('s'): if (++ii < argc) uMBSize = (unsigned int) atol(argv[ii]); break; case ('i'): if (++ii < argc) uUserId = (unsigned int) atol(argv[ii]); break; case ('m'): bMaildir = true; break; case ('h'): ShowUsage(argv[0]); return 0; default: ShowUsage(argv[0]); return 1; } } /* Root directory slash termination */ if (szRootDir[strlen(szRootDir) - 1] != SYS_SLASH_CHAR) strcat(szRootDir, SYS_SLASH_STR); /* Check-create domains directory */ sprintf(szPathName, "%sdomains", szRootDir); if (!SysPathExist(szPathName) && !SysMakeDir(szPathName)) { perror(szPathName); return SysErrNo(); } /* Create mailusers.tab file */ sprintf(szPathName, "%smailusers.tab", szRootDir); if (SysPathExist(szPathName)) { fprintf(stderr, "%s already exist\n", szPathName); return 1; } if ((pUsrFile = fopen(szPathName, "wt")) == NULL) { perror(szPathName); return SysErrNo(); } if (iNumUsers == 0) { if ((strlen(szInputFile) != 0) && ((pInFile = fopen(szInputFile, "rt")) == NULL)) { perror(szPathName); fclose(pUsrFile); return SysErrNo(); } /* Get input from stdin */ while (fgets(szUsrLine, sizeof(szUsrLine) - 1, pInFile) != NULL) { char *pszDomain; char *pszUsername; char *pszPassword; char *pszRealName; char *pszHomePage; szUsrLine[strlen(szUsrLine) - 1] = '\0'; if ((szUsrLine[0] == '#') || ((pszDomain = strtok(szUsrLine, ";")) == NULL) || ((pszUsername = strtok(NULL, ";")) == NULL) || ((pszPassword = strtok(NULL, ";")) == NULL) || ((pszRealName = strtok(NULL, ";")) == NULL) || ((pszHomePage = strtok(NULL, ";")) == NULL)) continue; if (CreateUser(szRootDir, pszDomain, pszUsername, pszPassword, uUserId++, pszRealName, pszHomePage, uMBSize, bMaildir, pUsrFile) != 0) { fprintf(stderr, "error creating <%s@%s> : %s\n", pszUsername, pszDomain, SysErrStr()); } } if (pInFile != stdin) fclose(pInFile); } else { /* Automatically generate users */ for (ii = 1; ii <= iNumUsers; ii++) { char szUsername[256] = ""; char szHomePage[256] = ""; sprintf(szUsername, "%s%d", szAutoUsr, ii); sprintf(szHomePage, "http://www.%s/~%s", szAutoDomain, szUsername); if (CreateUser(szRootDir, szAutoDomain, szUsername, szUsername, uUserId++, szUsername, szHomePage, uMBSize, bMaildir, pUsrFile) != 0) { fprintf(stderr, "error creating <%s@%s> : %s\n", szUsername, szAutoDomain, SysErrStr()); } } } fclose(pUsrFile); return 0; } xmail-1.27/SSLBind.cpp0000644000175000017500000003450711341640430013776 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "StrUtils.h" #include "BuffSock.h" #include "SSLBind.h" #include "openssl/bio.h" #include "openssl/rsa.h" #include "openssl/crypto.h" #include "openssl/x509.h" #include "openssl/pem.h" #include "openssl/ssl.h" #include "openssl/evp.h" #include "openssl/err.h" #ifndef OPENSSL_NO_ENGINE #include "openssl/engine.h" #endif #define BSSL_WRITE_BLKSIZE (1024 * 64) struct SslBindCtx { BufSockIOOps IOOps; SYS_SOCKET SockFD; SSL_CTX *pSCtx; SSL *pSSL; }; static SYS_MUTEX *pSslMtxs; static void BSslLockingCB(int iMode, int iType, const char *pszFile, int iLine) { if (pSslMtxs != NULL) { if (iMode & CRYPTO_LOCK) SysLockMutex(pSslMtxs[iType], SYS_INFINITE_TIMEOUT); else SysUnlockMutex(pSslMtxs[iType]); } } static void BSslThreadExit(void *pPrivate, SYS_THREAD ThreadID, int iMode) { if (iMode == SYS_THREAD_DETACH) { /* * This needs to be called at every thread exit, in order to give * a chance to OpenSSL to free its internal state. We do not need * to call ERR_remove_state() if ThreadID is SYS_INVALID_THREAD, * since in such case we would be called from the main thread, * and BSslCleanup() (in BSslFreeOSSL()) takes care of that. */ if (ThreadID != SYS_INVALID_THREAD) ERR_remove_state(0); } } static void BSslFreeOSSL(void) { ERR_remove_state(0); #ifndef OPENSSL_NO_ENGINE ENGINE_cleanup(); #endif CRYPTO_cleanup_all_ex_data(); ERR_free_strings(); EVP_cleanup(); } int BSslInit(void) { int i, iNumLocks = CRYPTO_num_locks(); if ((pSslMtxs = (SYS_MUTEX *) SysAlloc(iNumLocks * sizeof(SYS_MUTEX))) == NULL) return ErrGetErrorCode(); for (i = 0; i < iNumLocks; i++) { if ((pSslMtxs[i] = SysCreateMutex()) == SYS_INVALID_MUTEX) { ErrorPush(); for (i--; i >= 0; i--) SysCloseMutex(pSslMtxs[i]); SysFreeNullify(pSslMtxs); return ErrorPop(); } } SSL_load_error_strings(); SSLeay_add_ssl_algorithms(); CRYPTO_set_id_callback(SysGetCurrentThreadId); CRYPTO_set_locking_callback(BSslLockingCB); SysAddThreadExitHook(BSslThreadExit, NULL); return 0; } void BSslCleanup(void) { int i, iNumLocks = CRYPTO_num_locks(); #ifdef DEBUG_OSSL BIO *pErrBIO = BIO_new_fp(stderr, BIO_NOCLOSE); #endif BSslFreeOSSL(); #ifdef DEBUG_OSSL if (pErrBIO != NULL) { CRYPTO_mem_leaks(pErrBIO); BIO_free(pErrBIO); } #endif /* * This must be done as the last operation, since OpenSSL cleanup code * mayb end up calling BSslLockingCB() during its operations. */ for (i = 0; i < iNumLocks; i++) SysCloseMutex(pSslMtxs[i]); SysFreeNullify(pSslMtxs); } static int BSslHandleAsync(SslBindCtx *pCtx, int iCode, int iDefError, int iTimeo) { int iError, iResult = 0; SYS_fd_set FdSet; if ((iError = SSL_get_error(pCtx->pSSL, iCode)) != SSL_ERROR_NONE) { SYS_FD_ZERO(&FdSet); SYS_FD_SET(pCtx->SockFD, &FdSet); if (iError == SSL_ERROR_WANT_READ) { if (SysSelect((long) pCtx->SockFD + 1, &FdSet, NULL, NULL, iTimeo) < 0) return ErrGetErrorCode(); iResult = 1; } else if (iError == SSL_ERROR_WANT_WRITE) { if (SysSelect((long) pCtx->SockFD + 1, NULL, &FdSet, NULL, iTimeo) < 0) return ErrGetErrorCode(); iResult = 1; } else { ErrSetErrorCode(iDefError); iResult = iDefError; } } return iResult; } static int BSslReadLL(SslBindCtx *pCtx, void *pData, int iSize, int iTimeo) { int iRead, iError; for (;;) { iRead = SSL_read(pCtx->pSSL, pData, iSize); if ((iError = BSslHandleAsync(pCtx, iRead, ERR_SSL_READ, iTimeo)) < 0) return iError; if (iError == 0) break; } return iRead; } static int BSslWriteLL(SslBindCtx *pCtx, void const *pData, int iSize, int iTimeo) { int iWrite, iError; for (;;) { iWrite = SSL_write(pCtx->pSSL, pData, iSize); if ((iError = BSslHandleAsync(pCtx, iWrite, ERR_SSL_WRITE, iTimeo)) < 0) return iError; if (iError == 0) break; } return iWrite; } static int BSslShutdown(SslBindCtx *pCtx) { /* * OpenSSL SSL_shutdown() is broken, and does not support non-blocking * BIOs at this time. We need to set the socket back to blocking mode, * in order for SSL_shutdown() to perform correctly. If we do not do * this, TCP/IP connections will be terminated with RST packets, instead * of proper FIN/ACK exchanges. * This sucks, but the problem has been posted by others to OpenSSL dev * mailing lists, and they did not fix it. */ SysBlockSocket(pCtx->SockFD, 1); if (SSL_shutdown(pCtx->pSSL) == 0) { SysShutdownSocket(pCtx->SockFD, SYS_SHUT_WR); SSL_shutdown(pCtx->pSSL); } return 0; } static char const *BSslCtx__Name(void *pPrivate) { return BSSL_BIO_NAME; } static int BSslCtx__Free(void *pPrivate) { SslBindCtx *pCtx = (SslBindCtx *) pPrivate; BSslShutdown(pCtx); SSL_free(pCtx->pSSL); SSL_CTX_free(pCtx->pSCtx); /* * Restore default system blocking mode (-1) */ SysBlockSocket(pCtx->SockFD, -1); SysFree(pCtx); return 0; } static int BSslCtx__Read(void *pPrivate, void *pData, int iSize, int iTimeo) { SslBindCtx *pCtx = (SslBindCtx *) pPrivate; return BSslReadLL(pCtx, pData, iSize, iTimeo); } static int BSslCtx__Write(void *pPrivate, void const *pData, int iSize, int iTimeo) { SslBindCtx *pCtx = (SslBindCtx *) pPrivate; return BSslWriteLL(pCtx, pData, iSize, iTimeo); } static int BSslCtx__SendFile(void *pPrivate, char const *pszFilePath, SYS_OFF_T llOffStart, SYS_OFF_T llOffEnd, int iTimeo) { SslBindCtx *pCtx = (SslBindCtx *) pPrivate; SYS_MMAP hMap; SYS_OFF_T llSize, llAlnOff; void *pMapAddr; char *pCurAddr; if ((hMap = SysCreateMMap(pszFilePath, SYS_MMAP_READ)) == SYS_INVALID_MMAP) return ErrGetErrorCode(); llSize = SysMMapSize(hMap); if (llOffEnd == -1) llOffEnd = llSize; if (llOffStart > llSize || llOffEnd > llSize || llOffStart > llOffEnd) { SysCloseMMap(hMap); ErrSetErrorCode(ERR_INVALID_PARAMETER); return ERR_INVALID_PARAMETER; } llAlnOff = SysMMapOffsetAlign(hMap, llOffStart); if ((pMapAddr = SysMapMMap(hMap, llAlnOff, (SYS_SIZE_T) (llOffEnd - llAlnOff))) == NULL) { ErrorPush(); SysCloseMMap(hMap); return ErrorPop(); } pCurAddr = (char *) pMapAddr + (llOffStart - llAlnOff); while (llOffStart < llOffEnd) { int iSize = (int) Min(BSSL_WRITE_BLKSIZE, llOffEnd - llOffStart), iWrite; if ((iWrite = BSslWriteLL(pCtx, pCurAddr, iSize, iTimeo)) < 0) { ErrorPush(); SysUnmapMMap(hMap, pMapAddr, (SYS_SIZE_T) (llOffEnd - llAlnOff)); SysCloseMMap(hMap); return ErrorPop(); } pCurAddr += iWrite; llOffStart += iWrite; } SysUnmapMMap(hMap, pMapAddr, (SYS_SIZE_T) (llOffEnd - llAlnOff)); SysCloseMMap(hMap); return 0; } static int BSslAllocCtx(SslBindCtx **ppCtx, SYS_SOCKET SockFD, SSL_CTX *pSCtx, SSL *pSSL) { SslBindCtx *pCtx; if ((pCtx = (SslBindCtx *) SysAlloc(sizeof(SslBindCtx))) == NULL) return ErrGetErrorCode(); pCtx->IOOps.pPrivate = pCtx; pCtx->IOOps.pName = BSslCtx__Name; pCtx->IOOps.pFree = BSslCtx__Free; pCtx->IOOps.pRead = BSslCtx__Read; pCtx->IOOps.pWrite = BSslCtx__Write; pCtx->IOOps.pSendFile = BSslCtx__SendFile; pCtx->SockFD = SockFD; pCtx->pSCtx = pSCtx; pCtx->pSSL = pSSL; *ppCtx = pCtx; return 0; } static int BSslEnvExport(SSL_CTX *pSCtx, SSL *pSSL, X509 *pCert, int (*pfEnvCB)(void *, int, void const *), void *pPrivate) { char *pszVal; pszVal = X509_NAME_oneline(X509_get_issuer_name(pCert), 0, 0); (*pfEnvCB)(pPrivate, BSSL_CERT_ISSUER, pszVal); OPENSSL_free(pszVal); pszVal = X509_NAME_oneline(X509_get_subject_name(pCert), 0, 0); (*pfEnvCB)(pPrivate, BSSL_CERT_SUBJECT, pszVal); OPENSSL_free(pszVal); return 0; } static int BSslCertVerifyCB(int iOK, X509_STORE_CTX *pXsCtx) { int iError, iDepth; SSL *pSSL; SSL_CTX *pSCtx; SslServerBind const *pSSLB; X509 *pCert; iError = X509_STORE_CTX_get_error(pXsCtx); iDepth = X509_STORE_CTX_get_error_depth(pXsCtx); if ((pSSL = (SSL *) X509_STORE_CTX_get_ex_data(pXsCtx, SSL_get_ex_data_X509_STORE_CTX_idx())) == NULL) return iOK; pSCtx = SSL_get_SSL_CTX(pSSL); pSSLB = (SslServerBind const *) SSL_CTX_get_app_data(pSCtx); pCert = X509_STORE_CTX_get_current_cert(pXsCtx); #ifdef DEBUG_OSSL char *pszVal; pszVal = X509_NAME_oneline(X509_get_issuer_name(pCert), 0, 0); SysLogMessage(LOG_LEV_MESSAGE, "CERT Issuer: %s\n", pszVal); OPENSSL_free(pszVal); pszVal = X509_NAME_oneline(X509_get_subject_name(pCert), 0, 0); SysLogMessage(LOG_LEV_MESSAGE, "CERT Subject: %s\n", pszVal); OPENSSL_free(pszVal); #endif if (!iOK) { SysLogMessage(LOG_LEV_MESSAGE, "CERT verify error: depth = %d error = '%s'\n", iDepth, X509_verify_cert_error_string(iError)); if (iError == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT && pSSLB->ulFlags & BSSLF_ALLOW_SEFLSIGNED) { SysLogMessage(LOG_LEV_MESSAGE, "Self signed CERT allowed (override)\n"); iOK = 1; } } return iOK; } static int BSslSetupVerify(SSL_CTX *pSCtx, SslServerBind const *pSSLB) { char const *pszKeyFile = pSSLB->pszKeyFile; if (pSSLB->pszCertFile != NULL) { if (SSL_CTX_use_certificate_chain_file(pSCtx, pSSLB->pszCertFile) <= 0) { ErrSetErrorCode(ERR_SSL_SETCERT, pSSLB->pszCertFile); return ERR_SSL_SETCERT; } if (pszKeyFile == NULL) pszKeyFile = pSSLB->pszCertFile; } if (pszKeyFile != NULL) { if (SSL_CTX_use_PrivateKey_file(pSCtx, pszKeyFile, SSL_FILETYPE_PEM) <= 0) { ErrSetErrorCode(ERR_SSL_SETKEY, pszKeyFile); return ERR_SSL_SETKEY; } if (!SSL_CTX_check_private_key(pSCtx)) { ErrSetErrorCode(ERR_SSL_CHECKKEY, pszKeyFile); return ERR_SSL_CHECKKEY; } } if (pSSLB->ulFlags & BSSLF_WANT_VERIFY) { int iVerMode = SSL_VERIFY_PEER; if (pSSLB->ulFlags & BSSLF_WANT_CERT) iVerMode |= SSL_VERIFY_FAIL_IF_NO_PEER_CERT; SSL_CTX_set_verify(pSCtx, iVerMode, BSslCertVerifyCB); if (pSSLB->iMaxDepth > 0) SSL_CTX_set_verify_depth(pSCtx, pSSLB->iMaxDepth); SSL_CTX_set_app_data(pSCtx, pSSLB); if (pSSLB->pszCAFile != NULL || pSSLB->pszCAPath != NULL) { if (!SSL_CTX_load_verify_locations(pSCtx, pSSLB->pszCAFile, pSSLB->pszCAPath)) { ErrSetErrorCode(ERR_SSL_VERPATHS); return ERR_SSL_VERPATHS; } } else if (!SSL_CTX_set_default_verify_paths(pSCtx)) { ErrSetErrorCode(ERR_SSL_VERPATHS); return ERR_SSL_VERPATHS; } } return 0; } int BSslBindClient(BSOCK_HANDLE hBSock, SslServerBind const *pSSLB, int (*pfEnvCB)(void *, int, void const *), void *pPrivate) { int iError; SYS_SOCKET SockFD; SSL_METHOD const *pMethod; SSL_CTX *pSCtx; SSL *pSSL; X509 *pCert; SslBindCtx *pCtx; pMethod = SSLv23_client_method(); if ((pSCtx = SSL_CTX_new((SSL_METHOD *) pMethod)) == NULL) { ErrSetErrorCode(ERR_SSLCTX_CREATE); return ERR_SSLCTX_CREATE; } SSL_CTX_set_session_cache_mode(pSCtx, SSL_SESS_CACHE_OFF); /* * Client may not supply a certificate. */ if (pSSLB != NULL && BSslSetupVerify(pSCtx, pSSLB) < 0) { SSL_CTX_free(pSCtx); return ErrGetErrorCode(); } if ((pSSL = SSL_new(pSCtx)) == NULL) { SSL_CTX_free(pSCtx); ErrSetErrorCode(ERR_SSL_CREATE); return ERR_SSL_CREATE; } SockFD = BSckGetAttachedSocket(hBSock); /* * We want blocking sockets during the initial SSL negotiation. */ SysBlockSocket(SockFD, 1); SSL_set_fd(pSSL, SockFD); if (SSL_connect(pSSL) == -1) { SysBlockSocket(SockFD, -1); SSL_free(pSSL); SSL_CTX_free(pSCtx); ErrSetErrorCode(ERR_SSL_CONNECT); return ERR_SSL_CONNECT; } SSL_CTX_set_app_data(pSCtx, NULL); /* * Server must supply a certificate. */ if ((pCert = SSL_get_peer_certificate(pSSL)) == NULL) { SysBlockSocket(SockFD, -1); SSL_free(pSSL); SSL_CTX_free(pSCtx); ErrSetErrorCode(ERR_SSL_NOCERT); return ERR_SSL_NOCERT; } iError = (pfEnvCB != NULL) ? BSslEnvExport(pSCtx, pSSL, pCert, pfEnvCB, pPrivate): 0; X509_free(pCert); if (iError < 0 || BSslAllocCtx(&pCtx, SockFD, pSCtx, pSSL) < 0) { ErrorPush(); SysBlockSocket(SockFD, -1); SSL_free(pSSL); SSL_CTX_free(pSCtx); return ErrorPop(); } /* * Need to use non-blocking socket to implement read/write timeouts. */ SysBlockSocket(SockFD, 0); BSckSetIOops(hBSock, &pCtx->IOOps); return 0; } int BSslBindServer(BSOCK_HANDLE hBSock, SslServerBind const *pSSLB, int (*pfEnvCB)(void *, int, void const *), void *pPrivate) { int iError; SYS_SOCKET SockFD; SSL_METHOD const *pMethod; SSL_CTX *pSCtx; SSL *pSSL; X509 *pCert; SslBindCtx *pCtx; pMethod = SSLv23_server_method(); if ((pSCtx = SSL_CTX_new((SSL_METHOD *) pMethod)) == NULL) { ErrSetErrorCode(ERR_SSLCTX_CREATE); return ERR_SSLCTX_CREATE; } SSL_CTX_set_session_cache_mode(pSCtx, SSL_SESS_CACHE_OFF); if (BSslSetupVerify(pSCtx, pSSLB) < 0) { SSL_CTX_free(pSCtx); return ErrGetErrorCode(); } if ((pSSL = SSL_new(pSCtx)) == NULL) { SSL_CTX_free(pSCtx); ErrSetErrorCode(ERR_SSL_CREATE); return ERR_SSL_CREATE; } SockFD = BSckGetAttachedSocket(hBSock); /* * We want blocking sockets during the initial SSL negotiation. */ SysBlockSocket(SockFD, 1); SSL_set_fd(pSSL, SockFD); if (SSL_accept(pSSL) == -1) { SysBlockSocket(SockFD, -1); SSL_free(pSSL); SSL_CTX_free(pSCtx); ErrSetErrorCode(ERR_SSL_ACCEPT); return ERR_SSL_ACCEPT; } SSL_CTX_set_app_data(pSCtx, NULL); /* * Client may not supply a certificate. */ iError = 0; if (pfEnvCB != NULL && (pCert = SSL_get_peer_certificate(pSSL)) != NULL) { iError = BSslEnvExport(pSCtx, pSSL, pCert, pfEnvCB, pPrivate); X509_free(pCert); } if (iError < 0 || BSslAllocCtx(&pCtx, SockFD, pSCtx, pSSL) < 0) { ErrorPush(); SysBlockSocket(SockFD, -1); SSL_free(pSSL); SSL_CTX_free(pSCtx); return ErrorPop(); } /* * Need to use non-blocking socket to implement read/write timeouts. */ SysBlockSocket(SockFD, 0); BSckSetIOops(hBSock, &pCtx->IOOps); return 0; } xmail-1.27/ExtAliases.h0000644000175000017500000000334411341640430014242 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _EXTALIASES_H #define _EXTALIASES_H #define INVALID_EXAL_HANDLE ((EXAL_HANDLE) 0) struct ExtAlias { char *pszDomain; char *pszName; char *pszRmtDomain; char *pszRmtName; }; typedef struct EXAL_HANDLE_struct { } *EXAL_HANDLE; int ExAlCheckAliasIndexes(void); ExtAlias *ExAlAllocAlias(void); void ExAlFreeAlias(ExtAlias * pExtAlias); int ExAlAddAlias(ExtAlias * pExtAlias); ExtAlias *ExAlGetAlias(char const *pszRmtDomain, char const *pszRmtName); int ExAlRemoveAlias(ExtAlias * pExtAlias); int ExAlRemoveUserAliases(const char *pszDomain, const char *pszName); int ExAlRemoveDomainAliases(const char *pszDomain); int ExAlGetDBFileSnapShot(const char *pszFileName); EXAL_HANDLE ExAlOpenDB(void); void ExAlCloseDB(EXAL_HANDLE hLinksDB); ExtAlias *ExAlGetFirstAlias(EXAL_HANDLE hLinksDB); ExtAlias *ExAlGetNextAlias(EXAL_HANDLE hLinksDB); #endif xmail-1.27/MD5.cpp0000644000175000017500000002206311341640430013117 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "MD5.h" #define MD5_FTRANS(x, y, z) (((x) & (y)) | ((~x) & (z))) #define MD5_GTRANS(x, y, z) (((x) & (z)) | ((y) & (~z))) #define MD5_HTRANS(x, y, z) ((x) ^ (y) ^ (z)) #define MD5_ITRANS(x, y, z) ((y) ^ ((x) | (~z))) #define MD5_LROT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) #define MD5_FSTEP(a, b, c, d, x, s, ac) \ { \ (a) += MD5_FTRANS((b), (c), (d)) + (x) + (md5_u32) (ac); \ (a) = MD5_LROT((a), (s)); \ (a) += (b); \ } #define MD5_GSTEP(a, b, c, d, x, s, ac) \ { \ (a) += MD5_GTRANS((b), (c), (d)) + (x) + (md5_u32) (ac); \ (a) = MD5_LROT((a), (s)); \ (a) += (b); \ } #define MD5_HSTEP(a, b, c, d, x, s, ac) \ { \ (a) += MD5_HTRANS((b), (c), (d)) + (x) + (md5_u32) (ac); \ (a) = MD5_LROT((a), (s)); \ (a) += (b); \ } #define MD5_ISTEP(a, b, c, d, x, s, ac) \ { \ (a) += MD5_ITRANS((b), (c), (d)) + (x) + (md5_u32) (ac); \ (a) = MD5_LROT((a), (s)); \ (a) += (b); \ } static void md5_transform(md5_u32 *buf, md5_u32 const *in) { md5_u32 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; /* Round 1 */ #define S11 7 #define S12 12 #define S13 17 #define S14 22 MD5_FSTEP(a, b, c, d, in[ 0], S11, 3614090360U); /* 1 */ MD5_FSTEP(d, a, b, c, in[ 1], S12, 3905402710U); /* 2 */ MD5_FSTEP(c, d, a, b, in[ 2], S13, 606105819U); /* 3 */ MD5_FSTEP(b, c, d, a, in[ 3], S14, 3250441966U); /* 4 */ MD5_FSTEP(a, b, c, d, in[ 4], S11, 4118548399U); /* 5 */ MD5_FSTEP(d, a, b, c, in[ 5], S12, 1200080426U); /* 6 */ MD5_FSTEP(c, d, a, b, in[ 6], S13, 2821735955U); /* 7 */ MD5_FSTEP(b, c, d, a, in[ 7], S14, 4249261313U); /* 8 */ MD5_FSTEP(a, b, c, d, in[ 8], S11, 1770035416U); /* 9 */ MD5_FSTEP(d, a, b, c, in[ 9], S12, 2336552879U); /* 10 */ MD5_FSTEP(c, d, a, b, in[10], S13, 4294925233U); /* 11 */ MD5_FSTEP(b, c, d, a, in[11], S14, 2304563134U); /* 12 */ MD5_FSTEP(a, b, c, d, in[12], S11, 1804603682U); /* 13 */ MD5_FSTEP(d, a, b, c, in[13], S12, 4254626195U); /* 14 */ MD5_FSTEP(c, d, a, b, in[14], S13, 2792965006U); /* 15 */ MD5_FSTEP(b, c, d, a, in[15], S14, 1236535329U); /* 16 */ /* Round 2 */ #define S21 5 #define S22 9 #define S23 14 #define S24 20 MD5_GSTEP(a, b, c, d, in[ 1], S21, 4129170786U); /* 17 */ MD5_GSTEP(d, a, b, c, in[ 6], S22, 3225465664U); /* 18 */ MD5_GSTEP(c, d, a, b, in[11], S23, 643717713U); /* 19 */ MD5_GSTEP(b, c, d, a, in[ 0], S24, 3921069994U); /* 20 */ MD5_GSTEP(a, b, c, d, in[ 5], S21, 3593408605U); /* 21 */ MD5_GSTEP(d, a, b, c, in[10], S22, 38016083U); /* 22 */ MD5_GSTEP(c, d, a, b, in[15], S23, 3634488961U); /* 23 */ MD5_GSTEP(b, c, d, a, in[ 4], S24, 3889429448U); /* 24 */ MD5_GSTEP(a, b, c, d, in[ 9], S21, 568446438U); /* 25 */ MD5_GSTEP(d, a, b, c, in[14], S22, 3275163606U); /* 26 */ MD5_GSTEP(c, d, a, b, in[ 3], S23, 4107603335U); /* 27 */ MD5_GSTEP(b, c, d, a, in[ 8], S24, 1163531501U); /* 28 */ MD5_GSTEP(a, b, c, d, in[13], S21, 2850285829U); /* 29 */ MD5_GSTEP(d, a, b, c, in[ 2], S22, 4243563512U); /* 30 */ MD5_GSTEP(c, d, a, b, in[ 7], S23, 1735328473U); /* 31 */ MD5_GSTEP(b, c, d, a, in[12], S24, 2368359562U); /* 32 */ /* Round 3 */ #define S31 4 #define S32 11 #define S33 16 #define S34 23 MD5_HSTEP(a, b, c, d, in[ 5], S31, 4294588738U); /* 33 */ MD5_HSTEP(d, a, b, c, in[ 8], S32, 2272392833U); /* 34 */ MD5_HSTEP(c, d, a, b, in[11], S33, 1839030562U); /* 35 */ MD5_HSTEP(b, c, d, a, in[14], S34, 4259657740U); /* 36 */ MD5_HSTEP(a, b, c, d, in[ 1], S31, 2763975236U); /* 37 */ MD5_HSTEP(d, a, b, c, in[ 4], S32, 1272893353U); /* 38 */ MD5_HSTEP(c, d, a, b, in[ 7], S33, 4139469664U); /* 39 */ MD5_HSTEP(b, c, d, a, in[10], S34, 3200236656U); /* 40 */ MD5_HSTEP(a, b, c, d, in[13], S31, 681279174U); /* 41 */ MD5_HSTEP(d, a, b, c, in[ 0], S32, 3936430074U); /* 42 */ MD5_HSTEP(c, d, a, b, in[ 3], S33, 3572445317U); /* 43 */ MD5_HSTEP(b, c, d, a, in[ 6], S34, 76029189U); /* 44 */ MD5_HSTEP(a, b, c, d, in[ 9], S31, 3654602809U); /* 45 */ MD5_HSTEP(d, a, b, c, in[12], S32, 3873151461U); /* 46 */ MD5_HSTEP(c, d, a, b, in[15], S33, 530742520U); /* 47 */ MD5_HSTEP(b, c, d, a, in[ 2], S34, 3299628645U); /* 48 */ /* Round 4 */ #define S41 6 #define S42 10 #define S43 15 #define S44 21 MD5_ISTEP(a, b, c, d, in[ 0], S41, 4096336452U); /* 49 */ MD5_ISTEP(d, a, b, c, in[ 7], S42, 1126891415U); /* 50 */ MD5_ISTEP(c, d, a, b, in[14], S43, 2878612391U); /* 51 */ MD5_ISTEP(b, c, d, a, in[ 5], S44, 4237533241U); /* 52 */ MD5_ISTEP(a, b, c, d, in[12], S41, 1700485571U); /* 53 */ MD5_ISTEP(d, a, b, c, in[ 3], S42, 2399980690U); /* 54 */ MD5_ISTEP(c, d, a, b, in[10], S43, 4293915773U); /* 55 */ MD5_ISTEP(b, c, d, a, in[ 1], S44, 2240044497U); /* 56 */ MD5_ISTEP(a, b, c, d, in[ 8], S41, 1873313359U); /* 57 */ MD5_ISTEP(d, a, b, c, in[15], S42, 4264355552U); /* 58 */ MD5_ISTEP(c, d, a, b, in[ 6], S43, 2734768916U); /* 59 */ MD5_ISTEP(b, c, d, a, in[13], S44, 1309151649U); /* 60 */ MD5_ISTEP(a, b, c, d, in[ 4], S41, 4149444226U); /* 61 */ MD5_ISTEP(d, a, b, c, in[11], S42, 3174756917U); /* 62 */ MD5_ISTEP(c, d, a, b, in[ 2], S43, 718787259U); /* 63 */ MD5_ISTEP(b, c, d, a, in[ 9], S44, 3951481745U); /* 64 */ buf[0] += a; buf[1] += b; buf[2] += c; buf[3] += d; } void md5_init(md5_ctx_t *mdctx) { mdctx->i[0] = mdctx->i[1] = 0; mdctx->buf[0] = (md5_u32) 0x67452301; mdctx->buf[1] = (md5_u32) 0xefcdab89; mdctx->buf[2] = (md5_u32) 0x98badcfe; mdctx->buf[3] = (md5_u32) 0x10325476; } void md5_update(md5_ctx_t *mdctx, unsigned char const *data, unsigned int size) { unsigned int i, j, mdi; md5_u32 in[16]; /* compute number of bytes mod 64 */ mdi = (unsigned int) ((mdctx->i[0] >> 3) & 0x3F); /* update number of bits */ if ((mdctx->i[0] + ((md5_u32) size << 3)) < mdctx->i[0]) mdctx->i[1]++; mdctx->i[0] += ((md5_u32) size << 3); mdctx->i[1] += ((md5_u32) size >> 29); while (size--) { /* add new character to buffer, increment mdi */ mdctx->in[mdi++] = *data++; /* transform if necessary */ if (mdi == 0x40) { for (i = j = 0; i < 16; i++, j += 4) in[i] = (((md5_u32) mdctx->in[j + 3]) << 24) | (((md5_u32) mdctx->in[j + 2]) << 16) | (((md5_u32) mdctx->in[j + 1]) << 8) | ((md5_u32) mdctx->in[j]); md5_transform(mdctx->buf, in); mdi = 0; } } } void md5_final(md5_ctx_t *mdctx) { unsigned int i, j, mdi; md5_u32 in[16]; static unsigned char const buf_pad[64] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* save number of bits */ in[14] = mdctx->i[0]; in[15] = mdctx->i[1]; /* compute number of bytes mod 64 */ mdi = (unsigned int) ((mdctx->i[0] >> 3) & 0x3F); /* pad out to 56 mod 64 */ i = (mdi < 56) ? (56 - mdi): (120 - mdi); md5_update(mdctx, buf_pad, i); /* append length in bits and transform */ for (i = 0, j = 0; i < 14; i++, j += 4) in[i] = (((md5_u32) mdctx->in[j + 3]) << 24) | (((md5_u32) mdctx->in[j + 2]) << 16) | (((md5_u32) mdctx->in[j + 1]) << 8) | ((md5_u32) mdctx->in[j]); md5_transform(mdctx->buf, in); for (i = j = 0; i < 4; i++, j += 4) { mdctx->digest[j] = (unsigned char) (mdctx->buf[i] & 0xFF); mdctx->digest[j + 1] = (unsigned char) ((mdctx->buf[i] >> 8) & 0xFF); mdctx->digest[j + 2] = (unsigned char) ((mdctx->buf[i] >> 16) & 0xFF); mdctx->digest[j + 3] = (unsigned char) ((mdctx->buf[i] >> 24) & 0xFF); } } void md5_hex(unsigned char *src, char *dst) { unsigned i, c; static char const hex[] = "0123456789abcdef"; for (i = 0; i < 16; i++) { c = src[i]; dst[i * 2 + 0] = hex[c >> 4]; dst[i * 2 + 1] = hex[c & 0x0F]; } dst[32] = '\0'; } void do_md5_file(FILE *file, long start, long bytes, char *hash) { int n; md5_ctx_t ctx; unsigned char buff[1024]; md5_init(&ctx); fseek(file, start, SEEK_SET); while (bytes > 0) { n = fread(buff, 1, Min(bytes, sizeof(buff)), file); if (n <= 0) break; md5_update(&ctx, buff, n); bytes -= n; } md5_final(&ctx); md5_hex(ctx.digest, hash); } void do_md5_string(char const *pass, int passlen, char *hash) { md5_ctx_t ctx; md5_init(&ctx); md5_update(&ctx, (unsigned char const *) pass, passlen); md5_final(&ctx); md5_hex(ctx.digest, hash); } xmail-1.27/PSYNCSvr.cpp0000644000175000017500000002741111341640430014123 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "SList.h" #include "BuffSock.h" #include "ResLocks.h" #include "MiscUtils.h" #include "MailConfig.h" #include "SvrUtils.h" #include "UsrUtils.h" #include "POP3Svr.h" #include "POP3Utils.h" #include "MessQueue.h" #include "AppDefines.h" #include "MailSvr.h" #include "POP3GwLink.h" #include "PSYNCSvr.h" #define PSYNC_LOG_FILE "psync" #define PSYNC_TRIGGER_FILE ".psync-trigger" #define PSYNC_WAIT_SLEEP 2 #define MAX_CLIENTS_WAIT 300 #define PSYNC_WAKEUP_TIME 2 #define PSYNC_SERVER_NAME "[" APP_NAME_VERSION_STR " PSYNC Server]" struct PSYNCThreadData { PSYNCConfig *pPSYNCCfg; POP3Link *pPopLnk; }; static int PSYNCThreadCountAdd(long lCount, SHB_HANDLE hShbPSYNC, PSYNCConfig *pPSYNCCfg = NULL); static bool PSYNCNeedSync(void) { char szTriggerPath[SYS_MAX_PATH] = ""; CfgGetRootPath(szTriggerPath, sizeof(szTriggerPath)); StrNCat(szTriggerPath, PSYNC_TRIGGER_FILE, sizeof(szTriggerPath)); /* Check for the presence of the trigger file */ if (!SysExistFile(szTriggerPath)) return false; SysRemove(szTriggerPath); return true; } static PSYNCConfig *PSYNCGetConfigCopy(SHB_HANDLE hShbPSYNC) { PSYNCConfig *pPSYNCCfg = (PSYNCConfig *) ShbLock(hShbPSYNC); if (pPSYNCCfg == NULL) return NULL; PSYNCConfig *pNewPSYNCCfg = (PSYNCConfig *) SysAlloc(sizeof(PSYNCConfig)); if (pNewPSYNCCfg != NULL) memcpy(pNewPSYNCCfg, pPSYNCCfg, sizeof(PSYNCConfig)); ShbUnlock(hShbPSYNC); return pNewPSYNCCfg; } static int PSYNCThreadCountAdd(long lCount, SHB_HANDLE hShbPSYNC, PSYNCConfig *pPSYNCCfg) { int iDoUnlock = 0; if (pPSYNCCfg == NULL) { if ((pPSYNCCfg = (PSYNCConfig *) ShbLock(hShbPSYNC)) == NULL) return ErrGetErrorCode(); ++iDoUnlock; } pPSYNCCfg->lThreadCount += lCount; if (iDoUnlock) ShbUnlock(hShbPSYNC); return 0; } static int PSYNCTimeToStop(SHB_HANDLE hShbPSYNC) { PSYNCConfig *pPSYNCCfg = (PSYNCConfig *) ShbLock(hShbPSYNC); if (pPSYNCCfg == NULL) return 1; int iTimeToStop = (pPSYNCCfg->ulFlags & PSYNCF_STOP_SERVER) ? 1 : 0; ShbUnlock(hShbPSYNC); return iTimeToStop; } static int PSYNCThreadNotifyExit(void) { SysReleaseSemaphore(hSyncSem, 1); return 0; } static int PSYNCLogEnabled(PSYNCConfig *pPSYNCCfg) { return (pPSYNCCfg->ulFlags & PSYNCF_LOG_ENABLED) ? 1 : 0; } static int PSYNCLogSession(POP3Link const *pPopLnk, MailSyncReport const *pSRep, char const *pszStatus) { char szTime[256] = ""; MscGetTimeNbrString(szTime, sizeof(szTime) - 1); RLCK_HANDLE hResLock = RLckLockEX(SVR_LOGS_DIR SYS_SLASH_STR PSYNC_LOG_FILE); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); MscFileLog(PSYNC_LOG_FILE, "\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%s\"" "\t\"%d\"" "\t\"" SYS_OFFT_FMT "\"" "\t\"%d\"" "\t\"" SYS_OFFT_FMT "\"" "\n", szTime, pPopLnk->pszDomain, pPopLnk->pszName, pPopLnk->pszRmtDomain, pPopLnk->pszRmtName, pPopLnk->pszAuthType, pszStatus, pSRep->iMsgSync, pSRep->llSizeSync, pSRep->iMsgErr, pSRep->llSizeErr); RLckUnlockEX(hResLock); return 0; } unsigned int PSYNCThreadSyncProc(void *pThreadData) { PSYNCThreadData *pSTD = (PSYNCThreadData *) pThreadData; POP3Link *pPopLnk = pSTD->pPopLnk; PSYNCConfig *pPSYNCCfg = pSTD->pPSYNCCfg; SysFree(pSTD); SysLogMessage(LOG_LEV_MESSAGE, "[PSYNC] entry\n"); /* Get configuration handle */ SVRCFG_HANDLE hSvrConfig = SvrGetConfigHandle(); if (hSvrConfig == INVALID_SVRCFG_HANDLE) { ErrorPush(); SysLogMessage(LOG_LEV_MESSAGE, "%s\n", ErrGetErrorString(ErrorFetch())); GwLkFreePOP3Link(pPopLnk); SysFree(pPSYNCCfg); /* Notify thread exit semaphore */ PSYNCThreadNotifyExit(); return ErrorPop(); } /* Get the error account for email that the server is not able to deliver coz */ /* it does not find information about where it has to deliver */ char szErrorAccount[MAX_ADDR_NAME] = ""; SvrConfigVar("Pop3SyncErrorAccount", szErrorAccount, sizeof(szErrorAccount) - 1, hSvrConfig, ""); char const *pszErrorAccount = (IsEmptyString(szErrorAccount)) ? NULL : szErrorAccount; /* Get headers tags that must be checked to extract recipients */ char szFetchHdrTags[256] = ""; SvrConfigVar("FetchHdrTags", szFetchHdrTags, sizeof(szFetchHdrTags) - 1, hSvrConfig, "+X-Deliver-To,+Received,To,Cc"); /* Lock the link */ if (GwLkLinkLock(pPopLnk) < 0) { ErrorPush(); SysLogMessage(LOG_LEV_MESSAGE, "%s\n", ErrGetErrorString(ErrorFetch())); SvrReleaseConfigHandle(hSvrConfig); GwLkFreePOP3Link(pPopLnk); SysFree(pPSYNCCfg); /* Notify thread exit semaphore */ PSYNCThreadNotifyExit(); return ErrorPop(); } /* Increase threads count */ PSYNCThreadCountAdd(+1, hShbPSYNC); /* Sync for real internal account ? */ MailSyncReport SRep; if (GwLkLocalDomain(pPopLnk)) { /* Verify user credentials */ UserInfo *pUI = UsrGetUserByName(pPopLnk->pszDomain, pPopLnk->pszName); if (pUI != NULL) { SysLogMessage(LOG_LEV_MESSAGE, "[PSYNC] User = \"%s\" - Domain = \"%s\"\n", pPopLnk->pszName, pPopLnk->pszDomain); /* Sync */ char szUserAddress[MAX_ADDR_NAME] = ""; UsrGetAddress(pUI, szUserAddress); if (UPopSyncRemoteLink(szUserAddress, pPopLnk->pszRmtDomain, pPopLnk->pszRmtName, pPopLnk->pszRmtPassword, &SRep, pPopLnk->pszAuthType, szFetchHdrTags, pszErrorAccount) < 0) { ErrLogMessage(LOG_LEV_MESSAGE, "[PSYNC] User = \"%s\" - Domain = \"%s\" Failed !\n", pPopLnk->pszName, pPopLnk->pszDomain); ZeroData(SRep); if (PSYNCLogEnabled(pPSYNCCfg)) PSYNCLogSession(pPopLnk, &SRep, "SYNC=EFAIL"); } else { if (PSYNCLogEnabled(pPSYNCCfg)) PSYNCLogSession(pPopLnk, &SRep, "SYNC=OK"); } UsrFreeUserInfo(pUI); } else { SysLogMessage(LOG_LEV_MESSAGE, "[PSYNC] User = \"%s\" - Domain = \"%s\" Failed !\n" "Error = %s\n", pPopLnk->pszName, pPopLnk->pszDomain, ErrGetErrorString()); ZeroData(SRep); if (PSYNCLogEnabled(pPSYNCCfg)) PSYNCLogSession(pPopLnk, &SRep, "SYNC=ENOUSER"); } } else if (GwLkMasqueradeDomain(pPopLnk)) { SysLogMessage(LOG_LEV_MESSAGE, "[PSYNC/MASQ] MasqDomain = \"%s\" - RmtDomain = \"%s\" - RmtName = \"%s\"\n", pPopLnk->pszDomain + 1, pPopLnk->pszRmtDomain, pPopLnk->pszRmtName); /* Sync ( "pszDomain" == "?" + masq-domain or "pszDomain" == "&" + add-domain ) */ if (UPopSyncRemoteLink(pPopLnk->pszDomain, pPopLnk->pszRmtDomain, pPopLnk->pszRmtName, pPopLnk->pszRmtPassword, &SRep, pPopLnk->pszAuthType, szFetchHdrTags, pszErrorAccount) < 0) { ErrLogMessage(LOG_LEV_MESSAGE, "[PSYNC/MASQ] MasqDomain = \"%s\" - RmtDomain = \"%s\" - RmtName = \"%s\" Failed !\n", pPopLnk->pszDomain + 1, pPopLnk->pszRmtDomain, pPopLnk->pszRmtName); ZeroData(SRep); if (PSYNCLogEnabled(pPSYNCCfg)) PSYNCLogSession(pPopLnk, &SRep, "SYNC=EFAIL"); } else { if (PSYNCLogEnabled(pPSYNCCfg)) PSYNCLogSession(pPopLnk, &SRep, "SYNC=OK"); } } else { char szSyncAddress[MAX_ADDR_NAME] = ""; SysSNPrintf(szSyncAddress, sizeof(szSyncAddress) - 1, "%s%s", pPopLnk->pszName, pPopLnk->pszDomain); SysLogMessage(LOG_LEV_MESSAGE, "[PSYNC/EXT] Acount = \"%s\" - RmtDomain = \"%s\" - RmtName = \"%s\"\n", szSyncAddress, pPopLnk->pszRmtDomain, pPopLnk->pszRmtName); /* Sync ( "pszDomain" == "@" + domain ) */ if (UPopSyncRemoteLink(szSyncAddress, pPopLnk->pszRmtDomain, pPopLnk->pszRmtName, pPopLnk->pszRmtPassword, &SRep, pPopLnk->pszAuthType, szFetchHdrTags, pszErrorAccount) < 0) { ErrLogMessage(LOG_LEV_MESSAGE, "[PSYNC/EXT] Acount = \"%s\" - RmtDomain = \"%s\" - RmtName = \"%s\" Failed !\n", szSyncAddress, pPopLnk->pszRmtDomain, pPopLnk->pszRmtName); ZeroData(SRep); if (PSYNCLogEnabled(pPSYNCCfg)) PSYNCLogSession(pPopLnk, &SRep, "SYNC=EFAIL"); } else { if (PSYNCLogEnabled(pPSYNCCfg)) PSYNCLogSession(pPopLnk, &SRep, "SYNC=OK"); } } /* Decrease threads count */ PSYNCThreadCountAdd(-1, hShbPSYNC); GwLkLinkUnlock(pPopLnk); SvrReleaseConfigHandle(hSvrConfig); GwLkFreePOP3Link(pPopLnk); SysFree(pPSYNCCfg); /* Notify thread exit semaphore */ PSYNCThreadNotifyExit(); SysLogMessage(LOG_LEV_MESSAGE, "[PSYNC] exit\n"); return 0; } static SYS_THREAD PSYNCCreateSyncThread(SHB_HANDLE hShbPSYNC, POP3Link *pPopLnk) { PSYNCThreadData *pSTD = (PSYNCThreadData *) SysAlloc(sizeof(PSYNCThreadData)); if (pSTD == NULL) return SYS_INVALID_THREAD; if ((pSTD->pPSYNCCfg = PSYNCGetConfigCopy(hShbPSYNC)) == NULL) { SysFree(pSTD); return SYS_INVALID_THREAD; } pSTD->pPopLnk = pPopLnk; SYS_THREAD hThread = SysCreateThread(PSYNCThreadSyncProc, pSTD); if (hThread == SYS_INVALID_THREAD) { SysFree(pSTD->pPSYNCCfg); SysFree(pSTD); return SYS_INVALID_THREAD; } return hThread; } static int PSYNCStartTransfer(SHB_HANDLE hShbPSYNC, PSYNCConfig *pPSYNCCfg) { GWLKF_HANDLE hLinksDB = GwLkOpenDB(); if (hLinksDB == INVALID_GWLKF_HANDLE) { ErrorPush(); SysLogMessage(LOG_LEV_ERROR, "%s\n", ErrGetErrorString(ErrorFetch())); return ErrorPop(); } POP3Link *pPopLnk = GwLkGetFirstUser(hLinksDB); for (; pPopLnk != NULL; pPopLnk = GwLkGetNextUser(hLinksDB)) { /* Check if link is enabled */ if (GwLkCheckEnabled(pPopLnk) < 0) { GwLkFreePOP3Link(pPopLnk); continue; } if (SysWaitSemaphore(hSyncSem, SYS_INFINITE_TIMEOUT) < 0 || PSYNCTimeToStop(hShbPSYNC)) { GwLkFreePOP3Link(pPopLnk); break; } SYS_THREAD hClientThread = PSYNCCreateSyncThread(hShbPSYNC, pPopLnk); if (hClientThread == SYS_INVALID_THREAD) { ErrorPush(); GwLkFreePOP3Link(pPopLnk); SysReleaseSemaphore(hSyncSem, 1); GwLkCloseDB(hLinksDB); return ErrorPop(); } SysCloseThread(hClientThread, 0); } GwLkCloseDB(hLinksDB); return 0; } unsigned int PSYNCThreadProc(void *pThreadData) { SysLogMessage(LOG_LEV_MESSAGE, "%s started\n", PSYNC_SERVER_NAME); int iElapsedTime = 0; for (;;) { SysSleep(PSYNC_WAKEUP_TIME); iElapsedTime += PSYNC_WAKEUP_TIME; PSYNCConfig *pPSYNCCfg = PSYNCGetConfigCopy(hShbPSYNC); if (pPSYNCCfg == NULL) break; if (pPSYNCCfg->ulFlags & PSYNCF_STOP_SERVER) { SysFree(pPSYNCCfg); break; } if ((pPSYNCCfg->iSyncInterval == 0 || iElapsedTime < pPSYNCCfg->iSyncInterval) && !PSYNCNeedSync()) { SysFree(pPSYNCCfg); continue; } iElapsedTime = 0; PSYNCStartTransfer(hShbPSYNC, pPSYNCCfg); SysFree(pPSYNCCfg); } /* Wait for client completion */ for (int iTotalWait = 0; (iTotalWait < MAX_CLIENTS_WAIT); iTotalWait += PSYNC_WAIT_SLEEP) { PSYNCConfig *pPSYNCCfg = (PSYNCConfig *) ShbLock(hShbPSYNC); if (pPSYNCCfg == NULL) break; long lThreadCount = pPSYNCCfg->lThreadCount; ShbUnlock(hShbPSYNC); if (lThreadCount == 0) break; SysSleep(PSYNC_WAIT_SLEEP); } SysLogMessage(LOG_LEV_MESSAGE, "%s stopped\n", PSYNC_SERVER_NAME); return 0; } xmail-1.27/SList.h0000644000175000017500000000331511341640430013234 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SLIST_H #define _SLIST_H #define INVALID_SLIST_PTR 0 #define ListLinkInit(p) ((PLISTLINK) (p))->pNext = INVALID_SLIST_PTR typedef struct s_ListLink { struct s_ListLink *pNext; } LISTLINK; typedef LISTLINK *PLISTLINK; typedef PLISTLINK HSLIST; void ListInit(HSLIST &hList); void ListAddHead(HSLIST &hList, PLISTLINK pLLink); void ListAddTail(HSLIST &hList, PLISTLINK pLLink); PLISTLINK ListFirst(HSLIST &hList); PLISTLINK ListNext(HSLIST &hList, PLISTLINK pLLink); PLISTLINK ListRemovePtr(HSLIST &hList, PLISTLINK pLLink); PLISTLINK ListRemove(HSLIST &hList); void ListPurgeFree(HSLIST &hList); void ListPurge(HSLIST &hList); bool ListIsEmpty(HSLIST &hList); int ListGetCount(HSLIST &hList); PLISTLINK *ListGetPointers(HSLIST &hList, int &iListCount); void ListReleasePointers(PLISTLINK *pPointers); #endif xmail-1.27/SysTypesSolaris.h0000644000175000017500000000173311341640430015340 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SYSTYPESSOLARIS_H #define _SYSTYPESSOLARIS_H #include "SysTypesUnix.h" #endif xmail-1.27/AppDefines.h0000644000175000017500000000225111341640430014212 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _APPDEFINES_H #define _APPDEFINES_H #define APP_PRODUCER "GNU" #define APP_NAME_STR "XMail" #define APP_VERSION_STR "1.27" #define APP_NAME_VERSION_STR APP_NAME_STR " " APP_VERSION_STR #define APP_URL "http://www.xmailserver.org" #endif xmail-1.27/Errors.h0000644000175000017500000005313511341640430013457 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _ERRORS_H #define _ERRORS_H /* Remeber to update error strings i Errors.cpp */ enum XMailErrors { __ERR_SUCCESS = 0, #define ERR_SUCCESS (-__ERR_SUCCESS) __ERR_SERVER_SHUTDOWN, #define ERR_SERVER_SHUTDOWN (-__ERR_SERVER_SHUTDOWN) __ERR_MEMORY, #define ERR_MEMORY (-__ERR_MEMORY) __ERR_NETWORK, #define ERR_NETWORK (-__ERR_NETWORK) __ERR_SOCKET_CREATE, #define ERR_SOCKET_CREATE (-__ERR_SOCKET_CREATE) __ERR_TIMEOUT, #define ERR_TIMEOUT (-__ERR_TIMEOUT) __ERR_LOCKED, #define ERR_LOCKED (-__ERR_LOCKED) __ERR_SOCKET_BIND, #define ERR_SOCKET_BIND (-__ERR_SOCKET_BIND) __ERR_CONF_PATH, #define ERR_CONF_PATH (-__ERR_CONF_PATH) __ERR_USERS_FILE_NOT_FOUND, #define ERR_USERS_FILE_NOT_FOUND (-__ERR_USERS_FILE_NOT_FOUND) __ERR_FILE_CREATE, #define ERR_FILE_CREATE (-__ERR_FILE_CREATE) __ERR__DUMMY, __ERR_USER_NOT_FOUND, #define ERR_USER_NOT_FOUND (-__ERR_USER_NOT_FOUND) __ERR_USER_EXIST, #define ERR_USER_EXIST (-__ERR_USER_EXIST) __ERR_WRITE_USERS_FILE, #define ERR_WRITE_USERS_FILE (-__ERR_WRITE_USERS_FILE) __ERR_NO_USER_PRFILE, #define ERR_NO_USER_PRFILE (-__ERR_NO_USER_PRFILE) __ERR_FILE_DELETE, #define ERR_FILE_DELETE (-__ERR_FILE_DELETE) __ERR_DIR_CREATE, #define ERR_DIR_CREATE (-__ERR_DIR_CREATE) __ERR_DIR_DELETE, #define ERR_DIR_DELETE (-__ERR_DIR_DELETE) __ERR_FILE_OPEN, #define ERR_FILE_OPEN (-__ERR_FILE_OPEN) __ERR_INVALID_FILE, #define ERR_INVALID_FILE (-__ERR_INVALID_FILE) __ERR_FILE_WRITE, #define ERR_FILE_WRITE (-__ERR_FILE_WRITE) __ERR_MSG_NOT_IN_RANGE, #define ERR_MSG_NOT_IN_RANGE (-__ERR_MSG_NOT_IN_RANGE) __ERR_MSG_DELETED, #define ERR_MSG_DELETED (-__ERR_MSG_DELETED) __ERR_INVALID_PASSWORD, #define ERR_INVALID_PASSWORD (-__ERR_INVALID_PASSWORD) __ERR_ALIAS_FILE_NOT_FOUND, #define ERR_ALIAS_FILE_NOT_FOUND (-__ERR_ALIAS_FILE_NOT_FOUND) __ERR_ALIAS_EXIST, #define ERR_ALIAS_EXIST (-__ERR_ALIAS_EXIST) __ERR_WRITE_ALIAS_FILE, #define ERR_WRITE_ALIAS_FILE (-__ERR_WRITE_ALIAS_FILE) __ERR_ALIAS_NOT_FOUND, #define ERR_ALIAS_NOT_FOUND (-__ERR_ALIAS_NOT_FOUND) __ERR_SVR_PRFILE_NOT_LOCKED, #define ERR_SVR_PRFILE_NOT_LOCKED (-__ERR_SVR_PRFILE_NOT_LOCKED) __ERR_GET_PEER_INFO, #define ERR_GET_PEER_INFO (-__ERR_GET_PEER_INFO) __ERR_SMTP_PATH_PARSE_ERROR, #define ERR_SMTP_PATH_PARSE_ERROR (-__ERR_SMTP_PATH_PARSE_ERROR) __ERR_BAD_RETURN_PATH, #define ERR_BAD_RETURN_PATH (-__ERR_BAD_RETURN_PATH) __ERR_BAD_EMAIL_ADDR, #define ERR_BAD_EMAIL_ADDR (-__ERR_BAD_EMAIL_ADDR) __ERR_RELAY_NOT_ALLOWED, #define ERR_RELAY_NOT_ALLOWED (-__ERR_RELAY_NOT_ALLOWED) __ERR_BAD_FORWARD_PATH, #define ERR_BAD_FORWARD_PATH (-__ERR_BAD_FORWARD_PATH) __ERR_GET_SOCK_INFO, #define ERR_GET_SOCK_INFO (-__ERR_GET_SOCK_INFO) __ERR_GET_SOCK_HOST, #define ERR_GET_SOCK_HOST (-__ERR_GET_SOCK_HOST) __ERR_NO_DOMAIN, #define ERR_NO_DOMAIN (-__ERR_NO_DOMAIN) __ERR_USER_NOT_LOCAL, #define ERR_USER_NOT_LOCAL (-__ERR_USER_NOT_LOCAL) __ERR_BAD_SERVER_ADDR, #define ERR_BAD_SERVER_ADDR (-__ERR_BAD_SERVER_ADDR) __ERR_BAD_SERVER_RESPONSE, #define ERR_BAD_SERVER_RESPONSE (-__ERR_BAD_SERVER_RESPONSE) __ERR_INVALID_POP3_RESPONSE, #define ERR_INVALID_POP3_RESPONSE (-__ERR_INVALID_POP3_RESPONSE) __ERR_LINKS_FILE_NOT_FOUND, #define ERR_LINKS_FILE_NOT_FOUND (-__ERR_LINKS_FILE_NOT_FOUND) __ERR_LINK_EXIST, #define ERR_LINK_EXIST (-__ERR_LINK_EXIST) __ERR_WRITE_LINKS_FILE, #define ERR_WRITE_LINKS_FILE (-__ERR_WRITE_LINKS_FILE) __ERR_LINK_NOT_FOUND, #define ERR_LINK_NOT_FOUND (-__ERR_LINK_NOT_FOUND) __ERR_SMTPGW_FILE_NOT_FOUND, #define ERR_SMTPGW_FILE_NOT_FOUND (-__ERR_SMTPGW_FILE_NOT_FOUND) __ERR_GATEWAY_ALREADY_EXIST, #define ERR_GATEWAY_ALREADY_EXIST (-__ERR_GATEWAY_ALREADY_EXIST) __ERR_GATEWAY_NOT_FOUND, #define ERR_GATEWAY_NOT_FOUND (-__ERR_GATEWAY_NOT_FOUND) __ERR_USER_NOT_MAILINGLIST, #define ERR_USER_NOT_MAILINGLIST (-__ERR_USER_NOT_MAILINGLIST) __ERR_NO_USER_MLTABLE_FILE, #define ERR_NO_USER_MLTABLE_FILE (-__ERR_NO_USER_MLTABLE_FILE) __ERR_MLUSER_ALREADY_EXIST, #define ERR_MLUSER_ALREADY_EXIST (-__ERR_MLUSER_ALREADY_EXIST) __ERR_MLUSER_NOT_FOUND, #define ERR_MLUSER_NOT_FOUND (-__ERR_MLUSER_NOT_FOUND) __ERR_SPOOL_FILE_NOT_FOUND, #define ERR_SPOOL_FILE_NOT_FOUND (-__ERR_SPOOL_FILE_NOT_FOUND) __ERR_INVALID_SPOOL_FILE, #define ERR_INVALID_SPOOL_FILE (-__ERR_INVALID_SPOOL_FILE) __ERR_SPOOL_FILE_EXPIRED, #define ERR_SPOOL_FILE_EXPIRED (-__ERR_SPOOL_FILE_EXPIRED) __ERR_SMTPRELAY_FILE_NOT_FOUND, #define ERR_SMTPRELAY_FILE_NOT_FOUND (-__ERR_SMTPRELAY_FILE_NOT_FOUND) __ERR_DOMAINS_FILE_NOT_FOUND, #define ERR_DOMAINS_FILE_NOT_FOUND (-__ERR_DOMAINS_FILE_NOT_FOUND) __ERR_DOMAIN_NOT_HANDLED, #define ERR_DOMAIN_NOT_HANDLED (-__ERR_DOMAIN_NOT_HANDLED) __ERR_BAD_SMTP_RESPONSE, #define ERR_BAD_SMTP_RESPONSE (-__ERR_BAD_SMTP_RESPONSE) __ERR_CFG_VAR_NOT_FOUND, #define ERR_CFG_VAR_NOT_FOUND (-__ERR_CFG_VAR_NOT_FOUND) __ERR_BAD_DNS_RESPONSE, #define ERR_BAD_DNS_RESPONSE (-__ERR_BAD_DNS_RESPONSE) __ERR_SMTPGW_NOT_FOUND, #define ERR_SMTPGW_NOT_FOUND (-__ERR_SMTPGW_NOT_FOUND) __ERR_INCOMPLETE_CONFIG, #define ERR_INCOMPLETE_CONFIG (-__ERR_INCOMPLETE_CONFIG) __ERR_MAIL_ERROR_LOOP, #define ERR_MAIL_ERROR_LOOP (-__ERR_MAIL_ERROR_LOOP) __ERR_EXTALIAS_FILE_NOT_FOUND, #define ERR_EXTALIAS_FILE_NOT_FOUND (-__ERR_EXTALIAS_FILE_NOT_FOUND) __ERR_EXTALIAS_EXIST, #define ERR_EXTALIAS_EXIST (-__ERR_EXTALIAS_EXIST) __ERR_WRITE_EXTALIAS_FILE, #define ERR_WRITE_EXTALIAS_FILE (-__ERR_WRITE_EXTALIAS_FILE) __ERR_EXTALIAS_NOT_FOUND, #define ERR_EXTALIAS_NOT_FOUND (-__ERR_EXTALIAS_NOT_FOUND) __ERR_NO_USER_DEFAULT_PRFILE, #define ERR_NO_USER_DEFAULT_PRFILE (-__ERR_NO_USER_DEFAULT_PRFILE) __ERR_FINGER_QUERY_FORMAT, #define ERR_FINGER_QUERY_FORMAT (-__ERR_FINGER_QUERY_FORMAT) __ERR_LOCKED_RESOURCE, #define ERR_LOCKED_RESOURCE (-__ERR_LOCKED_RESOURCE) __ERR_NO_PREDEFINED_MX, #define ERR_NO_PREDEFINED_MX (-__ERR_NO_PREDEFINED_MX) __ERR_NO_MORE_MXRECORDS, #define ERR_NO_MORE_MXRECORDS (-__ERR_NO_MORE_MXRECORDS) __ERR_INVALID_MESSAGE_FORMAT, #define ERR_INVALID_MESSAGE_FORMAT (-__ERR_INVALID_MESSAGE_FORMAT) __ERR_SMTP_BAD_MAIL_FROM, #define ERR_SMTP_BAD_MAIL_FROM (-__ERR_SMTP_BAD_MAIL_FROM) __ERR_SMTP_BAD_RCPT_TO, #define ERR_SMTP_BAD_RCPT_TO (-__ERR_SMTP_BAD_RCPT_TO) __ERR_SMTP_BAD_DATA, #define ERR_SMTP_BAD_DATA (-__ERR_SMTP_BAD_DATA) __ERR_INVALID_MXRECS_STRING, #define ERR_INVALID_MXRECS_STRING (-__ERR_INVALID_MXRECS_STRING) __ERR_SETSOCKOPT, #define ERR_SETSOCKOPT (-__ERR_SETSOCKOPT) __ERR_CREATEEVENT, #define ERR_CREATEEVENT (-__ERR_CREATEEVENT) __ERR_CREATESEMAPHORE, #define ERR_CREATESEMAPHORE (-__ERR_CREATESEMAPHORE) __ERR_CLOSEHANDLE, #define ERR_CLOSEHANDLE (-__ERR_CLOSEHANDLE) __ERR_RELEASESEMAPHORE, #define ERR_RELEASESEMAPHORE (-__ERR_RELEASESEMAPHORE) __ERR_BEGINTHREADEX, #define ERR_BEGINTHREADEX (-__ERR_BEGINTHREADEX) __ERR_CREATEFILEMAPPING, #define ERR_CREATEFILEMAPPING (-__ERR_CREATEFILEMAPPING) __ERR_MAPVIEWOFFILE, #define ERR_MAPVIEWOFFILE (-__ERR_MAPVIEWOFFILE) __ERR_UNMAPVIEWOFFILE, #define ERR_UNMAPVIEWOFFILE (-__ERR_UNMAPVIEWOFFILE) __ERR_SEMGET, #define ERR_SEMGET (-__ERR_SEMGET) __ERR_SEMCTL, #define ERR_SEMCTL (-__ERR_SEMCTL) __ERR_SEMOP, #define ERR_SEMOP (-__ERR_SEMOP) __ERR_FORK, #define ERR_FORK (-__ERR_FORK) __ERR_SHMGET, #define ERR_SHMGET (-__ERR_SHMGET) __ERR_SHMCTL, #define ERR_SHMCTL (-__ERR_SHMCTL) __ERR_SHMAT, #define ERR_SHMAT (-__ERR_SHMAT) __ERR_SHMDT, #define ERR_SHMDT (-__ERR_SHMDT) __ERR_OPENDIR, #define ERR_OPENDIR (-__ERR_OPENDIR) __ERR_STAT, #define ERR_STAT (-__ERR_STAT) __ERR_SMTP_BAD_CMD_SEQUENCE, #define ERR_SMTP_BAD_CMD_SEQUENCE (-__ERR_SMTP_BAD_CMD_SEQUENCE) __ERR_NO_ROOT_DOMAIN_VAR, #define ERR_NO_ROOT_DOMAIN_VAR (-__ERR_NO_ROOT_DOMAIN_VAR) __ERR_NS_NOT_FOUND, #define ERR_NS_NOT_FOUND (-__ERR_NS_NOT_FOUND) __ERR_NO_DEFINED_MXS_FOR_DOMAIN, #define ERR_NO_DEFINED_MXS_FOR_DOMAIN (-__ERR_NO_DEFINED_MXS_FOR_DOMAIN) __ERR_BAD_CTRL_COMMAND, #define ERR_BAD_CTRL_COMMAND (-__ERR_BAD_CTRL_COMMAND) __ERR_DOMAIN_ALREADY_HANDLED, #define ERR_DOMAIN_ALREADY_HANDLED (-__ERR_DOMAIN_ALREADY_HANDLED) __ERR_BAD_CTRL_LOGIN, #define ERR_BAD_CTRL_LOGIN (-__ERR_BAD_CTRL_LOGIN) __ERR_CTRL_ACCOUNTS_FILE_NOT_FOUND, #define ERR_CTRL_ACCOUNTS_FILE_NOT_FOUND (-__ERR_CTRL_ACCOUNTS_FILE_NOT_FOUND) __ERR_SPAMMER_IP, #define ERR_SPAMMER_IP (-__ERR_SPAMMER_IP) __ERR_TRUNCATED_DGRAM_DNS_RESPONSE, #define ERR_TRUNCATED_DGRAM_DNS_RESPONSE (-__ERR_TRUNCATED_DGRAM_DNS_RESPONSE) __ERR_NO_DGRAM_DNS_RESPONSE, #define ERR_NO_DGRAM_DNS_RESPONSE (-__ERR_NO_DGRAM_DNS_RESPONSE) __ERR_DNS_NOTFOUND, #define ERR_DNS_NOTFOUND (-__ERR_DNS_NOTFOUND) __ERR_BAD_SMARTDNSHOST_SYNTAX, #define ERR_BAD_SMARTDNSHOST_SYNTAX (-__ERR_BAD_SMARTDNSHOST_SYNTAX) __ERR_MAILBOX_SIZE, #define ERR_MAILBOX_SIZE (-__ERR_MAILBOX_SIZE) __ERR_DYNDNS_CONFIG, #define ERR_DYNDNS_CONFIG (-__ERR_DYNDNS_CONFIG) __ERR_PROCESS_EXECUTE, #define ERR_PROCESS_EXECUTE (-__ERR_PROCESS_EXECUTE) __ERR_BAD_MAILPROC_CMD_SYNTAX, #define ERR_BAD_MAILPROC_CMD_SYNTAX (-__ERR_BAD_MAILPROC_CMD_SYNTAX) __ERR_NO_MAILPROC_FILE, #define ERR_NO_MAILPROC_FILE (-__ERR_NO_MAILPROC_FILE) __ERR_DNS_RECURSION_NOT_AVAILABLE, #define ERR_DNS_RECURSION_NOT_AVAILABLE (-__ERR_DNS_RECURSION_NOT_AVAILABLE) __ERR_POP3_EXTERNAL_LINK_DISABLED, #define ERR_POP3_EXTERNAL_LINK_DISABLED (-__ERR_POP3_EXTERNAL_LINK_DISABLED) __ERR_BAD_DOMAIN_PROC_CMD_SYNTAX, #define ERR_BAD_DOMAIN_PROC_CMD_SYNTAX (-__ERR_BAD_DOMAIN_PROC_CMD_SYNTAX) __ERR_NOT_A_CUSTOM_DOMAIN, #define ERR_NOT_A_CUSTOM_DOMAIN (-__ERR_NOT_A_CUSTOM_DOMAIN) __ERR_NO_MORE_TOKENS, #define ERR_NO_MORE_TOKENS (-__ERR_NO_MORE_TOKENS) __ERR_SELECT, #define ERR_SELECT (-__ERR_SELECT) __ERR_REGISTER_EVENT_SOURCE, #define ERR_REGISTER_EVENT_SOURCE (-__ERR_REGISTER_EVENT_SOURCE) __ERR_NOMORESEMS, #define ERR_NOMORESEMS (-__ERR_NOMORESEMS) __ERR_INVALID_SEMAPHORE, #define ERR_INVALID_SEMAPHORE (-__ERR_INVALID_SEMAPHORE) __ERR_SHMEM_ALREADY_EXIST, #define ERR_SHMEM_ALREADY_EXIST (-__ERR_SHMEM_ALREADY_EXIST) __ERR_SHMEM_NOT_EXIST, #define ERR_SHMEM_NOT_EXIST (-__ERR_SHMEM_NOT_EXIST) __ERR_SEM_NOT_EXIST, #define ERR_SEM_NOT_EXIST (-__ERR_SEM_NOT_EXIST) __ERR_SERVER_BUSY, #define ERR_SERVER_BUSY (-__ERR_SERVER_BUSY) __ERR_IP_NOT_ALLOWED, #define ERR_IP_NOT_ALLOWED (-__ERR_IP_NOT_ALLOWED) __ERR_FILE_EOF, #define ERR_FILE_EOF (-__ERR_FILE_EOF) __ERR_BAD_TAG_ADDRESS, #define ERR_BAD_TAG_ADDRESS (-__ERR_BAD_TAG_ADDRESS) __ERR_MAILFROM_UNKNOWN, #define ERR_MAILFROM_UNKNOWN (-__ERR_MAILFROM_UNKNOWN) __ERR_FILTERED_MESSAGE, #define ERR_FILTERED_MESSAGE (-__ERR_FILTERED_MESSAGE) __ERR_NO_DOMAIN_FILTER, #define ERR_NO_DOMAIN_FILTER (-__ERR_NO_DOMAIN_FILTER) __ERR_POP3_RETR_BROKEN, #define ERR_POP3_RETR_BROKEN (-__ERR_POP3_RETR_BROKEN) __ERR_CCLN_INVALID_RESPONSE, #define ERR_CCLN_INVALID_RESPONSE (-__ERR_CCLN_INVALID_RESPONSE) __ERR_CCLN_ERROR_RESPONSE, #define ERR_CCLN_ERROR_RESPONSE (-__ERR_CCLN_ERROR_RESPONSE) __ERR_INCOMPLETE_PROCESSING, #define ERR_INCOMPLETE_PROCESSING (-__ERR_INCOMPLETE_PROCESSING) __ERR_NO_EXTERNAL_AUTH_DEFINED, #define ERR_NO_EXTERNAL_AUTH_DEFINED (-__ERR_NO_EXTERNAL_AUTH_DEFINED) __ERR_EXTERNAL_AUTH_FAILURE, #define ERR_EXTERNAL_AUTH_FAILURE (-__ERR_EXTERNAL_AUTH_FAILURE) __ERR_MD5_AUTH_FAILED, #define ERR_MD5_AUTH_FAILED (-__ERR_MD5_AUTH_FAILED) __ERR_NO_SMTP_AUTH_CONFIG, #define ERR_NO_SMTP_AUTH_CONFIG (-__ERR_NO_SMTP_AUTH_CONFIG) __ERR_UNKNOWN_SMTP_AUTH, #define ERR_UNKNOWN_SMTP_AUTH (-__ERR_UNKNOWN_SMTP_AUTH) __ERR_BAD_SMTP_AUTH_CONFIG, #define ERR_BAD_SMTP_AUTH_CONFIG (-__ERR_BAD_SMTP_AUTH_CONFIG) __ERR_BAD_EXTRNPRG_EXITCODE, #define ERR_BAD_EXTRNPRG_EXITCODE (-__ERR_BAD_EXTRNPRG_EXITCODE) __ERR_BAD_SMTP_CMD_SYNTAX, #define ERR_BAD_SMTP_CMD_SYNTAX (-__ERR_BAD_SMTP_CMD_SYNTAX) __ERR_SMTP_AUTH_FAILED, #define ERR_SMTP_AUTH_FAILED (-__ERR_SMTP_AUTH_FAILED) __ERR_BAD_SMTP_EXTAUTH_RESPONSE_FILE, #define ERR_BAD_SMTP_EXTAUTH_RESPONSE_FILE (-__ERR_BAD_SMTP_EXTAUTH_RESPONSE_FILE) __ERR_SMTP_USE_FORBIDDEN, #define ERR_SMTP_USE_FORBIDDEN (-__ERR_SMTP_USE_FORBIDDEN) __ERR_SPAM_ADDRESS, #define ERR_SPAM_ADDRESS (-__ERR_SPAM_ADDRESS) __ERR_SOCK_NOMORE_DATA, #define ERR_SOCK_NOMORE_DATA (-__ERR_SOCK_NOMORE_DATA) __ERR_BAD_TAB_INDEX_FIELD, #define ERR_BAD_TAB_INDEX_FIELD (-__ERR_BAD_TAB_INDEX_FIELD) __ERR_FILE_READ, #define ERR_FILE_READ (-__ERR_FILE_READ) __ERR_BAD_INDEX_FILE, #define ERR_BAD_INDEX_FILE (-__ERR_BAD_INDEX_FILE) __ERR_INDEX_HASH_NOT_FOUND, #define ERR_INDEX_HASH_NOT_FOUND (-__ERR_INDEX_HASH_NOT_FOUND) __ERR_RECORD_NOT_FOUND, #define ERR_RECORD_NOT_FOUND (-__ERR_RECORD_NOT_FOUND) __ERR_HEAP_ALLOC, #define ERR_HEAP_ALLOC (-__ERR_HEAP_ALLOC) __ERR_HEAP_FREE, #define ERR_HEAP_FREE (-__ERR_HEAP_FREE) __ERR_RESOURCE_NOT_LOCKED, #define ERR_RESOURCE_NOT_LOCKED (-__ERR_RESOURCE_NOT_LOCKED) __ERR_LOCK_ENTRY_NOT_FOUND, #define ERR_LOCK_ENTRY_NOT_FOUND (-__ERR_LOCK_ENTRY_NOT_FOUND) __ERR_LINE_TOO_LONG, #define ERR_LINE_TOO_LONG (-__ERR_LINE_TOO_LONG) __ERR_MAIL_LOOP_DETECTED, #define ERR_MAIL_LOOP_DETECTED (-__ERR_MAIL_LOOP_DETECTED) __ERR_FILE_MOVE, #define ERR_FILE_MOVE (-__ERR_FILE_MOVE) __ERR_INVALID_MAILDIR_SUBPATH, #define ERR_INVALID_MAILDIR_SUBPATH (-__ERR_INVALID_MAILDIR_SUBPATH) __ERR_SMTP_TOO_MANY_RECIPIENTS, #define ERR_SMTP_TOO_MANY_RECIPIENTS (-__ERR_SMTP_TOO_MANY_RECIPIENTS) __ERR_DNS_CACHE_FILE_FMT, #define ERR_DNS_CACHE_FILE_FMT (-__ERR_DNS_CACHE_FILE_FMT) __ERR_DNS_CACHE_FILE_EXPIRED, #define ERR_DNS_CACHE_FILE_EXPIRED (-__ERR_DNS_CACHE_FILE_EXPIRED) __ERR_MMAP, #define ERR_MMAP (-__ERR_MMAP) __ERR_NOT_LOCKED, #define ERR_NOT_LOCKED (-__ERR_NOT_LOCKED) __ERR_SMTPFWD_FILE_NOT_FOUND, #define ERR_SMTPFWD_FILE_NOT_FOUND (-__ERR_SMTPFWD_FILE_NOT_FOUND) __ERR_SMTPFWD_NOT_FOUND, #define ERR_SMTPFWD_NOT_FOUND (-__ERR_SMTPFWD_NOT_FOUND) __ERR_USER_BREAK, #define ERR_USER_BREAK (-__ERR_USER_BREAK) __ERR_SET_THREAD_PRIORITY, #define ERR_SET_THREAD_PRIORITY (-__ERR_SET_THREAD_PRIORITY) __ERR_NULL_SENDER, #define ERR_NULL_SENDER (-__ERR_NULL_SENDER) __ERR_RCPTTO_UNKNOWN, #define ERR_RCPTTO_UNKNOWN (-__ERR_RCPTTO_UNKNOWN) __ERR_LOADMODULE, #define ERR_LOADMODULE (-__ERR_LOADMODULE) __ERR_LOADMODULESYMBOL, #define ERR_LOADMODULESYMBOL (-__ERR_LOADMODULESYMBOL) __ERR_NOMORE_TLSKEYS, #define ERR_NOMORE_TLSKEYS (-__ERR_NOMORE_TLSKEYS) __ERR_INVALID_TLSKEY, #define ERR_INVALID_TLSKEY (-__ERR_INVALID_TLSKEY) __ERR_ERRORINIT_FAILED, #define ERR_ERRORINIT_FAILED (-__ERR_ERRORINIT_FAILED) __ERR_SENDFILE, #define ERR_SENDFILE (-__ERR_SENDFILE) __ERR_MUTEXINIT, #define ERR_MUTEXINIT (-__ERR_MUTEXINIT) __ERR_CONDINIT, #define ERR_CONDINIT (-__ERR_CONDINIT) __ERR_THREADCREATE, #define ERR_THREADCREATE (-__ERR_THREADCREATE) __ERR_CREATEMUTEX, #define ERR_CREATEMUTEX (-__ERR_CREATEMUTEX) __ERR_NO_LOCAL_SPOOL_FILES, #define ERR_NO_LOCAL_SPOOL_FILES (-__ERR_NO_LOCAL_SPOOL_FILES) __ERR_NO_HANDLED_DOMAIN, #define ERR_NO_HANDLED_DOMAIN (-__ERR_NO_HANDLED_DOMAIN) __ERR_INVALID_MAIL_DOMAIN, #define ERR_INVALID_MAIL_DOMAIN (-__ERR_INVALID_MAIL_DOMAIN) __ERR_BAD_CMDSTR_CHARS, #define ERR_BAD_CMDSTR_CHARS (-__ERR_BAD_CMDSTR_CHARS) __ERR_FETCHMSG_UNDELIVERED, #define ERR_FETCHMSG_UNDELIVERED (-__ERR_FETCHMSG_UNDELIVERED) __ERR_USER_VAR_NOT_FOUND, #define ERR_USER_VAR_NOT_FOUND (-__ERR_USER_VAR_NOT_FOUND) __ERR_NO_POP3_IP, #define ERR_NO_POP3_IP (-__ERR_NO_POP3_IP) __ERR_NO_MESSAGE_FILE, #define ERR_NO_MESSAGE_FILE (-__ERR_NO_MESSAGE_FILE) __ERR_GET_DISK_SPACE_INFO, #define ERR_GET_DISK_SPACE_INFO (-__ERR_GET_DISK_SPACE_INFO) __ERR_GET_MEMORY_INFO, #define ERR_GET_MEMORY_INFO (-__ERR_GET_MEMORY_INFO) __ERR_LOW_DISK_SPACE, #define ERR_LOW_DISK_SPACE (-__ERR_LOW_DISK_SPACE) __ERR_LOW_VM_SPACE, #define ERR_LOW_VM_SPACE (-__ERR_LOW_VM_SPACE) __ERR_USER_DISABLED, #define ERR_USER_DISABLED (-__ERR_USER_DISABLED) __ERR_BAD_DNS_NAME_RECORD, #define ERR_BAD_DNS_NAME_RECORD (-__ERR_BAD_DNS_NAME_RECORD) __ERR_MESSAGE_SIZE, #define ERR_MESSAGE_SIZE (-__ERR_MESSAGE_SIZE) __ERR_SMTPSRV_MSG_SIZE, #define ERR_SMTPSRV_MSG_SIZE (-__ERR_SMTPSRV_MSG_SIZE) __ERR_MAPS_CONTAINED, #define ERR_MAPS_CONTAINED (-__ERR_MAPS_CONTAINED) __ERR_ADOMAIN_FILE_NOT_FOUND, #define ERR_ADOMAIN_FILE_NOT_FOUND (-__ERR_ADOMAIN_FILE_NOT_FOUND) __ERR_ADOMAIN_EXIST, #define ERR_ADOMAIN_EXIST (-__ERR_ADOMAIN_EXIST) __ERR_ADOMAIN_NOT_FOUND, #define ERR_ADOMAIN_NOT_FOUND (-__ERR_ADOMAIN_NOT_FOUND) __ERR_NOT_A_CMD_ALIAS, #define ERR_NOT_A_CMD_ALIAS (-__ERR_NOT_A_CMD_ALIAS) __ERR_GETSOCKOPT, #define ERR_GETSOCKOPT (-__ERR_GETSOCKOPT) __ERR_NO_HDR_FETCH_TAGS, #define ERR_NO_HDR_FETCH_TAGS (-__ERR_NO_HDR_FETCH_TAGS) __ERR_SET_FILE_TIME, #define ERR_SET_FILE_TIME (-__ERR_SET_FILE_TIME) __ERR_LISTDIR_NOT_FOUND, #define ERR_LISTDIR_NOT_FOUND (-__ERR_LISTDIR_NOT_FOUND) __ERR_DUPLICATE_HANDLE, #define ERR_DUPLICATE_HANDLE (-__ERR_DUPLICATE_HANDLE) __ERR_EMPTY_LOG, #define ERR_EMPTY_LOG (-__ERR_EMPTY_LOG) __ERR_BAD_RELATIVE_PATH, #define ERR_BAD_RELATIVE_PATH (-__ERR_BAD_RELATIVE_PATH) __ERR_DNS_NXDOMAIN, #define ERR_DNS_NXDOMAIN (-__ERR_DNS_NXDOMAIN) __ERR_BAD_RFCNAME, #define ERR_BAD_RFCNAME (-__ERR_BAD_RFCNAME) __ERR_CONNECT, #define ERR_CONNECT (-__ERR_CONNECT) __ERR_MESSAGE_DELETED, #define ERR_MESSAGE_DELETED (-__ERR_MESSAGE_DELETED) __ERR_PIPE, #define ERR_PIPE (-__ERR_PIPE) __ERR_WAITPID, #define ERR_WAITPID (-__ERR_WAITPID) __ERR_MUNMAP, #define ERR_MUNMAP (-__ERR_MUNMAP) __ERR_INVALID_MMAP_OFFSET, #define ERR_INVALID_MMAP_OFFSET (-__ERR_INVALID_MMAP_OFFSET) __ERR_UNMAPFILEVIEW, #define ERR_UNMAPFILEVIEW (-__ERR_UNMAPFILEVIEW) __ERR_INVALID_IMAP_LINE, #define ERR_INVALID_IMAP_LINE (-__ERR_INVALID_IMAP_LINE) __ERR_IMAP_RESP_NO, #define ERR_IMAP_RESP_NO (-__ERR_IMAP_RESP_NO) __ERR_IMAP_RESP_BAD, #define ERR_IMAP_RESP_BAD (-__ERR_IMAP_RESP_BAD) __ERR_IMAP_RESP_BYE, #define ERR_IMAP_RESP_BYE (-__ERR_IMAP_RESP_BYE) __ERR_IMAP_UNKNOWN_AUTH, #define ERR_IMAP_UNKNOWN_AUTH (-__ERR_IMAP_UNKNOWN_AUTH) __ERR_NO_MESSAGE_AUTH, #define ERR_NO_MESSAGE_AUTH (-__ERR_NO_MESSAGE_AUTH) __ERR_INVALID_PARAMETER, #define ERR_INVALID_PARAMETER (-__ERR_INVALID_PARAMETER) __ERR_ALREADY_EXIST, #define ERR_ALREADY_EXIST (-__ERR_ALREADY_EXIST) __ERR_SSLCTX_CREATE, #define ERR_SSLCTX_CREATE (-__ERR_SSLCTX_CREATE) __ERR_SSL_CREATE, #define ERR_SSL_CREATE (-__ERR_SSL_CREATE) __ERR_SSL_CONNECT, #define ERR_SSL_CONNECT (-__ERR_SSL_CONNECT) __ERR_SSL_SETCERT, #define ERR_SSL_SETCERT (-__ERR_SSL_SETCERT) __ERR_SSL_SETKEY, #define ERR_SSL_SETKEY (-__ERR_SSL_SETKEY) __ERR_SSL_READ, #define ERR_SSL_READ (-__ERR_SSL_READ) __ERR_SSL_WRITE, #define ERR_SSL_WRITE (-__ERR_SSL_WRITE) __ERR_SSL_CERT_VALIDATE, #define ERR_SSL_CERT_VALIDATE (-__ERR_SSL_CERT_VALIDATE) __ERR_SSL_NOCERT, #define ERR_SSL_NOCERT (-__ERR_SSL_NOCERT) __ERR_NO_REMOTE_SSL, #define ERR_NO_REMOTE_SSL (-__ERR_NO_REMOTE_SSL) __ERR_SSL_ALREADY_ACTIVE, #define ERR_SSL_ALREADY_ACTIVE (-__ERR_SSL_ALREADY_ACTIVE) __ERR_SSL_CHECKKEY, #define ERR_SSL_CHECKKEY (-__ERR_SSL_CHECKKEY) __ERR_SSL_VERPATHS, #define ERR_SSL_VERPATHS (-__ERR_SSL_VERPATHS) __ERR_TLS_MODE_REQUIRED, #define ERR_TLS_MODE_REQUIRED (-__ERR_TLS_MODE_REQUIRED) __ERR_NOT_FOUND, #define ERR_NOT_FOUND (-__ERR_NOT_FOUND) __ERR_NOREMOTE_POP3_UIDL, #define ERR_NOREMOTE_POP3_UIDL (-__ERR_NOREMOTE_POP3_UIDL) __ERR_CORRUPTED, #define ERR_CORRUPTED (-__ERR_CORRUPTED) __ERR_SSL_DISABLED, #define ERR_SSL_DISABLED (-__ERR_SSL_DISABLED) __ERR_SSL_ACCEPT, #define ERR_SSL_ACCEPT (-__ERR_SSL_ACCEPT) __ERR_BAD_SEQUENCE, #define ERR_BAD_SEQUENCE (-__ERR_BAD_SEQUENCE) __ERR_EMPTY_ADDRESS, #define ERR_EMPTY_ADDRESS (-__ERR_EMPTY_ADDRESS) __ERR_DNS_MAXDEPTH, #define ERR_DNS_MAXDEPTH (-__ERR_DNS_MAXDEPTH) __ERR_THREAD_SETSTACK, #define ERR_THREAD_SETSTACK (-__ERR_THREAD_SETSTACK) __ERR_DNS_FORMAT, #define ERR_DNS_FORMAT (-__ERR_DNS_FORMAT) __ERR_DNS_SVRFAIL, #define ERR_DNS_SVRFAIL (-__ERR_DNS_SVRFAIL) __ERR_DNS_NOTSUPPORTED, #define ERR_DNS_NOTSUPPORTED (-__ERR_DNS_NOTSUPPORTED) __ERR_DNS_REFUSED, #define ERR_DNS_REFUSED (-__ERR_DNS_REFUSED) __ERR_INVALID_RELAY_ADDRESS, #define ERR_INVALID_RELAY_ADDRESS (-__ERR_INVALID_RELAY_ADDRESS) __ERR_INVALID_HOSTNAME, #define ERR_INVALID_HOSTNAME (-__ERR_INVALID_HOSTNAME) __ERR_INVALID_INET_ADDR, #define ERR_INVALID_INET_ADDR (-__ERR_INVALID_INET_ADDR) __ERR_SOCKET_SHUTDOWN, #define ERR_SOCKET_SHUTDOWN (-__ERR_SOCKET_SHUTDOWN) __ERR_SSL_SHUTDOWN, #define ERR_SSL_SHUTDOWN (-__ERR_SSL_SHUTDOWN) __ERR_TOO_MANY_ELEMENTS, #define ERR_TOO_MANY_ELEMENTS (-__ERR_TOO_MANY_ELEMENTS) __ERR_GET_RAND_BYTES, #define ERR_GET_RAND_BYTES (-__ERR_GET_RAND_BYTES) __ERR_WAIT, #define ERR_WAIT (-__ERR_WAIT) __ERR_EVENTFD, #define ERR_EVENTFD (-__ERR_EVENTFD) __ERR_TOO_BIG, #define ERR_TOO_BIG (-__ERR_TOO_BIG) ERROR_COUNT }; int ErrGetErrorCode(void); int ErrSetErrorCode(int iError, char const *pszInfo = NULL, int iSize = -1); const char *ErrGetErrorString(int iError); const char *ErrGetErrorString(void); char *ErrGetErrorStringInfo(int iError); int ErrLogMessage(int iLogLevel, char const *pszFormat, ...); int ErrFileLogString(char const *pszFileName, char const *pszMessage); #endif xmail-1.27/SysTypes.h0000644000175000017500000000255111341640430014002 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _SYSTYPES_H #define _SYSTYPES_H #ifdef WIN32 #include "SysTypesWin.h" #else // #ifdef WIN32 #ifdef __LINUX__ #include "SysTypesLinux.h" #else // #ifdef __LINUX__ #ifdef __SOLARIS__ #include "SysTypesSolaris.h" #else // #ifdef __SOLARIS__ #ifdef __BSD__ #include "SysTypesBSD.h" #else // #ifdef __BSD__ #error System type not defined #endif // #ifdef __BSD__ #endif // #ifdef __SOLARIS__ #endif // #ifdef __LINUX__ #endif // #ifdef WIN32 #endif xmail-1.27/DNSCache.cpp0000644000175000017500000002044111341640430014100 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "ShBlocks.h" #include "ResLocks.h" #include "StrUtils.h" #include "BuffSock.h" #include "SList.h" #include "MailConfig.h" #include "MessQueue.h" #include "MailSvr.h" #include "MiscUtils.h" #include "SvrUtils.h" #include "DNS.h" #include "DNSCache.h" #define DNS_CACHE_DIRCTORY "dnscache" #define DNS_MX_CACHE_DIRCTORY "mx" #define DNS_NS_CACHE_DIRCTORY "ns" #define DNS_CACHE_LINE_MAX 2048 static int iNumCacheDirs = DNS_HASH_NUM_DIRS; static int CDNS_CleanupPath(char const *pszCachePath) { return 0; } int CDNS_Initialize(int iCacheDirCount) { while (!IsPrimeNumber(iCacheDirCount)) ++iCacheDirCount; iNumCacheDirs = iCacheDirCount; /* Setup cache subdirectories */ char szCacheBasePath[SYS_MAX_PATH] = ""; CfgGetRootPath(szCacheBasePath, sizeof(szCacheBasePath)); StrNCat(szCacheBasePath, DNS_CACHE_DIRCTORY, sizeof(szCacheBasePath)); AppendSlash(szCacheBasePath); for (int ii = 0; ii < iNumCacheDirs; ii++) { /* Setup MX cache subdirectories */ char szCachePath[SYS_MAX_PATH] = ""; sprintf(szCachePath, "%s%s" SYS_SLASH_STR "%d", szCacheBasePath, DNS_MX_CACHE_DIRCTORY, ii); if (SysExistDir(szCachePath)) { if (CDNS_CleanupPath(szCachePath) < 0) return ErrGetErrorCode(); } else { if (SysMakeDir(szCachePath) < 0) return ErrGetErrorCode(); } /* Setup NS cache subdirectories */ } return 0; } static char *CDNS_GetCacheFilePath(char const *pszDomain, char const *pszSubDir, char *pszFilePath) { char szRootPath[SYS_MAX_PATH] = ""; CfgGetRootPath(szRootPath, sizeof(szRootPath)); /* Calculate domain string hash */ char *pszLwrDomain = SysStrDup(pszDomain); if (pszLwrDomain == NULL) return NULL; StrLower(pszLwrDomain); unsigned long ulStringHash = MscHashString(pszLwrDomain, strlen(pszLwrDomain)); /* Build cache file path */ SysSNPrintf(pszFilePath, SYS_MAX_PATH - 1, "%s%s" SYS_SLASH_STR "%s" SYS_SLASH_STR "%u" SYS_SLASH_STR "%s", szRootPath, DNS_CACHE_DIRCTORY, pszSubDir, (unsigned int) (ulStringHash % iNumCacheDirs), pszLwrDomain); SysFree(pszLwrDomain); return pszFilePath; } static int CDNS_MxLoad(char const *pszDomain, char *&pszMXDomains) { /* Build cached file path */ char szFilePath[SYS_MAX_PATH] = ""; if (CDNS_GetCacheFilePath(pszDomain, DNS_MX_CACHE_DIRCTORY, szFilePath) == NULL) return ErrGetErrorCode(); /* Try to get file infos */ SYS_FILE_INFO FI; if (SysGetFileInfo(szFilePath, FI) < 0) return ErrGetErrorCode(); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockSH(CfgGetBasedPath(szFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pCacheFile = fopen(szFilePath, "rt"); if (pCacheFile == NULL) { RLckUnlockSH(hResLock); ErrSetErrorCode(ERR_FILE_OPEN); return ERR_FILE_OPEN; } /* Read TTL line ( 1st ) and check if it's time expired */ char szCacheLine[DNS_CACHE_LINE_MAX] = ""; if (MscFGets(szCacheLine, sizeof(szCacheLine) - 1, pCacheFile) == NULL) { fclose(pCacheFile); RLckUnlockSH(hResLock); ErrSetErrorCode(ERR_DNS_CACHE_FILE_FMT); return ERR_DNS_CACHE_FILE_FMT; } unsigned long ulCurTime = (unsigned long) time(NULL); unsigned long ulTTL = (unsigned long) atol(szCacheLine); if (ulCurTime > ((unsigned long) FI.tMod + ulTTL)) { fclose(pCacheFile); RLckUnlockSH(hResLock); ErrSetErrorCode(ERR_DNS_CACHE_FILE_EXPIRED); return ERR_DNS_CACHE_FILE_EXPIRED; } /* Read MX domains line ( 2nd ) */ if (MscFGets(szCacheLine, sizeof(szCacheLine) - 1, pCacheFile) == NULL) { fclose(pCacheFile); RLckUnlockSH(hResLock); ErrSetErrorCode(ERR_DNS_CACHE_FILE_FMT); return ERR_DNS_CACHE_FILE_FMT; } if ((pszMXDomains = SysStrDup(szCacheLine)) == NULL) { ErrorPush(); fclose(pCacheFile); RLckUnlockSH(hResLock); return ErrorPop(); } fclose(pCacheFile); RLckUnlockSH(hResLock); return 0; } static int CDNS_MxSave(char const *pszDomain, char const *pszMXDomains, SYS_UINT32 TTL) { /* Build cached file path */ char szFilePath[SYS_MAX_PATH] = ""; if (CDNS_GetCacheFilePath(pszDomain, DNS_MX_CACHE_DIRCTORY, szFilePath) == NULL) return ErrGetErrorCode(); char szResLock[SYS_MAX_PATH] = ""; RLCK_HANDLE hResLock = RLckLockEX(CfgGetBasedPath(szFilePath, szResLock, sizeof(szResLock))); if (hResLock == INVALID_RLCK_HANDLE) return ErrGetErrorCode(); FILE *pCacheFile = fopen(szFilePath, "wt"); if (pCacheFile == NULL) { RLckUnlockEX(hResLock); ErrSetErrorCode(ERR_FILE_CREATE, szFilePath); return ERR_FILE_CREATE; } /* 1st line (TTL) */ fprintf(pCacheFile, "%lu\n", (unsigned long) TTL); /* 2nd line (MX domains) */ fprintf(pCacheFile, "%s\n", pszMXDomains); fclose(pCacheFile); RLckUnlockEX(hResLock); return 0; } static int CDNS_BuildStrMX(DNSAnswer *pAns, char *&pszMXDomains, SYS_UINT32 *pTTL) { SysListHead *pLnk; DNSRecord *pRec; DynString DynMX; if (StrDynInit(&DynMX) < 0) return ErrGetErrorCode(); for (pLnk = SYS_LIST_FIRST(&pAns->RecsLst[QTYPE_MX]); pLnk != NULL; pLnk = SYS_LIST_NEXT(pLnk, &pAns->RecsLst[QTYPE_MX])) { pRec = SYS_LIST_ENTRY(pLnk, DNSRecord, Lnk); if (StrDynSize(&DynMX) > 0) StrDynAdd(&DynMX, ","); if (StrDynPrint(&DynMX, "%u:%s", (unsigned int) pRec->U.MX.Pref, pRec->U.MX.szName) < 0) { StrDynFree(&DynMX); return ErrGetErrorCode(); } *pTTL = pRec->TTL; } if (StrDynSize(&DynMX) == 0) { StrDynFree(&DynMX); ErrSetErrorCode(ERR_DNS_NOTFOUND); return ERR_DNS_NOTFOUND; } pszMXDomains = StrDynDrop(&DynMX, NULL); return 0; } static int CDNS_QueryMX(char const *pszDomain, char *&pszMXDomains, SYS_UINT32 *pTTL) { int iError; DNSAnswer Ans; if (DNS_Query(pszDomain, QTYPE_MX, &Ans) < 0) return ErrGetErrorCode(); iError = CDNS_BuildStrMX(&Ans, pszMXDomains, pTTL); DNS_FreeAnswer(&Ans); return iError; } static int CDNS_QueryDirectMX(char const *pszDNSServer, char const *pszDomain, int iQuerySockType, char *&pszMXDomains, SYS_UINT32 *pTTL) { int iError; DNSAnswer Ans; if (DNS_QueryDirect(pszDNSServer, pszDomain, QTYPE_MX, iQuerySockType, &Ans) < 0) return ErrGetErrorCode(); iError = CDNS_BuildStrMX(&Ans, pszMXDomains, pTTL); DNS_FreeAnswer(&Ans); return iError; } int CDNS_GetDomainMX(char const *pszDomain, char *&pszMXDomains, char const *pszSmartDNS) { /* Try to get the cached copy */ if (CDNS_MxLoad(pszDomain, pszMXDomains) == 0) return 0; /* If the list of smart DNS hosts is NULL, do a full DNS query */ SYS_UINT32 TTL = 0; if (pszSmartDNS == NULL) { if (CDNS_QueryMX(pszDomain, pszMXDomains, &TTL) < 0) return ErrGetErrorCode(); CDNS_MxSave(pszDomain, pszMXDomains, TTL); return 0; } /* Parse the list of smart DNS hosts */ char **ppszTokens = StrTokenize(pszSmartDNS, ",:"); if (ppszTokens == NULL) return ErrGetErrorCode(); int iTokensCount = StrStringsCount(ppszTokens); if (iTokensCount < 2) { StrFreeStrings(ppszTokens); ErrSetErrorCode(ERR_BAD_SMARTDNSHOST_SYNTAX); return ERR_BAD_SMARTDNSHOST_SYNTAX; } /* Walk through the list of smart DNS hosts to find a DNS response */ for (int i = 0; i < (iTokensCount - 1); i += 2) { int iType = (stricmp(ppszTokens[i + 1], "tcp") == 0) ? DNS_QUERY_TCP: DNS_QUERY_UDP; if (CDNS_QueryDirectMX(ppszTokens[i], pszDomain, iType, pszMXDomains, &TTL) == 0) { StrFreeStrings(ppszTokens); CDNS_MxSave(pszDomain, pszMXDomains, TTL); return 0; } } StrFreeStrings(ppszTokens); return ErrGetErrorCode(); } xmail-1.27/ToDo.txt0000644000175000017500000000237711341640430013442 0ustar davidedavide < XMail Server ToDo List > Long term : 1) GUI ( Qt or GTK for Linux and Win32 for Windows or Tk for both ) for remote server administration 2) Web administration of server 3) Implementation of IMAP server protocol -- Version 0.1 : Date 11-10-1999 1) Implementation of server administration protocol 2) Documentation and file specifications 3) Creation of "configure" script to enable a better platform porting 4) Mailbox size checking 5) Multiple mail redirection 6) Sure a lot of other features that I can't figure out for now -- Version 0.2 : Date 02-02-2000 1) Documentation and file specifications 2) Creation of "configure" script to enable a better platform porting 3) Mailbox size checking 4) Multiple mail redirection 5) Sure a lot of other features that I can't figure out for now -- Version 0.28 : Date 28-02-2000 1) Documentation and file specifications 2) Creation of "configure" script to enable a better platform porting 3) Multiple mail redirection 4) Sure a lot of other features that I can't figure out for now -- Version 0.34 : Date 10-03-2000 1) Documentation and file specifications 2) Creation of "configure" script to enable a better platform porting 3) Package creation ( .deb ) 4) Sure a lot of other features that I can't figure out for now xmail-1.27/MainBSD.cpp0000644000175000017500000001240111341640430013742 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "SList.h" #include "ShBlocks.h" #include "UsrUtils.h" #include "SvrUtils.h" #include "MessQueue.h" #include "SMAILUtils.h" #include "QueueUtils.h" #include "AppDefines.h" #include "MailSvr.h" #define RUNNING_PIDS_DIR "/var/run" #define DEVNULL "/dev/null" #if !defined(NOFILE) #define NOFILE 64 #endif /* !NOFILE */ #define XMAIL_DEBUG_OPTION "-Md" #define XMAIL_PIDDIR_ENV "XMAIL_PID_DIR" #if (defined(__GLIBC__) && defined (__FreeBSD_kernel__)) || defined(__DARWIN_10_5__) #define BSD_SETPGRP() setpgrp() #else #define BSD_SETPGRP() setpgrp(0, getpid()) #endif static int MnEventLog(char const *pszFormat, ...) { va_list Args; char szBuffer[2048]; openlog(APP_NAME_STR, LOG_PID, LOG_DAEMON); va_start(Args, pszFormat); vsnprintf(szBuffer, sizeof(szBuffer) - 1, pszFormat, Args); syslog(LOG_ERR, "%s", szBuffer); va_end(Args); closelog(); return 0; } static char const *MnGetPIDDir(void) { char const *pszPIDDir = getenv(XMAIL_PIDDIR_ENV); return pszPIDDir != NULL ? pszPIDDir: RUNNING_PIDS_DIR; } static int MnSavePID(char const *pszPidFile) { char szPidFile[SYS_MAX_PATH]; snprintf(szPidFile, sizeof(szPidFile) - 1, "%s/%s.pid", MnGetPIDDir(), pszPidFile); FILE *pFile = fopen(szPidFile, "w"); if (pFile == NULL) { perror(szPidFile); return -errno; } fprintf(pFile, "%u", (unsigned int) getpid()); fclose(pFile); return 0; } static int MnRemovePID(char const *pszPidFile) { char szPidFile[SYS_MAX_PATH]; snprintf(szPidFile, sizeof(szPidFile) - 1, "%s/%s.pid", MnGetPIDDir(), pszPidFile); if (unlink(szPidFile) != 0) { perror(szPidFile); return -errno; } return 0; } static void MnSIGCLD(int iSignal) { int iExitStatus, iDeadPID; while ((iDeadPID = wait3(&iExitStatus, WNOHANG, (struct rusage *) NULL)) > 0); signal(iSignal, MnSIGCLD); } static void MnSetupStdHandles(void) { int iFD = open(DEVNULL, O_RDWR, 0); if (iFD == -1) { MnEventLog("Cannot open file %s : %s", DEVNULL, strerror(errno)); exit(errno); } if (dup2(iFD, 0) == -1 || dup2(iFD, 1) == -1 || dup2(iFD, 2) == -1) { MnEventLog("File descriptor duplication error : %s", strerror(errno)); exit(errno); } if (iFD > 2) close(iFD); } static int MnDaemonBootStrap(void) { /* * This code is inspired from the code of the great Richard Stevens books. * May You RIP in programmers paradise great Richard. * I suggest You to buy all his collection, soon! */ #ifdef SIGTTOU signal(SIGTTOU, SIG_IGN); #endif #ifdef SIGTTIN signal(SIGTTIN, SIG_IGN); #endif #ifdef SIGTSTP signal(SIGTSTP, SIG_IGN); #endif /* 1st fork */ int iChildPID = fork(); if (iChildPID < 0) { MnEventLog("Cannot fork : %s", strerror(errno)); exit(errno); } else if (iChildPID > 0) exit(0); /* * Disassociate from controlling terminal and process group. * Ensure the process can't reacquire a new controlling terminal. */ if (BSD_SETPGRP() == -1) { MnEventLog("Can't change process group : %s", strerror(errno)); exit(errno); } /* Lose controlling tty */ int iFdTty = open("/dev/tty", O_RDWR); if (iFdTty >= 0) { ioctl(iFdTty, TIOCNOTTY, (char *) NULL); close(iFdTty); } /* Close open file descriptors */ for (int fd = 0; fd < NOFILE; fd++) close(fd); /* Set std handles */ MnSetupStdHandles(); /* Probably got set to EBADF from a close */ errno = 0; /* Move the current directory to root, to make sure we aren't on a mounted */ /* filesystem. */ chdir("/"); /* Clear any inherited file mode creation mask. */ umask(0); /* Ignore childs dead. */ signal(SIGCHLD, MnSIGCLD); return 0; } static int MnIsDebugStartup(int iArgCount, char *pszArgs[]) { for (int i = 0; i < iArgCount; i++) if (strcmp(pszArgs[i], XMAIL_DEBUG_OPTION) == 0) return 1; return 0; } static int MnDaemonStartup(int iArgCount, char *pszArgs[]) { /* Daemon bootstrap code if We're not in debug mode */ if (!MnIsDebugStartup(iArgCount, pszArgs)) MnDaemonBootStrap(); /* Extract PID file name */ char const *pszPidFile = strrchr(pszArgs[0], '/'); pszPidFile = (pszPidFile != NULL) ? (pszPidFile + 1): pszArgs[0]; /* Create PID file */ MnSavePID(pszPidFile); int iServerResult = SvrMain(iArgCount, pszArgs); /* Remove PID file */ MnRemovePID(pszPidFile); return iServerResult; } int main(int iArgCount, char *pszArgs[]) { return MnDaemonStartup(iArgCount, pszArgs); } xmail-1.27/Makefile.lnx0000644000175000017500000000344711341640430014273 0ustar davidedavide# # XMail by Davide Libenzi (Intranet and Internet mail server) # Copyright (C) 1999,..,2010 Davide Libenzi # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Davide Libenzi # SYSTYPE = linux CC = g++ LD = g++ STRIP = strip ifeq ("$(XMAIL_FILE_OFF_BITS)", "") CFLAGS := $(CFLAGS) -D_FILE_OFFSET_BITS=64 else CFLAGS := $(CFLAGS) -D_FILE_OFFSET_BITS=$(XMAIL_FILE_OFF_BITS) endif ifneq ("$(WITH_SSL_INCLUDE)", "") CFLAGS := $(CFLAGS) -I$(WITH_SSL_INCLUDE) endif ifneq ("$(WITH_SSL_LIB)", "") LDFLAGS := $(LDFLAGS) -L$(WITH_SSL_LIB) endif ifeq ("$(SSLLIBS)", "") SSLLIBS = -lssl -lcrypto endif MAINSRC = MainLinux.cpp SYSSRCS = SysDepLinux.cpp SysDepUnix.cpp ifeq ($(wildcard /usr/include/sys/eventfd.h), ) SYSSRCS := $(SYSSRCS) SysOsEventfd_pipe.cpp else SYSSRCS := $(SYSSRCS) SysOsEventfd_eventfd.cpp CFLAGS := $(CFLAGS) -DHAS_EVENTFD endif CFLAGS := $(CFLAGS) -I. -D__UNIX__ -D__LINUX__ -D_REENTRANT=1 -D_THREAD_SAFE=1 -DHAS_SYSMACHINE \ -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -D_POSIX_PTHREAD_SEMANTICS -DSYS_HAS_SENDFILE LDFLAGS := $(LDFLAGS) $(SSLLIBS) -ldl -lpthread include Makefile.common xmail-1.27/SysDepWin.cpp0000644000175000017500000013057411341640430014426 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "AppDefines.h" #define MAX_TLS_KEYS 64 #define UNUSED_TLS_KEY_PROC ((void (*)(void *)) -1L) #define SOCK_VERSION_REQUESTED MAKEWORD(2, 0) /* * Under certain circumstances (MS Proxy installed ?!) a waiting operation * may be unlocked even if the IO terminal is not ready to perform following * IO request (an error code WSAEWOULDBLOCK is returned). When this happens, * the waiting operation will always return WSAEWOULDBLOCK by making the code * to spin burning CPU cycles. The only solution I see is to sleep a bit to * prevent processor time wasting :( */ #define BLOCKED_SNDRCV_MSSLEEP 250 #define HANDLE_SOCKS_SUCKS() do { Sleep(BLOCKED_SNDRCV_MSSLEEP); } while (0) #define SAIN_Addr(s) (s).sin_addr.S_un.S_addr #define MIN_TCP_SEND_SIZE (1024 * 8) #define MAX_TCP_SEND_SIZE (1024 * 128) #define K_IO_TIME_RATIO 8 #define SYS_MAX_TH_EXIT_HOOKS 64 struct ThreadExitHook { void (*pfHook)(void *, SYS_THREAD, int); void *pPrivate; }; struct TlsKeyEntry { void (*pFreeProc) (void *); }; struct TlsKeyData { void *pData; }; struct FileFindData { char szFindPath[SYS_MAX_PATH]; HANDLE hFind; WIN32_FIND_DATA WFD; }; struct ThreadRunner { unsigned int (*pThreadProc) (void *); void *pThreadData; }; struct MMapData { unsigned long ulPageSize; HANDLE hFile; HANDLE hFileMap; int iNumMaps; SYS_OFF_T llFileSize; unsigned long ulFlags; }; static int iNumThExitHooks; static ThreadExitHook ThExitHooks[SYS_MAX_TH_EXIT_HOOKS]; static char szServerName[SYS_MAX_PATH]; static CRITICAL_SECTION csTLS; static bool bSetupEntries = true; static TlsKeyEntry TlsKeyEntries[MAX_TLS_KEYS]; static __declspec(thread) TlsKeyData TlsKeys[MAX_TLS_KEYS]; static time_t tSysStart; static SYS_INT64 PCFreq; static SYS_INT64 PCSysStart; static int iSndBufSize = -1, iRcvBufSize = -1; static CRITICAL_SECTION csLog; static void (*pSysBreakHandler) (void) = NULL; static HANDLE hShutdownEvent = NULL; static void SysInitTlsKeyEntries(void) { if (bSetupEntries) { for (int i = 0; i < MAX_TLS_KEYS; i++) TlsKeyEntries[i].pFreeProc = UNUSED_TLS_KEY_PROC; bSetupEntries = false; } } static void SysInitTlsKeys(void) { for (int i = 0; i < MAX_TLS_KEYS; i++) TlsKeys[i].pData = NULL; } static void SysCleanupTlsKeys(void) { EnterCriticalSection(&csTLS); for (int i = 0; i < MAX_TLS_KEYS; i++) { if (TlsKeyEntries[i].pFreeProc != UNUSED_TLS_KEY_PROC && TlsKeyEntries[i].pFreeProc != NULL) TlsKeyEntries[i].pFreeProc(TlsKeys[i].pData); TlsKeys[i].pData = NULL; } LeaveCriticalSection(&csTLS); } static int SysSetServerName(void) { int iSize; char *pszSlash, *pszDot; char szPath[SYS_MAX_PATH] = APP_NAME_STR; GetModuleFileName(NULL, szPath, CountOf(szPath)); if ((pszSlash = strrchr(szPath, '\\')) == NULL) pszSlash = szPath; else pszSlash++; if ((pszDot = strchr(pszSlash, '.')) == NULL) pszDot = pszSlash + strlen(pszSlash); iSize = Min(sizeof(szServerName) - 1, (int) (pszDot - pszSlash)); Cpy2Sz(szServerName, pszSlash, iSize); return 0; } /* * We need to setup our own report hook in order to run debug builds * w/out being interrupted by CRT assertions. We log the assert message * and we continue to run. */ static int SysCrtReportHook(int iType, char *pszMsg, int *piRetVal) { int iLogLevel, iRetCode; char const *pszType; switch (iType) { case _CRT_ERROR: iLogLevel = LOG_LEV_ERROR; pszType = "CRT Error"; iRetCode = FALSE; break; case _CRT_ASSERT: iLogLevel = LOG_LEV_WARNING; pszType = "CRT Assert"; *piRetVal = 0; iRetCode = TRUE; break; case _CRT_WARN: iLogLevel = LOG_LEV_WARNING; pszType = "CRT Warning"; *piRetVal = 0; iRetCode = TRUE; break; default: return FALSE; } SysLogMessage(iLogLevel, "%s: %s\n", pszType, pszMsg); return iRetCode; } static void SysRunThreadExitHooks(SYS_THREAD ThreadID, int iMode) { int i; for (i = iNumThExitHooks - 1; i >= 0; i--) (*ThExitHooks[i].pfHook)(ThExitHooks[i].pPrivate, ThreadID, iMode); } static int SysThreadSetup(SYS_THREAD ThreadID) { SysInitTlsKeys(); SysRunThreadExitHooks(ThreadID, SYS_THREAD_ATTACH); return 0; } static int SysThreadCleanup(SYS_THREAD ThreadID) { SysRunThreadExitHooks(ThreadID, SYS_THREAD_DETACH); SysCleanupTlsKeys(); return 0; } int SysInitLibrary(void) { /* Setup timers */ LARGE_INTEGER PerfCntFreq; LARGE_INTEGER PerfCntCurr; _tzset(); QueryPerformanceFrequency(&PerfCntFreq); QueryPerformanceCounter(&PerfCntCurr); PCFreq = (SYS_INT64) PerfCntFreq.QuadPart; PCFreq /= 1000; PCSysStart = (SYS_INT64) PerfCntCurr.QuadPart; time(&tSysStart); iNumThExitHooks = 0; /* Set the server name */ SysSetServerName(); /* Setup sockets */ WSADATA WSD; ZeroData(WSD); if (WSAStartup(SOCK_VERSION_REQUESTED, &WSD)) { ErrSetErrorCode(ERR_NETWORK); return ERR_NETWORK; } InitializeCriticalSection(&csTLS); SysInitTlsKeyEntries(); InitializeCriticalSection(&csLog); _CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, SysCrtReportHook); if ((hShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL)) == NULL) { _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, SysCrtReportHook); DeleteCriticalSection(&csLog); DeleteCriticalSection(&csTLS); ErrSetErrorCode(ERR_CREATEEVENT); return ERR_CREATEEVENT; } if (SysThreadSetup(SYS_INVALID_THREAD) < 0) { ErrorPush(); CloseHandle(hShutdownEvent); DeleteCriticalSection(&csLog); DeleteCriticalSection(&csTLS); return ErrorPop(); } SRand(); return 0; } void SysCleanupLibrary(void) { _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, SysCrtReportHook); SysThreadCleanup(SYS_INVALID_THREAD); DeleteCriticalSection(&csLog); DeleteCriticalSection(&csTLS); CloseHandle(hShutdownEvent); WSACleanup(); } int SysAddThreadExitHook(void (*pfHook)(void *, SYS_THREAD, int), void *pPrivate) { if (iNumThExitHooks >= SYS_MAX_TH_EXIT_HOOKS) return -1; ThExitHooks[iNumThExitHooks].pfHook = pfHook; ThExitHooks[iNumThExitHooks].pPrivate = pPrivate; iNumThExitHooks++; return 0; } int SysShutdownLibrary(int iMode) { SetEvent(hShutdownEvent); return 0; } int SysSetupSocketBuffers(int *piSndBufSize, int *piRcvBufSize) { if (piSndBufSize != NULL) iSndBufSize = *piSndBufSize; if (piRcvBufSize != NULL) iRcvBufSize = *piRcvBufSize; return 0; } static int SysSetSocketsOptions(SYS_SOCKET SockFD) { /* Set socket buffer sizes */ if (iSndBufSize > 0) { int iSize = iSndBufSize; setsockopt((int) SockFD, SOL_SOCKET, SO_SNDBUF, (char const *) &iSize, sizeof(iSize)); } if (iRcvBufSize > 0) { int iSize = iRcvBufSize; setsockopt((int) SockFD, SOL_SOCKET, SO_RCVBUF, (char const *) &iSize, sizeof(iSize)); } int iActivate = 1; if (setsockopt(SockFD, SOL_SOCKET, SO_REUSEADDR, (char const *) &iActivate, sizeof(iActivate)) != 0) { ErrSetErrorCode(ERR_SETSOCKOPT); return ERR_SETSOCKOPT; } /* Disable linger */ struct linger Ling; ZeroData(Ling); Ling.l_onoff = 0; Ling.l_linger = 0; setsockopt(SockFD, SOL_SOCKET, SO_LINGER, (char const *) &Ling, sizeof(Ling)); /* Set KEEPALIVE if supported */ setsockopt(SockFD, SOL_SOCKET, SO_KEEPALIVE, (char const *) &iActivate, sizeof(iActivate)); return 0; } SYS_SOCKET SysCreateSocket(int iAddressFamily, int iType, int iProtocol) { SOCKET SockFD = WSASocket(iAddressFamily, iType, iProtocol, NULL, 0, WSA_FLAG_OVERLAPPED); if (SockFD == INVALID_SOCKET) { ErrSetErrorCode(ERR_SOCKET_CREATE); return SYS_INVALID_SOCKET; } if (SysSetSocketsOptions((SYS_SOCKET) SockFD) < 0) { SysCloseSocket((SYS_SOCKET) SockFD); return SYS_INVALID_SOCKET; } return (SYS_SOCKET) SockFD; } int SysBlockSocket(SYS_SOCKET SockFD, int iBlocking) { u_long IoctlLong = iBlocking <= 0; /* * Pending non-blocking operations should not be active, but we call * WSAEventSelect() just to be sure ... */ WSAEventSelect(SockFD, NULL, 0); if (ioctlsocket(SockFD, FIONBIO, &IoctlLong) == SOCKET_ERROR) { ErrSetErrorCode(ERR_NETWORK); return ERR_NETWORK; } return 0; } void SysCloseSocket(SYS_SOCKET SockFD) { if (SockFD != SYS_INVALID_SOCKET) closesocket(SockFD); } int SysShutdownSocket(SYS_SOCKET SockFD, int iHow) { if (shutdown(SockFD, iHow)) { ErrSetErrorCode(ERR_SOCKET_SHUTDOWN); return ERR_SOCKET_SHUTDOWN; } return 0; } int SysBindSocket(SYS_SOCKET SockFD, const SYS_INET_ADDR *SockName) { if (bind(SockFD, (const struct sockaddr *) SockName->Addr, SockName->iSize) == SOCKET_ERROR) { ErrSetErrorCode(ERR_SOCKET_BIND); return ERR_SOCKET_BIND; } return 0; } void SysListenSocket(SYS_SOCKET SockFD, int iConnections) { listen(SockFD, iConnections); } static int SysRecvLL(SYS_SOCKET SockFD, char *pszBuffer, int iBufferSize) { DWORD dwRtxBytes = 0; DWORD dwRtxFlags = 0; WSABUF WSABuff; ZeroData(WSABuff); WSABuff.len = iBufferSize; WSABuff.buf = pszBuffer; return WSARecv(SockFD, &WSABuff, 1, &dwRtxBytes, &dwRtxFlags, NULL, NULL) == 0 ? (int) dwRtxBytes: -WSAGetLastError(); } static int SysSendLL(SYS_SOCKET SockFD, char const *pszBuffer, int iBufferSize) { DWORD dwRtxBytes = 0; WSABUF WSABuff; ZeroData(WSABuff); WSABuff.len = iBufferSize; WSABuff.buf = (char *) pszBuffer; return WSASend(SockFD, &WSABuff, 1, &dwRtxBytes, 0, NULL, NULL) == 0 ? (int) dwRtxBytes: -WSAGetLastError(); } int SysRecvData(SYS_SOCKET SockFD, char *pszBuffer, int iBufferSize, int iTimeout) { HANDLE hReadEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (hReadEvent == NULL) { ErrSetErrorCode(ERR_CREATEEVENT); return ERR_CREATEEVENT; } int iRecvBytes = 0; HANDLE hWaitEvents[2] = { hReadEvent, hShutdownEvent }; for (;;) { WSAEventSelect(SockFD, (WSAEVENT) hReadEvent, FD_READ | FD_CLOSE); DWORD dwWaitResult = WSAWaitForMultipleEvents(2, hWaitEvents, FALSE, iTimeout, TRUE); WSAEventSelect(SockFD, NULL, 0); if (dwWaitResult == (WSA_WAIT_EVENT_0 + 1)) { CloseHandle(hReadEvent); ErrSetErrorCode(ERR_SERVER_SHUTDOWN); return ERR_SERVER_SHUTDOWN; } else if (dwWaitResult != WSA_WAIT_EVENT_0) { CloseHandle(hReadEvent); ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } if ((iRecvBytes = SysRecvLL(SockFD, pszBuffer, iBufferSize)) >= 0) break; int iErrorCode = -iRecvBytes; if (iErrorCode != WSAEWOULDBLOCK) { CloseHandle(hReadEvent); ErrSetErrorCode(ERR_NETWORK); return ERR_NETWORK; } /* You should never get here if Win32 API worked fine */ HANDLE_SOCKS_SUCKS(); } CloseHandle(hReadEvent); return iRecvBytes; } int SysRecv(SYS_SOCKET SockFD, char *pszBuffer, int iBufferSize, int iTimeout) { int iRtxBytes = 0; while (iRtxBytes < iBufferSize) { int iRtxCurrent = SysRecvData(SockFD, pszBuffer + iRtxBytes, iBufferSize - iRtxBytes, iTimeout); if (iRtxCurrent <= 0) return iRtxBytes; iRtxBytes += iRtxCurrent; } return iRtxBytes; } int SysRecvDataFrom(SYS_SOCKET SockFD, SYS_INET_ADDR *pFrom, char *pszBuffer, int iBufferSize, int iTimeout) { HANDLE hReadEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (hReadEvent == NULL) { ErrSetErrorCode(ERR_CREATEEVENT); return ERR_CREATEEVENT; } DWORD dwRtxBytes = 0; WSABUF WSABuff; HANDLE hWaitEvents[2] = { hReadEvent, hShutdownEvent }; ZeroData(WSABuff); WSABuff.len = iBufferSize; WSABuff.buf = pszBuffer; for (;;) { WSAEventSelect(SockFD, (WSAEVENT) hReadEvent, FD_READ | FD_CLOSE); DWORD dwWaitResult = WSAWaitForMultipleEvents(2, hWaitEvents, FALSE, iTimeout, TRUE); WSAEventSelect(SockFD, NULL, 0); if (dwWaitResult == (WSA_WAIT_EVENT_0 + 1)) { CloseHandle(hReadEvent); ErrSetErrorCode(ERR_SERVER_SHUTDOWN); return ERR_SERVER_SHUTDOWN; } else if (dwWaitResult != WSA_WAIT_EVENT_0) { CloseHandle(hReadEvent); ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } INT FromLen = (INT) sizeof(pFrom->Addr); DWORD dwRtxFlags = 0; if (WSARecvFrom(SockFD, &WSABuff, 1, &dwRtxBytes, &dwRtxFlags, (struct sockaddr *) pFrom->Addr, &FromLen, NULL, NULL) == 0) { pFrom->iSize = (int) FromLen; break; } if (WSAGetLastError() != WSAEWOULDBLOCK) { CloseHandle(hReadEvent); ErrSetErrorCode(ERR_NETWORK); return ERR_NETWORK; } /* You should never get here if Win32 API worked fine */ HANDLE_SOCKS_SUCKS(); } CloseHandle(hReadEvent); return (int) dwRtxBytes; } int SysSendData(SYS_SOCKET SockFD, char const *pszBuffer, int iBufferSize, int iTimeout) { HANDLE hWriteEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (hWriteEvent == NULL) { ErrSetErrorCode(ERR_CREATEEVENT); return ERR_CREATEEVENT; } int iSendBytes = 0; HANDLE hWaitEvents[2] = { hWriteEvent, hShutdownEvent }; for (;;) { WSAEventSelect(SockFD, (WSAEVENT) hWriteEvent, FD_WRITE | FD_CLOSE); DWORD dwWaitResult = WSAWaitForMultipleEvents(2, hWaitEvents, FALSE, iTimeout, TRUE); WSAEventSelect(SockFD, NULL, 0); if (dwWaitResult == (WSA_WAIT_EVENT_0 + 1)) { CloseHandle(hWriteEvent); ErrSetErrorCode(ERR_SERVER_SHUTDOWN); return ERR_SERVER_SHUTDOWN; } else if (dwWaitResult != WSA_WAIT_EVENT_0) { CloseHandle(hWriteEvent); ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } if ((iSendBytes = SysSendLL(SockFD, pszBuffer, iBufferSize)) >= 0) break; int iErrorCode = -iSendBytes; if (iErrorCode != WSAEWOULDBLOCK) { CloseHandle(hWriteEvent); ErrSetErrorCode(ERR_NETWORK); return ERR_NETWORK; } /* You should never get here if Win32 API worked fine */ HANDLE_SOCKS_SUCKS(); } CloseHandle(hWriteEvent); return iSendBytes; } int SysSend(SYS_SOCKET SockFD, char const *pszBuffer, int iBufferSize, int iTimeout) { int iRtxBytes = 0; while (iRtxBytes < iBufferSize) { int iRtxCurrent = SysSendData(SockFD, pszBuffer + iRtxBytes, iBufferSize - iRtxBytes, iTimeout); if (iRtxCurrent <= 0) return iRtxBytes; iRtxBytes += iRtxCurrent; } return iRtxBytes; } int SysSendDataTo(SYS_SOCKET SockFD, const SYS_INET_ADDR *pTo, char const *pszBuffer, int iBufferSize, int iTimeout) { HANDLE hWriteEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (hWriteEvent == NULL) { ErrSetErrorCode(ERR_CREATEEVENT); return ERR_CREATEEVENT; } DWORD dwRtxBytes = 0; WSABUF WSABuff; HANDLE hWaitEvents[2] = { hWriteEvent, hShutdownEvent }; ZeroData(WSABuff); WSABuff.len = iBufferSize; WSABuff.buf = (char *) pszBuffer; for (;;) { WSAEventSelect(SockFD, (WSAEVENT) hWriteEvent, FD_WRITE | FD_CLOSE); DWORD dwWaitResult = WSAWaitForMultipleEvents(2, hWaitEvents, FALSE, iTimeout, TRUE); WSAEventSelect(SockFD, NULL, 0); if (dwWaitResult == (WSA_WAIT_EVENT_0 + 1)) { CloseHandle(hWriteEvent); ErrSetErrorCode(ERR_SERVER_SHUTDOWN); return ERR_SERVER_SHUTDOWN; } else if (dwWaitResult != WSA_WAIT_EVENT_0) { CloseHandle(hWriteEvent); ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } DWORD dwRtxFlags = 0; if (WSASendTo(SockFD, &WSABuff, 1, &dwRtxBytes, dwRtxFlags, (const struct sockaddr *) pTo->Addr, pTo->iSize, NULL, NULL) == 0) break; if (WSAGetLastError() != WSAEWOULDBLOCK) { CloseHandle(hWriteEvent); ErrSetErrorCode(ERR_NETWORK); return ERR_NETWORK; } /* You should never get here if Win32 API worked fine */ HANDLE_SOCKS_SUCKS(); } CloseHandle(hWriteEvent); return (int) dwRtxBytes; } int SysConnect(SYS_SOCKET SockFD, const SYS_INET_ADDR *pSockName, int iTimeout) { HANDLE hConnectEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (hConnectEvent == NULL) { ErrSetErrorCode(ERR_CREATEEVENT); return ERR_CREATEEVENT; } WSAEventSelect(SockFD, (WSAEVENT) hConnectEvent, FD_CONNECT); int iConnectResult = WSAConnect(SockFD, (const struct sockaddr *) pSockName->Addr, pSockName->iSize, NULL, NULL, NULL, NULL); int iConnectError = WSAGetLastError(); if (iConnectResult != 0 && iConnectError == WSAEWOULDBLOCK) { HANDLE hWaitEvents[2] = { hConnectEvent, hShutdownEvent }; DWORD dwWaitResult = WSAWaitForMultipleEvents(2, hWaitEvents, FALSE, iTimeout, TRUE); if (dwWaitResult == WSA_WAIT_EVENT_0) { WSANETWORKEVENTS NetEvents; if (WSAEnumNetworkEvents(SockFD, hConnectEvent, &NetEvents) != 0 || NetEvents.iErrorCode[FD_CONNECT_BIT] != 0) { ErrSetErrorCode(ERR_CONNECT); iConnectResult = ERR_CONNECT; } else iConnectResult = 0; } else if (dwWaitResult == (WSA_WAIT_EVENT_0 + 1)) { ErrSetErrorCode(ERR_SERVER_SHUTDOWN); iConnectResult = ERR_SERVER_SHUTDOWN; } else { ErrSetErrorCode(ERR_TIMEOUT); iConnectResult = ERR_TIMEOUT; } } WSAEventSelect(SockFD, NULL, 0); CloseHandle(hConnectEvent); return iConnectResult; } SYS_SOCKET SysAccept(SYS_SOCKET SockFD, SYS_INET_ADDR *pSockName, int iTimeout) { HANDLE hAcceptEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if (hAcceptEvent == NULL) { ErrSetErrorCode(ERR_CREATEEVENT); return SYS_INVALID_SOCKET; } WSAEventSelect(SockFD, (WSAEVENT) hAcceptEvent, FD_ACCEPT); INT iNameLen = (INT) sizeof(pSockName->Addr); SOCKET SockFDAccept = WSAAccept(SockFD, (struct sockaddr *) pSockName->Addr, &iNameLen, NULL, 0); int iConnectError = WSAGetLastError(); if (SockFDAccept == INVALID_SOCKET && iConnectError == WSAEWOULDBLOCK) { HANDLE hWaitEvents[2] = { hAcceptEvent, hShutdownEvent }; DWORD dwWaitResult = WSAWaitForMultipleEvents(2, hWaitEvents, FALSE, iTimeout, TRUE); if (dwWaitResult == WSA_WAIT_EVENT_0) { iNameLen = (INT) sizeof(pSockName->Addr); SockFDAccept = WSAAccept(SockFD, (struct sockaddr *) pSockName->Addr, &iNameLen, NULL, 0); } else if (dwWaitResult == (WSA_WAIT_EVENT_0 + 1)) ErrSetErrorCode(ERR_SERVER_SHUTDOWN); else ErrSetErrorCode(ERR_TIMEOUT); } WSAEventSelect(SockFD, NULL, 0); if (SockFDAccept != INVALID_SOCKET) WSAEventSelect(SockFDAccept, NULL, 0); CloseHandle(hAcceptEvent); if (SockFDAccept != INVALID_SOCKET) { pSockName->iSize = (int) iNameLen; if (SysBlockSocket(SockFDAccept, 0) < 0 || SysSetSocketsOptions(SockFDAccept) < 0) { SysCloseSocket(SockFDAccept); return SYS_INVALID_SOCKET; } } return SockFDAccept; } int SysSelect(int iMaxFD, SYS_fd_set *pReadFDs, SYS_fd_set *pWriteFDs, SYS_fd_set *pExcptFDs, int iTimeout) { struct timeval TV; ZeroData(TV); if (iTimeout != SYS_INFINITE_TIMEOUT) { TV.tv_sec = iTimeout / 1000; TV.tv_usec = (iTimeout % 1000) * 1000; } int iSelectResult = select(iMaxFD + 1, pReadFDs, pWriteFDs, pExcptFDs, iTimeout != SYS_INFINITE_TIMEOUT ? &TV: NULL); if (iSelectResult < 0) { ErrSetErrorCode(ERR_SELECT); return ERR_SELECT; } if (iSelectResult == 0) { ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } return iSelectResult; } int SysSendFile(SYS_SOCKET SockFD, char const *pszFileName, SYS_OFF_T llBaseOffset, SYS_OFF_T llEndOffset, int iTimeout) { /* Open the source file */ HANDLE hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { ErrSetErrorCode(ERR_FILE_OPEN); return ERR_FILE_OPEN; } /* Create file mapping and the file */ DWORD dwFileSizeHi = 0; DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi); HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, dwFileSizeHi, dwFileSizeLo, NULL); if (hFileMap == NULL) { CloseHandle(hFile); ErrSetErrorCode(ERR_CREATEFILEMAPPING); return ERR_CREATEFILEMAPPING; } void *pAddress = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0); if (pAddress == NULL) { CloseHandle(hFileMap); CloseHandle(hFile); ErrSetErrorCode(ERR_MAPVIEWOFFILE); return ERR_MAPVIEWOFFILE; } int iSndBuffSize = (iTimeout != SYS_INFINITE_TIMEOUT) ? MIN_TCP_SEND_SIZE: MAX_TCP_SEND_SIZE; SYS_UINT64 ullFileSize = (((SYS_UINT64) dwFileSizeHi) << 32) | (SYS_UINT64) dwFileSizeLo; SYS_UINT64 ullEndOffset = (llEndOffset != -1) ? (SYS_UINT64) llEndOffset: ullFileSize; SYS_UINT64 ullCurrOffset = (SYS_UINT64) llBaseOffset; char *pszBuffer = (char *) pAddress + llBaseOffset; SYS_INT64 tStart; while (ullCurrOffset < ullEndOffset) { int iCurrSend = (int) Min(iSndBuffSize, ullEndOffset - ullCurrOffset); tStart = SysMsTime(); if ((iCurrSend = SysSendData(SockFD, pszBuffer, iCurrSend, iTimeout)) < 0) { ErrorPush(); UnmapViewOfFile(pAddress); CloseHandle(hFileMap); CloseHandle(hFile); return ErrorPop(); } if (iSndBuffSize < MAX_TCP_SEND_SIZE && ((SysMsTime() - tStart) * K_IO_TIME_RATIO) < (SYS_INT64) iTimeout) iSndBuffSize = Min(iSndBuffSize * 2, MAX_TCP_SEND_SIZE); pszBuffer += iCurrSend; ullCurrOffset += (SYS_UINT64) iCurrSend; } UnmapViewOfFile(pAddress); CloseHandle(hFileMap); CloseHandle(hFile); return 0; } SYS_SEMAPHORE SysCreateSemaphore(int iInitCount, int iMaxCount) { HANDLE hSemaphore = CreateSemaphore(NULL, iInitCount, iMaxCount, NULL); if (hSemaphore == NULL) { ErrSetErrorCode(ERR_CREATESEMAPHORE); return SYS_INVALID_SEMAPHORE; } return (SYS_SEMAPHORE) hSemaphore; } int SysCloseSemaphore(SYS_SEMAPHORE hSemaphore) { if (hSemaphore != SYS_INVALID_SEMAPHORE) { if (!CloseHandle((HANDLE) hSemaphore)) { ErrSetErrorCode(ERR_CLOSEHANDLE); return ERR_CLOSEHANDLE; } } return 0; } int SysWaitSemaphore(SYS_SEMAPHORE hSemaphore, int iTimeout) { if (WaitForSingleObject((HANDLE) hSemaphore, iTimeout) != WAIT_OBJECT_0) { ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } return 0; } int SysReleaseSemaphore(SYS_SEMAPHORE hSemaphore, int iCount) { if (!ReleaseSemaphore((HANDLE) hSemaphore, (LONG) iCount, NULL)) { ErrSetErrorCode(ERR_RELEASESEMAPHORE); return ERR_RELEASESEMAPHORE; } return 0; } int SysTryWaitSemaphore(SYS_SEMAPHORE hSemaphore) { if (WaitForSingleObject((HANDLE) hSemaphore, 0) != WAIT_OBJECT_0) { ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } return 0; } SYS_MUTEX SysCreateMutex(void) { HANDLE hMutex = CreateMutex(NULL, FALSE, NULL); if (hMutex == NULL) { ErrSetErrorCode(ERR_CREATEMUTEX); return SYS_INVALID_MUTEX; } return (SYS_MUTEX) hMutex; } int SysCloseMutex(SYS_MUTEX hMutex) { if (hMutex != SYS_INVALID_MUTEX) { if (!CloseHandle((HANDLE) hMutex)) { ErrSetErrorCode(ERR_CLOSEHANDLE); return ERR_CLOSEHANDLE; } } return 0; } int SysLockMutex(SYS_MUTEX hMutex, int iTimeout) { if (WaitForSingleObject((HANDLE) hMutex, iTimeout) != WAIT_OBJECT_0) { ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } return 0; } int SysUnlockMutex(SYS_MUTEX hMutex) { ReleaseMutex((HANDLE) hMutex); return 0; } int SysTryLockMutex(SYS_MUTEX hMutex) { if (WaitForSingleObject((HANDLE) hMutex, 0) != WAIT_OBJECT_0) { ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } return 0; } SYS_EVENT SysCreateEvent(int iManualReset) { HANDLE hEvent = CreateEvent(NULL, iManualReset, FALSE, NULL); if (hEvent == NULL) { ErrSetErrorCode(ERR_CREATEEVENT); return SYS_INVALID_EVENT; } return (SYS_EVENT) hEvent; } int SysCloseEvent(SYS_EVENT hEvent) { if (hEvent != SYS_INVALID_EVENT) { if (!CloseHandle((HANDLE) hEvent)) { ErrSetErrorCode(ERR_CLOSEHANDLE); return ERR_CLOSEHANDLE; } } return 0; } int SysWaitEvent(SYS_EVENT hEvent, int iTimeout) { if (WaitForSingleObject((HANDLE) hEvent, iTimeout) != WAIT_OBJECT_0) { ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } return 0; } int SysSetEvent(SYS_EVENT hEvent) { SetEvent((HANDLE) hEvent); return 0; } int SysResetEvent(SYS_EVENT hEvent) { ResetEvent((HANDLE) hEvent); return 0; } int SysTryWaitEvent(SYS_EVENT hEvent) { if (WaitForSingleObject((HANDLE) hEvent, 0) != WAIT_OBJECT_0) { ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } return 0; } /* * On Windows, Events and PEvents maps to the same implementation, since * we use WaitForMultipleObjects() for general waiting. */ SYS_PEVENT SysCreatePEvent(int iManualReset) { return (SYS_PEVENT) SysCreateEvent(iManualReset); } int SysClosePEvent(SYS_PEVENT hPEvent) { return SysCloseEvent((SYS_EVENT) hPEvent); } int SysWaitPEvent(SYS_PEVENT hPEvent, int iTimeout) { return SysWaitEvent((SYS_EVENT) hPEvent, iTimeout); } int SysSetPEvent(SYS_PEVENT hPEvent) { return SysSetEvent((SYS_EVENT) hPEvent); } int SysResetPEvent(SYS_PEVENT hPEvent) { return SysResetEvent((SYS_EVENT) hPEvent); } int SysTryWaitPEvent(SYS_PEVENT hPEvent) { return SysTryWaitEvent((SYS_EVENT) hPEvent); } static unsigned int SysThreadRunner(void *pRunData) { ThreadRunner *pTR = (ThreadRunner *) pRunData; if (SysThreadSetup((SYS_THREAD) GetCurrentThread()) < 0) { SysFree(pTR); return ErrGetErrorCode(); } unsigned int uResultCode = (*pTR->pThreadProc)(pTR->pThreadData); SysThreadCleanup((SYS_THREAD) GetCurrentThread()); SysFree(pTR); return uResultCode; } SYS_THREAD SysCreateThread(unsigned int (*pThreadProc) (void *), void *pThreadData) { /* Alloc thread runner data */ ThreadRunner *pTR = (ThreadRunner *) SysAlloc(sizeof(ThreadRunner)); if (pTR == NULL) return SYS_INVALID_THREAD; pTR->pThreadProc = pThreadProc; pTR->pThreadData = pThreadData; /* Create the thread */ unsigned int uThreadId = 0; unsigned long ulThread = _beginthreadex(NULL, 0, (unsigned (__stdcall *) (void *)) SysThreadRunner, pTR, 0, &uThreadId); if (ulThread == 0) { SysFree(pTR); ErrSetErrorCode(ERR_BEGINTHREADEX); return SYS_INVALID_THREAD; } return (SYS_THREAD) ulThread; } void SysCloseThread(SYS_THREAD ThreadID, int iForce) { if (ThreadID != SYS_INVALID_THREAD) { if (iForce) TerminateThread((HANDLE) ThreadID, (DWORD) -1); CloseHandle((HANDLE) ThreadID); } } int SysSetThreadPriority(SYS_THREAD ThreadID, int iPriority) { BOOL bSetResult = FALSE; switch (iPriority) { case SYS_PRIORITY_NORMAL: bSetResult = SetThreadPriority((HANDLE) ThreadID, THREAD_PRIORITY_NORMAL); break; case SYS_PRIORITY_LOWER: bSetResult = SetThreadPriority((HANDLE) ThreadID, THREAD_PRIORITY_BELOW_NORMAL); break; case SYS_PRIORITY_HIGHER: bSetResult = SetThreadPriority((HANDLE) ThreadID, THREAD_PRIORITY_ABOVE_NORMAL); break; } if (!bSetResult) { ErrSetErrorCode(ERR_SET_THREAD_PRIORITY); return ERR_SET_THREAD_PRIORITY; } return 0; } int SysWaitThread(SYS_THREAD ThreadID, int iTimeout) { if (WaitForSingleObject((HANDLE) ThreadID, iTimeout) != WAIT_OBJECT_0) { ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } return 0; } unsigned long SysGetCurrentThreadId(void) { return (unsigned long) GetCurrentThreadId(); } int SysExec(char const *pszCommand, char const *const *pszArgs, int iWaitTimeout, int iPriority, int *piExitStatus) { int i, iCommandLength = strlen(pszCommand) + 4; for (i = 1; pszArgs[i] != NULL; i++) iCommandLength += strlen(pszArgs[i]) + 4; char *pszCmdLine = (char *) SysAlloc(iCommandLength + 1); if (pszCmdLine == NULL) return ErrGetErrorCode(); strcpy(pszCmdLine, pszCommand); for (i = 1; pszArgs[i] != NULL; i++) sprintf(StrEnd(pszCmdLine), " \"%s\"", pszArgs[i]); PROCESS_INFORMATION PI; STARTUPINFO SI; ZeroData(PI); ZeroData(SI); SI.cb = sizeof(STARTUPINFO); BOOL bProcessCreated = CreateProcess(NULL, pszCmdLine, NULL, NULL, FALSE, CREATE_NO_WINDOW | NORMAL_PRIORITY_CLASS, NULL, NULL, &SI, &PI); SysFree(pszCmdLine); if (!bProcessCreated) { ErrSetErrorCode(ERR_PROCESS_EXECUTE); return ERR_PROCESS_EXECUTE; } SysSetThreadPriority((SYS_THREAD) PI.hThread, iPriority); if (iWaitTimeout > 0 || iWaitTimeout == SYS_INFINITE_TIMEOUT) { if (WaitForSingleObject(PI.hProcess, iWaitTimeout) != WAIT_OBJECT_0) { CloseHandle(PI.hThread); CloseHandle(PI.hProcess); ErrSetErrorCode(ERR_TIMEOUT); return ERR_TIMEOUT; } if (piExitStatus != NULL) { DWORD dwExitCode = 0; if (!GetExitCodeProcess(PI.hProcess, &dwExitCode)) *piExitStatus = -1; else *piExitStatus = (int) dwExitCode; } } else if (piExitStatus != NULL) *piExitStatus = -1; CloseHandle(PI.hThread); CloseHandle(PI.hProcess); return 0; } static BOOL WINAPI SysBreakHandlerRoutine(DWORD dwCtrlType) { BOOL bReturnValue = FALSE; switch (dwCtrlType) { case CTRL_C_EVENT: case CTRL_CLOSE_EVENT: case CTRL_SHUTDOWN_EVENT: if (pSysBreakHandler != NULL) (*pSysBreakHandler)(), bReturnValue = TRUE; break; } return bReturnValue; } void SysSetBreakHandler(void (*pBreakHandler) (void)) { if (pSysBreakHandler == NULL) SetConsoleCtrlHandler(SysBreakHandlerRoutine, (pBreakHandler != NULL) ? TRUE: FALSE); pSysBreakHandler = pBreakHandler; } unsigned long SysGetCurrentProcessId(void) { return GetCurrentProcessId(); } int SysCreateTlsKey(SYS_TLSKEY &TlsKey, void (*pFreeProc) (void *)) { EnterCriticalSection(&csTLS); for (int i = 0; i < MAX_TLS_KEYS; i++) { if (TlsKeyEntries[i].pFreeProc == UNUSED_TLS_KEY_PROC) { TlsKeyEntries[i].pFreeProc = pFreeProc; LeaveCriticalSection(&csTLS); TlsKey = (SYS_TLSKEY) i; return 0; } } LeaveCriticalSection(&csTLS); ErrSetErrorCode(ERR_NOMORE_TLSKEYS); return ERR_NOMORE_TLSKEYS; } int SysDeleteTlsKey(SYS_TLSKEY &TlsKey) { int iKey = (int) TlsKey; EnterCriticalSection(&csTLS); if (iKey < 0 || iKey >= MAX_TLS_KEYS || TlsKeyEntries[iKey].pFreeProc == UNUSED_TLS_KEY_PROC) { LeaveCriticalSection(&csTLS); ErrSetErrorCode(ERR_INVALID_TLSKEY); return ERR_INVALID_TLSKEY; } TlsKeyEntries[iKey].pFreeProc = UNUSED_TLS_KEY_PROC; LeaveCriticalSection(&csTLS); TlsKey = (SYS_TLSKEY) - 1; return 0; } int SysSetTlsKeyData(SYS_TLSKEY &TlsKey, void *pData) { int iKey = (int) TlsKey; if (iKey < 0 || iKey >= MAX_TLS_KEYS || TlsKeyEntries[iKey].pFreeProc == UNUSED_TLS_KEY_PROC) { ErrSetErrorCode(ERR_INVALID_TLSKEY); return ERR_INVALID_TLSKEY; } TlsKeys[iKey].pData = pData; return 0; } void *SysGetTlsKeyData(SYS_TLSKEY &TlsKey) { int iKey = (int) TlsKey; if (iKey < 0 || iKey >= MAX_TLS_KEYS || TlsKeyEntries[iKey].pFreeProc == UNUSED_TLS_KEY_PROC) { ErrSetErrorCode(ERR_INVALID_TLSKEY); return NULL; } return TlsKeys[iKey].pData; } void SysThreadOnce(SYS_THREAD_ONCE *pThrOnce, void (*pOnceProc) (void)) { if (InterlockedExchange(&pThrOnce->lOnce, 1) == 0) { (*pOnceProc)(); pThrOnce->lDone++; } while (!pThrOnce->lDone) Sleep(0); } void *SysAllocNZ(unsigned int uSize) { void *pData = malloc(uSize); if (pData == NULL) ErrSetErrorCode(ERR_MEMORY); return pData; } void *SysAlloc(unsigned int uSize) { void *pData = SysAllocNZ(uSize); if (pData != NULL) memset(pData, 0, uSize); return pData; } void SysFree(void *pData) { free(pData); } void *SysRealloc(void *pData, unsigned int uSize) { void *pNewData = realloc(pData, uSize); if (pNewData == NULL) ErrSetErrorCode(ERR_MEMORY); return pNewData; } int SysLockFile(char const *pszFileName, char const *pszLockExt) { char szLockFile[SYS_MAX_PATH]; SysSNPrintf(szLockFile, sizeof(szLockFile) - 1, "%s%s", pszFileName, pszLockExt); /* Try to create lock file */ HANDLE hFile = CreateFile(szLockFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { if (GetLastError() == ERROR_ALREADY_EXISTS) { ErrSetErrorCode(ERR_LOCKED); return ERR_LOCKED; } ErrSetErrorCode(ERR_FILE_CREATE); return ERR_FILE_CREATE; } DWORD dwWritten = 0; char szLock[128]; sprintf(szLock, "%lu", (unsigned long) GetCurrentThreadId()); if (!WriteFile(hFile, szLock, strlen(szLock) + 1, &dwWritten, NULL)) { CloseHandle(hFile); ErrSetErrorCode(ERR_FILE_WRITE); return ERR_FILE_WRITE; } CloseHandle(hFile); return 0; } int SysUnlockFile(char const *pszFileName, char const *pszLockExt) { char szLockFile[SYS_MAX_PATH] = ""; SysSNPrintf(szLockFile, sizeof(szLockFile) - 1, "%s%s", pszFileName, pszLockExt); if (_unlink(szLockFile) != 0) { ErrSetErrorCode(ERR_NOT_LOCKED); return ERR_NOT_LOCKED; } return 0; } SYS_HANDLE SysOpenModule(char const *pszFilePath) { HMODULE hModule = LoadLibrary(pszFilePath); if (hModule == NULL) { ErrSetErrorCode(ERR_LOADMODULE, pszFilePath); return SYS_INVALID_HANDLE; } return (SYS_HANDLE) hModule; } int SysCloseModule(SYS_HANDLE hModule) { if (hModule != SYS_INVALID_HANDLE) FreeLibrary((HMODULE) hModule); return 0; } void *SysGetSymbol(SYS_HANDLE hModule, char const *pszSymbol) { void *pSymbol = (void *) GetProcAddress((HMODULE) hModule, pszSymbol); if (pSymbol == NULL) { ErrSetErrorCode(ERR_LOADMODULESYMBOL, pszSymbol); return NULL; } return pSymbol; } int SysEventLogV(int iLogLevel, char const *pszFormat, va_list Args) { HANDLE hEventSource = RegisterEventSource(NULL, szServerName); if (hEventSource == NULL) { ErrSetErrorCode(ERR_REGISTER_EVENT_SOURCE); return ERR_REGISTER_EVENT_SOURCE; } char *pszStrings[2]; char szBuffer[2048] = ""; _vsnprintf(szBuffer, sizeof(szBuffer) - 1, pszFormat, Args); pszStrings[0] = szBuffer; ReportEvent(hEventSource, iLogLevel == LOG_LEV_ERROR ? EVENTLOG_ERROR_TYPE: iLogLevel == LOG_LEV_WARNING ? EVENTLOG_WARNING_TYPE: EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (char const **) pszStrings, NULL); DeregisterEventSource(hEventSource); return 0; } int SysEventLog(int iLogLevel, char const *pszFormat, ...) { int iError; va_list Args; va_start(Args, pszFormat); iError = SysEventLogV(iLogLevel, pszFormat, Args); va_end(Args); return iError; } int SysLogMessage(int iLogLevel, char const *pszFormat, ...) { va_list Args; extern bool bServerDebug; va_start(Args, pszFormat); EnterCriticalSection(&csLog); if (bServerDebug) { /* Debug implementation */ vprintf(pszFormat, Args); } else { switch (iLogLevel) { case LOG_LEV_WARNING: case LOG_LEV_ERROR: SysEventLogV(iLogLevel, pszFormat, Args); break; } } LeaveCriticalSection(&csLog); va_end(Args); return 0; } int SysSleep(int iTimeout) { return SysMsSleep(iTimeout * 1000); } int SysMsSleep(int iMsTimeout) { if (WaitForSingleObject(hShutdownEvent, iMsTimeout) == WAIT_OBJECT_0) { ErrSetErrorCode(ERR_SERVER_SHUTDOWN); return ERR_SERVER_SHUTDOWN; } return 0; } static void SysTimetToFileTime(time_t tTime, LPFILETIME pFT) { LONGLONG llTime = Int32x32To64(tTime, 10000000) + 116444736000000000; pFT->dwLowDateTime = (DWORD) llTime; pFT->dwHighDateTime = (DWORD) (llTime >> 32); } static time_t SysFileTimeToTimet(LPFILETIME pFT) { LONGLONG llTime = ((LONGLONG) pFT->dwLowDateTime) | (((LONGLONG) pFT->dwHighDateTime) << 32); return (time_t) ((llTime - 116444736000000000) / 10000000); } SYS_INT64 SysMsTime(void) { SYS_INT64 MsTicks; LARGE_INTEGER PerfCntCurr; QueryPerformanceCounter(&PerfCntCurr); MsTicks = (SYS_INT64) PerfCntCurr.QuadPart; MsTicks -= PCSysStart; MsTicks /= PCFreq; MsTicks += (SYS_INT64) tSysStart * 1000; return MsTicks; } int SysExistFile(char const *pszFilePath) { DWORD dwAttr = GetFileAttributes(pszFilePath); if (dwAttr == (DWORD) - 1) return 0; return (dwAttr & FILE_ATTRIBUTE_DIRECTORY) ? 0: 1; } int SysExistDir(char const *pszDirPath) { DWORD dwAttr = GetFileAttributes(pszDirPath); if (dwAttr == (DWORD) - 1) return 0; return (dwAttr & FILE_ATTRIBUTE_DIRECTORY) ? 1: 0; } SYS_HANDLE SysFirstFile(char const *pszPath, char *pszFileName, int iSize) { char szMatch[SYS_MAX_PATH]; StrNCpy(szMatch, pszPath, sizeof(szMatch) - 2); AppendSlash(szMatch); strcat(szMatch, "*"); WIN32_FIND_DATA WFD; HANDLE hFind = FindFirstFile(szMatch, &WFD); if (hFind == INVALID_HANDLE_VALUE) { if (GetLastError() != ERROR_FILE_NOT_FOUND) ErrSetErrorCode(ERR_OPENDIR, pszPath); return SYS_INVALID_HANDLE; } FileFindData *pFFD = (FileFindData *) SysAlloc(sizeof(FileFindData)); if (pFFD == NULL) { FindClose(hFind); return SYS_INVALID_HANDLE; } StrNCpy(pFFD->szFindPath, pszPath, sizeof(pFFD->szFindPath) - 1); AppendSlash(pFFD->szFindPath); pFFD->hFind = hFind; pFFD->WFD = WFD; StrNCpy(pszFileName, pFFD->WFD.cFileName, iSize); return (SYS_HANDLE) pFFD; } int SysIsDirectory(SYS_HANDLE hFind) { FileFindData *pFFD = (FileFindData *) hFind; return (pFFD->WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? 1: 0; } SYS_OFF_T SysGetSize(SYS_HANDLE hFind) { FileFindData *pFFD = (FileFindData *) hFind; return (SYS_OFF_T) pFFD->WFD.nFileSizeLow | (((SYS_OFF_T) pFFD->WFD.nFileSizeHigh) << 32); } int SysNextFile(SYS_HANDLE hFind, char *pszFileName, int iSize) { FileFindData *pFFD = (FileFindData *) hFind; if (!FindNextFile(pFFD->hFind, &pFFD->WFD)) return 0; StrNCpy(pszFileName, pFFD->WFD.cFileName, iSize); return 1; } void SysFindClose(SYS_HANDLE hFind) { FileFindData *pFFD = (FileFindData *) hFind; if (pFFD != NULL) { FindClose(pFFD->hFind); SysFree(pFFD); } } int SysGetFileInfo(char const *pszFileName, SYS_FILE_INFO &FI) { WIN32_FIND_DATA WFD; HANDLE hFind = FindFirstFile(pszFileName, &WFD); if (hFind == INVALID_HANDLE_VALUE) { ErrSetErrorCode(ERR_STAT); return ERR_STAT; } ZeroData(FI); FI.iFileType = (WFD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? ftDirectory: ftNormal; FI.llSize = (SYS_OFF_T) WFD.nFileSizeLow | (((SYS_OFF_T) WFD.nFileSizeHigh) << 32); FI.tMod = SysFileTimeToTimet(&WFD.ftLastWriteTime); FindClose(hFind); return 0; } int SysSetFileModTime(char const *pszFileName, time_t tMod) { HANDLE hFile = CreateFile(pszFileName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { ErrSetErrorCode(ERR_SET_FILE_TIME); return ERR_SET_FILE_TIME; } FILETIME MFT; SysTimetToFileTime(tMod, &MFT); if (!SetFileTime(hFile, NULL, &MFT, &MFT)) { CloseHandle(hFile); ErrSetErrorCode(ERR_SET_FILE_TIME); return ERR_SET_FILE_TIME; } CloseHandle(hFile); return 0; } char *SysStrDup(char const *pszString) { int iStrLength = strlen(pszString); char *pszBuffer = (char *) SysAllocNZ(iStrLength + 1); if (pszBuffer != NULL) memcpy(pszBuffer, pszString, iStrLength + 1); return pszBuffer; } char *SysGetEnv(char const *pszVarName) { HKEY hKey; char szRKeyPath[256]; SysSNPrintf(szRKeyPath, sizeof(szRKeyPath) - 1, "SOFTWARE\\%s\\%s", APP_PRODUCER, szServerName); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szRKeyPath, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { char szKeyValue[2048] = ""; DWORD dwKeyType, dwSize = sizeof(szKeyValue); if (RegQueryValueEx(hKey, pszVarName, NULL, &dwKeyType, (u_char *) szKeyValue, &dwSize) == ERROR_SUCCESS) { RegCloseKey(hKey); return SysStrDup(szKeyValue); } RegCloseKey(hKey); } char const *pszValue = getenv(pszVarName); return (pszValue != NULL) ? SysStrDup(pszValue): NULL; } char *SysGetTempDir(char *pszPath, int iMaxPath) { GetTempPath(iMaxPath - 2, pszPath); AppendSlash(pszPath); return pszPath; } int SysRemove(char const *pszFileName) { if (!DeleteFile(pszFileName)) { ErrSetErrorCode(ERR_FILE_DELETE); return ERR_FILE_DELETE; } return 0; } int SysMakeDir(char const *pszPath) { if (!CreateDirectory(pszPath, NULL)) { ErrSetErrorCode(ERR_DIR_CREATE); return ERR_DIR_CREATE; } return 0; } int SysRemoveDir(char const *pszPath) { if (!RemoveDirectory(pszPath)) { ErrSetErrorCode(ERR_DIR_DELETE); return ERR_DIR_DELETE; } return 0; } int SysMoveFile(char const *pszOldName, char const *pszNewName) { if (!MoveFileEx(pszOldName, pszNewName, MOVEFILE_REPLACE_EXISTING | MOVEFILE_COPY_ALLOWED)) { ErrSetErrorCode(ERR_FILE_MOVE); return ERR_FILE_MOVE; } return 0; } int SysVSNPrintf(char *pszBuffer, int iSize, char const *pszFormat, va_list Args) { return _vsnprintf(pszBuffer, iSize, pszFormat, Args); } int SysFileSync(FILE *pFile) { if (fflush(pFile) || _commit(_fileno(pFile))) { ErrSetErrorCode(ERR_FILE_WRITE); return ERR_FILE_WRITE; } return 0; } char *SysStrTok(char *pszData, char const *pszDelim, char **ppszSavePtr) { return *ppszSavePtr = strtok(pszData, pszDelim); } char *SysCTime(time_t *pTimer, char *pszBuffer) { return strcpy(pszBuffer, ctime(pTimer)); } struct tm *SysLocalTime(time_t *pTimer, struct tm *pTStruct) { *pTStruct = *localtime(pTimer); return pTStruct; } struct tm *SysGMTime(time_t *pTimer, struct tm *pTStruct) { *pTStruct = *gmtime(pTimer); return pTStruct; } char *SysAscTime(struct tm *pTStruct, char *pszBuffer, int iBufferSize) { strncpy(pszBuffer, asctime(pTStruct), iBufferSize); pszBuffer[iBufferSize - 1] = '\0'; return pszBuffer; } long SysGetTimeZone(void) { return (long) _timezone; } long SysGetDayLight(void) { time_t tCurr = time(NULL); struct tm tmCurr = *localtime(&tCurr); return (tmCurr.tm_isdst <= 0) ? 0: 3600; } int SysGetDiskSpace(char const *pszPath, SYS_INT64 *pTotal, SYS_INT64 *pFree) { ULARGE_INTEGER BytesAvail, BytesOnDisk, BytesFree; char szXPath[SYS_MAX_PATH] = ""; StrSNCpy(szXPath, pszPath); AppendSlash(szXPath); if (!GetDiskFreeSpaceEx(szXPath, &BytesAvail, &BytesOnDisk, &BytesFree)) { ErrSetErrorCode(ERR_GET_DISK_SPACE_INFO); return ERR_GET_DISK_SPACE_INFO; } *pTotal = *(SYS_INT64 *) &BytesOnDisk; *pFree = *(SYS_INT64 *) &BytesAvail; return 0; } int SysMemoryInfo(SYS_INT64 *pRamTotal, SYS_INT64 *pRamFree, SYS_INT64 *pVirtTotal, SYS_INT64 *pVirtFree) { #if _WIN32_WINNT >= 0x0500 MEMORYSTATUSEX MSEX; ZeroData(MSEX); if (!GlobalMemoryStatusEx(&MSEX)) { ErrSetErrorCode(ERR_GET_MEMORY_INFO); return ERR_GET_MEMORY_INFO; } *pRamTotal = (SYS_INT64) MSEX.ullTotalPhys; *pRamFree = (SYS_INT64) MSEX.ullAvailPhys; *pVirtTotal = (SYS_INT64) MSEX.ullTotalVirtual; *pVirtFree = (SYS_INT64) MSEX.ullAvailVirtual; #else MEMORYSTATUS MS; ZeroData(MS); GlobalMemoryStatus(&MS); *pRamTotal = (SYS_INT64) MS.dwTotalPhys; *pRamFree = (SYS_INT64) MS.dwAvailPhys; *pVirtTotal = (SYS_INT64) MS.dwTotalVirtual; *pVirtFree = (SYS_INT64) MS.dwAvailVirtual; #endif return 0; } SYS_MMAP SysCreateMMap(char const *pszFileName, unsigned long ulFlags) { HANDLE hFile = CreateFile(pszFileName, (ulFlags & SYS_MMAP_WRITE) ? GENERIC_WRITE | GENERIC_READ: GENERIC_READ, (ulFlags & SYS_MMAP_WRITE) ? 0: FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { ErrSetErrorCode(ERR_FILE_OPEN); return SYS_INVALID_MMAP; } DWORD dwFileSizeHi = 0, dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi); HANDLE hFileMap = CreateFileMapping(hFile, NULL, (ulFlags & SYS_MMAP_WRITE) ? PAGE_READWRITE: PAGE_READONLY, dwFileSizeHi, dwFileSizeLo, NULL); if (hFileMap == NULL) { CloseHandle(hFile); ErrSetErrorCode(ERR_CREATEFILEMAPPING); return SYS_INVALID_MMAP; } MMapData *pMMD = (MMapData *) SysAlloc(sizeof(MMapData)); SYSTEM_INFO SI; if (pMMD == NULL) { CloseHandle(hFileMap); CloseHandle(hFile); return SYS_INVALID_MMAP; } GetSystemInfo(&SI); pMMD->ulPageSize = (unsigned long) SI.dwPageSize; pMMD->hFile = hFile; pMMD->hFileMap = hFileMap; pMMD->iNumMaps = 0; pMMD->ulFlags = ulFlags; pMMD->llFileSize = (SYS_OFF_T) dwFileSizeLo | ((SYS_OFF_T) dwFileSizeHi << 32); return (SYS_MMAP) pMMD; } void SysCloseMMap(SYS_MMAP hMap) { MMapData *pMMD = (MMapData *) hMap; if (pMMD != NULL) { if (pMMD->iNumMaps > 0) { } CloseHandle(pMMD->hFileMap); CloseHandle(pMMD->hFile); SysFree(pMMD); } } SYS_OFF_T SysMMapSize(SYS_MMAP hMap) { MMapData *pMMD = (MMapData *) hMap; return pMMD->llFileSize; } SYS_OFF_T SysMMapOffsetAlign(SYS_MMAP hMap, SYS_OFF_T llOffset) { MMapData *pMMD = (MMapData *) hMap; return llOffset & ~((SYS_OFF_T) pMMD->ulPageSize - 1); } void *SysMapMMap(SYS_MMAP hMap, SYS_OFF_T llOffset, SYS_SIZE_T lSize) { MMapData *pMMD = (MMapData *) hMap; DWORD dwMapFlags = 0; void *pMapAddress; if (llOffset % pMMD->ulPageSize) { ErrSetErrorCode(ERR_INVALID_MMAP_OFFSET); return NULL; } if (pMMD->ulFlags & SYS_MMAP_READ) dwMapFlags |= FILE_MAP_READ; if (pMMD->ulFlags & SYS_MMAP_WRITE) dwMapFlags |= FILE_MAP_WRITE; if ((pMapAddress = MapViewOfFile(pMMD->hFileMap, dwMapFlags, (DWORD) (llOffset >> 32), (DWORD) llOffset, lSize)) == NULL) { ErrSetErrorCode(ERR_MAPVIEWOFFILE); return NULL; } pMMD->iNumMaps++; return pMapAddress; } int SysUnmapMMap(SYS_MMAP hMap, void *pAddr, SYS_SIZE_T lSize) { MMapData *pMMD = (MMapData *) hMap; if (!UnmapViewOfFile(pAddr)) { ErrSetErrorCode(ERR_UNMAPFILEVIEW); return ERR_UNMAPFILEVIEW; } pMMD->iNumMaps--; return 0; } xmail-1.27/SList.cpp0000644000175000017500000000625511341640430013575 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #include "SysInclude.h" #include "SysDep.h" #include "SvrDefines.h" #include "SList.h" void ListInit(HSLIST &hList) { hList = INVALID_SLIST_PTR; } void ListAddHead(HSLIST &hList, PLISTLINK pLLink) { pLLink->pNext = hList; hList = pLLink; } void ListAddTail(HSLIST &hList, PLISTLINK pLLink) { PLISTLINK lpPrev = INVALID_SLIST_PTR, lpCurr = hList; while (lpCurr != INVALID_SLIST_PTR) { lpPrev = lpCurr; lpCurr = lpCurr->pNext; } pLLink->pNext = INVALID_SLIST_PTR; if (lpPrev == INVALID_SLIST_PTR) hList = pLLink; else lpPrev->pNext = pLLink; } PLISTLINK ListFirst(HSLIST &hList) { return hList; } PLISTLINK ListNext(HSLIST &hList, PLISTLINK pLLink) { return pLLink->pNext; } PLISTLINK ListRemovePtr(HSLIST &hList, PLISTLINK pLLink) { PLISTLINK lpPrev = INVALID_SLIST_PTR, lpCurr = hList; while (lpCurr != INVALID_SLIST_PTR) { if (lpCurr == pLLink) break; lpPrev = lpCurr; lpCurr = lpCurr->pNext; } if (lpCurr == INVALID_SLIST_PTR) return INVALID_SLIST_PTR; if (lpPrev == INVALID_SLIST_PTR) hList = lpCurr->pNext; else lpPrev->pNext = lpCurr->pNext; lpCurr->pNext = INVALID_SLIST_PTR; return lpCurr; } PLISTLINK ListRemove(HSLIST &hList) { PLISTLINK lpCurr = hList; if (lpCurr != INVALID_SLIST_PTR) hList = lpCurr->pNext, lpCurr->pNext = INVALID_SLIST_PTR; return lpCurr; } void ListPurgeFree(HSLIST &hList) { PLISTLINK lpCurr; while ((lpCurr = ListRemove(hList)) != INVALID_SLIST_PTR) SysFree(lpCurr); } void ListPurge(HSLIST &hList) { PLISTLINK lpCurr; while ((lpCurr = ListRemove(hList)) != INVALID_SLIST_PTR); } bool ListIsEmpty(HSLIST &hList) { return hList == INVALID_SLIST_PTR; } int ListGetCount(HSLIST &hList) { int i; PLISTLINK lpCurr = ListFirst(hList); for (i = 0; lpCurr != INVALID_SLIST_PTR; lpCurr = ListNext(hList, lpCurr), i++); return i; } PLISTLINK *ListGetPointers(HSLIST &hList, int &iListCount) { iListCount = ListGetCount(hList); PLISTLINK *pPointers = (PLISTLINK *) SysAlloc((iListCount + 1) * sizeof(PLISTLINK)); if (pPointers != NULL) { int i; PLISTLINK lpCurr = ListFirst(hList); for (i = 0; lpCurr != INVALID_SLIST_PTR; lpCurr = ListNext(hList, lpCurr), i++) pPointers[i] = lpCurr; pPointers[i] = INVALID_SLIST_PTR; } return pPointers; } void ListReleasePointers(PLISTLINK * pPointers) { SysFree(pPointers); } xmail-1.27/CommTypes.h0000644000175000017500000000231411341640430014114 0ustar davidedavide/* * XMail by Davide Libenzi (Intranet and Internet mail server) * Copyright (C) 1999,..,2010 Davide Libenzi * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Davide Libenzi * */ #ifndef _XMCOMMTYPES_H #define _XMCOMMTYPES_H struct FileSection { char szFilePath[SYS_MAX_PATH]; SYS_OFF_T llStartOffset; SYS_OFF_T llEndOffset; }; struct Datum { char *pData; long lSize; }; struct LstDatum { SysListHead LLnk; Datum Data; }; struct LstNDatum { SysListHead LLnk; Datum Name; Datum Data; }; #endif