openam_v1_1_18/0040755000176200056700000000000010214170505013545 5ustar releasepostincropenam_v1_1_18/ChangeLog0100644000176200056700000000350310214170505015315 0ustar releasepostincr2005-02-02 19:21 csoutheren * main.cxx, main.h: Added called party to call log and command parameters 2004-09-06 07:15 rjongbloed * .cvsignore: Ignore more 2004-05-25 23:01 csoutheren * main.cxx: Changed to work completely with new plugin codecs 2004-05-10 08:07 rjongbloed * main.cxx: Changed G.726 and MS-ADPCM to plug in codecs. 2004-05-04 07:21 rjongbloed * main.cxx: Converted LPC-10 codec to plug in. 2004-05-03 08:25 rjongbloed * main.cxx, main.h: Converted everything to be codec plug in freindly Removed GSM and G.729 as now plug ins are "the way"! 2004-04-07 02:51 rjongbloed * openam.dsp: Added RTTI compiler flag to build. 2004-04-06 06:27 rjongbloed * main.cxx: Changes to support native C++ Run Time Type Information Changes for codec plug ins 2004-04-06 06:26 rjongbloed * openam.vcproj: Many and various changes to support new Visual C++ 2003 2004-04-05 08:31 rjongbloed * openam.vcproj: Many and various changes to support new Visual C++ 2003 2004-04-03 01:01 rjongbloed * openam.vcproj: Many and various changes to support new Visual C++ 2003 2004-01-31 01:38 rjongbloed * openam.dsp: Removed HAS_IXJ and HAS_VPD from make file as now in configure 2004-01-31 01:38 rjongbloed * cmds.cxx, main.cxx: Changed HAS_IXJ usage to if defined not if non-zero 2004-01-01 20:52 csoutheren * main.cxx, main.h: Thanks to Michal Zygmuntowicz for these changes Added support for iLBC codec Added ability to specify a gatekeeper password, Fixed small bug with Speex capabilities being accidentally included. 2003-12-02 03:46 csoutheren * main.cxx, main.h: Added --loop option thanks to Jan Willamowius 2003-04-16 20:59 robertj * openam.dsp: pwlib autoconf changes 2003-03-06 18:49 robertj * version.h: Incremented build number after tagging to v1_1_17. openam_v1_1_18/Makefile0100644000176200056700000000362007523447425015224 0ustar releasepostincr# # Makefile # # Make file for ptlib library # # Portable Windows Library # # Copyright (c) 1993-1998 Equivalence Pty. Ltd. # # The contents of this file are subject to the Mozilla Public License # Version 1.0 (the "License"); you may not use this file except in # compliance with the License. You may obtain a copy of the License at # http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS IS" # basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See # the License for the specific language governing rights and limitations # under the License. # # The Original Code is Portable Windows Library. # # The Initial Developer of the Original Code is Equivalence Pty. Ltd. # # Portions are Copyright (C) 1993 Free Software Foundation, Inc. # All Rights Reserved. # # Contributor(s): ______________________________________. # # $Log: Makefile,v $ # Revision 1.9 2002/08/05 10:10:29 robertj # Normalised Makefile usage of openh323u.mak include file, fixing odd messages. # # Revision 1.8 2001/09/24 22:39:42 craigs # Added commands to play and record data files, esp G.723.1 # # Revision 1.7 2001/07/19 10:05:27 rogerh # PWAVFile is now part of the standard PWLib. # # Revision 1.6 2001/07/14 07:34:02 rogerh # Include wav.cxx # # Revision 1.5 2000/04/25 23:34:22 craigs # Added lots of new code, including outgoing and incoming # multiplexors, and the start of an IVR system # # Revision 1.4 2000/02/02 04:10:55 craigs # Changed to use common Makefiles # # Revision 1.3 1999/10/28 12:26:18 craigs # Changed version number # # Revision 1.2 1999/10/24 04:19:28 craigs # Added make dist target # # Revision 1.1 1999/10/11 00:15:18 craigs # Initial version # # PROG = openam SOURCES := main.cxx cmds.cxx ifndef OPENH323DIR OPENH323DIR=$(HOME)/openh323 endif include $(OPENH323DIR)/openh323u.mak record: record.c $(CC) -o $@ $< playback: playback.c $(CC) -o $@ $< openam_v1_1_18/ReadMe.txt0100644000176200056700000002541107530651611015454 0ustar releasepostincrNotes for OpenAM ---------------- Craig Southeren, 24 October 1999 Updated by Roger Hardiman, October 2001, January 2002, August 2002 1. Introduction --------------- OpenAM is a simple answering machine using the H.323 protocol. It requires the OpenH323 library - see http://www.openh323.org for more information. It is known to run on Linux, FreeBSD, Solaris and MacOS X. If you run the program successfully on another platform, then please send an email to openh323@openh323.org 2. Features ----------- The code contains the following features: - requires no codec hardware to operate - requires no audio hardware to operate - currently supports G.723.1, G.711 muLaw and ALaw, GSM, Microsoft MS-GSM, Speex and LPC-10 codecs - can accept multiple connections simultaneously - generates a call log containing full information about each call - runs a user defined program after each call, which can be used to automatically send the recorded message as a MIME encoded email attachment to a known email address - can limit the the length of recorded messages - automatically cleans up recorded voice files - uses .wav files for the Outgoing Message (OGM). Can also use raw audio files - records messages as .wav files. Can also record as raw audio files - plays different OGMs depending on the person called 3. Operation ------------ OpenAM works by setting up a H.323 listener process, and then waiting for incoming connections. Whenever an incoming connection is established, it plays the outgoing message (OGM) and then starts recording any incoming audio from the remote end into a record file. As a simple demonstration, use: openam -m sample_message This plays the "sample_message.wav" audio file for the outgoing message of calls using the GSM, MS-GSM, G.711, Speex and LPC-10 codecs, and "sample_message_g7231.wav" for calls using the G.723.1 codec. Recorded messages are placed in the current directory and have a filename made up of the time and date of the recording. Eg: 20010628_140234.wav (14:02 on 28th June 2001) Windows users can easily replay messages recorded from a G.723.1 codec call in the Windows Media Player. Owners of Quicknet cards (eg LineJack and PhoneJack) can also play messages recored from a G.723.1 codec call using their Quicknet cards and the OpenAM play command. This is handy for Linux and FreeBSD users. Unix users (without Quicknet cards) cannot play G.723.1 files so they may prefer to use this command, which does not enable G.723.1 in OpenAM. openam --pcmmessage sample_message.wav When the client hangs up, or the maximum record time is reached, the connection is broken, and the record file is closed. The optional user program is called with the following parameters: name of file containing recorded voice data string describing the address of the client that initiated the call the username of the remote party the duration of the call, in seconds a string describing the codecs used during the call the vendor description of the remote endpoint software A record is then written to the call log file, and the record deleted if necessary. If the client hangs up before the OGM is finished, then no record file is created and the user program is not called. A call log record is still generated. 4. Command line options ----------------------- OpenAM has the following command line options: -d dir --directory dir Set the directory that record files are created in -l secs --limit secs Limit recorded messages to secs duration (default 30) -m fn --message fn Set outgoing message to fn This sets both the --pcmmessage and the --g7231message parameters. The filename 'fn' must not have an extension. --pcmmessage is set to 'fn'.wav (or 'fn'.sw if there is no .wav file) --g7231message is set to 'fn'_g7231.wav (or 'fn'.g7231 if there is no .wav file) --g7231message fn Set the outgoing message for G.723.1 codec connections. This must be a G.723.1 format .wav file or a .g723 file --pcmmessage fn Set the outgoing message for the G.711, GSM, MS-GSM Speex and LPC-10 codec connections. This must be a PCM format .wav file or a .sw file --recordraw Use raw audio files (.sw and .g723 files) for recorded messages (the default is to record .wav files) -n --nodelete Do not delete record files after processing -r cmd --run cmd Run this command after each recorded message -u str --username str Set the local endpoint name to str. Default is "OpenH323 Answering Machine vxxx" -t --trace Enable debug trace, use multiple times for more detail -o fn --output fn File for trace output, default is stderr -h --help Display this help message People with Quicknet PhoneJack/LineJack cards can also use the following two commands play -qN [--pcm|--g7231] [--port n] filename Plays the file back via the Quicknet card 'N' (ie /dev/phoneN). This can play .wav files (both PCM and G.723.1 wav files) and also .sw and .g723 files. The --pcm and --g7231 options are used if OpenAM cannot determine the file type. The --port option is used to select the output which is 1 for a POTS telephone 2 for the PSTN line on a LineJack card and 3 for the speaker socket. record -qN [--pcm|--g7231] [--port n] filename Records a file via the Quicknet card 'N' (ie /dev/phoneN). This can record .wav files (both PCM and G.723.1 wav files) and also .sw and .g723 files. The --pcm or --g7231 option must be used when recording a .wav file to specify the file type. These options are also used if OpenAM cannot determine the file type from the file extension. The --port option is used to select the source which is 1 for a POTS telephone 2 for the PSTN line on a LineJack card and 3 for the speaker socket. 6. OGM and record file formats ------------------------------ OpenAM supports both .wav files and raw audio files. WAV Files --------- There are two types of .wav file which OpenAM uses. i) 8,000 Hz (8KHz), 16-bit, mono PCM wav files. These are standard wav files and are used whenever the G.711, GSM, MS-GSM, Speex or LPC-10 codecs are used in a call. These wav files can be played on all systems which support the .wav format including Windows, Linux and FreeBSD. ii) G.723.1 encoded wav files. These are a special format of .wav file which are used whenever the G.723.1 codec is used in a call. These wav files can be played on Windows systems using Windows Media Player (after it has automatically downloaded the right codec) or the Windows Sound Recorder (after Media Player has installed the right codec).. They can also be played via a Quicknet card (eg on Linux and FreeBSD) Raw Files --------- Some users may prefer to use raw files instead of .wav files as they can easily be chopped up or joined together. OpenAM also supports i) .sw files containing signed 16-bit mono pcm audio sampled at 8,000 Hz These are used with the G.711, GSM, MS-GSM, Speex and LPC-10 codecs. ii) .g723 files containing G.723.1 data which is used with the G.723.1 codec. The OGM ------- The OGM can be either a .wav file or a raw file. OpenAM will automatically determine the file type from the extension. Wav files which are not in the correct format (8000 hz, 16-bit, mono PCM format) or G.723.1 format will be rejected. User Specific OGMs ------------------ OpenAM can play a different OGM for each person called. For example, when calling roger@h323machine, craig@h323machine and 541153@h323machine, then OpenAM can be made to play message_roger.wav, message_craig.wav and message_541153.wav To do this, use --pcmmessage message_%s.wav The %s in the filename is substituted with the e164 name/number called. This feature does not work with the -m or --message option. You must use the --pcmmessage and --g7231message options. The Recorded Messages --------------------- The recorded messages are written as a .wav files unless the --recordraw option is used in which case a raw files with .sw and .g723 extensions are written. Conversion information ---------------------- The sox package can use used to manipulate both raw files and wav files. Sox uses the extension .sw to identify 8000 Hz signed 16 bit mono audio files, which is why OpenAM uses this extension. To convert a 8000 hz .WAV file to .sw format, just use: sox sample.wav sample.sw the reverse works to convert .sw files to .WAV The same technique applies for .au files Sox can be downloaded from http://sox.sourceforge.net Sox does not support G.723.1 Wav files. However these can be converted to standard PCM format in the Windows Sound Recorder, with the File->Properties->Convert option. There are also some perl scripts for manipulating G.723.1 files written by M.Stoychev . These can be found at http://kgb.cnsys.bg/voice/ Unix tricks ----------- On some Unix systems, /dev/dspW0 can be used to record an OGM in the raw .sw format. For example, you can record your OGM with: cat /dev/dspW0 > my_message.sw (use Control-C to finish recording) And you can play back .sw files with: cat 20010628_140234.sw > /dev/dspW0 And because raw files do not have any headers, they can be easily joined together into a larger audio file just by concatenating them. 6. User programs ---------------- OpenAM can be configured to call a user program after finishing the recording of any message. The most common usage of this feature is to send the voice data as an email attachment to a known email address. A sample shell script called "new_msg" is provided that will do this. See this script for more information. This script expects raw audio files, so use the --recordraw option with OpenAM. In order to run this script you will need the following packages: mimencode part of the metamail package - ftp://thumper.bellcore.com/pub/nsb sox see http://sox.sourceforge.net These are normally available on most Linux systems, and are in the FreeBSD Ports tree and FreeBSD Packages collection, but I had to find them and install them on my Solaris system There is also additional information on G.723.1 tools for WAV files at: http://cds.cnsys.bg/voice/ ------------------------ openam_v1_1_18/cmds.cxx0100644000176200056700000003135310006655555015235 0ustar releasepostincr/* * cmds.cxx * * Auxiliary commands for OpenAM * * Copyright (c) 1993-2001 Equivalence Pty. Ltd. * * The contents of this file are subject to the Mozilla Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. * * The Original Code is Portable Windows Library. * * The Initial Developer of the Original Code is Equivalence Pty. Ltd. * * Contributor(s): ______________________________________. * * $Log: cmds.cxx,v $ * Revision 1.9 2004/01/31 07:38:21 rjongbloed * Changed HAS_IXJ usage to if defined not if non-zero * * Revision 1.8 2002/02/03 22:57:22 rogerh * Add support for playback and recording on the PSTN line using --port 2 * * Revision 1.7 2002/01/26 00:18:19 robertj * Fixed MSVC warnings. * Removed unix specific symbol PORT_POTS * * Revision 1.6 2002/01/25 14:48:34 rogerh * Add a console thread which lets us terminate recording or playback * when the Enter key is pressed * * Revision 1.5 2002/01/25 11:50:10 rogerh * dd --port option to play and record commands so you can use a * telephone on the POTS port or use speakers and microphone. * * Revision 1.4 2002/01/13 20:55:59 rogerh * Update to allow proper recording and playback of both PCM and G.723.1 .WAV * files as well as .sw and .g7231 files * * Revision 1.3 2002/01/11 14:34:20 rogerh * Fix play command so it plays G.723.1 files correctly * * Revision 1.2 2001/09/25 01:10:30 robertj * Fixed compile problerm. Still incomplete code. * * Revision 1.1 2001/09/24 22:39:42 craigs * Added commands to play and record data files, esp G.723.1 * */ #include #include #include "version.h" #include "main.h" class ConsoleThread : public PThread { PCLASSINFO(ConsoleThread, PThread); public: ConsoleThread(PMutex *_enter, BOOL *_enter_pressed) : PThread(1000,AutoDeleteThread) { enter = _enter; enter_pressed = _enter_pressed; Resume(); // start running this thread as soon as the thread is created. } void Main() { PConsoleChannel console(PConsoleChannel::StandardInput); // wait for Enter to be pressed console.peek(); enter->Wait(); *enter_pressed = TRUE; enter->Signal(); } private: PMutex *enter; BOOL *enter_pressed; }; #define new PNEW #ifdef HAS_IXJ #define G7231_BUFFER_SIZE 24 #define PCM_BUFFER_SIZE 480 extern PString G7231Ext; extern PString WAVExt; extern PString PCMExt; extern BOOL CheckWAVFileValid(PWAVFile *chan, int type); #define CHECK_PCM 1 #define CHECK_G7231 2 static BOOL DetermineType(PArgList & args, const PFilePath & fn, BOOL & isPCM, BOOL & isWAV, BOOL openExisting) { BOOL knowType = FALSE; // Handle .WAV file types if ((fn.GetType() *= WAVExt) && (openExisting)) { // determine the file type by peeking into the existing file PWAVFile *wavfile = new PWAVFile(fn, PFile::ReadOnly); if (!wavfile->IsOpen()) { PError << "error: cannot open file \"" << fn << "\"" << endl; delete wavfile; return FALSE; } if (CheckWAVFileValid(wavfile,CHECK_G7231)) isPCM = FALSE; else if (CheckWAVFileValid(wavfile,CHECK_PCM)) isPCM = TRUE; else { PError << "error: invalid wav file format for file \"" << fn << "\"" << endl; delete wavfile; return FALSE; } wavfile->Close(); delete wavfile; isWAV = TRUE; knowType = TRUE; } if ((fn.GetType() *= WAVExt) && (!openExisting)) { // determine the file type from the command line options if (args.HasOption("pcm")) { isPCM = TRUE; isWAV = TRUE; knowType = TRUE; } else if (args.HasOption("g7231")) { isPCM = FALSE; isWAV = TRUE; knowType = TRUE; } else { PError << "usage: recording a .wav file requires either --g7231 or --pcm," << endl; return FALSE; } } // For non .WAV files determine file type from filename extension if (fn.GetType() *= G7231Ext) { isPCM = FALSE; isWAV = FALSE; knowType = TRUE; } if (fn.GetType() *= PCMExt) { isPCM = TRUE; isWAV = FALSE; knowType = TRUE; } // if we still do not know the file type, use the command line options if (!knowType) { if (args.HasOption("pcm")) { isPCM = TRUE; isWAV = FALSE; knowType = TRUE; } else if (args.HasOption("g7231")) { isPCM = FALSE; isWAV = FALSE; knowType = TRUE; } } // error if we could not determine the file type if (!knowType) { PError << "usage: command requires either --g7231 or --pcm," << " or filename with " << WAVExt << " or " << G7231Ext << " or " << PCMExt << " extension" << endl; return FALSE; } return TRUE; } static BOOL OpenDevice(OpalIxJDevice & xJack, const PString & ixjDevice, int port) { if (!xJack.Open(ixjDevice)) { PError << "error: cannot open device \"" << ixjDevice << "\"" << endl; return FALSE; } xJack.SetLineToLineDirect(0, 1, FALSE); if (port == 3) xJack.EnableAudio(0, FALSE); if (port == 2) xJack.EnableAudio(OpalIxJDevice::PSTNLine, TRUE); if (port == 1) xJack.EnableAudio(OpalIxJDevice::POTSLine, TRUE); return TRUE; } void OpenAm::RecordFile(PArgList & args) { if (args.GetCount() < 2) { PError << "usage: openam record [--port n] [--pcm|--g7231] -q N fn" << endl; PError << "usage: port 1=POTS 3=MIC+SPEAKER" << endl; PError << "usage: -q N quicknet device. Eg -q 0" << endl; PError << "usage: -fn filename" << endl; return; } PFilePath fn = args[1]; BOOL isPCM = FALSE; BOOL isWAV = FALSE; int port; // Determine the type of file if (!DetermineType(args, fn, isPCM, isWAV, FALSE)) return; PFile *recordFile; if (isWAV) { if (isPCM) recordFile = new PWAVFile(PWAVFile::PCM_WavFile); else recordFile = new PWAVFile(PWAVFile::G7231_WavFile); } else recordFile = new PFile(); if (recordFile == NULL) return; // open the file if (!recordFile->Open(fn, PFile::WriteOnly)) { PError << "error: cannot open file \"" << fn << "\"" << endl; return; } // open the device if (!args.HasOption('q')) { PError << "error: record command requires -q option for Quicknet device" << endl; return; } cout << "ok" << endl << "Recording " << (isPCM ? "PCM" : "G.723.1") << (isWAV ? " wav message" : " message") << endl; if (args.HasOption("port")) { port = args.GetOptionString("port").AsInteger(); } else { port = OpalIxJDevice::POTSLine; // default to a real telephone } OpalIxJDevice xJack; if (!OpenDevice(xJack, args.GetOptionString('q'),port)) return; // ring handset if (port == OpalIxJDevice::POTSLine) { xJack.RingLine(OpalIxJDevice::POTSLine, 0x33); // wait for answer cout << "Waiting for phone to go offhook..."; cout.flush(); while (!xJack.IsLineOffHook(OpalIxJDevice::POTSLine)) Sleep(100); cout << endl; } // start codecs if (!xJack.SetReadCodec (OpalIxJDevice::POTSLine, isPCM ? RTP_DataFrame::L16_Mono : RTP_DataFrame::G7231)) { PError << "error: error during SetReadCodec" << endl; return; } if (!xJack.SetWriteCodec(OpalIxJDevice::POTSLine, isPCM ? RTP_DataFrame::L16_Mono : RTP_DataFrame::G7231)) { PError << "error: error during SetWriteCodec" << endl; return; } // determine the read buffer size PINDEX bufferSize; if (isPCM) bufferSize = xJack.GetReadFrameSize(OpalIxJDevice::POTSLine); else bufferSize = G7231_BUFFER_SIZE; // allocate a buffer PBYTEArray buffer; buffer.SetSize(bufferSize); // Create the console thread. PMutex enter; BOOL enter_pressed = FALSE; PThread * consolethread; consolethread = new ConsoleThread( &enter, &enter_pressed); cout << "Recording Started." << endl << "To stop recording " ; if (port == OpalIxJDevice::POTSLine) cout << "put the phone back onhook or "; cout << "press Enter" << endl; // start recording for (;;) { // stop if we are using POTS and the telephone handset it put down if ((port == OpalIxJDevice::POTSLine) && (!xJack.IsLineOffHook(OpalIxJDevice::POTSLine))) break; // stop if the user pressed Enter on the console enter.Wait(); if (enter_pressed == TRUE) { enter.Signal(); break; } enter.Signal(); PINDEX count; if (!xJack.ReadFrame(OpalIxJDevice::POTSLine, buffer.GetPointer(), count)) { PError << "error: error during ReadFrame" << endl; return; } recordFile->Write(buffer, count); } cout << "Recording Finished" << endl; // stop recording; xJack.StopReadCodec (OpalIxJDevice::POTSLine); xJack.StopWriteCodec(OpalIxJDevice::POTSLine); // close the file recordFile->Close(); delete recordFile; } void OpenAm::PlayFile(PArgList & args) { if (args.GetCount() < 2) { PError << "usage: openam play [--port n] [--pcm|--g7231] -q N fn" << endl; PError << "usage: port 1=POTS 2=PSTN 3=MIC+SPEAKER" << endl; PError << "usage: -q N quicknet device. Eg -q 0" << endl; PError << "usage: -fn filename" << endl; return; } PFilePath fn = args[1]; BOOL isPCM = FALSE; BOOL isWAV = FALSE; int port; // Determine the type of file if (!DetermineType(args, fn, isPCM, isWAV, TRUE)) return; PFile *playFile; if (isWAV) playFile = new PWAVFile(); else playFile = new PFile(); if (playFile == NULL) return; // open the file if (!playFile->Open(fn, PFile::ReadOnly)) { PError << "error: cannot open file \"" << fn << "\"" << endl; return; } // open the device if (!args.HasOption('q')) { PError << "error: play command requires -q option for Quicknet device" << endl; return; } cout << "Playing " << (isPCM ? "PCM" : "G.723.1") << (isWAV ? " wav message" : " message") << endl; if (args.HasOption("port")) { port = args.GetOptionString("port").AsInteger(); } else { port = 1; // default to a real telephone } OpalIxJDevice xJack; if (!OpenDevice(xJack, args.GetOptionString('q'),port)) return; // ring handset if (port == 1) { xJack.RingLine(OpalIxJDevice::POTSLine, 0x33); // wait for answer cout << "Waiting for phone to go offhook..."; cout.flush(); while (!xJack.IsLineOffHook(OpalIxJDevice::POTSLine)) Sleep(100); cout << endl; } // start codecs if (!xJack.SetReadCodec (OpalIxJDevice::POTSLine, isPCM ? RTP_DataFrame::L16_Mono : RTP_DataFrame::G7231)) { PError << "error: error during SetReadCodec" << endl; return; } if (!xJack.SetWriteCodec(OpalIxJDevice::POTSLine, isPCM ? RTP_DataFrame::L16_Mono : RTP_DataFrame::G7231)) { PError << "error: error during SetWriteCodec" << endl; return; } // determine the write buffer size PINDEX bufferSize; if (isPCM) bufferSize = xJack.GetReadFrameSize(OpalIxJDevice::POTSLine); else bufferSize = G7231_BUFFER_SIZE; // allocate a buffer PBYTEArray buffer; buffer.SetSize(bufferSize); // Create the console thread. PMutex enter; BOOL enter_pressed = FALSE; PThread * consolethread; consolethread = new ConsoleThread( &enter, &enter_pressed); cout << "Playback Started." << endl << "To stop playback " ; if (port == 1) cout << "put the phone back onhook or "; cout << "press Enter" << endl; // start playing for (;;) { // stop if we are using POTS and the telephone handset it put down if ((port == 1) && (!xJack.IsLineOffHook(OpalIxJDevice::POTSLine))) { break; } // stop if the user pressed Enter on the console enter.Wait(); if (enter_pressed == TRUE) { enter.Signal(); break; } enter.Signal(); PINDEX count = 0; if (isPCM) { if (!playFile->Read(buffer.GetPointer(), bufferSize)) break; } else { if (!playFile->Read(buffer.GetPointer(), 1)) break; count++; static const int frameLen[] = { 24, 20, 4, 1 }; if (!playFile->Read(buffer.GetPointer()+1, frameLen[buffer[0]&3] - 1)) break; } count += playFile->GetLastReadCount(); PINDEX written; if (!xJack.WriteFrame(OpalIxJDevice::POTSLine, buffer.GetPointer(), count, written)) { PError << "error: error during WriteFrame" << endl; return; } } // stop recording; xJack.StopReadCodec (OpalIxJDevice::POTSLine); xJack.StopWriteCodec(OpalIxJDevice::POTSLine); // close the file playFile->Close(); delete playFile; } #endif openam_v1_1_18/main.cxx0100644000176200056700000014330510200276246015224 0ustar releasepostincr/* * main.cxx * * Main source for for OpenAM * * A H.323 answering machine application. * * Copyright (c) 1993-2001 Equivalence Pty. Ltd. * * The contents of this file are subject to the Mozilla Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. * * The Original Code is Portable Windows Library. * * The Initial Developer of the Original Code is Equivalence Pty. Ltd. * * Portions are Copyright (C) 1993 Free Software Foundation, Inc. * All Rights Reserved. * * Contributor(s): ______________________________________. * * $Log: main.cxx,v $ * Revision 1.93 2005/02/03 01:21:42 csoutheren * Added called party to call log and command parameters * * Revision 1.92 2004/05/26 04:01:57 csoutheren * Changed to work completely with new plugin codecs * * Revision 1.91 2004/05/10 13:07:19 rjongbloed * Changed G.726 and MS-ADPCM to plug in codecs. * * Revision 1.90 2004/05/04 12:21:16 rjongbloed * Converted LPC-10 codec to plug in. * * Revision 1.89 2004/05/03 13:25:46 rjongbloed * Converted everything to be codec plug in freindly * Removed GSM and G.729 as now plug ins are "the way"! * * Revision 1.88 2004/04/06 11:27:49 rjongbloed * Changes to support native C++ Run Time Type Information * Changes for codec plug ins * * Revision 1.87 2004/01/31 07:38:21 rjongbloed * Changed HAS_IXJ usage to if defined not if non-zero * * Revision 1.86 2004/01/02 02:52:10 csoutheren * Thanks to Michal Zygmuntowicz for these changes * Added support for iLBC codec * Added ability to specify a gatekeeper password, * Fixed small bug with Speex capabilities being accidentally included. * * Revision 1.85 2003/12/02 09:46:59 csoutheren * Added --loop option thanks to Jan Willamowius * * Revision 1.84 2002/11/13 10:23:12 rogerh * Enable Speex support by default. * * Revision 1.83 2002/11/10 08:12:42 robertj * Moved constants for "well known" ports to better place (OPAL change). * * Revision 1.82 2002/08/21 08:48:09 rogerh * Fix some problems caused by the user specif OGM changes * * Revision 1.81 2002/08/21 06:55:09 rogerh * Support all 5 Speex bitrates. * * Revision 1.80 2002/08/16 02:04:30 craigs * Ensure compilation without Speex installed * * Revision 1.79 2002/08/15 18:52:49 rogerh * Add support for one of the Speex codecs * * Revision 1.78 2002/08/05 10:06:06 robertj * Changed to use the version of G.7231. file capability/codec as used in * opalvxml module. Prevents duplicate symbol link errors. * * Revision 1.77 2002/06/28 00:30:41 robertj * Fixed Clone() for G.723 file capability, must clone contents! * * Revision 1.76 2002/05/08 03:15:35 robertj * Removed unecessary initialisation of frameBuffer PBYTEArray * * Revision 1.75 2002/04/01 14:45:43 craigs * Fixed flag to end call after OGM * * Revision 1.74 2002/04/01 13:16:09 craigs * Added ability to kill calls at end of playing OGM * Added ability to play different OGMs depending on target DN * * Revision 1.73 2002/02/21 07:21:52 rogerh * Change the outgoing audio's FrameDelay() code to use the PAdaptiveDelay * class which should give clearer audio for the OGMs. * * Revision 1.72 2002/02/04 13:23:24 rogerh * Change the silence frame back to a 4 byte SID. It caused Quicnet cards * to play a loud noise instead of silence. * * Revision 1.71 2002/01/31 16:12:26 rogerh * Clear the end of the frame buffer if we cannot read a full frame. * * Revision 1.70 2002/01/26 09:40:03 rogerh * Make OpenAM send out G.723.1 OGM audio files correctly. * * Revision 1.69 2002/01/25 11:50:10 rogerh * dd --port option to play and record commands so you can use a * telephone on the POTS port or use speakers and microphone. * * Revision 1.68 2002/01/25 08:58:46 rogerh * Send out silence using a standard 24 byte frame instead of a 4 byte SID. * This is a workaround to support an end point which does not understand SID. * * Revision 1.67 2002/01/22 04:15:04 craigs * Updated for move of PWavFile to PTCLib * Replaced AudioDelay with PAdaptiveDelay * * Revision 1.66 2002/01/11 16:07:15 rogerh * Make PCMExt non static as it is used externally in cmds.cxx * * Revision 1.65 2001/11/18 23:07:36 craigs * Fixed problem whereby recording could start when queue of OGMs was not empty * Thanks to Frank Derks * * Revision 1.64 2001/10/24 10:45:33 rogerh * replace 4 byte SID frames with 24 byte frames of silence. Windows Media * Player's codec cannot handle SID frames. * * Revision 1.63 2001/10/24 10:28:59 rogerh * Make -m option find g7231 wav files. * Fix bug where record file format was set by the outgoing codec type. * (fixes bug when NetMeeting decides to receive G.723.1 and send MS-GSM) * * Revision 1.62 2001/10/24 09:01:07 rogerh * Fix a mistake in the 24 byte frames used for silence. * * Revision 1.61 2001/10/16 12:28:43 rogerh * Add support for saving g.723.1 audio data into a g.723.1 WAV File * * Revision 1.60 2001/10/15 14:55:03 rogerh * Add error message * * Revision 1.59 2001/10/15 14:20:10 rogerh * Add support for reading G.723.1 WAV files for the G.723.1 codec. * Recorded messages are still saved out in raw .g723 files. * * Revision 1.58 2001/10/15 07:09:38 rogerh * New sox homepage * * Revision 1.57 2001/10/14 08:22:54 rogerh * Record the silence in G.723.1 connections to the record file. * This also gives a proper fix for the 100% CPU utilisation bug. * * Revision 1.56 2001/10/13 07:13:18 rogerh * Add a 5ms sleep if the length of the G.723.1 audio data is zero. * This hack stops the 100% CPU usage seen when recording G.723.1 files. * Submitted by Maurizio Beni * * Revision 1.55 2001/10/04 23:55:00 craigs * Added deletion of file in PCM_RecordFile destructor thanks to Patrick Koorevaar * * Revision 1.54 2001/10/02 11:02:31 rogerh * Use the audio delay class when writing G723.1 audio files. * Add a quick hack.Set the frameBuffer to 1024 so OpenAM tworks on Unix boxes * * Revision 1.53 2001/09/29 07:11:48 rogerh * Delete ogmChanel in destructor - Patrick Koorevaar * Only call conn.ClearCall() once after we pass the record time limit. * Reported by Patrick. * * Revision 1.52 2001/09/28 00:14:30 robertj * Changed BYTE* to PBYTEArray so get automatic memory management. * Fixed redundant entries in argument parsing, thanks Patrick Koorevaar * * Revision 1.51 2001/09/24 22:39:42 craigs * Added commands to play and record data files, esp G.723.1 * * Revision 1.50 2001/08/24 14:04:29 rogerh * Delete the listener if StartListener() fails. * * Revision 1.49 2001/08/13 00:01:15 robertj * Fixed #ifdef for memory check code to use PMEMORY_CHECK and not _DEBUG * * Revision 1.48 2001/07/23 09:17:36 rogerh * Add the LPC10 codec, a low quality and low bitrate codec. * * Revision 1.47 2001/07/23 04:01:10 rogerh * remove debugging info * * Revision 1.46 2001/07/20 03:36:58 robertj * Minor cosmetic changes to new PWAVFile class. * * Revision 1.45 2001/07/19 10:05:27 rogerh * PWAVFile is now part of the standard PWLib. * * Revision 1.44 2001/07/17 14:33:01 rogerh * Support writing of .wav audio files from PCM codecs (eg G711 and GSM). * .wav files are written out by default now. If you still want to record * to raw audio files with a .sw extension, use the --recordraw option. * * Revision 1.43 2001/07/17 12:02:37 rogerh * Change title, OpenAm -> OpenAM * * Revision 1.42 2001/07/14 07:44:29 rogerh * Add .wav file support to the OGM. * The -m option now looks for .wav and then .sw file extensions. * .wav file must be 16 bit mono at 8000 Hz * * Revision 1.41 2001/07/11 15:47:55 rogerh * Add G711 A-Law codec, reported by Niels Svennekjr * * Revision 1.40 2001/07/01 07:38:57 rogerh * Add Microsoft GSM codec. Also allocate memory for frameBuffer dynamically * as different codecs can have different frame sizes. * * Revision 1.39 2001/06/29 11:13:15 rogerh * Add AudioDelay class which removes the jitter in recorded files. * * Revision 1.38 2001/06/29 09:01:17 rogerh * Put back a line accidentally deleted in the last commit * * Revision 1.37 2001/06/29 06:34:57 rogerh * Add mutex locks in PCM_Recordfile. This solves the race condition where * Close() was called while Write() was still running. * * Revision 1.36 2001/04/27 07:08:46 robertj * Fixed 100% Cip problem, thanks APinaev@microtest.ru * * Revision 1.35 2001/03/20 23:42:55 robertj * Used the new PTrace::Initialise function for starting trace code. * * Revision 1.34 2001/01/25 07:27:14 robertj * Major changes to add more flexible OpalMediaFormat class to normalise * all information about media types, especially codecs. * * Revision 1.33 2000/10/20 23:11:29 robertj * Fixed incorrect parameter parsing string that stopped -l from working, thanks Bruno BOSQUED * * Revision 1.32 2000/10/19 06:55:41 robertj * Fixed compiler crash by rearranging loop. * * Revision 1.31 2000/08/29 23:11:41 robertj * Fixed MSVC warnings. * * Revision 1.30 2000/08/29 12:32:07 craigs * Fixed problems with recording messages * * Revision 1.29 2000/08/28 16:42:59 craigs * Finally fixed problems with G.723.1. All codecs now working * * Revision 1.28 2000/08/28 09:13:54 robertj * Fixed MSVC compiler warnings. * * Revision 1.27 2000/08/28 07:49:26 craigs * New code to maybe get G.723.1 replaying working * * Revision 1.26 2000/08/28 00:38:37 craigs * Added support for setting listening port number * * Revision 1.25 2000/08/27 23:42:24 craigs * Fixed problem with playback of messages * Fixed problem with recording messages * * Revision 1.24 2000/06/20 02:38:27 robertj * Changed H323TransportAddress to default to IP. * * Revision 1.23 2000/06/17 09:14:52 robertj * Added setting of closed flag when closing OGM. * * Revision 1.22 2000/05/25 13:25:47 robertj * Fixed incorrect "save" parameter specification. * * Revision 1.21 2000/05/25 12:06:17 robertj * Added PConfigArgs class so can save program arguments to config files. * * Revision 1.20 2000/05/11 11:47:11 robertj * Fixed alpha linux GNU compiler problems. * * Revision 1.19 2000/05/10 05:14:25 robertj * Changed capabilities so has a function to get name of codec, instead of relying on PrintOn. * * Revision 1.18 2000/05/09 11:22:15 craigs * Fixed problems caused by new jitter buffer code * and fixed OGM problems * * Revision 1.17 2000/05/09 02:41:32 craigs * Added extra debugging, and fixed problems with OGM in non-IVR mode * * Revision 1.16 2000/04/26 03:18:38 craigs * Fixed problem when GSM specified as preferred codec * * Revision 1.15 2000/04/25 23:34:22 craigs * Added lots of new code, including outgoing and incoming * multiplexors, and the start of an IVR system * * Revision 1.14 2000/01/13 04:03:45 robertj * Added video transmission * * Revision 1.13 2000/01/07 08:28:09 robertj * Additions and changes to line interface device base class. * * Revision 1.12 1999/12/10 01:44:46 craigs * Added ability to set interface * * Revision 1.11 1999/12/01 04:38:25 robertj * Added gatekeeper support to OpenAM * * Revision 1.10 1999/11/11 00:27:49 robertj * Changed OnAnswerCall() call back function to allow for asyncronous response. * * Revision 1.9 1999/11/06 13:27:48 craigs * Added extra output and changed for new library changes * * Revision 1.8 1999/10/29 10:57:04 robertj * Added answering machine project. * * Revision 1.7 1999/10/24 12:50:37 craigs * Fixed G723.1 capability, and added ability for discrete OGMs * * Revision 1.6 1999/10/24 08:24:56 craigs * Added GSM capability back in * * Revision 1.5 1999/10/24 08:19:58 craigs * Fixed problem that caused crash when unknown codecs used * * Revision 1.4 1999/10/24 03:29:07 craigs * Fixed problem with -h parsing * * Revision 1.3 1999/10/24 03:08:49 craigs * Fixed problem with recording zero length messages, and added autodelete of files * * Revision 1.2 1999/10/22 09:56:24 craigs * Fixed various compile warnings * * Revision 1.1 1999/10/11 00:15:18 craigs * Initial version * */ #include #include #include "version.h" #include "opalvxml.h" #include "main.h" PCREATE_PROCESS(OpenAm); #define new PNEW #define DEFAULT_MSG_LIMIT 30 #define DEFAULT_CALL_LOG "call_log.txt" #define G7231_SAMPLES_PER_BLOCK 240 #define CHECK_PCM 1 #define CHECK_G7231 2 #define MENU_PREFIX "UserMenu-" static PMutex logMutex; static PTextFile logFile; static PFilePath logFilename = DEFAULT_CALL_LOG; PString G7231Ext = ".g723"; PString WAVExt = ".wav"; PString PCMExt = ".sw"; static void LogMessage(const PString & str) { PTime now; PString msg = now.AsString("hh:mm:ss dd/MM/yyyy") & str; logMutex.Wait(); if (!logFile.IsOpen()) { logFile.Open(logFilename, PFile::ReadWrite); logFile.SetPosition(0, PFile::End); } logFile.WriteLine(msg); logFile.Close(); logMutex.Signal(); } static void LogCall(const PFilePath & fn, const PString & from, const PString & user, unsigned len, const PString & codec, const PString & product, const PString & to) { PString addr = from; LogMessage(addr & "\"" + user + "\"" & PString(PString::Unsigned, len) & codec & "\"" + product + "\"" & "\"" + fn + "\"" & "\"" + to + "\""); } /////////////////////////////////////////////////////////////// OpenAm::OpenAm() : PProcess("OpenH323 Project", "OpenAM", MAJOR_VERSION, MINOR_VERSION, BUILD_TYPE, BUILD_NUMBER) { } OpenAm::~OpenAm() { } void OpenAm::Main() { cout << GetName() << " Version " << GetVersion(TRUE) << " by " << GetManufacturer() << " on " << GetOSClass() << ' ' << GetOSName() << " (" << GetOSVersion() << '-' << GetOSHardware() << ")\n\n"; PConfigArgs args(GetArguments()); args.Parse( "D-disable:" "d-directory:" "g-gatekeeper:" "n-no-gatekeeper." "-g711-ulaw." "-no-g711-ulaw." "-g711-alaw." "-no-g711-alaw." "-g711message:" "-no-g711message." "-g7231." "-no-g7231." "-g7231message:" "-no-g7231message." "-ilbc." "-no-ilbc." "-ilbcmessage:" "-no-ilbcmessage." "-gsm." "-no-gsm." "-gsmmessage:" "-no-gsmmessage." "h-help." "H-hangup." "-no-hangup." "i-interface:" "-no-interface." "k-kill." "-no-kill." "l-limit:" "-no-limit." "-listenport:" "-no-listenport." "-lpc10message:" "-no-lpc10message." "-speexmessage:" "-no-speexmessage." "m-message:" "-no-message." "-no-recordg7231." "-loop." #if PTRACING "o-output:" #endif "P-prefer:" "-pcm." "-no-pcm." "-pcmmessage:" "-no-pcmmessage." "-port:" "q-quicknet:" "-no-quicknet:" "r-run:" "-no-run." "-recordraw." "-require-gatekeeper." "-no-require-gatekeeper." "-save." #if PMEMORY_CHECK "-setallocationbreakpoint:" #endif #if PTRACING "t-trace." #endif "u-username:" "-no-username." "p-password:" , FALSE); #if PMEMORY_CHECK if (args.HasOption("setallocationbreakpoint")) PMemoryHeap::SetAllocationBreakpoint(args.GetOptionString("setallocationbreakpoint").AsInteger()); #endif #if PTRACING PTrace::Initialise(args.GetOptionCount('t'), args.HasOption('o') ? (const char *)args.GetOptionString('o') : NULL); #endif if (args.HasOption('h')) { cout << "Usage : " << GetName() << " [options]\n" "Options:\n" " -d --directory dir : Put recorded mesages into dir\n" " -l --limit secs : Limit recorded messages to secs duration (default " << DEFAULT_MSG_LIMIT << ")\n" " -m --pcmmessage fn : Set outgoing message for PCM derived codecs (G.711/GSM) to fn\n" " --g7231message fn : Set outgoing message for G723.1 codec to fn\n" " --g711message fn : Set outgoing message for G711 codec to fn\n" " --gsmmessage fn : Set outgoing message for GSM codec to fn\n" " --lpc10message fn : Set outgoing message for LPC10 codec to fn\n" " --speexmessage fn : Set outgoing message for Speex codec to fn\n" " --ilbcmessage fn : Set outgoing message for iLBC codec to fn\n" " --loop : loop message, no recording\n" " --recordraw : Record PCM audo in raw files (.sw) instead of .wav\n" " -r --run cmd : Run this command after each recorded message\n" " -k --kill : Kill recorded files after user command\n" " -H --hangup : hangup after playing message\n" " -u --username str : Set the local endpoint name to str\n" " -p --password str : Set the gatekeeper password to str\n" " -i --interface ip : Bind to a specific interface\n" " --listenport port : Listen on a specific port\n" " -g --gatekeeper host: Specify gatekeeper host.\n" " -n --no-gatekeeper : Disable gatekeeper discovery.\n" " --require-gatekeeper: Exit if gatekeeper discovery fails.\n" " -D --disable codec : Disable the specified codec (may be used multiple times)\n" " -P --prefer codec : Prefer the specified codec (may be used multiple times)\n" #if PTRACING " -t --trace : Enable trace, use multiple times for more detail\n" " -o --output : File for trace output, default is stderr\n" #endif " --save : Save arguments in configuration file\n" " -h --help : Display this help message\n"; return; } args.Save("save"); #ifdef HAS_IXJ if (args.GetCount() > 0) { if (args[0] *= "record") RecordFile(args); else if (args[0] *= "play") PlayFile(args); else cerr << "unknown command \"" << args[0] << "\"" << endl; return; } #endif unsigned callLimit = DEFAULT_MSG_LIMIT; if (args.HasOption('l')) { callLimit = args.GetOptionString('l').AsInteger(); if (callLimit > 3600) { cout << "warning: maximum call length " << callLimit << " is out of range. Using " << DEFAULT_MSG_LIMIT << " instead\n"; callLimit = DEFAULT_MSG_LIMIT; } else if (callLimit == 0) cout << "warning: recorded message call limit disabled\n"; } cout << "Recorded messages limited to " << callLimit << " seconds\n"; PString runCmd; if (args.HasOption('r')) { runCmd = args.GetOptionString('r'); cout << "Executing \"" << runCmd << "\" after each message" << endl; } PDirectory dir; if (args.HasOption('d')) dir = args.GetOptionString('d'); int flags = 0; if (args.HasOption("no-recordg7231")) { cout << "Supressing recording of G723.1 messages" << endl; flags |= MyH323EndPoint::NoRecordG7231; } if (args.HasOption('k')) { cout << "Deleting recorded files after processing" << endl; if (runCmd.IsEmpty()) cout << "WARNING: recorded files will be deleted even though no run command is present" << endl; flags |= MyH323EndPoint::DeleteAfterRecord; } if (args.HasOption('H')) flags |= MyH323EndPoint::HangupAfterPlay; MyH323EndPoint endpoint(callLimit, runCmd, dir, flags); PString userName = "OpenH323 Answering Machine v" + GetVersion(); if (args.HasOption('u')) userName = args.GetOptionString('u'); endpoint.SetLocalUserName(userName); if (args.HasOption('p')) { const PString password = args.GetOptionString('p'); endpoint.SetGatekeeperPassword(password); } if (!endpoint.Initialise(args)) return; // start the H.323 listener H323ListenerTCP * listener; PIPSocket::Address interfaceAddress(INADDR_ANY); WORD listenPort = H323EndPoint::DefaultTcpPort; if (args.HasOption("listenport")) listenPort = (WORD)args.GetOptionString("listenport").AsInteger(); if (args.HasOption('i')) interfaceAddress = PIPSocket::Address(args.GetOptionString('i')); listener = new H323ListenerTCP(endpoint, interfaceAddress, listenPort); if (!endpoint.StartListener(listener)) { cout << "Could not open H.323 listener port on " << listener->GetListenerPort() << endl; delete listener; return; } if (args.HasOption('g')) { PString gkName = args.GetOptionString('g'); if (endpoint.SetGatekeeper(gkName, new H323TransportUDP(endpoint))) cout << "Gatekeeper set: " << *endpoint.GetGatekeeper() << endl; else { cout << "Error registering with gatekeeper at \"" << gkName << '"' << endl; return; } } else if (!args.HasOption('n')) { cout << "Searching for gatekeeper..." << flush; if (endpoint.DiscoverGatekeeper(new H323TransportUDP(endpoint))) cout << "\nGatekeeper found: " << *endpoint.GetGatekeeper() << endl; else { cout << "\nNo gatekeeper found." << endl; if (args.HasOption("require-gatekeeper")) return; } } cout << "Waiting for incoming calls for \"" << endpoint.GetLocalUserName() << '"' << endl; for (;;) PThread::Current()->Sleep(5000); } /////////////////////////////////////////////////////////////// MyH323EndPoint::MyH323EndPoint(unsigned _callLimit, const PString & _runCmd, const PDirectory & _dir, int _flags) : callLimit(_callLimit), runCmd(_runCmd), dir(_dir), flags(_flags) { } BOOL MyH323EndPoint::OnIncomingCall(H323Connection & _conn, const H323SignalPDU & setupPDU, H323SignalPDU &) { MyH323Connection & conn = (MyH323Connection &)_conn; // see if incoming call is to a getway address PString number; if (setupPDU.GetDestinationE164(number)) conn.SetE164Number(number); return TRUE; } H323Connection * MyH323EndPoint::CreateConnection(unsigned callReference) { return new MyH323Connection(*this, callReference); } BOOL MyH323EndPoint::Initialise(PConfigArgs & args) { // format for record files, raw or wav if (args.HasOption("recordraw")) SetRecordWav(FALSE); else SetRecordWav(TRUE); // get G723.1 OGM if (args.HasOption("g7231message")) g7231Ogm = args.GetOptionString("g7231message"); else if (args.HasOption('m')) { if (PFile::Exists(args.GetOptionString('m') + "_g7231" + WAVExt)) { g7231Ogm = args.GetOptionString('m') + "_g7231" + WAVExt; } else if (PFile::Exists(args.GetOptionString('m') + PCMExt)) { g7231Ogm = args.GetOptionString('m') + G7231Ext; } } if (!g7231Ogm.IsEmpty()) { // check if the file exists. (do not check if filename contains %s) if ((g7231Ogm.Find("%s") == P_MAX_INDEX) && !PFile::Exists(g7231Ogm)) { cout << "warning: cannot open G723.1 OGM file \"" << g7231Ogm << "\"" << endl; g7231Ogm = ""; } } if (g7231Ogm.IsEmpty()) cout << "No G.723.1 outgoing message set\n"; else { cout << "Using \"" << g7231Ogm << "\" as G.723.1 outgoing message\n"; } // Get the OGM message for the 'PCM' codecs // Check if the file specified exists. If it does, use it. // If it does not exist, try with .wav and .sw extensions. if (args.HasOption("pcmmessage")) { pcmOgm = args.GetOptionString("pcmmessage"); } else if (args.HasOption('m')) { if (PFile::Exists(args.GetOptionString('m'))) { pcmOgm = args.GetOptionString('m'); } else if (PFile::Exists(args.GetOptionString('m') + WAVExt)) { pcmOgm = args.GetOptionString('m') + WAVExt; } else if (PFile::Exists(args.GetOptionString('m') + PCMExt)) { pcmOgm = args.GetOptionString('m') + PCMExt; } } if (args.HasOption("loop")) SetLoopMessage(TRUE); else SetLoopMessage(FALSE); // By default, use the pcmOgm for all the PCM codecs, but allow the user // to override them. gsmOgm = pcmOgm; g711Ogm = pcmOgm; lpc10Ogm = pcmOgm; speexOgm = pcmOgm; ilbcOgm = pcmOgm; // We can set the filename for specific codecs. if (args.HasOption("gsmmessage")) gsmOgm = args.GetOptionString("gsmmessage"); if (args.HasOption("g711message")) g711Ogm = args.GetOptionString("g711message"); if (args.HasOption("lpc10message")) lpc10Ogm = args.GetOptionString("lpc10message"); if (args.HasOption("speexmessage")) speexOgm = args.GetOptionString("speexmessage"); if (args.HasOption("ilbcmessage")) ilbcOgm = args.GetOptionString("ilbcmessage"); // Check GSM OGM message if (!gsmOgm.IsEmpty()) { if ((gsmOgm.Find("%s") == P_MAX_INDEX) && !PFile::Exists(gsmOgm)) { cout << "warning: cannot open GSM OGM file \"" << gsmOgm << "\"" << endl; gsmOgm = ""; } } if (gsmOgm.IsEmpty()) cout << "No GSM outgoing message set\n"; else { cout << "Using \"" << gsmOgm << "\" as GSM outgoing message\n"; } // Check G.711 OGM message if (!g711Ogm.IsEmpty()) { if ((g711Ogm.Find("%s") == P_MAX_INDEX) && !PFile::Exists(g711Ogm)) { cout << "warning: cannot open G711 OGM file \"" << g711Ogm << "\"" << endl; g711Ogm = ""; } } if (g711Ogm.IsEmpty()) cout << "No G711 outgoing message set\n"; else { cout << "Using \"" << g711Ogm << "\" as G.711 outgoing message\n"; } // Check LPC10 OGM message if (!lpc10Ogm.IsEmpty()) { if ((lpc10Ogm.Find("%s") == P_MAX_INDEX) && !PFile::Exists(lpc10Ogm)) { cout << "warning: cannot open LPC10 OGM file \"" << lpc10Ogm << "\"" << endl; lpc10Ogm = ""; } } if (lpc10Ogm.IsEmpty()) cout << "No LPC10 outgoing message set\n"; else { cout << "Using \"" << lpc10Ogm << "\" as LPC10 outgoing message\n"; } // Check Speex OGM message if (!speexOgm.IsEmpty()) { // check if the file exists. (do not check if filename contains %s) if ((speexOgm.Find("%s") == P_MAX_INDEX) && !PFile::Exists(speexOgm)) { cout << "warning: cannot open Speex OGM file \"" << speexOgm << "\"" << endl; speexOgm = ""; } } if (speexOgm.IsEmpty()) cout << "No Speex outgoing message set\n"; else { cout << "Using \"" << speexOgm << "\" as Speex outgoing message\n"; } // Check iLBC OGM message if (!ilbcOgm.IsEmpty()) { // check if the file exists. (do not check if filename contains %s) if ((ilbcOgm.Find("%s") == P_MAX_INDEX) && !PFile::Exists(ilbcOgm)) { cout << "warning: cannot open iLBC OGM file \"" << ilbcOgm << "\"" << endl; ilbcOgm = ""; } } if (ilbcOgm.IsEmpty()) cout << "No iLBC outgoing message set\n"; else { cout << "Using \"" << ilbcOgm << "\" as iLBC outgoing message\n"; } if (g7231Ogm.IsEmpty() && gsmOgm.IsEmpty() && g711Ogm.IsEmpty() && lpc10Ogm.IsEmpty() && speexOgm.IsEmpty() ) { cerr << "Must specify at least one outgoing message" << endl; return FALSE; } AddAllCapabilities(0, 0, "*"); PString removeString; if (gsmOgm.IsEmpty()) removeString = removeString & OpalGSM0610 & "MS-GSM"; if (speexOgm.IsEmpty()) removeString = removeString & "Speex"; if (g711Ogm.IsEmpty()) removeString = removeString & "711"; if (lpc10Ogm.IsEmpty()) removeString = removeString & "LPC-10"; if (ilbcOgm.IsEmpty()) removeString = removeString & "iLBC"; if (!g7231Ogm.IsEmpty()) SetCapability(0, 0, new G7231_File_Capability); capabilities.Remove(args.GetOptionString('D').Lines()); if (!removeString.IsEmpty()) capabilities.Remove(removeString.Tokenise(' ')); capabilities.Reorder(args.GetOptionString('P').Lines()); cout << "Codecs (in preference order):\n" << setprecision(2) << capabilities << endl; return TRUE; } /////////////////////////////////////////////////////////////// PCM_RecordFile::PCM_RecordFile(MyH323Connection & _conn, const PFilePath & _fn, unsigned _callLimit) : conn(_conn), fn(_fn), callLimit(_callLimit) { recordStarted = FALSE; timeLimitExceeded = FALSE; closed = FALSE; dataWritten = FALSE; // If the file name ends in .wav then open the output as a WAV file. // Otherwise open it as a raw file. if ((_fn.Right(4)).ToLower() == ".wav") fileclass = new PWAVFile(_fn, PFile::WriteOnly, PFile::ModeDefault,PWAVFile::PCM_WavFile); else fileclass = new PFile(_fn, PFile::WriteOnly); } void PCM_RecordFile::StartRecording() { PWaitAndSignal mutex(pcmrecordMutex); if (recordStarted) return; PTRACE(1, "Starting recording to " << fn); PTime now; recordStarted = TRUE; finishTime = now + (callLimit * 1000); } BOOL PCM_RecordFile::Close() { PWaitAndSignal mutex(pcmrecordMutex); closed = TRUE; return fileclass->Close(); } BOOL PCM_RecordFile::Write(const void * buf, PINDEX len) { // Wait for the mutex, and Signal it at the end of this function PWaitAndSignal mutex(pcmrecordMutex); // If the record file has been closed, or if the time limit has // been exceeded, then return immediatly. if (closed || timeLimitExceeded) return FALSE; if (!recordStarted) { DelayFrame(len); return TRUE; } PTime now; if ((callLimit != 0) && (now >= finishTime)) { PTRACE(1, "Terminating call due to timeout"); conn.ClearCall(); timeLimitExceeded = TRUE; return TRUE; } DelayFrame(len); dataWritten = TRUE; return WriteFrame(buf, len); } BOOL PCM_RecordFile::WriteFrame(const void * buf, PINDEX len) { //cerr << "Writing PCM " << len << endl; return fileclass->Write(buf, len); } void PCM_RecordFile::DelayFrame(PINDEX len) { delay.Delay(len/16); } PCM_RecordFile::~PCM_RecordFile() { PWaitAndSignal mutex(pcmrecordMutex); if (!dataWritten) { PTRACE(1, "Deleting " << fn << " as no data recorded"); fileclass->Remove(fn); } delete fileclass; } /////////////////////////////////////////////////////////////// // Override some of the PCM_RecordFile functions to write // G723.1 data instead of PCM data. G7231_RecordFile::G7231_RecordFile(MyH323Connection & _conn, const PFilePath & _fn, unsigned _callLimit) : PCM_RecordFile(_conn, _fn, _callLimit) { // If the record file is a .wav file, we need to close the file // that PCM_RecordFile will have opened, and reopen it as a G.723.1 Wav file. if ((_fn.Right(4)).ToLower() == ".wav") { fileclass->Remove(_fn); delete fileclass; fileclass = new PWAVFile(_fn, PFile::WriteOnly, PFile::ModeDefault,PWAVFile::G7231_WavFile); } } BOOL G7231_RecordFile::WriteFrame(const void * buf, PINDEX /*len*/) { int frameLen = G7231_File_Codec::GetFrameLen(*(BYTE *)buf); // cerr << "Writing G7231 " << frameLen << endl; return fileclass->Write(buf, frameLen); } void G7231_RecordFile::DelayFrame(PINDEX /*len*/) { // Ignore the len parameter as that is the compressed size. // We must delay by the actual sample time. delay.Delay((G7231_SAMPLES_PER_BLOCK*2)/16); } /////////////////////////////////////////////////////////////// static BOOL MatchString(const PString & str1, const PString str2) { if (str1.GetLength() != str2.GetLength()) return FALSE; PINDEX len = str1.GetLength(); PINDEX i; for (i = 0; i < len; i++) if ((str1[i] != '?') && (str2[i] != '?') && (str1[i] != str2[i])) return FALSE; return TRUE; } static PINDEX FindMatch(const PStringList & list, const PString & key) { PINDEX maxKeyLen = 0; PINDEX i; PINDEX keyLen = key.GetLength(); PINDEX listLen = list.GetSize(); for (i = 0; i < listLen; i++) maxKeyLen = PMAX(maxKeyLen, list[i].GetLength()); if (keyLen == 0 || maxKeyLen == 0) return P_MAX_INDEX; if (keyLen > maxKeyLen) return P_MAX_INDEX; PINDEX len = 1; while (len <= keyLen) { PString subStr = key.Left(len); PINDEX matches = 0; PINDEX lastMatch = P_MAX_INDEX; PINDEX i; // look for a match to the substring for (i = 0; i < list.GetSize(); i++) { if ((list[i].GetLength() >= keyLen) && MatchString(list[i].Left(len), subStr)) { matches++; lastMatch = i; } } // if we got ONE match, we have a winner if (matches == 1) return lastMatch+1; // if we have no matches, then there is no point continuing if (matches == 0) return P_MAX_INDEX; // if we have more than one match, try the next char len++; } // too many matches return 0; } MyH323Connection::MyH323Connection(MyH323EndPoint & _ep, unsigned callReference) : H323Connection(_ep, callReference), ep(_ep) { basename = psprintf("%04i%02i%02i_%02i%02i%02i", callStartTime.GetYear(), callStartTime.GetMonth(), callStartTime.GetDay(), callStartTime.GetHour(), callStartTime.GetMinute(), callStartTime.GetSecond()); recordFile = NULL; ogmChannel = NULL; receiveCodecName = transmitCodecName = "none"; cout << "Opening connection" << endl; currentMenu = 0; digits = ""; PConfig config; PStringList sections = config.GetSections(); PINDEX i; for (i = 0; i < sections.GetSize(); i++) { if (sections[i].Find(MENU_PREFIX) == 0) menuNames.AppendString(sections[i]); } } BOOL MyH323Connection::OnReceivedSignalSetup(const H323SignalPDU & setupPDU) { if (!H323Connection::OnReceivedSignalSetup(setupPDU)) return FALSE; // extract the called number const H225_Setup_UUIE & setup = setupPDU.m_h323_uu_pdu.m_h323_message_body; if (setup.HasOptionalField(H225_Setup_UUIE::e_destinationAddress) && setup.m_destinationAddress.GetSize() > 0) { calledParty = H323GetAliasAddressString(setup.m_destinationAddress[0]); } return TRUE; } MyH323Connection::~MyH323Connection() { cout << "Closing connection" << endl; PTime now; PTimeInterval interval = now - recordStartTime; PString addr = GetControlChannel().GetRemoteAddress(); PString codecStr = receiveCodecName + "/" + transmitCodecName; unsigned duration = (unsigned)((interval.GetMilliSeconds()+999)/1000); LogCall(recordFn, addr, GetRemotePartyName(), duration, codecStr, product, calledParty); if ((recordFile!= NULL) && (recordFile->WasRecordStarted()) && !ep.GetRunCmd().IsEmpty()) { PString cmdStr = ep.GetRunCmd() & recordFn & "'" + addr + "'" & "\"" + GetRemotePartyName() + "\"" & PString(PString::Unsigned, duration) & "\"" + codecStr + "\"" & "\"" + product + "\"" & "\"" + calledParty + "\""; PTRACE(1, "Executing : " << cmdStr); system((const char *)cmdStr); } else { PTRACE(1, "No action to perform at end of record"); } if (ogmChannel != NULL) delete ogmChannel; if (recordFile != NULL) delete recordFile; if (ep.GetDeleteAfterRecord()) { PTRACE(1, "Removing " << recordFn << " as requested by option"); PFile::Remove(recordFn); } } H323Connection::AnswerCallResponse MyH323Connection::OnAnswerCall(const PString & caller, const H323SignalPDU & setupPDU, H323SignalPDU & /*connectPDU*/) { product = "Unknown"; const H225_Setup_UUIE & setup = setupPDU.m_h323_uu_pdu.m_h323_message_body; const H225_EndpointType & epInfo = setup.m_sourceInfo; if (epInfo.HasOptionalField(H225_EndpointType::e_vendor)) { const H225_VendorIdentifier & vendorInfo = epInfo.m_vendor; if (vendorInfo.HasOptionalField(H225_VendorIdentifier::e_productId)) product = vendorInfo.m_productId.AsString(); if (vendorInfo.HasOptionalField(H225_VendorIdentifier::e_versionId)) product = product + "/" + vendorInfo.m_versionId.AsString(); } cout << "Accepting call from " << caller << " using " << product << endl; return AnswerCallNow; } BOOL MyH323Connection::OpenAudioChannel(BOOL isEncoding, unsigned /* bufferSize */, H323AudioCodec & codec) { codec.SetSilenceDetectionMode(H323AudioCodec::NoSilenceDetection); PString codecName = codec.GetMediaFormat(); PString ogm; BOOL isPCM = FALSE; if (codecName == OPAL_G7231_6k3) { ogm = ep.GetG7231OGM(); isPCM = FALSE; } else { static OpalMediaFormat::List list = H323PluginCodecManager::GetMediaFormats(); if (list.GetValuesIndex(codecName) == P_MAX_INDEX) { cerr << "Unknown codec \"" << codecName << endl; return FALSE; } isPCM = TRUE; if (codecName == OPAL_G711_ULAW_64K || codecName == OPAL_G711_ALAW_64K) ogm = ep.GetG711OGM(); else if (codecName == OPAL_GSM0610) ogm = ep.GetGSMOGM(); else if (codecName.Find("iLBC") != P_MAX_INDEX) ogm = ep.GetiLBCOGM(); else if (codecName.Find("Speex") != P_MAX_INDEX) ogm = ep.GetSPEEXOGM(); else ogm = ep.GetG711OGM(); } PWaitAndSignal mutex(connMutex); if ((recordFile == NULL) && (isEncoding == FALSE)) { if (isPCM) { if (ep.GetRecordWav() == TRUE) recordFn = ep.GetDirectory() + (basename + ".wav"); else recordFn = ep.GetDirectory() + (basename + ".sw"); recordFile = new PCM_RecordFile (*this, recordFn, ep.GetCallLimit()); } else { if (ep.GetRecordWav() == TRUE) recordFn = ep.GetDirectory() + (basename + ".wav"); else recordFn = ep.GetDirectory() + (basename + ".g723"); recordFile = new G7231_RecordFile(*this, recordFn, ep.GetCallLimit()); } } if ((ogmChannel == NULL) && (isEncoding == TRUE)) { if (isPCM) ogmChannel = new PCM_OGMChannel(*this); else ogmChannel = new G7231_OGMChannel(*this); } if (isEncoding) { if (ep.GetHangupAfterPlay()) ogmChannel->SetPlayOnce(); if (ep.GetLoopMessage()) ogmChannel->SetLoopMessage(); if (ogm.Find("%s")) ogm.Replace("%s", e164Number); transmitCodecName = codecName; if (!StartMenu(0)) { if (!PFile::Exists(ogm)) { cerr << "error: cannot find OGM \"" << ogm << "\"" << endl; return FALSE; } else ogmChannel->QueueFile(ogm); if (!ep.GetNoRecordG7231()) ogmChannel->SetRecordTrigger(); } codec.AttachChannel(ogmChannel, FALSE); } else { receiveCodecName = codecName; codec.AttachChannel(recordFile, FALSE); } return TRUE; } BOOL MyH323Connection::OnStartLogicalChannel(H323Channel & channel) { if (!H323Connection::OnStartLogicalChannel(channel)) return FALSE; cout << "Started logical channel: "; switch (channel.GetDirection()) { case H323Channel::IsTransmitter : cout << "sending "; break; case H323Channel::IsReceiver : cout << "receiving "; break; default : break; } cout << channel.GetCapability() << endl; return TRUE; } void MyH323Connection::StartRecording() { recordFile->StartRecording(); } void MyH323Connection::OnUserInputString(const PString & value) { PINDEX i; for (i = 0; i < value.GetLength(); i++) { OnUserInputChar(value[i]); } } BOOL MyH323Connection::StartMenu(int menuNumber) { digits = ""; currentMenu = menuNumber; PString menuName = psprintf("%s%i", MENU_PREFIX, menuNumber); if (menuNames.GetStringsIndex(menuName) == P_MAX_INDEX) return FALSE; PTRACE(1, "Starting menu " << menuNumber); PConfig menu(menuName); PString startCmd = menu.GetString("start"); if (!startCmd.IsEmpty()) ProcessMenuCmd(startCmd); return TRUE; } BOOL MyH323Connection::ProcessMenuCmd(const PString & cmdStr) { PTRACE(1, "Processing menu cmd " << cmdStr); PStringArray tokens = cmdStr.Tokenise(" ", FALSE); int len = tokens.GetSize(); if (len == 0) return TRUE; PString cmd = tokens[0]; if ((len >= 2) && (cmd *= "play")) { ogmChannel->QueueFile(tokens[1]); if (len > 2) { cmd = "menu"; tokens[1] = tokens[2]; } } if ((len >= 2) && (cmd *= "menu")) { int newMenu = tokens[1].AsInteger(); if (newMenu != currentMenu) StartMenu(newMenu); } else if (cmd *= "hangup") ogmChannel->SetHangupTrigger(); else if (cmd *= "record") ogmChannel->SetRecordTrigger(); return TRUE; } void MyH323Connection::OnUserInputChar(char ch) { if (ch == '#') digits += '$'; else digits += ch; PTRACE(1, "Processing digit string " << digits); ogmChannel->FlushQueue(); PString menuName = psprintf("%s%i", MENU_PREFIX, currentMenu); if (menuNames.GetStringsIndex(menuName) == P_MAX_INDEX) { PTRACE(1, "Cannot find menu " << menuName); StartMenu(0); return; } PConfig menu(menuName); PStringList keys = menu.GetKeys(); PINDEX keyMatch = FindMatch(keys, digits); // if key is still ambiguous, then keep collecting if (keyMatch == 0) return; PString cmd; if (keyMatch != P_MAX_INDEX) { PString key = keys[keyMatch-1]; PTRACE(1, "Executing cmd for key " << key); cmd = menu.GetString(key); } else { PTRACE(1, "Cannot match cmd " << digits << " in menu " << menuName); cmd = menu.GetString("error", "menu 0"); } if (!cmd.IsEmpty()) { ProcessMenuCmd(cmd); digits = ""; } } /////////////////////////////////////////////////////////////// BOOL CheckWAVFileValid(PWAVFile *chan, int type) { // Check the wave file header if (!chan->IsValid()) { PTRACE(1, chan->GetName() << " wav file header invalid"); return FALSE; } // Check the wave file format if ( (type == CHECK_PCM) && (chan->GetFormat() != 0x01) ){ PTRACE(1, chan->GetName() << " is not a PCM format wav file"); PTRACE(1, "It is format " << chan->GetFormat() ); return FALSE; } if ( (type == CHECK_G7231) && ((chan->GetFormat() != 0x42) && (chan->GetFormat() != 0x111)) ){ PTRACE(1, chan->GetName() << " is not a G.723.1 format wav file"); PTRACE(1, "It is format " << chan->GetFormat() ); return FALSE; } // Check the sample rate for PCM wave files if ( (type == CHECK_PCM) && ( (chan->GetSampleRate() != 8000) ||(chan->GetChannels() != 1) ||(chan->GetSampleSize() != 16) ) ) { PTRACE(1, chan->GetName() << " is not a 16 Bit, Mono, 8000 Hz (8Khz) PCM wav file"); PTRACE(1, "It is " << chan->GetSampleSize() << " bits, " << (chan->GetChannels()==1 ? "mono " : "stereo ") << chan->GetSampleRate() << " Hz"); return FALSE; } return TRUE; } /////////////////////////////////////////////////////////////// PCM_OGMChannel::PCM_OGMChannel(MyH323Connection & _conn) : conn(_conn) { silentCount = 20; // wait 20 frames before playing the OGM recordTrigger = FALSE; hangupTrigger = FALSE; closed = FALSE; playOnce = FALSE; loopMessage = FALSE; frameLen = frameOffs = 0; } void PCM_OGMChannel::PlayFile(PFile * chan) { PWaitAndSignal mutex(chanMutex); // if (IsOpen()) // Close(); if (!chan->Open(PFile::ReadOnly)) { PTRACE(1, "Cannot open file \"" << chan->GetName() << "\""); return; } PTRACE(1, "Playing file \"" << chan->GetName() << "\""); totalData = 0; SetReadChannel(chan, TRUE); } BOOL PCM_OGMChannel::IsWAVFileValid(PWAVFile *chan) { // Check that this is a PCM wave file return CheckWAVFileValid(chan, CHECK_PCM); } BOOL PCM_OGMChannel::Read(void * buffer, PINDEX amount) { PWaitAndSignal mutex(chanMutex); // if the channel is closed, then return error if (closed) return FALSE; // Create the frame buffer using the amount of bytes the codec wants to // read. Different codecs use different read sizes. frameBuffer.SetMinSize(1024);//amount); // assume we are returning silence BOOL doSilence = TRUE; BOOL frameBoundary = FALSE; // if still outputting a frame from last time, then keep doing it if (frameOffs < frameLen) { frameBoundary = AdjustFrame(buffer, amount); doSilence = FALSE; } else { // if we are returning silence frames, then if (silentCount > 0) silentCount--; // if a channel is already open, don't do silence else if (GetBaseReadChannel() != NULL) doSilence = FALSE; // If not in silence and no existing channel, open a new file. else { PString * str = playQueue.Dequeue(); if (str != NULL) { // check the file extension and open a .wav or a raw (.sw or .g723) file if (((*str).Right(4)).ToLower() == ".wav") { PWAVFile *chan; chan = new PWAVFile(*str, PFile::ReadOnly); if (!chan->IsOpen()) { PTRACE(1, "Cannot open file \"" << chan->GetName() << "\""); delete chan; } else { if (!IsWAVFileValid(chan) ){ PTRACE(1, chan->GetName() << " is not a valid wav file"); delete chan; cerr << "wave file is invalid" << endl; } else { PTRACE(1, "Playing file \"" << chan->GetName() << "\""); totalData = 0; SetReadChannel(chan, TRUE); doSilence = FALSE; } if (loopMessage) { PTRACE(1, "Looping file \"" << *str << "\""); playQueue.Enqueue(new PString(*str)); } } } else { // raw file (eg .sw) PFile *chan; chan = new PFile(*str); if (!chan->Open(PFile::ReadOnly)) { PTRACE(1, "Cannot open file \"" << chan->GetName() << "\""); delete chan; } else { PTRACE(1, "Playing file \"" << chan->GetName() << "\""); totalData = 0; SetReadChannel(chan, TRUE); doSilence = FALSE; } } delete str; } } // if not doing silence, try and read from the file if (!doSilence) { if (ReadFrame(amount)) { frameBoundary = AdjustFrame(buffer, amount); totalData += amount; } else { PTRACE(1, "Finished playing " << totalData << " bytes"); //closed = TRUE; PIndirectChannel::Close(); silentCount = 5; // always do 5 frames of silence after every file // hangup if required if (hangupTrigger || playOnce) conn.ClearCall(); // trigger record if required else if (recordTrigger) { if ((playQueue.GetSize() == 0) && (GetBaseReadChannel() == NULL)) conn.StartRecording(); } // no silence doSilence = TRUE; } } } // start silence frame if required if (doSilence) { CreateSilenceFrame(amount); frameBoundary = AdjustFrame(buffer, amount); } // delay to synchronise to frame boundary if (frameBoundary) Synchronise(amount); return TRUE; } BOOL PCM_OGMChannel::Close() { PWaitAndSignal mutex(chanMutex); closed = TRUE; PIndirectChannel::Close(); return TRUE; } void PCM_OGMChannel::SetRecordTrigger() { PWaitAndSignal mutex(chanMutex); recordTrigger = TRUE; if ((playQueue.GetSize() == 0) && (GetBaseReadChannel() == NULL)) conn.StartRecording(); } void PCM_OGMChannel::SetHangupTrigger() { PWaitAndSignal mutex(chanMutex); hangupTrigger = TRUE; if (GetBaseReadChannel() == NULL) conn.ClearCall(); } void PCM_OGMChannel::QueueFile(const PString & fn) { PWaitAndSignal mutex(chanMutex); PTRACE(1, "Enqueueing file " << fn << " for playing"); playQueue.Enqueue(new PString(fn)); } void PCM_OGMChannel::FlushQueue() { PWaitAndSignal mutex(chanMutex); if (GetBaseReadChannel() != NULL) { PIndirectChannel::Close(); if (hangupTrigger) conn.ClearCall(); else if (recordTrigger) conn.StartRecording(); } PString * str; while ((str = playQueue.Dequeue()) != NULL) delete str; } BOOL PCM_OGMChannel::AdjustFrame(void * buffer, PINDEX amount) { if ((frameOffs + amount) > frameLen) { cerr << "Reading past end of frame:offs=" << frameOffs << ",amt=" << amount << ",len=" << frameLen << endl; return TRUE; } //PAssert((frameOffs + amount) <= frameLen, "Reading past end of frame"); memcpy(buffer, frameBuffer.GetPointer()+frameOffs, amount); frameOffs += amount; lastReadCount = amount; return frameOffs == frameLen; } void PCM_OGMChannel::Synchronise(PINDEX amount) { ogm_delay.Delay(amount / 16); } BOOL PCM_OGMChannel::ReadFrame(PINDEX amount) { frameOffs = 0; frameLen = amount; BOOL result = PIndirectChannel::Read(frameBuffer.GetPointer(), frameLen); // if we did not read a full frame of audio, fill the end of the // frame with zeros. PINDEX count = GetLastReadCount(); if (count < frameLen) memset(frameBuffer.GetPointer()+count, 0, frameLen-count); return result; } void PCM_OGMChannel::CreateSilenceFrame(PINDEX amount) { frameOffs = 0; frameLen = amount; memset(frameBuffer.GetPointer(), 0, frameLen); } /////////////////////////////////////////////////////////////// G7231_OGMChannel::G7231_OGMChannel(MyH323Connection & conn) : PCM_OGMChannel(conn) { } void G7231_OGMChannel::Synchronise(PINDEX /*amount*/) { ogm_delay.Delay(30); } BOOL G7231_OGMChannel::ReadFrame(PINDEX /*amount*/) { if (!PIndirectChannel::Read(frameBuffer.GetPointer(), 1)) return FALSE; frameOffs = 0; frameLen = G7231_File_Codec::GetFrameLen(frameBuffer[0]); return PIndirectChannel::Read(frameBuffer.GetPointer()+1, frameLen-1); } void G7231_OGMChannel::CreateSilenceFrame(PINDEX /*amount*/) { frameOffs = 0; frameLen = 4; frameBuffer[0] = 2; memset(frameBuffer.GetPointer()+1, 0, 3); } BOOL G7231_OGMChannel::IsWAVFileValid(PWAVFile *chan) { // Check that this is a G.723.1 wave file return CheckWAVFileValid(chan, CHECK_G7231); } /////////////////////////////////////////////////////////////// openam_v1_1_18/main.h0100644000176200056700000003056710200276246014656 0ustar releasepostincr/* * main.h * * PWLib application header file for Voxilla * * A H.323 "net telephone" application. * * Copyright (c) 1993-2001 Equivalence Pty. Ltd. * * The contents of this file are subject to the Mozilla Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. * * The Original Code is Portable Windows Library. * * The Initial Developer of the Original Code is Equivalence Pty. Ltd. * * Portions of this code were written with the assisance of funding from * Vovida Networks, Inc. http://www.vovida.com. * * Portions are Copyright (C) 1993 Free Software Foundation, Inc. * All Rights Reserved. * * Contributor(s): ______________________________________. * * $Log: main.h,v $ * Revision 1.37 2005/02/03 01:21:42 csoutheren * Added called party to call log and command parameters * * Revision 1.36 2004/05/03 13:25:46 rjongbloed * Converted everything to be codec plug in freindly * Removed GSM and G.729 as now plug ins are "the way"! * * Revision 1.35 2004/01/02 02:52:10 csoutheren * Thanks to Michal Zygmuntowicz for these changes * Added support for iLBC codec * Added ability to specify a gatekeeper password, * Fixed small bug with Speex capabilities being accidentally included. * * Revision 1.34 2003/12/02 09:46:59 csoutheren * Added --loop option thanks to Jan Willamowius * * Revision 1.33 2002/11/13 10:23:12 rogerh * Enable Speex support by default. * * Revision 1.32 2002/08/16 02:04:30 craigs * Ensure compilation without Speex installed * * Revision 1.31 2002/08/15 18:52:49 rogerh * Add support for one of the Speex codecs * * Revision 1.30 2002/08/05 10:06:06 robertj * Changed to use the version of G.7231. file capability/codec as used in * opalvxml module. Prevents duplicate symbol link errors. * * Revision 1.29 2002/04/01 14:45:43 craigs * Fixed flag to end call after OGM * * Revision 1.28 2002/04/01 13:16:09 craigs * Added ability to kill calls at end of playing OGM * Added ability to play different OGMs depending on target DN * * Revision 1.27 2002/02/21 07:21:52 rogerh * Change the outgoing audio's FrameDelay() code to use the PAdaptiveDelay * class which should give clearer audio for the OGMs. * * Revision 1.26 2002/01/22 04:15:04 craigs * Updated for move of PWavFile to PTCLib * Replaced AudioDelay with PAdaptiveDelay * * Revision 1.25 2001/10/15 14:10:01 rogerh * Add new definitions * * Revision 1.24 2001/09/29 07:11:48 rogerh * Delete ogmChanel in destructor - Patrick Koorevaar * Only call conn.ClearCall() once after we pass the record time limit. * Reported by Patrick. * * Revision 1.23 2001/09/28 00:13:48 robertj * Changed BYTE* to PBYTEArray so get automatic memory management. * * Revision 1.22 2001/09/24 22:39:42 craigs * Added commands to play and record data files, esp G.723.1 * * Revision 1.21 2001/07/23 09:17:36 rogerh * Add the LPC10 codec, a low quality and low bitrate codec. * * Revision 1.20 2001/07/17 14:33:01 rogerh * Support writing of .wav audio files from PCM codecs (eg G711 and GSM). * .wav files are written out by default now. If you still want to record * to raw audio files with a .sw extension, use the --recordraw option. * * Revision 1.19 2001/07/01 07:38:58 rogerh * Add Microsoft GSM codec. Also allocate memory for frameBuffer dynamically * as different codecs can have different frame sizes. * * Revision 1.18 2001/06/29 11:13:15 rogerh * Add AudioDelay class which removes the jitter in recorded files. * * Revision 1.17 2001/06/29 06:34:57 rogerh * Add mutex locks in PCM_Recordfile. This solves the race condition where * Close() was called while Write() was still running. * * Revision 1.16 2000/08/29 12:32:08 craigs * Fixed problems with recording messages * * Revision 1.15 2000/08/28 16:42:59 craigs * Finally fixed problems with G.723.1. All codecs now working * * Revision 1.14 2000/08/28 07:49:51 craigs * Added extra stuff * * Revision 1.13 2000/08/28 00:38:37 craigs * Added support for setting listening port number * * Revision 1.12 2000/08/27 23:42:24 craigs * Fixed problem with playback of messages * Fixed problem with recording messages * * Revision 1.11 2000/05/25 12:06:17 robertj * Added PConfigArgs class so can save program arguments to config files. * * Revision 1.10 2000/05/10 05:14:25 robertj * Changed capabilities so has a function to get name of codec, instead of relying on PrintOn. * * Revision 1.9 2000/05/09 11:22:15 craigs * Fixed problems caused by new jitter buffer code * and fixed OGM problems * * Revision 1.8 2000/04/25 23:34:22 craigs * Added lots of new code, including outgoing and incoming * multiplexors, and the start of an IVR system * * Revision 1.7 2000/01/13 04:03:45 robertj * Added video transmission * * Revision 1.6 1999/11/11 00:27:49 robertj * Changed OnAnswerCall() call back function to allow for asyncronous response. * * Revision 1.5 1999/11/06 13:27:49 craigs * Added extra output and changed for new library changes * * Revision 1.4 1999/10/24 12:50:37 craigs * Fixed G723.1 capability, and added ability for discrete OGMs * * Revision 1.3 1999/10/24 03:08:49 craigs * Fixed problem with recording zero length messages, and added autodelete of files * * Revision 1.2 1999/10/22 09:56:41 craigs * Fixed compile warning * * Revision 1.1 1999/10/11 00:15:18 craigs * Initial version * * */ #ifndef _Voxilla_MAIN_H #define _Voxilla_MAIN_H #include #include #include #include #include #include class OpenAm : public PProcess { PCLASSINFO(OpenAm, PProcess) public: OpenAm(); ~OpenAm(); void Main(); void RecordFile(PArgList & args); void PlayFile(PArgList & args); protected: long GetCodec(const PString & codecname); OpalLineInterfaceDevice * GetDevice(const PString & device); }; class MyH323EndPoint : public H323EndPoint { PCLASSINFO(MyH323EndPoint, H323EndPoint); public: MyH323EndPoint(unsigned callLimit, const PString & runCmd, const PDirectory & dir, int flags); // overrides from H323EndPoint virtual H323Connection * CreateConnection(unsigned callReference); BOOL OnIncomingCall(H323Connection &, const H323SignalPDU &, H323SignalPDU &); // new functions BOOL Initialise(PConfigArgs & args); PString GetGSMOGM() const { return gsmOgm; } void SetGSMOGM(const PString & s) { gsmOgm = s; } PString GetG711OGM() const { return g711Ogm; } void SetG711OGM(const PString & s) { g711Ogm = s; } PString GetLPC10OGM() const { return lpc10Ogm; } void SetLPC10OGM(const PString & s) { lpc10Ogm = s; } PString GetSPEEXOGM() const { return speexOgm; } void SetSPEEXOGM(const PString & s) { speexOgm = s; } PString GetG7231OGM() const { return g7231Ogm; } void SetG7231OGM(const PString & s) { g7231Ogm = s; } PString GetiLBCOGM() const { return ilbcOgm; } void SetiLBCOGM(const PString & s) { ilbcOgm = s; } unsigned GetCallLimit() const { return callLimit; } PString GetRunCmd() const { return runCmd; } PDirectory GetDirectory() const { return dir; } void SetRecordWav(const BOOL rec){ recordWav = rec; } BOOL GetRecordWav() const { return recordWav; } void SetLoopMessage(BOOL flag) { loopMessage = flag; } BOOL GetLoopMessage() const { return loopMessage; } enum { DeleteAfterRecord = 0x01, NoRecordG7231 = 0x02, HangupAfterPlay = 0x04 }; BOOL GetDeleteAfterRecord() const { return flags & DeleteAfterRecord; } BOOL GetNoRecordG7231() const { return flags & NoRecordG7231; } BOOL GetHangupAfterPlay() const { return flags & HangupAfterPlay; } protected: unsigned callLimit; PString pcmOgm, g711Ogm, gsmOgm, lpc10Ogm, g7231Ogm, runCmd; PString speexOgm, ilbcOgm; PDirectory dir; int flags; BOOL recordWav; BOOL loopMessage; }; class PCM_RecordFile; class MyH323Connection; PQUEUE(PStringQueue, PString); class PCM_OGMChannel : public PIndirectChannel { PCLASSINFO(PCM_OGMChannel, PIndirectChannel); public: PCM_OGMChannel(MyH323Connection & conn); BOOL Read(void * buffer, PINDEX amount); void PlayFile(PFile * chan); BOOL Close(); void QueueFile(const PString & cmd); void FlushQueue(); void SetRecordTrigger(); void SetHangupTrigger(); void SetPlayOnce() { playOnce = TRUE; } void SetLoopMessage() { loopMessage = TRUE; } protected: virtual BOOL ReadFrame(PINDEX amount); virtual void CreateSilenceFrame(PINDEX amount); virtual void Synchronise(PINDEX amount); virtual BOOL IsWAVFileValid(PWAVFile *chan); BOOL AdjustFrame(void * buffer, PINDEX amount); PStringQueue playQueue; MyH323Connection & conn; PMutex chanMutex; int silentCount; int totalData; BOOL recordTrigger, hangupTrigger; BOOL closed; BOOL playOnce; BOOL loopMessage; PAdaptiveDelay ogm_delay; PBYTEArray frameBuffer; PINDEX frameLen, frameOffs; }; class G7231_OGMChannel : public PCM_OGMChannel { PCLASSINFO(G7231_OGMChannel, PCM_OGMChannel); public: G7231_OGMChannel(MyH323Connection & conn); protected: BOOL ReadFrame(PINDEX amount); void CreateSilenceFrame(PINDEX amount); void Synchronise(PINDEX amount); BOOL IsWAVFileValid(PWAVFile *chan); }; class MyH323Connection : public H323Connection { PCLASSINFO(MyH323Connection, H323Connection); public: MyH323Connection(MyH323EndPoint &, unsigned); ~MyH323Connection(); // overrides from H323Connection BOOL OpenAudioChannel(BOOL, unsigned, H323AudioCodec & codec); AnswerCallResponse OnAnswerCall(const PString &, const H323SignalPDU &, H323SignalPDU &); BOOL OnStartLogicalChannel(H323Channel & channel); void OnUserInputString(const PString & value); BOOL OnReceivedSignalSetup(const H323SignalPDU & setupPDU); // new functions void StartRecording(); void Hangup(); void SetE164Number(const PString & _num) { e164Number = _num; } PString GetE164Number() const { return e164Number; } protected: void OnUserInputChar(char ch); BOOL StartMenu(int menuNumber); BOOL ProcessMenuCmd(const PString & cmdStr); const MyH323EndPoint & ep; PString product; PTime callStartTime; PTime recordStartTime; PString basename; PFilePath recordFn; PString transmitCodecName, receiveCodecName; BOOL recordTrigger; PString calledParty; PMutex connMutex; PCM_RecordFile * recordFile; PCM_OGMChannel * ogmChannel; PString digits, lastDigits; int currentMenu; PStringList menuNames; PString securityToken, e164Number; }; class PCM_RecordFile : public PIndirectChannel { PCLASSINFO(PCM_RecordFile, PIndirectChannel) public: PCM_RecordFile(MyH323Connection & conn, const PFilePath & fn, unsigned callLimit); ~PCM_RecordFile(); BOOL Write(const void * buf, PINDEX len); BOOL Close(); void StartRecording(); virtual void DelayFrame(PINDEX len); virtual BOOL WriteFrame(const void * buf, PINDEX len); BOOL WasRecordStarted() const { return recordStarted; } protected: MyH323Connection & conn; PTime finishTime; PFilePath fn; unsigned callLimit; BOOL recordStarted; BOOL timeLimitExceeded; BOOL closed; BOOL isPCM; BOOL dataWritten; PAdaptiveDelay delay; PMutex pcmrecordMutex; PFile *fileclass; // will point to a PWAVFile or PFile class }; class G7231_RecordFile : public PCM_RecordFile { PCLASSINFO(G7231_RecordFile, PCM_RecordFile); public: G7231_RecordFile(MyH323Connection & conn, const PFilePath & fn, unsigned callLimit); void DelayFrame(PINDEX len); BOOL WriteFrame(const void * buf, PINDEX len); }; #endif // _Voxilla_MAIN_H // End of File /////////////////////////////////////////////////////////////// openam_v1_1_18/mpl-1.0.htm0100644000176200056700000004730307337047004015360 0ustar releasepostincrMozilla Public License version 1.0

MOZILLA PUBLIC LICENSE
Version 1.0


1. Definitions.

    1.1. ``Contributor'' means each entity that creates or contributes to the creation of Modifications.

    1.2. ``Contributor Version'' means the combination of the Original Code, prior Modifications used by a Contributor, and the Modifications made by that particular Contributor.

    1.3. ``Covered Code'' means the Original Code or Modifications or the combination of the Original Code and Modifications, in each case including portions thereof.

    1.4. ``Electronic Distribution Mechanism'' means a mechanism generally accepted in the software development community for the electronic transfer of data.

    1.5. ``Executable'' means Covered Code in any form other than Source Code.

    1.6. ``Initial Developer'' means the individual or entity identified as the Initial Developer in the Source Code notice required by Exhibit A.

    1.7. ``Larger Work'' means a work which combines Covered Code or portions thereof with code not governed by the terms of this License.

    1.8. ``License'' means this document.

    1.9. ``Modifications'' means any addition to or deletion from the substance or structure of either the Original Code or any previous Modifications. When Covered Code is released as a series of files, a Modification is:

      A. Any addition to or deletion from the contents of a file containing Original Code or previous Modifications.

      B. Any new file that contains any part of the Original Code or previous Modifications.

    1.10. ``Original Code'' means Source Code of computer software code which is described in the Source Code notice required by Exhibit A as Original Code, and which, at the time of its release under this License is not already Covered Code governed by this License.

    1.11. ``Source Code'' means the preferred form of the Covered Code for making modifications to it, including all modules it contains, plus any associated interface definition files, scripts used to control compilation and installation of an Executable, or a list of source code differential comparisons against either the Original Code or another well known, available Covered Code of the Contributor's choice. The Source Code can be in a compressed or archival form, provided the appropriate decompression or de-archiving software is widely available for no charge.

    1.12. ``You'' means an individual or a legal entity exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, ``You'' includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition, ``control'' means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of fifty percent (50%) or more of the outstanding shares or beneficial ownership of such entity.

2. Source Code License.
    2.1. The Initial Developer Grant.
    The Initial Developer hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims:

      (a) to use, reproduce, modify, display, perform, sublicense and distribute the Original Code (or portions thereof) with or without Modifications, or as part of a Larger Work; and

      (b) under patents now or hereafter owned or controlled by Initial Developer, to make, have made, use and sell (``Utilize'') the Original Code (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Original Code (or portions thereof) and not to any greater extent that may be necessary to Utilize further Modifications or combinations.

    2.2. Contributor Grant.
    Each Contributor hereby grants You a world-wide, royalty-free, non-exclusive license, subject to third party intellectual property claims:

      (a) to use, reproduce, modify, display, perform, sublicense and distribute the Modifications created by such Contributor (or portions thereof) either on an unmodified basis, with other Modifications, as Covered Code or as part of a Larger Work; and

      (b) under patents now or hereafter owned or controlled by Contributor, to Utilize the Contributor Version (or portions thereof), but solely to the extent that any such patent is reasonably necessary to enable You to Utilize the Contributor Version (or portions thereof), and not to any greater extent that may be necessary to Utilize further Modifications or combinations.

3. Distribution Obligations.
    3.1. Application of License.
    The Modifications which You create or to which You contribute are governed by the terms of this License, including without limitation Section 2.2. The Source Code version of Covered Code may be distributed only under the terms of this License or a future version of this License released under Section 6.1, and You must include a copy of this License with every copy of the Source Code You distribute. You may not offer or impose any terms on any Source Code version that alters or restricts the applicable version of this License or the recipients' rights hereunder. However, You may include an additional document offering the additional rights described in Section 3.5.

    3.2. Availability of Source Code.
    Any Modification which You create or to which You contribute must be made available in Source Code form under the terms of this License either on the same media as an Executable version or via an accepted Electronic Distribution Mechanism to anyone to whom you made an Executable version available; and if made available via Electronic Distribution Mechanism, must remain available for at least twelve (12) months after the date it initially became available, or at least six (6) months after a subsequent version of that particular Modification has been made available to such recipients. You are responsible for ensuring that the Source Code version remains available even if the Electronic Distribution Mechanism is maintained by a third party.

    3.3. Description of Modifications.
    You must cause all Covered Code to which you contribute to contain a file documenting the changes You made to create that Covered Code and the date of any change. You must include a prominent statement that the Modification is derived, directly or indirectly, from Original Code provided by the Initial Developer and including the name of the Initial Developer in (a) the Source Code, and (b) in any notice in an Executable version or related documentation in which You describe the origin or ownership of the Covered Code.

    3.4. Intellectual Property Matters

      (a) Third Party Claims.
      If You have knowledge that a party claims an intellectual property right in particular functionality or code (or its utilization under this License), you must include a text file with the source code distribution titled ``LEGAL'' which describes the claim and the party making the claim in sufficient detail that a recipient will know whom to contact. If you obtain such knowledge after You make Your Modification available as described in Section 3.2, You shall promptly modify the LEGAL file in all copies You make available thereafter and shall take other steps (such as notifying appropriate mailing lists or newsgroups) reasonably calculated to inform those who received the Covered Code that new knowledge has been obtained.

      (b) Contributor APIs.
      If Your Modification is an application programming interface and You own or control patents which are reasonably necessary to implement that API, you must also include this information in the LEGAL file.

    3.5. Required Notices.
    You must duplicate the notice in Exhibit A in each file of the Source Code, and this License in any documentation for the Source Code, where You describe recipients' rights relating to Covered Code. If You created one or more Modification(s), You may add your name as a Contributor to the notice described in Exhibit A. If it is not possible to put such notice in a particular Source Code file due to its structure, then you must include such notice in a location (such as a relevant directory file) where a user would be likely to look for such a notice. You may choose to offer, and to charge a fee for, warranty, support, indemnity or liability obligations to one or more recipients of Covered Code. However, You may do so only on Your own behalf, and not on behalf of the Initial Developer or any Contributor. You must make it absolutely clear than any such warranty, support, indemnity or liability obligation is offered by You alone, and You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of warranty, support, indemnity or liability terms You offer.

    3.6. Distribution of Executable Versions.
    You may distribute Covered Code in Executable form only if the requirements of Section 3.1-3.5 have been met for that Covered Code, and if You include a notice stating that the Source Code version of the Covered Code is available under the terms of this License, including a description of how and where You have fulfilled the obligations of Section 3.2. The notice must be conspicuously included in any notice in an Executable version, related documentation or collateral in which You describe recipients' rights relating to the Covered Code. You may distribute the Executable version of Covered Code under a license of Your choice, which may contain terms different from this License, provided that You are in compliance with the terms of this License and that the license for the Executable version does not attempt to limit or alter the recipient's rights in the Source Code version from the rights set forth in this License. If You distribute the Executable version under a different license You must make it absolutely clear that any terms which differ from this License are offered by You alone, not by the Initial Developer or any Contributor. You hereby agree to indemnify the Initial Developer and every Contributor for any liability incurred by the Initial Developer or such Contributor as a result of any such terms You offer.

    3.7. Larger Works.
    You may create a Larger Work by combining Covered Code with other code not governed by the terms of this License and distribute the Larger Work as a single product. In such a case, You must make sure the requirements of this License are fulfilled for the Covered Code.

4. Inability to Comply Due to Statute or Regulation.

    If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Covered Code due to statute or regulation then You must: (a) comply with the terms of this License to the maximum extent possible; and (b) describe the limitations and the code they affect. Such description must be included in the LEGAL file described in Section 3.4 and must be included with all distributions of the Source Code. Except to the extent prohibited by statute or regulation, such description must be sufficiently detailed for a recipient of ordinary skill to be able to understand it.

5. Application of this License.
    This License applies to code to which the Initial Developer has attached the notice in Exhibit A, and to related Covered Code.
6. Versions of the License.
    6.1. New Versions.
    Netscape Communications Corporation (``Netscape'') may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number.

    6.2. Effect of New Versions.
    Once Covered Code has been published under a particular version of the License, You may always continue to use it under the terms of that version. You may also choose to use such Covered Code under the terms of any subsequent version of the License published by Netscape. No one other than Netscape has the right to modify the terms applicable to Covered Code created under this License.

    6.3. Derivative Works.
    If you create or use a modified version of this License (which you may only do in order to apply it to code which is not already Covered Code governed by this License), you must (a) rename Your license so that the phrases ``Mozilla'', ``MOZILLAPL'', ``MOZPL'', ``Netscape'', ``NPL'' or any confusingly similar phrase do not appear anywhere in your license and (b) otherwise make it clear that your version of the license contains terms which differ from the Mozilla Public License and Netscape Public License. (Filling in the name of the Initial Developer, Original Code or Contributor in the notice described in Exhibit A shall not of themselves be deemed to be modifications of this License.)

7. DISCLAIMER OF WARRANTY.
    COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN ``AS IS'' BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
8. TERMINATION.
    This License and the rights granted hereunder will terminate automatically if You fail to comply with terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses to the Covered Code which are properly granted shall survive any termination of this License. Provisions which, by their nature, must remain in effect beyond the termination of this License shall survive.
9. LIMITATION OF LIABILITY.
    UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE INITIAL DEVELOPER, ANY OTHER CONTRIBUTOR, OR ANY DISTRIBUTOR OF COVERED CODE, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO YOU OR ANY OTHER PERSON FOR ANY INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER COMMERCIAL DAMAGES OR LOSSES, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. THIS LIMITATION OF LIABILITY SHALL NOT APPLY TO LIABILITY FOR DEATH OR PERSONAL INJURY RESULTING FROM SUCH PARTY'S NEGLIGENCE TO THE EXTENT APPLICABLE LAW PROHIBITS SUCH LIMITATION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THAT EXCLUSION AND LIMITATION MAY NOT APPLY TO YOU.
10. U.S. GOVERNMENT END USERS.
    The Covered Code is a ``commercial item,'' as that term is defined in 48 C.F.R. 2.101 (Oct. 1995), consisting of ``commercial computer software'' and ``commercial computer software documentation,'' as such terms are used in 48 C.F.R. 12.212 (Sept. 1995). Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (June 1995), all U.S. Government End Users acquire Covered Code with only those rights set forth herein.
11. MISCELLANEOUS.
    This License represents the complete agreement concerning subject matter hereof. If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable. This License shall be governed by California law provisions (except to the extent applicable law, if any, provides otherwise), excluding its conflict-of-law provisions. With respect to disputes in which at least one party is a citizen of, or an entity chartered or registered to do business in, the United States of America: (a) unless otherwise agreed in writing, all disputes relating to this License (excepting any dispute relating to intellectual property rights) shall be subject to final and binding arbitration, with the losing party paying all costs of arbitration; (b) any arbitration relating to this Agreement shall be held in Santa Clara County, California, under the auspices of JAMS/EndDispute; and (c) any litigation relating to this Agreement shall be subject to the jurisdiction of the Federal Courts of the Northern District of California, with venue lying in Santa Clara County, California, with the losing party responsible for costs, including without limitation, court costs and reasonable attorneys fees and expenses. The application of the United Nations Convention on Contracts for the International Sale of Goods is expressly excluded. Any law or regulation which provides that the language of a contract shall be construed against the drafter shall not apply to this License.
12. RESPONSIBILITY FOR CLAIMS.
    Except in cases where another Contributor has failed to comply with Section 3.4, You are responsible for damages arising, directly or indirectly, out of Your utilization of rights under this License, based on the number of copies of Covered Code you made available, the revenues you received from utilizing such rights, and other relevant factors. You agree to work with affected parties to distribute responsibility on an equitable basis.
EXHIBIT A.
    ``The contents of this file are subject to the Mozilla Public License Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/

    Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License.

    The Original Code is ______________________________________.

    The Initial Developer of the Original Code is ________________________. Portions created by ______________________ are Copyright (C) ______ _______________________. All Rights Reserved.

    Contributor(s): ______________________________________.''

openam_v1_1_18/new_msg0100755000176200056700000000366707372223502015152 0ustar releasepostincr#!/bin/sh # # new_msg script for use with OpenAM # Copyright (C) Equivalence Pty Ltd 1999 # # Permission is given to freely copy, redistribute or change this # program, provided this notice is retained intact. # # The information and code herein is provided "as is" # without warranty of any kind, either expressed or implied. # In no event shall EQUIVALENCE be liable for any damages # whatsoever including direct, indirect, incidental, # consequential, loss of business profits or special damages, # even if EQUIVALENCE has been advised of the possibility of such damages. # extension="wav" contenttype="audio/x-wav" mimencode=/usr/bin/mimencode sendmail=/usr/lib/sendmail sox=/usr/bin/sox fn="$1" src="$2" remoteParty="$3" duration="$4" codec="$5" product="$6" #tempfn=${fn}.tmp tempfn=/tmp/voice.temp #email=equival@equival.com.au email="${USER}@`dnsdomainname`" sourceemail=h323voice seperator="========== $$fn ==========" echo Date: `date` > $tempfn echo To: $email >> $tempfn echo From: ${sourceemail}@`hostname` >> $tempfn echo Subject: H323 voice message from \""$remoteParty"\" >> $tempfn echo Mime-Version: 1.0 >> $tempfn echo Content-Type: multipart/mixed\; boundary=\"$seperator\" >> $tempfn echo "">> $tempfn echo --$seperator >> $tempfn echo Content-Type: text/plain\ >> $tempfn echo Content-Transfer-Encoding: 8bit >> $tempfn echo "">> $tempfn echo "Filename: $fn" >> $tempfn echo "Source: $src" >> $tempfn echo "RemoteParty: $remoteParty" >> $tempfn echo "Duration: $duration" >> $tempfn echo "Codecs: $codec" >> $tempfn echo "Product: $product" >> $tempfn echo "">> $tempfn echo --$seperator >> $tempfn echo Content-Type: $contenttype\; name=\"$pagefn\" >> $tempfn echo Content-Transfer-Encoding: base64 >> $tempfn echo Content-Disposition: attachment\; filename=\"$pagefn\" >> $tempfn echo "">> $tempfn $mimencode $fn >> $tempfn #rm -f $fn echo --$seperator >> $tempfn $sendmail < $tempfn $email rm -f $tempfn openam_v1_1_18/openam.dsp0100644000176200056700000001215310034731436015541 0ustar releasepostincr# Microsoft Developer Studio Project File - Name="openam" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=openam - Win32 Release !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "openam.mak". !MESSAGE !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 "openam.mak" CFG="openam - Win32 Release" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "openam - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "openam - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE "openam - Win32 No Trace" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 1 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "openam - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /YX /FD /c # ADD CPP /nologo /MD /W4 /GR /GX /O2 /Ob2 /D "NDEBUG" /D "PTRACING" /Yu"ptlib.h" /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0xc09 /d "NDEBUG" /d "_AFXDLL" # ADD RSC /l 0xc09 /d "NDEBUG" /d "_AFXDLL" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 /nologo /subsystem:windows /machine:I386 # ADD LINK32 openh323.lib ptclib.lib ptlib.lib mpr.lib comdlg32.lib winspool.lib wsock32.lib kernel32.lib user32.lib gdi32.lib shell32.lib advapi32.lib /nologo /subsystem:console /machine:I386 !ELSEIF "$(CFG)" == "openam - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W4 /Gm /GR /GX /ZI /Od /D "_DEBUG" /D "PTRACING" /Yu"ptlib.h" /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0xc09 /d "_DEBUG" /d "_AFXDLL" # ADD RSC /l 0xc09 /d "_DEBUG" /d "_AFXDLL" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 openh323d.lib ptclibd.lib ptlibd.lib mpr.lib comdlg32.lib winspool.lib wsock32.lib kernel32.lib user32.lib gdi32.lib shell32.lib advapi32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept !ELSEIF "$(CFG)" == "openam - Win32 No Trace" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "NoTrace" # PROP BASE Intermediate_Dir "NoTrace" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "NoTrace" # PROP Intermediate_Dir "NoTrace" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /MD /W4 /GX /O2 /I "..\include" /D "NDEBUG" /Yu"ptlib.h" /FD /c # ADD CPP /nologo /MD /W4 /GR /GX /O1 /Ob2 /D "NDEBUG" /D "PASN_NOPRINTON" /D "PASN_LEANANDMEAN" /Yu"ptlib.h" /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0xc09 /d "NDEBUG" /d "_AFXDLL" # ADD RSC /l 0xc09 /d "NDEBUG" /d "_AFXDLL" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 ptclib.lib ptlib.lib comdlg32.lib winspool.lib wsock32.lib mpr.lib kernel32.lib user32.lib gdi32.lib shell32.lib advapi32.lib /nologo /subsystem:console /machine:I386 # ADD LINK32 openh323n.lib ptclib.lib ptlib.lib mpr.lib comdlg32.lib winspool.lib wsock32.lib kernel32.lib user32.lib gdi32.lib shell32.lib advapi32.lib /nologo /subsystem:console /machine:I386 !ENDIF # Begin Target # Name "openam - Win32 Release" # Name "openam - Win32 Debug" # Name "openam - Win32 No Trace" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\cmds.cxx # End Source File # Begin Source File SOURCE=.\main.cxx # End Source File # Begin Source File SOURCE=.\precompile.cxx # ADD CPP /Yc"ptlib.h" # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=.\main.h # End Source File # Begin Source File SOURCE=.\version.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project openam_v1_1_18/openam.dsw0100644000176200056700000000077207066554757015600 0ustar releasepostincrMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "OpenAM"=.\openam.dsp - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### openam_v1_1_18/openam.vcproj0100644000176200056700000001752710034511723016263 0ustar releasepostincr openam_v1_1_18/precompile.cxx0100644000176200056700000000066607000230334016431 0ustar releasepostincr/* * precompile.cxx * * PWLib application source file for openam * * Precompiled header generation file. * * Copyright 1999 Equivalence * * $Log: precompile.cxx,v $ * Revision 1.1 1999/10/11 00:35:40 craigs * Initiali version * * Revision 1.2 1999/01/26 06:35:08 robertj * Fixed $LOG$ variable in template files * */ #include // End of File /////////////////////////////////////////////////////////////// openam_v1_1_18/run_example0100755000176200056700000000037607372223400016021 0ustar releasepostincr#!/bin/sh # Uncomment a line below to disable the codec #CODEC="$CODEC -DGSM" #CODEC="$CODEC -D711" #CODEC="$CODEC -DLPC" #CODEC="$CODEC -DMS" #CODEC="$CODEC -DGSM" # by default, disable gatekeeper ./openam $CODEC -n -m sample_message -r `pwd`/new_msg openam_v1_1_18/sample_message.sw0100644000176200056700000016120007607523603017117 0ustar releasepostincr )?r;L}qB2t LMZMy9x a$gbG! hf8 2 /K  !J!~D>t~#"^Co!%w)s< ]I2  ֻڗO *!F'O&B,,2C' $   `fq ^ ahxSĿsl,1- -%9G;9(D_% "$W%[cXbƚ&ۭӾ>o&i7!9?OH?*' PWz- [&& 1 - ЖF𨤷]Z'=7g9P R!P+?7/ z!I>!!"#mԔ檲%;y U*>%PNLC?5 v6\J #< A1PνA [W s,!EFnJEC>$.* (tT p} ~O J #>34:(::@}@D3:~- T"x R " ?ؕwɑCy)038U<=>b3d'#} J$-TF,jv3#5)*44:7,a$(r S4zI,Yިz\֍ա-]e$q!A,!15{4/&+ @#[}U8G|a8 :$+100'*n%P?[kS8stOۈ;T_t",)*+)h&%% }&h?Gj Qٞc 15!5(&a&"'! f 2`@>אܰRFZ MO #"#!;%i LM_43=8Cwݯܠ?ErTM ]""dM+o4G&.QR"|8#D R r) UWU ,Ue|h` zFKyA({ tO4@ hYc,Q5~ }nck ( ~^-KVTR/in lB OuM: G  !],>Q!+S-!_.u B dnz p EG2%R2O:a\P S OIo}  l 'J,-#^XJ3> >U ; #  w"Zc\o:j)Tk*5(EoR p  sRz  kVOc\g h~h oWywc ?*F>. Gkn(xbfe;.qk9Y4:\nF  =;  `o6<I_{?-uI`Dx! O 7A. J 4NMPhaV3_ XCFC t  J K   t!#gc1@RaOte ` J m Z X |  JM ? <Aa :-OF ,Zc?` qM wvZy;UHwl&".-|Q  6cCB}n9GlHni|Rj.T0kX>/ H | e - r$ 9;IZ"9 @:X0)5{] K P  uE W4}296i#Vf  s o Xr@ kl3:  P v #7Ndr6B< l#Lg" )d% 7 XB  &  ,yvW*MI!^V $4aI 5{<) f . E).IvBl&lOD( &S"= w z' F  D!rB  >Ȫ?׎ +4>!D4$4H .7eۯ3h))@,w,)/H E q. B (Vﴆl7c-)?^H6G#O&(wzP9&G369Bg+8wLYܸș08Zv'Hm`\ZJ-*K8 .k>;E4>; d' ܰԈűW109K(4.?M ]wM9~p4nV 8a ?rt? B $ 0lz  C)+]jb c@{\HW/ZIFy""[Peni N v pE;fQ ' w  S8[ HEVgM  )-")X@ HO IW"{@zUmQZ *1mX20<݀uY4 ,&,/$ m0 h Q-<f}I187 C h NQTC>g/]nߦb eҳq(E.2#$ b~GC B's56 `>$  edcuvOѽ4K"*-"s*C&:} uS: 4|wv Rd} KtYz[KD|ޓ> !&d$ ;)m0se  R {nf \ ) w Sj_. s&$ lgߑ6r K h/% u:zO! f L R _ ? D?^?  z{E p U bNG5fh0++ #,=CX V~ F % ha];'D i ] . I  1 b  f  P oa^O%`+U8-c 4 p3"]4W3 eM^ ! D  W R\YjQ 8 $   4 e o&Lcs'{l 6=gq$ ofYC$r %u + Y l Tsc  B b U qe![wv<brN= +C] v 5(2d}T @T QTD;C#\{:&&f|Jz:;gڼ[_=7#U++'ct^o JP%# B $; '+/*b6]xhm Kko{pVc[i+5},m8Fx5o#+_3yM o8%[*w#+*qZ W! _@ S1   gP-ۛ+2ýF-N9,Y:;:R 'j $82 O.f"Z-) wXV   : @Y$  C!p@c<ـ8"^HU>;/0{rqeA?] *K. rU; K dH @ m'z HR&=ϭ\ºAH G/?+=eЫr6+`B(.x#@.)=c ng O 2   ?Z v 4:MyX<{̀T,A+%W>3/1bYY5 u5% )"7q h(#%a r_ n A J5hoٺ5P%, (n/#!R9xn ,H c  l&  ]:i3 Qe=nF7 >tDw cR0= - _Z.N,{TBQ8?A?A]Lb/s6H k M  EV/ 6 +$h/O. dvy['l/O`jB&CqV?B{22 dD%M%13q+BD @n}yG*Tg  & :P * H 1 B; ~ YV7 7Y'n*Oq{H7P\4o]!BQNZ) !e /,zdPY` 8{=1SQs VqCZ= *V+an4>^ `U`P.iY\DYrNa\9v-dH%Wx<}krerHU'eC rZi4-% dW #[:#,yFe?j Rr5k3iV=1^|?FFv_/9=0XB Ae81<3+]Q8<.{ v  Aa}/P* j)>+SD{pS,8. gf ?tM=[ S:S Q~U)khdtadrUP *YcSFmxR3Y1IK ZA b d%kV?2G6 |Jg-~91Z} _ : -  & ivL^j}^Tm mDV67> ($#+ toVL DL!$#|#  9x/l3Wwr69֚ph[y0%6/) c ^< Z',*-M(S g*RjY"mQe- m$ .7/#!"&P h>B/4yO'3y0#(G&G#ad'OQo@ g 0 zS`ԐUhɯhk%/85,!'B}z ޯ=AT r!2&3 *+;)b|![ #Lc    HDHΛּܸtn^-b6:0`)l#F'5j ז՝;# L)2-)-.'?   &W1 4 M;́ սp.}/08!;d2-%( GfշIߴAb17%t1)(b.W)Q g*5# }I s-,9NȔδ GQ(69!3R/(*#JMQޙ ,(%,, PqA]!0F [7܉֊Yňrp7 -O4E/,).) i. cE\ 4M=  '!AZuMTXDwo fp8&nf(gw  f'  >;0/k  5@ J Pf3F ?LEvRC92D= o&.E?A#F7=)WGJG 7<C.%t^+7.nab: {  U - yug|vICNQT 2* bDSgz 6FeM RER4b^l60j'\y +_ykAta^N 8  Nu!5|Ot)/ /MZd#Ik_>U[oH+#Dk@fS! Q8?wW L2er5v&sQmFGo.q%fy#YO?TO}f1n&7%DB=6$?(C* fw0|H`FEb<CBER3UyKo-FuofPCGXZi5VswK_@_h` 0F^Jm p,]>>_ToT+ U \nYVz B' l+02hY{ID}K qCb ^H m,\tE,` (. F NW R0< /^ k  |  F =AR t vpOX_U( :S/ U;{"-jX7Yt,xoFE8 z~ nX)=ooj^;Ep(f\d";0MFJsv3lD7""7cs&99>-*t\nOPN{Qm!>+>E0O4<KSQC?! [[YM5>&4B0|#@26q9Z=|#'G7kK5sPJ68^RW|[BX39q`-L}` V)u%c G\z(jwW '7+o-nTpZ0"@ Ku~t *_]M^C{u~@\4^.h+Mym%f%.{5>Hp_o&m-  { 6y }Iaqf:k' F!0(<}ks~Sj9Y^n``_!n] p \6& Q8_7suNH3:=P0X sAk2BJ R 67GV4 bJZp8<i g *r l|)+ B ? }mOtzmpP=tI#t? 1;J *w)fp3\ ._ %  ]'  J&o4M' _?ټG /B4,O[loEL  2 `*h9D9xP!d* pe 7 h3Kju38@&:=O =O& y (w ' 1 W}N%"]qR +B RDn( */[MM]4(MަE}vNP'w+ QlW ,W Ni1n(h*y+ W#U &'p+S6՗@M.=#rS!*6%UH# :-  pyVph?Qu1) 8 c= 8KMݭӽ/2E?%L_A w&1  8 y#!"\A $6 4 x}^m"Hpr#0/( ]-+j! {M_ h o~Tf F}  2 q - Xkv< {KZU 'UB' "@ m) C  JOc g 'F /pT;di}HRYhgrN6"L  ] m ] r .G{(*Q3w8>)Nzq[v`}+k9kGq&-i.#Ltcjk6:Vv)oKlPs3![m8:jW8{NH=FYtj8/@lcwNY.dd Jb-Hj>tg1#`MxN%8w)9+az/-Q^1N5t) =}{&NvKpr/@9I[iQ4DVR hUjeo{LYw ?R%v]CwUfFM>Y3E.,)ef@+b%O$F\.aT N\;eoIdsPS e5o$?qqPJm1[Z<{#fldsk$~Z nGoN?|;>c_iJL66h*>29y0n&lxPV Z, 0I\O[]b ? f!`q~d<~-J`dH[@/9 L<Ho+W2o)'cq<h#6@VlrPPd'+]HW!N*]SH"(F " :iiOG,G^$Zi b'H.YE0pYx3f-wi?xj~>::beFM:|Ky nTd/o'ixb),Cq' [ qo{Ni  T 3 3 ;  4&a$"wf )  R  B`jU`|Lg FY v/p FCI'!,@ & <7 d xk?+WEf#m7v)sf?y nh+ Y 9KzQ9 ` @ $ 0 W $HYw mu3x%l^SiA jO+B C  Bu[3m@   F Y doB-r^EHpf$oPR 6$ 5 wj}#  [ s r / ' hmH5kmI=gHUp0?wV]|[ _7'R M:s , 9Z  ' :]ua F E #cq;="A)KjW e-T ;k 51 o/ED  {z6!V%1x\_ubn :f܃JO-U('$ _&ci0 c!R^l mME4m\Q V>/ Ce\uy?)"ֿf% #*D,$rj a#$)fQ #)(h {58!]*;#$ڭ_fb.!)00"$.(3@k~g"&$&z"Arfw[ S_ hF<PxiCg0{/3LX+- w!&U(pEu[UzS.\XQXch8 |1K C{O2D(A]E~$ kv&r  k  *XprZ*1{@1>)ZcJ ,cA|o~j?N&2g;n0mu`e)&TR_#8+~IhoTj $M_n\JgU*CZj]R<hTnGjW' > :J E/c8y 3_(D@9Xa ,t7 Jtti11r:UIVO:HPD16M{v Osi5g.U$+UD 2Ah|$kWJc O{ ep3u$k/yN/WW0h8}({kMTy~m|j9z,Fp{J1Y.Hh)C8Vb  <4evuO0)/*34v3U[_~j~Lt;~qZ#zpx &e!H53Cfm Oy9pqdb;at=,l T.!np*bBhnT#7Roj@Vd6&W})#g+rq jW RvTw6X2jCht-QAlA@5x2*ukJ<4"9|ZNR vU#rFpGT on &|,t@XVh2}a?R,~1"+ltSv=a =v>'w?pEs9ML4qk5t'{JS1[__,x(zcjf<a!{ [M[5 Nq+} /towV7tc{GtHuYDEF% R N ?cIJ-S(m*h /7 A  O /:G  /  41D mZ1?68 e"bwT:cV @-z) "IvXi?NeOb@ _';-c  n  ] 3 aE gJQ+" E=smz9'0+mU\F /| mbWPdsE`{ N4 6 $Wp h TMr v \ R U 49P\>i '"QP ~x]v t 3Z# 8D[ FP6T^@ /y6<&j 4 p -QE , >G#i~p i-> OD@ Ug "Qg1Tu p~G] $ r "yE,F 4  A h R"F*L{Wl'Js L/` 5 @m .{$Kt W 6N`9Ug k  * \ nO5 @0\yMH . tx. `{{   ei`C$$3L 5kF(jM_': a l " X P  m-7 7AFdA'~T$#F X5 va 2%7H Qz\ waoTD / +l3 * L #m e Q Sa 4"72Q3nU+Y0k Ma`Uw A   lQ` + N g { t/4L  tn @ # .x1`s@;v^Hw(;q+* Yf  b 2 92#68?y` b,d {H%j6 y2omA M`YI ',26(_ Cu 7VefM  z L | !582\K e  ^~!Q @i  !@ku|95!Z6EfSM IH 2} # ! > .!0) v  oG( d9  uwGq|6S!rTu0;vbA!   fq;c* T '   (x \Me6   yG}fEbsnMF pH1H#;Kyc/W | l  d?[aD"N)N~PCC 7 t )os_DVaanF[m3Nu46 $ I#y / b+V^{jf ?4 lyq_ -  >({*loy 0B?:r7}+, G ,j*|0#0 ; j R 8rE<m9C  2  U {W- F`EX\T *t=mO _ s B N Fzd(9k)zUfvei(ZeS ! ? JnMWP~^p3L q/)LFndl s  s / ng&tH 4^;&HC H \ Kz)jt|M4:S\oJ)<.' PM)?N=?J.>&A **.- nzVUL(+5#Dxw`ROFE[f/I#-e3my[llvt9*Q=@.\UDZFB4KTdxy $}*l  --  l*}$ O:k p%:~' ~:%p k:O $}*l  --  l*}$ O:k p%:~' ~:%p k:O $}*l  --  l*}$ O:k p%:~' ~:%p k:O $}*l  --  l*}$ O:k p%:~' ~:%p k:O $}*l  --  l*}$ O:k p%:~' ~:%p k:O $}*l  --  l*}$ O:k p%:~' ~:%p k:O $}*l  --  l*}$ O:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:Oopenam_v1_1_18/sample_message.wav0100644000176200056700000016125407607523603017274 0ustar releasepostincrRIFFWAVEfmt @>data )?r;L}qB2t LMZMy9x a$gbG! hf8 2 /K  !J!~D>t~#"^Co!%w)s< ]I2  ֻڗO *!F'O&B,,2C' $   `fq ^ ahxSĿsl,1- -%9G;9(D_% "$W%[cXbƚ&ۭӾ>o&i7!9?OH?*' PWz- [&& 1 - ЖF𨤷]Z'=7g9P R!P+?7/ z!I>!!"#mԔ檲%;y U*>%PNLC?5 v6\J #< A1PνA [W s,!EFnJEC>$.* (tT p} ~O J #>34:(::@}@D3:~- T"x R " ?ؕwɑCy)038U<=>b3d'#} J$-TF,jv3#5)*44:7,a$(r S4zI,Yިz\֍ա-]e$q!A,!15{4/&+ @#[}U8G|a8 :$+100'*n%P?[kS8stOۈ;T_t",)*+)h&%% }&h?Gj Qٞc 15!5(&a&"'! f 2`@>אܰRFZ MO #"#!;%i LM_43=8Cwݯܠ?ErTM ]""dM+o4G&.QR"|8#D R r) UWU ,Ue|h` zFKyA({ tO4@ hYc,Q5~ }nck ( ~^-KVTR/in lB OuM: G  !],>Q!+S-!_.u B dnz p EG2%R2O:a\P S OIo}  l 'J,-#^XJ3> >U ; #  w"Zc\o:j)Tk*5(EoR p  sRz  kVOc\g h~h oWywc ?*F>. Gkn(xbfe;.qk9Y4:\nF  =;  `o6<I_{?-uI`Dx! O 7A. J 4NMPhaV3_ XCFC t  J K   t!#gc1@RaOte ` J m Z X |  JM ? <Aa :-OF ,Zc?` qM wvZy;UHwl&".-|Q  6cCB}n9GlHni|Rj.T0kX>/ H | e - r$ 9;IZ"9 @:X0)5{] K P  uE W4}296i#Vf  s o Xr@ kl3:  P v #7Ndr6B< l#Lg" )d% 7 XB  &  ,yvW*MI!^V $4aI 5{<) f . E).IvBl&lOD( &S"= w z' F  D!rB  >Ȫ?׎ +4>!D4$4H .7eۯ3h))@,w,)/H E q. B (Vﴆl7c-)?^H6G#O&(wzP9&G369Bg+8wLYܸș08Zv'Hm`\ZJ-*K8 .k>;E4>; d' ܰԈűW109K(4.?M ]wM9~p4nV 8a ?rt? B $ 0lz  C)+]jb c@{\HW/ZIFy""[Peni N v pE;fQ ' w  S8[ HEVgM  )-")X@ HO IW"{@zUmQZ *1mX20<݀uY4 ,&,/$ m0 h Q-<f}I187 C h NQTC>g/]nߦb eҳq(E.2#$ b~GC B's56 `>$  edcuvOѽ4K"*-"s*C&:} uS: 4|wv Rd} KtYz[KD|ޓ> !&d$ ;)m0se  R {nf \ ) w Sj_. s&$ lgߑ6r K h/% u:zO! f L R _ ? D?^?  z{E p U bNG5fh0++ #,=CX V~ F % ha];'D i ] . I  1 b  f  P oa^O%`+U8-c 4 p3"]4W3 eM^ ! D  W R\YjQ 8 $   4 e o&Lcs'{l 6=gq$ ofYC$r %u + Y l Tsc  B b U qe![wv<brN= +C] v 5(2d}T @T QTD;C#\{:&&f|Jz:;gڼ[_=7#U++'ct^o JP%# B $; '+/*b6]xhm Kko{pVc[i+5},m8Fx5o#+_3yM o8%[*w#+*qZ W! _@ S1   gP-ۛ+2ýF-N9,Y:;:R 'j $82 O.f"Z-) wXV   : @Y$  C!p@c<ـ8"^HU>;/0{rqeA?] *K. rU; K dH @ m'z HR&=ϭ\ºAH G/?+=eЫr6+`B(.x#@.)=c ng O 2   ?Z v 4:MyX<{̀T,A+%W>3/1bYY5 u5% )"7q h(#%a r_ n A J5hoٺ5P%, (n/#!R9xn ,H c  l&  ]:i3 Qe=nF7 >tDw cR0= - _Z.N,{TBQ8?A?A]Lb/s6H k M  EV/ 6 +$h/O. dvy['l/O`jB&CqV?B{22 dD%M%13q+BD @n}yG*Tg  & :P * H 1 B; ~ YV7 7Y'n*Oq{H7P\4o]!BQNZ) !e /,zdPY` 8{=1SQs VqCZ= *V+an4>^ `U`P.iY\DYrNa\9v-dH%Wx<}krerHU'eC rZi4-% dW #[:#,yFe?j Rr5k3iV=1^|?FFv_/9=0XB Ae81<3+]Q8<.{ v  Aa}/P* j)>+SD{pS,8. gf ?tM=[ S:S Q~U)khdtadrUP *YcSFmxR3Y1IK ZA b d%kV?2G6 |Jg-~91Z} _ : -  & ivL^j}^Tm mDV67> ($#+ toVL DL!$#|#  9x/l3Wwr69֚ph[y0%6/) c ^< Z',*-M(S g*RjY"mQe- m$ .7/#!"&P h>B/4yO'3y0#(G&G#ad'OQo@ g 0 zS`ԐUhɯhk%/85,!'B}z ޯ=AT r!2&3 *+;)b|![ #Lc    HDHΛּܸtn^-b6:0`)l#F'5j ז՝;# L)2-)-.'?   &W1 4 M;́ սp.}/08!;d2-%( GfշIߴAb17%t1)(b.W)Q g*5# }I s-,9NȔδ GQ(69!3R/(*#JMQޙ ,(%,, PqA]!0F [7܉֊Yňrp7 -O4E/,).) i. cE\ 4M=  '!AZuMTXDwo fp8&nf(gw  f'  >;0/k  5@ J Pf3F ?LEvRC92D= o&.E?A#F7=)WGJG 7<C.%t^+7.nab: {  U - yug|vICNQT 2* bDSgz 6FeM RER4b^l60j'\y +_ykAta^N 8  Nu!5|Ot)/ /MZd#Ik_>U[oH+#Dk@fS! Q8?wW L2er5v&sQmFGo.q%fy#YO?TO}f1n&7%DB=6$?(C* fw0|H`FEb<CBER3UyKo-FuofPCGXZi5VswK_@_h` 0F^Jm p,]>>_ToT+ U \nYVz B' l+02hY{ID}K qCb ^H m,\tE,` (. F NW R0< /^ k  |  F =AR t vpOX_U( :S/ U;{"-jX7Yt,xoFE8 z~ nX)=ooj^;Ep(f\d";0MFJsv3lD7""7cs&99>-*t\nOPN{Qm!>+>E0O4<KSQC?! [[YM5>&4B0|#@26q9Z=|#'G7kK5sPJ68^RW|[BX39q`-L}` V)u%c G\z(jwW '7+o-nTpZ0"@ Ku~t *_]M^C{u~@\4^.h+Mym%f%.{5>Hp_o&m-  { 6y }Iaqf:k' F!0(<}ks~Sj9Y^n``_!n] p \6& Q8_7suNH3:=P0X sAk2BJ R 67GV4 bJZp8<i g *r l|)+ B ? }mOtzmpP=tI#t? 1;J *w)fp3\ ._ %  ]'  J&o4M' _?ټG /B4,O[loEL  2 `*h9D9xP!d* pe 7 h3Kju38@&:=O =O& y (w ' 1 W}N%"]qR +B RDn( */[MM]4(MަE}vNP'w+ QlW ,W Ni1n(h*y+ W#U &'p+S6՗@M.=#rS!*6%UH# :-  pyVph?Qu1) 8 c= 8KMݭӽ/2E?%L_A w&1  8 y#!"\A $6 4 x}^m"Hpr#0/( ]-+j! {M_ h o~Tf F}  2 q - Xkv< {KZU 'UB' "@ m) C  JOc g 'F /pT;di}HRYhgrN6"L  ] m ] r .G{(*Q3w8>)Nzq[v`}+k9kGq&-i.#Ltcjk6:Vv)oKlPs3![m8:jW8{NH=FYtj8/@lcwNY.dd Jb-Hj>tg1#`MxN%8w)9+az/-Q^1N5t) =}{&NvKpr/@9I[iQ4DVR hUjeo{LYw ?R%v]CwUfFM>Y3E.,)ef@+b%O$F\.aT N\;eoIdsPS e5o$?qqPJm1[Z<{#fldsk$~Z nGoN?|;>c_iJL66h*>29y0n&lxPV Z, 0I\O[]b ? f!`q~d<~-J`dH[@/9 L<Ho+W2o)'cq<h#6@VlrPPd'+]HW!N*]SH"(F " :iiOG,G^$Zi b'H.YE0pYx3f-wi?xj~>::beFM:|Ky nTd/o'ixb),Cq' [ qo{Ni  T 3 3 ;  4&a$"wf )  R  B`jU`|Lg FY v/p FCI'!,@ & <7 d xk?+WEf#m7v)sf?y nh+ Y 9KzQ9 ` @ $ 0 W $HYw mu3x%l^SiA jO+B C  Bu[3m@   F Y doB-r^EHpf$oPR 6$ 5 wj}#  [ s r / ' hmH5kmI=gHUp0?wV]|[ _7'R M:s , 9Z  ' :]ua F E #cq;="A)KjW e-T ;k 51 o/ED  {z6!V%1x\_ubn :f܃JO-U('$ _&ci0 c!R^l mME4m\Q V>/ Ce\uy?)"ֿf% #*D,$rj a#$)fQ #)(h {58!]*;#$ڭ_fb.!)00"$.(3@k~g"&$&z"Arfw[ S_ hF<PxiCg0{/3LX+- w!&U(pEu[UzS.\XQXch8 |1K C{O2D(A]E~$ kv&r  k  *XprZ*1{@1>)ZcJ ,cA|o~j?N&2g;n0mu`e)&TR_#8+~IhoTj $M_n\JgU*CZj]R<hTnGjW' > :J E/c8y 3_(D@9Xa ,t7 Jtti11r:UIVO:HPD16M{v Osi5g.U$+UD 2Ah|$kWJc O{ ep3u$k/yN/WW0h8}({kMTy~m|j9z,Fp{J1Y.Hh)C8Vb  <4evuO0)/*34v3U[_~j~Lt;~qZ#zpx &e!H53Cfm Oy9pqdb;at=,l T.!np*bBhnT#7Roj@Vd6&W})#g+rq jW RvTw6X2jCht-QAlA@5x2*ukJ<4"9|ZNR vU#rFpGT on &|,t@XVh2}a?R,~1"+ltSv=a =v>'w?pEs9ML4qk5t'{JS1[__,x(zcjf<a!{ [M[5 Nq+} /towV7tc{GtHuYDEF% R N ?cIJ-S(m*h /7 A  O /:G  /  41D mZ1?68 e"bwT:cV @-z) "IvXi?NeOb@ _';-c  n  ] 3 aE gJQ+" E=smz9'0+mU\F /| mbWPdsE`{ N4 6 $Wp h TMr v \ R U 49P\>i '"QP ~x]v t 3Z# 8D[ FP6T^@ /y6<&j 4 p -QE , >G#i~p i-> OD@ Ug "Qg1Tu p~G] $ r "yE,F 4  A h R"F*L{Wl'Js L/` 5 @m .{$Kt W 6N`9Ug k  * \ nO5 @0\yMH . tx. `{{   ei`C$$3L 5kF(jM_': a l " X P  m-7 7AFdA'~T$#F X5 va 2%7H Qz\ waoTD / +l3 * L #m e Q Sa 4"72Q3nU+Y0k Ma`Uw A   lQ` + N g { t/4L  tn @ # .x1`s@;v^Hw(;q+* Yf  b 2 92#68?y` b,d {H%j6 y2omA M`YI ',26(_ Cu 7VefM  z L | !582\K e  ^~!Q @i  !@ku|95!Z6EfSM IH 2} # ! > .!0) v  oG( d9  uwGq|6S!rTu0;vbA!   fq;c* T '   (x \Me6   yG}fEbsnMF pH1H#;Kyc/W | l  d?[aD"N)N~PCC 7 t )os_DVaanF[m3Nu46 $ I#y / b+V^{jf ?4 lyq_ -  >({*loy 0B?:r7}+, G ,j*|0#0 ; j R 8rE<m9C  2  U {W- F`EX\T *t=mO _ s B N Fzd(9k)zUfvei(ZeS ! ? JnMWP~^p3L q/)LFndl s  s / ng&tH 4^;&HC H \ Kz)jt|M4:S\oJ)<.' PM)?N=?J.>&A **.- nzVUL(+5#Dxw`ROFE[f/I#-e3my[llvt9*Q=@.\UDZFB4KTdxy $}*l  --  l*}$ O:k p%:~' ~:%p k:O $}*l  --  l*}$ O:k p%:~' ~:%p k:O $}*l  --  l*}$ O:k p%:~' ~:%p k:O $}*l  --  l*}$ O:k p%:~' ~:%p k:O $}*l  --  l*}$ O:k p%:~' ~:%p k:O $}*l  --  l*}$ O:k p%:~' ~:%p k:O $}*l  --  l*}$ O:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' ~:%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:O $}*l  --  l*}$ P:k p%:~' :%p k:Oopenam_v1_1_18/sample_message_bigendian.sw0100644000176200056700000015305007322620254021115 0ustar releasepostincr )?r;L}qB2t LMZMy9x a$gbG! hf 8 2/K !J!~D>t~#"^Co!%w)s< ]I2  λO !*'F&O,B,2'C$     `fq ^ahxSčԿs,l-1- 9%;G9(D_ %"$%W[cۿXb&۾Ψ>o&7i9!?OH?*' PWz -[&&  1- F]Z'7=9gPR P!?+7/ z!I>!!"#mԆ淲%; y*U>P%NLC?5 v6\J #< A1PA [ Ws,E!FJnEC>.$* (tT p }~ OJ #>34(:::@@}D:3-~ T"x R "?ȕwǑCy)038=3b'd# }J$-TF,jv3#)5*44:7,$a(r S4zI,YϨz\Սϡ-]e$!q,A1!54{/&+ @#[}U8Gք|a8 :$+100'*%nP?[kS8stO҈;T_t"),*)+&h%% }&h?Gj Qc 15!(5&&a"'!  f2`@>ܐRېF ZM O#"#!%;i LM_43=8Cۇw?ErT M "]"dM+o4G&.QR"|8# D Rr) UWU ,Ue|h` zFKyA({ tO4@ hYc,Q5~ }nc k (~^-KVTR/in lB OuM:  G !],>Q!+S-!_.u Bdnz p EG2%R2O:a\P S OIo} l 'J,-#^XJ3> >U ;  # w"Zc\o:j)Tk*5(Eo R p sRz kVOc\g h~h oWyw c?*F>. Gkn(xbfe;.qk9Y4:\n F = ; `o6<I_{?-uI`Dx ! O7A . J4NMPhaV3_ XCFC  t J K   t!#gc1@RaOt e ` J m Z X |  JM ? <Aa :-OF ,Zc? `qM wvZy;UHwl&".-| Q 6cCB}n9GlHni|Rj.T0kX>/ H | e  -r $9;IZ"9 @:X0)5{ ] K P uE W4}296i#Vf   s oXr @ kl3 : Pv #7Ndr6B< l#Lg"  )d%  7X B  &  ,yvW*MI!^V  $4a I5{<) f . E).IvBl&lOD( &S"= w z' F D!rB  >? +4>!4D4$H .7e3)h)@,,w)/H E q. B (Vl7-c)?^HG6#O&(wzƴPљ9&G369B+g8wLYȸʙ08Zv'Hm`\JZ-K*8 .ʱk>;4E><;3YD<.N-B6vud`0Gpi&;VW;A5B;* X[ЭM2/,3{2B2-<# wBgY !8ԴM8pI/WݴǙ07 l,61rM`C OWG%+#!%;2)L'( \ < W=Zg- i} 6 f!K?dLBiujw 7EdJo&9<; Uf۲6 8z,#A4*!(((.T unx@o9m` z iQ5i1ܦͨ ˼Ĉ&q0J\+D,8?V/ UvT{۰KD6gtG-) ##("VWO{K > d' ԰҈W190(K4.? M ]wM9<eU \v$c.[ u ,M&mzC^:0rZBi`6)AX3Jl!.7z 7,8pz& 9L H i  `XF#Y ]BsZ@s8_Tev#ds f d (5 XT(raO=K*e~7tljwc1 HRxSc:}&h,  A o } a YhqZZUg]$AuE}vZgv:P9w !RzS mjT{Agx  l ; / Z "~}N'#"=^)1ZJ)E ^">~p4nV 8a ?rt?  B $0lz  C)+]jb c@{\HW/ZIF"y"[Peni N v pE;f Q ' w  S8[ HEVg߁M  )-)"X@ H OIW"{@zUmQZ *1mX20<ڀuY4 ,&,/$ m0 h Q-<f}I187 C  hNQTC>g/]nߦb e(q.E2$# b~G CB's56 `>$ edcuvO4K"*-"s*C&: }uS: 4|w vRd } KtYz[KD|ؓ> !&$d ;)m0s e R {n f \)  wSj_. s&$ lgڑ6r Kh/ %u:zO ! f L R _ ? D?^? z{E p UbNG5fh0++ #,=CX V~ F %ha];'D i ] . I  1 b  f  P oa^O%`+U8- c 4p3"]4W3 eM^  ! D  WR\YjQ 8 $   4 e o&Lcs'{l 6=gq $ofYC$r % u + Yl Ts c  B b U qe![wv<۷brN= +C] v5(2d} T@T QTD;C#\{:&&f|Jz:;gм[_=7#+U+'ct^o JP%# B $; '/+*b6]xhm Kko{pVc[i+5},8mF5xo#+_3yM o%8[*#w+*qZ W! _@ S1  gPݦ-ٛ+2δF-N9,:Y;:R ' j$28 O.f"Z)- wX V : @Y $ C!p@c<٩р8"H^>U;/0{rqeA?] *K. rU; KdH  @m' z HR&ۙ=Э\୺AH /G?+=eҫr6+`(B.#x.@)=c ng  O2  ? Z v4:MyX<{€T,A+%>W/31bYY5 u5%) "7q h#(% ar_ n A J5hoݿٺ5P%, (/n#!R9xn ,H c  l& ]:i3 Qe=nF7 >tDw cR0 = -_Z.N,{TBQ8?A?A]Lb/s6H  k M EV / 6 +$h/O. dvy['l/O`jB&CqV?B{22 dD%M%13q+BD @n}yG*T g  &: P * H 1 B ; ~YV 77Y'n*Oq{H7P\4o]!BQNZ) !e /,zdPY` 8{=1SQs VqCZ= *V+an4>^ `U`P.iY\DYrNa\9v-dH%Wx<}krerHU'eC rZi4-% dW #[:#,yFe?j Rr5k3iV=1^|?FFv_/9=0XB Ae81<3+]Q8<.{ v  Aa}/P* j)>+SD{pS,8. gf ?tM=[ S:S Q~U)khdtadrUP *YcSFmxR3Y1IK ZA b d%kV?2G6 |Jg-~91Z } _ : -  &ivL^j}^Tm mDV67> $(#+ toVL D!L$##|  9x/l3Wwr69Κph[y0%/6)  c^< Z'*,-(M Sg*RjY"mQ۹e -$m. 7/#!&" Ph>B/4yO'30y(#&G#Gad'OQo @ g 0zS`̐Uhhk%/85,!'B}z =AT r!23&* +);b|![ #Lc   HDHśtn-^6b:0)`#l'F5j Ֆ;# L)2-).-'?   &W 14 M;ǁ دp.}/80;!2d-%( GfڤIAb1%71t)(.b)WQ g*5# } Is-,9N G(Q693!/R(*#JMQ ,(%,, PqA]!0F [7ܓ։͊YɈrp7 -4O/E,)). i. ީcE\ 4M= ' !AZuMTXDwo fp8&nf(g w f'  >;0/k  5@ J Pf3F ?LEvRC92D= o&.E?A#F7=)WGJG 7<C.%t^+7.nab : {  U -yug|vICNQT 2* bDSgz 6FeM RER4b^l60j'\y +_ykAta^N 8  Nu!5|Ot)/ /MZd#Ik_>U[oH+#Dk@fS! Q8?wW L2er5v&sQmFGo.q%fy#YO?TO}f1n&7%DB=6$?(C* fw0|H`FEb<CBER3UyKo-FuofPCGXZi5VswK_@_h` 0F^J mp,]>>_ToT + U\nYVz B ' l+02hY{ID}K qCb ^ Hm,\tE, `(. F NW R0< /^ k |   F =A Rt vpOX_U (:S/ U;{"-jX7Yt,xoFE8 z~ nX)=ooj^;Ep(f\d";0MFJsv3lD7""7cs&99>-*t\nOPN{Qm!>+>E0O4<KSQC?! [[YM5>&4B0|#@26q9Z=|#'G7kK5sPJ68^RW|[BX39q`-L}` V)u%c G\z(jwW '7+o-nTpZ0"@ Ku~ t *_]M^C{u~@\4^.h+Mym%f%.{5>Hp_o&m - { 6 y}Iaqf:k' F!0(<}ks~Sj9Y^n``_!n] p\6 & Q8_7suNH3:=P0X sAk2BJ R 67GV4 bJZp8<i g * rl|)+ B ?}mOtzmpP=tI#t? 1;J *w)fp3 \ ._  % ] ' J&o4M' _?G/ 4B,O[loEL  2  `*h9D9xP!d *pe 7 h3Kju83@&:=O =O&  y ( w ' 1W}N%"]qR + BRDn( */[MM]4(MߏE}vN'P+w  QlW ,W Ni1(n*hy+ W#U &'p+S6@M=.ߒ#rS!*%6UH# : - pyVph?Qu1 )8 c= 8KMӭԽ/2E?%L_ A&w1   8#y"!\ A$ 6 4 x}^m"Hpr#0/( ]-+!j {M_  h o~Tf F}  2 q -Xkv< {KZU 'UB' " @m) C JOc g'F /pT;di}HRYhgrN6"L  ]  m ] r .G{(*Q3w8>)Nzq[v`}+k9kGq&-i.#Ltcjk6:Vv)oKlPs3![m8:jW8{NH=FYtj8/@lcwNY.dd Jb-Hj>tg1#`MxN%8w)9+az/-Q^1N5t) =}{&NvKpr/@9I[iQ4DVR hUjeo{LYw ?R%v]CwUfFM>Y3E.,)ef@+b%O$F\.aT N\;eoIdsPS e5o$?qqPJm1[Z<{#fldsk$~Z nGoN?|;>c_iJL66h*>29y0n&lxPV Z, 0I\O[]b ? f!`q~d<~-J`dH[@/9 L<Ho+W2o)'cq<h#6@VlrPPd'+]HW!N*]SH"(F " :iiOG,G^$Zi b'H.YE0pYx3f-wi?xj~>::beFM:|Ky nTd/o'ixb),Cq' [ qo{Ni  T 3 3 ; 4&a$"w f )  R B`jU`|Lg F Yv/p FCI'!, @ &<7 dxk?+WEf#m7v)sf?y nh + Y9KzQ9  ` @ $ 0 W$HYw mu3x%l^SiA  jO+ B C Bu[3m@    F YdoB-r^EHpf$oPR 6$ 5 wj}#  [ s r / 'hmH5kmI=gHUp0?wV]| [_7'R M: s ,9Z  ':]ua F E #cq;="A)KjW e-T ;k 51 o/ED  {z6!V%1x\_ubn :fJO-(U'$ _&ci0 c!R^ lmME4m\ QV>/ Ce\uy?)"ҿf% #*,D$rj a#$)fQ #)(h {58!]*;#$ԭ_fb!.)00$"(.3@k~"g&&$"zArfw [S _hF<PxiCg0{/3LX+- w!&(UpEu[UzS.\XQXch 8 |1K C{O2D(A]E~$ kv& r k  *XprZ*1{@1>)ZcJ ,cA|o~j?N&2g;n0mu`e)&TR_#8+~IhoTj $M_n\JgU*CZj]R<hTnGjW' > :J E/c8y 3_(D@9Xa ,t7 Jtti11r:UIVO:HPD16M{v Osi5g.U$+UD 2Ah|$kWJc O{ ep3u$k/yN/WW0h8}({kMTy~m|j9z,Fp{J1Y.Hh)C8Vb  <4evuO0)/*34v3U[_~j~Lt;~qZ#zpx &e!H53Cfm Oy9pqdb;at=,l T.!np*bBhnT#7Roj@Vd6&W})#g+rq jW RvTw6X2jCht-QAlA@5x2*ukJ<4"9|ZNR vU#rFpG To n&|,t@XVh2}a?R,~1"+ltSv=a =v>'w?pEs9ML4qk5t'{JS1[__,x(zcjf<a!{ [M[5 Nq+} /towV7tc{GtHuYDEF% R N ?cI-J(Sm* h/7 A   O/:G  / 41D mZ1?68 e"bwT:cV @-)z "IvXi?NeOb@ _';-c  n  ] 3aE gJQ+"  E=smz9'+0mU\F /| mbWPdsE` {N4 6$Wp  hTM rv \ R U49P\>i '"Q P~x] vt 3Z# 8D[ FP6T^ @ /y6<& j4  p-QE , >G#i~p i- >OD @Ug "Qg1Tu p~G ]$ r "yE,F 4  Ah R"F*L{Wl'Js L/` 5 @ m.{$Kt W 6N`9U gk  * \nO5 @0\yMH . tx. `{ { ei`C$$3 L 5kF(jM_' :a l  " X P m-7 7AFdA'~T$#F X5 va 2%7H Qz \waoT D /+l3  * L# m e QS a4"72Q3nU+Y0k Ma`Uw A lQ ` + N g {t/4 L t n @ #.x1`s@;v^Hw(;q+ *Y f  b 292#68?y ` b,d {H%j6 y2omA M`YI ',26( _Cu 7Vef M  z L |!582\K e  ^~! Q @i !@ku|95!Z6EfSM IH 2}  # ! >.!0) v oG( d9   uwGq|6S!rTu0;vbA!   fq;c * T '  (x \Me6  yG}fEbsnMF pH1H#;Kyc/W | l d?[aD"N)N~PCC  7 t )os_DVaanF[m3Nu46 $ I# y /b+V^{jf ?4 lyq_ - >({*loy 0B?:r7}+, G ,j*|0#0 ; j R8rE<m9 C  2  U{W- F`EX\T *t=mO  _ s B NFzd(9k)zUfvei(ZeS ! ?JnMWP~^p3L q/)LFnd l s  s /ng&tH 4^;&H C H \Kz)jt|M4:S\oJ)<.' PM)?N=?J.>&A **.- nzVUL(+5#Dxw`ROFE[f/I#-e3my[llvt9*Q=@.\UDZFB4KTdxy gVpjLK7UkTjnhrKbu);Pba>0:>[~kdEOjkOF>  GPU]Il~  !+ 'by Z<)_$w2!SˀE,F1*YJW<!j)=-Kқ`EL"$ @K&w@4 \]6ڛmTs E <8,/>qG;,-pci4{*l {5l9qƂ2% ^ 4 X۞wA6@#NUͱ1 -C<deë_0>'$ۜ| BU+'.(&y%5%<(]DP9"4˯&< |Cׁ<3c".d7<X>T/!S2t-5\-z$:.)/HҊ'[:% .Vԥ#7?6 `+պ g)  daȻj<8-e}p #-/NJ$f23CgkpM>b+:%$e&g <5ۊi,AA/0քmzszY)b8&?2 cn,'v+s¿Ŋ`o6/%yFz 1b8Bõ:H(~$. K '3@@& }ɒzj? pH}/2@e+Imliumb\)&$8)xj%&5k4k$?{f+ 1w\9=:5̈  #FIt#K ~6>"gB&+* al--8# P' t7.cJS,[mM{2=8YW&[Hfb /·[$(?1o=Y FXn.εT#?5 =ޅR ' !(08t3u _j ,64 +3)=U׸*0?(cX މ #lQɓ9- AM.^Ѷ_ 7{$l$mzʓ#;1.& R]1+31Dz.&@ qظvL6=KLPȗ h!lkX*"O 5@}%=5 q'%k63,;'h I}3-5ݿ  0;!){,߃+;[8.6Esy BP !;4=ўV / ?%Pi 3:2N#"4'#'f06YnB&݇ $=2iiG$ 3 wψ ?d8s`ι?a  ]D6$OAi9W7L dkj (3Cșd -9.6o,ܯ:_,>N*%+[{j/i, ֿɢ3&/'s`A828KV= $(p1: <Μ9j>ωoz tA (NѮّ +3a=d#`#AH0&ҧl9r'4R!4`I0 ;33 6%0 [J>):a:a< T)P v9:t5C[+"0Wa\ .3 68(<8+Ac$g ֯'W@35cXN mE=5l& 0'W.Dk‰3}01f9] b /];1"qTɮz <$#g E$."/AK+$a߫w {o~7Z)?/QjEz\ *~* y6+ ~s0h4v82;' tb U[6?"+5S% O 0@L25?'R܉,E% п'7%*#Q%73 4ˊZ)TCYjٔg <<;Aɼϐ Xjd[(18=;!/,[տiײY/*7Dk$m9m,=ſҺ,!X*zaXq#?v5 :ԭZ +, =˗ʚOF=8u; !+Gz44WmwBc*9 #&͉n x/`x(ˉe.A.oW@ !!:!«%<. px߈Zo/~0Og&T1( 9rە!6t< +ǣǙ C kC`s 5@~$jЛBR)S".e=2'A_J1+cɾ̩"T2#85: '|:7dlLóKQ"3=+ 1Լ4I;=<6r*0"S. 5;V[[fFb!b2$~)2f`W4[_i%<0֌ң%#X6f2p; !?7;dװ SMWS!e81:8, | )&1q[} /05+ߦ,= (?fQ k"Wwb  ϩ+FAv08ٽc&Y" Ł˂#>2 {ڜ 1#c*.a*f3- s2;#ǮsD g$_ s Ua% Iuτ* 3[A'Ұ1S\d N/ҥ-?4+3}A-G*b鿥h!5(,g"7>7/ &#, W 9>aOι  #5a<Ďd 4>0#4۪O^.w$R>-*6P",N@> 91Ncj6( ^ QorK@>79UɾM 9f$u:;m,1J!Q.ʔۙ 04A6N zudx K),֦63u@&XJ]RR)#6rVY)9&9]au6h1 Ŀ˜,n?\gx < :]YAZ 9=Wk؄N) ͭ* 01(8bS#7*6Sф#,rm'ـ k$>4 tW e .E̠;>8w5J U(ǡa65;q_ i `)7!! A)+P_r"p|i,?,Ҍک 1#:ʘI(@2` i%p  "% pP:15> k.4/xJ-("Gؿ7 3>z#G˥JlCVٞ1|A9*:.~xh zW$!pAΈx(<-+X2F0< V݅#x09$ ^l7w h9:;lƚU<I  k.d8?@ ZS /t%%?2w0;#<AuM&$4 *{$}1 ݝ <5} ܔÌϠ_M dU? [9 DёBP=;$?X֯& @ $r.E67D9i!~{i p#%4 "kڿ +0 nuP#ݭ)>. r“r  o%@5 wZJ L o "c ,VrM;5 ]&0 p*2=hM{0-6\x k05=g%&ðޅ v U 4ͭ٥F.A-6׳# 9g ä͔'Y> /!i܎| K-.[Ʀ3\) 3?_ނ5:c!3#: h kB 6q@H#uΞq  DP T6{0>I'tR g/)X޾m$4$wEhu95ޕb/%c" p։К<<kѾ~ B ;~b77*'%_)A_65aȇ) u0ӡ19=f45 ,snl")tzsh+!Xыk,*8"\<NV 8/cK*v?ض,X> 8+Sѫ v Ha*;;^ո۶+29u+rj 26jUiY'9 'O$*NvB_۬/(@'1hDא |8Mfͮd"?5ӊq[  1# )`d =723lK? -7VI )(qvBfY0@)Kު=xȩ*,uA.ݑk %%ݸ6":]- "R(814@?Lk-F%F P3[cR_7=6* i[juחC 4@g&9"pw* \' Jv +;-'8#k%@4/ !wXP. Fwh\>;9| `Pp%  g4:=fZNn M'I͸ښ 39$ }X"5(kӮM&7/ 'ݲ$>M3'L/2<v Υ) ?,8ub  }cp%86w)T (5 ,-A<>,>+ Mкg!h  z}{N)AX1κv   " K~"a!(<1  q-M2fYì5U0/*'w۞~3=J!ttů $e mAdo2`AO)mr:N0 !84C*=+l0i- r]P>2&)F1, U 89+ Ɍ"j @Jo9,?в\7j]"9^{cذF2<#]*.1'X c&3C w.y,ac ;3 0.Q#|5,|aИM>:k !{!n˄İ8:=ܟbdh #1 726-k2(SEB4A(<,n'r[#4y $ B"Nq(?,/N>٬oME}+,6 mߔX(5+ j~P48A15& q% Pwг6?"<t 8բgLj1?)'{S>K~~Q-y&_&6%dV]$84 B˖26([M$ ~؅8Z=tgR;9- * o.!6?Z(Y3a$:7-6uқs ( ( *#?6? ,.M Zt Kɥ[=@8tZ ",O{33Tc+g9$w%'VF:^u2,}@.}LJjH&F2&@2 -tER&U))l7/Ov507uFÐE)%X9Syԝ 3?%]z[ "}/@+,_v(%X'ُ<̃%9*"6>g43k2߄*,e!HY M19<@  : k%LP79?" W֬ @?OD)SzE.(9#B9t^ 46-[է? -\W9?#ى =7^б<*X  "6V<;pّ Eyl(Swys47d!F&7*%10הq'z,z=(?}0h%Ħ)" OE$9@15 AݢU 7 h &fcT9S3 Hj D,C5ps,,u*Fj/BOM0?+'l_uSZ d޶ʉL-Au.V>.Ђ Re##IDC$;.y H40[2Ih/'/ + uk$6<yu SY3dغ_ O5r@%jVѫ3 C$J%5-<'ea2,LN[!51m"[SpܒF;8"O0o̘!  ;=eNf^J'h$<G< 4;q4S j(x!3%xn(1U}f_%=d1fxF!J$ Zu !C?85dN͊rk ">ȓwN:7x ݈ z 'X2J4 .g/iY'(y,=)e šY  jzwΐ*Az1$ vݵn*v YW (2ʮ*"=u2o +e+0{a2,A``]MxޓV3;d y"" xݼTP3A-(u)] DX(\,I>+Hx%W.]+ Z 4' !Q>s78 pì%~_w 6 Dm9>ugύC ZP8w 4=#atCmV/%NѶN(5W!0n9) :26 M1i& (` F>7:Zӄ/ M NG:(:$>[@",/Tʼ /4s4H+Jn(;*\Jwf!)&]v6G v;&'@3n% 60S 6Y >157kמ~F~ &[-U7k40l0uP .:]!~x/C !%$WSo kPj0+A+?R4Xx^ >6)C*z@/H3r~")[) ޴=7,U fC`376% æC)J" -X eKC/7?4!X 4 VB8*2?'>ךC XE +$w>ՎP{y(8&Y 7*2 wUˌZ+PUWگշ<);-|VweOІ9~=eֺ٪_e2C+<ͻ_D0.7?]5^@$%8+=4 2"+\H ;ٽ$??B5# Q: sh%s ;H˙E>-8Q= )?LJd553O,\MNopenam_v1_1_18/sample_message_g7231.wav0100644000176200056700000001327407420374636020120 0ustar releasepostincrRIFFWAVEfmt @ factdatab +mA~uM3 ~!ơ`>б~KO6 Ԅ"h.@>=A2xGXY(H TEc(j"OZQ;RL nzdT:S3WRq0:@ `@QEX+C٭F(6^ ؈O< kItrt`﹠Ƨf0:-&q/5_lfJ /(SQDhc/8.6s?hЩq^Rl5 WZUsR$Ա/,^P>l'XǷ!\ðEa4(>X{ d>Q0f,"]5#ȂZmS@MT2TNepƤ%Wٲ Yw7'[9l?,A"#) /Cmt ے:褤WكoJ&-t)j\C՚L:P|fp1d0}6."z"㨷!Ȳ}A|J7t*+#ƱxCgЖRҦ?œ^V`0H&-bR+R^8tIv˳yx:ڔ|~>6R|{}R;=@ 6i_@Y`BUV|Z\%s` e.G%^$Ce$CV}ِǚQ*udrkJtkx4\" ΑYX 'jM‡35̳Xق$_.> P:pE1$5y%?DZÚfTr'}~~DLvTF+RY4U.ǡFw PZLC /fIu"v`E4` #Fz- #xN؄i:ܩ1p65-V_Ec&`H9+@Hښ#\;F$LԺq}dp-)LԌ cnP 2>\?oe b~*3,F\J޵ޒ$>H)Il0c%206sAVpy] @_dȞt[TTuyB4~`Pj5sٰ٢TY4zH)Ut\^0c̠ pzx:.PTk"bqw PCP{T@)_A&߬vء lbtx5i$9Pa0xrPR}Sb_nT|~@+|:-ZR% X \?rکEE,>) RGoڭT m(eQ!|V"]~M((tc/g ΜVr>QK-iЎ{^ȢILqJz+eP: KaQ Z!xWx`f$k ~NN-X^6j*gQGMP]$6JsH`5ɳ%u_^6j+tEYfq+剜^6jIWɞ|`:>9Qm6jɟdE X^6jɠaU1^6jɯɟ܆ٝWEp $_6jɰIZYkbFKWo^6jIV⟌i5( W$6j>I2H'9H ^6ɟtG5xp w^6jI|EtpP~*J$"f^jHG:3h9t246ttx_M1] &f$_6ɟxLWvԿCf^6jdşfS{` Mՠ^6jIIWC#.Ů j^,@HmjQ6$!-Xk ;X^6j ;kHAKq'o^6:{H6{Ȗ[Z>彠6j䴟tE=dhw Dw̑^6j:ɟCX"(>X^6jI vE\:[[t?ᇜ^6j:ɟD>؈ & ^5jCV D@,~f#O^6;hlW\N4O.YG3̰ja؉bw|X>5r+y6K+)ç$_6jɞɟqz^6J'/O?-X^6+XdGu|D0iFCX^6jԫɞd:^6jɝIXxX^6jjIx*t!ةhfǜ^6jdEVI|.īX^6jII^ja3бH^6jɟtŮ"MV{R^6jI:&B|o@aX^6j(cN S5芡 z"7z >^XUK>FR}㰳HzF ڈJEWEʵgpvR_P eS0DXb*pjީSr5ST VHCيT(6}P&cس)I V.(!\ʤ8hO| #v *ш1t &^D Yr}PʚJfBRoUjm10 H&&Xe@D7k֣*^fpUi{W\PeP&Tht*-"hPl5"eV\g>ΆJ~Қ6@FW.6Eվ4L0bw .u.k+_-E?A^3QMt$PA@SQ*:N] J !]X*F+QE@- Q[=`aONX/څbH(Wae몞Oe]* R?p(@V,QeRP`MS-Ğ-^zG}Ş&nC]XԳ&:i>4"%MӖgT? R Ur/Gac2tтނv{_"@mX !VU6=QLZIמ~%Q\%9lM!c v7A*$I"FVƤri+Aƺ z@X[Ogʴj~$P?i%0D*lE΅P:8Q |50x,(Qe!_N-^T,L6j_CB/ ,QB֞ RHݾmQ攢켅Z0%]SQ3XZ hG ]Յ f1xq -bp>CXKQ2n|ھW A ap-D[\DC'-RZ*=Cj,(}@ʠڠT[ʉ̩(BZ%rӆ:+EB s.5pY`J  wM-h,CL f˳`~GVjM mj%^[r◸-*.V I̱yQlQK A!Rtx_ʴ:B?}C&چt+wt' bۮ:Y? lfZV!g˘?jt[o +pD~ dIC%6c1ZR\m00i]N eDC(]$!PqୁޮALOmC ?:PABM_0݃Rdb:q4:RP]^46zP_vz`8P?X .zc$Q cפGT1e ˪7lvnJZ@EMPl!A'G0DލfXeK3~R{'.d: q:@lG$b _%,#т % $ySu[|־^UJsX\{lYw" BXP-PLW8ΥˍD J(EwhȎfӞrBm%T!bhϫ0!et(jdȊv*# PLaB9Hjsopenam_v1_1_18/tones_test.wav0100644000176200056700000054136407607524100016473 0ustar releasepostincrRIFFWAVEfmt @>dataU4> Fv *y zqMz4 # T4Q  `xsIa nV;l ZM0 g%ahenQ V=H #4I v= u ly|DO d`% =\ a  #!V /~3[e- :ZcM=  MG@! dUZN/ .xAF I4Zi=  r1_4 2m' ^- | *lz0 +73@ a_ h5kK Sc l ~N+"d6 NWu0U +}_ #A;  #*MF^.!7Pm4v^5 4"O LhOvoT oW"M?HFw  [7"C`nG[u(2|6qy nl \:ioJ + 4%.<T~= 53 c0d >!TW $ Ix) p|~|2}Eu!^ߘ2 v 4a{Z tZq7U 0fju1 T3 '  +0fy>[[(9*;~lu$<(s P p< gZMy< Yo7B )QXsR%mX ( 7N x<|5Hl+bND x7iS_I 3R+ VV &uDp^ aG)2ee7-M439#mN a  o` VH_g,U.@ G <t m'/! S X4'< K- N5o & hj c$ WO@ \ Rb STH &B#> xr ){hQn{i [ ) E!vl e ]rM!N\"KV1="SM= O >t47 8KyHr 0;Q7aT6c!IZ w8  L&< -(+cnQ _k 51-*_A,Fve YE s'\? OTg|}NC a<w yBW \ YK  BZ$Ra!3k;  >dgY~-EA v M qG8 <8~?e7U *4F ]RX. Y<]TM,u1"z:_L:@`nl( Y<#z *,6HJR ~x09} m $H  l(-[ *PasVbFu  e   W:hv~cE\o< 4 f 1F Ly]Mr AUGrn6JY;OF ym+  F5o wbTY`6 -v )_  @@3,f"d8 /%_xb (Re& Tr/8Y1'0Qh Qr {nFP \ &g ]Ez}{y n O L|F4A7I1tDAd @ 1$z Btd q4n^h=!P <4]"~& 6# !Nl: -T+Ugq>2%HE-yrw $ZxCTdLZ 5 fb]U]a,Y~x F ( *ZA"f%oH+_ f %Am K-"(eu_ }*|w.& .w|*} `ue("-K mA% f_ +Ho%f"AZ* ( Fx ~Y,a]U]bf 5Z LdTCxZ$ wry-EH%2>qgU+T-: lN! # 6& ~"]4< P!=h^n4q dtBz $1 @d ADt1I7A4F|L O ny {}zE] g&\ P Fn{r Qh Q0'1Y8/rT &eR( bx_%/8 d"f,3@@=henO %d (< I6J TIAL zlfq*@a< _ )v - 6`YTbw o5F + my FO;YJ6nrGUAr M]yLF 1f 4  <o\Ec~vh:W  e uFbVsaP* [.(l  H$m } 90x~R JH6,* z#  ;k3!aR$ZB  KY\ WBy wO =MS"=1VK"\N!Mr] el v!E) [ i{nQh{) qx >#B%H TSb R \ @OW $cj h & o5N -K< '4XS ! /'m t< G @.U,g_HV` o   a N m#934M-7ee2)Ga ^pDu&V V +R3 I_Si7x DNߪb+lH5|yf0+ ' 3T 1ujf0U 7qZtZ {a4v 2^!uE}2}~|p) xI$  WT!> d0c 35 =~T<.%4 +J oi:\ lny q6|2(u[Gn`C"7[  wFH?M"WoT ovOhLO "4 5^v4mP7!.^FM*# ;A#_ }+ U0uWN 6d"+Nl cS Lk5h_ a @37+ 0zl* | -^ 'm2 4_1r = iZ4I FAx./ NZUd !@GM = McZ: -e[3~/ V!#  a\ =% `d OD|ylu = v I 4# H=VQ neha%g 0MZl ;Vn aIsx`  Q4T# 4 zMqz y* vF >4UYjjIriKE:%VI> SQj v . sQXFb5`$2Lg6R\ 3C_ l [3 U*L b B +*c- OZ{I 0Opk V/|Q6 .1f^  =lIK@$ZYJGEWp1q&_6Xv<6$X? _IqE3+wL? } bl:"cR)*TSu 9*bi (-yYTp[q}nqzi|,/Ja K| 0+? FfNipO& hv? ~ q  uo J" s. A  nsNr13V(O*Xb[`F2I9 z' /0< P"kb x"0P_>|R ,'Eju )C  *  ^X^ @ FZE6if6SS$N* sk6) Ny b [[B7s OE't-*, %uvbU:k7 ,"6  Zva;0 0Gg @.[^ 5  q(.,w& ^H[ D 8<K qwGG1}4* G1PrAi iq b6` Ph3c1v -  UQ`#Aig Da|:fK )!   !l^]7"_,|=p,a4" !{H>c] t /Ix> qUF*-p :Xy] Zk\& ]    +  d=VF m/.3 nh(g*-/a#i"?9OK( >p+#8^ 3l 0U TO1*os ^K~!>c6GJ , W$  V {vl Kf kS{ =R?f o%A/Zu  6A_h6 |#G{pB4 iq]c~\m lw/+1o5.Q Px Y 2]{<$az- ia|)Tw) V4 TbTry@ ;7a iS I"<t  vE5=-?eyy ch> ]l* 6-  n 56#G 1}3 #A 'Fo 8Y@17 mqx[nCga%3F%G%_lu 2 CS ~! oY|3EY[@{Dz&q  16 ` t Kt U6 < u&._T'ISzu0F|`=wGl : jS\~ wASbJW6.zL} %9 ]  W61`7G s>9 mb${ G ^6 c 78?k/ Ya! _3) q q>6 {XR y%W&97 t~GoO1` nZ6zTk7tv:H4s ) |9tf/S5(I qK;s:lpz[xq 0 R CZO< a (d54R y(c7 ` y  7 b  fl=[ *I &{2gQgIFY{[!@ n g ^ o'N | tqE 4k\C.{@cK.j9 SV t 'D * '@t^8, m=F 8-O deG{=L "Q^k,-V 3:  >aZ-$'Ogfqd0s`MP|64^/i /MM$ m(]u%b> HE%C]1 N  ![ Hf!ga L=R$ es f7~\3~Q% %Cw$YUc::A-% kA`^! 4j67 e5ny W  Q-/BPA o _ Q2y5bX-_5/_JdxBMyXdoZ. 6'.a) R`S~ k9-MPO xem<h WD%E P )\ ,  ^X 1=c  BB$N|jdlthf&L B"cov W 0W q-=)Am:8sr"\<'Wpi ;R G  9s. m T8 a5"Z 8 /] Gd?7 .GC *u , KP  6]B 1mYb x_U%j-apd%+c$Wq b3o~ y&+ =,C- > R oc{{^8 D ?Y WRsX*k KvUq|[rmNp%2=nW 6HK (p m-v0 ?FBe-xQo/kym aA@xr0x$ # 9"+Yq[]Gwue6*9&kV , Zy+My sP$ U+H 7K rS  V &   6mP w{ xZjx ^/l. r6~(&0</PSnc"EG_ ` {Q+j =h|ZV@1|2~[{OD "!5 i5 OZ w }Ol a =J 37D+ `#W2 gk+Z@ G)X0-3 s H<0  %DwC8 y1G-n8 i, x_}EA 5b0 ~LD [tNBbg P % }mF=~d caQ;.x.Oq D!D^cW=*? qX KgO K@ DV uz$ow 1@fKE^494 ms0 %ZZb C`4uT+WaN|_=e][6 :[f(/) q|8.z I\(f~ ]K}a{/ C0 tv  8 jh2 (  %ubaY\dUV+IUzJ?h  /!(.& U l:3Z {SC#f^ - W i" D!o Tz# ` }c b DYd "2 Rq &!Wt;8B'!Emzy- ~)S 22 |mN=[>h RX;o9yZaUVQd[%$  >*  %U@>\Yj,B@[%6wr Jl v8 ME.9v*a c IQ T y i }Q  (+FMQ*Y]&94p |k`o1T| 2D>L>YY *6 I7{O R: q $ a E t`UFA7Sz/s:vR2/p"~S^tV# s}e *Qgu4 O][v H =& 5 8 D,s*/^=pYg_d`Lr Qb_l .m ~/{86 a0B   % Ctllu!5_34M$~*w 9:a,#k[ b:5)X2tE }h; iW^ ?  &o]56 i4mQj\exkxMYPqBy ~ uuy 6 L%p) v m[5 . pO15H?sC1tub@ L:%?f?Udfn_T  ef O(  6 { XWJSP1S~&:EzjyXaO<m2 'D1M [4 [A n + =&(n "DY@< 6VEve[^Dd.e2~|PqH ) J` !{ ,;;5yi@wwe(2Ae@%e)3;u_nparf8( ~(c}u@% ?kS<;H h SK& qq6S @~bVd;c*#D@A)VG\6 #~r8y?NW }n G` .-YH[ P GYM ! S>&I9rX\";vC aF_H\SQst 7m>2j&QeP 5 eFK0DC 1 1 s<C b( 4)& )> DX969a?zT.wx$ 4Wr (  { 1zQ  /Qo  `& *sG=Pz|3)k !"Et23{,vS09c I9 T 4U}<U hX   [u0wF%Nv'7 ArzM8_Xr[+'k @"A v K   mBT>{WI8_u 524>s]dtH*S#PL=p 2 J !0]z+r  i Q!Ag<*giUub8 yE 'ruag5J1J aD i| kt O`4G sr ~.n~FM\ao@- L >7zD%~aeX)eb4nx D F ? v 8` ~ DqB^\to:>eU0M<avk%& %kva<M0Ue>:ot\^BqD ~  `8v ?F D  xn4be)Xea~%Dz7> L -@oa\MF~n.~r sG 4`Ot k |i D aJ 1J5gaur' Ey 8buUig*<gA!Qi   r+z]0!J  2 p=LP#S*Htd]s>425 u_8IW{>TBm  K v  A"@ k'+[rX_8MzrA 7&vN%Fw0u[    Xh U<}U4T 9I c90Sv,{32tE"! k)3|zP=Gs* &` oQ/  Qz0{ (  rW4 $xw.Tz?a969XD >) &)4( bC <s 1 1 CD0KFe 5P eQ&j2>m7 ssQS\H_Fa Cv;"\Xr9I&>S ! M ZGP [HY-. ` G n} WN?y8r~# 6\GV)A@D#*c;dVb~@ S6qq& KSh  H;<Sk? %@u}c(~ (8frapn_u;3)e%@eA2(eww@iy5;;, {! `J)  HqP|~2e.dD^[evEV6 <@YD" n(&= + n  A[ 4[M 1D( 2m<OaXyjzE:&~S1PSJWX {6   (O fe  T _nfdU?f?%:L @but1Cs?H51Op . 5 \mu  )p%L 6 yuu ~ yBqPYMxkxe\jQm4i 65]o&  ? ^ Wi ;h} Et2X)5:b  [k#+a:9 w*~$M43_5!ulltC %  B 0a 68{/~m . l_bQ rL`d_gYp=^/*s,D 85 &=H  v[]O 4ugQ* d}s #Vt^S~"p/2Rv:s/zS7AFU`t E a $ q: R O{7I6 *Y Y>M>D2 |T1o`k| p49&]Y*QMF+(  Q}i yT  QI c a*v9.EM 8v lJ rw6%[@B,jY\>@U%  *> $ %[dQVUaZy9o;XR h>[=Nm| 22 S)~ -yzmE!'B8;tW!&q R2 " dYD bc } `# zT o!D "i W  - ^f#CS{ Z3:l U &.(!/ h?JzUI+VUd\X w=7 ZnaJOW^Ft~'Ml `!ZEQ4 I6R5dD {^ X':7X:TVUUu$/5<?@3?HMnUSk7)  k|t,l[e  K  !_Dw,qVi'6i @U_r  0~J>c   2BueH%d=*`{NnH, W p xm $GPh!rX[2 N # SU ;nZ U;P 2- A3? ,#F -Y z vyD D W- z>:hY9 H<7;>`M ATj Q5/%:  7eg- j9 .P ; x31 vP ,;h>t2p0F 7o dc7Xbvv18E+  !;4k 6l%C"xeJ ,2q ulU81WIfo_I Jjw ,B q A9 }\t$_D-CrM^)Y /  TaNGK\g,-xE <9W^&E1UT  F^ j ~w a 8 (WFE +\ $.`I \  fNU1l;[ RX & @d 8 gssvHQ|(?" YFEH" );d{z-d 5{p% Y4(A] 8 r'I/hb-U2$I {k ^@$0v b 7v81<i9 |b  S/hy ! P  4d : - GS+E/1oߤkD/` q@w[- qa=u0nOu; j |g3Y @Ca ",pZ:T P`IC, >ZzMj2 q> c  r f |tl2u! kG nkFIfw- XnZ@61Gc7%  D}+Z u ]MIfYH D NK"NBBX %b0p+ -r_ llh{ Y3K7:sMRf` yAW (; lAFV n%  R # J 1]6%blI&cm1UkF`  q j <n{LgB   G)d7&u5 7J  @6Hsj?xC q E9 iw ~Xp fG@  \=LS~<+6J`ߋT~pc+H4(bEqc ) 7SJ F 2"O+g  17 w 0Nf%% q .I!Qh4P) h/_ &qU{Fr:%}p,Xoj Wd$H?6]\mo 9jBGJUP O Z`` W@ aB b B>=U ~y(Z.z+ ' ")W2I_Q~,46 0 sx4CP}[  An>O -" +p #? ~ 9  jj&6,%' 'Sl6Bz$ T?7w G  6LD ,gr! vB b+ZXGqE=v  (EU  F@j= dJ4d-0 R`w8S |qF   v E@[hIU.A &H9F r,g|qG .J`; dGiK'  E -  pU OtUG;0*wgf6 1%r7>G t '>xG^"W 8=^p B  v4Q H  s>   KE l<7 \ zd3"uPPi2 U_YF b #MN  M.52 o>Od 5 =l{gDL}cw+$uRO%K A `;gwr z #I` 3|5 H ,`KsPF| dPb.3Ej@p1[8W0Z\zq ^`i.J Msii D lpxV&JP;`Xn/5Xg 53^ *$]Vt en)0Uaq9  p@ dJ= |V B: .$jx#_` +`ߨX[83dnI;k!?{ n e] n r{ 6v poc 1S +X[v$ g [6t*n 1H' +L}p=  T%5W\ " S |l2X*;qZQ 4Cs& A 't N l%s"T~dVN?\G~tANxh roT=N 9LU?5 mqwhl/}\QG7"/u(x ]/ 0i&4u1\<a 4 \'8@ M PO%m AYD ru CQ *j" bDg,XR ]_dS [ Y  x},=+tNh( 5 y'u0HV9.M'r1=q}-a) u'O B %o9`Z"(~fh'[~ 5UQrX[  ==V BYN dC=ZyLw9` UA(hv|6 J_&Q! $,,2n AXmg!b|r8M' * n  TSM3rKdc*3 ` OUQ ; ~ztF{  e|z!E^ d o]l|oc%X*e| U(U@\ -8 # mDl "Rn J FSuK 3\ nT73x2b_ qo:wo '+X<9eN>)+m*:" :>h6 F bdz NPPLv }XYo,u a L` @{{1pUrwuipcT"lr`gQ)}ABm !&Q { N^FKWCx.-=n(!F2 # j & {Q4@(7i J/7lZxQ 0)X1~!d"E i* k5!0t5 \tp}_ [Q+T!  +" |Dd8&+1dYb1 K6 wPG&*hm ;:J)3l Bp oj?9d0; gpGi I ( Zc ?8 4Fku~ 7 #8XY1  a^U | icM *y 0K 0m 9 JC(Ch mj hM5DgGM& {Nu 1xO!DL wb75b7 Nz6 t_ @**`V2#E</ 1  Wqi1P60^ U6Z;i|r +u qZE6O"<8; l l mU9 & =&] c ]v/Pd`+ )%,I Hes Y !m}]bwL! [J  J[<: W8{/{dv+i uT"Bs >=1 M#!0WZ GD   Po ( UHN+usJ:0T-<>,&x+M^InhX H}>5l/j0DZzNgt 3j % K =l[P+/IZt( ;3(-O] @OY" u AKp_?u (dk D-H+^z^/ PT2H. qbVM]e 7%b >TwK_}e?I#-!k|/ y U UEG&4MbGM x`(d p!s v&,HwMT cI,v=] & RB X S: _ lP> R+|` I aE &}GM) 39l :m %-wq~t?>8F :YlF_ Y`5S}717  @4Rk a dJ !>DLj[`}$/P.;:18` rg+DGh1# > [MzE O4W2DEO R~ '< b c3 sL=7k? kr?Z K = GLxZz-9_ A.7C#) h$2o 5jC K bJ!Tsd I(} ^sT fI=j50   @v)J/< av9{p6 gMh 8f~'t&U eB Loj8/GrN+$j& F Y S 1/ ]&F$`iYq |^ $S ps aCi7 .r,Fue/\Du7|LNd 7,~ hC/< "p ^V=40#a rO's{d( u>V ] I! ap8 RIziJ9L'5 #@JYg}[:) .-h;}2}W~N e߿I' >a*1,1: 4tL 4S + lR1RCJ  =]1e 4    c0%ZJq ga) 5v WoU APy6 ^ ^ez5I    c#()u4` n4 hr IG_Cc^@]+ ymDfP> WT 9 E,# (QZ!Z^0Z^e]i OEi3 Nnle=I>2 f # t> LtF M7rT.X(wP7BL{ D.%J7 !{H=:"fqr  ;J j# FD-{ P y GF!I-N! lt("wsb|5! $Igg+. I%1W z6 Fpnu< W}*! #R|F{ )e> O Yzg YtQ511#~v1~X ?N*`#[Iy WT|0G |CG _8)D;J3hv#> 2ep  % uGu $%DMamzL .x Pp Y n4K 8 Z;)tk S<0 R"o\E5F_{="LfYo. g #RjK{ g:>8kD h,0 98 I= S2> q.  c[Y]TC0 ~T c@LOG_]DSXOj {-4`Fs !8T3~G%M@P`{C,":*.q$A/TL f t1ZO6  L& U T e6V!v \VShV: !1k L*7G<- \ se{H_) 1{45IcR =]uAH$ 1  5;# S9=  W u 2S uO5j#PVA;] 'E8 lIU5N- C#B{ 8~<}4qm UrYcjb= 6o  ! l [HChL?#0B -u8T \ .'YxzSEU <FKoG Q <}u\&.- eG\X M~," EvsYc3 iU ) AJ"  hFt ; ^b ->rLG%'i{yD$wX-7P j${t5Sx/>Wdq exPl VqZ9J 3q,88E(D,P|sxN'7]^X   z. 7k "%>J I > sm kSVDJnTr& n"V]*0O|]]*I U/PejJtK (6KGZ Cp\~& \, lx LBmD @ `~fRs4 qyo=zu GqgQt2>'pj<.= [S W  L *b4 S 4 f b 7 ' hs Fq~G  *"3YB;B} ([ (,0d5, '* a @|[$> Ynse M x2MrL Gn#UVl$)Ljp#p_"v7% 8] 5 @XI G-$:5#. D!U ` = g + D< {X߂N M rMt iu <:Vq:8o6pj#%lo*?11 H+Hn*!3 s4aQGCH)f |nS  EC?7 rS+ >3nj8pUP Y13BYLlK>#^o-Y onxSp+ r  LQ  - Ke  }# sO~ XO 6%dj Hv$[AwPuSrz80DLVLiQ{H` suQw%&TL. VH HF4 2o > &|)i1|p'@ njEj>tU1Ef@ 0c`  =VIcP#rsvH/[7X8u0_ s  Q(B P9Ag  -/=P @PEm NRPPe"An2 >p`7# ^&U} f fHz51- 5[ 7i Nc% x pH=6X   *dh~` w>Y Y n0y! n5 3 ul4z{ 3 !{  <ymM[`vZ%p9Ag5K^X*PHG  `G~N/ hV#$1%5  tS FR^F gxS Z!G~P  < r ^7iZ{3| ;RBlp:A51:2-4BNz@^*) 7+{C (1T < GE|qDg D Rfb , |  -`$ Js('O iSq@Uk0q /n: M"5I^f>Y{?)wQ:X V9y5 0 j'x?C)m7W' ' * n-5i-Xz !# tc3:b/\1 k"BTYxj SU j( 8 a bq V m d  C[)  Co? "1 LK=]:$ {: RZF^Z^. dVE YX])#_s{rUYC}A o9v kebc 5U. b4]h s >UsM6o|r[ jD96BDp(:8 FLjaQeFBYju JSHlBp:- 7_a w ^ D ko (yP /g oQVO  f~|P hOQS@r zYDJ8H ,Iw Yj$hThYq MnD iH  #w wj bPG0 + y_:'`YQc>&A\~ nx4_ x^DvGH3:Vj,kE QI [B 4v} ^ +?Yy! & /Kc:w _n(; =n m dLMw5S~mr`Q,$f{%* |)Nk' %^*(32D V0 2 %X];*? }QIO>o,c[ =)!lxO\^ 2O k|\r(\9]'ofIF|z|(/}B 6 K " vQ c% sI (|lFa~W ss`q6` Z;v`D& IFC% xu!<:J #2LW .} /b v6 3q ~ S5wNaLcOLeqS0}c n:GM h ] X a4F/\dWSf _6AaOa fh pt1N  ~BqbpE&}M '%Khi -]Vl,bPYe%B?CHsVmZ. V.sG c=]zqj _Clm8= wU_dk /O Fq= 2  Xc X% 4i Vn5D]'h )ra% LX%`}WsHAEV\~U(0r!=OA^ w1=~? _k ]P\R|'W j #oJ0 E~Vg CpzG ` V{E%wm | v: {\x>Wq_gvT EMaxZ;* M HX sM u5 sXlE*2D jI3,O {zuMuP!\  0g L ih`  $Tl/fR7PY ZG 5{M b 9|ky'yX+E8Jf  h VB7[28:% ? U14 ( }KD;-hW3qa |{@|ucY#8  f6 5S l 5W A;P)y! /vR .[~8Y.y ;c0cg 4I9 K V{*,< qY Pk1.G$! _ (yH 5 `8DA3rN }^X*8qgK& *J=Tvh(0 dmuM L[Z6Kw 9Gb?  xPz cDNsDDT7kg $OSm& OfTy(k U9P]sXZSC Tx$L`!X]` B`o45 8:0J+oAY/ ,aH a%gn71|!. ^o ACo$f7X^ tNz5#X E#QwxUl_Q 'u&s tC]7S#*\j 9 V_yFZMQt>J6 7;q j7& [}Zir3^Kna3 Z "E @9A OrD 58$M+ub"[}J=_>f.-\ B`cS#lFDS W w` Ot1n Q \7o6(U kcg8$ +B@@vu^J <  FCG L P>?E6q- | rm]  P-/J 'ahkH 8VXn1<iJtX. -. + Xn& *h TS#$+!8 ^Kw2amW4E6q{  E F g w^'% `yk >)e /a `C=]Zc5~fy JmT  S24^  ]{rS`\x _R!{m6.q KJo cy )p *|(Jk5hKN\ H1K1#  "TF I ?#>hz# s%8 %`4 .e'QtH'm rj !a  K8t) l gd/Q 1 W  ]u*}:)m#`-X@1 Hih,Z *,y:N$3e "^"k'h O  n6Y? ]Ur BwKIm7p=28 6zl?[uA e;K9\7NX^:@.M7=At^ 1 "z_wH@ %g0 s 2F Mbemc u|}])fyRQh2Xk ko -cTu .zO6ZY ~x p! = i N&&{K~:c u>tS`z]Snd W7 m})K=_# C 89 WeAjtgG[2l6l &:4%UI ?H l9U}(t_ '?6rw <i8  9Lem! Q EcdmI e$; 9\}.,C$m R  g4"_[fr T?w P*"b 0JpRYqK-UL KVD UwgYF8{ ~ N(F h jJ3  d ZDfjP 7'N} 7H:`P4$" {  A zpqK3i,qB#n' {_ p ONE{&9P2 "# "_  1+VVa\(uV+ r!d?j_ )yV &[  + 8sz7uZ#AcP 4ml=D,~" i;w7 ' ! m {q!c%0G!1Y$(~R @lWkA : "V=y=,zd }[J_A!`: A  rAV~ N .}H okGc( c5vo1zLS KS Q  x ]v9JK@KU '^ + K$Vk:  N, 7(|? B m_+@7qB ==@ K[ )sAeG F<a*L U H/] zyAS t!hSJ jcfYM@ ?\D^ gE$f  &Pv( ((u8Bt?T~ pd#  -|& %+6\\D:ehRzHN>!%2Ro]R%Zh >_saM^n# T5!1Y G*d82 L"?1 D BQTJ) bi|AsP=x Ch=8 [|aG0 f* 7a Ln ?b\ ]N UWD`o3XBwA=e4c E2^+\O`kaE+}. _2 K> HO^,<! [FP4uY5 W mF% fTa  /M| F5 51H5`W /i L Covmi ]Nf9V - .VT@^%gr+?jD 54 [ n4Q` P}F!}\ +\ jduH ydcl T]3 m~&&w* + ,(Q R ,@;H` .\; 4$-[%i 0o!_T^}  % LoL }-$  !/s~W $&1JD&er7 : Ax j [3  ` % e ?WurV9E.,/ G}V(%j< l 68~ / 0U ?"#)u5W. p-yi JYe ryjUY|0(>E  R!N> pue K Nw@f*?H V :g zT -Qm *#B7RaR _`  0k:=\ p @8  LYm~ xk  ^n:^_ wU l0Q0Z8B >% >g?@W =5 P| q# hEdwd^Cfsc T95Pl: |t -4<  js W EUmPnRF{%#l kodG(]!-.!k @ @N&-U3{jB d47F1? {5lSb l> | o{8 <= Bp  P/##O Tac hxp(|  G6{" D7)w' j -U@3qKyV Mr\r T * QzrwN qM t>~ `6!W=X:e lNzXF[ U oh?GtO Woz0 v$x oM! ~ JMpw jY +|F_^0u` X rYD'`Ch. vk s R$ Y]R!7! *, G IgE\6Y :t| 3 NPbn% &Pv|&D|A1-LX)  R\7&gR CP  %o: $X VW @N] 76@ac|4Q6A#I sgzh/r}+A )~>_S` E7nJ *&F Wb/:k;8WfFB8 7B/a:~2(gH5 U [C>Bp @"nhj/.(;5F kQ M#qbao &#cC;lx)Uz 2 ?Um w 9M GQxYll r-Z_{jI b7L}2uztq N|gq?fG) C2 1y Z1#awgh Z^'% ]& 8T! sQ {}!D7HdZd}'&f'30 ![= xp*RK( 9~ lu2u>9M tM -5WKb|  "c;o#"pY \8 Mya  bje # HR -- Q!HmQ`T- UoW w_D ^_re&j;aU5 Z/"Q9l)+  YU?v U P} Phf9 M \m?jAw1 Uif )7)+,~ a/ Tti[ kVh^ umY%Hfb'n,F"+KRU3sd/_ =)d bw~  yO 1+-D @x P2{#Z!  Ss.m(~Zv (B1 18gN x Vf3W )4Ooo/n U ] /GIwr;tdA0ME3k'kq w\|-,M [M ^ 3 Rs'8; UND+~ i\p457 J>/Yb;OT 1 ec bme2qq M S E ~1o/K=0 9+ :0U&k v 9N9aB )9_ 6Y.= chg j3r xw9Mm;AirJO"E""nwS  U~ oT}c5G C /Tk  ^n:^_ wU l0Q0Z8B >% >g?@W =5 P| q# hEdwd^Cfsc T95Pl: |t -4<  js W EUmPnRF{%#l kodG(]!-.!k @ @N&-U3{jB d47F1? {5lSb l> | o{8<= Bp  P/##O Tac hxp(|  G6{" D7)w' j -U@3qKyV Mr\r T * QzrwN qM t>~ `6!W=X:e lNzXF[ U oh?GtO Woz0 v$x oM! ~ JMpw jY +|F_^0u` X rYD'`Ch. vk s S$ Y]R!7! *, G IgE\6Y :t| 3 NPbn% &Pv|%D|A1-LX)  R\7&gR CP  %o: $X VW @N] 76@ac|4Q6A#I sgzh/r}+A )~>_S` E7nJ *&F Wb/:k;8WfFB8 7B/a:~2(gH5 U [C>Bp @"nhj/.(;5F kQ M#qbao &#cC;lx)Uz 2 ?Um w 9M GQxYll r-Z_{jI b7L}2uztq N|gq?fG) C2 1y Z1#awgh Z^'% ]& 8T! sQ {}!D7HdZd}'&f'30 ![= xp*RK( 9~ lu2u>9M tM -5WKb|  "c;o#"pY \8 Mya  bje # HR -- Q!HmQ`T- UoW w_D ^_re&j;aU5 Z/"Q9l)+  YU?v U P} Phf9 M \m?jAw1 Uif )7)+,~ a/ Tti[ kVh^ umY%Hfb'n,F"+KRU3sd/_ =)d bw~  yO 1+-D ?x P2{#Z!  Ss.m(~Zv (B1 18gN x Vf3W )4Ooo/n U ] /GIwr;tdA0ME3k'kq w\|-,M [M ^ 3 Rs'8; UND+~ i\p457 J>/Yb;OT 1 ec bme2qq M S E ~1o/K=0 9+ :0U&k v 9N9eUW 6 / ] %`K^! Sq:)LeH38"UlSbns*jNwtzO[ Ec_K= 4A ^a q [&Y#0 U} <,N1>' i~nJH iZ <GQBhy5'e\:[/co< 0g\Q 6_  %)YFEh!wy?T 1+"@ U i3wI1  `POrecfK |5h FMU mL@Ax Wy* R%:<@V}}Ac>Mj L .z8>R\g,J B 8 Jrn ru +nfgp }/k W"  "H@l CUx V]+kT  \(-d[g36Z j85 <c^#ym'- =Df B`XHh _ K_ |Vi2 Ww]_ 5  !g 0?  l 5 D$" cMf KMEP0  YYz2%Ng)lo o^ * r @thkS,BeQ{y&# m,e A  -,0l r&W SL]-k {UQb(v@K0% I`R'j=VHY /1B \i!Ye Qj ^#J6K ^`. n Ti?. ]R-np / R)9yYKoZSY~lL; sdulIF  XD)((N bs hAF)b]W, p ~KjlG> /' 9su{21ezX% ] <]jB? |'Xk^aF{d.'dy0D Nk 5(o<84 !gVl30 ]8[Xb / | $e` MR BKw ;ojIWC %y^[o # v#tUz8Q 92T6 1 <)xy8pp/^L* ) R%~ g H# 134  ) Nm1: %EHv7 1 J6N1$a!@ ~/P /R S  Uj: G?"YKc=p ~ tTV053` D@ " 9 Zn  rmOK oH}%H~TW:1R\ ef8 toG! ~2U r M Pq=Ri /^#K YOtfs!uFLMt q-+ v1zq,2L  .UH_ 8 IfRE1 [ kBNP?Wc.  A IvC ]Pot"M=y  5 kjA1=cGLCh 93Ds> %l 2B   8)%CYYR4 ]nvoPfnEN ; ^]T%| & Sl !@| a`2p[ 69 ,MgJt   r0mk60j]y D{Q 'LVF UZxH2 >R Eisdh  55bHmP JaG ? /xb$f$4jy'69> Jt" F  n3S4 G IG/KF5b,C&$ BRGU L2Si qnCp~4'+. G>% Ytq  0Hoi Nw `S c4 KPP#jh_&&' V :\Ig 0R 'L/=q^ j1v YBmZ? {Oj #5ssEk#>F%CH  /daCnbv I `e n) {j% !N271.M@ 34 '$R k" dt$,M 2lk;, Ht F5r}vB ^pH l T9q&K&Acrbk_ 56t  8| ds> 1Vi  dcz " ( $B5`hy%k](Ht"lL r  B "?x;3kkA ~@(<etq?^G:= oW1W *4 K " Nj! @+w;4I%~1uNx}  i @V3ZfQFTo `iaewsa!vl X0 EG JAT&o=1:+5G? + v~%P}RyUh6=#{- sE- aH~`u F+I LO8"F.|M;ntcPC LF0"_5B3N|H  DQ  Qj Q6`]Q2} f X32 c<@ .v 6z :xm!B@y  }wC!1 XW1dcb S  lypJ "3 hm z4~>Yfmn% m & _ f"g7 ,2];@ToZJ /.oV z `03b71/LF8?L$  u`O[ /rK&ty 8.i`G< Lb0 Kf<\c8 7 @N}*  JU<I n R9)PrU LX8 J0$hn'o/ Vy7,ux v:%#nen;s k{x wqfu G{ud=NFp S*  ` MT?T yk 6&_5 EF<Mhy  To!a W; )"@,AaR@)Nma  N V\6;X9;3 @Q#_ }&4jd Uq;giR9 f p\ _o~Ii  r> w9 4w?aI\{C p `#R X- k ]K) Xx# 3*b0% % A-TCG -K*.I_sQS6T v Q"-Rx%hFR)/lfK> T?%' F# ,%* R!OLMp.h 6+;b"} $$ #AW Uou "k8k  A6)) |s XYC*~. s+1iJ78n B  DLo  u ebx?6"o C Z: . O LM  [ EL2c)1l`86~0Ur  KyOK2 t^`0 \?:(B KN ; t3CP >  L'{Z lS_ 2ES=>( nb!PDV 0t^4D~O \[ \3 `wLZOwQuPp |9 h& cq,d 4/9 G8'3jk% f  9~A!i/9 c! ] s 7?  &I ; _9/AJt.dx`F~< q.DL{D Pff 4a 1 j{` ?f3`  j;n uE[#,g<sq<25 i_Ra`@ Y: C 0dRy  wD{0b WNa ;W{&x@ fc Y5E #pAF e+Qr-Q`o7Vo $$ 17/~`Ym8mh a6Sx ,F, k@# C gimg  jp _ NY~} #G.'I 'HA@} |2le]XSVO xr tRd '!|Z3J& o$   sxNx  :6t _Y].Up9d 4F/nkM DR(rJJ@ lO 2o [y N #@KvP<wG W@ w Y]9. T^` a= ch B%7.  m 3 zD* LVs;n^RD6/`2_>%p7 ~@ {1 'He0L>} 'w} t$A& B k it#{ _n<`kg U9*4RM5nR 5.&A}Ya 7wE xQQ o U} spO U*_:<CH k>5?" hD Gc #)M2 p;$6l=Q'$;]kF2_` n VjjP>bTv b 5u '("gP}1Ba[ U{sR?:T k (W k/PzyA ( #;im; cHy j " @3Y! 9Tx -3{  L+\`ZeEv7c W%QrA'hD;] &"s < 1JbC=m&&"xt {yY'9v.0( XL 0DX J@c f%Pw c&g @? )GAL|rR a<hWimn _G jJ" Ap YY]cy^ d  1 qaV [< .-X 9"V%V 7|V }  NmKsyl 874rnmc V@`}3L c#k|6  ^, )XuJq D9.` m< 7'kV>IS8 q-G @ y W^DEdO ZegVo8M_;t   6' o[OkZ ER8 54rQ) R-  qKO7^5rk_7ME2LSHW ziL bF)w'z" ^lh b`dt[/Eh{| :F [\ D)\iSrk1@ BYE\*lX: ?r1I ()>Zk zSeBFrmJO$^]f ZS^ lN \D\ 8^p KhK  <8G =Zo'Kz@+VR. IY|bH f'x R k#CaUlE( oj EEKJ5 kg UFgSIc  +N # |cr0.7 T  nu8Xw +e;;Sn%Lb !&P #H }{"HW Tn'Y{dOY;Bre m%d; w 8&.~ZC]0C 5Q2[ 6 hn  ,yQ< \pJ- eh !zk nrg : G7eN2 (| M1B jo& 41 R !5=f X{m% z`?0Fk  vEstOFs&|1Xt3 -#<ie> `^/l /'%,b TIT 1-b {" "S aUTN1$4hk*9o@w vO> gNb5}LgAdsI fS>r7}"q7j5L +$ 4IY pcjAO P izmgB =)tJ AT% 'pj@> 85_&xdq(s%J 1 $5  8 *u[Y ; W:,2_k ^H m5ykkj:w  p F~St: Atze^u a4A @] s X# IaS&O,] =x*, @zLSs/,`0TY@ v trh.$jLAI% M3a! u?bR5n  FJf:NAA>F(NnpfSab@tB|JgY2 4  [ -b ?\Bn SROF@. <zH>eX2 z3V`2*< ;o`^78K1 X}W]Ml\ ~^ d` 5-6 ZUu &kcx%ia g 0 B;-^S% 6kDd #2> u /+|@? _E >Nj%  K u2*c=b d4![#p"# T{ qd3]hQ?Z | [z 1LL )B  j~i 3Tyo ]! l |u yxIC ~K7'-xN=& =Nx-'7K~ CIxy u| l  !]o yT3i ~j B)L L1 z[| Z ?Qh]3dq {T #"p#[!4d b=c*2u K %jN>E _? @|+/ u > 2# dDk6 %S^-;B 0 g ai%xck& uUZ 6-5 `d ^~ \lM]W}X 1K87^`o;< *2`V3z 2Xe>Hz<. @FORSn B\? b-[  4 2YgJ|Bt@baSfpnN(F>AAN:fJF n 5Rb?u !a3M %IALj$.hrtv @ YT0`,/sSLz@ ,*x= ],O&SaI #Xs  ]@ A4au ^eztA: tS~F p  w:jkky5m H^ k_2,:W ; Y[u* 8 5 $ 1 J%s(qdx&_58> @jp' %TA J t)= Bgmzi PO AjcpZ I4$ +L 5j7q"}7r>SfI sdAfL}5bNg >Ov w@o9*kh4$2NTUaS " "{ b-1T IT b,%'/ l/^` >ei<#-3 tX1|&sFOtsEv kF0?`z %mzXf =5!R 14 & oj B2M |( 2Ne7G : grn kz! he- Jp\ <Qy, nh6  [2Q5 C0]CZ~.&8w ; d%m erB;YOd{Y'nT WH"{} H# P&!b L%nS;;e+ wX8un T  7.0rc|# N+  cISgFUg k 5JKEE jo( ElUaC#k R x&f H>YI w<' W[tihOK0 5#.l xB+x 4 k ( ?ua6E p.KKr'4k{X  I !=tIo): zKp$ n }o~ + - |] 30U m w  8O`Z3w) ~PK& :J1TeS G!+[wd|, b]j =wJ Y4 L #b8 W, VYd Kwc4L^ TnS =b|YI. RV+@zK'oZ= G8<  KhK p^8\ D\ Nl ^SZ f]^$OJmrFBeSz kZ>)( J1r? :Xl*\EYB @1krSi\)C\ [F :| {hE/[td`b hl^ "z'w)FbL iz W HSL2EM7_fY/.0Rj$ARO39!"j "_V5erP=L^AR &L`  zSt Y3\K[-  VT[ &"-O MR>Pa E boO 2' ߙ *JZ tL62Ru*`v n;( &B2 /7Km c5 0k`> ,/ {J cc >  \ L aj 9J5g%D8L~0j^ 9  Mbuc  x\M=8  1f 2Tj z 9S\  _2*;g7y.[5 I5.puWtR kH h:D.16LC XL'l >:|8 X9y~fJ [. : Up|P >l)Atv"h Y^ Y gq0Wc2 ^6o)za q . f `}J )I+(rHb8 r[Hw +/vE9. [oG1^߰B s9 ]l[-v-U<!\ Br  w>Iv (Ho%. ] $>'K 6  |-+wMB GE5 ?I :,/"HTECX~ nM^]x*,@ [Os 9=g`gzq$z b ay7!  7eTd-R4 L)4z{+ % B yq f!QW9k8 r-EwHEL p  ns8S7L sOG-tYT#D D < &"}2b r mKRNkj?1*/ (?rCEIK\ rUg d\DXbg{6D--, Q D @?JMi {P<WZ o 6kvGg qxuR)3 QhL!!yJ  X >XmqU!rOh~h*.?R:YbE| i 46GY j i G;, 9RY R$ ,FWLm L / yo ?r / Mp @SN ._ F0: )/ H; .-k \ Q_j e " {  :=U>4KX+z^sxc^ b0  I {W*FkoM GaGxO{ |B,.2& ; %,HJ2K\ `L g V2;uAs xrFr5U E>P11 Tbu859QV Bs8/ymCfq/e S (L& M( Se /pfCmy/8sBV Q958ubT 11P>E U5rFrxs Au;2W gL ` \K2IH,% ; &2.,B| {OxGaGM okF*W{I  0a^ cxs^z+XK4>U=:  {" ej _Q\ k-. ;H /): 0F _.N S@ pM /r ? oy /L  mLWF,  $RY R9 ,;G  ij YG64i } EbY:R?.*h~hOr!UqmX> X Jy!!LhQ 3)Ruxq gGvk6 oZ W <(Z<MJ uE'+@*X &+M ] ZI.0c1 h2ss emg( YK"2 8qpv 1- Og-U5944 1'J D%} 8_@m.?R 0p a] XTt?C s _ pH 9ߐ / `[}U%i x  G_$ ] .%oH( vI>w  rB\ !<U-v-[l]9 sB ߾^1Go[. 9Ev/+w H[r 8bHr(+I)J }` f . q az(o6^ 2cW0qg Y^ Y h"vtA)l> P|pU : .Z  Jf~y9X8 |:> l'LX CL61.D:hH kR tWup.5I5 [.y7g;*2_  \S9 z jT2 f1  8=M\x  cubM  9 ^j0~L8D%g5J9 ja L \  > cc J{/ , >`k0 6c mK7/2 B&( ;nv `*uR26Lt ZJ*  '2 OobE a P>RMO -"&[ TV  -[K\3Y tSz ` L& RA^L=Pre5V_" j"!93ORA$jR0./Yf_CE {Myp DXu 4%Sz p(va L T8;sm;R   9E gP8\!"s0 jj4N ~Di'S: HuY:c( Y] Y7AB?Mnk ?_ Kt(J( _VEJf[eXmv}ed#q3I 8B v2BaUF_-9%eT%RlH$ &>Ki* (8:aW3Y@!1u }4GsD< u 5 01M!}6n *2h` r# B(L8o0Q V?)~EW1a$ M2,k  A3=sObp_ }{ }Br ^oe]Cf, j)g O@(q &RH5"Oe@ )  #o`/<Feh)3XQu/Sna]\ mKr%S% K@%Y)dGE];F$ 0.p{g n<JPa/d|Y9xx2wo07INLE_(P qh 9gTd uU"H`hdOEMab v44 om gp - 0mO- .\\ KLa+NI`e9 3M k\^1MY  m ya ' }M 69OZnTPB g gn {cE4g-x< +@ @92}V *T.u  wy? s|CVI%#^8;#=*VTZU/q $@Mfvh!MI[%%P'a  &} = A| !Y i=@qRf xk p^ fcny&(  8arWMQZ* X E }C_AzD']e6!fC[, / Q  XxfIB!g( y "t_zJN% qh>Ji+ H . }XP~~.K#6 }  ߨo sT /_`t u.r h3 ^U,uY| F=&T!  -N&kqOr ) f^~ PP [4( d^Cb< $ ~ }PHP$e %&+/w8Q < o\ NH"{7<^V  ^Nr]O&d  GA +@n ^D) .&! SN@D,F )V <;?(ebG1& I\  U se fm E[ Lb= Nm%8,d2+ >a(E~,m90T+ 2d,8%mN =bL [ Em f es U \ I &1Gae(?;< V) F,D@NS !&.) D^n @+A G  d&O]rN^  V^<7{"HN \o < Q 8w/+&% e$PHP} ~ $< bC^d (4[P P ~^f )r Oqk&N- ! T&=F |Yu,U^ 3h r.ut >01 P{ D5? " 8J C| r" R/  4q5;3%wbHWi\Cf uqPr:"S p ,S2\3 xF -*;. `(8#M x &-I~@ &<3U_, W- -1vgf J<`_/T s o  }6 #K.~~PX}. H + iJ>hq %NJz_t"y ( g!BIfxX  Q / ,[Cf!5e]'DzA_C} E X* ZQMWra8  (&yncf ^pk x fRq@=i Y! |A = }&  a'P%%[IM!hvfM@$q /UZTV*=#;8^#%IVC|s? yw u .T*V }29@ @+ <x-g4Ec{ ngg BPTnZO96 M} 'a y m Y M1^\k  M3 9e`IN+aLK \\.- Om0 - pgm o 44vb aMEOdh`H"Tud Tg9h q P(_ELNI70ow2xx9Y|d/aPJ<n g{p.0$ F;]EGd)Y%@K %S%rKm\ ]anS/uQX3)heF</`o#  ) @eO"5HR&  q(@O g)j ,fC\eo^ rB}{ } _pbNs=3A  k ,2M $a1WE~)?VQ 0o8L(B #r` h2* n6}!M105 u ;DsG4} u1!@Y3Wa:8( +iK>&$ HlR%Te%9-_FUaB2vB 8 I3q#de}vmXe[fJEV_( J(tK _? knM?BA7Y ]Y ( d:YuH :S'iD~N 4jj0 s"!\8PgE 9 R ;ms;8TL a v(p  zS%4 uXD p yM{ EC_b>O4cn"}5 1GpdD)Ra V }! @u ="{~r. Id .,j hPq}  o6(b57. N \9'gu 0O IX >3"DH$[ EWI ,y^H ZS '&Iv5 o!P?N9"*)HGpCq8?eI P=6 K?5F T 'DWT R BM TV:d?7:/L[}LBRN{HoMM)^Ri) r 2< Y r+ C0 YNf17]l$F a'VK R/&j+tXgSA@ -,t):LL m96\Q, lx xI-_F oRmwA/"fE& Rp  1 ^q Bf op Np%r13])Hgfo 2 mr HqEC gH$6 1d + s [S inim K+}L@\@oE }kVD?n*9BQ E.-7*  > -j p` hF  J'))F #p Tr Vk }WIAl{56  gw $ I0`h|9 G9t oSE$4q>O-y#HHt J_fLTc  2x3H x| D& E;E%i 0 _  "U3Ai 6/T M,}^ s+ v#z 8Y 6eJ v E!-!Yn^qZY+Akh3L$ ME| V"- Zu G ^ i;| TK_. w5@4l=hXq3{W: aVPp2 W%U]PR> ! {O 4L0dJ,y> `M  vCb*ZVV 2/ VO5 Cw. lJ 7)|la Ysm mIG*!,J2 V`'_G ~ B$d #q i ?OkOb16Mdzg } LkN 'kA4P O1 >F pA; C a) 7 B SQ.WW*"$f9g:{vmBC8'pcY &Eybf_ :-  #8 J]. ys<Z JX ~K p7DsIc } tcQ_ T hl':%77% ^  |S( f){ Z  T.j<[ d~ G 7{E'\ hKW 46ZF cZ n" t l g! hkj x#/|~-FH4yxo6*+[K3 H^_l~?s Rsߪo`  Mj Tl  Yc 7O~ PP$!$$,J3n3FGD=D $ C3Z  j B  cD<]`Ej[AZ.?/ k4 zvdp9D eE='^ o}+  *WJoO bZC2"P 9 +0c[sM7!h++!LJ8Q<R& n `;?+q f6t +_-h(1g/3P@1Slj- H! @! } eR_/ r Nr2  I]u& gM7Ye9 x3C ZlMW9X6]5  q ;M- g G$8c jw_T d sfq#_@9s 2S KQ, yM : 1b"f h([SJ)*0l Z4sT  ? ?'5Hg?[:,a C;6 IF:: jc Rl X9nk% %r{;|g  Gt a.TU $9K5 9 C {[ q>knwZFC*d6t&^NJ $~oF. P 4] 2L  V FJb u*lq&<% Tz4! -l#]~ iy "Ez98 ZW8)f /i v [fJ[X3hUtfRUs2-x +< L eA d 02(  U^c v b S6# q S I+#iAhd-{-HR  N C_ E [Pc H nb-8~xdHqy?:Q/Y{7;;Hs 6Nh m K|v b A= ugCmuZTJUm.t}PE}:HK@r9J@pi4nS &i \ o %lL MY3f }Y/~|s#zq bBx U0j&v /]g  \s\1 Fo h  :DL& M>8ZE$8Jsm5EI 0!=ERt9BOc 2LOA,a U prI?K L 5 QIjtq}P qQ"@W {%m vUE, BM: w. M` g d YjV< % 2quaQ9p1fup$<O1>Koh0~jN$" .uo2 b: 2  v{y): t/{! dDw_M 9H's'A$ke3"+/X hnr ))$l EGNG  RZh2dJ,]  01o*D TRc>c VtX'E yq= <(( 8.c>tU ZZG`#L| @b^ ?BTb c9*up$DV 9 g W Dq(6)j nD +)C TP*J[hSw9c(9P nO7d)V +1 M<Cb @>  s3!*s t)~jD~/fY_qEGe-{& M Y , LKG >;HsMgUW <fnQ 4bPZ~,  JFx (> 1-n #jz" 2VqI_q `.,4=X_ 2 1K hqxdwkT- u6Lnyb s:Q1ke1U}1|vD%g&d _ZpWR` A9?40~K: F. Nk_d{}s> w ߵq,rF0 e0LqR5cQT eI$K9s[F "<O dRevjmU[f#& h   ID -]l c 3P] Ql %< Lk5X>9H.R 9 I !t6a2[qxX\wG`5 5|3cym2= Z @S  itJb  D n:ii qTd@Senc/QSfU Y`]=,@B  8{Msp#,SR @+C D6>0Wz oAzj9'S!R'bjq)t:HPjy D;,  kx 4% ?9 S  PQ 0NRPllCS - "  jP o u'+$b/R.J^U! F8# ; /N#[2 Gi *KB w d/1 w<4JBJD;`eC.2T8FjwG;rH%C=9c} =h2 0S$@+Wo sO2`*{vE0O-O$>xh1T)2s1dCHooH4n'   f o K3y / ~BE *e]Bd eBR}9q$   1MqeNh$wowq C"@%fZ f[o$ { uz @5K N^ (iW Z[uo/Et'|ns sm pJL4w7E4G?IY E7 {UwB@ `aP b.\(lON0GW@pMy#tA/dxQ?|Wr^  \$hG E ezU  ROF  Nsrkla N cfUn8WV !FU|TW3 b'Ki3"b cjkVimOUv 1T4 &5  = # ) /O' 3Q4*U 8pV9 H Y ]gb $\:P,3- E4 V0 :>nac9) =Q DJ "8_*i 4-%o} h  L 5_C!.<%O]Z[c[* $ OT +8|c bioj`0 H $dV  G߿  1 ySl~/9 1,feSh~<n D_%Ors~}e<6I tWLdt" R^U M "  [Vzikw mE JB  NVdK.|w}y]7F=b`+ThO N-3bhw4] e GJ WI jxv? I( Mr_  } WX'q'9] vw1  H16) C: y {7l y'A~, n%D T 9J ' hx [ \ PSAxh v ylk~" qg.RT 3%* ,ISAgK% 7(:j ) ! C A(m)0 b &}  SS m Al,o&Xv;Knq>e Q\ CH}Sf`_  S nLB5L;F]  9jn, iL/ 'R 0 ~zH1*B?+2Tc |# PjI   3H xc. z2 X))YGk. | x U:a3 7w~9,I{ nO ^ ])  5t SnQx bZ  )'f St"A+f 2 T{A/ 3:DM`7W V Z e __. {&$ 9  AK:>Xj5QO{> K-jRu ooFw# .24U @66  ~ 0߁&'m[7L^ 3}'KN]e 4=Imj$ +/$RGD p!\NFK D]/!*o"9sI ( a  uN8 ,J wci>n K 9RF _x ~K  O<& 39Y*A ja TV #bs KC0h ^(_UH D4VC0d p2 en xT[ 4g D= 7 D ySPi?SJ|9N Vl@Wf"C*i4lLU8Y%K*sC i!LdK () JH K YK D*gRwdq1n N-j  &W>)Z1 o+bmBK>~K43Og<H m % [; ~y?u r~g|}:J_-~3K $ ='SjhE 0kuHrnrUd" \mENs4G X& Od=@z; RuAI D> WDZyef]`AC) ?$*PH" C  > FT~ 1i61Sw  ' $4u0L, r+'F ( ߖ @^%mA*`;,@J  . CntX=S,l6= ]s^ " a |Vw_M/}^.{ 45v! Zedu5mLi>q(t !q(qv~,)d ]|Fy>D <_>z9 On-S8eK $cJ6o=K*p B  ?O D1=gyC{y.e*v fvY~ D [ /@YNnuGM @dM' j Z&$ NSf4 -+ &-&W% :TO<'uLI x!e*}m3R N8S"18tMY.~szJhLg >N?wI  P${gUngLB(D}v4tG^ o|" a-] qSjqS D9 RQ XCn @T0*\Mr ^Da~D X ' z ko6c(\ J#S5;USMHj\ka*y% Q_@ r \n;0brs t7{~95~_ B_dW:#1GFVA Q|%R $m+ 3hu@ T/Paa# W63"xPA B&[;RFyD z(OR~ N)  ~ DLMcxgn/v = { L?B$\pue ,  FH(*L< `\_9ko:8//nl?8 E_D = "Y|J] Lv++ Z hGdOK8yzdq4]K&B0yT37 pS. 9ia nz9 % )7aifq "eAmt\'9 q { ?l ]nt d Wz ~1b V@o=Y""%goj 5c6@> Q^.@t)`L^Tx:{K^4(W=v1 bR t64 Do 9LzapL =V~| $ dy__x3{ Kf&%P2hGdjA'Y[?:Y EK<ElK 16kO UeJ+  OM^Hs9 .<k S[ ]3!Ds& sD!3] [S> H! OCZ 05on =-%8r+{QQlJ_bR!( ~vU|<" 1n:L H nJ! r "V(=~9B. PXN ; vS?A~Y @6c5 jog%""Y=o@Vb 1~z W d tn] l? {q 9'\tmAe"q fia7) >Z`DO2l %eM& WNc-a2 Y Zqt lO'+J~ Ue5b/u  H+,/ 8-v=a.^ @ fh*G GR&#Q/gyUh @HXNe{U g kh;A;/"+s de` t Hy ~  %2z7)9 )  9 8 ?v6Us L'K pan<% 9zna i9 .Sp 73Ty0B&K]4qdzy8KOdGh Z ++vL ]J|Y"= D _E8 ?ln//8:ok9_\` <L*(HF  ,e up\$B?L{ = v /ngxcMLD~  ) N ~RO(zD yFR;[&B  APx"36W #aaP/T @uh3+ m$ R%|Q AVFG1#:Wd_B _~59~{7ts rb0;n\ r@ _Q% y*ak\jHMSU;5S#J\ (c6okz  'X  D~aD_s M\*0T@ nCX QR9 D SqjSq ]-a "|o^ Gt4v}D(BLgnUg{$P I w?N> gLhJzs~.YMt81"S8N R3m}*e!xI Lu'<OT:% W&-& +-4 fSN $&Z j' Md@ MGunNY@/ [D  ~Yvf v*e.y{Cyg=1D O? B p *K=o6Jc$ Ke8S-nO 9z>_< D>yF|]d ),~vq(q! t(q>iLm5udeZ !v54 {.^}/M_wV|  a" ^ s] =6l,S=XtnC .  J@,;`*Am%^@ ߚ( F '+r ,L0u4$'  wS16i1 ~TF > C " HP*$?) CA`]feyZDW> D IAuR ;z@=dO &X G4sNEm\ "dUrnrHuk0 Ehopenam_v1_1_18/version.h0100644000176200056700000000247207631766217015431 0ustar releasepostincr/* * version.h * * Version number header file for OpenAM H.323 answering machine * * A H.323 "net telephone" application. * * Copyright (c) 1993-1998 Equivalence Pty. Ltd. * * The contents of this file are subject to the Mozilla Public License * Version 1.0 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See * the License for the specific language governing rights and limitations * under the License. * * The Original Code is Portable Windows Library. * * The Initial Developer of the Original Code is Equivalence Pty. Ltd. * * Portions are Copyright (C) 1993 Free Software Foundation, Inc. * All Rights Reserved. * * Contributor(s): ______________________________________. * * * Library dependencies: * * pwlib: v1.4.11 CVS tag: v1_4_11 * openh323: v1.11.7 CVS tag: v1_11_7 */ #ifndef _OpenAm_VERSION_H #define _OpenAm_VERSION_H #define MAJOR_VERSION 1 #define MINOR_VERSION 1 #define BUILD_TYPE ReleaseCode #define BUILD_NUMBER 18 #endif // _OpenAm_VERSION_H // End of File ///////////////////////////////////////////////////////////////